@_davideast/stitch-mcp 0.5.5 → 0.7.0
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/chunk-0xbbvsve.js +370 -0
- package/dist/chunk-0xbbvsve.js.map +16 -0
- package/dist/chunk-11ab03kg.js +137 -0
- package/dist/chunk-11ab03kg.js.map +10 -0
- package/dist/chunk-17cs61t4.js +270 -0
- package/dist/chunk-17cs61t4.js.map +10 -0
- package/dist/chunk-1mz7188j.js +20 -0
- package/dist/chunk-1mz7188j.js.map +9 -0
- package/dist/chunk-1txb8kjb.js +17 -0
- package/dist/chunk-1txb8kjb.js.map +9 -0
- package/dist/chunk-1v5q6d3n.js +17 -0
- package/dist/chunk-1v5q6d3n.js.map +9 -0
- package/dist/chunk-1wcg0pjg.js +94 -0
- package/dist/chunk-1wcg0pjg.js.map +10 -0
- package/dist/chunk-2zp03jky.js +19 -0
- package/dist/chunk-2zp03jky.js.map +9 -0
- package/dist/chunk-441ntz7a.js +137 -0
- package/dist/chunk-441ntz7a.js.map +10 -0
- package/dist/chunk-543135qd.js +43679 -0
- package/dist/chunk-543135qd.js.map +234 -0
- package/dist/chunk-564wpgj7.js +246 -0
- package/dist/chunk-564wpgj7.js.map +14 -0
- package/dist/chunk-5jbenaez.js +19185 -0
- package/dist/chunk-5jbenaez.js.map +115 -0
- package/dist/chunk-7ryqstaa.js +7065 -0
- package/dist/chunk-7ryqstaa.js.map +115 -0
- package/dist/chunk-86gwwcyr.js +46325 -0
- package/dist/chunk-86gwwcyr.js.map +261 -0
- package/dist/chunk-8gegrmmt.js +256 -0
- package/dist/chunk-8gegrmmt.js.map +11 -0
- package/dist/chunk-8hgrrc49.js +17 -0
- package/dist/chunk-8hgrrc49.js.map +9 -0
- package/dist/chunk-8w97w2wa.js +50 -0
- package/dist/chunk-8w97w2wa.js.map +9 -0
- package/dist/chunk-8yfetpqq.js +19132 -0
- package/dist/chunk-8yfetpqq.js.map +115 -0
- package/dist/chunk-94knm2sw.js +1495 -0
- package/dist/chunk-94knm2sw.js.map +23 -0
- package/dist/chunk-appd0sxm.js +5217 -0
- package/dist/chunk-appd0sxm.js.map +67 -0
- package/dist/chunk-c08qy4ty.js +67 -0
- package/dist/chunk-c08qy4ty.js.map +10 -0
- package/dist/chunk-d1ea3tmp.js +17 -0
- package/dist/chunk-d1ea3tmp.js.map +9 -0
- package/dist/chunk-ecn1ca83.js +34253 -0
- package/dist/chunk-ecn1ca83.js.map +261 -0
- package/dist/chunk-ef1c6gq5.js +947 -0
- package/dist/chunk-ef1c6gq5.js.map +28 -0
- package/dist/chunk-f0dt9hv8.js +680 -0
- package/dist/chunk-f0dt9hv8.js.map +17 -0
- package/dist/chunk-f2aj8ff8.js +11 -0
- package/dist/chunk-f2aj8ff8.js.map +9 -0
- package/dist/chunk-f3wp07zw.js +24 -0
- package/dist/chunk-f3wp07zw.js.map +9 -0
- package/dist/chunk-f5wqd3z3.js +10 -0
- package/dist/chunk-f5wqd3z3.js.map +9 -0
- package/dist/chunk-g8hwy0wx.js +504 -0
- package/dist/chunk-g8hwy0wx.js.map +21 -0
- package/dist/chunk-gcx3c3yc.js +680 -0
- package/dist/chunk-gcx3c3yc.js.map +17 -0
- package/dist/chunk-gq6vxp70.js +202 -0
- package/dist/chunk-gq6vxp70.js.map +13 -0
- package/dist/chunk-gw64p5pg.js +164 -0
- package/dist/chunk-gw64p5pg.js.map +10 -0
- package/dist/chunk-hst78da7.js +87 -0
- package/dist/chunk-hst78da7.js.map +13 -0
- package/dist/chunk-hsxpgjyd.js +256 -0
- package/dist/chunk-hsxpgjyd.js.map +11 -0
- package/dist/chunk-j1v44zzm.js +109 -0
- package/dist/chunk-j1v44zzm.js.map +10 -0
- package/dist/chunk-jfd5md63.js +736 -0
- package/dist/chunk-jfd5md63.js.map +16 -0
- package/dist/chunk-jvhzgyhy.js +62 -0
- package/dist/chunk-jvhzgyhy.js.map +10 -0
- package/dist/chunk-k86st2r8.js +7 -0
- package/dist/chunk-k86st2r8.js.map +9 -0
- package/dist/chunk-kztccppz.js +606 -0
- package/dist/chunk-kztccppz.js.map +15 -0
- package/dist/chunk-m2vk15q9.js +503 -0
- package/dist/chunk-m2vk15q9.js.map +21 -0
- package/dist/chunk-mk40f3ka.js +31529 -0
- package/dist/chunk-mk40f3ka.js.map +245 -0
- package/dist/chunk-mp1sf8x6.js +264 -0
- package/dist/chunk-mp1sf8x6.js.map +12 -0
- package/dist/chunk-n9fs543g.js +94 -0
- package/dist/chunk-n9fs543g.js.map +10 -0
- package/dist/chunk-nbbwjw90.js +165 -0
- package/dist/chunk-nbbwjw90.js.map +10 -0
- package/dist/chunk-qnd877d5.js +947 -0
- package/dist/chunk-qnd877d5.js.map +28 -0
- package/dist/chunk-rng2ypf7.js +538 -0
- package/dist/chunk-rng2ypf7.js.map +15 -0
- package/dist/chunk-sjq10wbw.js +39 -0
- package/dist/chunk-sjq10wbw.js.map +9 -0
- package/dist/chunk-snv6a65k.js +759 -0
- package/dist/chunk-snv6a65k.js.map +19 -0
- package/dist/chunk-sqhdg0mf.js +2138 -0
- package/dist/chunk-sqhdg0mf.js.map +44 -0
- package/dist/chunk-tebher8z.js +514 -0
- package/dist/chunk-tebher8z.js.map +12 -0
- package/dist/chunk-v0wtyr4k.js +66 -0
- package/dist/chunk-v0wtyr4k.js.map +10 -0
- package/dist/chunk-v20274k8.js +246 -0
- package/dist/chunk-v20274k8.js.map +14 -0
- package/dist/chunk-vcp9fp2w.js +839 -0
- package/dist/chunk-vcp9fp2w.js.map +11 -0
- package/dist/chunk-vz737k5f.js +269 -0
- package/dist/chunk-vz737k5f.js.map +10 -0
- package/dist/chunk-x6bsgeqa.js +736 -0
- package/dist/chunk-x6bsgeqa.js.map +16 -0
- package/dist/chunk-xg9kcbp1.js +371 -0
- package/dist/chunk-xg9kcbp1.js.map +16 -0
- package/dist/chunk-xhad5b8x.js +110 -0
- package/dist/chunk-xhad5b8x.js.map +10 -0
- package/dist/chunk-xkwa1mn5.js +203 -0
- package/dist/chunk-xkwa1mn5.js.map +13 -0
- package/dist/chunk-xtcg74kf.js +50 -0
- package/dist/chunk-xtcg74kf.js.map +9 -0
- package/dist/chunk-xzjkaqe9.js +759 -0
- package/dist/chunk-xzjkaqe9.js.map +19 -0
- package/dist/chunk-y65xgj69.js +1495 -0
- package/dist/chunk-y65xgj69.js.map +23 -0
- package/dist/commands/doctor/command.js +1 -1
- package/dist/commands/init/command.js +1 -1
- package/dist/commands/logout/command.js +1 -1
- package/dist/commands/proxy/LoggingCallToolHandler.d.ts +11 -0
- package/dist/commands/proxy/command.js +1 -1
- package/dist/commands/screens/command.js +4 -4
- package/dist/commands/serve/command.js +5 -5
- package/dist/commands/site/command.js +1 -1
- package/dist/commands/snapshot/command.js +1 -1
- package/dist/commands/tool/command.js +1 -1
- package/dist/commands/tool/steps/LogExecuteToolStep.d.ts +19 -0
- package/dist/commands/upload/command.d.ts +2 -0
- package/dist/commands/upload/command.js +77 -0
- package/dist/commands/upload/command.js.map +11 -0
- package/dist/commands/upload/handler.d.ts +20 -0
- package/dist/commands/upload/spec.d.ts +38 -0
- package/dist/commands/view/command.js +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/log/append.d.ts +12 -0
- package/dist/lib/log/blob-store/handler.d.ts +10 -0
- package/dist/lib/log/blob-store/spec.d.ts +251 -0
- package/dist/lib/log/capture/handler.d.ts +10 -0
- package/dist/lib/log/capture/spec.d.ts +1504 -0
- package/dist/lib/log/factory.d.ts +4 -0
- package/package.json +2 -2
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/log/factory.ts", "../src/lib/log/append.ts", "../src/lib/log/blob-store/handler.ts", "../src/lib/log/capture/handler.ts", "../src/lib/log/blob-store/spec.ts", "../src/lib/log/capture/spec.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { join } from 'node:path';\nimport { appendEvent } from './append.js';\nimport { BlobStoreHandler } from './blob-store/handler.js';\nimport { CaptureHandler } from './capture/handler.js';\nimport type { CaptureSpec } from './capture/spec.js';\n\nexport const DEFAULT_LOG_ROOT = '.stitch-mcp/log';\n\nexport function isLogEnabled(): boolean {\n return process.env.STITCH_MCP_LOG === '1';\n}\n\nexport function createCaptureHandler(root: string = DEFAULT_LOG_ROOT): CaptureSpec {\n const blobs = new BlobStoreHandler(join(root, 'blobs'));\n const eventsPath = join(root, 'events.jsonl');\n return new CaptureHandler({\n blobs,\n append: (event) => appendEvent(eventsPath, event),\n });\n}\n",
|
|
6
|
+
"import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { z } from 'zod';\n\nconst EnvelopeSchema = z.object({\n id: z.string().min(1),\n time: z.string().min(1),\n trace_id: z.string().min(1),\n schema_version: z.literal(1),\n type: z.string().min(1),\n payload: z.unknown(),\n});\n\nexport type AppendResult =\n | { success: true }\n | {\n success: false;\n error: {\n code: 'EVENT_VALIDATION_FAILED' | 'EVENT_WRITE_FAILED';\n message: string;\n recoverable: boolean;\n };\n };\n\n/** Validate envelope shape and append exactly one JSON line, ending in `\\n`. */\nexport async function appendEvent(eventsPath: string, event: unknown): Promise<AppendResult> {\n const parsed = EnvelopeSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n error: {\n code: 'EVENT_VALIDATION_FAILED',\n message: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n recoverable: false,\n },\n };\n }\n try {\n await mkdir(dirname(eventsPath), { recursive: true });\n await appendFile(eventsPath, JSON.stringify(parsed.data) + '\\n', 'utf8');\n return { success: true };\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'EVENT_WRITE_FAILED',\n message: e instanceof Error ? e.message : String(e),\n recoverable: false,\n },\n };\n }\n}\n",
|
|
7
|
+
"import { createHash } from 'node:crypto';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { BlobStoreSpec, PutResult, HasResult, GetResult } from './spec.js';\n\nconst EXT_BY_MIME: Record<string, string> = {\n 'application/json': 'json',\n 'text/html': 'html',\n 'image/png': 'png',\n 'image/webp': 'webp',\n 'image/jpeg': 'jpg',\n};\n\nfunction extForMime(mime: string): string {\n return EXT_BY_MIME[mime] ?? 'bin';\n}\n\nexport class BlobStoreHandler implements BlobStoreSpec {\n constructor(private readonly root: string) {}\n\n async put(buffer: Buffer, mime: string): Promise<PutResult> {\n try {\n const sha256 = createHash('sha256').update(buffer).digest('hex');\n const existing = await this.findBySha(sha256);\n if (existing) {\n const s = await stat(existing);\n return { success: true, data: { sha256, size: s.size, mime } };\n }\n const path = join(this.root, sha256.slice(0, 2), `${sha256}.${extForMime(mime)}`);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, buffer);\n return { success: true, data: { sha256, size: buffer.length, mime } };\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'BLOB_WRITE_FAILED',\n message: e instanceof Error ? e.message : String(e),\n recoverable: false,\n },\n };\n }\n }\n\n private async findBySha(sha256: string): Promise<string | null> {\n const dir = join(this.root, sha256.slice(0, 2));\n let entries: string[];\n try { entries = await readdir(dir); } catch { return null; }\n const match = entries.find((e) => e.startsWith(`${sha256}.`));\n return match ? join(dir, match) : null;\n }\n\n async fetch(url: string, mimeHint?: string): Promise<PutResult> {\n let response: Response;\n try {\n response = await globalThis.fetch(url, {\n redirect: 'follow',\n headers: { 'User-Agent': 'stitch-mcp-log/0.1 (Mozilla/5.0)' },\n });\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'BLOB_FETCH_NETWORK',\n message: e instanceof Error ? e.message : String(e),\n recoverable: true,\n },\n };\n }\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: 'BLOB_FETCH_HTTP_ERROR',\n message: `HTTP ${response.status} for ${url}`,\n recoverable: false,\n },\n };\n }\n const mime = (response.headers.get('content-type') ?? mimeHint ?? 'application/octet-stream').split(';')[0]!.trim();\n const buffer = Buffer.from(await response.arrayBuffer());\n return this.put(buffer, mime);\n }\n async has(sha256: string): Promise<HasResult> {\n const path = await this.findBySha(sha256);\n return { success: true, data: path != null };\n }\n async get(sha256: string): Promise<GetResult> {\n const path = await this.findBySha(sha256);\n if (!path) return { success: true, data: null };\n const buf = await readFile(path);\n return { success: true, data: buf };\n }\n}\n",
|
|
8
|
+
"import { randomUUID } from 'node:crypto';\nimport type { BlobRef } from '../blob-store/spec.js';\nimport {\n type AppendFn,\n type CaptureDeps,\n type CaptureInput,\n type CaptureResult,\n type CaptureSpec,\n type Event,\n type ProducedScreen,\n type ToolKind,\n CaptureInputSchema,\n kindOf,\n} from './spec.js';\n\ninterface ScreenComponent {\n id?: string;\n name?: string;\n prompt?: string;\n theme?: Record<string, unknown>;\n designSystem?: Record<string, unknown> | null;\n htmlCode?: { downloadUrl?: string; mimeType?: string };\n screenshot?: { downloadUrl?: string };\n}\n\nexport class CaptureHandler implements CaptureSpec {\n private readonly blobs: CaptureDeps['blobs'];\n private readonly append: AppendFn;\n private readonly now: () => Date;\n private readonly newId: () => string;\n\n constructor(deps: CaptureDeps) {\n this.blobs = deps.blobs;\n this.append = deps.append;\n this.now = deps.now ?? (() => new Date());\n this.newId = deps.newId ?? (() => randomUUID());\n }\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const parsed = CaptureInputSchema.safeParse(input);\n if (!parsed.success) {\n return this.fail('CAPTURE_INVALID_INPUT', parsed.error.message, false);\n }\n const kind: ToolKind = kindOf(input.tool);\n\n const trace_id = this.newId();\n const warnings: string[] = [];\n\n // 1) requested event — always\n const argsBuf = Buffer.from(JSON.stringify(input.args));\n const argsBlob = await this.blobs.put(argsBuf, 'application/json');\n if (!argsBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `args_blob: ${argsBlob.error.message}`, false);\n }\n\n const requested: Event = {\n id: this.newId(),\n time: input.started_at,\n trace_id,\n schema_version: 1,\n type: 'call.requested',\n payload: {\n tool: input.tool,\n project_id: typeof input.args.projectId === 'string' ? input.args.projectId : undefined,\n selected_screen_ids: Array.isArray(input.args.selectedScreenIds)\n ? (input.args.selectedScreenIds as string[])\n : undefined,\n user_prompt: typeof input.args.prompt === 'string' ? input.args.prompt : undefined,\n variant_options:\n input.args.variantOptions && typeof input.args.variantOptions === 'object'\n ? (input.args.variantOptions as Record<string, unknown>)\n : undefined,\n device_type: typeof input.args.deviceType === 'string' ? input.args.deviceType : undefined,\n model_id: typeof input.args.modelId === 'string' ? input.args.modelId : undefined,\n args_blob: argsBlob.data,\n },\n };\n const ar = await this.append(requested);\n if (!ar.success) return this.fail('CAPTURE_APPEND_FAILED', ar.error.message, true);\n\n // 2) explicit failure\n const r = input.result as { isError?: boolean; structuredContent?: any; content?: { type: string; text?: string }[] } | null;\n if (r && r.isError === true) {\n const errorText = r.content?.find((c) => c.type === 'text')?.text ?? '';\n const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r)), 'application/json');\n const failed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.failed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n is_error: true,\n error_text: errorText,\n raw_blob: rawBlob.success ? rawBlob.data : undefined,\n },\n };\n const fr = await this.append(failed);\n if (!fr.success) return this.fail('CAPTURE_APPEND_FAILED', fr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n if (kind === 'read') {\n const resultBlob = await this.blobs.put(Buffer.from(JSON.stringify(r ?? {})), 'application/json');\n if (!resultBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `result_blob: ${resultBlob.error.message}`, false);\n }\n const returned = extractReturnedIds(r);\n const completed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.completed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n kind: 'read',\n project_id: typeof input.args.projectId === 'string' ? input.args.projectId : undefined,\n screen_ids:\n typeof input.args.screenId === 'string'\n ? [input.args.screenId]\n : Array.isArray(input.args.selectedScreenIds)\n ? (input.args.selectedScreenIds as string[])\n : undefined,\n returned_project_ids: returned.projects.length > 0 ? returned.projects : undefined,\n returned_screen_ids: returned.screens.length > 0 ? returned.screens : undefined,\n result_blob: resultBlob.data,\n },\n };\n const cr = await this.append(completed);\n if (!cr.success) return this.fail('CAPTURE_APPEND_FAILED', cr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n if (kind === 'unknown') {\n const resultBlob = await this.blobs.put(Buffer.from(JSON.stringify(r ?? {})), 'application/json');\n if (!resultBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `result_blob: ${resultBlob.error.message}`, false);\n }\n const completed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.completed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n kind: 'unknown',\n project_id: typeof input.args.projectId === 'string' ? input.args.projectId : undefined,\n result_blob: resultBlob.data,\n },\n };\n const cr = await this.append(completed);\n if (!cr.success) return this.fail('CAPTURE_APPEND_FAILED', cr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n // 3) generative path\n const sc = (r as any)?.structuredContent ?? null;\n const screens: ScreenComponent[] = pickScreens(sc);\n\n // implicit failure: zero produced screens on a generative call\n if (screens.length === 0) {\n const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r ?? {})), 'application/json');\n const failed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.failed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n is_error: 'empty',\n raw_blob: rawBlob.success ? rawBlob.data : undefined,\n },\n };\n const fr = await this.append(failed);\n if (!fr.success) return this.fail('CAPTURE_APPEND_FAILED', fr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n const structuredBlob = await this.blobs.put(Buffer.from(JSON.stringify(sc)), 'application/json');\n if (!structuredBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `structured_content_blob: ${structuredBlob.error.message}`, false);\n }\n\n // top-level designSystem component (only on generate_screen_from_text in practice)\n const dsAsset = pickDesignSystemComponent(sc);\n let dsAssetBlob: BlobRef | null = null;\n if (dsAsset) {\n const r2 = await this.blobs.put(Buffer.from(JSON.stringify(dsAsset)), 'application/json');\n if (r2.success) dsAssetBlob = r2.data;\n else warnings.push(`design_system_asset put failed: ${r2.error.message}`);\n }\n\n const allScreenIds = screens.map((s) => s.id ?? '').filter(Boolean);\n const selectedParents = (input.args.selectedScreenIds as string[] | undefined) ?? [];\n const parent = selectedParents[0] ?? null;\n\n const produced: ProducedScreen[] = [];\n for (const s of screens) {\n const screenId = s.id ?? '';\n const siblings = allScreenIds.filter((id) => id !== screenId);\n\n // theme blob (populated for generate/edit; empty {} for variants)\n let themeBlob: BlobRef | null = null;\n if (s.theme && Object.keys(s.theme).length > 0) {\n const tr = await this.blobs.put(Buffer.from(JSON.stringify(s.theme)), 'application/json');\n if (tr.success) themeBlob = tr.data;\n else warnings.push(`screen ${screenId} theme: ${tr.error.message}`);\n }\n\n // per-screen design system (generate only)\n let dsBlob: BlobRef | null = null;\n if (s.designSystem) {\n const dr = await this.blobs.put(Buffer.from(JSON.stringify(s.designSystem)), 'application/json');\n if (dr.success) dsBlob = dr.data;\n else warnings.push(`screen ${screenId} design_system: ${dr.error.message}`);\n } else if (dsAssetBlob) {\n // fall back to the top-level designSystem component blob when per-screen is absent\n dsBlob = dsAssetBlob;\n }\n\n // eager downloads\n let htmlBlob: BlobRef | null = null;\n if (s.htmlCode?.downloadUrl) {\n const fr = await this.blobs.fetch(s.htmlCode.downloadUrl, s.htmlCode.mimeType ?? 'text/html');\n if (fr.success) htmlBlob = fr.data;\n else warnings.push(`screen ${screenId} html: ${fr.error.code} ${fr.error.message}`);\n }\n let shotBlob: BlobRef | null = null;\n if (s.screenshot?.downloadUrl) {\n const fr = await this.blobs.fetch(s.screenshot.downloadUrl);\n if (fr.success) shotBlob = fr.data;\n else warnings.push(`screen ${screenId} screenshot: ${fr.error.code} ${fr.error.message}`);\n }\n\n produced.push({\n project_id: (input.args.projectId as string) ?? sc?.projectId ?? '',\n screen_id: screenId,\n name: s.name ?? '',\n parent_screen_id: parent,\n sibling_screen_ids: siblings,\n effective_prompt: s.prompt ?? '',\n html_blob: htmlBlob,\n screenshot_blob: shotBlob,\n theme_blob: themeBlob,\n design_system_blob: dsBlob,\n });\n }\n\n const completed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.completed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n kind: 'generative',\n stitch_session_id: typeof sc?.sessionId !== 'undefined' ? String(sc.sessionId) : undefined,\n structured_content_blob: structuredBlob.data,\n produced_screens: produced,\n },\n };\n const cr = await this.append(completed);\n if (!cr.success) return this.fail('CAPTURE_APPEND_FAILED', cr.error.message, true);\n\n return {\n success: true,\n data: { trace_id, produced_screen_ids: produced.map((p) => p.screen_id), warnings },\n };\n }\n\n private fail(code: any, message: string, recoverable: boolean): CaptureResult {\n return { success: false, error: { code, message, recoverable } };\n }\n}\n\n// --- helpers (extraction over heterogeneous outputComponents) ---------------\n\nfunction pickScreens(sc: any): ScreenComponent[] {\n const out: ScreenComponent[] = [];\n for (const c of sc?.outputComponents ?? []) {\n if (c?.design?.screens) for (const s of c.design.screens) out.push(s as ScreenComponent);\n }\n return out;\n}\n\nfunction pickDesignSystemComponent(sc: any): Record<string, unknown> | null {\n const c = (sc?.outputComponents ?? []).find((x: any) => x?.designSystem);\n return c?.designSystem ?? null;\n}\n\n/**\n * Walk an MCP result and pull out any `name` fields shaped like\n * \"projects/<id>\" or \"screens/<id>\". Used to record which entities a\n * read-tool response actually returned so the log is queryable without\n * re-reading the result blob.\n */\nfunction extractReturnedIds(result: unknown): { projects: string[]; screens: string[] } {\n const projects = new Set<string>();\n const screens = new Set<string>();\n const seen = new WeakSet<object>();\n const visit = (node: unknown) => {\n if (!node || typeof node !== 'object') return;\n if (seen.has(node as object)) return;\n seen.add(node as object);\n const name = (node as { name?: unknown }).name;\n if (typeof name === 'string') {\n if (name.startsWith('projects/')) projects.add(name.slice('projects/'.length));\n else if (name.startsWith('screens/')) screens.add(name.slice('screens/'.length));\n }\n if (Array.isArray(node)) {\n for (const v of node) visit(v);\n } else {\n for (const v of Object.values(node as Record<string, unknown>)) visit(v);\n }\n };\n visit(result);\n return { projects: Array.from(projects), screens: Array.from(screens) };\n}\n",
|
|
9
|
+
"import { z } from 'zod';\n\n// --- shared schemas ---------------------------------------------------------\n\nexport const Sha256Schema = z.string().regex(/^[0-9a-f]{64}$/, 'must be 64-char lowercase hex');\nexport const MimeSchema = z.string().min(1);\n\nexport const BlobRefSchema = z.object({\n sha256: Sha256Schema,\n size: z.number().int().nonnegative(),\n mime: MimeSchema,\n});\nexport type BlobRef = z.infer<typeof BlobRefSchema>;\n\n// --- error union ------------------------------------------------------------\n\nexport const BlobStoreErrorCodeSchema = z.enum([\n 'BLOB_FETCH_NETWORK',\n 'BLOB_FETCH_HTTP_ERROR',\n 'BLOB_WRITE_FAILED',\n 'BLOB_READ_FAILED',\n 'BLOB_INVALID_INPUT',\n]);\nexport type BlobStoreErrorCode = z.infer<typeof BlobStoreErrorCodeSchema>;\n\nexport const BlobStoreErrorSchema = z.object({\n code: BlobStoreErrorCodeSchema,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n});\nexport type BlobStoreError = z.infer<typeof BlobStoreErrorSchema>;\n\nconst FailureSchema = z.object({\n success: z.literal(false),\n error: BlobStoreErrorSchema,\n});\n\n// --- per-method result schemas ---------------------------------------------\n\nexport const PutSuccessSchema = z.object({\n success: z.literal(true),\n data: BlobRefSchema,\n});\nexport const PutResultSchema = z.union([PutSuccessSchema, FailureSchema]);\nexport type PutResult = z.infer<typeof PutResultSchema>;\n\nexport const HasSuccessSchema = z.object({\n success: z.literal(true),\n data: z.boolean(),\n});\nexport const HasResultSchema = z.union([HasSuccessSchema, FailureSchema]);\nexport type HasResult = z.infer<typeof HasResultSchema>;\n\nexport const GetSuccessSchema = z.object({\n success: z.literal(true),\n // null = not found; success=true because \"absent\" is a valid answer, not an error\n data: z.instanceof(Buffer).nullable(),\n});\nexport const GetResultSchema = z.union([GetSuccessSchema, FailureSchema]);\nexport type GetResult = z.infer<typeof GetResultSchema>;\n\n// --- capability -------------------------------------------------------------\n\nexport interface BlobStoreSpec {\n /** Hash, dedupe, and persist a buffer. Returns a content-addressed BlobRef. */\n put(buffer: Buffer, mime: string): Promise<PutResult>;\n\n /** Fetch a URL (following redirects) and persist the bytes. */\n fetch(url: string, mimeHint?: string): Promise<PutResult>;\n\n /** Cheap existence check by sha256. */\n has(sha256: string): Promise<HasResult>;\n\n /** Read bytes by sha256. data === null when absent. */\n get(sha256: string): Promise<GetResult>;\n}\n",
|
|
10
|
+
"import { z } from 'zod';\nimport { BlobRefSchema } from '../blob-store/spec.js';\n\n// --- tool taxonomy ----------------------------------------------------------\n\nexport const GENERATIVE_TOOLS = new Set([\n 'generate_screen_from_text',\n 'edit_screens',\n 'generate_variants',\n] as const);\n\nexport const READ_TOOLS = new Set([\n 'get_screen',\n 'list_screens',\n 'list_projects',\n 'get_project',\n 'create_project',\n] as const);\n\nexport type ToolKind = 'generative' | 'read' | 'unknown';\n\nexport function kindOf(tool: string): ToolKind {\n if (GENERATIVE_TOOLS.has(tool as any)) return 'generative';\n if (READ_TOOLS.has(tool as any)) return 'read';\n return 'unknown';\n}\n\n// --- per-screen artifact -----------------------------------------------------\n\nexport const ProducedScreenSchema = z.object({\n project_id: z.string(),\n screen_id: z.string(),\n name: z.string(),\n parent_screen_id: z.string().nullable(),\n sibling_screen_ids: z.array(z.string()),\n effective_prompt: z.string(),\n // null when a fetch failed (warning recorded) or absent on the response (variants)\n html_blob: BlobRefSchema.nullable(),\n screenshot_blob: BlobRefSchema.nullable(),\n theme_blob: BlobRefSchema.nullable(),\n design_system_blob: BlobRefSchema.nullable(),\n});\nexport type ProducedScreen = z.infer<typeof ProducedScreenSchema>;\n\n// --- event payloads ---------------------------------------------------------\n\nexport const RequestedPayloadSchema = z.object({\n tool: z.string(),\n project_id: z.string().optional(),\n selected_screen_ids: z.array(z.string()).optional(),\n user_prompt: z.string().optional(),\n variant_options: z.record(z.string(), z.unknown()).optional(),\n device_type: z.string().optional(),\n model_id: z.string().optional(),\n args_blob: BlobRefSchema,\n});\n\nexport const CompletedGenerativePayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n kind: z.literal('generative'),\n stitch_session_id: z.string().optional(),\n structured_content_blob: BlobRefSchema,\n produced_screens: z.array(ProducedScreenSchema),\n});\n\nexport const CompletedReadPayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n kind: z.literal('read'),\n project_id: z.string().optional(),\n screen_ids: z.array(z.string()).optional(),\n returned_project_ids: z.array(z.string()).optional(),\n returned_screen_ids: z.array(z.string()).optional(),\n result_blob: BlobRefSchema,\n});\n\nexport const CompletedUnknownPayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n kind: z.literal('unknown'),\n project_id: z.string().optional(),\n result_blob: BlobRefSchema,\n});\n\nexport const CompletedPayloadSchema = z.discriminatedUnion('kind', [\n CompletedGenerativePayloadSchema,\n CompletedReadPayloadSchema,\n CompletedUnknownPayloadSchema,\n]);\n\nexport const FailedPayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n is_error: z.union([z.literal(true), z.literal('empty')]),\n error_text: z.string().optional(),\n raw_blob: BlobRefSchema.optional(),\n});\n\n// --- envelope + event union --------------------------------------------------\n\nconst baseEnvelope = {\n id: z.string().min(1),\n time: z.string().min(1),\n trace_id: z.string().min(1),\n schema_version: z.literal(1),\n};\n\nexport const EventSchema = z.discriminatedUnion('type', [\n z.object({ ...baseEnvelope, type: z.literal('call.requested'), payload: RequestedPayloadSchema }),\n z.object({ ...baseEnvelope, type: z.literal('call.completed'), payload: CompletedPayloadSchema }),\n z.object({ ...baseEnvelope, type: z.literal('call.failed'), payload: FailedPayloadSchema }),\n]);\nexport type Event = z.infer<typeof EventSchema>;\n\n// --- capture I/O ------------------------------------------------------------\n\nexport const CaptureInputSchema = z.object({\n tool: z.string().min(1),\n args: z.record(z.string(), z.unknown()),\n result: z.unknown(), // raw MCP CallToolResult\n duration_ms: z.number().int().nonnegative(),\n started_at: z.string().min(1),\n finished_at: z.string().min(1),\n});\nexport type CaptureInput = z.infer<typeof CaptureInputSchema>;\n\nexport const CaptureErrorCodeSchema = z.enum([\n 'CAPTURE_UNKNOWN_TOOL', // tool isn't in either taxonomy set\n 'CAPTURE_APPEND_FAILED', // appendEvent rejected\n 'CAPTURE_BLOB_FATAL', // critical blob (args/result) failed; can't proceed\n 'CAPTURE_INVALID_INPUT',\n]);\n\nconst CaptureFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: CaptureErrorCodeSchema,\n message: z.string(),\n recoverable: z.boolean(),\n }),\n});\nconst CaptureSuccess = z.object({\n success: z.literal(true),\n data: z.object({\n trace_id: z.string(),\n produced_screen_ids: z.array(z.string()),\n warnings: z.array(z.string()), // soft-failures (one blob fetch died, etc.)\n }),\n});\nexport const CaptureResultSchema = z.union([CaptureSuccess, CaptureFailure]);\nexport type CaptureResult = z.infer<typeof CaptureResultSchema>;\n\n// --- dependency contracts (for testability) ---------------------------------\n\nimport type { BlobStoreSpec } from '../blob-store/spec.js';\nimport type { AppendResult } from '../append.js';\n\nexport type AppendFn = (event: Event) => Promise<AppendResult>;\n\nexport interface CaptureSpec {\n capture(input: CaptureInput): Promise<CaptureResult>;\n}\n\nexport interface CaptureDeps {\n blobs: BlobStoreSpec;\n append: AppendFn;\n now?: () => Date; // injectable for deterministic tests\n newId?: () => string;\n}\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "FE77B0940D64015064756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createCaptureHandler,
|
|
3
|
+
isLogEnabled
|
|
4
|
+
} from "./chunk-rng2ypf7.js";
|
|
5
|
+
import {
|
|
6
|
+
fetchWithRetry
|
|
7
|
+
} from "./chunk-6gw9apqb.js";
|
|
8
|
+
import {
|
|
9
|
+
downloadText
|
|
10
|
+
} from "./chunk-fkzq5m59.js";
|
|
11
|
+
import {
|
|
12
|
+
CallToolResultSchema,
|
|
13
|
+
StitchToolClient,
|
|
14
|
+
stitch
|
|
15
|
+
} from "./chunk-mk40f3ka.js";
|
|
16
|
+
import {
|
|
17
|
+
pLimit
|
|
18
|
+
} from "./chunk-a5xra9jn.js";
|
|
19
|
+
import {
|
|
20
|
+
runSteps
|
|
21
|
+
} from "./chunk-f2hq6bfv.js";
|
|
22
|
+
import"./chunk-c6ge431q.js";
|
|
23
|
+
import"./chunk-9wyra8hs.js";
|
|
24
|
+
|
|
25
|
+
// src/commands/tool/virtual-tools/get-screen-code.ts
|
|
26
|
+
var getScreenCodeTool = {
|
|
27
|
+
name: "get_screen_code",
|
|
28
|
+
description: "(Virtual) Retrieves a screen and downloads its HTML code content.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
projectId: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "Required. The project ID of screen to retrieve."
|
|
35
|
+
},
|
|
36
|
+
screenId: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description: "Required. The name of screen to retrieve."
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
required: ["projectId", "screenId"]
|
|
42
|
+
},
|
|
43
|
+
execute: async (client, args, stitch2) => {
|
|
44
|
+
if (!stitch2)
|
|
45
|
+
throw new Error("get_screen_code requires a Stitch instance");
|
|
46
|
+
const { projectId, screenId } = args;
|
|
47
|
+
const screen = await stitch2.project(projectId).getScreen(screenId);
|
|
48
|
+
let htmlContent = null;
|
|
49
|
+
try {
|
|
50
|
+
const htmlUrl = await screen.getHtml();
|
|
51
|
+
if (htmlUrl) {
|
|
52
|
+
htmlContent = await downloadText(htmlUrl);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
console.error(`Error downloading HTML code: ${e}`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
screenId: screen.screenId,
|
|
59
|
+
projectId: screen.projectId,
|
|
60
|
+
htmlContent
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
// src/commands/tool/virtual-tools/get-screen-image.ts
|
|
65
|
+
var getScreenImageTool = {
|
|
66
|
+
name: "get_screen_image",
|
|
67
|
+
description: "(Virtual) Retrieves a screen and downloads its screenshot image content.",
|
|
68
|
+
inputSchema: {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
projectId: {
|
|
72
|
+
type: "string",
|
|
73
|
+
description: "Required. The project ID of screen to retrieve."
|
|
74
|
+
},
|
|
75
|
+
screenId: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "Required. The name of screen to retrieve."
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
required: ["projectId", "screenId"]
|
|
81
|
+
},
|
|
82
|
+
execute: async (client, args, stitch2) => {
|
|
83
|
+
if (!stitch2)
|
|
84
|
+
throw new Error("get_screen_image requires a Stitch instance");
|
|
85
|
+
const { projectId, screenId } = args;
|
|
86
|
+
const screen = await stitch2.project(projectId).getScreen(screenId);
|
|
87
|
+
let imageContent = null;
|
|
88
|
+
try {
|
|
89
|
+
const imageUrl = await screen.getImage();
|
|
90
|
+
if (imageUrl) {
|
|
91
|
+
const response = await fetch(imageUrl);
|
|
92
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
93
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
94
|
+
imageContent = buffer.toString("base64");
|
|
95
|
+
}
|
|
96
|
+
} catch (e) {
|
|
97
|
+
console.error(`Error downloading screenshot: ${e}`);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
screenId: screen.screenId,
|
|
101
|
+
projectId: screen.projectId,
|
|
102
|
+
imageContent
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
// src/commands/tool/virtual-tools/build-site.ts
|
|
107
|
+
var buildSiteTool = {
|
|
108
|
+
name: "build_site",
|
|
109
|
+
description: "(Virtual) Builds a site from a Stitch project by mapping screens to routes. Returns the design HTML for each page to use as context for code generation.",
|
|
110
|
+
inputSchema: {
|
|
111
|
+
type: "object",
|
|
112
|
+
properties: {
|
|
113
|
+
projectId: {
|
|
114
|
+
type: "string",
|
|
115
|
+
description: "Required. The project ID to build a site from."
|
|
116
|
+
},
|
|
117
|
+
routes: {
|
|
118
|
+
type: "array",
|
|
119
|
+
description: "Required. Array of screen-to-route mappings.",
|
|
120
|
+
items: {
|
|
121
|
+
type: "object",
|
|
122
|
+
properties: {
|
|
123
|
+
screenId: {
|
|
124
|
+
type: "string",
|
|
125
|
+
description: "The screen ID to use for this route."
|
|
126
|
+
},
|
|
127
|
+
route: {
|
|
128
|
+
type: "string",
|
|
129
|
+
description: 'The route path (e.g. "/" or "/about").'
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
required: ["screenId", "route"]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
required: ["projectId", "routes"]
|
|
137
|
+
},
|
|
138
|
+
execute: async (client, args, stitch2) => {
|
|
139
|
+
if (!stitch2)
|
|
140
|
+
throw new Error("build_site requires a Stitch instance");
|
|
141
|
+
const { projectId, routes } = args;
|
|
142
|
+
if (!Array.isArray(routes)) {
|
|
143
|
+
throw new Error("routes must be an array");
|
|
144
|
+
}
|
|
145
|
+
if (routes.length === 0) {
|
|
146
|
+
throw new Error("routes must be a non-empty array");
|
|
147
|
+
}
|
|
148
|
+
for (const entry of routes) {
|
|
149
|
+
if (!entry.screenId || typeof entry.screenId !== "string") {
|
|
150
|
+
throw new Error('Each route entry must have a "screenId" string');
|
|
151
|
+
}
|
|
152
|
+
if (!entry.route || typeof entry.route !== "string") {
|
|
153
|
+
throw new Error('Each route entry must have a "route" string');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const routePaths = routes.map((r) => r.route);
|
|
157
|
+
const uniqueRoutes = new Set(routePaths);
|
|
158
|
+
if (uniqueRoutes.size !== routePaths.length) {
|
|
159
|
+
const duplicates = routePaths.filter((r, i) => routePaths.indexOf(r) !== i);
|
|
160
|
+
throw new Error(`Duplicate route paths found: ${[...new Set(duplicates)].join(", ")}`);
|
|
161
|
+
}
|
|
162
|
+
const project = stitch2.project(projectId);
|
|
163
|
+
const sdkScreens = await project.screens();
|
|
164
|
+
const screenMap = new Map(sdkScreens.map((s) => [s.screenId, s]));
|
|
165
|
+
const missingIds = routes.map((r) => r.screenId).filter((id) => !screenMap.has(id));
|
|
166
|
+
if (missingIds.length > 0) {
|
|
167
|
+
throw new Error(`Screen IDs not found in project: ${missingIds.join(", ")}`);
|
|
168
|
+
}
|
|
169
|
+
const limit = pLimit(3);
|
|
170
|
+
const htmlContent = new Map;
|
|
171
|
+
const errors = [];
|
|
172
|
+
await Promise.all(routes.map((r) => limit(async () => {
|
|
173
|
+
const screen = screenMap.get(r.screenId);
|
|
174
|
+
try {
|
|
175
|
+
const htmlUrl = await screen.getHtml();
|
|
176
|
+
if (htmlUrl) {
|
|
177
|
+
const html = await fetchWithRetry(htmlUrl);
|
|
178
|
+
htmlContent.set(r.screenId, html);
|
|
179
|
+
} else {
|
|
180
|
+
htmlContent.set(r.screenId, "");
|
|
181
|
+
}
|
|
182
|
+
} catch (e) {
|
|
183
|
+
errors.push(`${r.screenId}: ${e.message}`);
|
|
184
|
+
}
|
|
185
|
+
})));
|
|
186
|
+
if (errors.length > 0) {
|
|
187
|
+
throw new Error(`Failed to fetch HTML for screens: ${errors.join("; ")}`);
|
|
188
|
+
}
|
|
189
|
+
const pages = routes.map((r) => ({
|
|
190
|
+
screenId: r.screenId,
|
|
191
|
+
route: r.route,
|
|
192
|
+
title: screenMap.get(r.screenId).title ?? r.screenId,
|
|
193
|
+
html: htmlContent.get(r.screenId)
|
|
194
|
+
}));
|
|
195
|
+
return {
|
|
196
|
+
success: true,
|
|
197
|
+
pages,
|
|
198
|
+
message: `Built ${pages.length} page(s) with design HTML`
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
// src/commands/tool/virtual-tools/list-tools.ts
|
|
203
|
+
var listToolsTool = {
|
|
204
|
+
name: "list_tools",
|
|
205
|
+
description: "List all available tools with their descriptions and schemas.",
|
|
206
|
+
inputSchema: {
|
|
207
|
+
type: "object",
|
|
208
|
+
properties: {}
|
|
209
|
+
},
|
|
210
|
+
execute: async (client, _args) => {
|
|
211
|
+
const result = await client.listTools();
|
|
212
|
+
return result.tools || [];
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
// src/commands/tool/virtual-tools/index.ts
|
|
216
|
+
var virtualTools = [
|
|
217
|
+
getScreenCodeTool,
|
|
218
|
+
getScreenImageTool,
|
|
219
|
+
buildSiteTool,
|
|
220
|
+
listToolsTool
|
|
221
|
+
];
|
|
222
|
+
|
|
223
|
+
// src/commands/tool/steps/ListToolsStep.ts
|
|
224
|
+
class ListToolsStep {
|
|
225
|
+
id = "list-tools";
|
|
226
|
+
name = "List available tools";
|
|
227
|
+
async shouldRun(context) {
|
|
228
|
+
const name = context.input.toolName?.toLowerCase();
|
|
229
|
+
return !name || name === "list" || name === "listtools" || name === "list_tools";
|
|
230
|
+
}
|
|
231
|
+
async run(context) {
|
|
232
|
+
const result = await context.client.listTools();
|
|
233
|
+
const serverTools = result.tools || [];
|
|
234
|
+
const tools = [
|
|
235
|
+
...context.virtualTools.map((t) => ({ name: t.name, description: t.description, inputSchema: t.inputSchema, virtual: true })),
|
|
236
|
+
...serverTools.map((t) => ({ ...t, virtual: false }))
|
|
237
|
+
];
|
|
238
|
+
context.result = { success: true, data: tools };
|
|
239
|
+
return { success: true };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/commands/tool/steps/ShowSchemaStep.ts
|
|
244
|
+
class ShowSchemaStep {
|
|
245
|
+
id = "show-schema";
|
|
246
|
+
name = "Show tool schema";
|
|
247
|
+
async shouldRun(context) {
|
|
248
|
+
return !!context.input.toolName && context.input.toolName !== "list" && context.input.showSchema;
|
|
249
|
+
}
|
|
250
|
+
async run(context) {
|
|
251
|
+
const toolName = context.input.toolName;
|
|
252
|
+
const result = await context.client.listTools();
|
|
253
|
+
const serverTools = result.tools || [];
|
|
254
|
+
const allTools = [...context.virtualTools, ...serverTools];
|
|
255
|
+
const tool = allTools.find((t) => t.name === toolName);
|
|
256
|
+
if (!tool) {
|
|
257
|
+
context.result = { success: false, error: `Tool not found: ${toolName}` };
|
|
258
|
+
return { success: false, error: new Error(`Tool not found: ${toolName}`) };
|
|
259
|
+
}
|
|
260
|
+
context.result = { success: true, data: this.formatSchema(tool) };
|
|
261
|
+
return { success: true };
|
|
262
|
+
}
|
|
263
|
+
formatSchema(tool) {
|
|
264
|
+
const schema = tool.inputSchema;
|
|
265
|
+
const args = {};
|
|
266
|
+
if (schema?.properties) {
|
|
267
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
268
|
+
const required = schema.required?.includes(key) ? "(required)" : "(optional)";
|
|
269
|
+
args[key] = `${prop.type} ${required}${prop.description ? " - " + prop.description : ""}`;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
name: tool.name,
|
|
274
|
+
description: tool.description,
|
|
275
|
+
virtual: tool.virtual ?? false,
|
|
276
|
+
arguments: args,
|
|
277
|
+
example: this.generateExample(tool)
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
generateExample(tool) {
|
|
281
|
+
const exampleArgs = {};
|
|
282
|
+
if (tool.inputSchema?.properties) {
|
|
283
|
+
for (const [key, prop] of Object.entries(tool.inputSchema.properties)) {
|
|
284
|
+
exampleArgs[key] = prop.type === "string" ? `<${key}>` : `<${prop.type}>`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return `stitch-mcp tool ${tool.name} -d '${JSON.stringify(exampleArgs)}'`;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// src/commands/tool/steps/ParseArgsStep.ts
|
|
292
|
+
class ParseArgsStep {
|
|
293
|
+
id = "parse-args";
|
|
294
|
+
name = "Parse tool arguments";
|
|
295
|
+
async shouldRun(context) {
|
|
296
|
+
return !!context.input.toolName && context.input.toolName !== "list" && !context.input.showSchema;
|
|
297
|
+
}
|
|
298
|
+
async run(context) {
|
|
299
|
+
let args = {};
|
|
300
|
+
if (context.input.data) {
|
|
301
|
+
args = JSON.parse(context.input.data);
|
|
302
|
+
} else if (context.input.dataFile) {
|
|
303
|
+
const content = await Bun.file(context.input.dataFile.replace("@", "")).text();
|
|
304
|
+
args = JSON.parse(content);
|
|
305
|
+
}
|
|
306
|
+
context.parsedArgs = args;
|
|
307
|
+
return { success: true };
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// src/commands/tool/steps/ValidateToolStep.ts
|
|
312
|
+
class ValidateToolStep {
|
|
313
|
+
id = "validate-tool";
|
|
314
|
+
name = "Validate tool exists";
|
|
315
|
+
async shouldRun(context) {
|
|
316
|
+
return !!context.input.toolName && context.input.toolName !== "list" && !context.input.showSchema && context.parsedArgs !== undefined;
|
|
317
|
+
}
|
|
318
|
+
async run(context) {
|
|
319
|
+
const toolName = context.input.toolName;
|
|
320
|
+
const result = await context.client.listTools();
|
|
321
|
+
const serverTools = result.tools || [];
|
|
322
|
+
const allTools = [...context.virtualTools, ...serverTools];
|
|
323
|
+
const found = allTools.find((t) => t.name === toolName);
|
|
324
|
+
if (!found) {
|
|
325
|
+
const availableNames = allTools.map((t) => t.name).sort();
|
|
326
|
+
context.result = {
|
|
327
|
+
success: false,
|
|
328
|
+
error: `Tool not found: "${toolName}". Use "list_tools" to see available tools.`,
|
|
329
|
+
data: {
|
|
330
|
+
requestedTool: toolName,
|
|
331
|
+
availableTools: availableNames,
|
|
332
|
+
hint: 'Call "list_tools" to see all available tools with descriptions and schemas.'
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
return { success: false, error: new Error(`Tool not found: ${toolName}`) };
|
|
336
|
+
}
|
|
337
|
+
return { success: true };
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// src/commands/tool/steps/ExecuteToolStep.ts
|
|
342
|
+
class ExecuteToolStep {
|
|
343
|
+
id = "execute-tool";
|
|
344
|
+
name = "Execute tool";
|
|
345
|
+
async shouldRun(context) {
|
|
346
|
+
return context.parsedArgs !== undefined;
|
|
347
|
+
}
|
|
348
|
+
async run(context) {
|
|
349
|
+
const toolName = context.input.toolName;
|
|
350
|
+
const args = context.parsedArgs;
|
|
351
|
+
const virtualTool = context.virtualTools.find((t) => t.name === toolName);
|
|
352
|
+
if (virtualTool) {
|
|
353
|
+
try {
|
|
354
|
+
const result2 = await virtualTool.execute(context.client, args, context.stitch);
|
|
355
|
+
context.result = { success: true, data: result2 };
|
|
356
|
+
return { success: true };
|
|
357
|
+
} catch (e) {
|
|
358
|
+
context.result = { success: false, error: `Virtual tool execution failed: ${e.message || String(e)}` };
|
|
359
|
+
return { success: false, error: e };
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const result = await context.client.callTool(toolName, args);
|
|
363
|
+
context.result = { success: true, data: result };
|
|
364
|
+
return { success: true };
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// src/commands/tool/steps/LogExecuteToolStep.ts
|
|
369
|
+
class LogExecuteToolStep {
|
|
370
|
+
capture;
|
|
371
|
+
id = "execute-tool";
|
|
372
|
+
name = "Execute tool (with capture)";
|
|
373
|
+
constructor(capture) {
|
|
374
|
+
this.capture = capture;
|
|
375
|
+
}
|
|
376
|
+
async shouldRun(context) {
|
|
377
|
+
return context.parsedArgs !== undefined;
|
|
378
|
+
}
|
|
379
|
+
async run(context) {
|
|
380
|
+
const tool = context.input.toolName;
|
|
381
|
+
const args = context.parsedArgs;
|
|
382
|
+
const virtualTool = context.virtualTools.find((t) => t.name === tool);
|
|
383
|
+
if (virtualTool) {
|
|
384
|
+
try {
|
|
385
|
+
const result = await virtualTool.execute(context.client, args, context.stitch);
|
|
386
|
+
context.result = { success: true, data: result };
|
|
387
|
+
return { success: true };
|
|
388
|
+
} catch (e) {
|
|
389
|
+
context.result = { success: false, error: `Virtual tool execution failed: ${e.message || String(e)}` };
|
|
390
|
+
return { success: false, error: e };
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const stitch2 = context.client;
|
|
394
|
+
if (!stitch2.isConnected) {
|
|
395
|
+
await stitch2.connect();
|
|
396
|
+
}
|
|
397
|
+
const rawClient = stitch2.client;
|
|
398
|
+
if (!rawClient) {
|
|
399
|
+
context.result = { success: false, error: "logging path requires a connected StitchToolClient" };
|
|
400
|
+
return { success: false };
|
|
401
|
+
}
|
|
402
|
+
const startedAt = new Date().toISOString();
|
|
403
|
+
const t0 = Date.now();
|
|
404
|
+
let raw = null;
|
|
405
|
+
let threw = null;
|
|
406
|
+
try {
|
|
407
|
+
raw = await rawClient.callTool({ name: tool, arguments: args }, CallToolResultSchema, { timeout: 600000 });
|
|
408
|
+
} catch (e) {
|
|
409
|
+
threw = e instanceof Error ? e : new Error(String(e));
|
|
410
|
+
}
|
|
411
|
+
const finishedAt = new Date().toISOString();
|
|
412
|
+
const durationMs = Date.now() - t0;
|
|
413
|
+
try {
|
|
414
|
+
await this.capture.capture({
|
|
415
|
+
tool,
|
|
416
|
+
args,
|
|
417
|
+
result: threw ? { isError: true, content: [{ type: "text", text: threw.message }] } : raw,
|
|
418
|
+
duration_ms: durationMs,
|
|
419
|
+
started_at: startedAt,
|
|
420
|
+
finished_at: finishedAt
|
|
421
|
+
});
|
|
422
|
+
} catch (e) {
|
|
423
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
424
|
+
console.error(`[stitch-mcp log] capture failed: ${msg}`);
|
|
425
|
+
}
|
|
426
|
+
if (threw) {
|
|
427
|
+
context.result = { success: false, error: threw.message };
|
|
428
|
+
return { success: false, error: threw };
|
|
429
|
+
}
|
|
430
|
+
context.result = parseToolResponse(raw);
|
|
431
|
+
return { success: true };
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function parseToolResponse(raw) {
|
|
435
|
+
if (raw?.isError) {
|
|
436
|
+
const errorText = (raw.content ?? []).map((c) => c.type === "text" ? c.text : "").join("");
|
|
437
|
+
return { success: false, error: errorText };
|
|
438
|
+
}
|
|
439
|
+
if (raw?.structuredContent) {
|
|
440
|
+
return { success: true, data: raw.structuredContent };
|
|
441
|
+
}
|
|
442
|
+
const textContent = raw?.content?.find((c) => c.type === "text");
|
|
443
|
+
if (textContent?.text) {
|
|
444
|
+
try {
|
|
445
|
+
return { success: true, data: JSON.parse(textContent.text) };
|
|
446
|
+
} catch {
|
|
447
|
+
return { success: true, data: textContent.text };
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return { success: true, data: raw };
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// src/commands/tool/handler.ts
|
|
454
|
+
var deps = {
|
|
455
|
+
runSteps,
|
|
456
|
+
ListToolsStep,
|
|
457
|
+
ShowSchemaStep,
|
|
458
|
+
ParseArgsStep,
|
|
459
|
+
ValidateToolStep,
|
|
460
|
+
ExecuteToolStep
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
class ToolCommandHandler {
|
|
464
|
+
client;
|
|
465
|
+
stitchInstance;
|
|
466
|
+
tools;
|
|
467
|
+
steps;
|
|
468
|
+
constructor(client, tools, stitchInstance) {
|
|
469
|
+
this.client = client || new StitchToolClient;
|
|
470
|
+
this.stitchInstance = stitchInstance || stitch;
|
|
471
|
+
this.tools = tools || virtualTools;
|
|
472
|
+
const executeStep = isLogEnabled() ? new LogExecuteToolStep(createCaptureHandler()) : new deps.ExecuteToolStep;
|
|
473
|
+
this.steps = [
|
|
474
|
+
new deps.ListToolsStep,
|
|
475
|
+
new deps.ShowSchemaStep,
|
|
476
|
+
new deps.ParseArgsStep,
|
|
477
|
+
new deps.ValidateToolStep,
|
|
478
|
+
executeStep
|
|
479
|
+
];
|
|
480
|
+
}
|
|
481
|
+
async execute(input) {
|
|
482
|
+
const context = {
|
|
483
|
+
input,
|
|
484
|
+
client: this.client,
|
|
485
|
+
stitch: this.stitchInstance,
|
|
486
|
+
virtualTools: this.tools
|
|
487
|
+
};
|
|
488
|
+
try {
|
|
489
|
+
await deps.runSteps(this.steps, context, {
|
|
490
|
+
onAfterStep: (_step, _result, ctx) => ctx.result !== undefined
|
|
491
|
+
});
|
|
492
|
+
} finally {
|
|
493
|
+
await this.client.close();
|
|
494
|
+
}
|
|
495
|
+
return context.result ?? { success: false, error: "No step produced a result" };
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
export {
|
|
499
|
+
deps,
|
|
500
|
+
ToolCommandHandler
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
//# debugId=AF521AAAE216BE7564756E2164756E21
|