@apicircle/mcp-server 1.1.0 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/mcp-server.cjs +33 -19
- package/dist/bin/mcp-server.cjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/host/McpHost.ts","../package.json","../src/packageVersion.ts","../src/tools/imports.ts","../src/tools/codegen.ts","../src/tools/workspaceList.ts","../src/tools/crud.ts","../src/tools/folderExchange.ts","../src/tools/history.ts","../src/tools/codebase.ts","../src/tools/prompt.ts","../src/tools/globalAssets.ts","../src/tools/mocks.ts","../src/tools/releases.ts","../src/tools/linkedWorkspaces.ts","../src/tools/githubOps.ts","../../git/src/github/errors.ts","../../git/src/github/api.ts","../src/tools/registry.ts","../src/providers/Workspaces.ts","../src/providers/InMemoryWorkspaceProvider.ts","../src/providers/FileBackedWorkspaceProvider.ts","../src/providers/GitBackedWorkspaceProvider.ts","../src/providers/MultiWorkspaceProvider.ts","../src/providers/InProcessMockController.ts","../src/config/snippets.ts","../src/prompts/mcpPrompts.ts"],"sourcesContent":["import { McpHost } from './host/McpHost';\nimport { TOOL_REGISTRY } from './tools/registry';\nimport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nimport type { MockController } from './providers/MockController';\nimport type { AnyToolDef } from './tools/types';\nimport { SingleWorkspaceAdapter, type Workspaces } from './providers/Workspaces';\n\n// Public API for `@apicircle/mcp-server`.\n//\n// The host is intentionally non-opinionated about *where* the workspace and\n// mock runtime live — pass in the right provider for your environment:\n//\n// • Single workspace (workspace.json) → FileBackedWorkspaceProvider\n// • Multi-workspace (~/.apicircle/) → MultiWorkspaceProvider\n// • Electron desktop → IpcWorkspaceProvider\n// • Embedded test / demo → InMemoryWorkspaceProvider\n\nexport { McpHost } from './host/McpHost';\nexport { TOOL_REGISTRY, getTool } from './tools/registry';\nexport type { AnyToolDef, ToolDef, ToolHandlerContext } from './tools/types';\nexport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nexport type { MockController, StartMockResult } from './providers/MockController';\nexport {\n SingleWorkspaceAdapter,\n WorkspaceNotFoundError,\n type WorkspaceSummary,\n type Workspaces,\n} from './providers/Workspaces';\nexport { InMemoryWorkspaceProvider } from './providers/InMemoryWorkspaceProvider';\nexport { FileBackedWorkspaceProvider } from './providers/FileBackedWorkspaceProvider';\nexport { GitBackedWorkspaceProvider } from './providers/GitBackedWorkspaceProvider';\nexport { MultiWorkspaceProvider } from './providers/MultiWorkspaceProvider';\nexport { InProcessMockController } from './providers/InProcessMockController';\n\nexport { AI_CLIENTS, buildSnippetVariants, resolveAiClientConfigPath } from './config/snippets';\nexport type { AiClient, ConfigSnippetVariants, ConfigPathEnv } from './config/snippets';\n\nexport { MCP_PROMPTS, MCP_PROMPT_CATEGORIES } from './prompts/mcpPrompts';\nexport type { McpPrompt, McpPromptCategory } from './prompts/mcpPrompts';\n\n// Re-export the SDK's transport implementations so embedders (VS Code,\n// desktop, etc.) don't have to take a direct dep on `@modelcontextprotocol/sdk`.\n// We're already the wrapper around the SDK — every consumer of our McpHost\n// pulls these through us.\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nexport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\n\nexport interface CreateMcpServerOptions {\n /**\n * Provider for the ACTIVE workspace. Tools that consume `ctx.workspace`\n * see this directly. When you pass a `MultiWorkspaceProvider`, use its\n * `activeProvider()` here.\n */\n workspace: WorkspaceProvider;\n /**\n * Optional multi-workspace surface. When omitted, the host wraps\n * `workspace` in a `SingleWorkspaceAdapter` so `workspace.list` and the\n * multi-workspace envelope still work (with one entry).\n */\n workspaces?: Workspaces;\n mock: MockController;\n /** Override the registered tool list. Defaults to `TOOL_REGISTRY`. */\n tools?: AnyToolDef[];\n serverInfo?: { name: string; version: string };\n}\n\n/**\n * Build a fully-wired McpHost ready to `await host.connect()` over stdio.\n * Tool implementations come from `TOOL_REGISTRY` by default; pass `tools`\n * to inject a curated subset (useful for tests or for hosting only the\n * import surface).\n */\nexport function createMcpServer(options: CreateMcpServerOptions): McpHost {\n const workspaces =\n options.workspaces ??\n new SingleWorkspaceAdapter(options.workspace, null /* discovered on first list() */);\n return new McpHost({\n serverInfo: options.serverInfo,\n tools: options.tools ?? TOOL_REGISTRY,\n context: {\n workspace: options.workspace,\n workspaces,\n mock: options.mock,\n },\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { z } from 'zod';\nimport type { AnyToolDef, ToolHandlerContext } from '../tools/types';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// McpHost — wraps `@modelcontextprotocol/sdk`'s `McpServer`. The thin layer\n// here exists so we can swap SDK versions or transports without touching\n// every tool. Each ToolDef is registered with the SDK's high-level\n// `registerTool(name, { description, inputSchema }, cb)` API.\n//\n// `inputSchema` is a Zod object on our side; the SDK wants a raw shape\n// (object of fields → schema), so we extract `.shape` when registering.\n// =============================================================================\n\nconst PACKAGE_NAME = 'apicircle-mcp';\n\nexport interface McpHostOptions {\n serverInfo?: { name: string; version: string };\n context: ToolHandlerContext;\n tools: AnyToolDef[];\n}\n\nexport class McpHost {\n readonly server: McpServer;\n private readonly tools: AnyToolDef[];\n private readonly context: ToolHandlerContext;\n\n constructor(options: McpHostOptions) {\n this.server = new McpServer({\n name: options.serverInfo?.name ?? PACKAGE_NAME,\n version: options.serverInfo?.version ?? MCP_PACKAGE_VERSION,\n });\n this.tools = options.tools;\n this.context = options.context;\n this.registerAll();\n }\n\n private registerAll(): void {\n for (const tool of this.tools) {\n const shape = isZodObject(tool.inputSchema) ? tool.inputSchema.shape : undefined;\n this.server.registerTool(\n tool.name,\n {\n description: tool.description,\n ...(shape ? { inputSchema: shape } : {}),\n },\n async (args: unknown) => {\n try {\n const parsed = tool.inputSchema.parse(args ?? {});\n const result = await tool.handler(parsed, this.context);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: formatError(err),\n },\n ],\n };\n }\n },\n );\n }\n }\n\n /** Connect the underlying server to a transport (defaults to stdio). */\n async connect(transport?: Transport): Promise<void> {\n await this.server.connect(transport ?? new StdioServerTransport());\n }\n\n async close(): Promise<void> {\n await this.server.close();\n }\n}\n\nfunction isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n}\n\nfunction formatError(err: unknown): string {\n if (err instanceof z.ZodError) {\n return `Validation failed: ${err.issues\n .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)\n .join('; ')}`;\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","{\n \"name\": \"@apicircle/mcp-server\",\n \"version\": \"1.1.0\",\n \"private\": false,\n \"type\": \"module\",\n \"sideEffects\": false,\n \"description\": \"Model Context Protocol server exposing API Circle Studio's workspace as a tool catalog. Used by Claude Desktop, ChatGPT, Cursor, GitHub Copilot, and any other MCP-compatible AI client.\",\n \"keywords\": [\n \"apicircle\",\n \"api\",\n \"api-circle\",\n \"mcp\",\n \"mcp-server\",\n \"model-context-protocol\",\n \"ai\",\n \"llm\",\n \"agent\",\n \"tool-catalog\",\n \"claude\",\n \"claude-desktop\",\n \"chatgpt\",\n \"cursor\",\n \"copilot\",\n \"continue\",\n \"cline\",\n \"zed\",\n \"windsurf\",\n \"openapi\",\n \"postman\",\n \"api-tools\"\n ],\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/apicircle/studio.git\",\n \"directory\": \"packages/mcp-server\"\n },\n \"homepage\": \"https://github.com/apicircle/studio#readme\",\n \"bugs\": \"https://github.com/apicircle/studio/issues\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"bin\": {\n \"apicircle-mcp\": \"./dist/bin/mcp-server.cjs\"\n },\n \"exports\": {\n \".\": \"./src/index.ts\",\n \"./prompts\": \"./src/prompts/mcpPrompts.ts\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./prompts\": {\n \"import\": {\n \"types\": \"./dist/prompts/mcpPrompts.d.ts\",\n \"default\": \"./dist/prompts/mcpPrompts.js\"\n },\n \"require\": {\n \"types\": \"./dist/prompts/mcpPrompts.d.cts\",\n \"default\": \"./dist/prompts/mcpPrompts.cjs\"\n }\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist node_modules\"\n },\n \"dependencies\": {\n \"@apicircle/core\": \"workspace:*\",\n \"@apicircle/mock-server-core\": \"workspace:*\",\n \"@apicircle/shared\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@apicircle/git\": \"workspace:*\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.4.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import packageJson from '../package.json';\n\nexport function readPackageVersion(): string {\n const version = (packageJson as { version?: unknown }).version;\n if (typeof version !== 'string' || version.length === 0) {\n throw new Error('Unable to read @apicircle/mcp-server package version');\n }\n return version;\n}\n\nexport const MCP_PACKAGE_VERSION = readPackageVersion();\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseCurl } from '@apicircle/core';\nimport {\n parseOpenApiToEndpoints,\n parsePostmanToEndpoints,\n parseInsomniaToEndpoints,\n} from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Import tools — convert external request descriptions into one or more\n// requests in the workspace. Each tool persists to the workspace and returns\n// the created request ids so the AI client can reference them in follow-up\n// turns.\n// =============================================================================\n\nconst FALLBACK_NAME = (idx: number, fallback: string): string =>\n fallback || `Imported request ${idx + 1}`;\n\nfunction blankRequest(): Omit<ApiRequest, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n name: 'Imported request',\n folderId: null,\n method: 'GET',\n url: '',\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n auth: { type: 'none' },\n contextVars: [],\n extractions: [],\n assertions: [],\n };\n}\n\nexport const importCurlTool: AnyToolDef = {\n name: 'import.curl',\n description: 'Parse a `curl ...` command into a Request and persist it to the workspace.',\n inputSchema: z.object({\n curl: z.string().min(1, 'curl command is required'),\n name: z.string().optional(),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseCurl(input.curl);\n const now = new Date().toISOString();\n const request: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: input.name?.trim() || `cURL ${parsed.method} ${parsed.url}`.slice(0, 80),\n method: parsed.method,\n url: parsed.url,\n headers: parsed.headers,\n query: parsed.query,\n body: parsed.body,\n auth: parsed.auth,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return {\n id: request.id,\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const importOpenApiTool: AnyToolDef = {\n name: 'import.openapi',\n description:\n 'Parse an OpenAPI / Swagger spec (YAML or JSON) and create one Request per operation. Returns the list of created request ids.',\n inputSchema: z.object({\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = await parseOpenApiToEndpoints(input.spec, input.format);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importPostmanTool: AnyToolDef = {\n name: 'import.postman',\n description: 'Parse a Postman v2/v2.1 collection JSON and create one Request per item.',\n inputSchema: z.object({\n collection: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parsePostmanToEndpoints(input.collection);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importInsomniaTool: AnyToolDef = {\n name: 'import.insomnia',\n description: 'Parse an Insomnia v4 export and create one Request per resource of type \"request\".',\n inputSchema: z.object({\n export: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseInsomniaToEndpoints(input.export);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\n// HAR — quick adapter. We extract method/url/headers/body from `log.entries[].request`.\nexport const importHarTool: AnyToolDef = {\n name: 'import.har',\n description:\n 'Parse an HTTP Archive (.har) JSON and create one Request per recorded entry. Cookies, response, and timings are dropped.',\n inputSchema: z.object({\n har: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n let parsed: {\n log?: { entries?: Array<{ request?: HarRequest }> };\n };\n try {\n parsed = JSON.parse(input.har);\n } catch (err) {\n return { createdIds: [], warnings: [`HAR parse error: ${(err as Error).message}`] };\n }\n const entries = parsed.log?.entries ?? [];\n const ids: string[] = [];\n const warnings: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i].request;\n if (!e || !e.url || !e.method) {\n warnings.push(`Entry #${i} missing method/url; skipped`);\n continue;\n }\n const url = new URL(e.url);\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: `${e.method} ${url.pathname}`,\n method: e.method as ApiRequest['method'],\n url: e.url,\n headers: (e.headers ?? []).map((h) => ({\n key: h.name,\n value: h.value,\n enabled: true,\n })),\n query: (e.queryString ?? []).map((q) => ({\n key: q.name,\n value: q.value,\n enabled: true,\n })),\n body: e.postData\n ? { type: 'text', content: e.postData.text ?? '' }\n : { type: 'none', content: '' },\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings };\n },\n};\n\ninterface HarRequest {\n method?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n queryString?: Array<{ name: string; value: string }>;\n postData?: { text?: string; mimeType?: string };\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// generate.code — produce a code snippet that reproduces a workspace request\n// in the user's language of choice. Targets are intentionally hand-rolled\n// rather than delegating to a third-party codegen lib so output stays small,\n// reviewable, and free from heavy transitive deps.\n// =============================================================================\n\nconst TARGET = z.enum(['curl', 'fetch', 'node-axios', 'python-requests', 'go', 'rust']);\n\nexport const generateCodeTool: AnyToolDef = {\n name: 'generate.code',\n description:\n 'Generate runnable code (curl / JavaScript fetch / Node Axios / Python requests / Go net/http / Rust reqwest) that reproduces a workspace request.',\n inputSchema: z.object({\n requestId: z.string(),\n target: TARGET,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { ok: false, error: 'request not found' };\n const code = renderCode(req, input.target);\n return { ok: true, target: input.target, code };\n },\n};\n\nfunction renderCode(req: ApiRequest, target: z.infer<typeof TARGET>): string {\n switch (target) {\n case 'curl':\n return renderCurl(req);\n case 'fetch':\n return renderFetch(req);\n case 'node-axios':\n return renderAxios(req);\n case 'python-requests':\n return renderPython(req);\n case 'go':\n return renderGo(req);\n case 'rust':\n return renderRust(req);\n }\n}\n\nfunction fullUrl(req: ApiRequest): string {\n if (!req.query.length) return req.url;\n const enabled = req.query.filter((q) => q.enabled !== false);\n if (!enabled.length) return req.url;\n const sep = req.url.includes('?') ? '&' : '?';\n return (\n req.url +\n sep +\n enabled.map((q) => `${encodeURIComponent(q.key)}=${encodeURIComponent(q.value)}`).join('&')\n );\n}\n\nfunction bodyContent(req: ApiRequest): string | null {\n if (req.body.type === 'none') return null;\n if (req.body.type === 'json' || req.body.type === 'text' || req.body.type === 'xml') {\n return req.body.content;\n }\n if (req.body.type === 'graphql') {\n return JSON.stringify({ query: req.body.content, variables: req.body.variables ?? null });\n }\n if (req.body.type === 'urlencoded') return req.body.content;\n return null;\n}\n\nfunction renderCurl(req: ApiRequest): string {\n const parts: string[] = [`curl -X ${req.method} '${fullUrl(req)}'`];\n for (const h of req.headers.filter((x) => x.enabled !== false)) {\n parts.push(`-H '${h.key}: ${h.value}'`);\n }\n const body = bodyContent(req);\n if (body !== null) {\n parts.push(`--data-raw '${body.replace(/'/g, \"'\\\\''\")}'`);\n }\n return parts.join(' \\\\\\n ');\n}\n\nfunction renderFetch(req: ApiRequest): string {\n const headers = Object.fromEntries(\n req.headers.filter((h) => h.enabled !== false).map((h) => [h.key, h.value]),\n );\n const body = bodyContent(req);\n const init: Record<string, unknown> = { method: req.method };\n if (Object.keys(headers).length) init.headers = headers;\n if (body !== null) init.body = body;\n return `await fetch(${JSON.stringify(fullUrl(req))}, ${JSON.stringify(init, null, 2)})`;\n}\n\nfunction renderAxios(req: ApiRequest): string {\n const config: Record<string, unknown> = {\n method: req.method.toLowerCase(),\n url: fullUrl(req),\n };\n const headers = req.headers.filter((h) => h.enabled !== false);\n if (headers.length) config.headers = Object.fromEntries(headers.map((h) => [h.key, h.value]));\n const body = bodyContent(req);\n if (body !== null) config.data = body;\n return `import axios from 'axios';\\n\\nconst response = await axios(${JSON.stringify(\n config,\n null,\n 2,\n )});`;\n}\n\nfunction renderPython(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = ['import requests', ''];\n lines.push(`response = requests.request(`);\n lines.push(` method=${JSON.stringify(req.method)},`);\n lines.push(` url=${JSON.stringify(fullUrl(req))},`);\n if (headers.length) {\n lines.push(\n ` headers=${JSON.stringify(Object.fromEntries(headers.map((h) => [h.key, h.value])))},`,\n );\n }\n if (body !== null) lines.push(` data=${JSON.stringify(body)},`);\n lines.push(')');\n return lines.join('\\n');\n}\n\nfunction renderGo(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'package main',\n '',\n 'import (',\n ' \"io\"',\n ' \"net/http\"',\n ' \"strings\"',\n ')',\n '',\n 'func main() {',\n ];\n if (body !== null) {\n lines.push(` body := strings.NewReader(${JSON.stringify(body)})`);\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, body)`,\n );\n } else {\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, nil)`,\n );\n }\n for (const h of headers) {\n lines.push(` req.Header.Set(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(' resp, _ := http.DefaultClient.Do(req)');\n lines.push(' defer resp.Body.Close()');\n lines.push(' out, _ := io.ReadAll(resp.Body)');\n lines.push(' _ = out');\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction renderRust(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'use reqwest::Client;',\n '',\n '#[tokio::main]',\n 'async fn main() -> Result<(), Box<dyn std::error::Error>> {',\n ` let client = Client::new();`,\n ` let mut req = client.request(reqwest::Method::${req.method}, ${JSON.stringify(\n fullUrl(req),\n )});`,\n ];\n for (const h of headers) {\n lines.push(` req = req.header(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)});`);\n }\n if (body !== null) lines.push(` req = req.body(${JSON.stringify(body)});`);\n lines.push(' let _resp = req.send().await?;');\n lines.push(' Ok(())');\n lines.push('}');\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// workspace.list — surfaces every workspace the server can drive, with cheap\n// per-workspace counts so AI clients can disambiguate without follow-up\n// reads. Used by prompts like \"list every workspace I have\" or as a\n// disambiguation step before drilling into a specific one.\n// =============================================================================\n\nexport const workspaceListTool: AnyToolDef = {\n name: 'workspace.list',\n description:\n 'List every workspace registered with this server, including which one is currently active. ' +\n 'Returns id, display name, last-opened timestamp, and a per-workspace summary (request count, ' +\n 'environment count, mock-server count, plan count). Use this BEFORE drilling into a specific ' +\n 'workspace via other tools — pass the resulting `id` as `workspaceId` to `workspace.read` ' +\n 'or related reads when you want to scope to a non-active workspace.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const summaries = await ctx.workspaces.list();\n return {\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n // Plain-text hint the AI surfaces when telling the user. Cheap to\n // generate here and saves round-trips on disambiguation prompts.\n hint:\n summaries.length === 0\n ? 'No workspaces are registered yet. The user should open the desktop app once or run `apicircle workspaces create <name>` from the terminal.'\n : summaries.length === 1\n ? `Only one workspace (\"${summaries[0].name}\") is registered — most tools will default to it without a workspaceId.`\n : `Multiple workspaces are registered. Pass the desired \\`id\\` as \\`workspaceId\\` to other tools to scope reads/writes to that workspace; the active one (\"${\n summaries.find((w) => w.isActive)?.name ?? '(none)'\n }\") is used by default.`,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n Request as ApiRequest,\n RequestAuth,\n} from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseApicircleEnvironmentDoc } from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\n// Permissive auth schema for CRUD tools (`folder.update`, future\n// `request.update` if we surface a dedicated auth slot). Accepts any of the\n// 17 RequestAuth variants — only `type: string` is enforced; the rest of\n// the discriminated-union shape is validated downstream by the reducer +\n// runtime resolvers. PROMPT_AUTH (in `prompt.ts`) intentionally narrows to\n// the LLM-friendly six, but CRUD tools shouldn't be more restrictive than\n// `request.update`'s `patch: Partial<Request>` accept-anything-typed path.\nconst FULL_REQUEST_AUTH = z.object({ type: z.string() }).passthrough();\n\n// =============================================================================\n// CRUD tool definitions for every workspace entity. Reads always go through\n// `workspace.read()`; writes always go through `workspace.apply(patch)` so the\n// mutation API in @apicircle/core is the single semantic source of truth.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const requestCreateTool: AnyToolDef = {\n name: 'request.create',\n description: 'Create a new request from explicit fields and persist it.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const request: ApiRequest = {\n id: generateId(),\n name: input.name,\n folderId: input.folderId ?? null,\n method: input.method,\n url: input.url,\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n // Default to `inherit` so requests created via MCP inside a folder\n // pick up folder auth automatically. Mirrors editorActions.createRequest.\n auth: { type: 'inherit' },\n contextVars: [],\n extractions: [],\n assertions: [],\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const requestReadTool: AnyToolDef = {\n name: 'request.read',\n description:\n 'Read a request by id, or list summaries (id, name, method, url) when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const req = state.synced.collections.requests[input.id];\n if (!req) return { found: false };\n return { found: true, request: req };\n }\n const list = Object.values(state.synced.collections.requests).map((r) => ({\n id: r.id,\n name: r.name,\n method: r.method,\n url: r.url,\n folderId: r.folderId,\n }));\n return { count: list.length, requests: list };\n },\n};\n\nexport const requestUpdateTool: AnyToolDef = {\n name: 'request.update',\n description: 'Patch fields on an existing request.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'request.update',\n id: input.id,\n patch: input.patch as Partial<Omit<ApiRequest, 'id' | 'createdAt'>>,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const requestDeleteTool: AnyToolDef = {\n name: 'request.delete',\n description: 'Delete a request by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'request.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const folderCreateTool: AnyToolDef = {\n name: 'folder.create',\n description:\n 'Create a folder under an optional parent folder. Optionally seed folder-level `auth` so descendants with `auth: inherit` resolve to it immediately — saves a follow-up `folder.update` round-trip.',\n inputSchema: z.object({\n name: z.string().default('New folder'),\n parentId: z.string().nullable().optional(),\n auth: FULL_REQUEST_AUTH.optional(),\n }),\n async handler(input, ctx) {\n const folder: Folder = {\n id: generateId(),\n name: input.name,\n parentId: input.parentId ?? null,\n ...(input.auth ? { auth: input.auth as RequestAuth } : {}),\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n return { id: folder.id, changedIds: out.changedIds };\n },\n};\n\nexport const folderReadTool: AnyToolDef = {\n name: 'folder.read',\n description: 'Read a folder by id, or list all folders when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const folder = state.synced.collections.folders[input.id];\n return folder ? { found: true, folder } : { found: false };\n }\n return {\n count: Object.keys(state.synced.collections.folders).length,\n folders: Object.values(state.synced.collections.folders),\n };\n },\n};\n\nexport const folderUpdateTool: AnyToolDef = {\n name: 'folder.update',\n description:\n 'Update a folder. Supply `parentId` to move it (use `null` for root), `name` to rename, and/or `auth` to set the folder-level auth that descendants inherit when their `auth.type === \"inherit\"`. Set `clearAuth: true` to remove the folder-level auth entirely (descendants then fall through to the next ancestor). The `auth` field accepts any of the 17 RequestAuth types — same surface as `request.update`. The simple ones (bearer / basic / api-key / custom-header / none / inherit) are easy to author by hand; OAuth2 / AWS SigV4 / Digest / NTLM / Hawk / JWT Bearer require the full canonical shape (see `RequestAuth` in `@apicircle/shared/types.ts`).',\n inputSchema: z\n .object({\n id: z.string(),\n parentId: z.string().nullable().optional(),\n name: z.string().optional(),\n auth: FULL_REQUEST_AUTH.optional(),\n clearAuth: z.boolean().optional(),\n })\n .refine((v) => !(v.auth !== undefined && v.clearAuth === true), {\n message: 'Pass either `auth` or `clearAuth: true`, not both.',\n }),\n async handler(input, ctx) {\n const changedIds: string[] = [];\n if (input.parentId !== undefined) {\n const out = await ctx.workspace.apply({\n kind: 'folder.move',\n id: input.id,\n newParentId: input.parentId,\n });\n changedIds.push(...out.changedIds);\n }\n const updatePatch: Partial<Pick<Folder, 'name' | 'auth'>> = {};\n if (input.name !== undefined) updatePatch.name = input.name;\n if (input.auth !== undefined) updatePatch.auth = input.auth as RequestAuth;\n else if (input.clearAuth === true) updatePatch.auth = undefined;\n if (input.name !== undefined || input.auth !== undefined || input.clearAuth === true) {\n const out = await ctx.workspace.apply({\n kind: 'folder.update',\n id: input.id,\n patch: updatePatch,\n });\n changedIds.push(...out.changedIds);\n }\n return { changedIds: Array.from(new Set(changedIds)) };\n },\n};\n\nexport const folderDeleteTool: AnyToolDef = {\n name: 'folder.delete',\n description:\n \"Delete a folder. Direct children (sub-folders + requests) are reparented to the deleted folder's parent.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'folder.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Environments\n// ---------------------------------------------------------------------------\n\nconst VARIABLE = z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n});\n\nexport const environmentCreateTool: AnyToolDef = {\n name: 'environment.create',\n description: 'Create a new environment (or upsert one with the same name).',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE).default([]),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const environmentReadTool: AnyToolDef = {\n name: 'environment.read',\n description: 'Read environments — pass `name` for one, or omit for the full list.',\n inputSchema: z.object({ name: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.name) {\n const env = state.synced.environments.items[input.name];\n return env ? { found: true, environment: env } : { found: false };\n }\n return {\n activeName: state.synced.environments.activeName,\n priorityOrder: state.synced.environments.priorityOrder,\n environments: Object.values(state.synced.environments.items),\n };\n },\n};\n\nexport const environmentUpdateTool: AnyToolDef = {\n name: 'environment.update',\n description: 'Replace the variables list of an environment.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.upsert',\n environment: { name: input.name, variables: input.variables },\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentDeleteTool: AnyToolDef = {\n name: 'environment.delete',\n description: 'Delete an environment by name.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'environment.delete', name: input.name });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetActiveTool: AnyToolDef = {\n name: 'environment.set_active',\n description:\n 'Set (or clear) the active environment. Pass `name: null` to deactivate the current environment.',\n inputSchema: z.object({ name: z.string().nullable() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.setActive',\n name: input.name,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetPriorityTool: AnyToolDef = {\n name: 'environment.set_priority',\n description:\n 'Replace the global environment priority order (highest priority first). Strings are interpreted as local env names. To target a linked env, pass `{ kind: \"linked\", linkedWorkspaceId, envName }` instead.',\n inputSchema: z.object({\n order: z.array(\n z.union([\n z.string(),\n z.object({\n kind: z.literal('local'),\n name: z.string(),\n }),\n z.object({\n kind: z.literal('linked'),\n linkedWorkspaceId: z.string(),\n envName: z.string(),\n }),\n ]),\n ),\n }),\n async handler(input, ctx) {\n // Normalize the heterogeneous tool-input array to EnvPriorityRef[].\n // Bare strings are convenience syntax for local envs — the dominant\n // case for MCP callers — so we keep accepting them rather than\n // forcing every caller to spell out `{kind:'local', ...}`.\n const order = (\n input.order as Array<\n | string\n | { kind: 'local'; name: string }\n | { kind: 'linked'; linkedWorkspaceId: string; envName: string }\n >\n ).map((entry) => (typeof entry === 'string' ? { kind: 'local' as const, name: entry } : entry));\n const out = await ctx.workspace.apply({\n kind: 'environment.setPriority',\n order,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentExportTool: AnyToolDef = {\n name: 'environment.export',\n description:\n 'Serialize an environment to a portable JSON string (envelope v2). Encrypted variables now carry their ciphertext, slot label, and per-slot salt — the destination decrypts with its local slot value at request-execute time, matching the Git push/pull contract. The plaintext slot value never leaves the device, but the ciphertext does. v1 envelopes (no ciphertext) still parse on import for back-compat.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const env = state.synced.environments.items[input.name];\n if (!env) return { ok: false as const, error: 'environment not found' as const };\n const payload = {\n apicircleEnvironment: 2 as const,\n name: env.name,\n variables: env.variables.map((v) => {\n if (v.encrypted && v.secretKeyId) {\n const slot = state.synced.secretKeys?.[v.secretKeyId];\n const label = slot?.label ?? v.key;\n const value = typeof v.value === 'string' && v.value.startsWith('enc:') ? v.value : '';\n return {\n key: v.key,\n encrypted: true as const,\n value,\n secretKeyId: v.secretKeyId,\n secret: { label, salt: slot?.salt ?? null },\n };\n }\n return { key: v.key, value: v.value, encrypted: false as const };\n }),\n };\n return { ok: true as const, json: JSON.stringify(payload, null, 2) };\n },\n};\n\nexport const environmentImportTool: AnyToolDef = {\n name: 'environment.import',\n description:\n \"Import an environment from the JSON shape produced by `environment.export`. v2 envelopes carry the row ciphertext + per-slot salt, so the destination decrypts at request-execute time with its local slot value (same model as Git push/pull); when no destination slot matches the source's salt, a new slot is minted via `secretKey.upsert` and surfaced in `mintedSlots` so the caller can provide values via `secret.addLocal`. v1 envelopes carry only metadata, so unmatched rows come back as `pendingBindings` for the caller to prompt-and-bind via `secret.addLocal` + `environment.bindSecret`. Pass `overwrite: true` to replace a same-name destination env.\",\n inputSchema: z.object({\n json: z.string().min(1),\n overwrite: z.boolean().default(false),\n }),\n async handler(input, ctx) {\n let raw: unknown;\n try {\n raw = JSON.parse(input.json);\n } catch {\n return { ok: false as const, error: 'invalid JSON' as const };\n }\n let parsed;\n try {\n parsed = parseApicircleEnvironmentDoc(raw);\n } catch (err) {\n return {\n ok: false as const,\n error: err instanceof Error ? err.message : 'unsupported export shape',\n };\n }\n const state = await ctx.workspace.read();\n if (state.synced.environments.items[parsed.name] && !input.overwrite) {\n return {\n ok: false as const,\n error: 'environment already exists; pass overwrite:true' as const,\n };\n }\n\n // Resolve encrypted hints against the destination vault — same logic\n // as the UI store action so MCP + UI imports stay in lockstep. v2\n // hints with ciphertext + salt may mint slot metadata via a paired\n // `secretKey.upsert` so the receiver's missing-slots gate can fire\n // for the plaintext value. v1 hints fall back to pendingBindings.\n const destSlots = state.synced.secretKeys ?? {};\n const labelToSlotId = new Map<string, string>();\n for (const slot of Object.values(destSlots)) {\n if (!labelToSlotId.has(slot.label)) labelToSlotId.set(slot.label, slot.id);\n }\n\n const resolvedVariables: Environment['variables'] = [];\n const pendingBindings: Array<{ varKey: string; label: string; labelFromFallback: boolean }> =\n [];\n const mintedSlots: Array<{ id: string; label: string; salt: string; createdAt: string }> = [];\n const knownDestIds = new Set(Object.keys(destSlots));\n let hintCursor = 0;\n for (const v of parsed.variables) {\n if (!v.encrypted) {\n resolvedVariables.push(v);\n continue;\n }\n const hint = parsed.encryptedBindingHints[hintCursor];\n hintCursor += 1;\n\n // v2 path — ciphertext + salt are present.\n if (hint && hint.ciphertext && hint.salt) {\n if (hint.originSecretKeyId && destSlots[hint.originSecretKeyId]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n const labelMatch = labelToSlotId.get(hint.label);\n if (labelMatch && destSlots[labelMatch]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: labelMatch });\n continue;\n }\n const mintedId =\n hint.originSecretKeyId && !knownDestIds.has(hint.originSecretKeyId)\n ? hint.originSecretKeyId\n : generateId();\n knownDestIds.add(mintedId);\n if (!labelToSlotId.has(hint.label)) labelToSlotId.set(hint.label, mintedId);\n mintedSlots.push({\n id: mintedId,\n label: hint.label,\n salt: hint.salt,\n createdAt: new Date().toISOString(),\n });\n resolvedVariables.push({ ...v, secretKeyId: mintedId });\n continue;\n }\n\n // v1 path — metadata only.\n if (hint?.originSecretKeyId && destSlots[hint.originSecretKeyId]) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n if (hint?.label) {\n const matchId = labelToSlotId.get(hint.label);\n if (matchId) {\n resolvedVariables.push({ ...v, secretKeyId: matchId });\n continue;\n }\n }\n resolvedVariables.push(v);\n if (hint) {\n pendingBindings.push({\n varKey: hint.varKey,\n label: hint.label,\n labelFromFallback: hint.labelFromFallback,\n });\n }\n }\n\n // Mint slot metadata BEFORE the environment so the row's\n // secretKeyIds always point at a real slot the resolver knows about.\n for (const meta of mintedSlots) {\n await ctx.workspace.apply({ kind: 'secretKey.upsert', meta });\n }\n\n const env: Environment = { name: parsed.name, variables: resolvedVariables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return {\n ok: true as const,\n name: env.name,\n changedIds: out.changedIds,\n pendingBindings,\n mintedSlots: mintedSlots.map((s) => ({ id: s.id, label: s.label })),\n warnings: parsed.warnings,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Execution plans\n// ---------------------------------------------------------------------------\n\nconst PLAN_STEP = z.object({\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n});\n\nexport const planCreateTool: AnyToolDef = {\n name: 'plan.create',\n description: 'Create a new execution plan (sequence of request steps).',\n inputSchema: z.object({\n name: z.string().default('New plan'),\n steps: z.array(PLAN_STEP).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.steps,\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { id, changedIds: out.changedIds };\n },\n};\n\nexport const planReadTool: AnyToolDef = {\n name: 'plan.read',\n description: 'Read a plan by id, or list all plans when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const plan = state.local.executionPlans[input.id];\n return plan ? { found: true, plan } : { found: false };\n }\n return {\n count: Object.keys(state.local.executionPlans).length,\n plans: Object.values(state.local.executionPlans),\n };\n },\n};\n\nexport const planUpdateTool: AnyToolDef = {\n name: 'plan.update',\n description: 'Patch fields on an existing plan.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n steps: z.array(PLAN_STEP).optional(),\n envPriorityOrder: z.array(z.string()).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.local.executionPlans[input.id];\n if (!existing) return { changedIds: [] };\n const merged: ExecutionPlan = {\n ...existing,\n ...input.patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan: merged });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const planDeleteTool: AnyToolDef = {\n name: 'plan.delete',\n description: 'Delete a plan by id. Drops history rows referencing this plan.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'plan.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// Granular plan-step operations. Each fetches the plan, mutates the steps\n// array, and writes the whole plan back via `plan.upsert` — keeping\n// applyMutation patches as the single source of truth.\n\nexport const planAddStepTool: AnyToolDef = {\n name: 'plan.add_step',\n description:\n 'Append a step to an execution plan. Optional `position` (0-based) inserts at that index instead.',\n inputSchema: z.object({\n planId: z.string(),\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n position: z.number().int().nonnegative().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const step = {\n requestId: input.requestId,\n ...(input.linkedWorkspaceId ? { linkedWorkspaceId: input.linkedWorkspaceId } : {}),\n };\n const steps = [...plan.steps];\n if (input.position !== undefined && input.position <= steps.length) {\n steps.splice(input.position, 0, step);\n } else {\n steps.push(step);\n }\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRemoveStepTool: AnyToolDef = {\n name: 'plan.remove_step',\n description: 'Remove a step from a plan by 0-based index.',\n inputSchema: z.object({\n planId: z.string(),\n index: z.number().int().nonnegative(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.index >= plan.steps.length) {\n return { ok: false as const, error: 'index out of range' as const };\n }\n const steps = plan.steps.filter((_, i) => i !== input.index);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planReorderStepsTool: AnyToolDef = {\n name: 'plan.reorder_steps',\n description:\n 'Replace the plan steps with a new permutation. The supplied indices must reference valid current step indices.',\n inputSchema: z.object({\n planId: z.string(),\n order: z.array(z.number().int().nonnegative()),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.order.length !== plan.steps.length) {\n return { ok: false as const, error: 'order length must equal step count' as const };\n }\n const order: number[] = input.order;\n const seen = new Set(order);\n if (seen.size !== order.length || order.some((i: number) => i >= plan.steps.length)) {\n return { ok: false as const, error: 'order must be a permutation of step indices' as const };\n }\n const steps = order.map((i: number) => plan.steps[i]);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PLAN_VARIABLE = z.object({ key: z.string(), value: z.string() });\n\nexport const planSetVariablesTool: AnyToolDef = {\n name: 'plan.set_variables',\n description:\n 'Replace the plan-scoped variables. These live highest-priority during plan runs (above environment vars, below context vars).',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(PLAN_VARIABLE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRunTool: AnyToolDef = {\n name: 'plan.run',\n description:\n 'Run a plan headlessly (server-side). Currently returns a not-implemented marker — full execution requires the Desktop or browser runtime which the MCP host does not own. The Desktop integration overrides this tool with a real runner.',\n inputSchema: z.object({\n id: z.string(),\n withAssertions: z.boolean().default(true),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.id];\n if (!plan) return { ok: false, error: 'plan not found' };\n return {\n ok: false,\n error:\n 'Plan execution is only available in the Desktop app (or once a hosted runtime is wired). The plan exists and is ready to run from the UI.',\n planId: plan.id,\n stepCount: plan.steps.length,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Assertions\n// ---------------------------------------------------------------------------\n\nconst ASSERTION = z.object({\n id: z.string().optional(),\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nexport const assertionCreateTool: AnyToolDef = {\n name: 'assertion.create',\n description: 'Add an assertion to a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION,\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: input.assertion.id ?? generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const assertionReadTool: AnyToolDef = {\n name: 'assertion.read',\n description: 'List assertions for a request, or fetch a single assertion by id.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { found: false };\n if (input.assertionId) {\n const a = req.assertions.find((x) => x.id === input.assertionId);\n return a ? { found: true, assertion: a } : { found: false };\n }\n return { count: req.assertions.length, assertions: req.assertions };\n },\n};\n\nexport const assertionUpdateTool: AnyToolDef = {\n name: 'assertion.update',\n description: 'Replace an existing assertion (matched by `assertion.id`).',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION.required({ id: true }),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion: input.assertion as Assertion,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const assertionDeleteTool: AnyToolDef = {\n name: 'assertion.delete',\n description: 'Remove an assertion from a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.delete',\n requestId: input.requestId,\n assertionId: input.assertionId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workspace bulk read / write\n// ---------------------------------------------------------------------------\n\nexport const workspaceReadTool: AnyToolDef = {\n name: 'workspace.read',\n description:\n 'Return the full `{ synced, local }` workspace pair. Pass `workspaceId` to scope to a specific ' +\n 'workspace when multiple are registered (call `workspace.list` first to discover ids). When ' +\n 'omitted and multiple workspaces exist, the response is a structured \"multiple workspaces found\" ' +\n 'envelope listing each summary so the AI can clarify before drilling in. Use sparingly — ' +\n 'entity-specific tools are more efficient for small reads.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe(\n 'Optional workspace id (from `workspace.list`). Omit to read the active workspace; the ' +\n 'tool will switch to the \"multiple workspaces\" envelope when ambiguous.',\n ),\n }),\n async handler(input, ctx) {\n if (input.workspaceId) {\n const provider = ctx.workspaces.for(input.workspaceId);\n const state = await provider.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n }\n const summaries = await ctx.workspaces.list();\n if (summaries.length > 1) {\n return {\n kind: 'multiple-workspaces' as const,\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n hint:\n `Found ${summaries.length} workspaces. Re-call \\`workspace.read\\` with \\`workspaceId\\` set ` +\n 'to the desired entry, or call entity-specific tools (which default to the active workspace) ' +\n 'when scoping to one workspace is acceptable.',\n };\n }\n const state = await ctx.workspace.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n },\n};\n\nexport const workspaceWriteTool: AnyToolDef = {\n name: 'workspace.write',\n description:\n 'Bulk-replace the workspace. Pass `synced` and/or `local` to overwrite either side. Use ' +\n '`workspaceId` to target a non-active workspace (omit to write the active one). Mutating tools ' +\n 'are preferred — this is for full-doc imports/exports.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe('Optional workspace id; omit to write the active workspace.'),\n synced: z.unknown().optional(),\n local: z.unknown().optional(),\n }),\n async handler(input, ctx) {\n const provider = input.workspaceId ? ctx.workspaces.for(input.workspaceId) : ctx.workspace;\n const next = await provider.write({\n synced: input.synced as Parameters<typeof provider.write>[0]['synced'],\n local: input.local as Parameters<typeof provider.write>[0]['local'],\n });\n return { workspaceId: next.synced.workspaceId, ok: true };\n },\n};\n","// MCP tools for the `apicircle.folder/v1` exchange format.\n//\n// • `folder.export_json` — collect a self-contained JSON envelope for\n// a folder + its subtree. Embeds Global Asset dependencies (JSON\n// Schemas + GraphQL definitions) and captures file-asset metadata.\n// Auth credentials are REDACTED by default — callers opt in per\n// credential id via `includeCredentialIds`.\n//\n// • `folder.import_json` — parse an envelope produced by\n// `folder.export_json` (or the in-app Export Folder modal) and graft\n// it into the active workspace under the requested parent folder.\n// Routes through the `folder.import_apicircle` patch on\n// `WorkspaceProvider.apply`, so the same name-uniquify + dependency\n// dedupe semantics apply to every writer (UI / CLI / MCP).\n\nimport { z } from 'zod';\nimport {\n collectFolderExport,\n parseApicircleFolderExport,\n redactFolderExportCredentials,\n serializeFolderExport,\n suggestFolderExportFilename,\n} from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\nexport const folderExportJsonTool: AnyToolDef = {\n name: 'folder.export_json',\n description:\n 'Export an existing folder (and its subtree) to the API Circle exchange JSON format. ' +\n 'Embeds JSON Schema + GraphQL dependencies inline. Auth credentials are redacted by ' +\n 'default — pass `includeCredentialIds` to keep specific fields verbatim (the report from ' +\n '`collectFolderExport` enumerates the available ids).',\n inputSchema: z.object({\n folderId: z.string().min(1, 'folderId is required'),\n /**\n * Subset of credential ids to KEEP in the output. Anything not in\n * this list (and every detected credential when this is empty)\n * gets blanked. Use the report-side ids surfaced by the export\n * report (`<scope>:<ownerId>.<authType>.<field>`).\n */\n includeCredentialIds: z.array(z.string()).optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const collected = collectFolderExport({\n synced: state.synced,\n folderId: input.folderId,\n });\n if (!collected) {\n return {\n error: 'folder_not_found',\n message: `No folder with id \"${input.folderId}\" exists in the active workspace.`,\n };\n }\n const includeIds = new Set<string>(input.includeCredentialIds ?? []);\n const redacted = redactFolderExportCredentials(collected.envelope, includeIds);\n return {\n envelope: redacted,\n json: serializeFolderExport(redacted),\n filename: suggestFolderExportFilename(redacted),\n report: collected.report,\n };\n },\n};\n\nexport const folderImportJsonTool: AnyToolDef = {\n name: 'folder.import_json',\n description:\n 'Import an `apicircle.folder/v1` envelope into the active workspace. Folder + request ' +\n 'ids are reminted, dependency references are remapped, and JSON Schema / GraphQL ' +\n 'definitions that match an existing global asset (by name + content) are reused.',\n inputSchema: z.object({\n /** Either a JSON string or the already-parsed envelope object. */\n json: z.string().min(1).optional(),\n envelope: z.record(z.unknown()).optional(),\n parentFolderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n if (!input.json && !input.envelope) {\n return {\n error: 'invalid_input',\n message: 'Pass either `json` (string) or `envelope` (object).',\n };\n }\n const text = input.json !== undefined ? input.json : JSON.stringify(input.envelope);\n let parsed: ReturnType<typeof parseApicircleFolderExport>;\n try {\n parsed = parseApicircleFolderExport(text);\n } catch (err) {\n return {\n error: 'invalid_envelope',\n message: err instanceof Error ? err.message : String(err),\n };\n }\n const out = await ctx.workspace.apply({\n kind: 'folder.import_apicircle',\n parsed,\n parentFolderId: input.parentFolderId ?? null,\n });\n return {\n rootFolderId: parsed.rootFolder.id,\n rootFolderName: parsed.rootFolder.name,\n counts: {\n folders: parsed.subfolders.length + 1,\n requests: parsed.requests.length,\n },\n filesRequiringReattachment: parsed.dependencies.files.map((f) => f.id),\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// History tools — list / get / delete / purge over the local request-run +\n// plan-run buffers. History lives in `WorkspaceLocal`, never pushed to git,\n// so these are local-only mutations.\n// =============================================================================\n\nexport const historyListRunsTool: AnyToolDef = {\n name: 'history.list_runs',\n description:\n 'List request-run history rows in reverse-chronological order. Filter by `requestId`, `ok` (success/failure), or `since`/`until` ISO timestamps. `limit` caps the result set; default 100.',\n inputSchema: z.object({\n requestId: z.string().optional(),\n ok: z.boolean().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n limit: z.number().int().positive().max(500).default(100),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const sinceMs = input.since ? Date.parse(input.since) : -Infinity;\n const untilMs = input.until ? Date.parse(input.until) : Infinity;\n const filtered = state.local.history.requestRuns.filter((r) => {\n if (input.requestId && r.requestId !== input.requestId) return false;\n if (input.ok !== undefined && r.ok !== input.ok) return false;\n const t = Date.parse(r.startedAt);\n if (!Number.isFinite(t)) return true;\n return t >= sinceMs && t <= untilMs;\n });\n // Already stored newest-last in the circular buffer; reverse for display.\n const sorted = [...filtered].sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n const limited = sorted.slice(0, input.limit);\n return {\n total: filtered.length,\n returned: limited.length,\n runs: limited.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n method: r.method,\n url: r.url,\n status: r.status,\n ok: r.ok,\n startedAt: r.startedAt,\n durationMs: r.durationMs,\n })),\n };\n },\n};\n\nexport const historyGetRunTool: AnyToolDef = {\n name: 'history.get_run',\n description: 'Fetch a single history row in full (headers, body preview, assertion results).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const run = state.local.history.requestRuns.find((r) => r.id === input.id);\n if (!run) return { found: false as const };\n return { found: true as const, run };\n },\n};\n\nexport const historyDeleteRunTool: AnyToolDef = {\n name: 'history.delete_run',\n description: 'Delete a single request-run row by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'history.delete_run', runId: input.id });\n return { deleted: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n\nexport const historyPurgeTool: AnyToolDef = {\n name: 'history.purge_by_age',\n description:\n 'Drop every request-run + plan-run older than `olderThanDays` days. Pass 0 to clear all history.',\n inputSchema: z.object({\n olderThanDays: z.number().nonnegative(),\n }),\n async handler(input, ctx) {\n const olderThanMs = input.olderThanDays * 24 * 60 * 60 * 1000;\n const out = await ctx.workspace.apply({ kind: 'history.purge', olderThanMs });\n return { purgedCount: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// codebase.extract_collection — heuristic detector that walks a chunk of\n// source code (passed in by the AI client) and returns candidate request\n// shapes. The MCP host doesn't have filesystem access by itself; this tool\n// lets the AI orchestrate a `read files → extract → confirm with user →\n// import` pipeline.\n//\n// Currently detects:\n// • Express — `app.METHOD(`, `router.METHOD(`\n// • FastAPI — `@app.METHOD(`, `@router.METHOD(`\n// • Spring — `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`,\n// `@PatchMapping`, `@RequestMapping(method=...)`\n// • NestJS — `@Get(`, `@Post(`, `@Put(`, `@Patch(`, `@Delete(`\n//\n// All matches are surfaced as `{ method, path, framework, line }`. The AI\n// then asks the user to confirm and follows up with `request.create` calls.\n// =============================================================================\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];\n\ninterface Candidate {\n method: string;\n path: string;\n framework: 'express' | 'fastapi' | 'nest' | 'spring';\n line: number;\n}\n\nexport const codebaseExtractCollectionTool: AnyToolDef = {\n name: 'codebase.extract_collection',\n description:\n 'Scan source code for HTTP route definitions (Express, FastAPI, NestJS, Spring) and return candidate requests for the user to confirm before import.',\n inputSchema: z.object({\n source: z.string().min(1),\n /** Hint to limit which framework patterns to apply. Empty = try all. */\n frameworks: z.array(z.enum(['express', 'fastapi', 'nest', 'spring'])).default([]),\n }),\n async handler(input) {\n const enabled = new Set(\n input.frameworks.length ? input.frameworks : ['express', 'fastapi', 'nest', 'spring'],\n );\n const candidates: Candidate[] = [];\n const lines = input.source.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (enabled.has('express')) {\n const m =\n /(?:^|[\\s\\b])(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'express',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('fastapi')) {\n const m =\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'fastapi',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('nest')) {\n const m = /@(Get|Post|Put|Patch|Delete|Options|Head)\\s*\\(\\s*['\"`]([^'\"`]*)['\"`]\\s*\\)/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2] || '/',\n framework: 'nest',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('spring')) {\n const verb = /@(Get|Post|Put|Patch|Delete)Mapping\\s*\\(?\\s*['\"`]?([^'\"`)\\s]*)/i.exec(line);\n if (verb && HTTP_METHODS.includes(verb[1].toLowerCase())) {\n candidates.push({\n method: verb[1].toUpperCase(),\n path: verb[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n continue;\n }\n const generic =\n /@RequestMapping\\s*\\(\\s*[^)]*method\\s*=\\s*RequestMethod\\.(GET|POST|PUT|PATCH|DELETE)[^)]*?(?:value|path)?\\s*=?\\s*['\"`]?([^'\"`)\\s,]*)/i.exec(\n line,\n );\n if (generic) {\n candidates.push({\n method: generic[1].toUpperCase(),\n path: generic[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n }\n }\n }\n return { count: candidates.length, candidates };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n Request as ApiRequest,\n RequestAuth,\n RequestBody,\n} from '@apicircle/shared';\nimport {\n generateId,\n makeDefaultMockResponse,\n makeDefaultRequestSchema,\n MAX_RESPONSE_MULTIPLIERS,\n} from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Prompt-driven authoring tools. The AI client converts the user's natural-\n// language request into JSON matching the schemas below; the server validates\n// + persists. The actual NL → JSON conversion happens client-side in the AI's\n// own model, not here.\n// =============================================================================\n\nexport const promptCreateEnvironmentTool: AnyToolDef = {\n name: 'prompt.create_environment',\n description:\n 'Create a new environment from an LLM-shaped JSON envelope. The model produces { name, variables: [{ key, value, encrypted }] }; this tool validates and persists it.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n }),\n ),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreateAssertionTool: AnyToolDef = {\n name: 'prompt.create_assertion',\n description:\n 'Add an assertion to a request from an LLM-shaped JSON envelope. Useful when the user asks \"assert that the response status is 200 and body.id matches\".',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n }),\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreatePlanTool: AnyToolDef = {\n name: 'prompt.create_plan',\n description:\n 'Create an execution plan from an LLM-shaped JSON envelope. The model produces { name, stepRequestIds: [...] } and the tool validates that each id exists in the workspace before persisting.',\n inputSchema: z.object({\n name: z.string(),\n stepRequestIds: z.array(z.string()).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const missing: string[] = [];\n for (const rid of input.stepRequestIds) {\n if (!state.synced.collections.requests[rid]) missing.push(rid);\n }\n if (missing.length) {\n return {\n ok: false,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.stepRequestIds.map((requestId: string) => ({ requestId })),\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { ok: true, id, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Shared schema fragments for the request- and mock-shaped prompt.* tools\n// below. Kept inline (vs imported from crud.ts / mocks.ts) so each prompt.*\n// tool stays a self-contained NL contract — the canonical CRUD schemas can\n// evolve without dragging the prompt surface with them.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nconst HEADER_OR_QUERY = z.object({\n key: z.string(),\n value: z.string(),\n enabled: z.boolean().default(true),\n});\n\nconst REQUEST_BODY = z.object({\n type: z.enum(['none', 'json', 'text', 'xml', 'graphql', 'urlencoded']).default('none'),\n content: z.string().default(''),\n variables: z.string().optional(),\n});\n\n// LLM-friendly auth surface — covers the authoring flows a model can plausibly\n// produce from natural language. OAuth2 / AWS / Hawk / NTLM / JWT are token-\n// state heavy and best authored via the dedicated UI, then patched via\n// `request.update`. Callers needing them should use that path.\nexport const PROMPT_AUTH = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('inherit') }),\n z.object({ type: z.literal('bearer'), token: z.string().default('') }),\n z.object({\n type: z.literal('basic'),\n username: z.string().default(''),\n password: z.string().default(''),\n }),\n z.object({\n type: z.literal('api-key'),\n key: z.string().default(''),\n value: z.string().default(''),\n addTo: z.enum(['header', 'query', 'cookie']).default('header'),\n }),\n z.object({\n type: z.literal('custom-header'),\n key: z.string().default(''),\n value: z.string().default(''),\n }),\n]);\n\nconst PROMPT_ASSERTION = z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nconst VALIDATION_RULE_NL = z.object({\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE_NL = z.object({\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE_NL = z.object({\n name: z.string(),\n enabled: z.boolean().default(true),\n // At least one clause — a no-condition rule is dead (the runtime engine skips\n // clause-less rules), so it never fires (mirrors the VS Code parser's reject).\n when: z.array(CONDITION_CLAUSE_NL).min(1),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER_NL = z.object({\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nconst ENDPOINT_INPUT = z.object({\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n});\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRequestBody(input?: z.infer<typeof REQUEST_BODY>): RequestBody {\n if (!input) return { type: 'none', content: '' };\n const body: RequestBody = { type: input.type, content: input.content };\n if (input.variables !== undefined && input.type === 'graphql') {\n body.variables = input.variables;\n }\n return body;\n}\n\nfunction buildEndpoint(input: z.infer<typeof ENDPOINT_INPUT>): MockEndpoint {\n const response = input.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n const defaultResponse: MockResponseConfig = {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n };\n // Inputs from raw JSON (callers bypassing zod parse) may have these arrays\n // omitted. Treat undefined as empty so the build path never NPEs.\n const validationRules = input.validationRules ?? [];\n const responseRules = input.responseRules ?? [];\n const multipliers = (input.multipliers ?? []).slice(0, MAX_RESPONSE_MULTIPLIERS);\n if (multipliers.length > 0) {\n defaultResponse.multipliers = multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n }));\n }\n return {\n id: generateId(),\n name: input.name ?? `${input.method} ${input.pathPattern}`,\n method: input.method,\n pathPattern: input.pathPattern,\n description: input.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: validationRules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n responseRules: responseRules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: (r.when ?? []).map((c) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n defaultResponse,\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const promptCreateRequestTool: AnyToolDef = {\n name: 'prompt.create_request',\n description:\n 'Create a fully-shaped request from an LLM-shaped JSON envelope: method, url, headers, query params, body, auth, and inline assertions. The model produces a flat object; this tool generates the request id, normalizes auth (defaults to `inherit` so folder auth wins), and persists.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).default([]),\n queryParams: z.array(HEADER_OR_QUERY).default([]),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const auth: RequestAuth = (input.auth ?? { type: 'inherit' }) as RequestAuth;\n const assertions: Array<z.infer<typeof PROMPT_ASSERTION>> = input.assertions ?? [];\n const request: ApiRequest = {\n id: generateId(),\n name: input.name ?? 'New request',\n folderId: input.folderId ?? null,\n method: input.method ?? 'GET',\n url: input.url ?? '',\n headers: input.headers ?? [],\n query: input.queryParams ?? [],\n pathParams: input.pathParams,\n body: buildRequestBody(input.body),\n auth,\n contextVars: [],\n extractions: [],\n assertions: assertions.map((a) => ({ ...a, id: generateId() })),\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptUpdateRequestTool: AnyToolDef = {\n name: 'prompt.update_request',\n description:\n 'Patch an existing request from an LLM-shaped JSON envelope. Provided fields replace the existing values; omitted fields are left untouched. Arrays (headers, queryParams, assertions) are full replacements when supplied. Returns `{ ok: false, error }` when the id does not resolve.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).optional(),\n queryParams: z.array(HEADER_OR_QUERY).optional(),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.collections.requests[input.id]) {\n return { ok: false as const, error: 'request not found' as const };\n }\n const patch: Partial<Omit<ApiRequest, 'id' | 'createdAt'>> = {};\n if (input.patch.name !== undefined) patch.name = input.patch.name;\n if (input.patch.method !== undefined) patch.method = input.patch.method;\n if (input.patch.url !== undefined) patch.url = input.patch.url;\n if (input.patch.folderId !== undefined) patch.folderId = input.patch.folderId ?? null;\n if (input.patch.headers !== undefined) patch.headers = input.patch.headers;\n if (input.patch.queryParams !== undefined) patch.query = input.patch.queryParams;\n if (input.patch.pathParams !== undefined) patch.pathParams = input.patch.pathParams;\n if (input.patch.body !== undefined) patch.body = buildRequestBody(input.patch.body);\n if (input.patch.auth !== undefined) patch.auth = input.patch.auth as RequestAuth;\n if (input.patch.assertions !== undefined) {\n patch.assertions = input.patch.assertions.map((a: z.infer<typeof PROMPT_ASSERTION>) => ({\n ...a,\n id: generateId(),\n }));\n }\n const out = await ctx.workspace.apply({ kind: 'request.update', id: input.id, patch });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\ninterface FolderTreeNode {\n name: string;\n children?: FolderTreeNode[];\n}\n\nconst FOLDER_TREE_NODE: z.ZodType<FolderTreeNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(FOLDER_TREE_NODE).optional(),\n }),\n);\n\nexport const promptCreateFolderTreeTool: AnyToolDef = {\n name: 'prompt.create_folder_tree',\n description:\n 'Create a recursive folder hierarchy from an LLM-shaped JSON envelope. The model produces `{ parentId?, tree: { name, children?: [...] } }` and this tool walks the tree, generating ids and persisting one folder per node. Returns the list of created ids in pre-order.',\n inputSchema: z.object({\n parentId: z.string().nullable().optional(),\n tree: FOLDER_TREE_NODE,\n }),\n async handler(input, ctx) {\n const createdIds: string[] = [];\n const allChangedIds: string[] = [];\n const walk = async (node: FolderTreeNode, parentId: string | null): Promise<void> => {\n const folder: Folder = {\n id: generateId(),\n name: node.name,\n parentId,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n createdIds.push(folder.id);\n allChangedIds.push(...out.changedIds);\n for (const child of node.children ?? []) {\n await walk(child, folder.id);\n }\n };\n await walk(input.tree, input.parentId ?? null);\n return { createdIds, changedIds: allChangedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Plans\n// ---------------------------------------------------------------------------\n\nexport const promptAddPlanStepsTool: AnyToolDef = {\n name: 'prompt.add_plan_steps',\n description:\n 'Append one or more steps to an existing execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, requestIds: [...] }`; each id is validated against the workspace before any step is appended. Order in the input list is preserved.',\n inputSchema: z.object({\n planId: z.string(),\n requestIds: z.array(z.string()).min(1),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const requestIds: string[] = input.requestIds;\n const missing = requestIds.filter((rid) => !state.synced.collections.requests[rid]);\n if (missing.length) {\n return {\n ok: false as const,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const newSteps = requestIds.map((requestId) => ({ requestId }));\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: {\n ...plan,\n steps: [...plan.steps, ...newSteps],\n updatedAt: new Date().toISOString(),\n },\n });\n return { ok: true as const, addedCount: newSteps.length, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetPlanVariablesTool: AnyToolDef = {\n name: 'prompt.set_plan_variables',\n description:\n 'Replace the plan-scoped variables on an execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, variables: [{ key, value }] }`. Empty array clears all plan variables.',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(z.object({ key: z.string(), value: z.string() })),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mocks\n// ---------------------------------------------------------------------------\n\nexport const promptCreateMockServerTool: AnyToolDef = {\n name: 'prompt.create_mock_server',\n description:\n 'Create a manual-mode mock server with optional inline endpoints from an LLM-shaped JSON envelope. The model produces `{ name, defaultPort?, endpoints: [{ method, pathPattern, name?, response?, validationRules?, responseRules?, multiplier? }] }`; this tool generates ids for the server and every endpoint / rule, then persists in one shot.',\n inputSchema: z.object({\n name: z.string().min(1),\n // Mirrors mock.create_manual / mock.start / mock.set_default_port:\n // reject out-of-range ports at the tool boundary so a prompt that\n // returns a stray port (1, 80, 999999) never leaks into the synced doc.\n defaultPort: z.number().int().min(1024).max(65535).nullable().optional(),\n endpoints: z.array(ENDPOINT_INPUT).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const endpointInputs: Array<z.infer<typeof ENDPOINT_INPUT>> = input.endpoints ?? [];\n const endpoints = endpointInputs.map((e) => buildEndpoint(e));\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints },\n endpoints,\n defaultPort: input.defaultPort ?? null,\n cors: { enabled: true, origins: ['*'] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointIds: endpoints.map((e: MockEndpoint) => e.id),\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const promptAddMockEndpointTool: AnyToolDef = {\n name: 'prompt.add_mock_endpoint',\n description:\n 'Append a new endpoint (with optional inline validation rules, response rules, and a single response multiplier) to an existing mock server from an LLM-shaped JSON envelope. All ids are auto-generated; the existing endpoints stay in place.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const endpoint = buildEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointValidationRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_validation_rules',\n description:\n \"Replace an endpoint's validation rules with an LLM-shaped list. Every rule gets a fresh id; the existing rules are dropped. Empty array clears all validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointResponseRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_response_rules',\n description:\n \"Replace an endpoint's conditional response rules with an LLM-shaped list. Rules fire in order, first match wins. Every rule + clause gets a fresh id. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE_NL>) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointMultipliersTool: AnyToolDef = {\n name: 'prompt.set_endpoint_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse with an LLM-shaped list. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Every multiplier gets a fresh id. Empty array clears all. Capped at MAX_RESPONSE_MULTIPLIERS (1) — extra entries are rejected.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER_NL>> = input.multipliers;\n if (multipliers.length > MAX_RESPONSE_MULTIPLIERS) {\n return { ok: false as const, error: 'too many multipliers' as const };\n }\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PARAM_NL = z.object({\n name: z.string(),\n typeHint: z.string().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n example: z.string().optional(),\n});\n\nexport const promptSetEndpointRequestSchemaTool: AnyToolDef = {\n name: 'prompt.set_endpoint_request_schema',\n description:\n \"Declare an endpoint's expected inputs with an LLM-shaped list: path / query / header / cookie params (name + optional typeHint / required / description / example) plus an optional body-shape doc. Every param gets a fresh id; omitted lists are cleared. Documentation-only — it drives the editor UI + OpenAPI export, not runtime gating (use validation rules for that).\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n pathParams: z.array(PARAM_NL).default([]),\n queryParams: z.array(PARAM_NL).default([]),\n headers: z.array(PARAM_NL).default([]),\n cookies: z.array(PARAM_NL).default([]),\n body: z\n .object({ description: z.string().optional(), example: z.string().optional() })\n .optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const toParams = (list: Array<z.infer<typeof PARAM_NL>>) =>\n list.map((p) => ({\n id: generateId(),\n name: p.name,\n typeHint: p.typeHint,\n required: p.required,\n description: p.description,\n example: p.example,\n }));\n const body =\n input.body && (input.body.description || input.body.example) ? input.body : undefined;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestSchema: {\n pathParams: toParams(input.pathParams),\n queryParams: toParams(input.queryParams),\n headers: toParams(input.headers),\n cookies: toParams(input.cookies),\n body,\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { GlobalFileAsset } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Global Assets — File library MCP tools.\n//\n// Files in `synced.globalAssets.files` are the reusable file uploads\n// referenced from request bodies and mock-server responses. Every direct\n// upload in the UI now mints a Global Asset entry, so this catalog is the\n// single inventory point AI clients see when asking \"what files are in\n// the workspace?\".\n//\n// Each asset carries provenance state (workingBranchRef + baseBranchRef)\n// recorded by the push + refresh flows. `globalAssets.files.list`\n// surfaces that state alongside the cross-cutting reference count so a\n// caller can identify orphans, files awaiting the next push, files that\n// merged to base, etc.\n//\n// Note on `globalAssets.files.create`: MCP cannot carry binary bytes, so\n// this tool is metadata-only — it records the file in the registry with\n// an explicit `pendingFromMcp` source marker the desktop / web can use\n// to prompt for the missing bytes. Most MCP clients won't need create;\n// list / update / delete are the common surfaces.\n// =============================================================================\n\nexport type FileAssetState =\n | 'uploading'\n | 'workingOnly'\n | 'merged'\n | 'baseOnly'\n | 'missing'\n | 'diverged';\n\nfunction deriveState(\n asset: Pick<GlobalFileAsset, 'workingBranchRef' | 'baseBranchRef'>,\n hasPendingUpload: boolean,\n): FileAssetState {\n const w = asset.workingBranchRef ?? null;\n const b = asset.baseBranchRef ?? null;\n if (w && b) {\n if (w.blobSha && b.blobSha && w.blobSha !== b.blobSha) return 'diverged';\n return 'merged';\n }\n if (w && !b) return 'workingOnly';\n if (!w && b) return 'baseOnly';\n if (hasPendingUpload) return 'uploading';\n return 'missing';\n}\n\nexport const globalAssetsFilesListTool: AnyToolDef = {\n name: 'assets.list_files',\n description:\n 'List every Global File Asset with its provenance state and reference count. Each entry includes id, name, filename, size, mimeType, sha256, state (uploading | workingOnly | merged | baseOnly | missing | diverged), workingBranchRef, baseBranchRef, and usage { requests, mockEndpoints, total }.',\n inputSchema: z.object({}).strict(),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const files = state.synced.globalAssets.files ?? {};\n const pending = state.local.pendingFileUploads ?? {};\n const usage = state.local.assetUsageIndex ?? {};\n const items = Object.values(files).map((asset) => {\n const hasPending = Boolean(pending[asset.id]);\n const u = usage[asset.id] ?? { requests: [], mockEndpoints: [], total: 0 };\n return {\n id: asset.id,\n name: asset.name,\n description: asset.description ?? null,\n filename: asset.filename,\n size: asset.size,\n mimeType: asset.mimeType,\n sha256: asset.sha256 ?? null,\n state: deriveState(asset, hasPending),\n workingBranchRef: asset.workingBranchRef ?? null,\n baseBranchRef: asset.baseBranchRef ?? null,\n usage: { ...u },\n };\n });\n return { count: items.length, files: items };\n },\n};\n\nexport const globalAssetsFilesCreateTool: AnyToolDef = {\n name: 'assets.create_file',\n description:\n 'Register a Global File Asset entry. Bytes are NOT carried — MCP returns the new asset id and the asset enters the \"missing\" state. The user fills the bytes from the Global Assets panel (a \"Fill bytes\" button surfaces on missing-state assets) which preserves the slot id and queues the bytes for the next push. Use this when an AI client wants to claim an asset slot for a file the user will provide later.',\n inputSchema: z\n .object({\n name: z.string().min(1, 'name is required'),\n description: z.string().optional(),\n filename: z.string().min(1, 'filename is required'),\n size: z.number().int().nonnegative(),\n mimeType: z.string().default('application/octet-stream'),\n sha256: z.string().optional(),\n })\n .strict(),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const file: GlobalFileAsset = {\n id: generateId(),\n name: input.name,\n description: input.description,\n slotId: generateId(),\n filename: input.filename,\n size: input.size,\n mimeType: input.mimeType,\n sha256: input.sha256,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'globalAsset.upsertFile', file });\n return { id: file.id, slotId: file.slotId, changedIds: out.changedIds };\n },\n};\n\nexport const globalAssetsFilesUpdateTool: AnyToolDef = {\n name: 'assets.update_file',\n description:\n 'Rename or re-describe a Global File Asset. Provenance refs (workingBranchRef, baseBranchRef) and binary metadata (slotId, sha256, size, mimeType) are preserved verbatim.',\n inputSchema: z\n .object({\n id: z.string().min(1),\n patch: z\n .object({\n name: z.string().optional(),\n description: z.string().nullable().optional(),\n })\n .strict(),\n })\n .strict(),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.synced.globalAssets.files?.[input.id];\n if (!existing) {\n return { found: false, changedIds: [] };\n }\n const next: GlobalFileAsset = {\n ...existing,\n name: input.patch.name ?? existing.name,\n description:\n input.patch.description === null\n ? undefined\n : (input.patch.description ?? existing.description),\n };\n const out = await ctx.workspace.apply({ kind: 'globalAsset.upsertFile', file: next });\n return { found: true, id: next.id, changedIds: out.changedIds };\n },\n};\n\nexport const globalAssetsFilesDeleteTool: AnyToolDef = {\n name: 'assets.delete_file',\n description:\n 'Delete a Global File Asset. Cascades — every request body and mock-response body that referenced the asset is unbound in the same mutation. The result envelope includes the consumer list that was cleared so the caller can report what changed.',\n inputSchema: z.object({ id: z.string().min(1) }).strict(),\n async handler(input, ctx) {\n // Snapshot the consumer list BEFORE the cascade so the envelope can\n // report what was cleared. Uses the local assetUsageIndex when\n // available, otherwise walks the synced doc directly.\n const before = await ctx.workspace.read();\n const usage = before.local.assetUsageIndex?.[input.id] ?? {\n requests: [],\n mockEndpoints: [],\n total: 0,\n };\n const existing = before.synced.globalAssets.files?.[input.id];\n if (!existing) {\n return { found: false, changedIds: [] };\n }\n const out = await ctx.workspace.apply({ kind: 'globalAsset.removeFile', id: input.id });\n return {\n found: true,\n id: input.id,\n filename: existing.filename,\n unbound: {\n requests: usage.requests,\n mockEndpoints: usage.mockEndpoints,\n total: usage.total,\n },\n changedIds: out.changedIds,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n MockServerSource,\n} from '@apicircle/shared';\nimport {\n generateId,\n makeDefaultMockResponse,\n makeDefaultRequestSchema,\n MAX_RESPONSE_MULTIPLIERS,\n} from '@apicircle/shared';\nimport { parseSourceToEndpoints } from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Mock-server tools. Definitions live in `synced.mockServers` (push to git);\n// `mock.start` / `mock.stop` go through the MockController so the MCP host's\n// environment (Electron main, CLI, hosted) controls the actual lifecycle.\n// =============================================================================\n\nasync function ingestSource(\n source: MockServerSource,\n name: string,\n): Promise<{ mock: MockServer; warnings: string[] }> {\n const { endpoints, warnings } = await parseSourceToEndpoints(source);\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name,\n source,\n endpoints,\n defaultPort: null,\n // Off by default — match UI-created mocks. User opts in via cors.enabled=true\n // after explicitly listing origins (see CorsSection in MockServersPanel).\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n return { mock, warnings };\n}\n\nexport const mockCreateFromOpenApiTool: AnyToolDef = {\n name: 'mock.create_from_openapi',\n description: 'Create a mock server from an OpenAPI / Swagger spec (YAML or JSON).',\n inputSchema: z.object({\n name: z.string(),\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'openapi', spec: input.spec, format: input.format },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromPostmanTool: AnyToolDef = {\n name: 'mock.create_from_postman',\n description: 'Create a mock server from a Postman v2/v2.1 collection.',\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromInsomniaTool: AnyToolDef = {\n name: 'mock.create_from_insomnia',\n description: 'Create a mock server from an Insomnia v4 export.',\n inputSchema: z.object({ name: z.string(), export: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'insomnia', export: input.export },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\n// Postman has its own \"mock collection\" concept — same parser, but we tag\n// the source so the UI can label it differently in the mock list.\nexport const mockImportPostmanMockCollectionTool: AnyToolDef = {\n name: 'mock.import_postman_mock_collection',\n description:\n \"Import a Postman Mock Collection (collections previously hosted on Postman's mock service). Same parser as a regular Postman collection but marked as a mock import.\",\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockListTool: AnyToolDef = {\n name: 'mock.list',\n description:\n 'List all mock servers in the workspace plus their runtime status (running / stopped, port).',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const running = await ctx.mock.list();\n const runningById = new Map(running.map((r) => [r.serverId, r.runtime]));\n const items = Object.values(state.synced.mockServers).map((m) => {\n const runtime = runningById.get(m.id);\n return {\n id: m.id,\n name: m.name,\n endpointCount: m.endpoints.length,\n defaultPort: m.defaultPort,\n running: !!runtime,\n port: runtime?.port ?? null,\n };\n });\n return { count: items.length, mocks: items };\n },\n};\n\nexport const mockStartTool: AnyToolDef = {\n name: 'mock.start',\n description:\n 'Start a mock server by id. Returns the bound port. Errors if the mock is already running or the requested port is in use. Optional `port` (1024-65535) overrides the saved `defaultPort` for this run only — to persist a new default port, use `mock.set_default_port`.',\n inputSchema: z.object({\n id: z.string(),\n // Mirrors the UI 1024-65535 window: <1024 needs OS privileges, and\n // outside that window the runtime would throw INVALID_PORT anyway —\n // surface the rejection at the tool boundary so the client sees a\n // schema error instead of a runtime exception.\n port: z.number().int().min(1024).max(65535).optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n try {\n const result = await ctx.mock.start(mock, { port: input.port });\n return { ok: true, port: result.port, pid: result.pid, startedAt: result.startedAt };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.start failed' };\n }\n },\n};\n\nexport const mockStopTool: AnyToolDef = {\n name: 'mock.stop',\n description: 'Stop a running mock server by id (no-op if not running).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.stop failed' };\n }\n },\n};\n\nexport const mockDeleteTool: AnyToolDef = {\n name: 'mock.delete',\n description: \"Delete a mock server definition. Stops it first if it's running.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n } catch {\n // best-effort stop; deletion proceeds either way\n }\n const out = await ctx.workspace.apply({ kind: 'mock.delete', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n\n// Persist a new `defaultPort` on an existing mock. Mirrors the\n// `setMockServerDefaultPort` store action: integer 1024-65535 or `null`\n// for \"let the runtime pick a free port at next Start\". Does NOT\n// restart a running mock — the new port takes effect on the next\n// `mock.start`. Use this when an AI client wants to pin a port that\n// survives across runs; use `mock.start`'s optional `port` arg when\n// the override should apply to a single run only.\nexport const mockSetDefaultPortTool: AnyToolDef = {\n name: 'mock.set_default_port',\n description:\n \"Persist a new `defaultPort` on an existing mock server. Pass an integer 1024-65535 to pin the port, or `null` for 'pick a free port at next start'. Does NOT restart a running mock — the change takes effect on the next mock.start.\",\n inputSchema: z.object({\n id: z.string(),\n defaultPort: z.number().int().min(1024).max(65535).nullable(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n if (mock.defaultPort === input.defaultPort) {\n // No-op when the value is unchanged. Keeps updatedAt stable so\n // repeated AI-driven calls don't churn the synced doc.\n return { ok: true, defaultPort: mock.defaultPort, changed: false };\n }\n const next: MockServer = {\n ...mock,\n defaultPort: input.defaultPort,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return {\n ok: true,\n defaultPort: input.defaultPort,\n changed: true,\n changedIds: out.changedIds,\n };\n },\n};\n\n// =============================================================================\n// Manual mock construction & endpoint-level CRUD\n// -----------------------------------------------------------------------------\n// `mock.create_manual` mirrors the web UI's \"New mock server\" → manual mode.\n// The endpoint tools below let an MCP client author endpoints + their default\n// responses without needing to round-trip through `workspace.write` with a\n// hand-built blob.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nexport const mockCreateManualTool: AnyToolDef = {\n name: 'mock.create_manual',\n description:\n 'Create an empty manual-mode mock server. Use `mock.add_endpoint` afterward to populate it. CORS defaults to off (same-origin only); enable + list explicit origins via `mock.update_cors` if cross-origin access is needed.',\n inputSchema: z.object({\n name: z.string().min(1),\n // Same 1024-65535 window as mock.start / mock.set_default_port — pin\n // the validation at the tool boundary so a malformed AI call doesn't\n // persist a port the runtime will later reject as INVALID_PORT.\n defaultPort: z.number().int().min(1024).max(65535).nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints: [] },\n endpoints: [],\n defaultPort: input.defaultPort ?? null,\n // Off by default — match UI-created mocks. Caller opts in via\n // explicit origins; we never silently wildcard.\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return { id: mock.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockListEndpointsTool: AnyToolDef = {\n name: 'mock.list_endpoints',\n description: 'List endpoints for a mock server (id, method, path, name).',\n inputSchema: z.object({ mockId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n return {\n ok: true as const,\n count: mock.endpoints.length,\n endpoints: mock.endpoints.map((e) => ({\n id: e.id,\n method: e.method,\n pathPattern: e.pathPattern,\n name: e.name,\n validationCount: e.requestValidation.length,\n responseRuleCount: e.responseRules.length,\n })),\n };\n },\n};\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nfunction buildDefaultEndpoint(args: {\n method: z.infer<typeof HTTP_METHOD>;\n pathPattern: string;\n name?: string;\n description?: string;\n response?: z.infer<typeof ENDPOINT_RESPONSE>;\n}): MockEndpoint {\n const response = args.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n return {\n id: generateId(),\n name: args.name ?? `${args.method} ${args.pathPattern}`,\n method: args.method,\n pathPattern: args.pathPattern,\n description: args.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: [],\n responseRules: [],\n defaultResponse: {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n },\n };\n}\n\nexport const mockAddEndpointTool: AnyToolDef = {\n name: 'mock.add_endpoint',\n description:\n 'Append a new endpoint to a mock server. Defaults to a 200 JSON response of `{}`. Returns the new endpoint id.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const endpoint = buildDefaultEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n // Manual-mode mocks mirror endpoints back into source so the runtime\n // sees the same array regardless of which field it reads.\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockUpdateEndpointTool: AnyToolDef = {\n name: 'mock.update_endpoint',\n description:\n 'Patch fields on a single mock endpoint (method, pathPattern, name, description, defaultResponse status / contentType / json body). Pass only the fields you want to change.',\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n method: HTTP_METHOD.optional(),\n pathPattern: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.partial().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const idx = mock.endpoints.findIndex((e) => e.id === input.endpointId);\n if (idx === -1) return { ok: false, error: 'endpoint not found' as const };\n const existing = mock.endpoints[idx];\n const nextEndpoint: MockEndpoint = {\n ...existing,\n method: input.method ?? existing.method,\n pathPattern: input.pathPattern ?? existing.pathPattern,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n defaultResponse: input.response\n ? {\n ...existing.defaultResponse,\n status: input.response.status ?? existing.defaultResponse.status,\n headers: input.response.contentType\n ? existing.defaultResponse.headers.map((h) =>\n h.key.toLowerCase() === 'content-type'\n ? { ...h, value: input.response!.contentType! }\n : h,\n )\n : existing.defaultResponse.headers,\n body:\n input.response.jsonBody !== undefined\n ? { type: 'json', content: input.response.jsonBody }\n : existing.defaultResponse.body,\n }\n : existing.defaultResponse,\n };\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = nextEndpoint;\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockDeleteEndpointTool: AnyToolDef = {\n name: 'mock.delete_endpoint',\n description: 'Remove an endpoint from a mock server.',\n inputSchema: z.object({ mockId: z.string(), endpointId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const nextEndpoints = mock.endpoints.filter((e) => e.id !== input.endpointId);\n if (nextEndpoints.length === mock.endpoints.length) {\n return { ok: false, error: 'endpoint not found' as const };\n }\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Endpoint rule + multiplier editing\n// -----------------------------------------------------------------------------\n// Validation rules, response rules, and multipliers are all replace-only —\n// MCP clients send the full ordered list, the tool writes it. Granular per-\n// rule mutations would multiply the surface area without adding capability;\n// the MCP client can read, mutate, write back.\n// =============================================================================\n\nconst VALIDATION_RULE = z.object({\n id: z.string().optional(),\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE = z.object({\n id: z.string().optional(),\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE = z.object({\n id: z.string().optional(),\n name: z.string(),\n enabled: z.boolean().default(true),\n // At least one clause — a rule with no `when` is dead (the runtime engine\n // skips clause-less rules), so it can never fire. The VS Code endpoint parser\n // rejects the same shape, keeping the surfaces consistent.\n when: z.array(CONDITION_CLAUSE).min(1),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nfunction defaultJsonResponseConfig(args: { status: number; jsonBody: string }): MockResponseConfig {\n return {\n status: args.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: args.jsonBody },\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport const mockSetValidationRulesTool: AnyToolDef = {\n name: 'mock.set_validation_rules',\n description:\n \"Replace an endpoint's validation rules. Rules without an `id` get a fresh one; existing rules can keep theirs to preserve client-side selection state. Empty array clears all rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: r.id ?? generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: defaultJsonResponseConfig(r.failResponse),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetResponseRulesTool: AnyToolDef = {\n name: 'mock.set_response_rules',\n description:\n \"Replace an endpoint's conditional response rules. Rules fire in order; the first whose every clause matches wins. Disabled rules are skipped. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: r.id ?? generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE>) => ({\n id: c.id ?? generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: defaultJsonResponseConfig(r.response),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PARAM = z.object({\n id: z.string().optional(),\n name: z.string(),\n typeHint: z.string().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n example: z.string().optional(),\n});\n\nconst REQUEST_SCHEMA_BODY = z\n .object({ description: z.string().optional(), example: z.string().optional() })\n .optional();\n\n/** Normalize a body-doc input — drop it entirely when both fields are blank so\n * the projection stays clean (mirrors the VS Code / web editors). */\nfunction normalizeSchemaBody(\n body: z.infer<typeof REQUEST_SCHEMA_BODY>,\n): { description?: string; example?: string } | undefined {\n if (!body || (!body.description && !body.example)) return undefined;\n return body;\n}\n\nexport const mockSetRequestSchemaTool: AnyToolDef = {\n name: 'mock.set_request_schema',\n description:\n \"Replace an endpoint's requestSchema — the declared path / query / header / cookie params plus an optional body-shape doc. Params without an `id` get a fresh one; omitted lists are cleared. Documentation-only (drives the editor UI + OpenAPI export); runtime gating lives in the validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n pathParams: z.array(PARAM).default([]),\n queryParams: z.array(PARAM).default([]),\n headers: z.array(PARAM).default([]),\n cookies: z.array(PARAM).default([]),\n body: REQUEST_SCHEMA_BODY,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const toParams = (list: Array<z.infer<typeof PARAM>>) =>\n list.map((p) => ({\n id: p.id ?? generateId(),\n name: p.name,\n typeHint: p.typeHint,\n required: p.required,\n description: p.description,\n example: p.example,\n }));\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestSchema: {\n pathParams: toParams(input.pathParams),\n queryParams: toParams(input.queryParams),\n headers: toParams(input.headers),\n cookies: toParams(input.cookies),\n body: normalizeSchemaBody(input.body),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetMultipliersTool: AnyToolDef = {\n name: 'mock.set_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Empty array clears all. The list is currently capped at MAX_RESPONSE_MULTIPLIERS (1) — passing more is rejected.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER>> = input.multipliers;\n if (multipliers.length > MAX_RESPONSE_MULTIPLIERS) {\n return { ok: false as const, error: 'too many multipliers' as const };\n }\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: m.id ?? generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport { buildReleaseEntry, sortVersionsDesc } from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Release-ledger tools. Definitions live in `synced.releases.self` (push to\n// git) — the versions that linked consumers pin to. Every write routes through\n// `ctx.workspace.apply` so the same `applyMutation` reducers the UI / CLI /\n// VS Code use stay the single source of truth.\n//\n// `release.publish` is the only async-shaped one: the SHA-256\n// `workspaceSnapshot` is computed by `buildReleaseEntry` against the current\n// synced doc, then the resulting entry is handed to the (pure, sync)\n// `release.publish` patch. Tagging the release on GitHub + managing\n// marketplace topics are deliberately NOT here — those are network operations\n// that belong to the desktop / VS Code Git surfaces.\n// =============================================================================\n\nexport const releaseListTool: AnyToolDef = {\n name: 'release.list',\n description:\n \"List this workspace's published releases (newest first) with their notes, snapshot fingerprint, and deprecated / withdrawn flags. Returns the current version too.\",\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const ledger = state.synced.releases.self;\n if (!ledger) {\n return { currentVersion: null, count: 0, versions: [] };\n }\n const order = sortVersionsDesc(ledger.versions.map((v) => v.version));\n const byVersion = new Map(ledger.versions.map((v) => [v.version, v]));\n const versions = order\n .map((v) => byVersion.get(v))\n .filter((v): v is NonNullable<typeof v> => v !== undefined)\n .map((v) => ({\n version: v.version,\n publishedAt: v.publishedAt,\n notes: v.notes,\n workspaceSnapshot: v.workspaceSnapshot,\n deprecated: v.deprecated,\n yanked: v.yanked,\n ...(v.sha ? { sha: v.sha } : {}),\n ...(v.tagName ? { tagName: v.tagName } : {}),\n }));\n return { currentVersion: ledger.currentVersion, count: versions.length, versions };\n },\n};\n\nexport const releasePublishTool: AnyToolDef = {\n name: 'release.publish',\n description:\n 'Publish a new release of this workspace. Appends a semver version + markdown notes to the ledger and bumps currentVersion. The release is fingerprinted with a SHA-256 of the workspace at publish time. Rejects invalid semver or a duplicate version. Does NOT create a Git tag or GitHub Release.',\n inputSchema: z.object({\n version: z.string().min(1).describe('Semantic version, e.g. \"1.2.0\".'),\n notes: z.string().default('').describe('Markdown release notes.'),\n sha: z.string().optional().describe('Optional source commit SHA for bookkeeping.'),\n tagName: z.string().optional().describe('Optional git tag name for bookkeeping.'),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n let entry;\n try {\n entry = await buildReleaseEntry(state.synced, {\n version: input.version,\n notes: input.notes,\n sha: input.sha,\n tagName: input.tagName,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.publish failed' };\n }\n try {\n const out = await ctx.workspace.apply({ kind: 'release.publish', entry });\n const after = (await ctx.workspace.read()).synced.releases.self;\n return {\n ok: true,\n version: entry.version,\n currentVersion: after?.currentVersion ?? entry.version,\n workspaceSnapshot: entry.workspaceSnapshot,\n changedIds: out.changedIds,\n };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.publish failed' };\n }\n },\n};\n\nexport const releaseDeprecateTool: AnyToolDef = {\n name: 'release.deprecate',\n description:\n 'Mark a published version as deprecated (soft signal). Consumers see a warning but the version stays installable. Errors if the version is unknown or no ledger exists.',\n inputSchema: z.object({ version: z.string().min(1) }),\n async handler(input, ctx) {\n try {\n const out = await ctx.workspace.apply({ kind: 'release.deprecate', version: input.version });\n return { ok: true, version: input.version, changedIds: out.changedIds };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.deprecate failed' };\n }\n },\n};\n\nexport const releaseYankTool: AnyToolDef = {\n name: 'release.yank',\n description:\n 'Withdraw (yank) a published version (hard signal). Consumers are warned the version is broken / unsafe and told to move to a different one. The entry stays in the ledger. Errors if the version is unknown or no ledger exists.',\n inputSchema: z.object({ version: z.string().min(1) }),\n async handler(input, ctx) {\n try {\n const out = await ctx.workspace.apply({ kind: 'release.yank', version: input.version });\n return { ok: true, version: input.version, changedIds: out.changedIds };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.yank failed' };\n }\n },\n};\n","import { z } from 'zod';\nimport type { LinkedWorkspace } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Linked-workspace tools — the PURE-DATA half of the link feature\n// (`synced.linkedWorkspaces`). Listing, reading, config edits (pin version,\n// scope, session mode, required keys, marketplace metadata, rename), and\n// unlinking all route through `applyMutation`.\n//\n// Linking a NEW workspace and refreshing the cached ledger / snapshot are\n// network operations (fetch the source repo's `.apicircle/` workspace files over\n// the GitHub API) — those are host-driven (the VS Code commands + desktop UI),\n// not MCP tools, because the MCP server is headless and has no GitHub session.\n// =============================================================================\n\nfunction summarize(link: LinkedWorkspace, currentVersion: string | null) {\n return {\n id: link.id,\n name: link.name,\n kind: link.kind,\n description: link.description,\n source: link.source,\n scope: link.scope,\n pinnedVersion: link.pinnedVersion,\n requiredSecretKeyIds: link.requiredSecretKeyIds,\n marketplace: link.marketplace,\n cachedCurrentVersion: currentVersion,\n };\n}\n\nexport const linkedListTool: AnyToolDef = {\n name: 'linked.list',\n description:\n 'List the workspaces this workspace links to (consumes). Each entry includes its source repo/branch, scope, pinned version, required secret-key ids, and the current version of its cached release ledger.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const links = Object.values(state.synced.linkedWorkspaces);\n return {\n count: links.length,\n links: links.map((l) =>\n summarize(l, state.synced.releases.perLink[l.id]?.currentVersion ?? null),\n ),\n };\n },\n};\n\nexport const linkedGetTool: AnyToolDef = {\n name: 'linked.get',\n description:\n 'Read one linked workspace by id, including its cached release ledger (the versions available to pin to).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n const ledger = state.synced.releases.perLink[input.id] ?? null;\n return {\n ok: true,\n link: summarize(link, ledger?.currentVersion ?? null),\n ledger,\n };\n },\n};\n\nexport const linkedSetConfigTool: AnyToolDef = {\n name: 'linked.set_config',\n description:\n \"Update an existing linked workspace's config: rename, pin/unpin a version (must exist in the cached ledger), set scope, session mode, required secret-key ids, or marketplace metadata. Only supplied fields change. Does NOT fetch from the network.\",\n inputSchema: z.object({\n id: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n pinnedVersion: z.string().nullable().optional().describe('null = unpin (track source HEAD).'),\n scope: z.array(z.enum(['collections', 'environments'])).optional(),\n sessionMode: z.enum(['workspace', 'dedicated']).optional(),\n requiredSecretKeyIds: z.array(z.string()).optional(),\n marketplace: z\n .object({\n listedAs: z.string(),\n tags: z.array(z.string()),\n summary: z.string(),\n })\n .nullable()\n .optional()\n .describe('null = clear marketplace metadata.'),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n\n if (input.pinnedVersion !== undefined && input.pinnedVersion !== null) {\n const cached = state.synced.releases.perLink[input.id]?.versions ?? [];\n if (!cached.some((v) => v.version === input.pinnedVersion)) {\n return {\n ok: false,\n error: `Version ${input.pinnedVersion} is not in the cached ledger — refresh the link first`,\n };\n }\n }\n\n const next: LinkedWorkspace = {\n ...link,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.pinnedVersion !== undefined ? { pinnedVersion: input.pinnedVersion } : {}),\n ...(input.scope !== undefined ? { scope: input.scope } : {}),\n ...(input.requiredSecretKeyIds !== undefined\n ? { requiredSecretKeyIds: input.requiredSecretKeyIds }\n : {}),\n ...(input.sessionMode !== undefined\n ? { source: { ...link.source, sessionMode: input.sessionMode } }\n : {}),\n };\n if (input.marketplace !== undefined) {\n if (input.marketplace === null) {\n delete next.marketplace;\n } else {\n next.marketplace = input.marketplace;\n }\n }\n\n const out = await ctx.workspace.apply({ kind: 'linkedWorkspace.upsert', link: next });\n return {\n ok: true,\n changedIds: out.changedIds,\n link: summarize(next, state.synced.releases.perLink[input.id]?.currentVersion ?? null),\n };\n },\n};\n\nexport const linkedUnlinkTool: AnyToolDef = {\n name: 'linked.unlink',\n description:\n 'Unlink a workspace by id. Removes the link, its cached release ledger, every local override for it, the cached collections/environments snapshot, and any per-link session entry. The source repo is untouched.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.linkedWorkspaces[input.id]) {\n return { ok: false, error: `Linked workspace ${input.id} not found` };\n }\n const out = await ctx.workspace.apply({ kind: 'linkedWorkspace.remove', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport {\n fetchRemoteWorkspaceJson,\n parseLinkedWorkspaceJson,\n buildLinkedSnapshot,\n ledgerFromProbe,\n} from '@apicircle/core';\nimport { generateId, type LinkedWorkspace } from '@apicircle/shared';\nimport { GitHubClient, GitHubError } from '@apicircle/git';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// GitHub network tools — the headless counterpart to the VS Code / Desktop\n// link + tag + topics surfaces. These reach the GitHub REST API via\n// `@apicircle/git` (bundled into the published mcp-server, never a runtime dep)\n// and need a token: the `token` arg, else the `GITHUB_TOKEN` env var. Pure\n// parse + snapshot come from `@apicircle/core`; the resulting writes route\n// through `applyMutation`.\n// =============================================================================\n\nfunction resolveToken(input: string | undefined): string {\n const t = (input ?? process.env.GITHUB_TOKEN ?? '').trim();\n return t;\n}\n\nconst TOKEN_HELP = 'Pass `token`, or set the GITHUB_TOKEN env var on the MCP process.';\n\nexport const linkedLinkTool: AnyToolDef = {\n name: 'linked.link',\n description:\n 'Link a workspace by fetching its `.apicircle/` workspace from GitHub (registry.json → workspace-<id>/workspace.json). Caches the release ledger + a collections/environments snapshot. Needs a token for private repos. ' +\n TOKEN_HELP,\n inputSchema: z.object({\n repoFullName: z.string().describe('owner/name of the source workspace repo.'),\n branch: z.string().default('main'),\n pinnedVersion: z\n .string()\n .nullable()\n .optional()\n .describe('null/omitted = source current version.'),\n kind: z.enum(['private', 'public']).default('private'),\n token: z.string().optional(),\n }),\n async handler(input, ctx) {\n const token = resolveToken(input.token);\n const repoFullName = input.repoFullName.trim();\n if (!repoFullName.includes('/')) return { ok: false, error: 'repoFullName must be owner/name' };\n if (input.kind === 'private' && !token)\n return { ok: false, error: `A token is required for private repos. ${TOKEN_HELP}` };\n const [owner, name] = repoFullName.split('/', 2);\n\n // Reject a duplicate before spending a network round-trip.\n const state = await ctx.workspace.read();\n const dup = Object.values(state.synced.linkedWorkspaces).find(\n (l) => l.source.repoFullName === repoFullName && l.source.branch === input.branch,\n );\n if (dup)\n return { ok: false, error: `Already linked to ${repoFullName}@${input.branch} (${dup.id})` };\n\n const client = new GitHubClient();\n let result: { workspaceId: string; content: string } | { error: string };\n try {\n result = await fetchRemoteWorkspaceJson(async (p) => {\n const f = await client.getContents(token, owner, name, p, input.branch);\n return f?.content ?? null;\n });\n } catch (e) {\n return {\n ok: false,\n error:\n e instanceof GitHubError ? e.message : e instanceof Error ? e.message : 'fetch failed',\n };\n }\n if ('error' in result)\n return { ok: false, error: `${repoFullName}@${input.branch}: ${result.error}` };\n\n const probe = parseLinkedWorkspaceJson(result.content);\n const ledger = ledgerFromProbe(probe);\n const link: LinkedWorkspace = {\n id: generateId(),\n kind: input.kind,\n name: repoFullName,\n sourceWorkspaceId: result.workspaceId,\n source: { provider: 'github', repoFullName, branch: input.branch, sessionMode: 'workspace' },\n scope: ['collections', 'environments'],\n pinnedVersion: input.pinnedVersion ?? ledger.currentVersion,\n updatePolicy: 'manual',\n linkedAt: new Date().toISOString(),\n requiredSecretKeyIds: probe.secretKeys ? Object.keys(probe.secretKeys) : [],\n };\n const snapshot = buildLinkedSnapshot(probe, link) ?? undefined;\n const out = await ctx.workspace.apply({\n kind: 'linkedWorkspace.upsert',\n link,\n ledger,\n ...(snapshot ? { snapshot } : {}),\n });\n return { ok: true, id: link.id, pinnedVersion: link.pinnedVersion, changedIds: out.changedIds };\n },\n};\n\nexport const linkedRefreshTool: AnyToolDef = {\n name: 'linked.refresh',\n description:\n \"Re-pull a linked workspace's cached release ledger (+ bootstrap snapshot if missing) from GitHub. \" +\n TOKEN_HELP,\n inputSchema: z.object({ id: z.string(), token: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n const token = resolveToken(input.token);\n if (link.kind === 'private' && !token)\n return { ok: false, error: `A token is required for private links. ${TOKEN_HELP}` };\n const [owner, name] = link.source.repoFullName.split('/', 2);\n const client = new GitHubClient();\n let result: { workspaceId: string; content: string } | { error: string };\n try {\n result = await fetchRemoteWorkspaceJson(async (p) => {\n const f = await client.getContents(token, owner, name, p, link.source.branch);\n return f?.content ?? null;\n });\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'fetch failed' };\n }\n if ('error' in result)\n return {\n ok: false,\n error: `${link.source.repoFullName}@${link.source.branch}: ${result.error}`,\n };\n const probe = parseLinkedWorkspaceJson(result.content);\n const ledger = ledgerFromProbe(probe);\n const needsSnapshot = !state.local.linkedCollections[input.id];\n const snapshot = needsSnapshot ? (buildLinkedSnapshot(probe, link) ?? undefined) : undefined;\n await ctx.workspace.apply({\n kind: 'linkedWorkspace.upsert',\n link,\n ledger,\n ...(snapshot ? { snapshot } : {}),\n });\n return {\n ok: true,\n currentVersion: ledger.currentVersion,\n versionCount: ledger.versions.length,\n };\n },\n};\n\nexport const releaseTagTool: AnyToolDef = {\n name: 'release.tag',\n description:\n \"Create a `v<version>` Git tag (optionally a GitHub Release) on the workspace's own repo. The version should already exist in the release ledger. \" +\n TOKEN_HELP,\n inputSchema: z.object({\n owner: z.string(),\n name: z.string(),\n version: z.string(),\n createGitHubRelease: z.boolean().default(false),\n notes: z.string().optional(),\n overrideExisting: z.boolean().default(false),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token);\n if (!token) return { ok: false, error: `A token is required to tag. ${TOKEN_HELP}` };\n const client = new GitHubClient();\n const tagName = `v${input.version.replace(/^v/, '')}`;\n try {\n const repo = await client.getRepo(token, input.owner, input.name);\n const ref = await client.getRef(token, input.owner, input.name, repo.defaultBranch);\n const existing = await client.getTagSha(token, input.owner, input.name, tagName);\n if (existing !== null) {\n if (!input.overrideExisting) {\n return {\n ok: false,\n error: `Tag ${tagName} already exists at ${existing.slice(0, 7)}. Pass overrideExisting:true to replace.`,\n };\n }\n await client.deleteRef(token, input.owner, input.name, `tags/${tagName}`);\n }\n await client.createTag(token, input.owner, input.name, { tagName, sha: ref.sha });\n let releaseUrl: string | undefined;\n if (input.createGitHubRelease) {\n const release = await client.createRelease(token, input.owner, input.name, {\n tagName,\n releaseName: tagName,\n body: input.notes ?? '',\n });\n releaseUrl = release.htmlUrl;\n }\n return {\n ok: true,\n tagName,\n sha: ref.sha,\n branch: repo.defaultBranch,\n ...(releaseUrl ? { releaseUrl } : {}),\n };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'tag failed' };\n }\n },\n};\n\nexport const marketplaceSearchTool: AnyToolDef = {\n name: 'marketplace.search',\n description:\n 'Search the API Circle marketplace for public workspaces tagged with `apicircle` on GitHub. ' +\n 'Returns up to 30 results sorted by relevance (default), stars, or recent updates. ' +\n 'Token is optional — anonymous browsing is supported (lower rate limits); pass a token to lift them. ' +\n TOKEN_HELP,\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe('Search query — matches repo name, description, and topics. Empty = browse all.'),\n sort: z\n .enum(['best-match', 'stars', 'updated'])\n .default('best-match')\n .describe(\n 'Sort order: best-match (default relevance), stars (most starred first), updated (recently pushed first).',\n ),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token) || null;\n const client = new GitHubClient();\n try {\n const repos = await client.searchMarketplaceRepos(token, input.query, {\n sort: input.sort === 'best-match' ? undefined : input.sort,\n });\n return { ok: true, count: repos.length, results: repos };\n } catch (e) {\n return {\n ok: false,\n error:\n e instanceof GitHubError ? e.message : e instanceof Error ? e.message : 'search failed',\n };\n }\n },\n};\n\nconst TOPIC_RE = /^[a-z0-9][a-z0-9-]*$/;\n\nexport const repoSetTopicsTool: AnyToolDef = {\n name: 'repo.set_topics',\n description:\n \"Replace a repo's topics (the `apicircle` topic is always kept — it drives marketplace discovery). Topics must be lowercase, start with a letter/digit, ≤50 chars, ≤20 total. \" +\n TOKEN_HELP,\n inputSchema: z.object({\n owner: z.string(),\n name: z.string(),\n topics: z.array(z.string()),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token);\n if (!token) return { ok: false, error: `A token is required to set topics. ${TOKEN_HELP}` };\n const requested: string[] = input.topics;\n const normalized = Array.from(\n new Set(['apicircle', ...requested.map((t) => t.trim().toLowerCase()).filter(Boolean)]),\n );\n for (const t of normalized) {\n if (!TOPIC_RE.test(t))\n return {\n ok: false,\n error: `Invalid topic \"${t}\" — lowercase letters/digits/\"-\", starting with a letter or digit.`,\n };\n if (t.length > 50) return { ok: false, error: `Topic \"${t}\" exceeds 50 characters.` };\n }\n if (normalized.length > 20) return { ok: false, error: 'GitHub allows at most 20 topics.' };\n const client = new GitHubClient();\n try {\n const saved = await client.setRepoTopics(token, input.owner, input.name, normalized);\n return { ok: true, topics: saved };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'set topics failed' };\n }\n },\n};\n","// Typed errors for the GitHub REST client. Catching these in the UI lets us\n// drive the right recovery path: scope-missing → \"Update token now?\" modal,\n// rate-limited → \"wait N seconds\" copy, network → \"check your connection,\"\n// unknown 5xx → generic.\n\nexport class GitHubError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = 'GitHubError';\n }\n}\n\nexport class MissingScopeError extends GitHubError {\n /** Scope strings the API said are missing, e.g. ['pull_request']. */\n readonly missingScopes: string[];\n /** Scope strings the token currently grants, parsed from x-oauth-scopes. */\n readonly grantedScopes: string[];\n\n constructor(message: string, status: number, missingScopes: string[], grantedScopes: string[]) {\n super(message, status);\n this.name = 'MissingScopeError';\n this.missingScopes = missingScopes;\n this.grantedScopes = grantedScopes;\n }\n}\n\nexport class RateLimitedError extends GitHubError {\n /** Unix timestamp (ms) when the rate-limit window resets. */\n readonly resetAtMs: number;\n constructor(message: string, status: number, resetAtMs: number) {\n super(message, status);\n this.name = 'RateLimitedError';\n this.resetAtMs = resetAtMs;\n }\n}\n\nexport class UnauthorizedError extends GitHubError {\n constructor(message: string, status: number) {\n super(message, status);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * The fetch was aborted by our own timeout (default 15 s). Surfaced with\n * status 0 because there was no HTTP response. Distinct from a generic\n * `GitHubError(0)` so the UI can render retry-able copy and warn the user\n * that a write may have partially landed on the server.\n */\nexport class TimeoutError extends GitHubError {\n /** Timeout that fired, in ms. Useful for the UI message. */\n readonly timeoutMs: number;\n constructor(message: string, timeoutMs: number) {\n super(message, 0);\n this.name = 'TimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Remote ref moved since we last synced — e.g. someone force-pushed the\n * branch. Thrown by `pushWorkspace` *before* uploading blobs, so the user\n * is steered to refresh first rather than discovering the divergence\n * inside a failed `updateRef`.\n */\nexport class BranchDivergedError extends GitHubError {\n readonly expectedSha: string;\n readonly actualSha: string;\n constructor(message: string, expectedSha: string, actualSha: string) {\n super(message, 0);\n this.name = 'BranchDivergedError';\n this.expectedSha = expectedSha;\n this.actualSha = actualSha;\n }\n}\n","// Tiny GitHub REST client. We avoid pulling in @octokit/* because we only\n// need a handful of endpoints and the typed errors are more important than\n// the breadth of coverage.\n//\n// Token-handling rule: the caller passes the PAT per call. The client never\n// logs it, never stores it, never includes it in error messages. The host\n// (ui-components) is responsible for token storage (Secret Vault).\n\nimport {\n GitHubError,\n MissingScopeError,\n RateLimitedError,\n TimeoutError,\n UnauthorizedError,\n} from './errors';\n\nconst API_BASE = 'https://api.github.com';\nconst LOGIN_BASE = 'https://github.com';\n\nexport interface GitHubViewer {\n login: string;\n id: number;\n name: string | null;\n avatarUrl: string | null;\n}\n\nexport interface ScopeInfo {\n granted: string[];\n acceptedRequired?: string[];\n}\n\nexport interface GitHubRepo {\n /** owner/name, the canonical workspace identifier on GitHub. */\n fullName: string;\n owner: string;\n name: string;\n defaultBranch: string;\n visibility: 'public' | 'private' | 'internal';\n isPrivate: boolean;\n pushable: boolean;\n}\n\nexport interface GitHubBranch {\n name: string;\n commitSha: string;\n}\n\nexport interface GitHubClientOptions {\n /** Override the API base URL (e.g. GitHub Enterprise). */\n baseUrl?: string;\n /**\n * Override the base for `github.com/login/*` OAuth endpoints. Defaults to\n * `https://github.com`. The browser path sets this to a same-origin\n * proxy (e.g. `/_gh-oauth`) because GitHub doesn't send CORS headers on\n * the device-flow endpoints.\n */\n loginBaseUrl?: string;\n /** Inject a custom fetch — used by tests to mock without msw. */\n fetchImpl?: typeof fetch;\n /** Hard timeout per call. Defaults to 15s. */\n timeoutMs?: number;\n}\n\nexport interface GitRef {\n ref: string; // e.g. \"refs/heads/apicircle/payments-a3f9c2\"\n sha: string;\n}\n\nexport interface GitCommitSummary {\n sha: string;\n treeSha: string;\n message: string;\n}\n\nexport interface TreeEntryInput {\n path: string;\n mode?: '100644' | '100755' | '040000' | '160000' | '120000';\n type?: 'blob' | 'tree' | 'commit';\n /** Inline content — used for text files we don't need to base64. */\n content?: string;\n /** Pre-uploaded blob sha — used for binary attachments. */\n sha?: string | null;\n}\n\nexport interface CreatedTree {\n sha: string;\n}\n\nexport interface CreatedCommit {\n sha: string;\n treeSha: string;\n}\n\nexport interface CreatedBlob {\n sha: string;\n size: number;\n}\n\nexport interface PullRequestSummary {\n number: number;\n /** GitHub UI URL (e.g. https://github.com/me/api/pull/12) — what we link to. */\n htmlUrl: string;\n state: 'open' | 'closed';\n title: string;\n}\n\nexport interface MarketplaceRepo {\n fullName: string;\n owner: string;\n name: string;\n description: string;\n topics: string[];\n stargazers: number;\n defaultBranch: string;\n}\n\nexport interface FileContents {\n /** Raw file bytes decoded from GitHub's base64 transport. */\n content: string;\n /** Git blob SHA — used for fast equality checks across pulls. */\n sha: string;\n /** Path returned by GitHub (matches what we requested). */\n path: string;\n size: number;\n}\n\nexport interface BinaryFileContents {\n /** Raw file bytes — used for binary attachments where UTF-8 decoding would corrupt the data. */\n bytes: Uint8Array;\n sha: string;\n path: string;\n size: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\n\ninterface CallOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n body?: unknown;\n signal?: AbortSignal;\n /** Scopes the caller wants verified — surfaced into MissingScopeError. */\n requiredScopes?: string[];\n}\n\nexport class GitHubClient {\n private readonly baseUrl: string;\n private readonly loginBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: GitHubClientOptions = {}) {\n this.baseUrl = opts.baseUrl ?? API_BASE;\n this.loginBaseUrl = (opts.loginBaseUrl ?? LOGIN_BASE).replace(/\\/$/, '');\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /**\n * Fetch the authenticated user. Doubles as a \"verify token\" probe — used\n * by the Secret Vault Sessions tab to refresh the granted-scopes list.\n */\n async getViewer(\n token: string,\n opts: CallOptions = {},\n ): Promise<{\n viewer: GitHubViewer;\n scopes: ScopeInfo;\n }> {\n const { json, response } = await this.call<RawUser>(token, '/user', opts);\n return {\n viewer: {\n login: json.login,\n id: json.id,\n name: json.name ?? null,\n avatarUrl: json.avatar_url ?? null,\n },\n scopes: parseScopes(response.headers),\n };\n }\n\n /**\n * List repositories the authenticated user can access. Used by the repo\n * picker. Capped at 100 sorted by recent push; users with thousands of\n * repos can paginate later.\n */\n async listAccessibleRepos(token: string, opts: CallOptions = {}): Promise<GitHubRepo[]> {\n const { json } = await this.call<RawRepo[]>(\n token,\n '/user/repos?per_page=100&sort=pushed&affiliation=owner,collaborator,organization_member',\n opts,\n );\n return json.map(normalizeRepo);\n }\n\n /**\n * Fetch a specific repo. Validates the user-supplied owner/name pair\n * exists + is accessible, and exposes the default branch.\n */\n async getRepo(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<GitHubRepo> {\n const { json } = await this.call<RawRepo>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}`,\n opts,\n );\n return normalizeRepo(json);\n }\n\n /**\n * Read the head SHA of a branch. Used to seed a new working branch from\n * main before any edits land.\n */\n async getBranchHead(\n token: string,\n owner: string,\n name: string,\n branch: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch> {\n const { json } = await this.call<RawBranch>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/branches/${encodeURIComponent(branch)}`,\n opts,\n );\n return { name: json.name, commitSha: json.commit.sha };\n }\n\n /**\n * List branches on a repo. Used by the Link Workspace repo-browser to\n * populate the branch dropdown after the user picks a repo. Capped at\n * 100 (GitHub's max page size); repos with more branches paginate.\n */\n async listBranches(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch[]> {\n const { json } = await this.call<RawBranch[]>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/branches?per_page=100`,\n opts,\n );\n return json.map((b) => ({ name: b.name, commitSha: b.commit.sha }));\n }\n\n /**\n * Create a new branch ref pointing at `sha`. The auto-branch flow calls\n * this with the head SHA from `getBranchHead(main)`.\n *\n * GitHub returns 422 with \"Reference already exists\" when the branch\n * already exists; that surfaces as a GitHubError(422) so the UI can\n * prompt for a different name.\n */\n async createBranch(\n token: string,\n owner: string,\n name: string,\n branchName: string,\n sha: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs`,\n {\n ...opts,\n method: 'POST',\n body: { ref: `refs/heads/${branchName}`, sha },\n requiredScopes: ['repo'],\n },\n );\n return { name: branchName, commitSha: json.object.sha };\n }\n\n /**\n * Read a branch ref's current commit SHA. Used at the start of push-to-\n * save to find the parent commit before building the new tree.\n */\n async getRef(\n token: string,\n owner: string,\n name: string,\n branch: string,\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/heads/${encodeURIComponent(branch)}`,\n opts,\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Read a commit's tree SHA. Used so the new tree can be built `base_tree`\n * — every path we don't override is inherited from the parent.\n */\n async getCommit(\n token: string,\n owner: string,\n name: string,\n sha: string,\n opts: CallOptions = {},\n ): Promise<GitCommitSummary> {\n const { json } = await this.call<RawCommit>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/commits/${encodeURIComponent(sha)}`,\n opts,\n );\n return {\n sha: json.sha,\n treeSha: json.tree.sha,\n message: json.message,\n };\n }\n\n /**\n * Upload a blob to the repo and return its SHA. Used by push-to-save\n * (P4.3b) for binary attachments — text files go straight into a tree\n * entry's `content`, but binary bytes have to go through a blob first.\n *\n * `content` is base64 when `encoding === 'base64'`. GitHub stores blobs\n * deduplicated by their git-sha1 (not our sha256), so re-uploading the\n * same bytes is cheap on their side; we save a roundtrip locally by\n * tracking lastPushedBlobSha per slot in a future revision.\n */\n async createBlob(\n token: string,\n owner: string,\n name: string,\n args: { content: string; encoding: 'utf-8' | 'base64' },\n opts: CallOptions = {},\n ): Promise<CreatedBlob> {\n const { json } = await this.call<{ sha: string; size?: number }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/blobs`,\n {\n ...opts,\n method: 'POST',\n body: { content: args.content, encoding: args.encoding },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha, size: json.size ?? 0 };\n }\n\n /**\n * Build a new tree from `entries`, layered over `baseTreeSha`. Entries\n * with `content` are inlined (text path); entries with a pre-uploaded\n * `sha` reference an existing blob (binary path — used by attachments).\n */\n async createTree(\n token: string,\n owner: string,\n name: string,\n args: { baseTreeSha: string; entries: TreeEntryInput[] },\n opts: CallOptions = {},\n ): Promise<CreatedTree> {\n const tree = args.entries.map((e) => ({\n path: e.path,\n mode: e.mode ?? '100644',\n type: e.type ?? 'blob',\n ...(e.content !== undefined ? { content: e.content } : {}),\n ...(e.sha !== undefined ? { sha: e.sha } : {}),\n }));\n const { json } = await this.call<{ sha: string }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/trees`,\n {\n ...opts,\n method: 'POST',\n body: { base_tree: args.baseTreeSha, tree },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha };\n }\n\n /**\n * Create a new commit object pointing at the given tree, with the given\n * parents. Returns the new commit's SHA + the tree it points at.\n */\n async createCommit(\n token: string,\n owner: string,\n name: string,\n args: { message: string; treeSha: string; parents: string[] },\n opts: CallOptions = {},\n ): Promise<CreatedCommit> {\n const { json } = await this.call<RawCommit>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/commits`,\n {\n ...opts,\n method: 'POST',\n body: {\n message: args.message,\n tree: args.treeSha,\n parents: args.parents,\n },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha, treeSha: json.tree.sha };\n }\n\n /**\n * Fast-forward a branch ref to a new commit SHA. Pass `force: true` to\n * skip the FF check (we don't — push-to-save is always FF over the ref\n * we just read with getRef()).\n */\n async updateRef(\n token: string,\n owner: string,\n name: string,\n args: { branch: string; sha: string; force?: boolean },\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/heads/${encodeURIComponent(args.branch)}`,\n {\n ...opts,\n method: 'PATCH',\n body: { sha: args.sha, force: args.force ?? false },\n requiredScopes: ['repo'],\n },\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Search GitHub for public API Circle workspaces. Appends\n * `topic:apicircle` to the user-supplied query so only repos carrying\n * the `apicircle` topic — the topic the Releases & Topics dialog\n * locks onto every workspace repo — surface in results. GitHub\n * matches the bare query against repository name, description, and\n * topics, so category words like `payments` narrow the marketplace by\n * topic. An empty query lists every public API Circle workspace. Top\n * 30 results. Token is optional — anonymous browsing is supported\n * (lower GitHub rate limits apply); pass a PAT when one is available\n * to lift them. `sort` controls ordering: omit for GitHub's\n * best-match relevance, or pass `'stars'` / `'updated'`.\n */\n async searchMarketplaceRepos(\n token: string | null,\n query: string,\n opts: CallOptions & { sort?: 'stars' | 'updated' } = {},\n ): Promise<MarketplaceRepo[]> {\n const { sort, ...callOpts } = opts;\n const fullQuery = `${query.trim()} topic:apicircle`.trim();\n const sortParam = sort ? `&sort=${sort}&order=desc` : '';\n const path = `/search/repositories?q=${encodeURIComponent(fullQuery)}&per_page=30${sortParam}`;\n const { json } = await this.call<{ items?: RawSearchRepo[] }>(token, path, callOpts);\n const items = json.items ?? [];\n return items.map(normalizeMarketplaceRepo);\n }\n\n /**\n * Start GitHub's OAuth Device Flow. Returns a user-facing code the\n * user types into github.com/login/device + a device_code the app\n * polls with. Pure browser-safe: no client_secret involved (device\n * flow is the only OAuth path GitHub supports for public clients).\n *\n * Requires the OAuth App to have \"Enable Device Flow\" turned on in\n * its GitHub settings — surface 400 with `not_supported` to the user\n * if the App owner hasn't done that yet.\n */\n async startDeviceFlow(\n clientId: string,\n scope: string,\n opts: CallOptions = {},\n ): Promise<{\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n }> {\n const url = `${this.loginBaseUrl}/login/device/code`;\n const response = await this.fetchImpl(url, {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify({ client_id: clientId, scope }),\n signal: opts.signal,\n });\n if (!response.ok) {\n throw new GitHubError(\n `Device-flow start failed: HTTP ${response.status}`,\n response.status,\n {},\n );\n }\n const json = (await response.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n error?: string;\n error_description?: string;\n };\n if (json.error) {\n throw new GitHubError(json.error_description ?? json.error, 400, json);\n }\n return {\n deviceCode: json.device_code,\n userCode: json.user_code,\n verificationUri: json.verification_uri,\n expiresIn: json.expires_in,\n interval: json.interval,\n };\n }\n\n /**\n * Poll for the access token after the user has authorized the device\n * code. GitHub returns `authorization_pending` until the user\n * completes the flow, `slow_down` if we polled too fast, then a real\n * token. Caller wraps this in a polling loop bounded by `expiresIn`.\n */\n async pollDeviceToken(\n clientId: string,\n deviceCode: string,\n opts: CallOptions = {},\n ): Promise<\n | { kind: 'pending'; slowDown: boolean }\n | { kind: 'denied'; reason: string }\n | { kind: 'expired' }\n | { kind: 'granted'; accessToken: string; tokenType: string; scope: string }\n > {\n const url = `${this.loginBaseUrl}/login/oauth/access_token`;\n const response = await this.fetchImpl(url, {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n signal: opts.signal,\n });\n const json = (await response.json()) as {\n access_token?: string;\n token_type?: string;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (json.access_token) {\n return {\n kind: 'granted',\n accessToken: json.access_token,\n tokenType: json.token_type ?? 'bearer',\n scope: json.scope ?? '',\n };\n }\n if (json.error === 'authorization_pending') return { kind: 'pending', slowDown: false };\n if (json.error === 'slow_down') return { kind: 'pending', slowDown: true };\n if (json.error === 'expired_token') return { kind: 'expired' };\n if (json.error === 'access_denied')\n return { kind: 'denied', reason: json.error_description ?? 'User denied authorization' };\n // Any other error: throw so the UI surfaces it.\n throw new GitHubError(\n json.error_description ?? json.error ?? 'Device-token poll failed',\n response.status,\n json,\n );\n }\n\n /**\n * Create a lightweight Git tag (a ref under `refs/tags/<name>`) on the\n * given commit SHA. Used by the publish-release flow when the user\n * opts in to \"Create Git tag v<x.y.z>\". Returns the resolved ref.\n *\n * GitHub returns 422 with \"Reference already exists\" when the tag is\n * a duplicate; that surfaces as a GitHubError(422) so the UI can warn\n * the user without ever overwriting an existing tag.\n */\n async createTag(\n token: string,\n owner: string,\n name: string,\n args: { tagName: string; sha: string },\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs`,\n {\n ...opts,\n method: 'POST',\n body: { ref: `refs/tags/${args.tagName}`, sha: args.sha },\n requiredScopes: ['repo'],\n },\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Compare two commits. Returns the relationship classification GitHub\n * gives us: `ahead` (head is descendant of base), `behind` (base is\n * descendant of head), `identical`, or `diverged` (the two histories\n * share a base but neither contains the other — typical of a force-push\n * that rewrote history under us).\n *\n * Used by the refresh path so we never silently 3-way-merge across a\n * history rewrite — divergence steers the user through an explicit\n * \"history rewritten\" modal instead of corrupting local state.\n */\n async compareCommits(\n token: string,\n owner: string,\n name: string,\n base: string,\n head: string,\n opts: CallOptions = {},\n ): Promise<{\n status: 'ahead' | 'behind' | 'identical' | 'diverged';\n aheadBy: number;\n behindBy: number;\n }> {\n const { json } = await this.call<{\n status: 'ahead' | 'behind' | 'identical' | 'diverged';\n ahead_by: number;\n behind_by: number;\n }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/compare/${encodeURIComponent(\n base,\n )}...${encodeURIComponent(head)}`,\n { ...opts, requiredScopes: ['repo'] },\n );\n return {\n status: json.status,\n aheadBy: json.ahead_by,\n behindBy: json.behind_by,\n };\n }\n\n /**\n * Is `ancestor` reachable from `descendant`? Thin wrapper around\n * `compareCommits` — \"ahead\" or \"identical\" means yes; \"behind\" or\n * \"diverged\" means the histories don't fit, so the answer is no.\n */\n async isAncestor(\n token: string,\n owner: string,\n name: string,\n ancestor: string,\n descendant: string,\n opts: CallOptions = {},\n ): Promise<boolean> {\n if (ancestor === descendant) return true;\n const cmp = await this.compareCommits(token, owner, name, ancestor, descendant, opts);\n return cmp.status === 'ahead' || cmp.status === 'identical';\n }\n\n /**\n * Create a GitHub Release pointing at an existing tag. Used by the\n * publish-release flow when the user opts in to \"Create GitHub\n * Release\". Returns the release's HTML URL so the UI can show a\n * \"Released — view on GitHub\" link.\n *\n * Pass `prerelease: true` for semver pre-release identifiers (e.g.\n * `1.0.0-rc.1`); GitHub's Releases UI flags those distinctly.\n */\n async createRelease(\n token: string,\n owner: string,\n name: string,\n args: {\n tagName: string;\n releaseName?: string;\n body?: string;\n draft?: boolean;\n prerelease?: boolean;\n },\n opts: CallOptions = {},\n ): Promise<{ id: number; htmlUrl: string; tagName: string }> {\n const { json } = await this.call<{\n id: number;\n html_url: string;\n tag_name: string;\n }>(token, `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/releases`, {\n ...opts,\n method: 'POST',\n body: {\n tag_name: args.tagName,\n name: args.releaseName ?? args.tagName,\n body: args.body ?? '',\n draft: args.draft ?? false,\n prerelease: args.prerelease ?? false,\n },\n requiredScopes: ['repo'],\n });\n return { id: json.id, htmlUrl: json.html_url, tagName: json.tag_name };\n }\n\n /**\n * Read a tag ref's current commit SHA. Used by the Release & topics\n * modal to detect whether a tag with the chosen name already exists\n * (so the UI can surface an \"Override existing tag\" toggle instead of\n * silently 422'ing through createTag).\n *\n * Returns `null` when the tag doesn't exist (404). Other failures\n * surface as typed errors.\n */\n async getTagSha(\n token: string,\n owner: string,\n name: string,\n tagName: string,\n opts: CallOptions = {},\n ): Promise<string | null> {\n try {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/tags/${encodeURIComponent(tagName)}`,\n opts,\n );\n return json.object.sha;\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Delete a ref. Used to support the \"Override existing tag\" path on\n * the Release & topics modal — we delete the existing tag ref, then\n * createTag against the new SHA. (GitHub doesn't have a single\n * \"force-update tag\" endpoint via the simple refs API.)\n *\n * `ref` is the bare suffix, e.g. `tags/v1.0.0` or `heads/feature-x`.\n */\n async deleteRef(\n token: string,\n owner: string,\n name: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<void> {\n await this.call<unknown>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/${ref\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`,\n {\n ...opts,\n method: 'DELETE',\n requiredScopes: ['repo'],\n },\n );\n }\n\n /**\n * Read the repo's current topic list. Topics drive marketplace\n * discoverability — public API Circle workspaces include `apicircle`\n * plus user-chosen category topics.\n *\n * Note: GitHub's topics API uses a custom Accept header, but we treat\n * that as transport detail; the `application/vnd.github.mercy-preview+json`\n * preview is now stable so the default Accept works.\n */\n async listRepoTopics(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<string[]> {\n const { json } = await this.call<{ names: string[] }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/topics`,\n opts,\n );\n return Array.isArray(json.names) ? json.names : [];\n }\n\n /**\n * Replace the repo's full topic list. GitHub's `PUT /topics` endpoint\n * is a full replace (not a merge), so the caller must pass the\n * complete desired list. Caps at 20 topics; each must match\n * `^[a-z0-9][a-z0-9-]*$` and be ≤ 50 chars (GitHub enforces this with\n * a 422). Returns the persisted list.\n */\n async setRepoTopics(\n token: string,\n owner: string,\n name: string,\n topics: string[],\n opts: CallOptions = {},\n ): Promise<string[]> {\n const { json } = await this.call<{ names: string[] }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/topics`,\n {\n ...opts,\n method: 'PUT',\n body: { names: topics },\n requiredScopes: ['repo'],\n },\n );\n return Array.isArray(json.names) ? json.names : [];\n }\n\n /**\n * Fetch a single file's contents from a branch / commit. Returns\n * `null` when GitHub answers 404 (file simply doesn't exist on that\n * ref — the common case for the very first pull). Other failures\n * surface as the usual typed errors.\n *\n * Used by the refresh flow to read remote `workspace.json` so the\n * 3-way diff can compare it against the local doc.\n */\n async getContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<FileContents | null> {\n const query = `?ref=${encodeURIComponent(ref)}`;\n try {\n const { json } = await this.call<RawFileContents>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}${query}`,\n opts,\n );\n // GitHub may return an array for directories — we only care about files.\n if (Array.isArray(json) || json.type !== 'file') {\n throw new GitHubError(`Path ${path} is not a file`, 422, json);\n }\n // GitHub wraps base64 in lines of 60 chars + \\n; strip them before decoding.\n const cleaned = json.content.replace(/\\n/g, '');\n const decoded = decodeBase64Utf8(cleaned);\n return { content: decoded, sha: json.sha, path: json.path, size: json.size };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Create or update a file via the Contents API. The killer feature here\n * vs. the git-data flow (createBlob → createTree → createCommit →\n * updateRef) is that this works on **truly empty repos**: GitHub's git\n * database isn't initialized until the first commit lands, so all the\n * `/git/*` endpoints reject with 409 \"Git Repository is empty\" — but\n * `PUT /contents/{path}` atomically initializes the database with a\n * single-file commit on the supplied branch (defaulting to the repo's\n * default branch).\n *\n * Used by the seed-initial-commit flow to bootstrap a freshly-created\n * empty repo with a scaffold `workspace.json`.\n *\n * `contentBase64` must already be base64-encoded — caller chooses the\n * encoder (TextEncoder for UTF-8 strings, raw bytes for binaries).\n */\n async putContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n args: { message: string; contentBase64: string; branch?: string; sha?: string },\n opts: CallOptions = {},\n ): Promise<{ commitSha: string; contentSha: string }> {\n const body: Record<string, unknown> = {\n message: args.message,\n content: args.contentBase64,\n };\n if (args.branch) body.branch = args.branch;\n if (args.sha) body.sha = args.sha;\n const { json } = await this.call<{\n commit: { sha: string };\n content: { sha: string };\n }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`,\n {\n ...opts,\n method: 'PUT',\n body,\n requiredScopes: ['repo'],\n },\n );\n return { commitSha: json.commit.sha, contentSha: json.content.sha };\n }\n\n /**\n * Same as `getContents` but returns the raw bytes instead of UTF-8\n * decoding the file. Used by the refresh flow to pull\n * `.apicircle/workspace-<id>/attachments/<slotId>` blobs into local IDB without\n * mangling binary data through TextDecoder.\n */\n async getBinaryContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<BinaryFileContents | null> {\n const query = `?ref=${encodeURIComponent(ref)}`;\n try {\n const { json } = await this.call<RawFileContents>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}${query}`,\n opts,\n );\n if (Array.isArray(json) || json.type !== 'file') {\n throw new GitHubError(`Path ${path} is not a file`, 422, json);\n }\n const cleaned = json.content.replace(/\\n/g, '');\n const bytes = decodeBase64Bytes(cleaned);\n return { bytes, sha: json.sha, path: json.path, size: json.size };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Open a pull request from `head` (the working branch) into `base` (the\n * repo's default branch). PR creation needs the `pull_request` scope on\n * top of `repo`; missing-scope errors flow through MissingScopeError so\n * the UI can prompt the user to update the token without losing branch\n * state (Plan §3.7).\n *\n * GitHub returns 422 when:\n * - head/base are equal (nothing to merge)\n * - a PR already exists between this head and base\n * - the head branch doesn't exist\n * All three surface as a plain GitHubError(422); the UI message is\n * picked up from response.body.message.\n */\n /**\n * Fetch a single pull request by number. Used by the refresh flow to\n * detect whether a previously-opened PR has been merged on GitHub —\n * `merged: true` is what triggers the working-branch retirement path.\n *\n * Returns `null` on 404 (PR was deleted or never existed at this number);\n * other failures surface as the usual typed errors.\n */\n async getPullRequest(\n token: string,\n owner: string,\n name: string,\n number: number,\n opts: CallOptions = {},\n ): Promise<{\n number: number;\n htmlUrl: string;\n state: 'open' | 'closed';\n merged: boolean;\n } | null> {\n try {\n const { json } = await this.call<RawPullRequest & { merged?: boolean }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls/${number}`,\n opts,\n );\n return {\n number: json.number,\n htmlUrl: json.html_url,\n state: json.state,\n merged: json.merged === true,\n };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * List pull requests on a repo. The capability-probe path uses this with\n * `perPage: 1` to determine whether the token can read PRs (and, by\n * extension on classic PATs, whether it can also create them).\n *\n * Caller declares `requiredScopes` to surface a `MissingScopeError` on\n * 403, so the capability probe can recognise the missing-scope case\n * cleanly vs. transient 5xx/network failures.\n */\n async listPullRequests(\n token: string,\n owner: string,\n name: string,\n args: { perPage?: number; state?: 'open' | 'closed' | 'all' } = {},\n opts: CallOptions = {},\n ): Promise<PullRequestSummary[]> {\n const params = new URLSearchParams();\n params.set('per_page', String(args.perPage ?? 30));\n if (args.state) params.set('state', args.state);\n const { json } = await this.call<RawPullRequest[]>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls?${params.toString()}`,\n {\n ...opts,\n requiredScopes: ['repo', 'pull_request'],\n },\n );\n return json.map((pr) => ({\n number: pr.number,\n htmlUrl: pr.html_url,\n state: pr.state,\n title: pr.title,\n }));\n }\n\n async createPullRequest(\n token: string,\n owner: string,\n name: string,\n args: { title: string; body: string; head: string; base: string; draft?: boolean },\n opts: CallOptions = {},\n ): Promise<PullRequestSummary> {\n const { json } = await this.call<RawPullRequest>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls`,\n {\n ...opts,\n method: 'POST',\n body: {\n title: args.title,\n body: args.body,\n head: args.head,\n base: args.base,\n draft: args.draft ?? false,\n },\n requiredScopes: ['repo', 'pull_request'],\n },\n );\n return {\n number: json.number,\n htmlUrl: json.html_url,\n state: json.state,\n title: json.title,\n };\n }\n\n // --- low-level call ----------------------------------------------------\n\n private async call<T>(\n token: string | null,\n path: string,\n opts: CallOptions = {},\n ): Promise<{ json: T; response: Response }> {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const onExternalAbort = () => controller.abort(opts.signal!.reason);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort(opts.signal.reason);\n else opts.signal.addEventListener('abort', onExternalAbort, { once: true });\n }\n const timeoutHandle = setTimeout(\n () => controller.abort(new Error(`GitHub request timed out after ${this.timeoutMs}ms`)),\n this.timeoutMs,\n );\n\n let response: Response;\n let timedOut = false;\n try {\n response = await this.fetchImpl(url, {\n method: opts.method ?? 'GET',\n headers: {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(opts.body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n cache: 'no-store',\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n // Distinguish *our* timeout from a network error or a caller-aborted\n // request. AbortError + a non-aborted external signal === our timeout.\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const callerAborted = opts.signal?.aborted ?? false;\n if (isAbort && !callerAborted) {\n timedOut = true;\n throw new TimeoutError(\n `GitHub request timed out after ${this.timeoutMs}ms. The write may have partially landed — refresh before retrying.`,\n this.timeoutMs,\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n if (opts.signal) opts.signal.removeEventListener('abort', onExternalAbort);\n // Silence unused-let warning under strict ts; `timedOut` is a marker\n // for callers reading the catch block to follow the flow.\n void timedOut;\n }\n\n if (response.ok) {\n // 204 No Content (and 205 Reset Content) carry an empty body —\n // calling .json() on those throws \"Unexpected end of JSON input\".\n // The caller types the response as `T` so an empty object is the\n // safe sentinel; DELETE-style endpoints either ignore the value\n // or care only about `response.status`.\n if (response.status === 204 || response.status === 205) {\n return { json: {} as T, response };\n }\n const json = (await response.json()) as T;\n return { json, response };\n }\n\n const errBody = await safeReadJson(response);\n throw classifyError(response, errBody, opts.requiredScopes ?? []);\n }\n}\n\n// --- helpers ---------------------------------------------------------------\n\ninterface RawUser {\n login: string;\n id: number;\n name?: string | null;\n avatar_url?: string;\n}\n\ninterface RawRepo {\n full_name: string;\n name: string;\n owner: { login: string };\n default_branch: string;\n visibility?: 'public' | 'private' | 'internal';\n private?: boolean;\n permissions?: { push?: boolean; admin?: boolean };\n}\n\ninterface RawBranch {\n name: string;\n commit: { sha: string };\n}\n\ninterface RawRefResponse {\n ref: string;\n object: { sha: string };\n}\n\ninterface RawCommit {\n sha: string;\n message: string;\n tree: { sha: string };\n parents?: { sha: string }[];\n}\n\ninterface RawPullRequest {\n number: number;\n html_url: string;\n state: 'open' | 'closed';\n title: string;\n}\n\ninterface RawSearchRepo {\n full_name: string;\n name: string;\n owner: { login: string };\n description?: string | null;\n topics?: string[];\n stargazers_count?: number;\n default_branch?: string;\n}\n\nfunction normalizeMarketplaceRepo(raw: RawSearchRepo): MarketplaceRepo {\n return {\n fullName: raw.full_name,\n owner: raw.owner.login,\n name: raw.name,\n description: raw.description ?? '',\n topics: raw.topics ?? [],\n stargazers: raw.stargazers_count ?? 0,\n defaultBranch: raw.default_branch ?? 'main',\n };\n}\n\ninterface RawFileContents {\n type: string;\n content: string;\n sha: string;\n path: string;\n size: number;\n encoding: string;\n}\n\n/**\n * Decode GitHub's base64 file content as UTF-8. Pure — doesn't depend on\n * `Buffer` (we run in browsers + jsdom).\n */\nfunction decodeBase64Utf8(b64: string): string {\n return new TextDecoder('utf-8').decode(decodeBase64Bytes(b64));\n}\n\n/**\n * Decode GitHub's base64 file content into raw bytes. Used for binary\n * attachments where UTF-8 decoding would corrupt the data.\n */\nfunction decodeBase64Bytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\nfunction normalizeRepo(raw: RawRepo): GitHubRepo {\n const visibility: GitHubRepo['visibility'] =\n raw.visibility ?? (raw.private === true ? 'private' : 'public');\n const isPrivate = raw.private ?? visibility !== 'public';\n // `permissions` is only included when the caller is authenticated; absence\n // means we can't push (e.g. listing a public repo through an app token).\n const pushable = raw.permissions?.push === true || raw.permissions?.admin === true;\n return {\n fullName: raw.full_name,\n owner: raw.owner.login,\n name: raw.name,\n defaultBranch: raw.default_branch,\n visibility,\n isPrivate,\n pushable,\n };\n}\n\nfunction parseScopes(headers: Headers): ScopeInfo {\n const raw = headers.get('x-oauth-scopes') ?? '';\n const granted = raw\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const acceptedHeader = headers.get('x-accepted-oauth-scopes') ?? '';\n const acceptedRequired = acceptedHeader\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return acceptedRequired.length > 0 ? { granted, acceptedRequired } : { granted };\n}\n\nfunction classifyError(\n response: Response,\n body: unknown,\n callerRequiredScopes: string[],\n): GitHubError {\n const message = extractMessage(body) ?? response.statusText;\n const status = response.status;\n\n if (status === 401) {\n return new UnauthorizedError(message || 'Unauthorized — token rejected', status);\n }\n\n if (status === 403) {\n // Rate-limited?\n const remaining = response.headers.get('x-ratelimit-remaining');\n const reset = response.headers.get('x-ratelimit-reset');\n if (remaining === '0' && reset) {\n const resetAtMs = Number(reset) * 1000;\n const deltaMs = Math.max(0, resetAtMs - Date.now());\n const totalSeconds = Math.ceil(deltaMs / 1000);\n const human =\n totalSeconds < 60\n ? `${totalSeconds}s`\n : totalSeconds < 3600\n ? `${Math.ceil(totalSeconds / 60)} min`\n : `${Math.ceil(totalSeconds / 3600)} h`;\n return new RateLimitedError(\n `GitHub rate limit reached. Resets in ${human} (at ${new Date(resetAtMs).toISOString()}).`,\n status,\n resetAtMs,\n );\n }\n // Scope-missing?\n const accepted = (response.headers.get('x-accepted-oauth-scopes') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const granted = (response.headers.get('x-oauth-scopes') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const missing =\n accepted.length > 0\n ? accepted.filter((s) => !granted.includes(s))\n : callerRequiredScopes.filter((s) => !granted.includes(s));\n if (missing.length > 0) {\n return new MissingScopeError(\n `GitHub denied this action: missing scopes ${missing.join(', ')}.`,\n status,\n missing,\n granted,\n );\n }\n }\n\n return new GitHubError(message || 'GitHub API call failed', status, body);\n}\n\nfunction extractMessage(body: unknown): string | null {\n if (typeof body === 'object' && body !== null && 'message' in body) {\n const m = body.message;\n if (typeof m === 'string') return m;\n }\n return null;\n}\n\nasync function safeReadJson(response: Response): Promise<unknown> {\n try {\n return (await response.json()) as unknown;\n } catch {\n return null;\n }\n}\n","import type { McpToolName } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\nimport {\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n} from './imports';\nimport { generateCodeTool } from './codegen';\nimport { workspaceListTool } from './workspaceList';\nimport {\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planRunTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n} from './crud';\nimport { folderExportJsonTool, folderImportJsonTool } from './folderExchange';\nimport {\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n} from './history';\nimport { codebaseExtractCollectionTool } from './codebase';\nimport {\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n promptSetEndpointRequestSchemaTool,\n} from './prompt';\nimport {\n globalAssetsFilesCreateTool,\n globalAssetsFilesDeleteTool,\n globalAssetsFilesListTool,\n globalAssetsFilesUpdateTool,\n} from './globalAssets';\nimport {\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockSetRequestSchemaTool,\n mockSetDefaultPortTool,\n mockImportPostmanMockCollectionTool,\n} from './mocks';\nimport {\n releaseListTool,\n releasePublishTool,\n releaseDeprecateTool,\n releaseYankTool,\n} from './releases';\nimport {\n linkedListTool,\n linkedGetTool,\n linkedSetConfigTool,\n linkedUnlinkTool,\n} from './linkedWorkspaces';\nimport {\n linkedLinkTool,\n linkedRefreshTool,\n marketplaceSearchTool,\n releaseTagTool,\n repoSetTopicsTool,\n} from './githubOps';\n\n// Order matches MCP_TOOL_NAMES in `@apicircle/shared/src/mcp.ts`. CI guards\n// drift via the registry test which asserts every catalog entry resolves.\nexport const TOOL_REGISTRY: AnyToolDef[] = [\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n generateCodeTool,\n workspaceListTool,\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n folderExportJsonTool,\n folderImportJsonTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planRunTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n codebaseExtractCollectionTool,\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n promptSetEndpointRequestSchemaTool,\n globalAssetsFilesListTool,\n globalAssetsFilesCreateTool,\n globalAssetsFilesUpdateTool,\n globalAssetsFilesDeleteTool,\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockSetRequestSchemaTool,\n mockSetDefaultPortTool,\n mockImportPostmanMockCollectionTool,\n releaseListTool,\n releasePublishTool,\n releaseDeprecateTool,\n releaseYankTool,\n linkedListTool,\n linkedGetTool,\n linkedSetConfigTool,\n linkedUnlinkTool,\n linkedLinkTool,\n linkedRefreshTool,\n releaseTagTool,\n repoSetTopicsTool,\n marketplaceSearchTool,\n];\n\nexport function getTool(name: McpToolName): AnyToolDef | undefined {\n return TOOL_REGISTRY.find((t) => t.name === name);\n}\n","import type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// Workspaces — multi-workspace surface exposed to tool handlers.\n//\n// Every existing tool consumes `ctx.workspace` (a `WorkspaceProvider` scoped\n// to ONE workspace) and continues to work unchanged. New tools that need to\n// list workspaces or pick a specific one consume `ctx.workspaces` instead.\n//\n// `ctx.workspace` is the *active* workspace's provider — set by the host\n// at construction time and refreshed when `setActive` is called.\n// =============================================================================\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n isActive: boolean;\n /** ISO timestamps surfaced from the on-disk registry entry. */\n createdAt: string;\n lastOpenedAt: string;\n /** Cheap counts populated when the summary is built so AI clients can\n * decide which workspace to drill into without a second tool call.\n * May be `null` if the per-workspace doc couldn't be read. */\n counts: {\n requests: number;\n folders: number;\n environments: number;\n mockServers: number;\n plans: number;\n } | null;\n}\n\nexport interface Workspaces {\n /** Enumerate every workspace + which is currently active. */\n list(): Promise<WorkspaceSummary[]>;\n\n /** Return a `WorkspaceProvider` scoped to a specific workspace id. */\n for(workspaceId: string): WorkspaceProvider;\n\n /** id of the workspace that `ctx.workspace` currently points at. */\n activeId(): string | null;\n\n /** Switch which workspace `ctx.workspace` resolves to. */\n setActive(workspaceId: string): Promise<void>;\n}\n\n/**\n * Trivial single-workspace adapter — wraps an existing `WorkspaceProvider`\n * so legacy single-dir hosts can still answer `list()` and `for()` calls.\n * `list()` returns one entry (the active workspace itself); `for(id)` is a\n * passthrough that asserts the id matches.\n */\nexport class SingleWorkspaceAdapter implements Workspaces {\n constructor(\n private readonly provider: WorkspaceProvider,\n private workspaceId: string | null,\n private readonly displayName: string = 'Workspace',\n ) {}\n\n async list(): Promise<WorkspaceSummary[]> {\n const state = await this.provider.read();\n const s = state.synced;\n const id = s.workspaceId ?? this.workspaceId ?? 'unknown';\n this.workspaceId = id;\n const now = new Date().toISOString();\n return [\n {\n id,\n name: this.displayName,\n isActive: true,\n createdAt: s.meta?.createdAt ?? now,\n lastOpenedAt: s.meta?.updatedAt ?? now,\n counts: s.collections\n ? {\n requests: Object.keys(s.collections.requests ?? {}).length,\n folders: Object.keys(s.collections.folders ?? {}).length,\n environments: Object.keys(s.environments?.items ?? {}).length,\n mockServers: Object.keys(s.mockServers ?? {}).length,\n plans: Object.keys(s.executionPlans ?? {}).length,\n }\n : null,\n },\n ];\n }\n\n for(workspaceId: string): WorkspaceProvider {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return this.provider;\n }\n\n activeId(): string | null {\n return this.workspaceId;\n }\n\n setActive(workspaceId: string): Promise<void> {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return Promise.resolve();\n }\n}\n\nexport class WorkspaceNotFoundError extends Error {\n readonly code = 'workspace-not-found' as const;\n readonly workspaceId: string;\n constructor(workspaceId: string) {\n super(`No workspace with id \"${workspaceId}\" is available on this server.`);\n this.name = 'WorkspaceNotFoundError';\n this.workspaceId = workspaceId;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Pure in-memory provider. Used for unit tests and any programmatic\n * embedding where the consumer already owns workspace state and just\n * wants to drive the MCP tool catalog without disk or IPC.\n */\nexport class InMemoryWorkspaceProvider implements WorkspaceProvider {\n private state: WorkspaceState;\n\n constructor(initial: WorkspaceState) {\n this.state = initial;\n }\n\n async read(): Promise<WorkspaceState> {\n return this.state;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const out = applyMutation(this.state, patch);\n this.state = out.next;\n return { state: this.state, changedIds: out.changedIds };\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n this.state = {\n synced: next.synced ?? this.state.synced,\n local: next.local ?? this.state.local,\n };\n return this.state;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Disk-backed provider used by the standalone CLI and the headless MCP\n * server when launched outside Electron. Each `apply` runs a full\n * load → mutate → save cycle under a `proper-lockfile` advisory lock so\n * concurrent writers (a second CLI invocation, the desktop app on the\n * same workspace) can't clobber each other.\n */\nexport class FileBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir);\n if (!out) {\n throw new Error(`No workspace found at ${this.dir}`);\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(this.dir, async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n });\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged);\n return merged;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// GitBackedWorkspaceProvider — WorkspaceProvider for a `.apicircle/` directory\n// inside a Git repo.\n//\n// Differs from `FileBackedWorkspaceProvider` (which reads workspace.json\n// from the desktop's disk mirror) in one critical way: the synced file is\n// `workspace.json` — the canonical Git-tracked workspace document that lives\n// at `.apicircle/workspace-<id>/workspace.json` in a user's repo (discovered\n// via `.apicircle/registry.json`).\n//\n// This enables the `apicircle-mcp` binary to operate directly on a cloned repo\n// without requiring the desktop app's disk mirror. External AI clients (Codex,\n// Cursor, Claude Code) that point `--workspace` at a repo's `.apicircle/`\n// directory hit this path.\n//\n// Layout (relative to the directory passed in):\n// workspace.json ← WorkspaceSynced (Git-tracked, collaborators share)\n// workspace.local.json ← WorkspaceLocal (gitignored, per-device runtime)\n//\n// Uses the same `proper-lockfile` locking as `FileBackedWorkspaceProvider` via\n// the shared core helpers, with `syncedFilename: 'workspace.json'`.\n// =============================================================================\n\nconst GIT_SYNCED_FILENAME = 'workspace.json';\n\nexport class GitBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir, {\n syncedFilename: GIT_SYNCED_FILENAME,\n allowMissing: true,\n });\n if (!out) {\n throw new Error(\n `No workspace found at ${this.dir}. Expected .apicircle/registry.json and .apicircle/workspace-<id>/workspace.json in the repo.`,\n );\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(\n this.dir,\n async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n },\n { syncedFilename: GIT_SYNCED_FILENAME },\n );\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged, { syncedFilename: GIT_SYNCED_FILENAME });\n return merged;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport {\n loadRegistry,\n loadWorkspaceById,\n saveRegistry,\n setActiveWorkspace as setActiveWorkspaceOnDisk,\n workspaceDirFor,\n type WorkspaceRegistry,\n} from '@apicircle/core/workspace/registry';\nimport { FileBackedWorkspaceProvider } from './FileBackedWorkspaceProvider';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\nimport { WorkspaceNotFoundError, type WorkspaceSummary, type Workspaces } from './Workspaces';\n\n// =============================================================================\n// MultiWorkspaceProvider — `Workspaces` impl backed by a registry root on\n// disk (`<root>/registry.json` + per-id subdirectories). Wraps a\n// `FileBackedWorkspaceProvider` per active id and rebuilds it whenever the\n// active workspace changes.\n//\n// Used by the MCP server when launched against a registry root (the\n// `~/.apicircle/` root). Tools that consume `ctx.workspace`\n// keep working — they always see the current active workspace; tools that\n// consume `ctx.workspaces` can drill into any registered workspace.\n// =============================================================================\n\n/**\n * Lazy `WorkspaceProvider` that re-resolves the active workspace id from\n * `registry.json` on every `read` / `apply` / `write` call.\n *\n * Why this exists: the desktop owns `registry.json`. The user can switch\n * active workspaces in the UI at any time while their AI client's MCP\n * server keeps running. Before this wrapper landed, `MultiWorkspaceProvider`\n * cached the per-id `FileBackedWorkspaceProvider` at `init()` time, so a\n * mid-session workspace switch left the MCP writing to the OLD workspace.\n * Now each call re-reads the registry and routes to whichever id is\n * currently active.\n *\n * Cost: one small JSON file read + a `proper-lockfile` acquire per tool\n * call. The registry is a few hundred bytes; the cost is negligible\n * compared to the patch application itself.\n */\nclass LazyActiveWorkspaceProvider implements WorkspaceProvider {\n constructor(\n private readonly registryRoot: string,\n private readonly onActiveResolved: (workspaceId: string) => void,\n ) {}\n\n private async resolveActive(): Promise<FileBackedWorkspaceProvider> {\n const registry = await loadRegistry(this.registryRoot);\n const activeId = registry?.activeWorkspaceId ?? null;\n if (!activeId) {\n throw new Error(\n 'No active workspace. Open the desktop app at least once, or run `apicircle workspaces create <name>`.',\n );\n }\n this.onActiveResolved(activeId);\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, activeId));\n }\n\n async read(): Promise<WorkspaceState> {\n const provider = await this.resolveActive();\n return provider.read();\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const provider = await this.resolveActive();\n return provider.apply(patch);\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const provider = await this.resolveActive();\n return provider.write(next);\n }\n}\n\nexport class MultiWorkspaceProvider implements Workspaces {\n /** Last-known active workspace id. Refreshed every time the lazy\n * provider resolves; reflects what the most recent operation saw on\n * disk, not a stale boot-time snapshot. */\n private activeWorkspaceId: string | null = null;\n /** The lazy provider tool handlers consume as `ctx.workspace`. Holds a\n * reference back to this instance so each call updates\n * `activeWorkspaceId` for `activeId()` callers + diagnostic logs. */\n private readonly lazyProvider: LazyActiveWorkspaceProvider;\n\n constructor(private readonly registryRoot: string) {\n this.lazyProvider = new LazyActiveWorkspaceProvider(this.registryRoot, (id) => {\n this.activeWorkspaceId = id;\n });\n }\n\n /**\n * Read the registry from disk so the host can log a boot banner. Does\n * NOT cache a per-id provider — each `activeProvider()` call re-reads\n * the registry, so a workspace switch in the desktop is picked up by\n * the next tool call without restarting the MCP server.\n */\n async init(): Promise<WorkspaceRegistry> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n this.activeWorkspaceId = registry.activeWorkspaceId;\n return registry;\n }\n\n /**\n * The provider tool handlers see as `ctx.workspace`. Returns a lazy\n * provider whose `read` / `apply` / `write` calls re-read\n * `registry.json` so the right active workspace is always targeted\n * even if the desktop switched workspaces since this MCP process\n * started.\n */\n activeProvider(): WorkspaceProvider {\n return this.lazyProvider;\n }\n\n // ─── Workspaces interface ──────────────────────────────────────────────────\n\n async list(): Promise<WorkspaceSummary[]> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n const out: WorkspaceSummary[] = [];\n for (const entry of registry.workspaces) {\n let counts: WorkspaceSummary['counts'] = null;\n try {\n const state = await loadWorkspaceById(this.registryRoot, entry.id);\n if (state?.synced?.collections) {\n const s = state.synced;\n counts = {\n requests: Object.keys(s.collections.requests ?? {}).length,\n folders: Object.keys(s.collections.folders ?? {}).length,\n environments: Object.keys(s.environments?.items ?? {}).length,\n mockServers: Object.keys(s.mockServers ?? {}).length,\n plans: Object.keys(s.executionPlans ?? {}).length,\n };\n }\n } catch {\n // Treat a missing / unreadable per-workspace file as null counts.\n counts = null;\n }\n out.push({\n id: entry.id,\n name: entry.name,\n isActive: entry.id === registry.activeWorkspaceId,\n createdAt: entry.createdAt,\n lastOpenedAt: entry.lastOpenedAt,\n counts,\n });\n }\n return out;\n }\n\n for(workspaceId: string): WorkspaceProvider {\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n activeId(): string | null {\n return this.activeWorkspaceId;\n }\n\n async setActive(workspaceId: string): Promise<void> {\n const registry = await loadRegistry(this.registryRoot);\n if (!registry || !registry.workspaces.some((w) => w.id === workspaceId)) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n await setActiveWorkspaceOnDisk(this.registryRoot, workspaceId);\n // The lazy provider re-reads `registry.json` on its next operation,\n // so we don't need to construct a new provider here — just update the\n // cached `activeId()` value so diagnostic callers see the new id\n // without waiting for the next tool call.\n this.activeWorkspaceId = workspaceId;\n }\n\n /**\n * Idempotent registry write — used by tests / tools that need to\n * persist registry updates that didn't go through `setActive`. The\n * lazy active provider picks the new id up on its next operation.\n */\n async writeRegistry(registry: WorkspaceRegistry): Promise<void> {\n await saveRegistry(this.registryRoot, registry);\n this.activeWorkspaceId = registry.activeWorkspaceId;\n }\n}\n","import type { MockServer, MockRuntimeEntry } from '@apicircle/shared';\nimport {\n startMockServer,\n stopMockServer,\n type MockServerHandle,\n} from '@apicircle/mock-server-core';\nimport type { MockController, StartMockResult } from './MockController';\n\n/**\n * MockController implementation that owns its mock processes directly via\n * `@apicircle/mock-server-core`. Used by the CLI and any embedder that\n * wants the simplest possible setup. The desktop app supplies a\n * different controller (process-bridge to its main process) so renderer-\n * side state stays consistent.\n */\nexport class InProcessMockController implements MockController {\n private readonly handles = new Map<string, MockServerHandle>();\n private readonly meta = new Map<string, MockRuntimeEntry>();\n\n async start(server: MockServer, opts: { port?: number } = {}): Promise<StartMockResult> {\n if (this.handles.has(server.id)) {\n throw new Error(`Mock '${server.id}' is already running`);\n }\n const handle = await startMockServer(server, {\n port: opts.port ?? server.defaultPort ?? undefined,\n });\n const runtime: MockRuntimeEntry = {\n port: handle.port,\n pid: process.pid,\n startedAt: new Date().toISOString(),\n lastError: null,\n requestCount: 0,\n };\n this.handles.set(server.id, handle);\n this.meta.set(server.id, runtime);\n return { port: handle.port, pid: runtime.pid, startedAt: runtime.startedAt };\n }\n\n async stop(serverId: string): Promise<void> {\n const handle = this.handles.get(serverId);\n if (!handle) return;\n await stopMockServer(handle);\n this.handles.delete(serverId);\n this.meta.delete(serverId);\n }\n\n async list(): Promise<Array<{ serverId: string; runtime: MockRuntimeEntry }>> {\n return Array.from(this.meta.entries()).map(([serverId, runtime]) => ({\n serverId,\n runtime,\n }));\n }\n}\n","import * as path from 'node:path';\n\n// =============================================================================\n// MCP config snippet builder — shared between Desktop and VS Code.\n//\n// External AI clients (Claude Desktop, Cursor, Codex, etc.) launch the\n// `apicircle-mcp` binary themselves as a stdio child process — neither the\n// Desktop app nor the VS Code extension spawns it directly. What both apps\n// DO provide is the exact config snippet the user pastes into the client's\n// config file (JSON for most clients, TOML for Codex, YAML for Continue).\n// This module centralises:\n//\n// • The `AiClient` type + `AI_CLIENTS` runtime allowlist\n// • `buildSnippetVariants(client, binary, workspace)` — forward-slash +\n// escaped renderings (Windows backslash handling)\n// • `resolveAiClientConfigPath(client, env)` — conventional config file\n// path per OS for clients that have one\n//\n// Promoted to `@apicircle/mcp-server` so the VS Code extension (which\n// cannot depend on the workspace-private `@apicircle/ui-components`) and\n// the desktop main process both consume the same logic.\n// =============================================================================\n\nexport type AiClient =\n | 'claude-desktop'\n | 'claude-code'\n | 'codex'\n | 'cursor'\n | 'continue'\n | 'cline'\n | 'zed'\n | 'windsurf'\n | 'github-copilot'\n | 'chatgpt'\n | 'generic';\n\nexport const AI_CLIENTS: readonly AiClient[] = [\n 'claude-desktop',\n 'claude-code',\n 'codex',\n 'cursor',\n 'continue',\n 'cline',\n 'zed',\n 'windsurf',\n 'github-copilot',\n 'chatgpt',\n 'generic',\n] as const;\n\n/**\n * Two byte-identical-but-for-path-escaping renderings of the same snippet.\n *\n * - `forwardSlash`: workspace path uses `/` separators on Windows\n * (`\"C:/Users/.../workspaces\"`). No backslash escapes needed — easier\n * to read, accepted by Node, Electron, and Windows file APIs.\n * - `escaped`: literal OS path. On Windows that means `\\\\` escapes\n * inside quoted strings (JSON and TOML both use `\\` as the escape\n * character).\n *\n * On POSIX both strings are byte-identical and `identical` is `true` — the\n * UI uses that flag to suppress the variant picker.\n */\nexport interface ConfigSnippetVariants {\n forwardSlash: string;\n escaped: string;\n identical: boolean;\n}\n\n/**\n * Build the snippet for a given AI client + workspace path. Most clients\n * use JSON with `mcpServers: { apicircle: ... }`; Codex uses TOML with\n * `[mcp_servers.apicircle]`. The `client` arg selects the format.\n */\nexport function buildSnippetVariants(\n client: AiClient,\n binary: string,\n workspace: string,\n): ConfigSnippetVariants {\n const forwardWorkspace = workspace.replace(/\\\\/g, '/');\n const render = client === 'codex' ? renderTomlSnippet : renderJsonSnippet;\n const escaped = render(binary, workspace);\n const forwardSlash = render(binary, forwardWorkspace);\n return {\n forwardSlash,\n escaped,\n identical: forwardSlash === escaped,\n };\n}\n\nfunction renderJsonSnippet(binary: string, workspace: string): string {\n const entry = {\n command: binary,\n args: ['--workspace', workspace],\n env: { APICIRCLE_WORKSPACE: workspace },\n };\n return JSON.stringify({ mcpServers: { apicircle: entry } }, null, 2);\n}\n\nfunction renderTomlSnippet(binary: string, workspace: string): string {\n const esc = (s: string): string => s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return [\n `[mcp_servers.apicircle]`,\n `command = \"${esc(binary)}\"`,\n `args = [\"--workspace\", \"${esc(workspace)}\"]`,\n ``,\n `[mcp_servers.apicircle.env]`,\n `APICIRCLE_WORKSPACE = \"${esc(workspace)}\"`,\n ].join('\\n');\n}\n\n/**\n * Host-environment shape the config-path resolver depends on. Both the\n * desktop main process and the VS Code extension run on Node — they pass\n * the standard `os.homedir()` / `process.platform` / `process.env.APPDATA`\n * values straight through. Tests pin them explicitly.\n */\nexport interface ConfigPathEnv {\n /** e.g. `os.homedir()` */\n homedir: string;\n /** `process.platform` — one of \"darwin\" / \"win32\" / \"linux\" / ... */\n platform: NodeJS.Platform;\n /** Windows-only: `process.env.APPDATA`, used by Claude Desktop's config. */\n appdata?: string;\n}\n\n/**\n * Conventional path of the config file for each client on the current OS,\n * or `null` if the client has no fixed location (manual paste).\n */\nexport function resolveAiClientConfigPath(client: AiClient, env: ConfigPathEnv): string | null {\n const { homedir, platform, appdata } = env;\n switch (client) {\n case 'claude-desktop':\n if (platform === 'darwin') {\n return path.join(homedir, 'Library/Application Support/Claude/claude_desktop_config.json');\n }\n if (platform === 'win32') {\n return path.join(\n appdata ?? path.join(homedir, 'AppData/Roaming'),\n 'Claude/claude_desktop_config.json',\n );\n }\n return path.join(homedir, '.config/Claude/claude_desktop_config.json');\n case 'claude-code':\n // Claude Code CLI's MCP config lives under `.claude/mcp.json` —\n // same shape as Claude Desktop's mcpServers wrapper. P5R1-G11.\n return path.join(homedir, '.claude/mcp.json');\n case 'cursor':\n return path.join(homedir, '.cursor/mcp.json');\n case 'continue':\n return path.join(homedir, '.continue/config.yaml');\n case 'zed':\n return path.join(homedir, '.config/zed/settings.json');\n case 'windsurf':\n // Windsurf (Codeium IDE) reads MCP servers from\n // `.codeium/windsurf/mcp_config.json` under the user's home. P5R1-G11.\n return path.join(homedir, '.codeium/windsurf/mcp_config.json');\n case 'codex':\n return path.join(homedir, '.codex/config.toml');\n default:\n return null;\n }\n}\n","// Curated starter prompts the user can paste into any MCP-connected AI\n// client to drive their workspace. Each prompt names the MCP tool family\n// it exercises so users can match it back to the tool catalog.\n//\n// Hand-curated, not auto-derived: the goal is to teach the user what's\n// possible, not to enumerate every tool. ~3-4 per category covers the\n// common cases without overwhelming the page.\n//\n// Shared between Desktop/Web (ui-components) and VS Code extension.\n\nexport interface McpPrompt {\n id: string;\n /** Natural-language prompt the user copies. */\n text: string;\n /** Short description rendered under the prompt. */\n description: string;\n /** Which MCP tool family this prompt exercises — used as a filter chip. */\n category: McpPromptCategory;\n /** The MCP tool names this prompt is likely to drive. Informational only. */\n tools: ReadonlyArray<string>;\n}\n\nexport type McpPromptCategory =\n | 'workspaces'\n | 'collections'\n | 'environments'\n | 'execution'\n | 'mocks'\n | 'auth'\n | 'imports';\n\nexport const MCP_PROMPT_CATEGORIES: ReadonlyArray<{\n id: McpPromptCategory;\n label: string;\n}> = [\n { id: 'workspaces', label: 'Workspaces' },\n { id: 'collections', label: 'Collections' },\n { id: 'environments', label: 'Environments' },\n { id: 'execution', label: 'Execution' },\n { id: 'mocks', label: 'Mocks' },\n { id: 'auth', label: 'Auth' },\n { id: 'imports', label: 'Imports' },\n];\n\nexport const MCP_PROMPTS: ReadonlyArray<McpPrompt> = [\n // ── Workspaces (multi-workspace discovery) ───────────────────────\n {\n id: 'list-workspaces',\n text: 'List every API Circle workspace I have and tell me which is active.',\n description:\n 'Multi-workspace discovery — call this first when you are not sure which workspace to drive.',\n category: 'workspaces',\n tools: ['workspace.list'],\n },\n {\n id: 'scope-to-workspace',\n text: 'Read the requests in the \"Petstore\" workspace.',\n description:\n 'Drill into a specific workspace by name; the AI passes `workspaceId` to scope reads.',\n category: 'workspaces',\n tools: ['workspace.list', 'workspace.read'],\n },\n {\n id: 'multi-workspace-summary',\n text: 'Across every workspace, count requests, folders, environments, and mocks. Give me one row per workspace.',\n description:\n 'High-level summary across every registered workspace — pairs well with the multi-workspace envelope.',\n category: 'workspaces',\n tools: ['workspace.list'],\n },\n\n // ── Collections (requests + folders in the active workspace) ─────\n {\n id: 'list-requests',\n text: 'List every request in my API Circle workspace grouped by folder.',\n description: 'Quick overview of the request catalog so you know what is already wired up.',\n category: 'collections',\n tools: ['workspace.read', 'request.read', 'folder.read'],\n },\n {\n id: 'create-request',\n text: 'Add a new GET request named \"Health check\" pointing at https://example.com/healthz with an Accept: application/json header.',\n description: 'Have the AI author a request and persist it to the workspace.',\n category: 'collections',\n tools: ['request.create'],\n },\n {\n id: 'update-request',\n text: 'Find the \"Create user\" request and change its method to POST and body to {\"name\": \"Ada\"}.',\n description: 'Targeted edit by name — the AI looks it up, then updates.',\n category: 'collections',\n tools: ['request.read', 'request.update'],\n },\n {\n id: 'organize-folders',\n text: 'Move every request whose URL contains /users into a folder named \"User API\".',\n description: 'Bulk reorganisation via natural language.',\n category: 'collections',\n tools: ['workspace.read', 'folder.create', 'request.update'],\n },\n\n // ── Environments ──────────────────────────────────────────────────\n {\n id: 'env-list',\n text: 'Show me all environments and which one is active.',\n description: 'Inventory of envs + which is layered onto requests right now.',\n category: 'environments',\n tools: ['environment.read'],\n },\n {\n id: 'env-create',\n text: 'Create a \"staging\" environment with BASE_URL=https://staging.example.com and API_KEY={{SECRET:staging-key}}.',\n description: 'Spin up a new env with both a plain variable and a secret reference.',\n category: 'environments',\n tools: ['environment.create'],\n },\n {\n id: 'env-switch',\n text: 'Switch the active environment to \"production\" and confirm by previewing the effective URL of the \"Get user\" request.',\n description: 'Activate an env then verify variable interpolation.',\n category: 'environments',\n tools: ['environment.update', 'request.read'],\n },\n\n // ── Execution ─────────────────────────────────────────────────────\n {\n id: 'run-request',\n text: 'Run the \"Get user\" request with userId=42 and show me the JSON response.',\n description: 'One-shot execution with overridden context vars.',\n category: 'execution',\n tools: ['request.execute'],\n },\n {\n id: 'run-plan',\n text: 'Execute the \"Regression smoke\" plan and summarise which assertions failed.',\n description: 'Drive a saved execution plan end-to-end.',\n category: 'execution',\n tools: ['plan.read', 'plan.execute'],\n },\n {\n id: 'inspect-history',\n text: 'Show me the last 5 requests I ran and their status codes.',\n description: 'Quick triage when something just broke.',\n category: 'execution',\n tools: ['history.read'],\n },\n\n // ── Mocks ─────────────────────────────────────────────────────────\n {\n id: 'mock-start',\n text: 'Start the \"Petstore\" mock on port 4010 and tell me its base URL.',\n description: 'Spin up a local mock so requests can hit it.',\n category: 'mocks',\n tools: ['mock.list', 'mock.start'],\n },\n {\n id: 'mock-list',\n text: 'List every running mock with its port, served spec, and request count.',\n description: 'Status snapshot of every active mock runtime.',\n category: 'mocks',\n tools: ['mock.list'],\n },\n {\n id: 'mock-stop',\n text: 'Stop every running mock.',\n description: 'Clean shutdown of all mock servers in one go.',\n category: 'mocks',\n tools: ['mock.stopAll'],\n },\n\n // ── Auth ──────────────────────────────────────────────────────────\n {\n id: 'auth-set-bearer',\n text: 'Set the \"Get user\" request to use bearer auth with token={{ACCESS_TOKEN}}.',\n description: 'Wire bearer auth onto a single request via env-var reference.',\n category: 'auth',\n tools: ['request.update'],\n },\n {\n id: 'auth-oauth2',\n text: 'Configure the \"Create order\" request to use OAuth2 client-credentials against https://auth.example.com/token with the \"orders.write\" scope.',\n description: 'Full OAuth2 client-credentials wiring without leaving the chat.',\n category: 'auth',\n tools: ['request.update'],\n },\n\n // ── Imports ───────────────────────────────────────────────────────\n {\n id: 'import-openapi',\n text: 'Import the OpenAPI spec at ./openapi.yaml and create one request per operation.',\n description: 'Bulk import of a spec file from the workspace.',\n category: 'imports',\n tools: ['import.openapi'],\n },\n {\n id: 'import-curl',\n text: 'I am going to paste a cURL command — turn it into a saved request named \"Webhook test\".',\n description: 'cURL → saved request with a name you control.',\n category: 'imports',\n tools: ['import.curl'],\n },\n];\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_shared","import_core","state","import_zod","import_core","import_zod","import_zod","import_zod","import_shared","HTTP_METHOD","import_zod","import_shared","import_zod","import_shared","import_mock_server_core","HTTP_METHOD","ENDPOINT_RESPONSE","patchEndpoint","import_zod","import_core","import_zod","import_zod","import_core","import_shared","path","import_core","import_core","import_core","import_file_backed","setActiveWorkspaceOnDisk","import_mock_server_core","import_stdio"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/host/McpHost.ts","../package.json","../src/packageVersion.ts","../src/tools/imports.ts","../src/tools/codegen.ts","../src/tools/workspaceList.ts","../src/tools/crud.ts","../src/tools/folderExchange.ts","../src/tools/history.ts","../src/tools/codebase.ts","../src/tools/prompt.ts","../src/tools/globalAssets.ts","../src/tools/mocks.ts","../src/tools/releases.ts","../src/tools/linkedWorkspaces.ts","../src/tools/githubOps.ts","../../git/src/github/errors.ts","../../git/src/github/api.ts","../src/tools/registry.ts","../src/providers/Workspaces.ts","../src/providers/InMemoryWorkspaceProvider.ts","../src/providers/FileBackedWorkspaceProvider.ts","../src/providers/GitBackedWorkspaceProvider.ts","../src/providers/MultiWorkspaceProvider.ts","../src/providers/InProcessMockController.ts","../src/config/snippets.ts","../src/prompts/mcpPrompts.ts"],"sourcesContent":["import { McpHost } from './host/McpHost';\nimport { TOOL_REGISTRY } from './tools/registry';\nimport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nimport type { MockController } from './providers/MockController';\nimport type { AnyToolDef } from './tools/types';\nimport { SingleWorkspaceAdapter, type Workspaces } from './providers/Workspaces';\n\n// Public API for `@apicircle/mcp-server`.\n//\n// The host is intentionally non-opinionated about *where* the workspace and\n// mock runtime live — pass in the right provider for your environment:\n//\n// • Single workspace (workspace.json) → FileBackedWorkspaceProvider\n// • Multi-workspace (~/.apicircle/) → MultiWorkspaceProvider\n// • Electron desktop → IpcWorkspaceProvider\n// • Embedded test / demo → InMemoryWorkspaceProvider\n\nexport { McpHost } from './host/McpHost';\nexport { TOOL_REGISTRY, getTool } from './tools/registry';\nexport type { AnyToolDef, ToolDef, ToolHandlerContext } from './tools/types';\nexport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nexport type { MockController, StartMockResult } from './providers/MockController';\nexport {\n SingleWorkspaceAdapter,\n WorkspaceNotFoundError,\n type WorkspaceSummary,\n type Workspaces,\n} from './providers/Workspaces';\nexport { InMemoryWorkspaceProvider } from './providers/InMemoryWorkspaceProvider';\nexport { FileBackedWorkspaceProvider } from './providers/FileBackedWorkspaceProvider';\nexport { GitBackedWorkspaceProvider } from './providers/GitBackedWorkspaceProvider';\nexport { MultiWorkspaceProvider } from './providers/MultiWorkspaceProvider';\nexport { InProcessMockController } from './providers/InProcessMockController';\n\nexport { AI_CLIENTS, buildSnippetVariants, resolveAiClientConfigPath } from './config/snippets';\nexport type { AiClient, ConfigSnippetVariants, ConfigPathEnv } from './config/snippets';\n\nexport { MCP_PROMPTS, MCP_PROMPT_CATEGORIES } from './prompts/mcpPrompts';\nexport type { McpPrompt, McpPromptCategory } from './prompts/mcpPrompts';\n\n// Re-export the SDK's transport implementations so embedders (VS Code,\n// desktop, etc.) don't have to take a direct dep on `@modelcontextprotocol/sdk`.\n// We're already the wrapper around the SDK — every consumer of our McpHost\n// pulls these through us.\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nexport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\n\nexport interface CreateMcpServerOptions {\n /**\n * Provider for the ACTIVE workspace. Tools that consume `ctx.workspace`\n * see this directly. When you pass a `MultiWorkspaceProvider`, use its\n * `activeProvider()` here.\n */\n workspace: WorkspaceProvider;\n /**\n * Optional multi-workspace surface. When omitted, the host wraps\n * `workspace` in a `SingleWorkspaceAdapter` so `workspace.list` and the\n * multi-workspace envelope still work (with one entry).\n */\n workspaces?: Workspaces;\n mock: MockController;\n /** Override the registered tool list. Defaults to `TOOL_REGISTRY`. */\n tools?: AnyToolDef[];\n serverInfo?: { name: string; version: string };\n}\n\n/**\n * Build a fully-wired McpHost ready to `await host.connect()` over stdio.\n * Tool implementations come from `TOOL_REGISTRY` by default; pass `tools`\n * to inject a curated subset (useful for tests or for hosting only the\n * import surface).\n */\nexport function createMcpServer(options: CreateMcpServerOptions): McpHost {\n const workspaces =\n options.workspaces ??\n new SingleWorkspaceAdapter(options.workspace, null /* discovered on first list() */);\n return new McpHost({\n serverInfo: options.serverInfo,\n tools: options.tools ?? TOOL_REGISTRY,\n context: {\n workspace: options.workspace,\n workspaces,\n mock: options.mock,\n },\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { z } from 'zod';\nimport type { AnyToolDef, ToolHandlerContext } from '../tools/types';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// McpHost — wraps `@modelcontextprotocol/sdk`'s `McpServer`. The thin layer\n// here exists so we can swap SDK versions or transports without touching\n// every tool. Each ToolDef is registered with the SDK's high-level\n// `registerTool(name, { description, inputSchema }, cb)` API.\n//\n// `inputSchema` is a Zod object on our side; the SDK wants a raw shape\n// (object of fields → schema), so we extract `.shape` when registering.\n// =============================================================================\n\nconst PACKAGE_NAME = 'apicircle-mcp';\n\nexport interface McpHostOptions {\n serverInfo?: { name: string; version: string };\n context: ToolHandlerContext;\n tools: AnyToolDef[];\n}\n\nexport class McpHost {\n readonly server: McpServer;\n private readonly tools: AnyToolDef[];\n private readonly context: ToolHandlerContext;\n\n constructor(options: McpHostOptions) {\n this.server = new McpServer({\n name: options.serverInfo?.name ?? PACKAGE_NAME,\n version: options.serverInfo?.version ?? MCP_PACKAGE_VERSION,\n });\n this.tools = options.tools;\n this.context = options.context;\n this.registerAll();\n }\n\n private registerAll(): void {\n for (const tool of this.tools) {\n const shape = isZodObject(tool.inputSchema) ? tool.inputSchema.shape : undefined;\n this.server.registerTool(\n tool.name,\n {\n description: tool.description,\n ...(shape ? { inputSchema: shape } : {}),\n },\n async (args: unknown) => {\n try {\n const parsed = tool.inputSchema.parse(args ?? {});\n const result = await tool.handler(parsed, this.context);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: formatError(err),\n },\n ],\n };\n }\n },\n );\n }\n }\n\n /** Connect the underlying server to a transport (defaults to stdio). */\n async connect(transport?: Transport): Promise<void> {\n await this.server.connect(transport ?? new StdioServerTransport());\n }\n\n async close(): Promise<void> {\n await this.server.close();\n }\n}\n\nfunction isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n}\n\nfunction formatError(err: unknown): string {\n if (err instanceof z.ZodError) {\n return `Validation failed: ${err.issues\n .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)\n .join('; ')}`;\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","{\n \"name\": \"@apicircle/mcp-server\",\n \"version\": \"1.1.3\",\n \"private\": false,\n \"type\": \"module\",\n \"sideEffects\": false,\n \"description\": \"Model Context Protocol server exposing API Circle Studio's workspace as a tool catalog. Used by Claude Desktop, ChatGPT, Cursor, GitHub Copilot, and any other MCP-compatible AI client.\",\n \"keywords\": [\n \"apicircle\",\n \"api\",\n \"api-circle\",\n \"mcp\",\n \"mcp-server\",\n \"model-context-protocol\",\n \"ai\",\n \"llm\",\n \"agent\",\n \"tool-catalog\",\n \"claude\",\n \"claude-desktop\",\n \"chatgpt\",\n \"cursor\",\n \"copilot\",\n \"continue\",\n \"cline\",\n \"zed\",\n \"windsurf\",\n \"openapi\",\n \"postman\",\n \"api-tools\"\n ],\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/apicircle/studio.git\",\n \"directory\": \"packages/mcp-server\"\n },\n \"homepage\": \"https://github.com/apicircle/studio#readme\",\n \"bugs\": \"https://github.com/apicircle/studio/issues\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"bin\": {\n \"apicircle-mcp\": \"./dist/bin/mcp-server.cjs\"\n },\n \"exports\": {\n \".\": \"./src/index.ts\",\n \"./prompts\": \"./src/prompts/mcpPrompts.ts\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./prompts\": {\n \"import\": {\n \"types\": \"./dist/prompts/mcpPrompts.d.ts\",\n \"default\": \"./dist/prompts/mcpPrompts.js\"\n },\n \"require\": {\n \"types\": \"./dist/prompts/mcpPrompts.d.cts\",\n \"default\": \"./dist/prompts/mcpPrompts.cjs\"\n }\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist node_modules\"\n },\n \"dependencies\": {\n \"@apicircle/core\": \"workspace:*\",\n \"@apicircle/mock-server-core\": \"workspace:*\",\n \"@apicircle/shared\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@apicircle/git\": \"workspace:*\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.4.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import packageJson from '../package.json';\n\nexport function readPackageVersion(): string {\n const version = (packageJson as { version?: unknown }).version;\n if (typeof version !== 'string' || version.length === 0) {\n throw new Error('Unable to read @apicircle/mcp-server package version');\n }\n return version;\n}\n\nexport const MCP_PACKAGE_VERSION = readPackageVersion();\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseCurl } from '@apicircle/core';\nimport {\n parseOpenApiToEndpoints,\n parsePostmanToEndpoints,\n parseInsomniaToEndpoints,\n} from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Import tools — convert external request descriptions into one or more\n// requests in the workspace. Each tool persists to the workspace and returns\n// the created request ids so the AI client can reference them in follow-up\n// turns.\n// =============================================================================\n\nconst FALLBACK_NAME = (idx: number, fallback: string): string =>\n fallback || `Imported request ${idx + 1}`;\n\nfunction blankRequest(): Omit<ApiRequest, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n name: 'Imported request',\n folderId: null,\n method: 'GET',\n url: '',\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n auth: { type: 'none' },\n contextVars: [],\n extractions: [],\n assertions: [],\n };\n}\n\nexport const importCurlTool: AnyToolDef = {\n name: 'import.curl',\n description: 'Parse a `curl ...` command into a Request and persist it to the workspace.',\n inputSchema: z.object({\n curl: z.string().min(1, 'curl command is required'),\n name: z.string().optional(),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseCurl(input.curl);\n const now = new Date().toISOString();\n const request: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: input.name?.trim() || `cURL ${parsed.method} ${parsed.url}`.slice(0, 80),\n method: parsed.method,\n url: parsed.url,\n headers: parsed.headers,\n query: parsed.query,\n body: parsed.body,\n auth: parsed.auth,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return {\n id: request.id,\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const importOpenApiTool: AnyToolDef = {\n name: 'import.openapi',\n description:\n 'Parse an OpenAPI / Swagger spec (YAML or JSON) and create one Request per operation. Returns the list of created request ids.',\n inputSchema: z.object({\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = await parseOpenApiToEndpoints(input.spec, input.format);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importPostmanTool: AnyToolDef = {\n name: 'import.postman',\n description: 'Parse a Postman v2/v2.1 collection JSON and create one Request per item.',\n inputSchema: z.object({\n collection: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parsePostmanToEndpoints(input.collection);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importInsomniaTool: AnyToolDef = {\n name: 'import.insomnia',\n description: 'Parse an Insomnia v4 export and create one Request per resource of type \"request\".',\n inputSchema: z.object({\n export: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseInsomniaToEndpoints(input.export);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\n// HAR — quick adapter. We extract method/url/headers/body from `log.entries[].request`.\nexport const importHarTool: AnyToolDef = {\n name: 'import.har',\n description:\n 'Parse an HTTP Archive (.har) JSON and create one Request per recorded entry. Cookies, response, and timings are dropped.',\n inputSchema: z.object({\n har: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n let parsed: {\n log?: { entries?: Array<{ request?: HarRequest }> };\n };\n try {\n parsed = JSON.parse(input.har);\n } catch (err) {\n return { createdIds: [], warnings: [`HAR parse error: ${(err as Error).message}`] };\n }\n const entries = parsed.log?.entries ?? [];\n const ids: string[] = [];\n const warnings: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i].request;\n if (!e || !e.url || !e.method) {\n warnings.push(`Entry #${i} missing method/url; skipped`);\n continue;\n }\n const url = new URL(e.url);\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: `${e.method} ${url.pathname}`,\n method: e.method as ApiRequest['method'],\n url: e.url,\n headers: (e.headers ?? []).map((h) => ({\n key: h.name,\n value: h.value,\n enabled: true,\n })),\n query: (e.queryString ?? []).map((q) => ({\n key: q.name,\n value: q.value,\n enabled: true,\n })),\n body: e.postData\n ? { type: 'text', content: e.postData.text ?? '' }\n : { type: 'none', content: '' },\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings };\n },\n};\n\ninterface HarRequest {\n method?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n queryString?: Array<{ name: string; value: string }>;\n postData?: { text?: string; mimeType?: string };\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// generate.code — produce a code snippet that reproduces a workspace request\n// in the user's language of choice. Targets are intentionally hand-rolled\n// rather than delegating to a third-party codegen lib so output stays small,\n// reviewable, and free from heavy transitive deps.\n// =============================================================================\n\nconst TARGET = z.enum(['curl', 'fetch', 'node-axios', 'python-requests', 'go', 'rust']);\n\nexport const generateCodeTool: AnyToolDef = {\n name: 'generate.code',\n description:\n 'Generate runnable code (curl / JavaScript fetch / Node Axios / Python requests / Go net/http / Rust reqwest) that reproduces a workspace request.',\n inputSchema: z.object({\n requestId: z.string(),\n target: TARGET,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { ok: false, error: 'request not found' };\n const code = renderCode(req, input.target);\n return { ok: true, target: input.target, code };\n },\n};\n\nfunction renderCode(req: ApiRequest, target: z.infer<typeof TARGET>): string {\n switch (target) {\n case 'curl':\n return renderCurl(req);\n case 'fetch':\n return renderFetch(req);\n case 'node-axios':\n return renderAxios(req);\n case 'python-requests':\n return renderPython(req);\n case 'go':\n return renderGo(req);\n case 'rust':\n return renderRust(req);\n }\n}\n\nfunction fullUrl(req: ApiRequest): string {\n if (!req.query.length) return req.url;\n const enabled = req.query.filter((q) => q.enabled !== false);\n if (!enabled.length) return req.url;\n const sep = req.url.includes('?') ? '&' : '?';\n return (\n req.url +\n sep +\n enabled.map((q) => `${encodeURIComponent(q.key)}=${encodeURIComponent(q.value)}`).join('&')\n );\n}\n\nfunction bodyContent(req: ApiRequest): string | null {\n if (req.body.type === 'none') return null;\n if (req.body.type === 'json' || req.body.type === 'text' || req.body.type === 'xml') {\n return req.body.content;\n }\n if (req.body.type === 'graphql') {\n return JSON.stringify({ query: req.body.content, variables: req.body.variables ?? null });\n }\n if (req.body.type === 'urlencoded') return req.body.content;\n return null;\n}\n\nfunction renderCurl(req: ApiRequest): string {\n const parts: string[] = [`curl -X ${req.method} '${fullUrl(req)}'`];\n for (const h of req.headers.filter((x) => x.enabled !== false)) {\n parts.push(`-H '${h.key}: ${h.value}'`);\n }\n const body = bodyContent(req);\n if (body !== null) {\n parts.push(`--data-raw '${body.replace(/'/g, \"'\\\\''\")}'`);\n }\n return parts.join(' \\\\\\n ');\n}\n\nfunction renderFetch(req: ApiRequest): string {\n const headers = Object.fromEntries(\n req.headers.filter((h) => h.enabled !== false).map((h) => [h.key, h.value]),\n );\n const body = bodyContent(req);\n const init: Record<string, unknown> = { method: req.method };\n if (Object.keys(headers).length) init.headers = headers;\n if (body !== null) init.body = body;\n return `await fetch(${JSON.stringify(fullUrl(req))}, ${JSON.stringify(init, null, 2)})`;\n}\n\nfunction renderAxios(req: ApiRequest): string {\n const config: Record<string, unknown> = {\n method: req.method.toLowerCase(),\n url: fullUrl(req),\n };\n const headers = req.headers.filter((h) => h.enabled !== false);\n if (headers.length) config.headers = Object.fromEntries(headers.map((h) => [h.key, h.value]));\n const body = bodyContent(req);\n if (body !== null) config.data = body;\n return `import axios from 'axios';\\n\\nconst response = await axios(${JSON.stringify(\n config,\n null,\n 2,\n )});`;\n}\n\nfunction renderPython(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = ['import requests', ''];\n lines.push(`response = requests.request(`);\n lines.push(` method=${JSON.stringify(req.method)},`);\n lines.push(` url=${JSON.stringify(fullUrl(req))},`);\n if (headers.length) {\n lines.push(\n ` headers=${JSON.stringify(Object.fromEntries(headers.map((h) => [h.key, h.value])))},`,\n );\n }\n if (body !== null) lines.push(` data=${JSON.stringify(body)},`);\n lines.push(')');\n return lines.join('\\n');\n}\n\nfunction renderGo(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'package main',\n '',\n 'import (',\n ' \"io\"',\n ' \"net/http\"',\n ' \"strings\"',\n ')',\n '',\n 'func main() {',\n ];\n if (body !== null) {\n lines.push(` body := strings.NewReader(${JSON.stringify(body)})`);\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, body)`,\n );\n } else {\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, nil)`,\n );\n }\n for (const h of headers) {\n lines.push(` req.Header.Set(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(' resp, _ := http.DefaultClient.Do(req)');\n lines.push(' defer resp.Body.Close()');\n lines.push(' out, _ := io.ReadAll(resp.Body)');\n lines.push(' _ = out');\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction renderRust(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'use reqwest::Client;',\n '',\n '#[tokio::main]',\n 'async fn main() -> Result<(), Box<dyn std::error::Error>> {',\n ` let client = Client::new();`,\n ` let mut req = client.request(reqwest::Method::${req.method}, ${JSON.stringify(\n fullUrl(req),\n )});`,\n ];\n for (const h of headers) {\n lines.push(` req = req.header(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)});`);\n }\n if (body !== null) lines.push(` req = req.body(${JSON.stringify(body)});`);\n lines.push(' let _resp = req.send().await?;');\n lines.push(' Ok(())');\n lines.push('}');\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// workspace.list — surfaces every workspace the server can drive, with cheap\n// per-workspace counts so AI clients can disambiguate without follow-up\n// reads. Used by prompts like \"list every workspace I have\" or as a\n// disambiguation step before drilling into a specific one.\n// =============================================================================\n\nexport const workspaceListTool: AnyToolDef = {\n name: 'workspace.list',\n description:\n 'List every workspace registered with this server, including which one is currently active. ' +\n 'Returns id, display name, last-opened timestamp, and a per-workspace summary (request count, ' +\n 'environment count, mock-server count, plan count). Use this BEFORE drilling into a specific ' +\n 'workspace via other tools — pass the resulting `id` as `workspaceId` to `workspace.read` ' +\n 'or related reads when you want to scope to a non-active workspace.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const summaries = await ctx.workspaces.list();\n return {\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n // Plain-text hint the AI surfaces when telling the user. Cheap to\n // generate here and saves round-trips on disambiguation prompts.\n hint:\n summaries.length === 0\n ? 'No workspaces are registered yet. The user should open the desktop app once or run `apicircle workspaces create <name>` from the terminal.'\n : summaries.length === 1\n ? `Only one workspace (\"${summaries[0].name}\") is registered — most tools will default to it without a workspaceId.`\n : `Multiple workspaces are registered. Pass the desired \\`id\\` as \\`workspaceId\\` to other tools to scope reads/writes to that workspace; the active one (\"${\n summaries.find((w) => w.isActive)?.name ?? '(none)'\n }\") is used by default.`,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n Request as ApiRequest,\n RequestAuth,\n} from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseApicircleEnvironmentDoc } from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\n// Permissive auth schema for CRUD tools (`folder.update`, future\n// `request.update` if we surface a dedicated auth slot). Accepts any of the\n// 17 RequestAuth variants — only `type: string` is enforced; the rest of\n// the discriminated-union shape is validated downstream by the reducer +\n// runtime resolvers. PROMPT_AUTH (in `prompt.ts`) intentionally narrows to\n// the LLM-friendly six, but CRUD tools shouldn't be more restrictive than\n// `request.update`'s `patch: Partial<Request>` accept-anything-typed path.\nconst FULL_REQUEST_AUTH = z.object({ type: z.string() }).passthrough();\n\n// =============================================================================\n// CRUD tool definitions for every workspace entity. Reads always go through\n// `workspace.read()`; writes always go through `workspace.apply(patch)` so the\n// mutation API in @apicircle/core is the single semantic source of truth.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const requestCreateTool: AnyToolDef = {\n name: 'request.create',\n description: 'Create a new request from explicit fields and persist it.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const request: ApiRequest = {\n id: generateId(),\n name: input.name,\n folderId: input.folderId ?? null,\n method: input.method,\n url: input.url,\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n // Default to `inherit` so requests created via MCP inside a folder\n // pick up folder auth automatically. Mirrors editorActions.createRequest.\n auth: { type: 'inherit' },\n contextVars: [],\n extractions: [],\n assertions: [],\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const requestReadTool: AnyToolDef = {\n name: 'request.read',\n description:\n 'Read a request by id, or list summaries (id, name, method, url) when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const req = state.synced.collections.requests[input.id];\n if (!req) return { found: false };\n return { found: true, request: req };\n }\n const list = Object.values(state.synced.collections.requests).map((r) => ({\n id: r.id,\n name: r.name,\n method: r.method,\n url: r.url,\n folderId: r.folderId,\n }));\n return { count: list.length, requests: list };\n },\n};\n\nexport const requestUpdateTool: AnyToolDef = {\n name: 'request.update',\n description: 'Patch fields on an existing request.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'request.update',\n id: input.id,\n patch: input.patch as Partial<Omit<ApiRequest, 'id' | 'createdAt'>>,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const requestDeleteTool: AnyToolDef = {\n name: 'request.delete',\n description: 'Delete a request by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'request.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const folderCreateTool: AnyToolDef = {\n name: 'folder.create',\n description:\n 'Create a folder under an optional parent folder. Optionally seed folder-level `auth` so descendants with `auth: inherit` resolve to it immediately — saves a follow-up `folder.update` round-trip.',\n inputSchema: z.object({\n name: z.string().default('New folder'),\n parentId: z.string().nullable().optional(),\n auth: FULL_REQUEST_AUTH.optional(),\n }),\n async handler(input, ctx) {\n const folder: Folder = {\n id: generateId(),\n name: input.name,\n parentId: input.parentId ?? null,\n ...(input.auth ? { auth: input.auth as RequestAuth } : {}),\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n return { id: folder.id, changedIds: out.changedIds };\n },\n};\n\nexport const folderReadTool: AnyToolDef = {\n name: 'folder.read',\n description: 'Read a folder by id, or list all folders when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const folder = state.synced.collections.folders[input.id];\n return folder ? { found: true, folder } : { found: false };\n }\n return {\n count: Object.keys(state.synced.collections.folders).length,\n folders: Object.values(state.synced.collections.folders),\n };\n },\n};\n\nexport const folderUpdateTool: AnyToolDef = {\n name: 'folder.update',\n description:\n 'Update a folder. Supply `parentId` to move it (use `null` for root), `name` to rename, and/or `auth` to set the folder-level auth that descendants inherit when their `auth.type === \"inherit\"`. Set `clearAuth: true` to remove the folder-level auth entirely (descendants then fall through to the next ancestor). The `auth` field accepts any of the 17 RequestAuth types — same surface as `request.update`. The simple ones (bearer / basic / api-key / custom-header / none / inherit) are easy to author by hand; OAuth2 / AWS SigV4 / Digest / NTLM / Hawk / JWT Bearer require the full canonical shape (see `RequestAuth` in `@apicircle/shared/types.ts`).',\n inputSchema: z\n .object({\n id: z.string(),\n parentId: z.string().nullable().optional(),\n name: z.string().optional(),\n auth: FULL_REQUEST_AUTH.optional(),\n clearAuth: z.boolean().optional(),\n })\n .refine((v) => !(v.auth !== undefined && v.clearAuth === true), {\n message: 'Pass either `auth` or `clearAuth: true`, not both.',\n }),\n async handler(input, ctx) {\n const changedIds: string[] = [];\n if (input.parentId !== undefined) {\n const out = await ctx.workspace.apply({\n kind: 'folder.move',\n id: input.id,\n newParentId: input.parentId,\n });\n changedIds.push(...out.changedIds);\n }\n const updatePatch: Partial<Pick<Folder, 'name' | 'auth'>> = {};\n if (input.name !== undefined) updatePatch.name = input.name;\n if (input.auth !== undefined) updatePatch.auth = input.auth as RequestAuth;\n else if (input.clearAuth === true) updatePatch.auth = undefined;\n if (input.name !== undefined || input.auth !== undefined || input.clearAuth === true) {\n const out = await ctx.workspace.apply({\n kind: 'folder.update',\n id: input.id,\n patch: updatePatch,\n });\n changedIds.push(...out.changedIds);\n }\n return { changedIds: Array.from(new Set(changedIds)) };\n },\n};\n\nexport const folderDeleteTool: AnyToolDef = {\n name: 'folder.delete',\n description:\n \"Delete a folder. Direct children (sub-folders + requests) are reparented to the deleted folder's parent.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'folder.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Environments\n// ---------------------------------------------------------------------------\n\nconst VARIABLE = z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n});\n\nexport const environmentCreateTool: AnyToolDef = {\n name: 'environment.create',\n description: 'Create a new environment (or upsert one with the same name).',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE).default([]),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const environmentReadTool: AnyToolDef = {\n name: 'environment.read',\n description: 'Read environments — pass `name` for one, or omit for the full list.',\n inputSchema: z.object({ name: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.name) {\n const env = state.synced.environments.items[input.name];\n return env ? { found: true, environment: env } : { found: false };\n }\n return {\n activeName: state.synced.environments.activeName,\n priorityOrder: state.synced.environments.priorityOrder,\n environments: Object.values(state.synced.environments.items),\n };\n },\n};\n\nexport const environmentUpdateTool: AnyToolDef = {\n name: 'environment.update',\n description: 'Replace the variables list of an environment.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.upsert',\n environment: { name: input.name, variables: input.variables },\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentDeleteTool: AnyToolDef = {\n name: 'environment.delete',\n description: 'Delete an environment by name.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'environment.delete', name: input.name });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetActiveTool: AnyToolDef = {\n name: 'environment.set_active',\n description:\n 'Set (or clear) the active environment. Pass `name: null` to deactivate the current environment.',\n inputSchema: z.object({ name: z.string().nullable() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.setActive',\n name: input.name,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetPriorityTool: AnyToolDef = {\n name: 'environment.set_priority',\n description:\n 'Replace the global environment priority order (highest priority first). Strings are interpreted as local env names. To target a linked env, pass `{ kind: \"linked\", linkedWorkspaceId, envName }` instead.',\n inputSchema: z.object({\n order: z.array(\n z.union([\n z.string(),\n z.object({\n kind: z.literal('local'),\n name: z.string(),\n }),\n z.object({\n kind: z.literal('linked'),\n linkedWorkspaceId: z.string(),\n envName: z.string(),\n }),\n ]),\n ),\n }),\n async handler(input, ctx) {\n // Normalize the heterogeneous tool-input array to EnvPriorityRef[].\n // Bare strings are convenience syntax for local envs — the dominant\n // case for MCP callers — so we keep accepting them rather than\n // forcing every caller to spell out `{kind:'local', ...}`.\n const order = (\n input.order as Array<\n | string\n | { kind: 'local'; name: string }\n | { kind: 'linked'; linkedWorkspaceId: string; envName: string }\n >\n ).map((entry) => (typeof entry === 'string' ? { kind: 'local' as const, name: entry } : entry));\n const out = await ctx.workspace.apply({\n kind: 'environment.setPriority',\n order,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentExportTool: AnyToolDef = {\n name: 'environment.export',\n description:\n 'Serialize an environment to a portable JSON string (envelope v2). Encrypted variables now carry their ciphertext, slot label, and per-slot salt — the destination decrypts with its local slot value at request-execute time, matching the Git push/pull contract. The plaintext slot value never leaves the device, but the ciphertext does. v1 envelopes (no ciphertext) still parse on import for back-compat.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const env = state.synced.environments.items[input.name];\n if (!env) return { ok: false as const, error: 'environment not found' as const };\n const payload = {\n apicircleEnvironment: 2 as const,\n name: env.name,\n variables: env.variables.map((v) => {\n if (v.encrypted && v.secretKeyId) {\n const slot = state.synced.secretKeys?.[v.secretKeyId];\n const label = slot?.label ?? v.key;\n const value = typeof v.value === 'string' && v.value.startsWith('enc:') ? v.value : '';\n return {\n key: v.key,\n encrypted: true as const,\n value,\n secretKeyId: v.secretKeyId,\n secret: { label, salt: slot?.salt ?? null },\n };\n }\n return { key: v.key, value: v.value, encrypted: false as const };\n }),\n };\n return { ok: true as const, json: JSON.stringify(payload, null, 2) };\n },\n};\n\nexport const environmentImportTool: AnyToolDef = {\n name: 'environment.import',\n description:\n \"Import an environment from the JSON shape produced by `environment.export`. v2 envelopes carry the row ciphertext + per-slot salt, so the destination decrypts at request-execute time with its local slot value (same model as Git push/pull); when no destination slot matches the source's salt, a new slot is minted via `secretKey.upsert` and surfaced in `mintedSlots` so the caller can provide values via `secret.addLocal`. v1 envelopes carry only metadata, so unmatched rows come back as `pendingBindings` for the caller to prompt-and-bind via `secret.addLocal` + `environment.bindSecret`. Pass `overwrite: true` to replace a same-name destination env.\",\n inputSchema: z.object({\n json: z.string().min(1),\n overwrite: z.boolean().default(false),\n }),\n async handler(input, ctx) {\n let raw: unknown;\n try {\n raw = JSON.parse(input.json);\n } catch {\n return { ok: false as const, error: 'invalid JSON' as const };\n }\n let parsed;\n try {\n parsed = parseApicircleEnvironmentDoc(raw);\n } catch (err) {\n return {\n ok: false as const,\n error: err instanceof Error ? err.message : 'unsupported export shape',\n };\n }\n const state = await ctx.workspace.read();\n if (state.synced.environments.items[parsed.name] && !input.overwrite) {\n return {\n ok: false as const,\n error: 'environment already exists; pass overwrite:true' as const,\n };\n }\n\n // Resolve encrypted hints against the destination vault — same logic\n // as the UI store action so MCP + UI imports stay in lockstep. v2\n // hints with ciphertext + salt may mint slot metadata via a paired\n // `secretKey.upsert` so the receiver's missing-slots gate can fire\n // for the plaintext value. v1 hints fall back to pendingBindings.\n const destSlots = state.synced.secretKeys ?? {};\n const labelToSlotId = new Map<string, string>();\n for (const slot of Object.values(destSlots)) {\n if (!labelToSlotId.has(slot.label)) labelToSlotId.set(slot.label, slot.id);\n }\n\n const resolvedVariables: Environment['variables'] = [];\n const pendingBindings: Array<{ varKey: string; label: string; labelFromFallback: boolean }> =\n [];\n const mintedSlots: Array<{ id: string; label: string; salt: string; createdAt: string }> = [];\n const knownDestIds = new Set(Object.keys(destSlots));\n let hintCursor = 0;\n for (const v of parsed.variables) {\n if (!v.encrypted) {\n resolvedVariables.push(v);\n continue;\n }\n const hint = parsed.encryptedBindingHints[hintCursor];\n hintCursor += 1;\n\n // v2 path — ciphertext + salt are present.\n if (hint && hint.ciphertext && hint.salt) {\n if (hint.originSecretKeyId && destSlots[hint.originSecretKeyId]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n const labelMatch = labelToSlotId.get(hint.label);\n if (labelMatch && destSlots[labelMatch]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: labelMatch });\n continue;\n }\n const mintedId =\n hint.originSecretKeyId && !knownDestIds.has(hint.originSecretKeyId)\n ? hint.originSecretKeyId\n : generateId();\n knownDestIds.add(mintedId);\n if (!labelToSlotId.has(hint.label)) labelToSlotId.set(hint.label, mintedId);\n mintedSlots.push({\n id: mintedId,\n label: hint.label,\n salt: hint.salt,\n createdAt: new Date().toISOString(),\n });\n resolvedVariables.push({ ...v, secretKeyId: mintedId });\n continue;\n }\n\n // v1 path — metadata only.\n if (hint?.originSecretKeyId && destSlots[hint.originSecretKeyId]) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n if (hint?.label) {\n const matchId = labelToSlotId.get(hint.label);\n if (matchId) {\n resolvedVariables.push({ ...v, secretKeyId: matchId });\n continue;\n }\n }\n resolvedVariables.push(v);\n if (hint) {\n pendingBindings.push({\n varKey: hint.varKey,\n label: hint.label,\n labelFromFallback: hint.labelFromFallback,\n });\n }\n }\n\n // Mint slot metadata BEFORE the environment so the row's\n // secretKeyIds always point at a real slot the resolver knows about.\n for (const meta of mintedSlots) {\n await ctx.workspace.apply({ kind: 'secretKey.upsert', meta });\n }\n\n const env: Environment = { name: parsed.name, variables: resolvedVariables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return {\n ok: true as const,\n name: env.name,\n changedIds: out.changedIds,\n pendingBindings,\n mintedSlots: mintedSlots.map((s) => ({ id: s.id, label: s.label })),\n warnings: parsed.warnings,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Execution plans\n// ---------------------------------------------------------------------------\n\nconst PLAN_STEP = z.object({\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n});\n\nexport const planCreateTool: AnyToolDef = {\n name: 'plan.create',\n description: 'Create a new execution plan (sequence of request steps).',\n inputSchema: z.object({\n name: z.string().default('New plan'),\n steps: z.array(PLAN_STEP).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.steps,\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { id, changedIds: out.changedIds };\n },\n};\n\nexport const planReadTool: AnyToolDef = {\n name: 'plan.read',\n description: 'Read a plan by id, or list all plans when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const plan = state.local.executionPlans[input.id];\n return plan ? { found: true, plan } : { found: false };\n }\n return {\n count: Object.keys(state.local.executionPlans).length,\n plans: Object.values(state.local.executionPlans),\n };\n },\n};\n\nexport const planUpdateTool: AnyToolDef = {\n name: 'plan.update',\n description: 'Patch fields on an existing plan.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n steps: z.array(PLAN_STEP).optional(),\n envPriorityOrder: z.array(z.string()).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.local.executionPlans[input.id];\n if (!existing) return { changedIds: [] };\n const merged: ExecutionPlan = {\n ...existing,\n ...input.patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan: merged });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const planDeleteTool: AnyToolDef = {\n name: 'plan.delete',\n description: 'Delete a plan by id. Drops history rows referencing this plan.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'plan.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// Granular plan-step operations. Each fetches the plan, mutates the steps\n// array, and writes the whole plan back via `plan.upsert` — keeping\n// applyMutation patches as the single source of truth.\n\nexport const planAddStepTool: AnyToolDef = {\n name: 'plan.add_step',\n description:\n 'Append a step to an execution plan. Optional `position` (0-based) inserts at that index instead.',\n inputSchema: z.object({\n planId: z.string(),\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n position: z.number().int().nonnegative().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const step = {\n requestId: input.requestId,\n ...(input.linkedWorkspaceId ? { linkedWorkspaceId: input.linkedWorkspaceId } : {}),\n };\n const steps = [...plan.steps];\n if (input.position !== undefined && input.position <= steps.length) {\n steps.splice(input.position, 0, step);\n } else {\n steps.push(step);\n }\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRemoveStepTool: AnyToolDef = {\n name: 'plan.remove_step',\n description: 'Remove a step from a plan by 0-based index.',\n inputSchema: z.object({\n planId: z.string(),\n index: z.number().int().nonnegative(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.index >= plan.steps.length) {\n return { ok: false as const, error: 'index out of range' as const };\n }\n const steps = plan.steps.filter((_, i) => i !== input.index);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planReorderStepsTool: AnyToolDef = {\n name: 'plan.reorder_steps',\n description:\n 'Replace the plan steps with a new permutation. The supplied indices must reference valid current step indices.',\n inputSchema: z.object({\n planId: z.string(),\n order: z.array(z.number().int().nonnegative()),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.order.length !== plan.steps.length) {\n return { ok: false as const, error: 'order length must equal step count' as const };\n }\n const order: number[] = input.order;\n const seen = new Set(order);\n if (seen.size !== order.length || order.some((i: number) => i >= plan.steps.length)) {\n return { ok: false as const, error: 'order must be a permutation of step indices' as const };\n }\n const steps = order.map((i: number) => plan.steps[i]);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PLAN_VARIABLE = z.object({ key: z.string(), value: z.string() });\n\nexport const planSetVariablesTool: AnyToolDef = {\n name: 'plan.set_variables',\n description:\n 'Replace the plan-scoped variables. These live highest-priority during plan runs (above environment vars, below context vars).',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(PLAN_VARIABLE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRunTool: AnyToolDef = {\n name: 'plan.run',\n description:\n 'Run a plan headlessly (server-side). Currently returns a not-implemented marker — full execution requires the Desktop or browser runtime which the MCP host does not own. The Desktop integration overrides this tool with a real runner.',\n inputSchema: z.object({\n id: z.string(),\n withAssertions: z.boolean().default(true),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.id];\n if (!plan) return { ok: false, error: 'plan not found' };\n return {\n ok: false,\n error:\n 'Plan execution is only available in the Desktop app (or once a hosted runtime is wired). The plan exists and is ready to run from the UI.',\n planId: plan.id,\n stepCount: plan.steps.length,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Assertions\n// ---------------------------------------------------------------------------\n\nconst ASSERTION = z.object({\n id: z.string().optional(),\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nexport const assertionCreateTool: AnyToolDef = {\n name: 'assertion.create',\n description: 'Add an assertion to a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION,\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: input.assertion.id ?? generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const assertionReadTool: AnyToolDef = {\n name: 'assertion.read',\n description: 'List assertions for a request, or fetch a single assertion by id.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { found: false };\n if (input.assertionId) {\n const a = req.assertions.find((x) => x.id === input.assertionId);\n return a ? { found: true, assertion: a } : { found: false };\n }\n return { count: req.assertions.length, assertions: req.assertions };\n },\n};\n\nexport const assertionUpdateTool: AnyToolDef = {\n name: 'assertion.update',\n description: 'Replace an existing assertion (matched by `assertion.id`).',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION.required({ id: true }),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion: input.assertion as Assertion,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const assertionDeleteTool: AnyToolDef = {\n name: 'assertion.delete',\n description: 'Remove an assertion from a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.delete',\n requestId: input.requestId,\n assertionId: input.assertionId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workspace bulk read / write\n// ---------------------------------------------------------------------------\n\nexport const workspaceReadTool: AnyToolDef = {\n name: 'workspace.read',\n description:\n 'Return the full `{ synced, local }` workspace pair. Pass `workspaceId` to scope to a specific ' +\n 'workspace when multiple are registered (call `workspace.list` first to discover ids). When ' +\n 'omitted and multiple workspaces exist, the response is a structured \"multiple workspaces found\" ' +\n 'envelope listing each summary so the AI can clarify before drilling in. Use sparingly — ' +\n 'entity-specific tools are more efficient for small reads.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe(\n 'Optional workspace id (from `workspace.list`). Omit to read the active workspace; the ' +\n 'tool will switch to the \"multiple workspaces\" envelope when ambiguous.',\n ),\n }),\n async handler(input, ctx) {\n if (input.workspaceId) {\n const provider = ctx.workspaces.for(input.workspaceId);\n const state = await provider.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n }\n const summaries = await ctx.workspaces.list();\n if (summaries.length > 1) {\n return {\n kind: 'multiple-workspaces' as const,\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n hint:\n `Found ${summaries.length} workspaces. Re-call \\`workspace.read\\` with \\`workspaceId\\` set ` +\n 'to the desired entry, or call entity-specific tools (which default to the active workspace) ' +\n 'when scoping to one workspace is acceptable.',\n };\n }\n const state = await ctx.workspace.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n },\n};\n\nexport const workspaceWriteTool: AnyToolDef = {\n name: 'workspace.write',\n description:\n 'Bulk-replace the workspace. Pass `synced` and/or `local` to overwrite either side. Use ' +\n '`workspaceId` to target a non-active workspace (omit to write the active one). Mutating tools ' +\n 'are preferred — this is for full-doc imports/exports.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe('Optional workspace id; omit to write the active workspace.'),\n synced: z.unknown().optional(),\n local: z.unknown().optional(),\n }),\n async handler(input, ctx) {\n const provider = input.workspaceId ? ctx.workspaces.for(input.workspaceId) : ctx.workspace;\n const next = await provider.write({\n synced: input.synced as Parameters<typeof provider.write>[0]['synced'],\n local: input.local as Parameters<typeof provider.write>[0]['local'],\n });\n return { workspaceId: next.synced.workspaceId, ok: true };\n },\n};\n","// MCP tools for the `apicircle.folder/v1` exchange format.\n//\n// • `folder.export_json` — collect a self-contained JSON envelope for\n// a folder + its subtree. Embeds Global Asset dependencies (JSON\n// Schemas + GraphQL definitions) and captures file-asset metadata.\n// Auth credentials are REDACTED by default — callers opt in per\n// credential id via `includeCredentialIds`.\n//\n// • `folder.import_json` — parse an envelope produced by\n// `folder.export_json` (or the in-app Export Folder modal) and graft\n// it into the active workspace under the requested parent folder.\n// Routes through the `folder.import_apicircle` patch on\n// `WorkspaceProvider.apply`, so the same name-uniquify + dependency\n// dedupe semantics apply to every writer (UI / CLI / MCP).\n\nimport { z } from 'zod';\nimport {\n collectFolderExport,\n parseApicircleFolderExport,\n redactFolderExportCredentials,\n serializeFolderExport,\n suggestFolderExportFilename,\n} from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\nexport const folderExportJsonTool: AnyToolDef = {\n name: 'folder.export_json',\n description:\n 'Export an existing folder (and its subtree) to the API Circle exchange JSON format. ' +\n 'Embeds JSON Schema + GraphQL dependencies inline. Auth credentials are redacted by ' +\n 'default — pass `includeCredentialIds` to keep specific fields verbatim (the report from ' +\n '`collectFolderExport` enumerates the available ids).',\n inputSchema: z.object({\n folderId: z.string().min(1, 'folderId is required'),\n /**\n * Subset of credential ids to KEEP in the output. Anything not in\n * this list (and every detected credential when this is empty)\n * gets blanked. Use the report-side ids surfaced by the export\n * report (`<scope>:<ownerId>.<authType>.<field>`).\n */\n includeCredentialIds: z.array(z.string()).optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const collected = collectFolderExport({\n synced: state.synced,\n folderId: input.folderId,\n });\n if (!collected) {\n return {\n error: 'folder_not_found',\n message: `No folder with id \"${input.folderId}\" exists in the active workspace.`,\n };\n }\n const includeIds = new Set<string>(input.includeCredentialIds ?? []);\n const redacted = redactFolderExportCredentials(collected.envelope, includeIds);\n return {\n envelope: redacted,\n json: serializeFolderExport(redacted),\n filename: suggestFolderExportFilename(redacted),\n report: collected.report,\n };\n },\n};\n\nexport const folderImportJsonTool: AnyToolDef = {\n name: 'folder.import_json',\n description:\n 'Import an `apicircle.folder/v1` envelope into the active workspace. Folder + request ' +\n 'ids are reminted, dependency references are remapped, and JSON Schema / GraphQL ' +\n 'definitions that match an existing global asset (by name + content) are reused.',\n inputSchema: z.object({\n /** Either a JSON string or the already-parsed envelope object. */\n json: z.string().min(1).optional(),\n envelope: z.record(z.unknown()).optional(),\n parentFolderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n if (!input.json && !input.envelope) {\n return {\n error: 'invalid_input',\n message: 'Pass either `json` (string) or `envelope` (object).',\n };\n }\n const text = input.json !== undefined ? input.json : JSON.stringify(input.envelope);\n let parsed: ReturnType<typeof parseApicircleFolderExport>;\n try {\n parsed = parseApicircleFolderExport(text);\n } catch (err) {\n return {\n error: 'invalid_envelope',\n message: err instanceof Error ? err.message : String(err),\n };\n }\n const out = await ctx.workspace.apply({\n kind: 'folder.import_apicircle',\n parsed,\n parentFolderId: input.parentFolderId ?? null,\n });\n return {\n rootFolderId: parsed.rootFolder.id,\n rootFolderName: parsed.rootFolder.name,\n counts: {\n folders: parsed.subfolders.length + 1,\n requests: parsed.requests.length,\n },\n filesRequiringReattachment: parsed.dependencies.files.map((f) => f.id),\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// History tools — list / get / delete / purge over the local request-run +\n// plan-run buffers. History lives in `WorkspaceLocal`, never pushed to git,\n// so these are local-only mutations.\n// =============================================================================\n\nexport const historyListRunsTool: AnyToolDef = {\n name: 'history.list_runs',\n description:\n 'List request-run history rows in reverse-chronological order. Filter by `requestId`, `ok` (success/failure), or `since`/`until` ISO timestamps. `limit` caps the result set; default 100.',\n inputSchema: z.object({\n requestId: z.string().optional(),\n ok: z.boolean().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n limit: z.number().int().positive().max(500).default(100),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const sinceMs = input.since ? Date.parse(input.since) : -Infinity;\n const untilMs = input.until ? Date.parse(input.until) : Infinity;\n const filtered = state.local.history.requestRuns.filter((r) => {\n if (input.requestId && r.requestId !== input.requestId) return false;\n if (input.ok !== undefined && r.ok !== input.ok) return false;\n const t = Date.parse(r.startedAt);\n if (!Number.isFinite(t)) return true;\n return t >= sinceMs && t <= untilMs;\n });\n // Already stored newest-last in the circular buffer; reverse for display.\n const sorted = [...filtered].sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n const limited = sorted.slice(0, input.limit);\n return {\n total: filtered.length,\n returned: limited.length,\n runs: limited.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n method: r.method,\n url: r.url,\n status: r.status,\n ok: r.ok,\n startedAt: r.startedAt,\n durationMs: r.durationMs,\n })),\n };\n },\n};\n\nexport const historyGetRunTool: AnyToolDef = {\n name: 'history.get_run',\n description: 'Fetch a single history row in full (headers, body preview, assertion results).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const run = state.local.history.requestRuns.find((r) => r.id === input.id);\n if (!run) return { found: false as const };\n return { found: true as const, run };\n },\n};\n\nexport const historyDeleteRunTool: AnyToolDef = {\n name: 'history.delete_run',\n description: 'Delete a single request-run row by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'history.delete_run', runId: input.id });\n return { deleted: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n\nexport const historyPurgeTool: AnyToolDef = {\n name: 'history.purge_by_age',\n description:\n 'Drop every request-run + plan-run older than `olderThanDays` days. Pass 0 to clear all history.',\n inputSchema: z.object({\n olderThanDays: z.number().nonnegative(),\n }),\n async handler(input, ctx) {\n const olderThanMs = input.olderThanDays * 24 * 60 * 60 * 1000;\n const out = await ctx.workspace.apply({ kind: 'history.purge', olderThanMs });\n return { purgedCount: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// codebase.extract_collection — heuristic detector that walks a chunk of\n// source code (passed in by the AI client) and returns candidate request\n// shapes. The MCP host doesn't have filesystem access by itself; this tool\n// lets the AI orchestrate a `read files → extract → confirm with user →\n// import` pipeline.\n//\n// Currently detects:\n// • Express — `app.METHOD(`, `router.METHOD(`\n// • FastAPI — `@app.METHOD(`, `@router.METHOD(`\n// • Spring — `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`,\n// `@PatchMapping`, `@RequestMapping(method=...)`\n// • NestJS — `@Get(`, `@Post(`, `@Put(`, `@Patch(`, `@Delete(`\n//\n// All matches are surfaced as `{ method, path, framework, line }`. The AI\n// then asks the user to confirm and follows up with `request.create` calls.\n// =============================================================================\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];\n\ninterface Candidate {\n method: string;\n path: string;\n framework: 'express' | 'fastapi' | 'nest' | 'spring';\n line: number;\n}\n\nexport const codebaseExtractCollectionTool: AnyToolDef = {\n name: 'codebase.extract_collection',\n description:\n 'Scan source code for HTTP route definitions (Express, FastAPI, NestJS, Spring) and return candidate requests for the user to confirm before import.',\n inputSchema: z.object({\n source: z.string().min(1),\n /** Hint to limit which framework patterns to apply. Empty = try all. */\n frameworks: z.array(z.enum(['express', 'fastapi', 'nest', 'spring'])).default([]),\n }),\n async handler(input) {\n const enabled = new Set(\n input.frameworks.length ? input.frameworks : ['express', 'fastapi', 'nest', 'spring'],\n );\n const candidates: Candidate[] = [];\n const lines = input.source.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (enabled.has('express')) {\n const m =\n /(?:^|[\\s\\b])(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'express',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('fastapi')) {\n const m =\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'fastapi',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('nest')) {\n const m = /@(Get|Post|Put|Patch|Delete|Options|Head)\\s*\\(\\s*['\"`]([^'\"`]*)['\"`]\\s*\\)/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2] || '/',\n framework: 'nest',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('spring')) {\n const verb = /@(Get|Post|Put|Patch|Delete)Mapping\\s*\\(?\\s*['\"`]?([^'\"`)\\s]*)/i.exec(line);\n if (verb && HTTP_METHODS.includes(verb[1].toLowerCase())) {\n candidates.push({\n method: verb[1].toUpperCase(),\n path: verb[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n continue;\n }\n const generic =\n /@RequestMapping\\s*\\(\\s*[^)]*method\\s*=\\s*RequestMethod\\.(GET|POST|PUT|PATCH|DELETE)[^)]*?(?:value|path)?\\s*=?\\s*['\"`]?([^'\"`)\\s,]*)/i.exec(\n line,\n );\n if (generic) {\n candidates.push({\n method: generic[1].toUpperCase(),\n path: generic[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n }\n }\n }\n return { count: candidates.length, candidates };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n Request as ApiRequest,\n RequestAuth,\n RequestBody,\n} from '@apicircle/shared';\nimport {\n generateId,\n makeDefaultMockResponse,\n makeDefaultRequestSchema,\n MAX_RESPONSE_MULTIPLIERS,\n} from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Prompt-driven authoring tools. The AI client converts the user's natural-\n// language request into JSON matching the schemas below; the server validates\n// + persists. The actual NL → JSON conversion happens client-side in the AI's\n// own model, not here.\n// =============================================================================\n\nexport const promptCreateEnvironmentTool: AnyToolDef = {\n name: 'prompt.create_environment',\n description:\n 'Create a new environment from an LLM-shaped JSON envelope. The model produces { name, variables: [{ key, value, encrypted }] }; this tool validates and persists it.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n }),\n ),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreateAssertionTool: AnyToolDef = {\n name: 'prompt.create_assertion',\n description:\n 'Add an assertion to a request from an LLM-shaped JSON envelope. Useful when the user asks \"assert that the response status is 200 and body.id matches\".',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n }),\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreatePlanTool: AnyToolDef = {\n name: 'prompt.create_plan',\n description:\n 'Create an execution plan from an LLM-shaped JSON envelope. The model produces { name, stepRequestIds: [...] } and the tool validates that each id exists in the workspace before persisting.',\n inputSchema: z.object({\n name: z.string(),\n stepRequestIds: z.array(z.string()).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const missing: string[] = [];\n for (const rid of input.stepRequestIds) {\n if (!state.synced.collections.requests[rid]) missing.push(rid);\n }\n if (missing.length) {\n return {\n ok: false,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.stepRequestIds.map((requestId: string) => ({ requestId })),\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { ok: true, id, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Shared schema fragments for the request- and mock-shaped prompt.* tools\n// below. Kept inline (vs imported from crud.ts / mocks.ts) so each prompt.*\n// tool stays a self-contained NL contract — the canonical CRUD schemas can\n// evolve without dragging the prompt surface with them.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nconst HEADER_OR_QUERY = z.object({\n key: z.string(),\n value: z.string(),\n enabled: z.boolean().default(true),\n});\n\nconst REQUEST_BODY = z.object({\n type: z.enum(['none', 'json', 'text', 'xml', 'graphql', 'urlencoded']).default('none'),\n content: z.string().default(''),\n variables: z.string().optional(),\n});\n\n// LLM-friendly auth surface — covers the authoring flows a model can plausibly\n// produce from natural language. OAuth2 / AWS / Hawk / NTLM / JWT are token-\n// state heavy and best authored via the dedicated UI, then patched via\n// `request.update`. Callers needing them should use that path.\nexport const PROMPT_AUTH = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('inherit') }),\n z.object({ type: z.literal('bearer'), token: z.string().default('') }),\n z.object({\n type: z.literal('basic'),\n username: z.string().default(''),\n password: z.string().default(''),\n }),\n z.object({\n type: z.literal('api-key'),\n key: z.string().default(''),\n value: z.string().default(''),\n addTo: z.enum(['header', 'query', 'cookie']).default('header'),\n }),\n z.object({\n type: z.literal('custom-header'),\n key: z.string().default(''),\n value: z.string().default(''),\n }),\n]);\n\nconst PROMPT_ASSERTION = z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nconst VALIDATION_RULE_NL = z.object({\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE_NL = z.object({\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE_NL = z.object({\n name: z.string(),\n enabled: z.boolean().default(true),\n // At least one clause — a no-condition rule is dead (the runtime engine skips\n // clause-less rules), so it never fires (mirrors the VS Code parser's reject).\n when: z.array(CONDITION_CLAUSE_NL).min(1),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER_NL = z.object({\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nconst ENDPOINT_INPUT = z.object({\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n});\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRequestBody(input?: z.infer<typeof REQUEST_BODY>): RequestBody {\n if (!input) return { type: 'none', content: '' };\n const body: RequestBody = { type: input.type, content: input.content };\n if (input.variables !== undefined && input.type === 'graphql') {\n body.variables = input.variables;\n }\n return body;\n}\n\nfunction buildEndpoint(input: z.infer<typeof ENDPOINT_INPUT>): MockEndpoint {\n const response = input.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n const defaultResponse: MockResponseConfig = {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n };\n // Inputs from raw JSON (callers bypassing zod parse) may have these arrays\n // omitted. Treat undefined as empty so the build path never NPEs.\n const validationRules = input.validationRules ?? [];\n const responseRules = input.responseRules ?? [];\n const multipliers = (input.multipliers ?? []).slice(0, MAX_RESPONSE_MULTIPLIERS);\n if (multipliers.length > 0) {\n defaultResponse.multipliers = multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n }));\n }\n return {\n id: generateId(),\n name: input.name ?? `${input.method} ${input.pathPattern}`,\n method: input.method,\n pathPattern: input.pathPattern,\n description: input.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: validationRules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n responseRules: responseRules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: (r.when ?? []).map((c) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n defaultResponse,\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const promptCreateRequestTool: AnyToolDef = {\n name: 'prompt.create_request',\n description:\n 'Create a fully-shaped request from an LLM-shaped JSON envelope: method, url, headers, query params, body, auth, and inline assertions. The model produces a flat object; this tool generates the request id, normalizes auth (defaults to `inherit` so folder auth wins), and persists.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).default([]),\n queryParams: z.array(HEADER_OR_QUERY).default([]),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const auth: RequestAuth = (input.auth ?? { type: 'inherit' }) as RequestAuth;\n const assertions: Array<z.infer<typeof PROMPT_ASSERTION>> = input.assertions ?? [];\n const request: ApiRequest = {\n id: generateId(),\n name: input.name ?? 'New request',\n folderId: input.folderId ?? null,\n method: input.method ?? 'GET',\n url: input.url ?? '',\n headers: input.headers ?? [],\n query: input.queryParams ?? [],\n pathParams: input.pathParams,\n body: buildRequestBody(input.body),\n auth,\n contextVars: [],\n extractions: [],\n assertions: assertions.map((a) => ({ ...a, id: generateId() })),\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptUpdateRequestTool: AnyToolDef = {\n name: 'prompt.update_request',\n description:\n 'Patch an existing request from an LLM-shaped JSON envelope. Provided fields replace the existing values; omitted fields are left untouched. Arrays (headers, queryParams, assertions) are full replacements when supplied. Returns `{ ok: false, error }` when the id does not resolve.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).optional(),\n queryParams: z.array(HEADER_OR_QUERY).optional(),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.collections.requests[input.id]) {\n return { ok: false as const, error: 'request not found' as const };\n }\n const patch: Partial<Omit<ApiRequest, 'id' | 'createdAt'>> = {};\n if (input.patch.name !== undefined) patch.name = input.patch.name;\n if (input.patch.method !== undefined) patch.method = input.patch.method;\n if (input.patch.url !== undefined) patch.url = input.patch.url;\n if (input.patch.folderId !== undefined) patch.folderId = input.patch.folderId ?? null;\n if (input.patch.headers !== undefined) patch.headers = input.patch.headers;\n if (input.patch.queryParams !== undefined) patch.query = input.patch.queryParams;\n if (input.patch.pathParams !== undefined) patch.pathParams = input.patch.pathParams;\n if (input.patch.body !== undefined) patch.body = buildRequestBody(input.patch.body);\n if (input.patch.auth !== undefined) patch.auth = input.patch.auth as RequestAuth;\n if (input.patch.assertions !== undefined) {\n patch.assertions = input.patch.assertions.map((a: z.infer<typeof PROMPT_ASSERTION>) => ({\n ...a,\n id: generateId(),\n }));\n }\n const out = await ctx.workspace.apply({ kind: 'request.update', id: input.id, patch });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\ninterface FolderTreeNode {\n name: string;\n children?: FolderTreeNode[];\n}\n\nconst FOLDER_TREE_NODE: z.ZodType<FolderTreeNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(FOLDER_TREE_NODE).optional(),\n }),\n);\n\nexport const promptCreateFolderTreeTool: AnyToolDef = {\n name: 'prompt.create_folder_tree',\n description:\n 'Create a recursive folder hierarchy from an LLM-shaped JSON envelope. The model produces `{ parentId?, tree: { name, children?: [...] } }` and this tool walks the tree, generating ids and persisting one folder per node. Returns the list of created ids in pre-order.',\n inputSchema: z.object({\n parentId: z.string().nullable().optional(),\n tree: FOLDER_TREE_NODE,\n }),\n async handler(input, ctx) {\n const createdIds: string[] = [];\n const allChangedIds: string[] = [];\n const walk = async (node: FolderTreeNode, parentId: string | null): Promise<void> => {\n const folder: Folder = {\n id: generateId(),\n name: node.name,\n parentId,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n createdIds.push(folder.id);\n allChangedIds.push(...out.changedIds);\n for (const child of node.children ?? []) {\n await walk(child, folder.id);\n }\n };\n await walk(input.tree, input.parentId ?? null);\n return { createdIds, changedIds: allChangedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Plans\n// ---------------------------------------------------------------------------\n\nexport const promptAddPlanStepsTool: AnyToolDef = {\n name: 'prompt.add_plan_steps',\n description:\n 'Append one or more steps to an existing execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, requestIds: [...] }`; each id is validated against the workspace before any step is appended. Order in the input list is preserved.',\n inputSchema: z.object({\n planId: z.string(),\n requestIds: z.array(z.string()).min(1),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const requestIds: string[] = input.requestIds;\n const missing = requestIds.filter((rid) => !state.synced.collections.requests[rid]);\n if (missing.length) {\n return {\n ok: false as const,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const newSteps = requestIds.map((requestId) => ({ requestId }));\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: {\n ...plan,\n steps: [...plan.steps, ...newSteps],\n updatedAt: new Date().toISOString(),\n },\n });\n return { ok: true as const, addedCount: newSteps.length, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetPlanVariablesTool: AnyToolDef = {\n name: 'prompt.set_plan_variables',\n description:\n 'Replace the plan-scoped variables on an execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, variables: [{ key, value }] }`. Empty array clears all plan variables.',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(z.object({ key: z.string(), value: z.string() })),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mocks\n// ---------------------------------------------------------------------------\n\nexport const promptCreateMockServerTool: AnyToolDef = {\n name: 'prompt.create_mock_server',\n description:\n 'Create a manual-mode mock server with optional inline endpoints from an LLM-shaped JSON envelope. The model produces `{ name, defaultPort?, endpoints: [{ method, pathPattern, name?, response?, validationRules?, responseRules?, multiplier? }] }`; this tool generates ids for the server and every endpoint / rule, then persists in one shot.',\n inputSchema: z.object({\n name: z.string().min(1),\n // Mirrors mock.create_manual / mock.start / mock.set_default_port:\n // reject out-of-range ports at the tool boundary so a prompt that\n // returns a stray port (1, 80, 999999) never leaks into the synced doc.\n defaultPort: z.number().int().min(1024).max(65535).nullable().optional(),\n endpoints: z.array(ENDPOINT_INPUT).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const endpointInputs: Array<z.infer<typeof ENDPOINT_INPUT>> = input.endpoints ?? [];\n const endpoints = endpointInputs.map((e) => buildEndpoint(e));\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints },\n endpoints,\n defaultPort: input.defaultPort ?? null,\n cors: { enabled: true, origins: ['*'] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointIds: endpoints.map((e: MockEndpoint) => e.id),\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const promptAddMockEndpointTool: AnyToolDef = {\n name: 'prompt.add_mock_endpoint',\n description:\n 'Append a new endpoint (with optional inline validation rules, response rules, and a single response multiplier) to an existing mock server from an LLM-shaped JSON envelope. All ids are auto-generated; the existing endpoints stay in place.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const endpoint = buildEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointValidationRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_validation_rules',\n description:\n \"Replace an endpoint's validation rules with an LLM-shaped list. Every rule gets a fresh id; the existing rules are dropped. Empty array clears all validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointResponseRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_response_rules',\n description:\n \"Replace an endpoint's conditional response rules with an LLM-shaped list. Rules fire in order, first match wins. Every rule + clause gets a fresh id. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE_NL>) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointMultipliersTool: AnyToolDef = {\n name: 'prompt.set_endpoint_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse with an LLM-shaped list. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Every multiplier gets a fresh id. Empty array clears all. Capped at MAX_RESPONSE_MULTIPLIERS (1) — extra entries are rejected.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER_NL>> = input.multipliers;\n if (multipliers.length > MAX_RESPONSE_MULTIPLIERS) {\n return { ok: false as const, error: 'too many multipliers' as const };\n }\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PARAM_NL = z.object({\n name: z.string(),\n typeHint: z.string().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n example: z.string().optional(),\n});\n\nexport const promptSetEndpointRequestSchemaTool: AnyToolDef = {\n name: 'prompt.set_endpoint_request_schema',\n description:\n \"Declare an endpoint's expected inputs with an LLM-shaped list: path / query / header / cookie params (name + optional typeHint / required / description / example) plus an optional body-shape doc. Every param gets a fresh id; omitted lists are cleared. Documentation-only — it drives the editor UI + OpenAPI export, not runtime gating (use validation rules for that).\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n pathParams: z.array(PARAM_NL).default([]),\n queryParams: z.array(PARAM_NL).default([]),\n headers: z.array(PARAM_NL).default([]),\n cookies: z.array(PARAM_NL).default([]),\n body: z\n .object({ description: z.string().optional(), example: z.string().optional() })\n .optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const toParams = (list: Array<z.infer<typeof PARAM_NL>>) =>\n list.map((p) => ({\n id: generateId(),\n name: p.name,\n typeHint: p.typeHint,\n required: p.required,\n description: p.description,\n example: p.example,\n }));\n const body =\n input.body && (input.body.description || input.body.example) ? input.body : undefined;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestSchema: {\n pathParams: toParams(input.pathParams),\n queryParams: toParams(input.queryParams),\n headers: toParams(input.headers),\n cookies: toParams(input.cookies),\n body,\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { GlobalFileAsset } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Global Assets — File library MCP tools.\n//\n// Files in `synced.globalAssets.files` are the reusable file uploads\n// referenced from request bodies and mock-server responses. Every direct\n// upload in the UI now mints a Global Asset entry, so this catalog is the\n// single inventory point AI clients see when asking \"what files are in\n// the workspace?\".\n//\n// Each asset carries provenance state (workingBranchRef + baseBranchRef)\n// recorded by the push + refresh flows. `globalAssets.files.list`\n// surfaces that state alongside the cross-cutting reference count so a\n// caller can identify orphans, files awaiting the next push, files that\n// merged to base, etc.\n//\n// Note on `globalAssets.files.create`: MCP cannot carry binary bytes, so\n// this tool is metadata-only — it records the file in the registry with\n// an explicit `pendingFromMcp` source marker the desktop / web can use\n// to prompt for the missing bytes. Most MCP clients won't need create;\n// list / update / delete are the common surfaces.\n// =============================================================================\n\nexport type FileAssetState =\n | 'uploading'\n | 'workingOnly'\n | 'merged'\n | 'baseOnly'\n | 'missing'\n | 'diverged';\n\nfunction deriveState(\n asset: Pick<GlobalFileAsset, 'workingBranchRef' | 'baseBranchRef'>,\n hasPendingUpload: boolean,\n): FileAssetState {\n const w = asset.workingBranchRef ?? null;\n const b = asset.baseBranchRef ?? null;\n if (w && b) {\n if (w.blobSha && b.blobSha && w.blobSha !== b.blobSha) return 'diverged';\n return 'merged';\n }\n if (w && !b) return 'workingOnly';\n if (!w && b) return 'baseOnly';\n if (hasPendingUpload) return 'uploading';\n return 'missing';\n}\n\nexport const globalAssetsFilesListTool: AnyToolDef = {\n name: 'assets.list_files',\n description:\n 'List every Global File Asset with its provenance state and reference count. Each entry includes id, name, filename, size, mimeType, sha256, state (uploading | workingOnly | merged | baseOnly | missing | diverged), workingBranchRef, baseBranchRef, and usage { requests, mockEndpoints, total }.',\n inputSchema: z.object({}).strict(),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const files = state.synced.globalAssets.files ?? {};\n const pending = state.local.pendingFileUploads ?? {};\n const usage = state.local.assetUsageIndex ?? {};\n const items = Object.values(files).map((asset) => {\n const hasPending = Boolean(pending[asset.id]);\n const u = usage[asset.id] ?? { requests: [], mockEndpoints: [], total: 0 };\n return {\n id: asset.id,\n name: asset.name,\n description: asset.description ?? null,\n filename: asset.filename,\n size: asset.size,\n mimeType: asset.mimeType,\n sha256: asset.sha256 ?? null,\n state: deriveState(asset, hasPending),\n workingBranchRef: asset.workingBranchRef ?? null,\n baseBranchRef: asset.baseBranchRef ?? null,\n usage: { ...u },\n };\n });\n return { count: items.length, files: items };\n },\n};\n\nexport const globalAssetsFilesCreateTool: AnyToolDef = {\n name: 'assets.create_file',\n description:\n 'Register a Global File Asset entry. Bytes are NOT carried — MCP returns the new asset id and the asset enters the \"missing\" state. The user fills the bytes from the Global Assets panel (a \"Fill bytes\" button surfaces on missing-state assets) which preserves the slot id and queues the bytes for the next push. Use this when an AI client wants to claim an asset slot for a file the user will provide later.',\n inputSchema: z\n .object({\n name: z.string().min(1, 'name is required'),\n description: z.string().optional(),\n filename: z.string().min(1, 'filename is required'),\n size: z.number().int().nonnegative(),\n mimeType: z.string().default('application/octet-stream'),\n sha256: z.string().optional(),\n })\n .strict(),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const file: GlobalFileAsset = {\n id: generateId(),\n name: input.name,\n description: input.description,\n slotId: generateId(),\n filename: input.filename,\n size: input.size,\n mimeType: input.mimeType,\n sha256: input.sha256,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'globalAsset.upsertFile', file });\n return { id: file.id, slotId: file.slotId, changedIds: out.changedIds };\n },\n};\n\nexport const globalAssetsFilesUpdateTool: AnyToolDef = {\n name: 'assets.update_file',\n description:\n 'Rename or re-describe a Global File Asset. Provenance refs (workingBranchRef, baseBranchRef) and binary metadata (slotId, sha256, size, mimeType) are preserved verbatim.',\n inputSchema: z\n .object({\n id: z.string().min(1),\n patch: z\n .object({\n name: z.string().optional(),\n description: z.string().nullable().optional(),\n })\n .strict(),\n })\n .strict(),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.synced.globalAssets.files?.[input.id];\n if (!existing) {\n return { found: false, changedIds: [] };\n }\n const next: GlobalFileAsset = {\n ...existing,\n name: input.patch.name ?? existing.name,\n description:\n input.patch.description === null\n ? undefined\n : (input.patch.description ?? existing.description),\n };\n const out = await ctx.workspace.apply({ kind: 'globalAsset.upsertFile', file: next });\n return { found: true, id: next.id, changedIds: out.changedIds };\n },\n};\n\nexport const globalAssetsFilesDeleteTool: AnyToolDef = {\n name: 'assets.delete_file',\n description:\n 'Delete a Global File Asset. Cascades — every request body and mock-response body that referenced the asset is unbound in the same mutation. The result envelope includes the consumer list that was cleared so the caller can report what changed.',\n inputSchema: z.object({ id: z.string().min(1) }).strict(),\n async handler(input, ctx) {\n // Snapshot the consumer list BEFORE the cascade so the envelope can\n // report what was cleared. Uses the local assetUsageIndex when\n // available, otherwise walks the synced doc directly.\n const before = await ctx.workspace.read();\n const usage = before.local.assetUsageIndex?.[input.id] ?? {\n requests: [],\n mockEndpoints: [],\n total: 0,\n };\n const existing = before.synced.globalAssets.files?.[input.id];\n if (!existing) {\n return { found: false, changedIds: [] };\n }\n const out = await ctx.workspace.apply({ kind: 'globalAsset.removeFile', id: input.id });\n return {\n found: true,\n id: input.id,\n filename: existing.filename,\n unbound: {\n requests: usage.requests,\n mockEndpoints: usage.mockEndpoints,\n total: usage.total,\n },\n changedIds: out.changedIds,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n MockServerSource,\n} from '@apicircle/shared';\nimport {\n generateId,\n makeDefaultMockResponse,\n makeDefaultRequestSchema,\n MAX_RESPONSE_MULTIPLIERS,\n} from '@apicircle/shared';\nimport { parseSourceToEndpoints } from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Mock-server tools. Definitions live in `synced.mockServers` (push to git);\n// `mock.start` / `mock.stop` go through the MockController so the MCP host's\n// environment (Electron main, CLI, hosted) controls the actual lifecycle.\n// =============================================================================\n\nasync function ingestSource(\n source: MockServerSource,\n name: string,\n): Promise<{ mock: MockServer; warnings: string[] }> {\n const { endpoints, warnings } = await parseSourceToEndpoints(source);\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name,\n source,\n endpoints,\n defaultPort: null,\n // Off by default — match UI-created mocks. User opts in via cors.enabled=true\n // after explicitly listing origins (see CorsSection in MockServersPanel).\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n return { mock, warnings };\n}\n\nexport const mockCreateFromOpenApiTool: AnyToolDef = {\n name: 'mock.create_from_openapi',\n description: 'Create a mock server from an OpenAPI / Swagger spec (YAML or JSON).',\n inputSchema: z.object({\n name: z.string(),\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'openapi', spec: input.spec, format: input.format },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromPostmanTool: AnyToolDef = {\n name: 'mock.create_from_postman',\n description: 'Create a mock server from a Postman v2/v2.1 collection.',\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromInsomniaTool: AnyToolDef = {\n name: 'mock.create_from_insomnia',\n description: 'Create a mock server from an Insomnia v4 export.',\n inputSchema: z.object({ name: z.string(), export: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'insomnia', export: input.export },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\n// Postman has its own \"mock collection\" concept — same parser, but we tag\n// the source so the UI can label it differently in the mock list.\nexport const mockImportPostmanMockCollectionTool: AnyToolDef = {\n name: 'mock.import_postman_mock_collection',\n description:\n \"Import a Postman Mock Collection (collections previously hosted on Postman's mock service). Same parser as a regular Postman collection but marked as a mock import.\",\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockListTool: AnyToolDef = {\n name: 'mock.list',\n description:\n 'List all mock servers in the workspace plus their runtime status (running / stopped, port).',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const running = await ctx.mock.list();\n const runningById = new Map(running.map((r) => [r.serverId, r.runtime]));\n const items = Object.values(state.synced.mockServers).map((m) => {\n const runtime = runningById.get(m.id);\n return {\n id: m.id,\n name: m.name,\n endpointCount: m.endpoints.length,\n defaultPort: m.defaultPort,\n running: !!runtime,\n port: runtime?.port ?? null,\n };\n });\n return { count: items.length, mocks: items };\n },\n};\n\nexport const mockStartTool: AnyToolDef = {\n name: 'mock.start',\n description:\n 'Start a mock server by id. Returns the bound port. Errors if the mock is already running or the requested port is in use. Optional `port` (1024-65535) overrides the saved `defaultPort` for this run only — to persist a new default port, use `mock.set_default_port`.',\n inputSchema: z.object({\n id: z.string(),\n // Mirrors the UI 1024-65535 window: <1024 needs OS privileges, and\n // outside that window the runtime would throw INVALID_PORT anyway —\n // surface the rejection at the tool boundary so the client sees a\n // schema error instead of a runtime exception.\n port: z.number().int().min(1024).max(65535).optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n try {\n const result = await ctx.mock.start(mock, { port: input.port });\n return { ok: true, port: result.port, pid: result.pid, startedAt: result.startedAt };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.start failed' };\n }\n },\n};\n\nexport const mockStopTool: AnyToolDef = {\n name: 'mock.stop',\n description: 'Stop a running mock server by id (no-op if not running).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.stop failed' };\n }\n },\n};\n\nexport const mockDeleteTool: AnyToolDef = {\n name: 'mock.delete',\n description: \"Delete a mock server definition. Stops it first if it's running.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n } catch {\n // best-effort stop; deletion proceeds either way\n }\n const out = await ctx.workspace.apply({ kind: 'mock.delete', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n\n// Persist a new `defaultPort` on an existing mock. Mirrors the\n// `setMockServerDefaultPort` store action: integer 1024-65535 or `null`\n// for \"let the runtime pick a free port at next Start\". Does NOT\n// restart a running mock — the new port takes effect on the next\n// `mock.start`. Use this when an AI client wants to pin a port that\n// survives across runs; use `mock.start`'s optional `port` arg when\n// the override should apply to a single run only.\nexport const mockSetDefaultPortTool: AnyToolDef = {\n name: 'mock.set_default_port',\n description:\n \"Persist a new `defaultPort` on an existing mock server. Pass an integer 1024-65535 to pin the port, or `null` for 'pick a free port at next start'. Does NOT restart a running mock — the change takes effect on the next mock.start.\",\n inputSchema: z.object({\n id: z.string(),\n defaultPort: z.number().int().min(1024).max(65535).nullable(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n if (mock.defaultPort === input.defaultPort) {\n // No-op when the value is unchanged. Keeps updatedAt stable so\n // repeated AI-driven calls don't churn the synced doc.\n return { ok: true, defaultPort: mock.defaultPort, changed: false };\n }\n const next: MockServer = {\n ...mock,\n defaultPort: input.defaultPort,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return {\n ok: true,\n defaultPort: input.defaultPort,\n changed: true,\n changedIds: out.changedIds,\n };\n },\n};\n\n// =============================================================================\n// Manual mock construction & endpoint-level CRUD\n// -----------------------------------------------------------------------------\n// `mock.create_manual` mirrors the web UI's \"New mock server\" → manual mode.\n// The endpoint tools below let an MCP client author endpoints + their default\n// responses without needing to round-trip through `workspace.write` with a\n// hand-built blob.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nexport const mockCreateManualTool: AnyToolDef = {\n name: 'mock.create_manual',\n description:\n 'Create an empty manual-mode mock server. Use `mock.add_endpoint` afterward to populate it. CORS defaults to off (same-origin only); enable + list explicit origins via `mock.update_cors` if cross-origin access is needed.',\n inputSchema: z.object({\n name: z.string().min(1),\n // Same 1024-65535 window as mock.start / mock.set_default_port — pin\n // the validation at the tool boundary so a malformed AI call doesn't\n // persist a port the runtime will later reject as INVALID_PORT.\n defaultPort: z.number().int().min(1024).max(65535).nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints: [] },\n endpoints: [],\n defaultPort: input.defaultPort ?? null,\n // Off by default — match UI-created mocks. Caller opts in via\n // explicit origins; we never silently wildcard.\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return { id: mock.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockListEndpointsTool: AnyToolDef = {\n name: 'mock.list_endpoints',\n description: 'List endpoints for a mock server (id, method, path, name).',\n inputSchema: z.object({ mockId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n return {\n ok: true as const,\n count: mock.endpoints.length,\n endpoints: mock.endpoints.map((e) => ({\n id: e.id,\n method: e.method,\n pathPattern: e.pathPattern,\n name: e.name,\n validationCount: e.requestValidation.length,\n responseRuleCount: e.responseRules.length,\n })),\n };\n },\n};\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nfunction buildDefaultEndpoint(args: {\n method: z.infer<typeof HTTP_METHOD>;\n pathPattern: string;\n name?: string;\n description?: string;\n response?: z.infer<typeof ENDPOINT_RESPONSE>;\n}): MockEndpoint {\n const response = args.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n return {\n id: generateId(),\n name: args.name ?? `${args.method} ${args.pathPattern}`,\n method: args.method,\n pathPattern: args.pathPattern,\n description: args.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: [],\n responseRules: [],\n defaultResponse: {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n },\n };\n}\n\nexport const mockAddEndpointTool: AnyToolDef = {\n name: 'mock.add_endpoint',\n description:\n 'Append a new endpoint to a mock server. Defaults to a 200 JSON response of `{}`. Returns the new endpoint id.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const endpoint = buildDefaultEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n // Manual-mode mocks mirror endpoints back into source so the runtime\n // sees the same array regardless of which field it reads.\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockUpdateEndpointTool: AnyToolDef = {\n name: 'mock.update_endpoint',\n description:\n 'Patch fields on a single mock endpoint (method, pathPattern, name, description, defaultResponse status / contentType / json body). Pass only the fields you want to change.',\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n method: HTTP_METHOD.optional(),\n pathPattern: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.partial().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const idx = mock.endpoints.findIndex((e) => e.id === input.endpointId);\n if (idx === -1) return { ok: false, error: 'endpoint not found' as const };\n const existing = mock.endpoints[idx];\n const nextEndpoint: MockEndpoint = {\n ...existing,\n method: input.method ?? existing.method,\n pathPattern: input.pathPattern ?? existing.pathPattern,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n defaultResponse: input.response\n ? {\n ...existing.defaultResponse,\n status: input.response.status ?? existing.defaultResponse.status,\n headers: input.response.contentType\n ? existing.defaultResponse.headers.map((h) =>\n h.key.toLowerCase() === 'content-type'\n ? { ...h, value: input.response!.contentType! }\n : h,\n )\n : existing.defaultResponse.headers,\n body:\n input.response.jsonBody !== undefined\n ? { type: 'json', content: input.response.jsonBody }\n : existing.defaultResponse.body,\n }\n : existing.defaultResponse,\n };\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = nextEndpoint;\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockDeleteEndpointTool: AnyToolDef = {\n name: 'mock.delete_endpoint',\n description: 'Remove an endpoint from a mock server.',\n inputSchema: z.object({ mockId: z.string(), endpointId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const nextEndpoints = mock.endpoints.filter((e) => e.id !== input.endpointId);\n if (nextEndpoints.length === mock.endpoints.length) {\n return { ok: false, error: 'endpoint not found' as const };\n }\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Endpoint rule + multiplier editing\n// -----------------------------------------------------------------------------\n// Validation rules, response rules, and multipliers are all replace-only —\n// MCP clients send the full ordered list, the tool writes it. Granular per-\n// rule mutations would multiply the surface area without adding capability;\n// the MCP client can read, mutate, write back.\n// =============================================================================\n\nconst VALIDATION_RULE = z.object({\n id: z.string().optional(),\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE = z.object({\n id: z.string().optional(),\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE = z.object({\n id: z.string().optional(),\n name: z.string(),\n enabled: z.boolean().default(true),\n // At least one clause — a rule with no `when` is dead (the runtime engine\n // skips clause-less rules), so it can never fire. The VS Code endpoint parser\n // rejects the same shape, keeping the surfaces consistent.\n when: z.array(CONDITION_CLAUSE).min(1),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nfunction defaultJsonResponseConfig(args: { status: number; jsonBody: string }): MockResponseConfig {\n return {\n status: args.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: args.jsonBody },\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport const mockSetValidationRulesTool: AnyToolDef = {\n name: 'mock.set_validation_rules',\n description:\n \"Replace an endpoint's validation rules. Rules without an `id` get a fresh one; existing rules can keep theirs to preserve client-side selection state. Empty array clears all rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: r.id ?? generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: defaultJsonResponseConfig(r.failResponse),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetResponseRulesTool: AnyToolDef = {\n name: 'mock.set_response_rules',\n description:\n \"Replace an endpoint's conditional response rules. Rules fire in order; the first whose every clause matches wins. Disabled rules are skipped. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: r.id ?? generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE>) => ({\n id: c.id ?? generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: defaultJsonResponseConfig(r.response),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PARAM = z.object({\n id: z.string().optional(),\n name: z.string(),\n typeHint: z.string().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n example: z.string().optional(),\n});\n\nconst REQUEST_SCHEMA_BODY = z\n .object({ description: z.string().optional(), example: z.string().optional() })\n .optional();\n\n/** Normalize a body-doc input — drop it entirely when both fields are blank so\n * the projection stays clean (mirrors the VS Code / web editors). */\nfunction normalizeSchemaBody(\n body: z.infer<typeof REQUEST_SCHEMA_BODY>,\n): { description?: string; example?: string } | undefined {\n if (!body || (!body.description && !body.example)) return undefined;\n return body;\n}\n\nexport const mockSetRequestSchemaTool: AnyToolDef = {\n name: 'mock.set_request_schema',\n description:\n \"Replace an endpoint's requestSchema — the declared path / query / header / cookie params plus an optional body-shape doc. Params without an `id` get a fresh one; omitted lists are cleared. Documentation-only (drives the editor UI + OpenAPI export); runtime gating lives in the validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n pathParams: z.array(PARAM).default([]),\n queryParams: z.array(PARAM).default([]),\n headers: z.array(PARAM).default([]),\n cookies: z.array(PARAM).default([]),\n body: REQUEST_SCHEMA_BODY,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const toParams = (list: Array<z.infer<typeof PARAM>>) =>\n list.map((p) => ({\n id: p.id ?? generateId(),\n name: p.name,\n typeHint: p.typeHint,\n required: p.required,\n description: p.description,\n example: p.example,\n }));\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestSchema: {\n pathParams: toParams(input.pathParams),\n queryParams: toParams(input.queryParams),\n headers: toParams(input.headers),\n cookies: toParams(input.cookies),\n body: normalizeSchemaBody(input.body),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetMultipliersTool: AnyToolDef = {\n name: 'mock.set_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Empty array clears all. The list is currently capped at MAX_RESPONSE_MULTIPLIERS (1) — passing more is rejected.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER>> = input.multipliers;\n if (multipliers.length > MAX_RESPONSE_MULTIPLIERS) {\n return { ok: false as const, error: 'too many multipliers' as const };\n }\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: m.id ?? generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport { buildReleaseEntry, sortVersionsDesc } from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Release-ledger tools. Definitions live in `synced.releases.self` (push to\n// git) — the versions that linked consumers pin to. Every write routes through\n// `ctx.workspace.apply` so the same `applyMutation` reducers the UI / CLI /\n// VS Code use stay the single source of truth.\n//\n// `release.publish` is the only async-shaped one: the SHA-256\n// `workspaceSnapshot` is computed by `buildReleaseEntry` against the current\n// synced doc, then the resulting entry is handed to the (pure, sync)\n// `release.publish` patch. Tagging the release on GitHub + managing\n// marketplace topics are deliberately NOT here — those are network operations\n// that belong to the desktop / VS Code Git surfaces.\n// =============================================================================\n\nexport const releaseListTool: AnyToolDef = {\n name: 'release.list',\n description:\n \"List this workspace's published releases (newest first) with their notes, snapshot fingerprint, and deprecated / withdrawn flags. Returns the current version too.\",\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const ledger = state.synced.releases.self;\n if (!ledger) {\n return { currentVersion: null, count: 0, versions: [] };\n }\n const order = sortVersionsDesc(ledger.versions.map((v) => v.version));\n const byVersion = new Map(ledger.versions.map((v) => [v.version, v]));\n const versions = order\n .map((v) => byVersion.get(v))\n .filter((v): v is NonNullable<typeof v> => v !== undefined)\n .map((v) => ({\n version: v.version,\n publishedAt: v.publishedAt,\n notes: v.notes,\n workspaceSnapshot: v.workspaceSnapshot,\n deprecated: v.deprecated,\n yanked: v.yanked,\n ...(v.sha ? { sha: v.sha } : {}),\n ...(v.tagName ? { tagName: v.tagName } : {}),\n }));\n return { currentVersion: ledger.currentVersion, count: versions.length, versions };\n },\n};\n\nexport const releasePublishTool: AnyToolDef = {\n name: 'release.publish',\n description:\n 'Publish a new release of this workspace. Appends a semver version + markdown notes to the ledger and bumps currentVersion. The release is fingerprinted with a SHA-256 of the workspace at publish time. Rejects invalid semver or a duplicate version. Does NOT create a Git tag or GitHub Release.',\n inputSchema: z.object({\n version: z.string().min(1).describe('Semantic version, e.g. \"1.2.0\".'),\n notes: z.string().default('').describe('Markdown release notes.'),\n sha: z.string().optional().describe('Optional source commit SHA for bookkeeping.'),\n tagName: z.string().optional().describe('Optional git tag name for bookkeeping.'),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n let entry;\n try {\n entry = await buildReleaseEntry(state.synced, {\n version: input.version,\n notes: input.notes,\n sha: input.sha,\n tagName: input.tagName,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.publish failed' };\n }\n try {\n const out = await ctx.workspace.apply({ kind: 'release.publish', entry });\n const after = (await ctx.workspace.read()).synced.releases.self;\n return {\n ok: true,\n version: entry.version,\n currentVersion: after?.currentVersion ?? entry.version,\n workspaceSnapshot: entry.workspaceSnapshot,\n changedIds: out.changedIds,\n };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.publish failed' };\n }\n },\n};\n\nexport const releaseDeprecateTool: AnyToolDef = {\n name: 'release.deprecate',\n description:\n 'Mark a published version as deprecated (soft signal). Consumers see a warning but the version stays installable. Errors if the version is unknown or no ledger exists.',\n inputSchema: z.object({ version: z.string().min(1) }),\n async handler(input, ctx) {\n try {\n const out = await ctx.workspace.apply({ kind: 'release.deprecate', version: input.version });\n return { ok: true, version: input.version, changedIds: out.changedIds };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.deprecate failed' };\n }\n },\n};\n\nexport const releaseYankTool: AnyToolDef = {\n name: 'release.yank',\n description:\n 'Withdraw (yank) a published version (hard signal). Consumers are warned the version is broken / unsafe and told to move to a different one. The entry stays in the ledger. Errors if the version is unknown or no ledger exists.',\n inputSchema: z.object({ version: z.string().min(1) }),\n async handler(input, ctx) {\n try {\n const out = await ctx.workspace.apply({ kind: 'release.yank', version: input.version });\n return { ok: true, version: input.version, changedIds: out.changedIds };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'release.yank failed' };\n }\n },\n};\n","import { z } from 'zod';\nimport type { LinkedWorkspace } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Linked-workspace tools — the PURE-DATA half of the link feature\n// (`synced.linkedWorkspaces`). Listing, reading, config edits (pin version,\n// scope, session mode, required keys, marketplace metadata, rename), and\n// unlinking all route through `applyMutation`.\n//\n// Linking a NEW workspace and refreshing the cached ledger / snapshot are\n// network operations (fetch the source repo's `.apicircle/` workspace files over\n// the GitHub API) — those are host-driven (the VS Code commands + desktop UI),\n// not MCP tools, because the MCP server is headless and has no GitHub session.\n// =============================================================================\n\nfunction summarize(link: LinkedWorkspace, currentVersion: string | null) {\n return {\n id: link.id,\n name: link.name,\n kind: link.kind,\n description: link.description,\n source: link.source,\n scope: link.scope,\n pinnedVersion: link.pinnedVersion,\n requiredSecretKeyIds: link.requiredSecretKeyIds,\n marketplace: link.marketplace,\n cachedCurrentVersion: currentVersion,\n };\n}\n\nexport const linkedListTool: AnyToolDef = {\n name: 'linked.list',\n description:\n 'List the workspaces this workspace links to (consumes). Each entry includes its source repo/branch, scope, pinned version, required secret-key ids, and the current version of its cached release ledger.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const links = Object.values(state.synced.linkedWorkspaces);\n return {\n count: links.length,\n links: links.map((l) =>\n summarize(l, state.synced.releases.perLink[l.id]?.currentVersion ?? null),\n ),\n };\n },\n};\n\nexport const linkedGetTool: AnyToolDef = {\n name: 'linked.get',\n description:\n 'Read one linked workspace by id, including its cached release ledger (the versions available to pin to).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n const ledger = state.synced.releases.perLink[input.id] ?? null;\n return {\n ok: true,\n link: summarize(link, ledger?.currentVersion ?? null),\n ledger,\n };\n },\n};\n\nexport const linkedSetConfigTool: AnyToolDef = {\n name: 'linked.set_config',\n description:\n \"Update an existing linked workspace's config: rename, pin/unpin a version (must exist in the cached ledger), set scope, session mode, required secret-key ids, or marketplace metadata. Only supplied fields change. Does NOT fetch from the network.\",\n inputSchema: z.object({\n id: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n pinnedVersion: z.string().nullable().optional().describe('null = unpin (track source HEAD).'),\n scope: z.array(z.enum(['collections', 'environments'])).optional(),\n sessionMode: z.enum(['workspace', 'dedicated']).optional(),\n requiredSecretKeyIds: z.array(z.string()).optional(),\n marketplace: z\n .object({\n listedAs: z.string(),\n tags: z.array(z.string()),\n summary: z.string(),\n })\n .nullable()\n .optional()\n .describe('null = clear marketplace metadata.'),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n\n if (input.pinnedVersion !== undefined && input.pinnedVersion !== null) {\n const cached = state.synced.releases.perLink[input.id]?.versions ?? [];\n if (!cached.some((v) => v.version === input.pinnedVersion)) {\n return {\n ok: false,\n error: `Version ${input.pinnedVersion} is not in the cached ledger — refresh the link first`,\n };\n }\n }\n\n const next: LinkedWorkspace = {\n ...link,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.pinnedVersion !== undefined ? { pinnedVersion: input.pinnedVersion } : {}),\n ...(input.scope !== undefined ? { scope: input.scope } : {}),\n ...(input.requiredSecretKeyIds !== undefined\n ? { requiredSecretKeyIds: input.requiredSecretKeyIds }\n : {}),\n ...(input.sessionMode !== undefined\n ? { source: { ...link.source, sessionMode: input.sessionMode } }\n : {}),\n };\n if (input.marketplace !== undefined) {\n if (input.marketplace === null) {\n delete next.marketplace;\n } else {\n next.marketplace = input.marketplace;\n }\n }\n\n const out = await ctx.workspace.apply({ kind: 'linkedWorkspace.upsert', link: next });\n return {\n ok: true,\n changedIds: out.changedIds,\n link: summarize(next, state.synced.releases.perLink[input.id]?.currentVersion ?? null),\n };\n },\n};\n\nexport const linkedUnlinkTool: AnyToolDef = {\n name: 'linked.unlink',\n description:\n 'Unlink a workspace by id. Removes the link, its cached release ledger, every local override for it, the cached collections/environments snapshot, and any per-link session entry. The source repo is untouched.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.linkedWorkspaces[input.id]) {\n return { ok: false, error: `Linked workspace ${input.id} not found` };\n }\n const out = await ctx.workspace.apply({ kind: 'linkedWorkspace.remove', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport {\n fetchRemoteWorkspaceJson,\n parseLinkedWorkspaceJson,\n buildLinkedSnapshot,\n ledgerFromProbe,\n} from '@apicircle/core';\nimport { generateId, type LinkedWorkspace } from '@apicircle/shared';\nimport { GitHubClient, GitHubError } from '@apicircle/git';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// GitHub network tools — the headless counterpart to the VS Code / Desktop\n// link + tag + topics surfaces. These reach the GitHub REST API via\n// `@apicircle/git` (bundled into the published mcp-server, never a runtime dep)\n// and need a token: the `token` arg, else the `GITHUB_TOKEN` env var. Pure\n// parse + snapshot come from `@apicircle/core`; the resulting writes route\n// through `applyMutation`.\n// =============================================================================\n\nfunction resolveToken(input: string | undefined): string {\n const t = (input ?? process.env.GITHUB_TOKEN ?? '').trim();\n return t;\n}\n\nconst TOKEN_HELP = 'Pass `token`, or set the GITHUB_TOKEN env var on the MCP process.';\n\nexport const linkedLinkTool: AnyToolDef = {\n name: 'linked.link',\n description:\n 'Link a workspace by fetching its `.apicircle/` workspace from GitHub (registry.json → workspace-<id>/workspace.json). Caches the release ledger + a collections/environments snapshot. Needs a token for private repos. ' +\n TOKEN_HELP,\n inputSchema: z.object({\n repoFullName: z.string().describe('owner/name of the source workspace repo.'),\n branch: z.string().default('main'),\n pinnedVersion: z\n .string()\n .nullable()\n .optional()\n .describe('null/omitted = source current version.'),\n kind: z.enum(['private', 'public']).default('private'),\n token: z.string().optional(),\n }),\n async handler(input, ctx) {\n const token = resolveToken(input.token);\n const repoFullName = input.repoFullName.trim();\n if (!repoFullName.includes('/')) return { ok: false, error: 'repoFullName must be owner/name' };\n if (input.kind === 'private' && !token)\n return { ok: false, error: `A token is required for private repos. ${TOKEN_HELP}` };\n const [owner, name] = repoFullName.split('/', 2);\n\n // Reject a duplicate before spending a network round-trip.\n const state = await ctx.workspace.read();\n const dup = Object.values(state.synced.linkedWorkspaces).find(\n (l) => l.source.repoFullName === repoFullName && l.source.branch === input.branch,\n );\n if (dup)\n return { ok: false, error: `Already linked to ${repoFullName}@${input.branch} (${dup.id})` };\n\n const client = new GitHubClient();\n let result: { workspaceId: string; content: string } | { error: string };\n try {\n result = await fetchRemoteWorkspaceJson(async (p) => {\n const f = await client.getContents(token, owner, name, p, input.branch);\n return f?.content ?? null;\n });\n } catch (e) {\n return {\n ok: false,\n error:\n e instanceof GitHubError ? e.message : e instanceof Error ? e.message : 'fetch failed',\n };\n }\n if ('error' in result)\n return { ok: false, error: `${repoFullName}@${input.branch}: ${result.error}` };\n\n const probe = parseLinkedWorkspaceJson(result.content);\n const ledger = ledgerFromProbe(probe);\n const link: LinkedWorkspace = {\n id: generateId(),\n kind: input.kind,\n name: repoFullName,\n sourceWorkspaceId: result.workspaceId,\n source: { provider: 'github', repoFullName, branch: input.branch, sessionMode: 'workspace' },\n scope: ['collections', 'environments'],\n pinnedVersion: input.pinnedVersion ?? ledger.currentVersion,\n updatePolicy: 'manual',\n linkedAt: new Date().toISOString(),\n requiredSecretKeyIds: probe.secretKeys ? Object.keys(probe.secretKeys) : [],\n };\n const snapshot = buildLinkedSnapshot(probe, link) ?? undefined;\n const out = await ctx.workspace.apply({\n kind: 'linkedWorkspace.upsert',\n link,\n ledger,\n ...(snapshot ? { snapshot } : {}),\n });\n return { ok: true, id: link.id, pinnedVersion: link.pinnedVersion, changedIds: out.changedIds };\n },\n};\n\nexport const linkedRefreshTool: AnyToolDef = {\n name: 'linked.refresh',\n description:\n \"Re-pull a linked workspace's cached release ledger (+ bootstrap snapshot if missing) from GitHub. \" +\n TOKEN_HELP,\n inputSchema: z.object({ id: z.string(), token: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const link = state.synced.linkedWorkspaces[input.id];\n if (!link) return { ok: false, error: `Linked workspace ${input.id} not found` };\n const token = resolveToken(input.token);\n if (link.kind === 'private' && !token)\n return { ok: false, error: `A token is required for private links. ${TOKEN_HELP}` };\n const [owner, name] = link.source.repoFullName.split('/', 2);\n const client = new GitHubClient();\n let result: { workspaceId: string; content: string } | { error: string };\n try {\n result = await fetchRemoteWorkspaceJson(async (p) => {\n const f = await client.getContents(token, owner, name, p, link.source.branch);\n return f?.content ?? null;\n });\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'fetch failed' };\n }\n if ('error' in result)\n return {\n ok: false,\n error: `${link.source.repoFullName}@${link.source.branch}: ${result.error}`,\n };\n const probe = parseLinkedWorkspaceJson(result.content);\n const ledger = ledgerFromProbe(probe);\n const needsSnapshot = !state.local.linkedCollections[input.id];\n const snapshot = needsSnapshot ? (buildLinkedSnapshot(probe, link) ?? undefined) : undefined;\n await ctx.workspace.apply({\n kind: 'linkedWorkspace.upsert',\n link,\n ledger,\n ...(snapshot ? { snapshot } : {}),\n });\n return {\n ok: true,\n currentVersion: ledger.currentVersion,\n versionCount: ledger.versions.length,\n };\n },\n};\n\nexport const releaseTagTool: AnyToolDef = {\n name: 'release.tag',\n description:\n \"Create a `v<version>` Git tag (optionally a GitHub Release) on the workspace's own repo. The version should already exist in the release ledger. \" +\n TOKEN_HELP,\n inputSchema: z.object({\n owner: z.string(),\n name: z.string(),\n version: z.string(),\n createGitHubRelease: z.boolean().default(false),\n notes: z.string().optional(),\n overrideExisting: z.boolean().default(false),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token);\n if (!token) return { ok: false, error: `A token is required to tag. ${TOKEN_HELP}` };\n const client = new GitHubClient();\n const tagName = `v${input.version.replace(/^v/, '')}`;\n try {\n const repo = await client.getRepo(token, input.owner, input.name);\n const ref = await client.getRef(token, input.owner, input.name, repo.defaultBranch);\n const existing = await client.getTagSha(token, input.owner, input.name, tagName);\n if (existing !== null) {\n if (!input.overrideExisting) {\n return {\n ok: false,\n error: `Tag ${tagName} already exists at ${existing.slice(0, 7)}. Pass overrideExisting:true to replace.`,\n };\n }\n await client.deleteRef(token, input.owner, input.name, `tags/${tagName}`);\n }\n await client.createTag(token, input.owner, input.name, { tagName, sha: ref.sha });\n let releaseUrl: string | undefined;\n if (input.createGitHubRelease) {\n const release = await client.createRelease(token, input.owner, input.name, {\n tagName,\n releaseName: tagName,\n body: input.notes ?? '',\n });\n releaseUrl = release.htmlUrl;\n }\n return {\n ok: true,\n tagName,\n sha: ref.sha,\n branch: repo.defaultBranch,\n ...(releaseUrl ? { releaseUrl } : {}),\n };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'tag failed' };\n }\n },\n};\n\nexport const marketplaceSearchTool: AnyToolDef = {\n name: 'marketplace.search',\n description:\n 'Search the API Circle marketplace for public workspaces tagged with `apicircle` on GitHub. ' +\n 'Returns up to 30 results sorted by relevance (default), stars, or recent updates. ' +\n 'Token is optional — anonymous browsing is supported (lower rate limits); pass a token to lift them. ' +\n TOKEN_HELP,\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe('Search query — matches repo name, description, and topics. Empty = browse all.'),\n sort: z\n .enum(['best-match', 'stars', 'updated'])\n .default('best-match')\n .describe(\n 'Sort order: best-match (default relevance), stars (most starred first), updated (recently pushed first).',\n ),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token) || null;\n const client = new GitHubClient();\n try {\n const repos = await client.searchMarketplaceRepos(token, input.query, {\n sort: input.sort === 'best-match' ? undefined : input.sort,\n });\n return { ok: true, count: repos.length, results: repos };\n } catch (e) {\n return {\n ok: false,\n error:\n e instanceof GitHubError ? e.message : e instanceof Error ? e.message : 'search failed',\n };\n }\n },\n};\n\nconst TOPIC_RE = /^[a-z0-9][a-z0-9-]*$/;\n\nexport const repoSetTopicsTool: AnyToolDef = {\n name: 'repo.set_topics',\n description:\n \"Replace a repo's topics (the `apicircle` topic is always kept — it drives marketplace discovery). Topics must be lowercase, start with a letter/digit, ≤50 chars, ≤20 total. \" +\n TOKEN_HELP,\n inputSchema: z.object({\n owner: z.string(),\n name: z.string(),\n topics: z.array(z.string()),\n token: z.string().optional(),\n }),\n async handler(input, _ctx) {\n const token = resolveToken(input.token);\n if (!token) return { ok: false, error: `A token is required to set topics. ${TOKEN_HELP}` };\n const requested: string[] = input.topics;\n const normalized = Array.from(\n new Set(['apicircle', ...requested.map((t) => t.trim().toLowerCase()).filter(Boolean)]),\n );\n for (const t of normalized) {\n if (!TOPIC_RE.test(t))\n return {\n ok: false,\n error: `Invalid topic \"${t}\" — lowercase letters/digits/\"-\", starting with a letter or digit.`,\n };\n if (t.length > 50) return { ok: false, error: `Topic \"${t}\" exceeds 50 characters.` };\n }\n if (normalized.length > 20) return { ok: false, error: 'GitHub allows at most 20 topics.' };\n const client = new GitHubClient();\n try {\n const saved = await client.setRepoTopics(token, input.owner, input.name, normalized);\n return { ok: true, topics: saved };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'set topics failed' };\n }\n },\n};\n","// Typed errors for the GitHub REST client. Catching these in the UI lets us\n// drive the right recovery path: scope-missing → \"Update token now?\" modal,\n// rate-limited → \"wait N seconds\" copy, network → \"check your connection,\"\n// unknown 5xx → generic.\n\nexport class GitHubError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = 'GitHubError';\n }\n}\n\nexport class MissingScopeError extends GitHubError {\n /** Scope strings the API said are missing, e.g. ['pull_request']. */\n readonly missingScopes: string[];\n /** Scope strings the token currently grants, parsed from x-oauth-scopes. */\n readonly grantedScopes: string[];\n\n constructor(message: string, status: number, missingScopes: string[], grantedScopes: string[]) {\n super(message, status);\n this.name = 'MissingScopeError';\n this.missingScopes = missingScopes;\n this.grantedScopes = grantedScopes;\n }\n}\n\nexport class RateLimitedError extends GitHubError {\n /** Unix timestamp (ms) when the rate-limit window resets. */\n readonly resetAtMs: number;\n constructor(message: string, status: number, resetAtMs: number) {\n super(message, status);\n this.name = 'RateLimitedError';\n this.resetAtMs = resetAtMs;\n }\n}\n\nexport class UnauthorizedError extends GitHubError {\n constructor(message: string, status: number) {\n super(message, status);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * The fetch was aborted by our own timeout (default 15 s). Surfaced with\n * status 0 because there was no HTTP response. Distinct from a generic\n * `GitHubError(0)` so the UI can render retry-able copy and warn the user\n * that a write may have partially landed on the server.\n */\nexport class TimeoutError extends GitHubError {\n /** Timeout that fired, in ms. Useful for the UI message. */\n readonly timeoutMs: number;\n constructor(message: string, timeoutMs: number) {\n super(message, 0);\n this.name = 'TimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Remote ref moved since we last synced — e.g. someone force-pushed the\n * branch. Thrown by `pushWorkspace` *before* uploading blobs, so the user\n * is steered to refresh first rather than discovering the divergence\n * inside a failed `updateRef`.\n */\nexport class BranchDivergedError extends GitHubError {\n readonly expectedSha: string;\n readonly actualSha: string;\n constructor(message: string, expectedSha: string, actualSha: string) {\n super(message, 0);\n this.name = 'BranchDivergedError';\n this.expectedSha = expectedSha;\n this.actualSha = actualSha;\n }\n}\n","// Tiny GitHub REST client. We avoid pulling in @octokit/* because we only\n// need a handful of endpoints and the typed errors are more important than\n// the breadth of coverage.\n//\n// Token-handling rule: the caller passes the PAT per call. The client never\n// logs it, never stores it, never includes it in error messages. The host\n// (ui-components) is responsible for token storage (Secret Vault).\n\nimport {\n GitHubError,\n MissingScopeError,\n RateLimitedError,\n TimeoutError,\n UnauthorizedError,\n} from './errors';\n\nconst API_BASE = 'https://api.github.com';\nconst LOGIN_BASE = 'https://github.com';\n\nexport interface GitHubViewer {\n login: string;\n id: number;\n name: string | null;\n avatarUrl: string | null;\n}\n\nexport interface ScopeInfo {\n granted: string[];\n acceptedRequired?: string[];\n}\n\nexport interface GitHubRepo {\n /** owner/name, the canonical workspace identifier on GitHub. */\n fullName: string;\n owner: string;\n name: string;\n defaultBranch: string;\n visibility: 'public' | 'private' | 'internal';\n isPrivate: boolean;\n pushable: boolean;\n}\n\nexport interface GitHubBranch {\n name: string;\n commitSha: string;\n}\n\nexport interface GitHubClientOptions {\n /** Override the API base URL (e.g. GitHub Enterprise). */\n baseUrl?: string;\n /**\n * Override the base for `github.com/login/*` OAuth endpoints. Defaults to\n * `https://github.com`. The browser path sets this to a same-origin\n * proxy (e.g. `/_gh-oauth`) because GitHub doesn't send CORS headers on\n * the device-flow endpoints.\n */\n loginBaseUrl?: string;\n /** Inject a custom fetch — used by tests to mock without msw. */\n fetchImpl?: typeof fetch;\n /** Hard timeout per call. Defaults to 15s. */\n timeoutMs?: number;\n}\n\nexport interface GitRef {\n ref: string; // e.g. \"refs/heads/apicircle/payments-a3f9c2\"\n sha: string;\n}\n\nexport interface GitCommitSummary {\n sha: string;\n treeSha: string;\n message: string;\n}\n\nexport interface TreeEntryInput {\n path: string;\n mode?: '100644' | '100755' | '040000' | '160000' | '120000';\n type?: 'blob' | 'tree' | 'commit';\n /** Inline content — used for text files we don't need to base64. */\n content?: string;\n /** Pre-uploaded blob sha — used for binary attachments. */\n sha?: string | null;\n}\n\nexport interface CreatedTree {\n sha: string;\n}\n\nexport interface CreatedCommit {\n sha: string;\n treeSha: string;\n}\n\nexport interface CreatedBlob {\n sha: string;\n size: number;\n}\n\nexport interface PullRequestSummary {\n number: number;\n /** GitHub UI URL (e.g. https://github.com/me/api/pull/12) — what we link to. */\n htmlUrl: string;\n state: 'open' | 'closed';\n title: string;\n}\n\nexport interface MarketplaceRepo {\n fullName: string;\n owner: string;\n name: string;\n description: string;\n topics: string[];\n stargazers: number;\n defaultBranch: string;\n}\n\nexport interface FileContents {\n /** Raw file bytes decoded from GitHub's base64 transport. */\n content: string;\n /** Git blob SHA — used for fast equality checks across pulls. */\n sha: string;\n /** Path returned by GitHub (matches what we requested). */\n path: string;\n size: number;\n}\n\nexport interface BinaryFileContents {\n /** Raw file bytes — used for binary attachments where UTF-8 decoding would corrupt the data. */\n bytes: Uint8Array;\n sha: string;\n path: string;\n size: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\n\ninterface CallOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n body?: unknown;\n signal?: AbortSignal;\n /** Scopes the caller wants verified — surfaced into MissingScopeError. */\n requiredScopes?: string[];\n}\n\nexport class GitHubClient {\n private readonly baseUrl: string;\n private readonly loginBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: GitHubClientOptions = {}) {\n this.baseUrl = opts.baseUrl ?? API_BASE;\n this.loginBaseUrl = (opts.loginBaseUrl ?? LOGIN_BASE).replace(/\\/$/, '');\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /**\n * Fetch the authenticated user. Doubles as a \"verify token\" probe — used\n * by the Secret Vault Sessions tab to refresh the granted-scopes list.\n */\n async getViewer(\n token: string,\n opts: CallOptions = {},\n ): Promise<{\n viewer: GitHubViewer;\n scopes: ScopeInfo;\n }> {\n const { json, response } = await this.call<RawUser>(token, '/user', opts);\n return {\n viewer: {\n login: json.login,\n id: json.id,\n name: json.name ?? null,\n avatarUrl: json.avatar_url ?? null,\n },\n scopes: parseScopes(response.headers),\n };\n }\n\n /**\n * List repositories the authenticated user can access. Used by the repo\n * picker. Capped at 100 sorted by recent push; users with thousands of\n * repos can paginate later.\n */\n async listAccessibleRepos(token: string, opts: CallOptions = {}): Promise<GitHubRepo[]> {\n const { json } = await this.call<RawRepo[]>(\n token,\n '/user/repos?per_page=100&sort=pushed&affiliation=owner,collaborator,organization_member',\n opts,\n );\n return json.map(normalizeRepo);\n }\n\n /**\n * Fetch a specific repo. Validates the user-supplied owner/name pair\n * exists + is accessible, and exposes the default branch.\n */\n async getRepo(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<GitHubRepo> {\n const { json } = await this.call<RawRepo>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}`,\n opts,\n );\n return normalizeRepo(json);\n }\n\n /**\n * Read the head SHA of a branch. Used to seed a new working branch from\n * main before any edits land.\n */\n async getBranchHead(\n token: string,\n owner: string,\n name: string,\n branch: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch> {\n const { json } = await this.call<RawBranch>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/branches/${encodeURIComponent(branch)}`,\n opts,\n );\n return { name: json.name, commitSha: json.commit.sha };\n }\n\n /**\n * List branches on a repo. Used by the Link Workspace repo-browser to\n * populate the branch dropdown after the user picks a repo. Capped at\n * 100 (GitHub's max page size); repos with more branches paginate.\n */\n async listBranches(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch[]> {\n const { json } = await this.call<RawBranch[]>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/branches?per_page=100`,\n opts,\n );\n return json.map((b) => ({ name: b.name, commitSha: b.commit.sha }));\n }\n\n /**\n * Create a new branch ref pointing at `sha`. The auto-branch flow calls\n * this with the head SHA from `getBranchHead(main)`.\n *\n * GitHub returns 422 with \"Reference already exists\" when the branch\n * already exists; that surfaces as a GitHubError(422) so the UI can\n * prompt for a different name.\n */\n async createBranch(\n token: string,\n owner: string,\n name: string,\n branchName: string,\n sha: string,\n opts: CallOptions = {},\n ): Promise<GitHubBranch> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs`,\n {\n ...opts,\n method: 'POST',\n body: { ref: `refs/heads/${branchName}`, sha },\n requiredScopes: ['repo'],\n },\n );\n return { name: branchName, commitSha: json.object.sha };\n }\n\n /**\n * Read a branch ref's current commit SHA. Used at the start of push-to-\n * save to find the parent commit before building the new tree.\n */\n async getRef(\n token: string,\n owner: string,\n name: string,\n branch: string,\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/heads/${encodeURIComponent(branch)}`,\n opts,\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Read a commit's tree SHA. Used so the new tree can be built `base_tree`\n * — every path we don't override is inherited from the parent.\n */\n async getCommit(\n token: string,\n owner: string,\n name: string,\n sha: string,\n opts: CallOptions = {},\n ): Promise<GitCommitSummary> {\n const { json } = await this.call<RawCommit>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/commits/${encodeURIComponent(sha)}`,\n opts,\n );\n return {\n sha: json.sha,\n treeSha: json.tree.sha,\n message: json.message,\n };\n }\n\n /**\n * Upload a blob to the repo and return its SHA. Used by push-to-save\n * (P4.3b) for binary attachments — text files go straight into a tree\n * entry's `content`, but binary bytes have to go through a blob first.\n *\n * `content` is base64 when `encoding === 'base64'`. GitHub stores blobs\n * deduplicated by their git-sha1 (not our sha256), so re-uploading the\n * same bytes is cheap on their side; we save a roundtrip locally by\n * tracking lastPushedBlobSha per slot in a future revision.\n */\n async createBlob(\n token: string,\n owner: string,\n name: string,\n args: { content: string; encoding: 'utf-8' | 'base64' },\n opts: CallOptions = {},\n ): Promise<CreatedBlob> {\n const { json } = await this.call<{ sha: string; size?: number }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/blobs`,\n {\n ...opts,\n method: 'POST',\n body: { content: args.content, encoding: args.encoding },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha, size: json.size ?? 0 };\n }\n\n /**\n * Build a new tree from `entries`, layered over `baseTreeSha`. Entries\n * with `content` are inlined (text path); entries with a pre-uploaded\n * `sha` reference an existing blob (binary path — used by attachments).\n */\n async createTree(\n token: string,\n owner: string,\n name: string,\n args: { baseTreeSha: string; entries: TreeEntryInput[] },\n opts: CallOptions = {},\n ): Promise<CreatedTree> {\n const tree = args.entries.map((e) => ({\n path: e.path,\n mode: e.mode ?? '100644',\n type: e.type ?? 'blob',\n ...(e.content !== undefined ? { content: e.content } : {}),\n ...(e.sha !== undefined ? { sha: e.sha } : {}),\n }));\n const { json } = await this.call<{ sha: string }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/trees`,\n {\n ...opts,\n method: 'POST',\n body: { base_tree: args.baseTreeSha, tree },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha };\n }\n\n /**\n * Create a new commit object pointing at the given tree, with the given\n * parents. Returns the new commit's SHA + the tree it points at.\n */\n async createCommit(\n token: string,\n owner: string,\n name: string,\n args: { message: string; treeSha: string; parents: string[] },\n opts: CallOptions = {},\n ): Promise<CreatedCommit> {\n const { json } = await this.call<RawCommit>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/commits`,\n {\n ...opts,\n method: 'POST',\n body: {\n message: args.message,\n tree: args.treeSha,\n parents: args.parents,\n },\n requiredScopes: ['repo'],\n },\n );\n return { sha: json.sha, treeSha: json.tree.sha };\n }\n\n /**\n * Fast-forward a branch ref to a new commit SHA. Pass `force: true` to\n * skip the FF check (we don't — push-to-save is always FF over the ref\n * we just read with getRef()).\n */\n async updateRef(\n token: string,\n owner: string,\n name: string,\n args: { branch: string; sha: string; force?: boolean },\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/heads/${encodeURIComponent(args.branch)}`,\n {\n ...opts,\n method: 'PATCH',\n body: { sha: args.sha, force: args.force ?? false },\n requiredScopes: ['repo'],\n },\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Search GitHub for public API Circle workspaces. Appends\n * `topic:apicircle` to the user-supplied query so only repos carrying\n * the `apicircle` topic — the topic the Releases & Topics dialog\n * locks onto every workspace repo — surface in results. GitHub\n * matches the bare query against repository name, description, and\n * topics, so category words like `payments` narrow the marketplace by\n * topic. An empty query lists every public API Circle workspace. Top\n * 30 results. Token is optional — anonymous browsing is supported\n * (lower GitHub rate limits apply); pass a PAT when one is available\n * to lift them. `sort` controls ordering: omit for GitHub's\n * best-match relevance, or pass `'stars'` / `'updated'`.\n */\n async searchMarketplaceRepos(\n token: string | null,\n query: string,\n opts: CallOptions & { sort?: 'stars' | 'updated' } = {},\n ): Promise<MarketplaceRepo[]> {\n const { sort, ...callOpts } = opts;\n const fullQuery = `${query.trim()} topic:apicircle`.trim();\n const sortParam = sort ? `&sort=${sort}&order=desc` : '';\n const path = `/search/repositories?q=${encodeURIComponent(fullQuery)}&per_page=30${sortParam}`;\n const { json } = await this.call<{ items?: RawSearchRepo[] }>(token, path, callOpts);\n const items = json.items ?? [];\n return items.map(normalizeMarketplaceRepo);\n }\n\n /**\n * Start GitHub's OAuth Device Flow. Returns a user-facing code the\n * user types into github.com/login/device + a device_code the app\n * polls with. Pure browser-safe: no client_secret involved (device\n * flow is the only OAuth path GitHub supports for public clients).\n *\n * Requires the OAuth App to have \"Enable Device Flow\" turned on in\n * its GitHub settings — surface 400 with `not_supported` to the user\n * if the App owner hasn't done that yet.\n */\n async startDeviceFlow(\n clientId: string,\n scope: string,\n opts: CallOptions = {},\n ): Promise<{\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n }> {\n const url = `${this.loginBaseUrl}/login/device/code`;\n const response = await this.fetchImpl(url, {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify({ client_id: clientId, scope }),\n signal: opts.signal,\n });\n if (!response.ok) {\n throw new GitHubError(\n `Device-flow start failed: HTTP ${response.status}`,\n response.status,\n {},\n );\n }\n const json = (await response.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n error?: string;\n error_description?: string;\n };\n if (json.error) {\n throw new GitHubError(json.error_description ?? json.error, 400, json);\n }\n return {\n deviceCode: json.device_code,\n userCode: json.user_code,\n verificationUri: json.verification_uri,\n expiresIn: json.expires_in,\n interval: json.interval,\n };\n }\n\n /**\n * Poll for the access token after the user has authorized the device\n * code. GitHub returns `authorization_pending` until the user\n * completes the flow, `slow_down` if we polled too fast, then a real\n * token. Caller wraps this in a polling loop bounded by `expiresIn`.\n */\n async pollDeviceToken(\n clientId: string,\n deviceCode: string,\n opts: CallOptions = {},\n ): Promise<\n | { kind: 'pending'; slowDown: boolean }\n | { kind: 'denied'; reason: string }\n | { kind: 'expired' }\n | { kind: 'granted'; accessToken: string; tokenType: string; scope: string }\n > {\n const url = `${this.loginBaseUrl}/login/oauth/access_token`;\n const response = await this.fetchImpl(url, {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n signal: opts.signal,\n });\n const json = (await response.json()) as {\n access_token?: string;\n token_type?: string;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (json.access_token) {\n return {\n kind: 'granted',\n accessToken: json.access_token,\n tokenType: json.token_type ?? 'bearer',\n scope: json.scope ?? '',\n };\n }\n if (json.error === 'authorization_pending') return { kind: 'pending', slowDown: false };\n if (json.error === 'slow_down') return { kind: 'pending', slowDown: true };\n if (json.error === 'expired_token') return { kind: 'expired' };\n if (json.error === 'access_denied')\n return { kind: 'denied', reason: json.error_description ?? 'User denied authorization' };\n // Any other error: throw so the UI surfaces it.\n throw new GitHubError(\n json.error_description ?? json.error ?? 'Device-token poll failed',\n response.status,\n json,\n );\n }\n\n /**\n * Create a lightweight Git tag (a ref under `refs/tags/<name>`) on the\n * given commit SHA. Used by the publish-release flow when the user\n * opts in to \"Create Git tag v<x.y.z>\". Returns the resolved ref.\n *\n * GitHub returns 422 with \"Reference already exists\" when the tag is\n * a duplicate; that surfaces as a GitHubError(422) so the UI can warn\n * the user without ever overwriting an existing tag.\n */\n async createTag(\n token: string,\n owner: string,\n name: string,\n args: { tagName: string; sha: string },\n opts: CallOptions = {},\n ): Promise<GitRef> {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs`,\n {\n ...opts,\n method: 'POST',\n body: { ref: `refs/tags/${args.tagName}`, sha: args.sha },\n requiredScopes: ['repo'],\n },\n );\n return { ref: json.ref, sha: json.object.sha };\n }\n\n /**\n * Compare two commits. Returns the relationship classification GitHub\n * gives us: `ahead` (head is descendant of base), `behind` (base is\n * descendant of head), `identical`, or `diverged` (the two histories\n * share a base but neither contains the other — typical of a force-push\n * that rewrote history under us).\n *\n * Used by the refresh path so we never silently 3-way-merge across a\n * history rewrite — divergence steers the user through an explicit\n * \"history rewritten\" modal instead of corrupting local state.\n */\n async compareCommits(\n token: string,\n owner: string,\n name: string,\n base: string,\n head: string,\n opts: CallOptions = {},\n ): Promise<{\n status: 'ahead' | 'behind' | 'identical' | 'diverged';\n aheadBy: number;\n behindBy: number;\n }> {\n const { json } = await this.call<{\n status: 'ahead' | 'behind' | 'identical' | 'diverged';\n ahead_by: number;\n behind_by: number;\n }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/compare/${encodeURIComponent(\n base,\n )}...${encodeURIComponent(head)}`,\n { ...opts, requiredScopes: ['repo'] },\n );\n return {\n status: json.status,\n aheadBy: json.ahead_by,\n behindBy: json.behind_by,\n };\n }\n\n /**\n * Is `ancestor` reachable from `descendant`? Thin wrapper around\n * `compareCommits` — \"ahead\" or \"identical\" means yes; \"behind\" or\n * \"diverged\" means the histories don't fit, so the answer is no.\n */\n async isAncestor(\n token: string,\n owner: string,\n name: string,\n ancestor: string,\n descendant: string,\n opts: CallOptions = {},\n ): Promise<boolean> {\n if (ancestor === descendant) return true;\n const cmp = await this.compareCommits(token, owner, name, ancestor, descendant, opts);\n return cmp.status === 'ahead' || cmp.status === 'identical';\n }\n\n /**\n * Create a GitHub Release pointing at an existing tag. Used by the\n * publish-release flow when the user opts in to \"Create GitHub\n * Release\". Returns the release's HTML URL so the UI can show a\n * \"Released — view on GitHub\" link.\n *\n * Pass `prerelease: true` for semver pre-release identifiers (e.g.\n * `1.0.0-rc.1`); GitHub's Releases UI flags those distinctly.\n */\n async createRelease(\n token: string,\n owner: string,\n name: string,\n args: {\n tagName: string;\n releaseName?: string;\n body?: string;\n draft?: boolean;\n prerelease?: boolean;\n },\n opts: CallOptions = {},\n ): Promise<{ id: number; htmlUrl: string; tagName: string }> {\n const { json } = await this.call<{\n id: number;\n html_url: string;\n tag_name: string;\n }>(token, `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/releases`, {\n ...opts,\n method: 'POST',\n body: {\n tag_name: args.tagName,\n name: args.releaseName ?? args.tagName,\n body: args.body ?? '',\n draft: args.draft ?? false,\n prerelease: args.prerelease ?? false,\n },\n requiredScopes: ['repo'],\n });\n return { id: json.id, htmlUrl: json.html_url, tagName: json.tag_name };\n }\n\n /**\n * Read a tag ref's current commit SHA. Used by the Release & topics\n * modal to detect whether a tag with the chosen name already exists\n * (so the UI can surface an \"Override existing tag\" toggle instead of\n * silently 422'ing through createTag).\n *\n * Returns `null` when the tag doesn't exist (404). Other failures\n * surface as typed errors.\n */\n async getTagSha(\n token: string,\n owner: string,\n name: string,\n tagName: string,\n opts: CallOptions = {},\n ): Promise<string | null> {\n try {\n const { json } = await this.call<RawRefResponse>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/tags/${encodeURIComponent(tagName)}`,\n opts,\n );\n return json.object.sha;\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Delete a ref. Used to support the \"Override existing tag\" path on\n * the Release & topics modal — we delete the existing tag ref, then\n * createTag against the new SHA. (GitHub doesn't have a single\n * \"force-update tag\" endpoint via the simple refs API.)\n *\n * `ref` is the bare suffix, e.g. `tags/v1.0.0` or `heads/feature-x`.\n */\n async deleteRef(\n token: string,\n owner: string,\n name: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<void> {\n await this.call<unknown>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/git/refs/${ref\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`,\n {\n ...opts,\n method: 'DELETE',\n requiredScopes: ['repo'],\n },\n );\n }\n\n /**\n * Read the repo's current topic list. Topics drive marketplace\n * discoverability — public API Circle workspaces include `apicircle`\n * plus user-chosen category topics.\n *\n * Note: GitHub's topics API uses a custom Accept header, but we treat\n * that as transport detail; the `application/vnd.github.mercy-preview+json`\n * preview is now stable so the default Accept works.\n */\n async listRepoTopics(\n token: string,\n owner: string,\n name: string,\n opts: CallOptions = {},\n ): Promise<string[]> {\n const { json } = await this.call<{ names: string[] }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/topics`,\n opts,\n );\n return Array.isArray(json.names) ? json.names : [];\n }\n\n /**\n * Replace the repo's full topic list. GitHub's `PUT /topics` endpoint\n * is a full replace (not a merge), so the caller must pass the\n * complete desired list. Caps at 20 topics; each must match\n * `^[a-z0-9][a-z0-9-]*$` and be ≤ 50 chars (GitHub enforces this with\n * a 422). Returns the persisted list.\n */\n async setRepoTopics(\n token: string,\n owner: string,\n name: string,\n topics: string[],\n opts: CallOptions = {},\n ): Promise<string[]> {\n const { json } = await this.call<{ names: string[] }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/topics`,\n {\n ...opts,\n method: 'PUT',\n body: { names: topics },\n requiredScopes: ['repo'],\n },\n );\n return Array.isArray(json.names) ? json.names : [];\n }\n\n /**\n * Fetch a single file's contents from a branch / commit. Returns\n * `null` when GitHub answers 404 (file simply doesn't exist on that\n * ref — the common case for the very first pull). Other failures\n * surface as the usual typed errors.\n *\n * Used by the refresh flow to read remote `workspace.json` so the\n * 3-way diff can compare it against the local doc.\n */\n async getContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<FileContents | null> {\n const query = `?ref=${encodeURIComponent(ref)}`;\n try {\n const { json } = await this.call<RawFileContents>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}${query}`,\n opts,\n );\n // GitHub may return an array for directories — we only care about files.\n if (Array.isArray(json) || json.type !== 'file') {\n throw new GitHubError(`Path ${path} is not a file`, 422, json);\n }\n // GitHub wraps base64 in lines of 60 chars + \\n; strip them before decoding.\n const cleaned = json.content.replace(/\\n/g, '');\n const decoded = decodeBase64Utf8(cleaned);\n return { content: decoded, sha: json.sha, path: json.path, size: json.size };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Create or update a file via the Contents API. The killer feature here\n * vs. the git-data flow (createBlob → createTree → createCommit →\n * updateRef) is that this works on **truly empty repos**: GitHub's git\n * database isn't initialized until the first commit lands, so all the\n * `/git/*` endpoints reject with 409 \"Git Repository is empty\" — but\n * `PUT /contents/{path}` atomically initializes the database with a\n * single-file commit on the supplied branch (defaulting to the repo's\n * default branch).\n *\n * Used by the seed-initial-commit flow to bootstrap a freshly-created\n * empty repo with a scaffold `workspace.json`.\n *\n * `contentBase64` must already be base64-encoded — caller chooses the\n * encoder (TextEncoder for UTF-8 strings, raw bytes for binaries).\n */\n async putContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n args: { message: string; contentBase64: string; branch?: string; sha?: string },\n opts: CallOptions = {},\n ): Promise<{ commitSha: string; contentSha: string }> {\n const body: Record<string, unknown> = {\n message: args.message,\n content: args.contentBase64,\n };\n if (args.branch) body.branch = args.branch;\n if (args.sha) body.sha = args.sha;\n const { json } = await this.call<{\n commit: { sha: string };\n content: { sha: string };\n }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`,\n {\n ...opts,\n method: 'PUT',\n body,\n requiredScopes: ['repo'],\n },\n );\n return { commitSha: json.commit.sha, contentSha: json.content.sha };\n }\n\n /**\n * Same as `getContents` but returns the raw bytes instead of UTF-8\n * decoding the file. Used by the refresh flow to pull\n * `.apicircle/workspace-<id>/attachments/<slotId>` blobs into local IDB without\n * mangling binary data through TextDecoder.\n */\n async getBinaryContents(\n token: string,\n owner: string,\n name: string,\n path: string,\n ref: string,\n opts: CallOptions = {},\n ): Promise<BinaryFileContents | null> {\n const query = `?ref=${encodeURIComponent(ref)}`;\n try {\n const { json } = await this.call<RawFileContents>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/contents/${path\n .split('/')\n .map(encodeURIComponent)\n .join('/')}${query}`,\n opts,\n );\n if (Array.isArray(json) || json.type !== 'file') {\n throw new GitHubError(`Path ${path} is not a file`, 422, json);\n }\n const cleaned = json.content.replace(/\\n/g, '');\n const bytes = decodeBase64Bytes(cleaned);\n return { bytes, sha: json.sha, path: json.path, size: json.size };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * Open a pull request from `head` (the working branch) into `base` (the\n * repo's default branch). PR creation needs the `pull_request` scope on\n * top of `repo`; missing-scope errors flow through MissingScopeError so\n * the UI can prompt the user to update the token without losing branch\n * state (Plan §3.7).\n *\n * GitHub returns 422 when:\n * - head/base are equal (nothing to merge)\n * - a PR already exists between this head and base\n * - the head branch doesn't exist\n * All three surface as a plain GitHubError(422); the UI message is\n * picked up from response.body.message.\n */\n /**\n * Fetch a single pull request by number. Used by the refresh flow to\n * detect whether a previously-opened PR has been merged on GitHub —\n * `merged: true` is what triggers the working-branch retirement path.\n *\n * Returns `null` on 404 (PR was deleted or never existed at this number);\n * other failures surface as the usual typed errors.\n */\n async getPullRequest(\n token: string,\n owner: string,\n name: string,\n number: number,\n opts: CallOptions = {},\n ): Promise<{\n number: number;\n htmlUrl: string;\n state: 'open' | 'closed';\n merged: boolean;\n } | null> {\n try {\n const { json } = await this.call<RawPullRequest & { merged?: boolean }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls/${number}`,\n opts,\n );\n return {\n number: json.number,\n htmlUrl: json.html_url,\n state: json.state,\n merged: json.merged === true,\n };\n } catch (err) {\n if (err instanceof GitHubError && err.status === 404) return null;\n throw err;\n }\n }\n\n /**\n * List pull requests on a repo. The capability-probe path uses this with\n * `perPage: 1` to determine whether the token can read PRs (and, by\n * extension on classic PATs, whether it can also create them).\n *\n * Caller declares `requiredScopes` to surface a `MissingScopeError` on\n * 403, so the capability probe can recognise the missing-scope case\n * cleanly vs. transient 5xx/network failures.\n */\n async listPullRequests(\n token: string,\n owner: string,\n name: string,\n args: { perPage?: number; state?: 'open' | 'closed' | 'all' } = {},\n opts: CallOptions = {},\n ): Promise<PullRequestSummary[]> {\n const params = new URLSearchParams();\n params.set('per_page', String(args.perPage ?? 30));\n if (args.state) params.set('state', args.state);\n const { json } = await this.call<RawPullRequest[]>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls?${params.toString()}`,\n {\n ...opts,\n requiredScopes: ['repo', 'pull_request'],\n },\n );\n return json.map((pr) => ({\n number: pr.number,\n htmlUrl: pr.html_url,\n state: pr.state,\n title: pr.title,\n }));\n }\n\n async createPullRequest(\n token: string,\n owner: string,\n name: string,\n args: { title: string; body: string; head: string; base: string; draft?: boolean },\n opts: CallOptions = {},\n ): Promise<PullRequestSummary> {\n const { json } = await this.call<RawPullRequest>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/pulls`,\n {\n ...opts,\n method: 'POST',\n body: {\n title: args.title,\n body: args.body,\n head: args.head,\n base: args.base,\n draft: args.draft ?? false,\n },\n requiredScopes: ['repo', 'pull_request'],\n },\n );\n return {\n number: json.number,\n htmlUrl: json.html_url,\n state: json.state,\n title: json.title,\n };\n }\n\n // --- low-level call ----------------------------------------------------\n\n private async call<T>(\n token: string | null,\n path: string,\n opts: CallOptions = {},\n ): Promise<{ json: T; response: Response }> {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const onExternalAbort = () => controller.abort(opts.signal!.reason);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort(opts.signal.reason);\n else opts.signal.addEventListener('abort', onExternalAbort, { once: true });\n }\n const timeoutHandle = setTimeout(\n () => controller.abort(new Error(`GitHub request timed out after ${this.timeoutMs}ms`)),\n this.timeoutMs,\n );\n\n let response: Response;\n let timedOut = false;\n try {\n response = await this.fetchImpl(url, {\n method: opts.method ?? 'GET',\n headers: {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(opts.body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n cache: 'no-store',\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n // Distinguish *our* timeout from a network error or a caller-aborted\n // request. AbortError + a non-aborted external signal === our timeout.\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const callerAborted = opts.signal?.aborted ?? false;\n if (isAbort && !callerAborted) {\n timedOut = true;\n throw new TimeoutError(\n `GitHub request timed out after ${this.timeoutMs}ms. The write may have partially landed — refresh before retrying.`,\n this.timeoutMs,\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n if (opts.signal) opts.signal.removeEventListener('abort', onExternalAbort);\n // Silence unused-let warning under strict ts; `timedOut` is a marker\n // for callers reading the catch block to follow the flow.\n void timedOut;\n }\n\n if (response.ok) {\n // 204 No Content (and 205 Reset Content) carry an empty body —\n // calling .json() on those throws \"Unexpected end of JSON input\".\n // The caller types the response as `T` so an empty object is the\n // safe sentinel; DELETE-style endpoints either ignore the value\n // or care only about `response.status`.\n if (response.status === 204 || response.status === 205) {\n return { json: {} as T, response };\n }\n const json = (await response.json()) as T;\n return { json, response };\n }\n\n const errBody = await safeReadJson(response);\n throw classifyError(response, errBody, opts.requiredScopes ?? []);\n }\n}\n\n// --- helpers ---------------------------------------------------------------\n\ninterface RawUser {\n login: string;\n id: number;\n name?: string | null;\n avatar_url?: string;\n}\n\ninterface RawRepo {\n full_name: string;\n name: string;\n owner: { login: string };\n default_branch: string;\n visibility?: 'public' | 'private' | 'internal';\n private?: boolean;\n permissions?: { push?: boolean; admin?: boolean };\n}\n\ninterface RawBranch {\n name: string;\n commit: { sha: string };\n}\n\ninterface RawRefResponse {\n ref: string;\n object: { sha: string };\n}\n\ninterface RawCommit {\n sha: string;\n message: string;\n tree: { sha: string };\n parents?: { sha: string }[];\n}\n\ninterface RawPullRequest {\n number: number;\n html_url: string;\n state: 'open' | 'closed';\n title: string;\n}\n\ninterface RawSearchRepo {\n full_name: string;\n name: string;\n owner: { login: string };\n description?: string | null;\n topics?: string[];\n stargazers_count?: number;\n default_branch?: string;\n}\n\nfunction normalizeMarketplaceRepo(raw: RawSearchRepo): MarketplaceRepo {\n return {\n fullName: raw.full_name,\n owner: raw.owner.login,\n name: raw.name,\n description: raw.description ?? '',\n topics: raw.topics ?? [],\n stargazers: raw.stargazers_count ?? 0,\n defaultBranch: raw.default_branch ?? 'main',\n };\n}\n\ninterface RawFileContents {\n type: string;\n content: string;\n sha: string;\n path: string;\n size: number;\n encoding: string;\n}\n\n/**\n * Decode GitHub's base64 file content as UTF-8. Pure — doesn't depend on\n * `Buffer` (we run in browsers + jsdom).\n */\nfunction decodeBase64Utf8(b64: string): string {\n return new TextDecoder('utf-8').decode(decodeBase64Bytes(b64));\n}\n\n/**\n * Decode GitHub's base64 file content into raw bytes. Used for binary\n * attachments where UTF-8 decoding would corrupt the data.\n */\nfunction decodeBase64Bytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\nfunction normalizeRepo(raw: RawRepo): GitHubRepo {\n const visibility: GitHubRepo['visibility'] =\n raw.visibility ?? (raw.private === true ? 'private' : 'public');\n const isPrivate = raw.private ?? visibility !== 'public';\n // `permissions` is only included when the caller is authenticated; absence\n // means we can't push (e.g. listing a public repo through an app token).\n const pushable = raw.permissions?.push === true || raw.permissions?.admin === true;\n return {\n fullName: raw.full_name,\n owner: raw.owner.login,\n name: raw.name,\n defaultBranch: raw.default_branch,\n visibility,\n isPrivate,\n pushable,\n };\n}\n\nfunction parseScopes(headers: Headers): ScopeInfo {\n const raw = headers.get('x-oauth-scopes') ?? '';\n const granted = raw\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const acceptedHeader = headers.get('x-accepted-oauth-scopes') ?? '';\n const acceptedRequired = acceptedHeader\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return acceptedRequired.length > 0 ? { granted, acceptedRequired } : { granted };\n}\n\nfunction classifyError(\n response: Response,\n body: unknown,\n callerRequiredScopes: string[],\n): GitHubError {\n const message = extractMessage(body) ?? response.statusText;\n const status = response.status;\n\n if (status === 401) {\n return new UnauthorizedError(message || 'Unauthorized — token rejected', status);\n }\n\n if (status === 403) {\n // Rate-limited?\n const remaining = response.headers.get('x-ratelimit-remaining');\n const reset = response.headers.get('x-ratelimit-reset');\n if (remaining === '0' && reset) {\n const resetAtMs = Number(reset) * 1000;\n const deltaMs = Math.max(0, resetAtMs - Date.now());\n const totalSeconds = Math.ceil(deltaMs / 1000);\n const human =\n totalSeconds < 60\n ? `${totalSeconds}s`\n : totalSeconds < 3600\n ? `${Math.ceil(totalSeconds / 60)} min`\n : `${Math.ceil(totalSeconds / 3600)} h`;\n return new RateLimitedError(\n `GitHub rate limit reached. Resets in ${human} (at ${new Date(resetAtMs).toISOString()}).`,\n status,\n resetAtMs,\n );\n }\n // Scope-missing?\n const accepted = (response.headers.get('x-accepted-oauth-scopes') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const granted = (response.headers.get('x-oauth-scopes') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const missing =\n accepted.length > 0\n ? accepted.filter((s) => !granted.includes(s))\n : callerRequiredScopes.filter((s) => !granted.includes(s));\n if (missing.length > 0) {\n return new MissingScopeError(\n `GitHub denied this action: missing scopes ${missing.join(', ')}.`,\n status,\n missing,\n granted,\n );\n }\n }\n\n return new GitHubError(message || 'GitHub API call failed', status, body);\n}\n\nfunction extractMessage(body: unknown): string | null {\n if (typeof body === 'object' && body !== null && 'message' in body) {\n const m = body.message;\n if (typeof m === 'string') return m;\n }\n return null;\n}\n\nasync function safeReadJson(response: Response): Promise<unknown> {\n try {\n return (await response.json()) as unknown;\n } catch {\n return null;\n }\n}\n","import type { McpToolName } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\nimport {\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n} from './imports';\nimport { generateCodeTool } from './codegen';\nimport { workspaceListTool } from './workspaceList';\nimport {\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planRunTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n} from './crud';\nimport { folderExportJsonTool, folderImportJsonTool } from './folderExchange';\nimport {\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n} from './history';\nimport { codebaseExtractCollectionTool } from './codebase';\nimport {\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n promptSetEndpointRequestSchemaTool,\n} from './prompt';\nimport {\n globalAssetsFilesCreateTool,\n globalAssetsFilesDeleteTool,\n globalAssetsFilesListTool,\n globalAssetsFilesUpdateTool,\n} from './globalAssets';\nimport {\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockSetRequestSchemaTool,\n mockSetDefaultPortTool,\n mockImportPostmanMockCollectionTool,\n} from './mocks';\nimport {\n releaseListTool,\n releasePublishTool,\n releaseDeprecateTool,\n releaseYankTool,\n} from './releases';\nimport {\n linkedListTool,\n linkedGetTool,\n linkedSetConfigTool,\n linkedUnlinkTool,\n} from './linkedWorkspaces';\nimport {\n linkedLinkTool,\n linkedRefreshTool,\n marketplaceSearchTool,\n releaseTagTool,\n repoSetTopicsTool,\n} from './githubOps';\n\n// Order matches MCP_TOOL_NAMES in `@apicircle/shared/src/mcp.ts`. CI guards\n// drift via the registry test which asserts every catalog entry resolves.\nexport const TOOL_REGISTRY: AnyToolDef[] = [\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n generateCodeTool,\n workspaceListTool,\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n folderExportJsonTool,\n folderImportJsonTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planRunTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n codebaseExtractCollectionTool,\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n promptSetEndpointRequestSchemaTool,\n globalAssetsFilesListTool,\n globalAssetsFilesCreateTool,\n globalAssetsFilesUpdateTool,\n globalAssetsFilesDeleteTool,\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockSetRequestSchemaTool,\n mockSetDefaultPortTool,\n mockImportPostmanMockCollectionTool,\n releaseListTool,\n releasePublishTool,\n releaseDeprecateTool,\n releaseYankTool,\n linkedListTool,\n linkedGetTool,\n linkedSetConfigTool,\n linkedUnlinkTool,\n linkedLinkTool,\n linkedRefreshTool,\n releaseTagTool,\n repoSetTopicsTool,\n marketplaceSearchTool,\n];\n\nexport function getTool(name: McpToolName): AnyToolDef | undefined {\n return TOOL_REGISTRY.find((t) => t.name === name);\n}\n","import type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// Workspaces — multi-workspace surface exposed to tool handlers.\n//\n// Every existing tool consumes `ctx.workspace` (a `WorkspaceProvider` scoped\n// to ONE workspace) and continues to work unchanged. New tools that need to\n// list workspaces or pick a specific one consume `ctx.workspaces` instead.\n//\n// `ctx.workspace` is the *active* workspace's provider — set by the host\n// at construction time and refreshed when `setActive` is called.\n// =============================================================================\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n isActive: boolean;\n /** ISO timestamps surfaced from the on-disk registry entry. */\n createdAt: string;\n lastOpenedAt: string;\n /** Cheap counts populated when the summary is built so AI clients can\n * decide which workspace to drill into without a second tool call.\n * May be `null` if the per-workspace doc couldn't be read. */\n counts: {\n requests: number;\n folders: number;\n environments: number;\n mockServers: number;\n plans: number;\n } | null;\n}\n\nexport interface Workspaces {\n /** Enumerate every workspace + which is currently active. */\n list(): Promise<WorkspaceSummary[]>;\n\n /** Return a `WorkspaceProvider` scoped to a specific workspace id. */\n for(workspaceId: string): WorkspaceProvider;\n\n /** id of the workspace that `ctx.workspace` currently points at. */\n activeId(): string | null;\n\n /** Switch which workspace `ctx.workspace` resolves to. */\n setActive(workspaceId: string): Promise<void>;\n}\n\n/**\n * Trivial single-workspace adapter — wraps an existing `WorkspaceProvider`\n * so legacy single-dir hosts can still answer `list()` and `for()` calls.\n * `list()` returns one entry (the active workspace itself); `for(id)` is a\n * passthrough that asserts the id matches.\n */\nexport class SingleWorkspaceAdapter implements Workspaces {\n constructor(\n private readonly provider: WorkspaceProvider,\n private workspaceId: string | null,\n private readonly displayName: string = 'Workspace',\n ) {}\n\n async list(): Promise<WorkspaceSummary[]> {\n const state = await this.provider.read();\n const s = state.synced;\n const id = s.workspaceId ?? this.workspaceId ?? 'unknown';\n this.workspaceId = id;\n const now = new Date().toISOString();\n return [\n {\n id,\n name: this.displayName,\n isActive: true,\n createdAt: s.meta?.createdAt ?? now,\n lastOpenedAt: s.meta?.updatedAt ?? now,\n counts: s.collections\n ? {\n requests: Object.keys(s.collections.requests ?? {}).length,\n folders: Object.keys(s.collections.folders ?? {}).length,\n environments: Object.keys(s.environments?.items ?? {}).length,\n mockServers: Object.keys(s.mockServers ?? {}).length,\n plans: Object.keys(s.executionPlans ?? {}).length,\n }\n : null,\n },\n ];\n }\n\n for(workspaceId: string): WorkspaceProvider {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return this.provider;\n }\n\n activeId(): string | null {\n return this.workspaceId;\n }\n\n setActive(workspaceId: string): Promise<void> {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return Promise.resolve();\n }\n}\n\nexport class WorkspaceNotFoundError extends Error {\n readonly code = 'workspace-not-found' as const;\n readonly workspaceId: string;\n constructor(workspaceId: string) {\n super(`No workspace with id \"${workspaceId}\" is available on this server.`);\n this.name = 'WorkspaceNotFoundError';\n this.workspaceId = workspaceId;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Pure in-memory provider. Used for unit tests and any programmatic\n * embedding where the consumer already owns workspace state and just\n * wants to drive the MCP tool catalog without disk or IPC.\n */\nexport class InMemoryWorkspaceProvider implements WorkspaceProvider {\n private state: WorkspaceState;\n\n constructor(initial: WorkspaceState) {\n this.state = initial;\n }\n\n async read(): Promise<WorkspaceState> {\n return this.state;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const out = applyMutation(this.state, patch);\n this.state = out.next;\n return { state: this.state, changedIds: out.changedIds };\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n this.state = {\n synced: next.synced ?? this.state.synced,\n local: next.local ?? this.state.local,\n };\n return this.state;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Disk-backed provider used by the standalone CLI and the headless MCP\n * server when launched outside Electron. Each `apply` runs a full\n * load → mutate → save cycle under a `proper-lockfile` advisory lock so\n * concurrent writers (a second CLI invocation, the desktop app on the\n * same workspace) can't clobber each other.\n */\nexport class FileBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir);\n if (!out) {\n throw new Error(`No workspace found at ${this.dir}`);\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(this.dir, async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n });\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged);\n return merged;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// GitBackedWorkspaceProvider — WorkspaceProvider for a `.apicircle/` directory\n// inside a Git repo.\n//\n// Differs from `FileBackedWorkspaceProvider` (which reads workspace.json\n// from the desktop's disk mirror) in one critical way: the synced file is\n// `workspace.json` — the canonical Git-tracked workspace document that lives\n// at `.apicircle/workspace-<id>/workspace.json` in a user's repo (discovered\n// via `.apicircle/registry.json`).\n//\n// This enables the `apicircle-mcp` binary to operate directly on a cloned repo\n// without requiring the desktop app's disk mirror. External AI clients (Codex,\n// Cursor, Claude Code) that point `--workspace` at a repo's `.apicircle/`\n// directory hit this path.\n//\n// Layout (relative to the directory passed in):\n// workspace.json ← WorkspaceSynced (Git-tracked, collaborators share)\n// workspace.local.json ← WorkspaceLocal (gitignored, per-device runtime)\n//\n// Uses the same `proper-lockfile` locking as `FileBackedWorkspaceProvider` via\n// the shared core helpers, with `syncedFilename: 'workspace.json'`.\n// =============================================================================\n\nconst GIT_SYNCED_FILENAME = 'workspace.json';\n\nexport class GitBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir, {\n syncedFilename: GIT_SYNCED_FILENAME,\n allowMissing: true,\n });\n if (!out) {\n throw new Error(\n `No workspace found at ${this.dir}. Expected .apicircle/registry.json and .apicircle/workspace-<id>/workspace.json in the repo.`,\n );\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(\n this.dir,\n async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n },\n { syncedFilename: GIT_SYNCED_FILENAME },\n );\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged, { syncedFilename: GIT_SYNCED_FILENAME });\n return merged;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport {\n loadRegistry,\n loadWorkspaceById,\n saveRegistry,\n setActiveWorkspace as setActiveWorkspaceOnDisk,\n workspaceDirFor,\n type WorkspaceRegistry,\n} from '@apicircle/core/workspace/registry';\nimport { FileBackedWorkspaceProvider } from './FileBackedWorkspaceProvider';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\nimport { WorkspaceNotFoundError, type WorkspaceSummary, type Workspaces } from './Workspaces';\n\n// =============================================================================\n// MultiWorkspaceProvider — `Workspaces` impl backed by a registry root on\n// disk (`<root>/registry.json` + per-id subdirectories). Wraps a\n// `FileBackedWorkspaceProvider` per active id and rebuilds it whenever the\n// active workspace changes.\n//\n// Used by the MCP server when launched against a registry root (the\n// `~/.apicircle/` root). Tools that consume `ctx.workspace`\n// keep working — they always see the current active workspace; tools that\n// consume `ctx.workspaces` can drill into any registered workspace.\n// =============================================================================\n\n/**\n * Lazy `WorkspaceProvider` that re-resolves the active workspace id from\n * `registry.json` on every `read` / `apply` / `write` call.\n *\n * Why this exists: the desktop owns `registry.json`. The user can switch\n * active workspaces in the UI at any time while their AI client's MCP\n * server keeps running. Before this wrapper landed, `MultiWorkspaceProvider`\n * cached the per-id `FileBackedWorkspaceProvider` at `init()` time, so a\n * mid-session workspace switch left the MCP writing to the OLD workspace.\n * Now each call re-reads the registry and routes to whichever id is\n * currently active.\n *\n * Cost: one small JSON file read + a `proper-lockfile` acquire per tool\n * call. The registry is a few hundred bytes; the cost is negligible\n * compared to the patch application itself.\n */\nclass LazyActiveWorkspaceProvider implements WorkspaceProvider {\n constructor(\n private readonly registryRoot: string,\n private readonly onActiveResolved: (workspaceId: string) => void,\n ) {}\n\n private async resolveActive(): Promise<FileBackedWorkspaceProvider> {\n const registry = await loadRegistry(this.registryRoot);\n const activeId = registry?.activeWorkspaceId ?? null;\n if (!activeId) {\n throw new Error(\n 'No active workspace. Open the desktop app at least once, or run `apicircle workspaces create <name>`.',\n );\n }\n this.onActiveResolved(activeId);\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, activeId));\n }\n\n async read(): Promise<WorkspaceState> {\n const provider = await this.resolveActive();\n return provider.read();\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const provider = await this.resolveActive();\n return provider.apply(patch);\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const provider = await this.resolveActive();\n return provider.write(next);\n }\n}\n\nexport class MultiWorkspaceProvider implements Workspaces {\n /** Last-known active workspace id. Refreshed every time the lazy\n * provider resolves; reflects what the most recent operation saw on\n * disk, not a stale boot-time snapshot. */\n private activeWorkspaceId: string | null = null;\n /** The lazy provider tool handlers consume as `ctx.workspace`. Holds a\n * reference back to this instance so each call updates\n * `activeWorkspaceId` for `activeId()` callers + diagnostic logs. */\n private readonly lazyProvider: LazyActiveWorkspaceProvider;\n\n constructor(private readonly registryRoot: string) {\n this.lazyProvider = new LazyActiveWorkspaceProvider(this.registryRoot, (id) => {\n this.activeWorkspaceId = id;\n });\n }\n\n /**\n * Read the registry from disk so the host can log a boot banner. Does\n * NOT cache a per-id provider — each `activeProvider()` call re-reads\n * the registry, so a workspace switch in the desktop is picked up by\n * the next tool call without restarting the MCP server.\n */\n async init(): Promise<WorkspaceRegistry> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n this.activeWorkspaceId = registry.activeWorkspaceId;\n return registry;\n }\n\n /**\n * The provider tool handlers see as `ctx.workspace`. Returns a lazy\n * provider whose `read` / `apply` / `write` calls re-read\n * `registry.json` so the right active workspace is always targeted\n * even if the desktop switched workspaces since this MCP process\n * started.\n */\n activeProvider(): WorkspaceProvider {\n return this.lazyProvider;\n }\n\n // ─── Workspaces interface ──────────────────────────────────────────────────\n\n async list(): Promise<WorkspaceSummary[]> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n const out: WorkspaceSummary[] = [];\n for (const entry of registry.workspaces) {\n let counts: WorkspaceSummary['counts'] = null;\n try {\n const state = await loadWorkspaceById(this.registryRoot, entry.id);\n if (state?.synced?.collections) {\n const s = state.synced;\n counts = {\n requests: Object.keys(s.collections.requests ?? {}).length,\n folders: Object.keys(s.collections.folders ?? {}).length,\n environments: Object.keys(s.environments?.items ?? {}).length,\n mockServers: Object.keys(s.mockServers ?? {}).length,\n plans: Object.keys(s.executionPlans ?? {}).length,\n };\n }\n } catch {\n // Treat a missing / unreadable per-workspace file as null counts.\n counts = null;\n }\n out.push({\n id: entry.id,\n name: entry.name,\n isActive: entry.id === registry.activeWorkspaceId,\n createdAt: entry.createdAt,\n lastOpenedAt: entry.lastOpenedAt,\n counts,\n });\n }\n return out;\n }\n\n for(workspaceId: string): WorkspaceProvider {\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n activeId(): string | null {\n return this.activeWorkspaceId;\n }\n\n async setActive(workspaceId: string): Promise<void> {\n const registry = await loadRegistry(this.registryRoot);\n if (!registry || !registry.workspaces.some((w) => w.id === workspaceId)) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n await setActiveWorkspaceOnDisk(this.registryRoot, workspaceId);\n // The lazy provider re-reads `registry.json` on its next operation,\n // so we don't need to construct a new provider here — just update the\n // cached `activeId()` value so diagnostic callers see the new id\n // without waiting for the next tool call.\n this.activeWorkspaceId = workspaceId;\n }\n\n /**\n * Idempotent registry write — used by tests / tools that need to\n * persist registry updates that didn't go through `setActive`. The\n * lazy active provider picks the new id up on its next operation.\n */\n async writeRegistry(registry: WorkspaceRegistry): Promise<void> {\n await saveRegistry(this.registryRoot, registry);\n this.activeWorkspaceId = registry.activeWorkspaceId;\n }\n}\n","import type { MockServer, MockRuntimeEntry } from '@apicircle/shared';\nimport {\n startMockServer,\n stopMockServer,\n type MockServerHandle,\n} from '@apicircle/mock-server-core';\nimport type { MockController, StartMockResult } from './MockController';\n\n/**\n * MockController implementation that owns its mock processes directly via\n * `@apicircle/mock-server-core`. Used by the CLI and any embedder that\n * wants the simplest possible setup. The desktop app supplies a\n * different controller (process-bridge to its main process) so renderer-\n * side state stays consistent.\n */\nexport class InProcessMockController implements MockController {\n private readonly handles = new Map<string, MockServerHandle>();\n private readonly meta = new Map<string, MockRuntimeEntry>();\n\n async start(server: MockServer, opts: { port?: number } = {}): Promise<StartMockResult> {\n if (this.handles.has(server.id)) {\n throw new Error(`Mock '${server.id}' is already running`);\n }\n const handle = await startMockServer(server, {\n port: opts.port ?? server.defaultPort ?? undefined,\n });\n const runtime: MockRuntimeEntry = {\n port: handle.port,\n pid: process.pid,\n startedAt: new Date().toISOString(),\n lastError: null,\n requestCount: 0,\n };\n this.handles.set(server.id, handle);\n this.meta.set(server.id, runtime);\n return { port: handle.port, pid: runtime.pid, startedAt: runtime.startedAt };\n }\n\n async stop(serverId: string): Promise<void> {\n const handle = this.handles.get(serverId);\n if (!handle) return;\n await stopMockServer(handle);\n this.handles.delete(serverId);\n this.meta.delete(serverId);\n }\n\n async list(): Promise<Array<{ serverId: string; runtime: MockRuntimeEntry }>> {\n return Array.from(this.meta.entries()).map(([serverId, runtime]) => ({\n serverId,\n runtime,\n }));\n }\n}\n","import * as path from 'node:path';\n\n// =============================================================================\n// MCP config snippet builder — shared between Desktop and VS Code.\n//\n// External AI clients (Claude Desktop, Cursor, Codex, etc.) launch the\n// `apicircle-mcp` binary themselves as a stdio child process — neither the\n// Desktop app nor the VS Code extension spawns it directly. What both apps\n// DO provide is the exact config snippet the user pastes into the client's\n// config file (JSON for most clients, TOML for Codex, YAML for Continue).\n// This module centralises:\n//\n// • The `AiClient` type + `AI_CLIENTS` runtime allowlist\n// • `buildSnippetVariants(client, binary, workspace)` — forward-slash +\n// escaped renderings (Windows backslash handling)\n// • `resolveAiClientConfigPath(client, env)` — conventional config file\n// path per OS for clients that have one\n//\n// Promoted to `@apicircle/mcp-server` so the VS Code extension (which\n// cannot depend on the workspace-private `@apicircle/ui-components`) and\n// the desktop main process both consume the same logic.\n// =============================================================================\n\nexport type AiClient =\n | 'claude-desktop'\n | 'claude-code'\n | 'codex'\n | 'cursor'\n | 'continue'\n | 'cline'\n | 'zed'\n | 'windsurf'\n | 'github-copilot'\n | 'chatgpt'\n | 'generic';\n\nexport const AI_CLIENTS: readonly AiClient[] = [\n 'claude-desktop',\n 'claude-code',\n 'codex',\n 'cursor',\n 'continue',\n 'cline',\n 'zed',\n 'windsurf',\n 'github-copilot',\n 'chatgpt',\n 'generic',\n] as const;\n\n/**\n * Two byte-identical-but-for-path-escaping renderings of the same snippet.\n *\n * - `forwardSlash`: workspace path uses `/` separators on Windows\n * (`\"C:/Users/.../workspaces\"`). No backslash escapes needed — easier\n * to read, accepted by Node, Electron, and Windows file APIs.\n * - `escaped`: literal OS path. On Windows that means `\\\\` escapes\n * inside quoted strings (JSON and TOML both use `\\` as the escape\n * character).\n *\n * On POSIX both strings are byte-identical and `identical` is `true` — the\n * UI uses that flag to suppress the variant picker.\n */\nexport interface ConfigSnippetVariants {\n forwardSlash: string;\n escaped: string;\n identical: boolean;\n}\n\n/**\n * Build the snippet for a given AI client + workspace path. Most clients\n * use JSON with `mcpServers: { apicircle: ... }`; Codex uses TOML with\n * `[mcp_servers.apicircle]`. The `client` arg selects the format.\n */\nexport function buildSnippetVariants(\n client: AiClient,\n binary: string,\n workspace: string,\n): ConfigSnippetVariants {\n const forwardWorkspace = workspace.replace(/\\\\/g, '/');\n const render = client === 'codex' ? renderTomlSnippet : renderJsonSnippet;\n const escaped = render(binary, workspace);\n const forwardSlash = render(binary, forwardWorkspace);\n return {\n forwardSlash,\n escaped,\n identical: forwardSlash === escaped,\n };\n}\n\nfunction renderJsonSnippet(binary: string, workspace: string): string {\n const entry = {\n command: binary,\n args: ['--workspace', workspace],\n env: { APICIRCLE_WORKSPACE: workspace },\n };\n return JSON.stringify({ mcpServers: { apicircle: entry } }, null, 2);\n}\n\nfunction renderTomlSnippet(binary: string, workspace: string): string {\n const esc = (s: string): string => s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return [\n `[mcp_servers.apicircle]`,\n `command = \"${esc(binary)}\"`,\n `args = [\"--workspace\", \"${esc(workspace)}\"]`,\n ``,\n `[mcp_servers.apicircle.env]`,\n `APICIRCLE_WORKSPACE = \"${esc(workspace)}\"`,\n ].join('\\n');\n}\n\n/**\n * Host-environment shape the config-path resolver depends on. Both the\n * desktop main process and the VS Code extension run on Node — they pass\n * the standard `os.homedir()` / `process.platform` / `process.env.APPDATA`\n * values straight through. Tests pin them explicitly.\n */\nexport interface ConfigPathEnv {\n /** e.g. `os.homedir()` */\n homedir: string;\n /** `process.platform` — one of \"darwin\" / \"win32\" / \"linux\" / ... */\n platform: NodeJS.Platform;\n /** Windows-only: `process.env.APPDATA`, used by Claude Desktop's config. */\n appdata?: string;\n}\n\n/**\n * Conventional path of the config file for each client on the current OS,\n * or `null` if the client has no fixed location (manual paste).\n */\nexport function resolveAiClientConfigPath(client: AiClient, env: ConfigPathEnv): string | null {\n const { homedir, platform, appdata } = env;\n switch (client) {\n case 'claude-desktop':\n if (platform === 'darwin') {\n return path.join(homedir, 'Library/Application Support/Claude/claude_desktop_config.json');\n }\n if (platform === 'win32') {\n return path.join(\n appdata ?? path.join(homedir, 'AppData/Roaming'),\n 'Claude/claude_desktop_config.json',\n );\n }\n return path.join(homedir, '.config/Claude/claude_desktop_config.json');\n case 'claude-code':\n // Claude Code CLI's MCP config lives under `.claude/mcp.json` —\n // same shape as Claude Desktop's mcpServers wrapper. P5R1-G11.\n return path.join(homedir, '.claude/mcp.json');\n case 'cursor':\n return path.join(homedir, '.cursor/mcp.json');\n case 'continue':\n return path.join(homedir, '.continue/config.yaml');\n case 'zed':\n return path.join(homedir, '.config/zed/settings.json');\n case 'windsurf':\n // Windsurf (Codeium IDE) reads MCP servers from\n // `.codeium/windsurf/mcp_config.json` under the user's home. P5R1-G11.\n return path.join(homedir, '.codeium/windsurf/mcp_config.json');\n case 'codex':\n return path.join(homedir, '.codex/config.toml');\n default:\n return null;\n }\n}\n","// Curated starter prompts the user can paste into any MCP-connected AI\n// client to drive their workspace. Each prompt names the MCP tool family\n// it exercises so users can match it back to the tool catalog.\n//\n// Hand-curated, not auto-derived: the goal is to teach the user what's\n// possible, not to enumerate every tool. ~3-4 per category covers the\n// common cases without overwhelming the page.\n//\n// Shared between Desktop/Web (ui-components) and VS Code extension.\n\nexport interface McpPrompt {\n id: string;\n /** Natural-language prompt the user copies. */\n text: string;\n /** Short description rendered under the prompt. */\n description: string;\n /** Which MCP tool family this prompt exercises — used as a filter chip. */\n category: McpPromptCategory;\n /** The MCP tool names this prompt is likely to drive. Informational only. */\n tools: ReadonlyArray<string>;\n}\n\nexport type McpPromptCategory =\n | 'workspaces'\n | 'collections'\n | 'environments'\n | 'execution'\n | 'mocks'\n | 'auth'\n | 'imports';\n\nexport const MCP_PROMPT_CATEGORIES: ReadonlyArray<{\n id: McpPromptCategory;\n label: string;\n}> = [\n { id: 'workspaces', label: 'Workspaces' },\n { id: 'collections', label: 'Collections' },\n { id: 'environments', label: 'Environments' },\n { id: 'execution', label: 'Execution' },\n { id: 'mocks', label: 'Mocks' },\n { id: 'auth', label: 'Auth' },\n { id: 'imports', label: 'Imports' },\n];\n\nexport const MCP_PROMPTS: ReadonlyArray<McpPrompt> = [\n // ── Workspaces (multi-workspace discovery) ───────────────────────\n {\n id: 'list-workspaces',\n text: 'List every API Circle workspace I have and tell me which is active.',\n description:\n 'Multi-workspace discovery — call this first when you are not sure which workspace to drive.',\n category: 'workspaces',\n tools: ['workspace.list'],\n },\n {\n id: 'scope-to-workspace',\n text: 'Read the requests in the \"Petstore\" workspace.',\n description:\n 'Drill into a specific workspace by name; the AI passes `workspaceId` to scope reads.',\n category: 'workspaces',\n tools: ['workspace.list', 'workspace.read'],\n },\n {\n id: 'multi-workspace-summary',\n text: 'Across every workspace, count requests, folders, environments, and mocks. Give me one row per workspace.',\n description:\n 'High-level summary across every registered workspace — pairs well with the multi-workspace envelope.',\n category: 'workspaces',\n tools: ['workspace.list'],\n },\n\n // ── Collections (requests + folders in the active workspace) ─────\n {\n id: 'list-requests',\n text: 'List every request in my API Circle workspace grouped by folder.',\n description: 'Quick overview of the request catalog so you know what is already wired up.',\n category: 'collections',\n tools: ['workspace.read', 'request.read', 'folder.read'],\n },\n {\n id: 'create-request',\n text: 'Add a new GET request named \"Health check\" pointing at https://example.com/healthz with an Accept: application/json header.',\n description: 'Have the AI author a request and persist it to the workspace.',\n category: 'collections',\n tools: ['request.create'],\n },\n {\n id: 'update-request',\n text: 'Find the \"Create user\" request and change its method to POST and body to {\"name\": \"Ada\"}.',\n description: 'Targeted edit by name — the AI looks it up, then updates.',\n category: 'collections',\n tools: ['request.read', 'request.update'],\n },\n {\n id: 'organize-folders',\n text: 'Move every request whose URL contains /users into a folder named \"User API\".',\n description: 'Bulk reorganisation via natural language.',\n category: 'collections',\n tools: ['workspace.read', 'folder.create', 'request.update'],\n },\n\n // ── Environments ──────────────────────────────────────────────────\n {\n id: 'env-list',\n text: 'Show me all environments and which one is active.',\n description: 'Inventory of envs + which is layered onto requests right now.',\n category: 'environments',\n tools: ['environment.read'],\n },\n {\n id: 'env-create',\n text: 'Create a \"staging\" environment with BASE_URL=https://staging.example.com and API_KEY={{SECRET:staging-key}}.',\n description: 'Spin up a new env with both a plain variable and a secret reference.',\n category: 'environments',\n tools: ['environment.create'],\n },\n {\n id: 'env-switch',\n text: 'Switch the active environment to \"production\" and confirm by previewing the effective URL of the \"Get user\" request.',\n description: 'Activate an env then verify variable interpolation.',\n category: 'environments',\n tools: ['environment.update', 'request.read'],\n },\n\n // ── Execution ─────────────────────────────────────────────────────\n {\n id: 'run-request',\n text: 'Run the \"Get user\" request with userId=42 and show me the JSON response.',\n description: 'One-shot execution with overridden context vars.',\n category: 'execution',\n tools: ['request.execute'],\n },\n {\n id: 'run-plan',\n text: 'Execute the \"Regression smoke\" plan and summarise which assertions failed.',\n description: 'Drive a saved execution plan end-to-end.',\n category: 'execution',\n tools: ['plan.read', 'plan.execute'],\n },\n {\n id: 'inspect-history',\n text: 'Show me the last 5 requests I ran and their status codes.',\n description: 'Quick triage when something just broke.',\n category: 'execution',\n tools: ['history.read'],\n },\n\n // ── Mocks ─────────────────────────────────────────────────────────\n {\n id: 'mock-start',\n text: 'Start the \"Petstore\" mock on port 4010 and tell me its base URL.',\n description: 'Spin up a local mock so requests can hit it.',\n category: 'mocks',\n tools: ['mock.list', 'mock.start'],\n },\n {\n id: 'mock-list',\n text: 'List every running mock with its port, served spec, and request count.',\n description: 'Status snapshot of every active mock runtime.',\n category: 'mocks',\n tools: ['mock.list'],\n },\n {\n id: 'mock-stop',\n text: 'Stop every running mock.',\n description: 'Clean shutdown of all mock servers in one go.',\n category: 'mocks',\n tools: ['mock.stopAll'],\n },\n\n // ── Auth ──────────────────────────────────────────────────────────\n {\n id: 'auth-set-bearer',\n text: 'Set the \"Get user\" request to use bearer auth with token={{ACCESS_TOKEN}}.',\n description: 'Wire bearer auth onto a single request via env-var reference.',\n category: 'auth',\n tools: ['request.update'],\n },\n {\n id: 'auth-oauth2',\n text: 'Configure the \"Create order\" request to use OAuth2 client-credentials against https://auth.example.com/token with the \"orders.write\" scope.',\n description: 'Full OAuth2 client-credentials wiring without leaving the chat.',\n category: 'auth',\n tools: ['request.update'],\n },\n\n // ── Imports ───────────────────────────────────────────────────────\n {\n id: 'import-openapi',\n text: 'Import the OpenAPI spec at ./openapi.yaml and create one request per operation.',\n description: 'Bulk import of a spec file from the workspace.',\n category: 'imports',\n tools: ['import.openapi'],\n },\n {\n id: 'import-curl',\n text: 'I am going to paste a cURL command — turn it into a saved request named \"Webhook test\".',\n description: 'cURL → saved request with a name you control.',\n category: 'imports',\n tools: ['import.curl'],\n },\n];\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_shared","import_core","state","import_zod","import_core","import_zod","import_zod","import_zod","import_shared","HTTP_METHOD","import_zod","import_shared","import_zod","import_shared","import_mock_server_core","HTTP_METHOD","ENDPOINT_RESPONSE","patchEndpoint","import_zod","import_core","import_zod","import_zod","import_core","import_shared","path","import_core","import_core","import_core","import_file_backed","setActiveWorkspaceOnDisk","import_mock_server_core","import_stdio"]}
|