@particle-academy/agent-integrations 0.50.0 → 0.52.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/CHANGELOG.md +91 -0
- package/README.md +69 -0
- package/dist/bridges/artboard.d.cts +3 -3
- package/dist/bridges/artboard.d.ts +3 -3
- package/dist/bridges/catalog.d.cts +3 -3
- package/dist/bridges/catalog.d.ts +3 -3
- package/dist/bridges/charts.d.cts +3 -3
- package/dist/bridges/charts.d.ts +3 -3
- package/dist/bridges/cms.d.cts +3 -3
- package/dist/bridges/cms.d.ts +3 -3
- package/dist/bridges/code.d.cts +3 -3
- package/dist/bridges/code.d.ts +3 -3
- package/dist/bridges/doc.d.cts +3 -3
- package/dist/bridges/doc.d.ts +3 -3
- package/dist/bridges/features.d.cts +3 -3
- package/dist/bridges/features.d.ts +3 -3
- package/dist/bridges/files.d.cts +3 -3
- package/dist/bridges/files.d.ts +3 -3
- package/dist/bridges/flow.d.cts +3 -3
- package/dist/bridges/flow.d.ts +3 -3
- package/dist/bridges/forms.d.cts +55 -10
- package/dist/bridges/forms.d.ts +55 -10
- package/dist/bridges/git.d.cts +3 -3
- package/dist/bridges/git.d.ts +3 -3
- package/dist/bridges/grid.d.cts +3 -3
- package/dist/bridges/grid.d.ts +3 -3
- package/dist/bridges/map.d.cts +3 -3
- package/dist/bridges/map.d.ts +3 -3
- package/dist/bridges/navigation.d.cts +3 -3
- package/dist/bridges/navigation.d.ts +3 -3
- package/dist/bridges/passkeys.d.cts +3 -3
- package/dist/bridges/passkeys.d.ts +3 -3
- package/dist/bridges/scene.d.cts +3 -3
- package/dist/bridges/scene.d.ts +3 -3
- package/dist/bridges/screen-doc.d.cts +3 -3
- package/dist/bridges/screen-doc.d.ts +3 -3
- package/dist/bridges/screens.d.cts +3 -3
- package/dist/bridges/screens.d.ts +3 -3
- package/dist/bridges/sheets.d.cts +3 -3
- package/dist/bridges/sheets.d.ts +3 -3
- package/dist/bridges/slides.d.cts +3 -3
- package/dist/bridges/slides.d.ts +3 -3
- package/dist/bridges/terminal.d.cts +3 -3
- package/dist/bridges/terminal.d.ts +3 -3
- package/dist/bridges/tui.d.cts +2 -2
- package/dist/bridges/tui.d.ts +2 -2
- package/dist/bridges/whiteboard.d.cts +3 -3
- package/dist/bridges/whiteboard.d.ts +3 -3
- package/dist/bridges-artboard.cjs +11 -5
- package/dist/bridges-artboard.cjs.map +1 -1
- package/dist/bridges-artboard.js +6 -4
- package/dist/bridges-artboard.js.map +1 -1
- package/dist/bridges-catalog.cjs +11 -5
- package/dist/bridges-catalog.cjs.map +1 -1
- package/dist/bridges-catalog.js +3 -3
- package/dist/bridges-charts.cjs +11 -5
- package/dist/bridges-charts.cjs.map +1 -1
- package/dist/bridges-charts.js +3 -3
- package/dist/bridges-cms.cjs +11 -5
- package/dist/bridges-cms.cjs.map +1 -1
- package/dist/bridges-cms.js +4 -4
- package/dist/bridges-code.cjs +11 -5
- package/dist/bridges-code.cjs.map +1 -1
- package/dist/bridges-code.js +3 -3
- package/dist/bridges-doc.cjs +11 -5
- package/dist/bridges-doc.cjs.map +1 -1
- package/dist/bridges-doc.js +3 -3
- package/dist/bridges-features.cjs +11 -5
- package/dist/bridges-features.cjs.map +1 -1
- package/dist/bridges-features.js +3 -3
- package/dist/bridges-files.cjs +11 -5
- package/dist/bridges-files.cjs.map +1 -1
- package/dist/bridges-files.js +3 -3
- package/dist/bridges-flow.cjs +11 -5
- package/dist/bridges-flow.cjs.map +1 -1
- package/dist/bridges-flow.js +6 -4
- package/dist/bridges-flow.js.map +1 -1
- package/dist/bridges-forms.cjs +123 -16
- package/dist/bridges-forms.cjs.map +1 -1
- package/dist/bridges-forms.js +4 -3
- package/dist/bridges-git.cjs +10 -5
- package/dist/bridges-git.cjs.map +1 -1
- package/dist/bridges-git.js +3 -3
- package/dist/bridges-grid.cjs +11 -5
- package/dist/bridges-grid.cjs.map +1 -1
- package/dist/bridges-grid.js +3 -3
- package/dist/bridges-map.cjs +11 -5
- package/dist/bridges-map.cjs.map +1 -1
- package/dist/bridges-map.js +3 -3
- package/dist/bridges-navigation.cjs +11 -5
- package/dist/bridges-navigation.cjs.map +1 -1
- package/dist/bridges-navigation.js +3 -3
- package/dist/bridges-passkeys.cjs +11 -5
- package/dist/bridges-passkeys.cjs.map +1 -1
- package/dist/bridges-passkeys.js +3 -3
- package/dist/bridges-scene.cjs +11 -5
- package/dist/bridges-scene.cjs.map +1 -1
- package/dist/bridges-scene.js +3 -3
- package/dist/bridges-screen-doc.cjs +14 -6
- package/dist/bridges-screen-doc.cjs.map +1 -1
- package/dist/bridges-screen-doc.js +4 -4
- package/dist/bridges-screens.cjs +15 -7
- package/dist/bridges-screens.cjs.map +1 -1
- package/dist/bridges-screens.js +4 -3
- package/dist/bridges-sheets.cjs +11 -5
- package/dist/bridges-sheets.cjs.map +1 -1
- package/dist/bridges-sheets.js +3 -3
- package/dist/bridges-slides.cjs +11 -5
- package/dist/bridges-slides.cjs.map +1 -1
- package/dist/bridges-slides.js +3 -3
- package/dist/bridges-terminal.cjs +11 -5
- package/dist/bridges-terminal.cjs.map +1 -1
- package/dist/bridges-terminal.js +3 -3
- package/dist/bridges-tui.cjs +1 -1
- package/dist/bridges-tui.cjs.map +1 -1
- package/dist/bridges-tui.js +2 -2
- package/dist/bridges-whiteboard.cjs +11 -5
- package/dist/bridges-whiteboard.cjs.map +1 -1
- package/dist/bridges-whiteboard.js +3 -3
- package/dist/{chunk-CZV3WUW5.js → chunk-3GFKC6OK.js} +20 -7
- package/dist/chunk-3GFKC6OK.js.map +1 -0
- package/dist/{chunk-JLHVQWOV.js → chunk-6Q3PMT7K.js} +4 -4
- package/dist/chunk-6Q3PMT7K.js.map +1 -0
- package/dist/{chunk-HOZCDDRA.js → chunk-7HHZBPDE.js} +9 -29
- package/dist/chunk-7HHZBPDE.js.map +1 -0
- package/dist/{chunk-VFWFT3OK.js → chunk-AL77RO25.js} +97 -17
- package/dist/chunk-AL77RO25.js.map +1 -0
- package/dist/{chunk-AXWMWYH5.js → chunk-C4AQ2YBW.js} +7 -6
- package/dist/chunk-C4AQ2YBW.js.map +1 -0
- package/dist/{chunk-NH6HUVXQ.js → chunk-CI5ZVHDY.js} +8 -6
- package/dist/chunk-CI5ZVHDY.js.map +1 -0
- package/dist/{chunk-5ZWNCHZS.js → chunk-CKJL5C7A.js} +8 -6
- package/dist/chunk-CKJL5C7A.js.map +1 -0
- package/dist/chunk-DPBAEWB5.js +28 -0
- package/dist/chunk-DPBAEWB5.js.map +1 -0
- package/dist/{chunk-BG3QXNM6.js → chunk-HNVHAY4A.js} +8 -6
- package/dist/chunk-HNVHAY4A.js.map +1 -0
- package/dist/{chunk-5M5ELTHE.js → chunk-KAEPC6N4.js} +8 -6
- package/dist/chunk-KAEPC6N4.js.map +1 -0
- package/dist/{chunk-3WVXAB3D.js → chunk-M423JOQ3.js} +3 -3
- package/dist/{chunk-3WVXAB3D.js.map → chunk-M423JOQ3.js.map} +1 -1
- package/dist/{chunk-SWWJUOCY.js → chunk-MKC633WU.js} +3 -3
- package/dist/{chunk-SWWJUOCY.js.map → chunk-MKC633WU.js.map} +1 -1
- package/dist/{chunk-LQB42OSA.js → chunk-MKJE6V4Z.js} +8 -6
- package/dist/chunk-MKJE6V4Z.js.map +1 -0
- package/dist/{chunk-MIDZWKIF.js → chunk-NB5AQIR2.js} +8 -6
- package/dist/chunk-NB5AQIR2.js.map +1 -0
- package/dist/{chunk-VMRUW4B4.js → chunk-OUUHFR4N.js} +8 -6
- package/dist/chunk-OUUHFR4N.js.map +1 -0
- package/dist/{chunk-FCXSR7I5.js → chunk-P6SJBP5T.js} +8 -6
- package/dist/chunk-P6SJBP5T.js.map +1 -0
- package/dist/{chunk-5JLTXHX6.js → chunk-PMPBI6I3.js} +7 -5
- package/dist/chunk-PMPBI6I3.js.map +1 -0
- package/dist/{chunk-4WVLZ6YP.js → chunk-PV4FZDYX.js} +8 -6
- package/dist/chunk-PV4FZDYX.js.map +1 -0
- package/dist/{chunk-3UUF5KKZ.js → chunk-QEVSNDJW.js} +8 -6
- package/dist/chunk-QEVSNDJW.js.map +1 -0
- package/dist/{chunk-VOCUGTZB.js → chunk-S4DA2UTJ.js} +8 -6
- package/dist/chunk-S4DA2UTJ.js.map +1 -0
- package/dist/{chunk-RVMM4BHK.js → chunk-V6EHKHSF.js} +8 -6
- package/dist/chunk-V6EHKHSF.js.map +1 -0
- package/dist/{chunk-36MKPTVD.js → chunk-VE7TRWZR.js} +8 -6
- package/dist/chunk-VE7TRWZR.js.map +1 -0
- package/dist/{chunk-Z5NL5D4J.js → chunk-VFUKZ6UA.js} +8 -6
- package/dist/chunk-VFUKZ6UA.js.map +1 -0
- package/dist/{chunk-3HVYUMQF.js → chunk-VHB3VE53.js} +8 -6
- package/dist/chunk-VHB3VE53.js.map +1 -0
- package/dist/{chunk-R4XXOGQH.js → chunk-ZDKYKJFH.js} +10 -6
- package/dist/chunk-ZDKYKJFH.js.map +1 -0
- package/dist/components-shared-whiteboard.cjs +29 -10
- package/dist/components-shared-whiteboard.cjs.map +1 -1
- package/dist/components-shared-whiteboard.js +3 -3
- package/dist/dom-navigation/index.d.cts +3 -3
- package/dist/dom-navigation/index.d.ts +3 -3
- package/dist/index.cjs +211 -78
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +27 -26
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.cts +5 -5
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/stdio.d.cts +3 -3
- package/dist/mcp/stdio.d.ts +3 -3
- package/dist/mcp.cjs +18 -5
- package/dist/mcp.cjs.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/presence/index.d.cts +1 -1
- package/dist/presence/index.d.ts +1 -1
- package/dist/{server-1y0n61R5.d.cts → server-DJJygNo1.d.cts} +2 -2
- package/dist/{server-vq6qVl3T.d.ts → server-Dwo9LOxh.d.ts} +2 -2
- package/dist/sharing/index.d.cts +3 -3
- package/dist/sharing/index.d.ts +3 -3
- package/dist/sheets-adapter.d.cts +3 -3
- package/dist/sheets-adapter.d.ts +3 -3
- package/dist/{tool-host-LYfdPE8u.d.ts → tool-host-BBSaU7IJ.d.cts} +10 -4
- package/dist/{tool-host-D67N2a2h.d.cts → tool-host-BqJRPr_T.d.ts} +10 -4
- package/dist/{types-DP5yQZQU.d.cts → types-D_H2f-wF.d.cts} +1 -1
- package/dist/{types-VX_9je7w.d.ts → types-D_TzdBsK.d.ts} +1 -1
- package/dist/{types-gzIpsUDE.d.cts → types-ITRQFAir.d.cts} +26 -1
- package/dist/{types-gzIpsUDE.d.ts → types-ITRQFAir.d.ts} +26 -1
- package/dist/undo/index.d.cts +2 -2
- package/dist/undo/index.d.ts +2 -2
- package/dist/undo.cjs +7 -3
- package/dist/undo.cjs.map +1 -1
- package/dist/undo.js +3 -3
- package/docs/multi-form-hosts.md +97 -0
- package/package.json +1 -1
- package/dist/chunk-36MKPTVD.js.map +0 -1
- package/dist/chunk-3HVYUMQF.js.map +0 -1
- package/dist/chunk-3UUF5KKZ.js.map +0 -1
- package/dist/chunk-4WVLZ6YP.js.map +0 -1
- package/dist/chunk-5JLTXHX6.js.map +0 -1
- package/dist/chunk-5M5ELTHE.js.map +0 -1
- package/dist/chunk-5ZWNCHZS.js.map +0 -1
- package/dist/chunk-AXWMWYH5.js.map +0 -1
- package/dist/chunk-BG3QXNM6.js.map +0 -1
- package/dist/chunk-CZV3WUW5.js.map +0 -1
- package/dist/chunk-FCXSR7I5.js.map +0 -1
- package/dist/chunk-HOZCDDRA.js.map +0 -1
- package/dist/chunk-JLHVQWOV.js.map +0 -1
- package/dist/chunk-LQB42OSA.js.map +0 -1
- package/dist/chunk-MIDZWKIF.js.map +0 -1
- package/dist/chunk-NH6HUVXQ.js.map +0 -1
- package/dist/chunk-R4XXOGQH.js.map +0 -1
- package/dist/chunk-RVMM4BHK.js.map +0 -1
- package/dist/chunk-VFWFT3OK.js.map +0 -1
- package/dist/chunk-VMRUW4B4.js.map +0 -1
- package/dist/chunk-VOCUGTZB.js.map +0 -1
- package/dist/chunk-Z5NL5D4J.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/screens.ts"],"names":[],"mappings":"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","file":"chunk-7HHZBPDE.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport { emitActivity } from \"../presence/registry\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { commit, hostErrorMessage } from \"./host-commit\";\n\n/**\n * Loose snapshot of a screen — what's in fancy-screens' ScreenMeta plus\n * the host's optional activity status. Kept here so this bridge has no\n * hard dep on fancy-screens.\n */\nexport type ScreenSnapshot = {\n id: string;\n title?: string;\n /** Whether this screen is the one the human / agent is looking at. */\n active: boolean;\n /** Optional category / kind (e.g. \"form\", \"whiteboard\"). */\n kind?: string;\n};\n\n/**\n * Spec for a dynamically-created screen. The host's `createScreen`\n * implementation looks up `kind` in its template registry and instantiates\n * the matching surface (form / whiteboard / sheet / chart / markdown / etc.).\n */\nexport type ScreenCreateSpec = {\n id: string;\n title?: string;\n /** Template kind. Hosts decide the catalog. */\n kind: string;\n /** Template-specific config. Form: { fields }. Sheet: { headers }. etc. */\n config?: Record<string, unknown>;\n};\n\n/**\n * What a mutating adapter method may resolve to, to acknowledge (or refuse)\n * a commit. `{ ok: false }` is a refusal the agent can act on: `error` is\n * shown to the agent verbatim, so keep it a human-readable sentence, never a\n * stack trace or an internal path. `code` is a machine-readable hint\n * (e.g. `\"conflict\"`) for the host's own use; it is not shown to the agent.\n */\nexport type ScreensAdapterResult = { ok: true } | { ok: false; error: string; code?: string };\n\n/**\n * Return type of every mutating adapter method. A sync `void` return keeps\n * the original behaviour. A Promise makes the bridge WAIT: the tool reports\n * success, and emits its AgentActivity event, only after the promise\n * resolves. A rejection or an `{ ok: false }` result becomes an error result\n * and emits no activity.\n */\nexport type ScreensAdapterCommit = void | Promise<void | ScreensAdapterResult>;\n\n/**\n * Adapter exposes the host's screen-navigation surface to the bridge.\n * Hosts wire this up against react-router, a custom tab state, or the\n * fancy-screens registry — wherever \"current screen\" lives.\n *\n * The optional create / destroy / update hooks let agents author screens\n * dynamically against a host-defined template catalog.\n *\n * Every mutating method may be sync (`void`) or async (`Promise`); see\n * {@link ScreensAdapterCommit}. Return a Promise when the host's commit is\n * authoritative — persisted, or able to refuse or conflict — so the agent is\n * told the truth instead of \"success\" before anything was committed.\n *\n * This bridge pushes NO undo entries: `agent_undo` cannot revert a screens\n * tool. A host that needs undo for navigation or screen authoring must keep\n * its own history.\n */\nexport type ScreensBridgeAdapter = {\n /** List every available screen. */\n listScreens: () => ScreenSnapshot[];\n /** Read which screen is currently active. */\n getActive: () => string | null;\n /** Navigate to a screen by id. Host updates router / tab state. */\n setActive: (screenId: string) => ScreensAdapterCommit;\n /** Optional: instantiate a new screen from a template + config. */\n createScreen?: (spec: ScreenCreateSpec) => ScreensAdapterCommit;\n /** Optional: remove a previously-created screen. */\n destroyScreen?: (screenId: string) => ScreensAdapterCommit;\n /** Optional: shallow-merge new config into an existing screen. */\n updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => ScreensAdapterCommit;\n /** Optional: enumerate the kinds the host knows how to instantiate. */\n listKinds?: () => Array<{ kind: string; label?: string; description?: string; configSchema?: unknown }>;\n};\n\nexport type ScreensBridgeOptions = {\n adapter: ScreensBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerScreensBridge — top-level navigation bridge so agents can\n * switch between screens (`screens_navigate`) and discover what surfaces\n * exist (`screens_list`, `screens_describe_active`).\n *\n * Pair with the per-surface bridges (whiteboard, form, sheet, etc.) so\n * the agent has both navigation and per-screen control.\n */\nexport function registerScreensBridge(\n host: ToolHost,\n options: ScreensBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = \"screens\";\n\n // agent_undo / agent_redo / agent_history are registered whenever any bridge\n // mounts, so undo availability doesn't hinge on which bridges are co-present.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (screenId: string): AgentTarget => ({\n kind: \"screens\",\n screenId,\n label: `Screen ${screenId}`,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n isMutation: boolean,\n targetFromArgs?: (args: JsonObject) => AgentTarget,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try { return await handler(args); }\n catch (e) { return errorResult(hostErrorMessage(e, `${name} failed.`)); }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name, agent, kind: \"screens\",\n resolveTarget: ({ args }) => targetFromArgs?.(args) ?? null,\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n reg(\n \"screens_list\",\n \"List every screen the host has registered. Returns id, title, active flag, and optional kind.\",\n {},\n [],\n () => {\n const screens = adapter.listScreens();\n const text = screens\n .map((s) => `${s.active ? \"▸\" : \" \"} ${s.id}${s.title ? ` — ${s.title}` : \"\"}${s.kind ? ` [${s.kind}]` : \"\"}`)\n .join(\"\\n\");\n return textResult(text || \"(no screens)\", { screens, active: adapter.getActive() });\n },\n false,\n );\n\n reg(\n \"screens_describe_active\",\n \"Get the currently-active screen id (or null).\",\n {},\n [],\n () => {\n const active = adapter.getActive();\n return textResult(active ?? \"(none)\", { active });\n },\n false,\n );\n\n reg(\n \"screens_list_kinds\",\n \"List the screen kinds (templates) the host knows how to instantiate. Use this before screens_create to know what's available.\",\n {},\n [],\n () => {\n if (!adapter.listKinds) return errorResult(\"Host did not register a kind catalog. Cannot create screens dynamically.\");\n const kinds = adapter.listKinds();\n const text = kinds.map((k) => `${k.kind}${k.label ? ` — ${k.label}` : \"\"}${k.description ? ` (${k.description})` : \"\"}`).join(\"\\n\");\n return textResult(text || \"(no kinds registered)\", kinds);\n },\n false,\n );\n\n reg(\n \"screens_create\",\n \"Instantiate a new screen from a template kind + config. Switches the active view to the new screen.\",\n {\n id: { type: \"string\", description: \"Stable screen id. Must be unique.\" },\n title: { type: \"string\" },\n kind: { type: \"string\", description: \"Template kind — call screens_list_kinds for the catalog.\" },\n config: { type: \"object\", description: \"Template-specific config (e.g. { fields: [...] } for a form).\" },\n },\n [\"id\", \"kind\"],\n async (args) => {\n const createScreen = adapter.createScreen;\n if (!createScreen) return errorResult(\"Host did not provide createScreen.\");\n const id = String(args.id);\n const kind = String(args.kind);\n if (adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`Screen ${id} already exists. Use screens_destroy first or pick a fresh id.`);\n }\n const created = await commit(() => createScreen({\n id,\n title: typeof args.title === \"string\" ? args.title : undefined,\n kind,\n config: (args.config && typeof args.config === \"object\") ? args.config as Record<string, unknown> : undefined,\n }), `Host failed to create screen \"${id}\".`);\n // Nothing was created, so there is nothing to activate.\n if (!created.ok) return errorResult(created.error);\n\n const activated = await commit(() => adapter.setActive(id), `Host failed to activate screen \"${id}\".`);\n if (!activated.ok) {\n // Partial commit: the screen EXISTS but is not showing. Reported as an\n // error so an agent branching on isError does not go on to tell the\n // human \"look at the new screen\". The create DID commit, though, and\n // every committed mutation must be observable, so its activity is\n // emitted here by hand (wrapToolWithActivity skips error results).\n const state = { id, kind, created: true, activated: false };\n emitActivity({\n agentId: agent.id,\n agentName: agent.name,\n agentColor: agent.color,\n target: target(id),\n action: \"screens_create\",\n timestamp: Date.now(),\n meta: state,\n });\n return {\n ...errorResult(\n `Screen \"${id}\" was created but not activated: ${activated.error} ` +\n \"The screen exists; do not call screens_create again. \" +\n \"Call screens_navigate to show it, or screens_destroy to remove it.\",\n ),\n structuredContent: state,\n };\n }\n return textResult(`Created ${kind} screen \"${id}\"`, { id, kind });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_destroy\",\n \"Remove a previously-created screen. Active screen falls back to the first remaining one (or null).\",\n { id: { type: \"string\" } },\n [\"id\"],\n async (args) => {\n const destroyScreen = adapter.destroyScreen;\n if (!destroyScreen) return errorResult(\"Host did not provide destroyScreen.\");\n const id = String(args.id);\n if (!adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`No screen with id ${id}`);\n }\n const done = await commit(() => destroyScreen(id), `Host failed to destroy screen \"${id}\".`);\n if (!done.ok) return errorResult(done.error);\n return textResult(`Destroyed screen ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_set_layout\",\n \"Change the layout of an existing composite screen. Layouts: 'single', 'split-h' (left/right), 'split-v' (top/bottom), 'grid-2x2', 'stack' (tabs).\",\n {\n id: { type: \"string\" },\n layout: { type: \"string\", enum: [\"single\", \"split-h\", \"split-v\", \"grid-2x2\", \"stack\"] },\n },\n [\"id\", \"layout\"],\n async (args) => {\n const updateScreenContent = adapter.updateScreenContent;\n if (!updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n const id = String(args.id);\n const done = await commit(\n () => updateScreenContent(id, { layout: String(args.layout) }),\n `Host failed to change the layout of screen \"${id}\".`,\n );\n if (!done.ok) return errorResult(done.error);\n return textResult(`Layout of ${args.id} → ${args.layout}`, { id: args.id, layout: args.layout });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_update_content\",\n \"Merge new config into an existing screen (e.g. add a field to a form, append a sheet column, change chart series).\",\n {\n id: { type: \"string\" },\n partial: { type: \"object\", description: \"Shallow-merged into the screen's config.\" },\n },\n [\"id\", \"partial\"],\n async (args) => {\n const updateScreenContent = adapter.updateScreenContent;\n if (!updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n const id = String(args.id);\n const partial = (args.partial && typeof args.partial === \"object\") ? args.partial as Record<string, unknown> : {};\n const done = await commit(() => updateScreenContent(id, partial), `Host failed to update screen \"${id}\".`);\n if (!done.ok) return errorResult(done.error);\n return textResult(`Updated content of ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_navigate\",\n \"Switch the human's view to a different screen. The host updates its router / tab state and re-renders.\",\n { screen: { type: \"string\", description: \"Screen id to activate.\" } },\n [\"screen\"],\n async (args) => {\n const screenId = String(args.screen ?? \"\");\n const screens = adapter.listScreens();\n if (!screens.find((s) => s.id === screenId)) {\n return errorResult(`No screen registered with id \"${screenId}\". Call screens_list first.`);\n }\n const done = await commit(() => adapter.setActive(screenId), `Host failed to navigate to screen \"${screenId}\".`);\n if (!done.ok) return errorResult(done.error);\n return textResult(`Navigated to ${screenId}`, { screen: screenId });\n },\n true,\n (args) => target(String(args.screen ?? \"\")),\n );\n\n return {\n id: bridgeId,\n title: \"Screens\",\n dispose: () => { for (const d of disposers) d(); },\n };\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { commit, hostErrorMessage } from './chunk-DPBAEWB5.js';
|
|
2
|
+
import { ensureUndoToolsRegistered } from './chunk-ZDKYKJFH.js';
|
|
2
3
|
import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
|
|
3
|
-
import {
|
|
4
|
+
import { emitActivity } from './chunk-C3TYI5TJ.js';
|
|
5
|
+
import { textResult, errorResult } from './chunk-3GFKC6OK.js';
|
|
4
6
|
|
|
5
7
|
// src/bridges/forms.ts
|
|
6
8
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
@@ -9,8 +11,36 @@ function registerFormBridge(host, options) {
|
|
|
9
11
|
const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
|
|
10
12
|
const pendingMode = options.pendingMode ?? true;
|
|
11
13
|
const disposers = [];
|
|
14
|
+
const bridgeId = `form:${adapter.id}`;
|
|
12
15
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
13
16
|
const formId = adapter.id;
|
|
17
|
+
let disposed = false;
|
|
18
|
+
const onDispose = /* @__PURE__ */ new Set();
|
|
19
|
+
const CLOSED = /* @__PURE__ */ Symbol("form-closed");
|
|
20
|
+
const untilClosed = (p) => {
|
|
21
|
+
if (disposed) {
|
|
22
|
+
p.catch(() => {
|
|
23
|
+
});
|
|
24
|
+
return Promise.resolve(CLOSED);
|
|
25
|
+
}
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const close = () => resolve(CLOSED);
|
|
28
|
+
onDispose.add(close);
|
|
29
|
+
p.then(
|
|
30
|
+
(v) => {
|
|
31
|
+
onDispose.delete(close);
|
|
32
|
+
resolve(v);
|
|
33
|
+
},
|
|
34
|
+
(e) => {
|
|
35
|
+
onDispose.delete(close);
|
|
36
|
+
reject(e);
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
const closedUnknown = (what) => errorResult(
|
|
42
|
+
`Form "${formId}" was closed before the host confirmed ${what}, so whether it was applied is unknown. Do not assume it was. If the form is open again, read it back (form_get_values) before retrying.`
|
|
43
|
+
);
|
|
14
44
|
const target = (args) => ({
|
|
15
45
|
kind: "form",
|
|
16
46
|
screenId: adapter.screenId,
|
|
@@ -22,7 +52,7 @@ function registerFormBridge(host, options) {
|
|
|
22
52
|
try {
|
|
23
53
|
return await handler(args);
|
|
24
54
|
} catch (e) {
|
|
25
|
-
return errorResult(e
|
|
55
|
+
return errorResult(hostErrorMessage(e, `${name} failed.`));
|
|
26
56
|
}
|
|
27
57
|
};
|
|
28
58
|
const final = isMutation ? wrapToolWithActivity(wrapped, {
|
|
@@ -39,7 +69,8 @@ function registerFormBridge(host, options) {
|
|
|
39
69
|
description,
|
|
40
70
|
inputSchema: { type: "object", properties, required, additionalProperties: false }
|
|
41
71
|
},
|
|
42
|
-
final
|
|
72
|
+
final,
|
|
73
|
+
{ owner: bridgeId }
|
|
43
74
|
)
|
|
44
75
|
);
|
|
45
76
|
};
|
|
@@ -89,11 +120,15 @@ function registerFormBridge(host, options) {
|
|
|
89
120
|
value: { description: "Value to set. Type depends on the field's `type`." }
|
|
90
121
|
},
|
|
91
122
|
["field", "value"],
|
|
92
|
-
(args) => {
|
|
123
|
+
async (args) => {
|
|
93
124
|
const name = String(args.field ?? "");
|
|
94
125
|
const fieldDef = adapter.getFields().find((f) => f.name === name);
|
|
95
126
|
if (!fieldDef) return errorResult(`Unknown field: ${name}`);
|
|
96
|
-
|
|
127
|
+
const done = await untilClosed(
|
|
128
|
+
commit(() => adapter.setValue(name, args.value), `Host refused the write to "${name}".`)
|
|
129
|
+
);
|
|
130
|
+
if (done === CLOSED) return closedUnknown(`the write to "${name}"`);
|
|
131
|
+
if (!done.ok) return errorResult(done.error);
|
|
97
132
|
return textResult(`${name} \u2190 ${JSON.stringify(args.value)}`, { field: name, value: args.value });
|
|
98
133
|
},
|
|
99
134
|
true
|
|
@@ -103,16 +138,52 @@ function registerFormBridge(host, options) {
|
|
|
103
138
|
"Set multiple fields atomically. Pass a `values` object keyed by field name.",
|
|
104
139
|
{ values: { type: "object" } },
|
|
105
140
|
["values"],
|
|
106
|
-
(args) => {
|
|
141
|
+
async (args) => {
|
|
107
142
|
const values = args.values && typeof args.values === "object" ? args.values : {};
|
|
108
143
|
const fields = adapter.getFields();
|
|
109
144
|
const known = new Set(fields.map((f) => f.name));
|
|
110
145
|
const unknownKeys = Object.keys(values).filter((k) => !known.has(k));
|
|
111
146
|
if (unknownKeys.length) return errorResult(`Unknown fields: ${unknownKeys.join(", ")}`);
|
|
112
|
-
|
|
113
|
-
|
|
147
|
+
const setValues = adapter.setValues;
|
|
148
|
+
if (setValues) {
|
|
149
|
+
const done = await untilClosed(commit(() => setValues(values), "Host refused the write."));
|
|
150
|
+
if (done === CLOSED) return closedUnknown("the write");
|
|
151
|
+
if (!done.ok) return errorResult(done.error);
|
|
114
152
|
} else {
|
|
115
|
-
|
|
153
|
+
const keys = Object.keys(values);
|
|
154
|
+
const committed = [];
|
|
155
|
+
for (const [i, k] of keys.entries()) {
|
|
156
|
+
const done = await untilClosed(
|
|
157
|
+
commit(() => adapter.setValue(k, values[k]), `Host refused the write to "${k}".`)
|
|
158
|
+
);
|
|
159
|
+
if (done === CLOSED) {
|
|
160
|
+
return {
|
|
161
|
+
...closedUnknown(`the write to "${k}"`),
|
|
162
|
+
structuredContent: { committed, pending: k, notAttempted: keys.slice(i + 1) }
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (!done.ok) {
|
|
166
|
+
const state = { committed, failed: k, notAttempted: keys.slice(i + 1) };
|
|
167
|
+
if (committed.length) {
|
|
168
|
+
emitActivity({
|
|
169
|
+
agentId: agent.id,
|
|
170
|
+
agentName: agent.name,
|
|
171
|
+
agentColor: agent.color,
|
|
172
|
+
target: target({}),
|
|
173
|
+
action: "form_set_values",
|
|
174
|
+
timestamp: Date.now(),
|
|
175
|
+
meta: state
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
...errorResult(
|
|
180
|
+
`"${k}" was refused: ${done.error} ` + (committed.length ? `Already committed and NOT rolled back: ${committed.join(", ")}. ` : "Nothing was committed. ") + (state.notAttempted.length ? `Not attempted: ${state.notAttempted.join(", ")}.` : "")
|
|
181
|
+
),
|
|
182
|
+
structuredContent: state
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
committed.push(k);
|
|
186
|
+
}
|
|
116
187
|
}
|
|
117
188
|
return textResult(`Set ${Object.keys(values).length} field(s)`, { values });
|
|
118
189
|
},
|
|
@@ -142,29 +213,38 @@ function registerFormBridge(host, options) {
|
|
|
142
213
|
async () => {
|
|
143
214
|
if (!adapter.submit) return errorResult("Host did not provide a submit implementation.");
|
|
144
215
|
if (pendingMode && adapter.confirm) {
|
|
145
|
-
const
|
|
216
|
+
const confirm = adapter.confirm;
|
|
217
|
+
const ok = await untilClosed(Promise.resolve().then(() => confirm({
|
|
146
218
|
action: "submit",
|
|
147
219
|
form: formId,
|
|
148
220
|
title: adapter.title,
|
|
149
221
|
values: adapter.getValues()
|
|
150
|
-
});
|
|
222
|
+
})));
|
|
223
|
+
if (ok === CLOSED) {
|
|
224
|
+
return errorResult(`Form "${formId}" was closed before the submit was confirmed. Nothing was submitted.`);
|
|
225
|
+
}
|
|
151
226
|
if (!ok) return errorResult("Declined by user");
|
|
152
227
|
}
|
|
153
|
-
const
|
|
154
|
-
|
|
228
|
+
const submit = adapter.submit;
|
|
229
|
+
const result = await untilClosed(Promise.resolve().then(() => submit()));
|
|
230
|
+
if (result === CLOSED) return closedUnknown("the submit");
|
|
231
|
+
if (!result.ok) return errorResult(hostErrorMessage(result.error, "Submit failed"));
|
|
155
232
|
return textResult("Submitted", { values: result.values });
|
|
156
233
|
},
|
|
157
234
|
true
|
|
158
235
|
);
|
|
159
236
|
return {
|
|
160
|
-
id:
|
|
237
|
+
id: bridgeId,
|
|
161
238
|
title: adapter.title ?? formId,
|
|
162
239
|
dispose: () => {
|
|
240
|
+
disposed = true;
|
|
163
241
|
for (const d of disposers) d();
|
|
242
|
+
for (const close of [...onDispose]) close();
|
|
243
|
+
onDispose.clear();
|
|
164
244
|
}
|
|
165
245
|
};
|
|
166
246
|
}
|
|
167
247
|
|
|
168
248
|
export { registerFormBridge };
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
170
|
-
//# sourceMappingURL=chunk-
|
|
249
|
+
//# sourceMappingURL=chunk-AL77RO25.js.map
|
|
250
|
+
//# sourceMappingURL=chunk-AL77RO25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/forms.ts"],"names":[],"mappings":"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","file":"chunk-AL77RO25.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { emitActivity } from \"../presence/registry\";\nimport { commit, hostErrorMessage } from \"./host-commit\";\n\n/**\n * Field descriptor — what the host says about each form field. Mirrors the\n * subset of HTML / react-fancy input shapes agents care about.\n */\nexport type FormFieldDescriptor = {\n /** Form-local field name. Matches the key the host uses in its values map. */\n name: string;\n /** Display label. */\n label?: string;\n /** Logical type. Drives validation + agent expectations. */\n type:\n | \"text\"\n | \"textarea\"\n | \"number\"\n | \"email\"\n | \"password\"\n | \"url\"\n | \"date\"\n | \"select\"\n | \"multi-select\"\n | \"checkbox\"\n | \"switch\"\n | \"radio\"\n | \"file\"\n | \"json\";\n /** Allowed values for select / radio. */\n options?: Array<{ value: string; label: string }>;\n /** Whether the field must be filled before submit. */\n required?: boolean;\n /** Free-text hint surfaced to the agent. */\n description?: string;\n /** Default value (presented in get_value when nothing set). */\n defaultValue?: unknown;\n};\n\n/**\n * Adapter the host wires per form. Matches the controlled-state pattern\n * react-fancy already uses (`value` / `onValueChange`); this adapter just\n * exposes those state slots in a form-shaped way the bridge can call.\n *\n * `setValue` / `setValues` may be sync (`void`) or async (a Promise); see\n * {@link FormAdapterCommit}. Return a Promise when the host's write is\n * authoritative — a persisted draft, or one the host can refuse or report\n * stale — so the agent is told the truth instead of \"success\" before anything\n * was accepted.\n *\n * This bridge pushes NO undo entries: `agent_undo` cannot revert a form write.\n */\nexport type FormBridgeAdapter = {\n /** Stable id for the form (used in form_describe + presence target). */\n id: string;\n /** Display title for human-readable logs. */\n title?: string;\n /** Optional fancy-screens screen id this form belongs to. */\n screenId?: string;\n /** Field descriptors. The bridge uses these for schema introspection\n * (form_describe). Agents call this first to know what to fill. */\n getFields: () => FormFieldDescriptor[];\n /** Read a single field's current value. */\n getValue: (name: string) => unknown;\n /** Read all values as { fieldName: value }. */\n getValues: () => Record<string, unknown>;\n /**\n * Set a single field's value. The host wires this to its setState, or to\n * an authoritative write it awaits. Sync `void` behaves as it always has; a\n * Promise is awaited, and a rejection or `{ ok: false }` is the tool's error.\n */\n setValue: (name: string, value: unknown) => FormAdapterCommit;\n /**\n * Set many at once, ideally as one host commit. Same sync/async contract as\n * `setValue`. When absent, the bridge awaits `setValue` once per field in\n * order and stops at the first refusal (so that path is NOT atomic).\n */\n setValues?: (values: Record<string, unknown>) => FormAdapterCommit;\n /** Programmatically focus a field (host implements DOM focus). Optional. */\n focus?: (name: string) => void;\n /** Submit the form. Returns the values that were submitted (or rejection). */\n submit?: () => Promise<{ ok: boolean; values?: Record<string, unknown>; error?: string }>;\n /**\n * Human confirm gate for `form_submit` (trust-but-verify). When `pendingMode`\n * is on, the bridge calls this before submitting; return false to decline.\n * Wire it to a human control — submitting a form is a human-visible,\n * often-destructive action (checkout, delete, invite).\n */\n confirm?: (request: FormConfirmRequest) => Promise<boolean> | boolean;\n};\n\n/**\n * What an async `setValue` / `setValues` may resolve to, to acknowledge (or\n * refuse) a write. `{ ok: false }` is a refusal the agent can act on: `error`\n * is shown to the agent verbatim, so keep it a human-readable sentence (e.g.\n * \"Draft changed since you read it; re-read and retry\"), never a stack trace or\n * an internal path. `code` (e.g. `\"stale\"`, `\"forbidden\"`) is for the host's own\n * use; it is not shown to the agent.\n */\nexport type FormAdapterResult = { ok: true } | { ok: false; error: string; code?: string };\n\n/**\n * Return type of `setValue` / `setValues`. A sync `void` return keeps the\n * original behaviour. A Promise makes the bridge WAIT: the tool reports\n * success, and emits its AgentActivity event, only after the promise resolves\n * (to `void` or `{ ok: true }`). A rejection or `{ ok: false }` becomes that\n * tool call's error result and emits no activity. If the bridge is disposed\n * while the write is pending, the call settles at once as an error saying the\n * outcome is unknown, and a later settle is ignored.\n */\nexport type FormAdapterCommit = void | Promise<void | FormAdapterResult>;\n\n/** What a `form_submit` confirm gate is asked to approve. */\nexport type FormConfirmRequest = {\n action: \"submit\";\n form: string;\n title?: string;\n values: Record<string, unknown>;\n};\n\nexport type FormBridgeOptions = {\n adapter: FormBridgeAdapter;\n /** Identity tagged into activity events. */\n agent?: { id: string; name?: string; color?: string };\n /**\n * Stage `form_submit` for human confirmation via `adapter.confirm` instead of\n * submitting immediately. **Default: ON** (matches the navigation bridge and\n * the Human+ trust-but-verify contract). Set false only when auto-submit is\n * safe. If on without an `adapter.confirm`, submit proceeds (nothing to gate).\n */\n pendingMode?: boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerFormBridge — wires schema-driven MCP access to a single form.\n *\n * ONE form bridge per host. The tool names (`form_set_value`, …) are not\n * scoped to the form id, so since 0.51.0 a second form bridge with a different\n * adapter id on the same host throws (the duplicate-registrant refusal); a\n * remount of the SAME form re-registers fine. For several forms, give each its\n * own host for now — see `docs/multi-form-hosts.md`.\n */\nexport function registerFormBridge(\n host: ToolHost,\n options: FormBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const pendingMode = options.pendingMode ?? true;\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = `form:${adapter.id}`;\n\n // agent_undo / agent_redo / agent_history are registered whenever any bridge\n // mounts, so undo availability doesn't hinge on which bridges are co-present.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n const formId = adapter.id;\n\n // Close handling. A host may dispose the bridge (the form unmounts) while a\n // write or a human confirm is still pending; its promise may then never\n // settle. Every awaited host call is raced against dispose, so the tool call\n // settles at once instead of hanging, and a late settle is ignored.\n let disposed = false;\n const onDispose = new Set<() => void>();\n const CLOSED: unique symbol = Symbol(\"form-closed\");\n const untilClosed = <T>(p: Promise<T>): Promise<T | typeof CLOSED> => {\n if (disposed) {\n p.catch(() => {}); // a late rejection must never be unhandled\n return Promise.resolve(CLOSED);\n }\n return new Promise<T | typeof CLOSED>((resolve, reject) => {\n const close = () => resolve(CLOSED);\n onDispose.add(close);\n p.then(\n (v) => { onDispose.delete(close); resolve(v); },\n (e) => { onDispose.delete(close); reject(e); },\n );\n });\n };\n const closedUnknown = (what: string) =>\n errorResult(\n `Form \"${formId}\" was closed before the host confirmed ${what}, so whether it was applied is unknown. ` +\n \"Do not assume it was. If the form is open again, read it back (form_get_values) before retrying.\",\n );\n\n const target =(args: any): AgentTarget => ({\n kind: \"form\",\n screenId: adapter.screenId,\n elementId: typeof args?.field === \"string\" ? `${formId}:${args.field}` : formId,\n label: typeof args?.field === \"string\"\n ? `${adapter.title ?? formId} → ${args.field}`\n : adapter.title ?? formId,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n isMutation: boolean,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(hostErrorMessage(e, `${name} failed.`));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent: { id: agent.id, name: agent.name, color: agent.color },\n kind: \"form\",\n screenId: adapter.screenId,\n resolveTarget: ({ args }) => target(args),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n // ───────────── Read tools ─────────────\n\n reg(\n \"form_describe\",\n `Describe the form \"${formId}\" — fields, types, options, required flags. Call this first to know what's fillable.`,\n {},\n [],\n () => {\n const fields = adapter.getFields();\n const text = fields\n .map((f) => `${f.name}${f.required ? \"*\" : \"\"} (${f.type})${f.label ? ` — ${f.label}` : \"\"}`)\n .join(\"\\n\");\n return textResult(text || \"(no fields)\", { id: formId, title: adapter.title, fields });\n },\n false,\n );\n\n reg(\n \"form_get_value\",\n \"Read a single field's current value.\",\n { field: { type: \"string\" } },\n [\"field\"],\n (args) => {\n const name = String(args.field ?? \"\");\n if (!adapter.getFields().find((f) => f.name === name)) {\n return errorResult(`Unknown field: ${name}`);\n }\n const value = adapter.getValue(name);\n return textResult(JSON.stringify(value), { field: name, value });\n },\n false,\n );\n\n reg(\n \"form_get_values\",\n \"Read every field's current value as a JSON object.\",\n {},\n [],\n () => {\n const values = adapter.getValues();\n return textResult(JSON.stringify(values, null, 2), values);\n },\n false,\n );\n\n // ───────────── Mutation tools ─────────────\n\n reg(\n \"form_set_value\",\n \"Set one field's value. The host's controlled state updates and the human sees the field change.\",\n {\n field: { type: \"string\" },\n value: { description: \"Value to set. Type depends on the field's `type`.\" },\n },\n [\"field\", \"value\"],\n async (args) => {\n const name = String(args.field ?? \"\");\n const fieldDef = adapter.getFields().find((f) => f.name === name);\n if (!fieldDef) return errorResult(`Unknown field: ${name}`);\n const done = await untilClosed(\n commit(() => adapter.setValue(name, args.value), `Host refused the write to \"${name}\".`),\n );\n if (done === CLOSED) return closedUnknown(`the write to \"${name}\"`);\n if (!done.ok) return errorResult(done.error);\n return textResult(`${name} ← ${JSON.stringify(args.value)}`, { field: name, value: args.value });\n },\n true,\n );\n\n reg(\n \"form_set_values\",\n \"Set multiple fields atomically. Pass a `values` object keyed by field name.\",\n { values: { type: \"object\" } },\n [\"values\"],\n async (args) => {\n const values = (args.values && typeof args.values === \"object\") ? args.values as Record<string, unknown> : {};\n const fields = adapter.getFields();\n const known = new Set(fields.map((f) => f.name));\n const unknownKeys = Object.keys(values).filter((k) => !known.has(k));\n if (unknownKeys.length) return errorResult(`Unknown fields: ${unknownKeys.join(\", \")}`);\n const setValues = adapter.setValues;\n if (setValues) {\n const done = await untilClosed(commit(() => setValues(values), \"Host refused the write.\"));\n if (done === CLOSED) return closedUnknown(\"the write\");\n if (!done.ok) return errorResult(done.error);\n } else {\n // No batch setter: one host commit per field, in order, stopping at the\n // first refusal. Earlier fields stay committed, so say exactly which.\n const keys = Object.keys(values);\n const committed: string[] = [];\n for (const [i, k] of keys.entries()) {\n const done = await untilClosed(\n commit(() => adapter.setValue(k, values[k]), `Host refused the write to \"${k}\".`),\n );\n if (done === CLOSED) {\n return {\n ...closedUnknown(`the write to \"${k}\"`),\n structuredContent: { committed, pending: k, notAttempted: keys.slice(i + 1) },\n };\n }\n if (!done.ok) {\n const state = { committed, failed: k, notAttempted: keys.slice(i + 1) };\n if (committed.length) {\n // Those writes DID commit; every committed mutation is observable,\n // and wrapToolWithActivity skips error results, so emit it here.\n emitActivity({\n agentId: agent.id,\n agentName: agent.name,\n agentColor: agent.color,\n target: target({}),\n action: \"form_set_values\",\n timestamp: Date.now(),\n meta: state,\n });\n }\n return {\n ...errorResult(\n `\"${k}\" was refused: ${done.error} ` +\n (committed.length\n ? `Already committed and NOT rolled back: ${committed.join(\", \")}. `\n : \"Nothing was committed. \") +\n (state.notAttempted.length ? `Not attempted: ${state.notAttempted.join(\", \")}.` : \"\"),\n ),\n structuredContent: state,\n };\n }\n committed.push(k);\n }\n }\n return textResult(`Set ${Object.keys(values).length} field(s)`, { values });\n },\n true,\n );\n\n reg(\n \"form_focus\",\n \"Move browser focus to a field (host-implemented). Useful before streaming text into it.\",\n { field: { type: \"string\" } },\n [\"field\"],\n (args) => {\n const name = String(args.field ?? \"\");\n if (!adapter.focus) return errorResult(\"Host did not provide a focus implementation.\");\n if (!adapter.getFields().find((f) => f.name === name)) {\n return errorResult(`Unknown field: ${name}`);\n }\n adapter.focus(name);\n return textResult(`Focused ${name}`, { field: name });\n },\n true,\n );\n\n reg(\n \"form_submit\",\n \"Submit the form. Host returns ok + values (or an error). In pendingMode this is staged for the human to confirm first.\",\n {},\n [],\n async () => {\n if (!adapter.submit) return errorResult(\"Host did not provide a submit implementation.\");\n // Trust-but-verify: a form submit is a human-visible / often-destructive\n // action, so gate it on a human confirm when one is wired.\n if (pendingMode && adapter.confirm) {\n const confirm = adapter.confirm;\n const ok = await untilClosed(Promise.resolve().then(() => confirm({\n action: \"submit\",\n form: formId,\n title: adapter.title,\n values: adapter.getValues(),\n })));\n // The form went away while the human was deciding: never submit a\n // form that is no longer on screen, whatever the late answer is.\n if (ok === CLOSED) {\n return errorResult(`Form \"${formId}\" was closed before the submit was confirmed. Nothing was submitted.`);\n }\n if (!ok) return errorResult(\"Declined by user\");\n }\n const submit = adapter.submit;\n const result = await untilClosed(Promise.resolve().then(() => submit()));\n if (result === CLOSED) return closedUnknown(\"the submit\");\n if (!result.ok) return errorResult(hostErrorMessage(result.error, \"Submit failed\"));\n return textResult(\"Submitted\", { values: result.values });\n },\n true,\n );\n\n return {\n id: bridgeId,\n title: adapter.title ?? formId,\n dispose: () => {\n disposed = true;\n for (const d of disposers) d();\n // Settle every call still waiting on the host; see untilClosed.\n for (const close of [...onDispose]) close();\n onDispose.clear();\n },\n };\n}\n"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { ensureUndoToolsRegistered } from './chunk-
|
|
1
|
+
import { ensureUndoToolsRegistered } from './chunk-ZDKYKJFH.js';
|
|
2
2
|
import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
|
|
3
|
-
import { errorResult, textResult } from './chunk-
|
|
3
|
+
import { errorResult, textResult } from './chunk-3GFKC6OK.js';
|
|
4
4
|
|
|
5
5
|
// src/bridges/git.ts
|
|
6
6
|
function registerGitBridge(host, options) {
|
|
7
7
|
const agent = { id: "agent", name: "Agent", color: "#a855f7", ...options.agent ?? {} };
|
|
8
8
|
const disposers = [];
|
|
9
|
+
const bridgeId = "git";
|
|
9
10
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
10
11
|
const reg = (name, description, properties, required, handler, mutation2 = false) => {
|
|
11
12
|
const wrapped = async (args) => {
|
|
@@ -25,7 +26,7 @@ function registerGitBridge(host, options) {
|
|
|
25
26
|
name,
|
|
26
27
|
description,
|
|
27
28
|
inputSchema: { type: "object", properties, required, additionalProperties: false }
|
|
28
|
-
}, final));
|
|
29
|
+
}, final, { owner: bridgeId }));
|
|
29
30
|
};
|
|
30
31
|
reg("git_status", "Read normalized working-tree and branch status.", {}, [], async () => {
|
|
31
32
|
const result = await options.adapter.status();
|
|
@@ -86,9 +87,9 @@ function registerGitBridge(host, options) {
|
|
|
86
87
|
draft: { type: "boolean" },
|
|
87
88
|
apply: { type: "boolean" }
|
|
88
89
|
}, ["title", "sourceBranch", "targetBranch"]);
|
|
89
|
-
return { id:
|
|
90
|
+
return { id: bridgeId, title: "Git", dispose: () => disposers.forEach((dispose) => dispose()) };
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
export { registerGitBridge };
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
94
|
+
//# sourceMappingURL=chunk-C4AQ2YBW.js.map
|
|
95
|
+
//# sourceMappingURL=chunk-C4AQ2YBW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/git.ts"],"names":["mutation"],"mappings":"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","file":"chunk-C4AQ2YBW.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\nexport type GitProposal = {\n operation: string;\n arguments: Record<string, unknown>;\n summary: string;\n};\n\nexport type GitBridgeAdapter = {\n status: () => Promise<unknown>;\n log: (query: { ref?: string; limit?: number; skip?: number }) => Promise<unknown>;\n diff: (query: { from?: string; to?: string; staged?: boolean; paths?: string[] }) => Promise<unknown>;\n reviews?: (query: { state?: string; cursor?: string; limit?: number }) => Promise<unknown>;\n checks?: (revision: string) => Promise<unknown>;\n propose: (operation: string, args: Record<string, unknown>) => Promise<GitProposal>;\n applyProposal?: (proposal: GitProposal) => Promise<unknown>;\n};\n\nexport type GitBridgeOptions = {\n adapter: GitBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n /** Defaults to proposal-only. Set true only when the host has its own confirmation policy. */\n allowApply?: boolean;\n};\n\nexport function registerGitBridge(host: ToolHost, options: GitBridgeOptions): Bridge {\n const agent = { id: \"agent\", name: \"Agent\", color: \"#a855f7\", ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = \"git\";\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<unknown>,\n mutation = false,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (error) {\n return errorResult(error instanceof Error ? error.message : String(error));\n }\n };\n const final = mutation\n ? wrapToolWithActivity(wrapped as any, {\n toolName: name,\n agent,\n kind: \"git\",\n resolveTarget: ({ args }) => ({ kind: \"git\", elementId: typeof args.path === \"string\" ? args.path : undefined } as any),\n })\n : wrapped;\n disposers.push(host.registerTool({\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n }, final as any, { owner: bridgeId }));\n };\n\n reg(\"git_status\", \"Read normalized working-tree and branch status.\", {}, [], async () => {\n const result = await options.adapter.status();\n return textResult(JSON.stringify(result, null, 2), result as any);\n });\n reg(\"git_log\", \"Read normalized commit history.\", {\n ref: { type: \"string\" }, limit: { type: \"number\" }, skip: { type: \"number\" },\n }, [], async (args) => {\n const result = await options.adapter.log(args as any);\n return textResult(JSON.stringify(result, null, 2), result as any);\n });\n reg(\"git_diff\", \"Read a normalized Git diff.\", {\n from: { type: \"string\" }, to: { type: \"string\" }, staged: { type: \"boolean\" },\n paths: { type: \"array\", items: { type: \"string\" } },\n }, [], async (args) => {\n const result = await options.adapter.diff(args as any);\n return textResult(JSON.stringify(result, null, 2), result as any);\n });\n if (options.adapter.reviews) reg(\"git_reviews_list\", \"List normalized pull/merge requests.\", {\n state: { type: \"string\" }, cursor: { type: \"string\" }, limit: { type: \"number\" },\n }, [], async (args) => {\n const result = await options.adapter.reviews!(args as any);\n return textResult(JSON.stringify(result, null, 2), result as any);\n });\n if (options.adapter.checks) reg(\"git_checks\", \"Read checks or pipeline summaries for a revision.\", {\n revision: { type: \"string\" },\n }, [\"revision\"], async (args) => {\n const result = await options.adapter.checks!(String(args.revision));\n return textResult(JSON.stringify(result, null, 2), result as any);\n });\n\n const mutation = (name: string, description: string, properties: Record<string, unknown>, required: string[]) =>\n reg(name, description, properties, required, async (args) => {\n const proposal = await options.adapter.propose(name.slice(4), args);\n if (args.apply === true) {\n if (!options.allowApply || !options.adapter.applyProposal) return errorResult(\"This host requires human confirmation before applying Git writes.\");\n const result = await options.adapter.applyProposal(proposal);\n return textResult(`Applied: ${proposal.summary}`, result as any);\n }\n return textResult(`Proposed: ${proposal.summary}`, proposal as any);\n }, true);\n\n mutation(\"git_stage\", \"Propose staging paths.\", { paths: { type: \"array\", items: { type: \"string\" } }, apply: { type: \"boolean\" } }, [\"paths\"]);\n mutation(\"git_unstage\", \"Propose unstaging paths.\", { paths: { type: \"array\", items: { type: \"string\" } }, apply: { type: \"boolean\" } }, [\"paths\"]);\n mutation(\"git_commit\", \"Propose committing staged changes.\", { message: { type: \"string\" }, apply: { type: \"boolean\" } }, [\"message\"]);\n mutation(\"git_checkout\", \"Propose checking out a ref.\", { target: { type: \"string\" }, apply: { type: \"boolean\" } }, [\"target\"]);\n mutation(\"git_fetch\", \"Propose fetching a remote.\", { remote: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n mutation(\"git_pull\", \"Propose a fast-forward-only pull.\", { remote: { type: \"string\" }, branch: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n mutation(\"git_push\", \"Propose pushing a branch.\", { remote: { type: \"string\" }, branch: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n mutation(\"git_review_create\", \"Propose creating a pull/merge request.\", {\n title: { type: \"string\" }, body: { type: \"string\" }, sourceBranch: { type: \"string\" }, targetBranch: { type: \"string\" }, draft: { type: \"boolean\" }, apply: { type: \"boolean\" },\n }, [\"title\", \"sourceBranch\", \"targetBranch\"]);\n\n return { id: bridgeId, title: \"Git\", dispose: () => disposers.forEach((dispose) => dispose()) };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-
|
|
1
|
+
import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-ZDKYKJFH.js';
|
|
2
2
|
import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
|
|
3
|
-
import { textResult, errorResult } from './chunk-
|
|
3
|
+
import { textResult, errorResult } from './chunk-3GFKC6OK.js';
|
|
4
4
|
|
|
5
5
|
// src/bridges/catalog.ts
|
|
6
6
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
@@ -12,6 +12,7 @@ function registerCatalogBridge(host, options) {
|
|
|
12
12
|
const pendingMode = options.pendingMode ?? true;
|
|
13
13
|
const catalogId = adapter.id ?? "catalog";
|
|
14
14
|
const disposers = [];
|
|
15
|
+
const bridgeId = `catalog:${catalogId}`;
|
|
15
16
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
16
17
|
const target = (elementId, label) => ({
|
|
17
18
|
kind: "custom",
|
|
@@ -37,7 +38,8 @@ function registerCatalogBridge(host, options) {
|
|
|
37
38
|
disposers.push(
|
|
38
39
|
host.registerTool(
|
|
39
40
|
{ name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
|
|
40
|
-
final
|
|
41
|
+
final,
|
|
42
|
+
{ owner: bridgeId }
|
|
41
43
|
)
|
|
42
44
|
);
|
|
43
45
|
};
|
|
@@ -311,7 +313,7 @@ function registerCatalogBridge(host, options) {
|
|
|
311
313
|
(args) => target(str(args.priceId), `checkout ${str(args.priceId)}`)
|
|
312
314
|
);
|
|
313
315
|
return {
|
|
314
|
-
id:
|
|
316
|
+
id: bridgeId,
|
|
315
317
|
title: adapter.title ?? "Catalog",
|
|
316
318
|
dispose: () => {
|
|
317
319
|
for (const d of disposers.splice(0)) d();
|
|
@@ -320,5 +322,5 @@ function registerCatalogBridge(host, options) {
|
|
|
320
322
|
}
|
|
321
323
|
|
|
322
324
|
export { registerCatalogBridge };
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
//# sourceMappingURL=chunk-CI5ZVHDY.js.map
|
|
326
|
+
//# sourceMappingURL=chunk-CI5ZVHDY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/catalog.ts"],"names":[],"mappings":"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","file":"chunk-CI5ZVHDY.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Headless bridge for `@particle-academy/fancy-catalog` — a Stripe catalog with\n * NO UI surface. The adapter exposes the catalog's STORES + operations (not UI\n * getters/setters), and the tools are CRUD over products / prices + checkout +\n * Stripe sync. Mutations still funnel through `wrapToolWithActivity` so presence\n * + undo compose, and the destructive delete is `pendingMode`-gated.\n *\n * The adapter shapes below are STRUCTURAL mirrors of fancy-catalog's public\n * `Catalog` + store interfaces, defined LOCALLY so this bridge builds with the\n * sibling package absent (it's an optional peer). A real `Catalog` instance is\n * assignable to `CatalogBridgeAdapter` with no import — TypeScript is structural.\n */\n\n/** Minimal product shape crossing the MCP wire (mirror of fancy-catalog `Product`). */\nexport type CatalogProduct = {\n id: string;\n name: string;\n description?: string | null;\n active?: boolean;\n lookupKey?: string | null;\n externalId?: string | null;\n metadata?: Record<string, unknown> | null;\n [k: string]: unknown;\n};\n\n/** Minimal price shape crossing the MCP wire (mirror of fancy-catalog `Price`). */\nexport type CatalogPrice = {\n id: string;\n productId: string;\n active?: boolean;\n currency: string;\n unitAmount: number;\n type: \"recurring\" | \"one_time\";\n externalId?: string | null;\n [k: string]: unknown;\n};\n\n/** Common checkout args (mirror of fancy-catalog `CheckoutArgs`). */\nexport type CatalogCheckoutArgs = {\n customer?: string;\n successUrl: string;\n cancelUrl: string;\n metadata?: Record<string, string>;\n /** One-time checkouts only. */\n quantity?: number;\n};\n\n/**\n * Adapter = the catalog instance / stores. A live `Catalog` from fancy-catalog\n * satisfies this directly (`catalog.products`, `catalog.createProduct`, …); a\n * host can also hand-roll one over its own persistence.\n */\nexport type CatalogBridgeAdapter = {\n /** Stable id for this catalog instance (multiple catalogs ⇒ distinct ids). */\n id?: string;\n /** Display label for logs / presence. */\n title?: string;\n /** Optional fancy-screens screen id (usually unset — this is headless). */\n screenId?: string;\n\n /** Product store — `catalog.products`. */\n products: {\n find(id: string, opts?: { withTrashed?: boolean }): CatalogProduct | null | Promise<CatalogProduct | null>;\n all(opts?: { withTrashed?: boolean }): CatalogProduct[] | Promise<CatalogProduct[]>;\n remove(id: string): void | Promise<void>;\n };\n /** Price store — `catalog.prices`. */\n prices: {\n find(id: string, opts?: { withTrashed?: boolean }): CatalogPrice | null | Promise<CatalogPrice | null>;\n forProduct(productId: string, opts?: { withTrashed?: boolean }): CatalogPrice[] | Promise<CatalogPrice[]>;\n all(opts?: { withTrashed?: boolean }): CatalogPrice[] | Promise<CatalogPrice[]>;\n remove(id: string): void | Promise<void>;\n };\n\n /** Authoring helpers — `catalog.createProduct` / `catalog.createPrice` (ULIDs auto-assigned). */\n createProduct(input: Partial<CatalogProduct> & { name: string }): Promise<CatalogProduct> | CatalogProduct;\n createPrice(\n input: Partial<CatalogPrice> & { productId: string; currency: string; unitAmount: number; type: \"recurring\" | \"one_time\" },\n ): Promise<CatalogPrice> | CatalogPrice;\n\n /** Stripe sync — `catalog.syncProductAndPrices`. Optional (no-op when absent). */\n syncProductAndPrices?(product: CatalogProduct): Promise<CatalogProduct> | CatalogProduct;\n /** Connection test — `catalog.testConnection`. Optional. */\n testConnection?(): Promise<{ success: boolean; message: string; productCount?: number }> | { success: boolean; message: string; productCount?: number };\n\n /** Hosted Checkout — `catalog.getSubscriptionCheckoutUrl` / `getOneTimeCheckoutUrl`. Optional. */\n getSubscriptionCheckoutUrl?(price: CatalogPrice, args: CatalogCheckoutArgs): Promise<string> | string;\n getOneTimeCheckoutUrl?(price: CatalogPrice, args: CatalogCheckoutArgs): Promise<string> | string;\n};\n\nexport type CatalogBridgeOptions = {\n adapter: CatalogBridgeAdapter;\n /** Identity stamped on activity + undo entries. */\n agent?: { id: string; name?: string; color?: string };\n /**\n * Trust-but-verify. When on (default), destructive ops (`catalog_delete_product`,\n * `catalog_delete_price`) route through `adapter`-less staging: they require an\n * explicit `confirm: true` arg OR a host `confirm` callback. Read + create +\n * checkout-url tools are unaffected.\n */\n pendingMode?: boolean;\n /** Host confirm hook for destructive ops (pendingMode). Resolves true to proceed. */\n confirm?: (req: { action: string; id: string; label: string }) => Promise<boolean> | boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst num = (v: unknown, fallback = 0): number => (typeof v === \"number\" && Number.isFinite(v) ? v : fallback);\n\n/**\n * registerCatalogBridge — full MCP tool set over a headless Stripe catalog.\n *\n * catalog_list_products list products ({ id, name, active, priceCount })\n * catalog_get_product full product JSON + its prices\n * catalog_create_product create a product (ULID auto-assigned)\n * catalog_delete_product soft-delete a product (pendingMode-gated, undoable*)\n * catalog_list_prices list a product's prices (or all)\n * catalog_create_price create a price under a product\n * catalog_delete_price soft-delete a price (pendingMode-gated)\n * catalog_sync_product push a product + its prices to Stripe\n * catalog_test_connection verify the Stripe connection\n * catalog_create_checkout build a hosted Checkout URL for a price\n *\n * *delete undo is best-effort: stores expose soft-delete (`remove`) but no\n * un-delete, so the undo closure re-creates from the captured snapshot.\n */\nexport function registerCatalogBridge(host: ToolHost, options: CatalogBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const pendingMode = options.pendingMode ?? true;\n const catalogId = adapter.id ?? \"catalog\";\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = `catalog:${catalogId}`;\n\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (elementId?: string, label?: string): AgentTarget => ({\n kind: \"custom\",\n screenId: adapter.screenId,\n elementId,\n label: label ?? catalogId,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<unknown> | unknown,\n resolveTarget: false | ((args: JsonObject) => AgentTarget),\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = resolveTarget\n ? wrapToolWithActivity(wrapped as never, {\n toolName: name,\n agent,\n kind: \"custom\",\n screenId: adapter.screenId,\n resolveTarget: ({ args }) => resolveTarget(args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as Record<string, never>, required, additionalProperties: false } },\n final as never,\n { owner: bridgeId },\n ),\n );\n };\n\n /** Stage a destructive op behind the human (pendingMode). Returns null to proceed, or an errorResult to block. */\n const guardDestructive = async (action: string, id: string, label: string, hasConfirmArg: boolean) => {\n if (!pendingMode) return null;\n if (options.confirm) {\n const ok = await options.confirm({ action, id, label });\n return ok ? null : errorResult(`Declined: ${action} ${id} (human did not confirm).`);\n }\n // No host confirm hook → require an explicit confirm:true arg as the staged ack.\n if (!hasConfirmArg) {\n return errorResult(`${action} is staged (pendingMode). Re-call with confirm:true to apply, or wire a host confirm hook.`);\n }\n return null;\n };\n\n // ─── Read tools ──────────────────────────────────────────────────────────\n\n reg(\n \"catalog_list_products\",\n \"List products: { id, name, active, lookupKey, priceCount }. Pass withTrashed:true to include soft-deleted.\",\n { withTrashed: { type: \"boolean\" } },\n [],\n async (args) => {\n const products = await adapter.products.all({ withTrashed: args.withTrashed === true });\n const list = await Promise.all(\n products.map(async (p) => ({\n id: p.id,\n name: p.name,\n active: p.active ?? true,\n lookupKey: p.lookupKey ?? null,\n priceCount: (await adapter.prices.forProduct(p.id)).length,\n })),\n );\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n reg(\n \"catalog_get_product\",\n \"Read a product's full JSON plus its prices.\",\n { id: { type: \"string\" }, withTrashed: { type: \"boolean\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n const product = await adapter.products.find(id, { withTrashed: args.withTrashed === true });\n if (!product) return errorResult(`No product with id ${id}`);\n const prices = await adapter.prices.forProduct(id, { withTrashed: args.withTrashed === true });\n const out = { product, prices };\n return textResult(JSON.stringify(out, null, 2), out);\n },\n false,\n );\n\n reg(\n \"catalog_list_prices\",\n \"List prices for a product (pass productId), or every price (omit it).\",\n { productId: { type: \"string\" }, withTrashed: { type: \"boolean\" } },\n [],\n async (args) => {\n const withTrashed = args.withTrashed === true;\n const prices = args.productId !== undefined\n ? await adapter.prices.forProduct(str(args.productId), { withTrashed })\n : await adapter.prices.all({ withTrashed });\n const list = prices.map((p) => ({\n id: p.id,\n productId: p.productId,\n currency: p.currency,\n unitAmount: p.unitAmount,\n type: p.type,\n active: p.active ?? true,\n externalId: p.externalId ?? null,\n }));\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n // ─── Create tools ────────────────────────────────────────────────────────\n\n reg(\n \"catalog_create_product\",\n \"Create a product. `name` is required; id (ULID) is auto-assigned. Returns the created product.\",\n {\n name: { type: \"string\" },\n description: { type: \"string\" },\n active: { type: \"boolean\" },\n lookupKey: { type: \"string\" },\n metadata: { type: \"object\" },\n },\n [\"name\"],\n async (args) => {\n const name = str(args.name);\n if (!name) return errorResult(\"name is required.\");\n const product = await adapter.createProduct({\n name,\n ...(args.description !== undefined ? { description: str(args.description) } : {}),\n ...(args.active !== undefined ? { active: args.active === true } : {}),\n ...(args.lookupKey !== undefined ? { lookupKey: str(args.lookupKey) } : {}),\n ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, unknown> } : {}),\n });\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: catalogId,\n action: \"catalog_create_product\",\n label: `Created product ${product.id} (${product.name})`,\n undo: async () => { await adapter.products.remove(product.id); },\n redo: async () => { await adapter.createProduct({ ...product }); },\n });\n return textResult(`Created product ${product.id} (${product.name})`, product);\n },\n (args) => target(undefined, `create product ${str(args.name)}`),\n );\n\n reg(\n \"catalog_create_price\",\n \"Create a price under a product. unitAmount is integer minor units (cents). type is 'recurring' | 'one_time'.\",\n {\n productId: { type: \"string\" },\n currency: { type: \"string\", description: \"ISO-4217, e.g. 'USD'.\" },\n unitAmount: { type: \"number\", description: \"Price in cents.\" },\n type: { type: \"string\", enum: [\"recurring\", \"one_time\"] },\n recurringInterval: { type: \"string\", description: \"'month' | 'year' | … (recurring only).\" },\n nickname: { type: \"string\" },\n lookupKey: { type: \"string\" },\n metadata: { type: \"object\" },\n },\n [\"productId\", \"currency\", \"unitAmount\", \"type\"],\n async (args) => {\n const productId = str(args.productId);\n const product = await adapter.products.find(productId);\n if (!product) return errorResult(`No product with id ${productId}`);\n const type = str(args.type) as \"recurring\" | \"one_time\";\n if (type !== \"recurring\" && type !== \"one_time\") return errorResult(\"type must be 'recurring' or 'one_time'.\");\n const price = await adapter.createPrice({\n productId,\n currency: str(args.currency),\n unitAmount: num(args.unitAmount),\n type,\n ...(args.recurringInterval !== undefined ? { recurringInterval: str(args.recurringInterval) } : {}),\n ...(args.nickname !== undefined ? { nickname: str(args.nickname) } : {}),\n ...(args.lookupKey !== undefined ? { lookupKey: str(args.lookupKey) } : {}),\n ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, unknown> } : {}),\n });\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: catalogId,\n action: \"catalog_create_price\",\n label: `Created price ${price.id} on ${productId}`,\n undo: async () => { await adapter.prices.remove(price.id); },\n redo: async () => { await adapter.createPrice({ ...price }); },\n });\n return textResult(`Created ${type} price ${price.id} on ${productId}`, price);\n },\n (args) => target(str(args.productId), `create price on ${str(args.productId)}`),\n );\n\n // ─── Destructive tools (pendingMode-gated) ───────────────────────────────\n\n reg(\n \"catalog_delete_product\",\n \"Soft-delete a product (preserves financial history). Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n { id: { type: \"string\" }, confirm: { type: \"boolean\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n const product = await adapter.products.find(id, { withTrashed: true });\n if (!product) return errorResult(`No product with id ${id}`);\n const blocked = await guardDestructive(\"catalog_delete_product\", id, product.name, args.confirm === true);\n if (blocked) return blocked;\n const snapshot = { ...product };\n await adapter.products.remove(id);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: catalogId,\n action: \"catalog_delete_product\",\n label: `Deleted product ${id} (${product.name})`,\n undo: async () => { await adapter.createProduct({ ...snapshot }); },\n redo: async () => { await adapter.products.remove(id); },\n });\n return textResult(`Deleted product ${id}`, { id });\n },\n (args) => target(str(args.id), `delete product ${str(args.id)}`),\n );\n\n reg(\n \"catalog_delete_price\",\n \"Soft-delete a price (mirrors Stripe archiving). Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n { id: { type: \"string\" }, confirm: { type: \"boolean\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n const price = await adapter.prices.find(id, { withTrashed: true });\n if (!price) return errorResult(`No price with id ${id}`);\n const blocked = await guardDestructive(\"catalog_delete_price\", id, id, args.confirm === true);\n if (blocked) return blocked;\n const snapshot = { ...price };\n await adapter.prices.remove(id);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: catalogId,\n action: \"catalog_delete_price\",\n label: `Deleted price ${id}`,\n undo: async () => { await adapter.createPrice({ ...snapshot }); },\n redo: async () => { await adapter.prices.remove(id); },\n });\n return textResult(`Deleted price ${id}`, { id });\n },\n (args) => target(str(args.id), `delete price ${str(args.id)}`),\n );\n\n // ─── Stripe sync ─────────────────────────────────────────────────────────\n\n reg(\n \"catalog_sync_product\",\n \"Push a product + its prices to Stripe (creates/updates the Stripe Product + Prices, stamps external ids).\",\n { id: { type: \"string\" } },\n [\"id\"],\n async (args) => {\n if (!adapter.syncProductAndPrices) return errorResult(\"Host did not wire Stripe sync.\");\n const id = str(args.id);\n const product = await adapter.products.find(id);\n if (!product) return errorResult(`No product with id ${id}`);\n const synced = await adapter.syncProductAndPrices(product);\n return textResult(`Synced product ${id} to Stripe (${synced.externalId ?? \"no external id\"})`, synced);\n },\n (args) => target(str(args.id), `sync product ${str(args.id)}`),\n );\n\n reg(\n \"catalog_test_connection\",\n \"Verify the Stripe connection — returns { success, message, productCount? }.\",\n {},\n [],\n async () => {\n if (!adapter.testConnection) return errorResult(\"Host did not wire a Stripe connection test.\");\n const result = await adapter.testConnection();\n return textResult(JSON.stringify(result, null, 2), result);\n },\n false,\n );\n\n // ─── Checkout ────────────────────────────────────────────────────────────\n\n reg(\n \"catalog_create_checkout\",\n \"Build a hosted Stripe Checkout URL for a price. Recurring prices → subscription; one-time → payment (pass quantity). Requires the price be synced to Stripe first.\",\n {\n priceId: { type: \"string\" },\n successUrl: { type: \"string\" },\n cancelUrl: { type: \"string\" },\n customer: { type: \"string\", description: \"Stripe customer id (optional — Checkout collects one if omitted).\" },\n quantity: { type: \"number\", description: \"One-time checkouts only. Default 1.\" },\n metadata: { type: \"object\" },\n },\n [\"priceId\", \"successUrl\", \"cancelUrl\"],\n async (args) => {\n const priceId = str(args.priceId);\n const price = await adapter.prices.find(priceId);\n if (!price) return errorResult(`No price with id ${priceId}`);\n const checkoutArgs: CatalogCheckoutArgs = {\n successUrl: str(args.successUrl),\n cancelUrl: str(args.cancelUrl),\n ...(args.customer !== undefined ? { customer: str(args.customer) } : {}),\n ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, string> } : {}),\n };\n let url: string;\n if (price.type === \"recurring\") {\n if (!adapter.getSubscriptionCheckoutUrl) return errorResult(\"Host did not wire subscription checkout.\");\n url = await adapter.getSubscriptionCheckoutUrl(price, checkoutArgs);\n } else {\n if (!adapter.getOneTimeCheckoutUrl) return errorResult(\"Host did not wire one-time checkout.\");\n url = await adapter.getOneTimeCheckoutUrl(price, { ...checkoutArgs, quantity: num(args.quantity, 1) });\n }\n return textResult(url || \"(no url)\", { priceId, type: price.type, url });\n },\n (args) => target(str(args.priceId), `checkout ${str(args.priceId)}`),\n );\n\n return {\n id: bridgeId,\n title: adapter.title ?? \"Catalog\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ensureUndoToolsRegistered } from './chunk-
|
|
1
|
+
import { ensureUndoToolsRegistered } from './chunk-ZDKYKJFH.js';
|
|
2
2
|
import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
|
|
3
|
-
import { textResult, errorResult } from './chunk-
|
|
3
|
+
import { textResult, errorResult } from './chunk-3GFKC6OK.js';
|
|
4
4
|
|
|
5
5
|
// src/bridges/terminal.ts
|
|
6
6
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
@@ -10,6 +10,7 @@ function registerTerminalBridge(host, options) {
|
|
|
10
10
|
const pendingMode = options.pendingMode ?? true;
|
|
11
11
|
const screenId = options.screenId ?? options.adapter?.screenId;
|
|
12
12
|
const disposers = [];
|
|
13
|
+
const bridgeId = "terminal";
|
|
13
14
|
const staged = /* @__PURE__ */ new Map();
|
|
14
15
|
let seq = 0;
|
|
15
16
|
ensureUndoToolsRegistered(host);
|
|
@@ -76,7 +77,8 @@ function registerTerminalBridge(host, options) {
|
|
|
76
77
|
description,
|
|
77
78
|
inputSchema: { type: "object", properties, required, additionalProperties: false }
|
|
78
79
|
},
|
|
79
|
-
final
|
|
80
|
+
final,
|
|
81
|
+
{ owner: bridgeId }
|
|
80
82
|
)
|
|
81
83
|
);
|
|
82
84
|
};
|
|
@@ -273,7 +275,7 @@ function registerTerminalBridge(host, options) {
|
|
|
273
275
|
);
|
|
274
276
|
}
|
|
275
277
|
return {
|
|
276
|
-
id:
|
|
278
|
+
id: bridgeId,
|
|
277
279
|
title: "Terminal",
|
|
278
280
|
dispose: () => {
|
|
279
281
|
disposers.forEach((d) => d());
|
|
@@ -296,5 +298,5 @@ function registerTerminalBridge(host, options) {
|
|
|
296
298
|
}
|
|
297
299
|
|
|
298
300
|
export { registerTerminalBridge };
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
300
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
//# sourceMappingURL=chunk-CKJL5C7A.js.map
|
|
302
|
+
//# sourceMappingURL=chunk-CKJL5C7A.js.map
|