// This example is the source of truth for docs snippets on /sdk/quickstart.
// Run `bun run docs:snippets` after editing docs:start/docs:end blocks.
import { createExecutor } from "@executor-js/sdk/promise";
import { openApiPlugin } from "@executor-js/plugin-openapi/promise";

const inventoryApi = {
  openapi: "3.0.0",
  info: {
    title: "Inventory API",
    version: "1.0.0",
  },
  servers: [{ url: "https://inventory.example.test" }],
  paths: {
    "/items": {
      get: {
        operationId: "listItems",
        summary: "List inventory items",
        responses: {
          "200": {
            description: "Inventory items",
            content: {
              "application/json": {
                schema: {
                  type: "array",
                  items: { $ref: "#/components/schemas/Item" },
                },
              },
            },
          },
        },
      },
    },
    "/items/{id}": {
      get: {
        operationId: "getItem",
        summary: "Get an inventory item",
        parameters: [
          {
            name: "id",
            in: "path",
            required: true,
            schema: { type: "string" },
          },
        ],
        responses: {
          "200": {
            description: "Inventory item",
            content: {
              "application/json": {
                schema: { $ref: "#/components/schemas/Item" },
              },
            },
          },
        },
      },
    },
  },
  components: {
    schemas: {
      Item: {
        type: "object",
        required: ["id", "name"],
        properties: {
          id: { type: "string" },
          name: { type: "string" },
        },
      },
    },
  },
};

// docs:start create-executor
const executor = await createExecutor({
  scopes: [{ id: "docs-workspace", name: "Docs Workspace" }],
  plugins: [openApiPlugin()],
  onElicitation: "accept-all",
});
// docs:end create-executor

// docs:start add-source
await executor.openapi.addSpec({
  namespace: "inventory",
  scope: "docs-workspace",
  name: "Inventory API",
  baseUrl: "https://inventory.example.com",
  spec: {
    kind: "blob",
    value: JSON.stringify(inventoryApi),
  },
});
// docs:end add-source

// docs:start list-tools
const tools = await executor.tools.list({ sourceId: "inventory" });

for (const tool of tools) {
  console.log(`${tool.id}: ${tool.description}`);
}
// docs:end list-tools

// docs:start inspect-schema
const schema = await executor.tools.schema("inventory.listItems");

console.log(schema?.inputTypeScript ?? "No input required");
// docs:end inspect-schema

// docs:start close-executor
await executor.close();
// docs:end close-executor
