@particle-academy/agent-integrations 0.28.1 → 0.29.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/README.md +9 -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 +3 -3
- package/dist/bridges/forms.d.ts +3 -3
- package/dist/bridges/map.d.cts +3 -3
- package/dist/bridges/map.d.ts +3 -3
- package/dist/bridges/scene.d.cts +3 -3
- package/dist/bridges/scene.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 +45 -0
- package/dist/bridges/tui.d.ts +45 -0
- package/dist/bridges/whiteboard.d.cts +3 -3
- package/dist/bridges/whiteboard.d.ts +3 -3
- package/dist/bridges-artboard.cjs.map +1 -1
- package/dist/bridges-artboard.js +2 -2
- package/dist/bridges-catalog.cjs.map +1 -1
- package/dist/bridges-catalog.js +3 -3
- package/dist/bridges-charts.cjs.map +1 -1
- package/dist/bridges-charts.js +3 -3
- package/dist/bridges-cms.cjs.map +1 -1
- package/dist/bridges-cms.js +4 -4
- package/dist/bridges-code.cjs.map +1 -1
- package/dist/bridges-code.js +3 -3
- package/dist/bridges-doc.cjs.map +1 -1
- package/dist/bridges-doc.js +3 -3
- package/dist/bridges-features.cjs.map +1 -1
- package/dist/bridges-features.js +3 -3
- package/dist/bridges-files.cjs.map +1 -1
- package/dist/bridges-files.js +3 -3
- package/dist/bridges-flow.cjs.map +1 -1
- package/dist/bridges-flow.js +2 -2
- package/dist/bridges-forms.cjs.map +1 -1
- package/dist/bridges-forms.js +3 -3
- package/dist/bridges-map.cjs.map +1 -1
- package/dist/bridges-map.js +3 -3
- package/dist/bridges-scene.cjs.map +1 -1
- package/dist/bridges-scene.js +3 -3
- package/dist/bridges-screens.cjs.map +1 -1
- package/dist/bridges-screens.js +3 -3
- package/dist/bridges-sheets.cjs.map +1 -1
- package/dist/bridges-sheets.js +3 -3
- package/dist/bridges-slides.cjs.map +1 -1
- package/dist/bridges-slides.js +3 -3
- package/dist/bridges-terminal.cjs.map +1 -1
- package/dist/bridges-terminal.js +3 -3
- package/dist/bridges-tui.cjs +114 -0
- package/dist/bridges-tui.cjs.map +1 -0
- package/dist/bridges-tui.js +7 -0
- package/dist/bridges-tui.js.map +1 -0
- package/dist/bridges-whiteboard.cjs.map +1 -1
- package/dist/bridges-whiteboard.js +3 -3
- package/dist/{chunk-AROVENCE.js → chunk-2Y7Y5PTR.js} +4 -4
- package/dist/{chunk-AROVENCE.js.map → chunk-2Y7Y5PTR.js.map} +1 -1
- package/dist/{chunk-QDD4WHIV.js → chunk-3PKHJ4IV.js} +4 -4
- package/dist/{chunk-QDD4WHIV.js.map → chunk-3PKHJ4IV.js.map} +1 -1
- package/dist/{chunk-A57CRGEK.js → chunk-7VBB2FJB.js} +3 -3
- package/dist/{chunk-A57CRGEK.js.map → chunk-7VBB2FJB.js.map} +1 -1
- package/dist/{chunk-FF5F526J.js → chunk-AF454WRD.js} +4 -4
- package/dist/{chunk-FF5F526J.js.map → chunk-AF454WRD.js.map} +1 -1
- package/dist/{chunk-66WOHZZJ.js → chunk-BE2XS577.js} +4 -4
- package/dist/{chunk-66WOHZZJ.js.map → chunk-BE2XS577.js.map} +1 -1
- package/dist/{chunk-GHY3PBPN.js → chunk-BT7HM5I6.js} +3 -3
- package/dist/{chunk-GHY3PBPN.js.map → chunk-BT7HM5I6.js.map} +1 -1
- package/dist/{chunk-KJ5AOOV7.js → chunk-CT3LRNH7.js} +3 -3
- package/dist/{chunk-KJ5AOOV7.js.map → chunk-CT3LRNH7.js.map} +1 -1
- package/dist/{chunk-4KAIV6OD.js → chunk-DF3PLL2E.js} +10 -5
- package/dist/chunk-DF3PLL2E.js.map +1 -0
- package/dist/{chunk-AAD3Z5E7.js → chunk-HFLHLS2N.js} +4 -4
- package/dist/{chunk-AAD3Z5E7.js.map → chunk-HFLHLS2N.js.map} +1 -1
- package/dist/{chunk-HWVVS6HE.js → chunk-KKGC4ERF.js} +4 -4
- package/dist/{chunk-HWVVS6HE.js.map → chunk-KKGC4ERF.js.map} +1 -1
- package/dist/{chunk-NN3ELTVO.js → chunk-KYMEDV6E.js} +4 -4
- package/dist/{chunk-NN3ELTVO.js.map → chunk-KYMEDV6E.js.map} +1 -1
- package/dist/{chunk-YGD2VTUM.js → chunk-LZJI7EKQ.js} +4 -4
- package/dist/{chunk-YGD2VTUM.js.map → chunk-LZJI7EKQ.js.map} +1 -1
- package/dist/chunk-MFMBR6LN.js +100 -0
- package/dist/chunk-MFMBR6LN.js.map +1 -0
- package/dist/{chunk-VFKO2VUR.js → chunk-NSPL5TVF.js} +4 -4
- package/dist/{chunk-VFKO2VUR.js.map → chunk-NSPL5TVF.js.map} +1 -1
- package/dist/{chunk-AAMQOXZC.js → chunk-OFCR6JY3.js} +4 -4
- package/dist/{chunk-AAMQOXZC.js.map → chunk-OFCR6JY3.js.map} +1 -1
- package/dist/{chunk-ZX6UQURN.js → chunk-OHUDEA6R.js} +4 -4
- package/dist/{chunk-ZX6UQURN.js.map → chunk-OHUDEA6R.js.map} +1 -1
- package/dist/chunk-PMI4C5S4.js +44 -0
- package/dist/chunk-PMI4C5S4.js.map +1 -0
- package/dist/{chunk-PCW2EK5G.js → chunk-TNU6AWUO.js} +4 -4
- package/dist/{chunk-PCW2EK5G.js.map → chunk-TNU6AWUO.js.map} +1 -1
- package/dist/{chunk-QRDVJW6Q.js → chunk-UTUVN6HQ.js} +4 -4
- package/dist/{chunk-QRDVJW6Q.js.map → chunk-UTUVN6HQ.js.map} +1 -1
- package/dist/{chunk-XMMCSQ4I.js → chunk-VMCG3PJD.js} +4 -4
- package/dist/{chunk-XMMCSQ4I.js.map → chunk-VMCG3PJD.js.map} +1 -1
- package/dist/components-shared-whiteboard.cjs +8 -3
- package/dist/components-shared-whiteboard.cjs.map +1 -1
- package/dist/components-shared-whiteboard.js +3 -3
- package/dist/human-plus/file-store.d.cts +17 -0
- package/dist/human-plus/file-store.d.ts +17 -0
- package/dist/human-plus/index.d.cts +61 -0
- package/dist/human-plus/index.d.ts +61 -0
- package/dist/human-plus-node.cjs +121 -0
- package/dist/human-plus-node.cjs.map +1 -0
- package/dist/human-plus-node.js +76 -0
- package/dist/human-plus-node.js.map +1 -0
- package/dist/human-plus.cjs +46 -0
- package/dist/human-plus.cjs.map +1 -0
- package/dist/human-plus.js +3 -0
- package/dist/human-plus.js.map +1 -0
- package/dist/index.cjs +212 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +58 -29
- 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.cjs +8 -3
- 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-FFZpYPyM.d.ts → server-CDX643Kz.d.ts} +4 -2
- package/dist/{server-Dr3j48CU.d.cts → server-DDD3IZ56.d.cts} +4 -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-C_Vh17J_.d.ts → tool-host-CWTOJEm2.d.ts} +1 -1
- package/dist/{tool-host-IDecPrF1.d.cts → tool-host-EuYHYSSH.d.cts} +1 -1
- package/dist/{types-CBoQhR8L.d.ts → types-BKD6uf86.d.ts} +1 -1
- package/dist/{types-BDI_g5UG.d.ts → types-C58ZXs4K.d.cts} +6 -2
- package/dist/{types-BDI_g5UG.d.cts → types-C58ZXs4K.d.ts} +6 -2
- package/dist/{types-B0rmWyoR.d.cts → types-NFGP769G.d.cts} +1 -1
- package/dist/undo/index.d.cts +2 -2
- package/dist/undo/index.d.ts +2 -2
- package/dist/undo.cjs.map +1 -1
- package/dist/undo.js +3 -3
- package/package.json +13 -1
- package/dist/chunk-4KAIV6OD.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridges/slides.ts"],"names":[],"mappings":"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","file":"chunk-QDD4WHIV.js","sourcesContent":["// `Slide` is a React component in @particle-academy/fancy-slides; the slide\n// *data* type is exported as `SlideData`. Same naming convention applies to\n// other element data shapes.\n// Types are import-type-only (erased at build); the fancy-slides VALUES\n// (parseDeck / slideId / elementId) are lazy-imported inside the handlers so the\n// package barrel never statically pulls this optional peer (see issue #3).\nimport type { Deck, DeckOp, ElementAnimation, SlideData, SlideElement, Theme } from \"@particle-academy/fancy-slides\";\nimport { 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\";\n\n/**\n * Adapter — the bridge calls into these to read or change deck state. The\n * host owns the deck (it's a controlled prop on `DeckEditor` / `SlideViewer`).\n * Every mutation funnels through `apply(op)`, which the host typically\n * implements as `setDeck(deck => reduceDeck(deck, op))`.\n */\nexport type SlidesBridgeAdapter = {\n /** Read the current deck. */\n getDeck: () => Deck;\n /**\n * Apply a typed DeckOp. The same operations the editor + agent use,\n * so the host's reducer + undo stack handle both code paths identically.\n */\n apply: (op: DeckOp) => void;\n /** Optional screen id for cross-screen presence highlighting. */\n screenId?: string;\n};\n\nexport type SlidesBridgeOptions = {\n adapter: SlidesBridgeAdapter;\n /** Identity stamped on activity / op metadata. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSlidesBridge — wires the full slide-editor MCP surface against\n * a fancy-slides Deck. Tools map 1:1 to `DeckOp` cases (plus read-only\n * helpers); humans and agents take identical paths through the reducer.\n *\n * deck_describe read-only deck summary\n * deck_get full deck JSON\n * deck_set replace the whole deck (stream a presentation in)\n * deck_set_title rename\n * deck_apply_theme swap theme\n * slide_list ordered list of slide ids + titles\n * slide_get full slide JSON\n * slide_add insert a slide\n * slide_remove delete a slide\n * slide_reorder move a slide\n * slide_set_layout change layout preset\n * slide_set_notes update speaker notes\n * slide_set_background background color / image / gradient\n * slide_set_transition entrance transition (fade / slide / zoom)\n * element_add insert an element onto a slide\n * element_remove delete an element\n * element_update patch an element's fields\n * element_move set element x/y\n * element_resize set element w/h\n * element_set_animation set/clear an element's entrance build (fade/fly-in/zoom/wipe)\n */\nexport function registerSlidesBridge(host: ToolHost, options: SlidesBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\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 deckTarget = (): AgentTarget => ({\n kind: \"deck\",\n screenId: adapter.screenId,\n elementId: adapter.getDeck().id,\n label: adapter.getDeck().title,\n });\n\n const slideTarget = (slideId: string): AgentTarget => ({\n kind: \"slide\",\n screenId: adapter.screenId,\n elementId: slideId,\n label: `slide:${slideId}`,\n });\n\n const elementTarget = (slideId: string, elementId: string): AgentTarget => ({\n kind: \"slide-element\",\n screenId: adapter.screenId,\n elementId,\n label: `${slideId}/${elementId}`,\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 isMutation: boolean,\n resolveTarget?: (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 }) as never;\n const final = isMutation && resolveTarget\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"deck\",\n screenId: adapter.screenId,\n resolveTarget: (ctx) => resolveTarget(ctx.args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties: properties as Record<string, never>,\n required,\n additionalProperties: false,\n },\n },\n final as never,\n ),\n );\n };\n\n // ─── Read-only ─────────────────────────────────────────────────────────\n\n reg(\n \"deck_describe\",\n \"Summary of the active deck — title, slide count, theme name, element-type counts.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const elementCounts: Record<string, number> = {};\n for (const s of deck.slides) {\n for (const e of s.elements) {\n elementCounts[e.type] = (elementCounts[e.type] ?? 0) + 1;\n }\n }\n const summary = {\n id: deck.id,\n title: deck.title,\n slides: deck.slides.length,\n theme: deck.theme?.name,\n elementCounts,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n },\n false,\n );\n\n reg(\n \"deck_get\",\n \"Read the full deck JSON.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n return textResult(JSON.stringify(deck, null, 2), deck);\n },\n false,\n );\n\n reg(\n \"slide_list\",\n \"List slides in order — `{ id, layout, elementCount, title? }`.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const list = deck.slides.map((s) => ({\n id: s.id,\n layout: s.layout,\n elementCount: s.elements.length,\n title: (s.metadata?.title as string | undefined) ?? firstTextContent(s),\n }));\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n reg(\n \"slide_get\",\n \"Read a single slide's JSON by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const slide = adapter.getDeck().slides.find((s) => s.id === id);\n if (!slide) return errorResult(`Slide not found: ${id}`);\n return textResult(JSON.stringify(slide, null, 2), slide);\n },\n false,\n );\n\n // ─── Deck-level mutations ──────────────────────────────────────────────\n\n reg(\n \"deck_set_title\",\n \"Rename the deck.\",\n { title: { type: \"string\" } },\n [\"title\"],\n (args) => {\n const title = str(args.title);\n adapter.apply({ op: \"deck.setTitle\", title });\n return textResult(`Title set to \"${title}\"`, { title });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_apply_theme\",\n \"Apply a Theme to the deck. Pass either a built-in name (default / dark / vivid) or a full Theme object.\",\n { theme: { description: \"Theme name string or Theme object.\" } },\n [\"theme\"],\n (args) => {\n const t = args.theme;\n let theme: Theme;\n if (typeof t === \"string\") {\n theme = { name: t };\n } else if (t && typeof t === \"object\" && \"name\" in (t as Record<string, unknown>)) {\n theme = t as unknown as Theme;\n } else {\n return errorResult(\"theme must be a string name or an object with a `name` field.\");\n }\n adapter.apply({ op: \"deck.setTheme\", theme });\n return textResult(`Applied theme: ${theme.name}`, { theme });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_set\",\n \"Replace the entire deck atomically — stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.\",\n { deck: { description: \"A complete Deck object.\" } },\n [\"deck\"],\n async (args) => {\n const incoming = args.deck;\n if (!incoming || typeof incoming !== \"object\") {\n return errorResult(\"deck must be a complete Deck object ({ id, title, theme, slides }).\");\n }\n const { parseDeck } = await import(\"@particle-academy/fancy-slides\");\n let deck: Deck;\n try {\n // parseDeck validates structure + migrates forward; throws on bad input.\n deck = parseDeck(incoming as unknown);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n adapter.apply({ op: \"deck.replace\", deck });\n return textResult(`Loaded deck \"${deck.title}\" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });\n },\n true,\n deckTarget,\n );\n\n // ─── Slide-level mutations ─────────────────────────────────────────────\n\n reg(\n \"slide_add\",\n \"Insert a slide at `index` (defaults to end). Returns the new slide's id. Accepts a partial slide payload.\",\n {\n index: { type: \"number\" },\n slide: { description: \"Partial slide payload — id is auto-generated when absent.\" },\n },\n [],\n async (args) => {\n const deck = adapter.getDeck();\n const incoming = (args.slide && typeof args.slide === \"object\" ? args.slide : {}) as Partial<SlideData>;\n const { slideId: newSlideId } = await import(\"@particle-academy/fancy-slides\");\n const slide: SlideData = {\n id: incoming.id ?? newSlideId(),\n layout: incoming.layout ?? \"blank\",\n elements: incoming.elements ?? [],\n background: incoming.background,\n transition: incoming.transition,\n notes: incoming.notes,\n metadata: incoming.metadata,\n };\n const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);\n adapter.apply({ op: \"slide.add\", index, slide });\n return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });\n },\n true,\n () => deckTarget(),\n );\n\n reg(\n \"slide_remove\",\n \"Delete a slide by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n adapter.apply({ op: \"slide.remove\", slideId: id });\n return textResult(`Removed slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_reorder\",\n \"Move a slide to a new index.\",\n { id: { type: \"string\" }, toIndex: { type: \"number\" } },\n [\"id\", \"toIndex\"],\n (args) => {\n const id = str(args.id);\n const toIndex = num(args.toIndex, 0);\n adapter.apply({ op: \"slide.reorder\", slideId: id, toIndex });\n return textResult(`Moved slide ${id} → ${toIndex}`, { id, toIndex });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_layout\",\n \"Change a slide's layout preset.\",\n { id: { type: \"string\" }, layout: { type: \"string\" } },\n [\"id\", \"layout\"],\n (args) => {\n const id = str(args.id);\n const layout = str(args.layout) as SlideData[\"layout\"];\n adapter.apply({ op: \"slide.setLayout\", slideId: id, layout: layout ?? \"blank\" });\n return textResult(`Slide ${id} layout → ${layout}`, { id, layout });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_notes\",\n \"Set a slide's speaker notes.\",\n { id: { type: \"string\" }, notes: { type: \"string\" } },\n [\"id\", \"notes\"],\n (args) => {\n const id = str(args.id);\n const notes = str(args.notes);\n adapter.apply({ op: \"slide.setNotes\", slideId: id, notes });\n return textResult(`Notes updated on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_background\",\n \"Set or clear a slide's background.\",\n {\n id: { type: \"string\" },\n background: { description: \"Background object `{ color?, image?, gradient? }` — pass null to clear.\" },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const bg = (args.background && typeof args.background === \"object\" ? args.background : undefined) as SlideData[\"background\"];\n adapter.apply({ op: \"slide.setBackground\", slideId: id, background: bg });\n return textResult(`Background set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_transition\",\n \"Set or clear a slide's entrance transition.\",\n {\n id: { type: \"string\" },\n transition: {\n description:\n \"Transition object `{ kind: 'none'|'fade'|'slide'|'zoom', duration?: number(ms), direction?: 'left'|'right'|'up'|'down' }` — pass null to clear.\",\n },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const transition = (args.transition && typeof args.transition === \"object\" ? args.transition : undefined) as SlideData[\"transition\"];\n adapter.apply({ op: \"slide.setTransition\", slideId: id, transition });\n return textResult(`Transition set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n // ─── Element-level mutations ───────────────────────────────────────────\n\n reg(\n \"element_add\",\n \"Insert an element on a slide. Returns the new element id.\",\n {\n slideId: { type: \"string\" },\n element: { description: \"Partial element — type/x/y/w/h required, id auto-generated when absent.\" },\n },\n [\"slideId\", \"element\"],\n async (args) => {\n const slideId = str(args.slideId);\n const incoming = (args.element && typeof args.element === \"object\" ? args.element : {}) as Partial<SlideElement>;\n if (!incoming.type) return errorResult(\"element.type is required.\");\n const { elementId: newElementId } = await import(\"@particle-academy/fancy-slides\");\n const element = {\n id: incoming.id ?? newElementId(),\n ...incoming,\n } as SlideElement;\n adapter.apply({ op: \"element.add\", slideId, element });\n return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });\n },\n true,\n (args) => slideTarget(str(args?.slideId)),\n );\n\n reg(\n \"element_remove\",\n \"Delete an element by id.\",\n { slideId: { type: \"string\" }, elementId: { type: \"string\" } },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n adapter.apply({ op: \"element.remove\", slideId, elementId });\n return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_update\",\n \"Patch arbitrary fields on an element. Only the keys in `patch` change.\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n patch: { type: \"object\" },\n },\n [\"slideId\", \"elementId\", \"patch\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<SlideElement>;\n adapter.apply({ op: \"element.update\", slideId, elementId, patch });\n return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_move\",\n \"Set element x/y (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"x\", \"y\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const x = clamp(num(args.x, 0), 0, 1);\n const y = clamp(num(args.y, 0), 0, 1);\n adapter.apply({ op: \"element.move\", slideId, elementId, x, y });\n return textResult(`Moved element ${elementId} → (${x}, ${y})`, { x, y });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_resize\",\n \"Set element width/height (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n w: { type: \"number\" },\n h: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"w\", \"h\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const w = clamp(num(args.w, 0), 0, 1);\n const h = clamp(num(args.h, 0), 0, 1);\n adapter.apply({ op: \"element.resize\", slideId, elementId, w, h });\n return textResult(`Resized element ${elementId} → (${w}, ${h})`, { w, h });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_set_animation\",\n \"Set or clear an element's entrance animation (build step).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n animation: {\n description:\n \"Animation `{ effect: 'fade'|'fly-in'|'zoom'|'wipe', trigger?: 'on-click'|'with-prev'|'after-prev', direction?: 'left'|'right'|'up'|'down', duration?: ms, delay?: ms, order?: number }` — pass null to clear.\",\n },\n },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const animation = (args.animation && typeof args.animation === \"object\" ? args.animation : undefined) as ElementAnimation | undefined;\n adapter.apply({ op: \"element.setAnimation\", slideId, elementId, animation });\n return textResult(`Animation ${animation ? \"set on\" : \"cleared from\"} element ${elementId}`, { elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n return {\n id: \"slides\",\n title: \"Slides\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\nfunction num(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction str(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\nfunction firstTextContent(slide: SlideData): string | undefined {\n for (const e of slide.elements) {\n if (e.type === \"text\") {\n const t = (e as { content?: string }).content;\n if (typeof t === \"string\") return t.split(\"\\n\")[0]?.slice(0, 60);\n }\n }\n return undefined;\n}\n\n// NOTE: `reduceDeck` is intentionally NOT re-exported — a static re-export forces\n// the barrel to statically import the optional peer @particle-academy/fancy-slides\n// (issue #3). Consumers writing their own adapter import it from fancy-slides\n// directly: `import { reduceDeck } from \"@particle-academy/fancy-slides\"`.\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bridges/slides.ts"],"names":[],"mappings":"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","file":"chunk-3PKHJ4IV.js","sourcesContent":["// `Slide` is a React component in @particle-academy/fancy-slides; the slide\n// *data* type is exported as `SlideData`. Same naming convention applies to\n// other element data shapes.\n// Types are import-type-only (erased at build); the fancy-slides VALUES\n// (parseDeck / slideId / elementId) are lazy-imported inside the handlers so the\n// package barrel never statically pulls this optional peer (see issue #3).\nimport type { Deck, DeckOp, ElementAnimation, SlideData, SlideElement, Theme } from \"@particle-academy/fancy-slides\";\nimport { 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\";\n\n/**\n * Adapter — the bridge calls into these to read or change deck state. The\n * host owns the deck (it's a controlled prop on `DeckEditor` / `SlideViewer`).\n * Every mutation funnels through `apply(op)`, which the host typically\n * implements as `setDeck(deck => reduceDeck(deck, op))`.\n */\nexport type SlidesBridgeAdapter = {\n /** Read the current deck. */\n getDeck: () => Deck;\n /**\n * Apply a typed DeckOp. The same operations the editor + agent use,\n * so the host's reducer + undo stack handle both code paths identically.\n */\n apply: (op: DeckOp) => void;\n /** Optional screen id for cross-screen presence highlighting. */\n screenId?: string;\n};\n\nexport type SlidesBridgeOptions = {\n adapter: SlidesBridgeAdapter;\n /** Identity stamped on activity / op metadata. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSlidesBridge — wires the full slide-editor MCP surface against\n * a fancy-slides Deck. Tools map 1:1 to `DeckOp` cases (plus read-only\n * helpers); humans and agents take identical paths through the reducer.\n *\n * deck_describe read-only deck summary\n * deck_get full deck JSON\n * deck_set replace the whole deck (stream a presentation in)\n * deck_set_title rename\n * deck_apply_theme swap theme\n * slide_list ordered list of slide ids + titles\n * slide_get full slide JSON\n * slide_add insert a slide\n * slide_remove delete a slide\n * slide_reorder move a slide\n * slide_set_layout change layout preset\n * slide_set_notes update speaker notes\n * slide_set_background background color / image / gradient\n * slide_set_transition entrance transition (fade / slide / zoom)\n * element_add insert an element onto a slide\n * element_remove delete an element\n * element_update patch an element's fields\n * element_move set element x/y\n * element_resize set element w/h\n * element_set_animation set/clear an element's entrance build (fade/fly-in/zoom/wipe)\n */\nexport function registerSlidesBridge(host: ToolHost, options: SlidesBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\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 deckTarget = (): AgentTarget => ({\n kind: \"deck\",\n screenId: adapter.screenId,\n elementId: adapter.getDeck().id,\n label: adapter.getDeck().title,\n });\n\n const slideTarget = (slideId: string): AgentTarget => ({\n kind: \"slide\",\n screenId: adapter.screenId,\n elementId: slideId,\n label: `slide:${slideId}`,\n });\n\n const elementTarget = (slideId: string, elementId: string): AgentTarget => ({\n kind: \"slide-element\",\n screenId: adapter.screenId,\n elementId,\n label: `${slideId}/${elementId}`,\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 isMutation: boolean,\n resolveTarget?: (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 }) as never;\n const final = isMutation && resolveTarget\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"deck\",\n screenId: adapter.screenId,\n resolveTarget: (ctx) => resolveTarget(ctx.args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties: properties as Record<string, never>,\n required,\n additionalProperties: false,\n },\n },\n final as never,\n ),\n );\n };\n\n // ─── Read-only ─────────────────────────────────────────────────────────\n\n reg(\n \"deck_describe\",\n \"Summary of the active deck — title, slide count, theme name, element-type counts.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const elementCounts: Record<string, number> = {};\n for (const s of deck.slides) {\n for (const e of s.elements) {\n elementCounts[e.type] = (elementCounts[e.type] ?? 0) + 1;\n }\n }\n const summary = {\n id: deck.id,\n title: deck.title,\n slides: deck.slides.length,\n theme: deck.theme?.name,\n elementCounts,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n },\n false,\n );\n\n reg(\n \"deck_get\",\n \"Read the full deck JSON.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n return textResult(JSON.stringify(deck, null, 2), deck);\n },\n false,\n );\n\n reg(\n \"slide_list\",\n \"List slides in order — `{ id, layout, elementCount, title? }`.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const list = deck.slides.map((s) => ({\n id: s.id,\n layout: s.layout,\n elementCount: s.elements.length,\n title: (s.metadata?.title as string | undefined) ?? firstTextContent(s),\n }));\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n reg(\n \"slide_get\",\n \"Read a single slide's JSON by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const slide = adapter.getDeck().slides.find((s) => s.id === id);\n if (!slide) return errorResult(`Slide not found: ${id}`);\n return textResult(JSON.stringify(slide, null, 2), slide);\n },\n false,\n );\n\n // ─── Deck-level mutations ──────────────────────────────────────────────\n\n reg(\n \"deck_set_title\",\n \"Rename the deck.\",\n { title: { type: \"string\" } },\n [\"title\"],\n (args) => {\n const title = str(args.title);\n adapter.apply({ op: \"deck.setTitle\", title });\n return textResult(`Title set to \"${title}\"`, { title });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_apply_theme\",\n \"Apply a Theme to the deck. Pass either a built-in name (default / dark / vivid) or a full Theme object.\",\n { theme: { description: \"Theme name string or Theme object.\" } },\n [\"theme\"],\n (args) => {\n const t = args.theme;\n let theme: Theme;\n if (typeof t === \"string\") {\n theme = { name: t };\n } else if (t && typeof t === \"object\" && \"name\" in (t as Record<string, unknown>)) {\n theme = t as unknown as Theme;\n } else {\n return errorResult(\"theme must be a string name or an object with a `name` field.\");\n }\n adapter.apply({ op: \"deck.setTheme\", theme });\n return textResult(`Applied theme: ${theme.name}`, { theme });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_set\",\n \"Replace the entire deck atomically — stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.\",\n { deck: { description: \"A complete Deck object.\" } },\n [\"deck\"],\n async (args) => {\n const incoming = args.deck;\n if (!incoming || typeof incoming !== \"object\") {\n return errorResult(\"deck must be a complete Deck object ({ id, title, theme, slides }).\");\n }\n const { parseDeck } = await import(\"@particle-academy/fancy-slides\");\n let deck: Deck;\n try {\n // parseDeck validates structure + migrates forward; throws on bad input.\n deck = parseDeck(incoming as unknown);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n adapter.apply({ op: \"deck.replace\", deck });\n return textResult(`Loaded deck \"${deck.title}\" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });\n },\n true,\n deckTarget,\n );\n\n // ─── Slide-level mutations ─────────────────────────────────────────────\n\n reg(\n \"slide_add\",\n \"Insert a slide at `index` (defaults to end). Returns the new slide's id. Accepts a partial slide payload.\",\n {\n index: { type: \"number\" },\n slide: { description: \"Partial slide payload — id is auto-generated when absent.\" },\n },\n [],\n async (args) => {\n const deck = adapter.getDeck();\n const incoming = (args.slide && typeof args.slide === \"object\" ? args.slide : {}) as Partial<SlideData>;\n const { slideId: newSlideId } = await import(\"@particle-academy/fancy-slides\");\n const slide: SlideData = {\n id: incoming.id ?? newSlideId(),\n layout: incoming.layout ?? \"blank\",\n elements: incoming.elements ?? [],\n background: incoming.background,\n transition: incoming.transition,\n notes: incoming.notes,\n metadata: incoming.metadata,\n };\n const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);\n adapter.apply({ op: \"slide.add\", index, slide });\n return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });\n },\n true,\n () => deckTarget(),\n );\n\n reg(\n \"slide_remove\",\n \"Delete a slide by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n adapter.apply({ op: \"slide.remove\", slideId: id });\n return textResult(`Removed slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_reorder\",\n \"Move a slide to a new index.\",\n { id: { type: \"string\" }, toIndex: { type: \"number\" } },\n [\"id\", \"toIndex\"],\n (args) => {\n const id = str(args.id);\n const toIndex = num(args.toIndex, 0);\n adapter.apply({ op: \"slide.reorder\", slideId: id, toIndex });\n return textResult(`Moved slide ${id} → ${toIndex}`, { id, toIndex });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_layout\",\n \"Change a slide's layout preset.\",\n { id: { type: \"string\" }, layout: { type: \"string\" } },\n [\"id\", \"layout\"],\n (args) => {\n const id = str(args.id);\n const layout = str(args.layout) as SlideData[\"layout\"];\n adapter.apply({ op: \"slide.setLayout\", slideId: id, layout: layout ?? \"blank\" });\n return textResult(`Slide ${id} layout → ${layout}`, { id, layout });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_notes\",\n \"Set a slide's speaker notes.\",\n { id: { type: \"string\" }, notes: { type: \"string\" } },\n [\"id\", \"notes\"],\n (args) => {\n const id = str(args.id);\n const notes = str(args.notes);\n adapter.apply({ op: \"slide.setNotes\", slideId: id, notes });\n return textResult(`Notes updated on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_background\",\n \"Set or clear a slide's background.\",\n {\n id: { type: \"string\" },\n background: { description: \"Background object `{ color?, image?, gradient? }` — pass null to clear.\" },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const bg = (args.background && typeof args.background === \"object\" ? args.background : undefined) as SlideData[\"background\"];\n adapter.apply({ op: \"slide.setBackground\", slideId: id, background: bg });\n return textResult(`Background set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_transition\",\n \"Set or clear a slide's entrance transition.\",\n {\n id: { type: \"string\" },\n transition: {\n description:\n \"Transition object `{ kind: 'none'|'fade'|'slide'|'zoom', duration?: number(ms), direction?: 'left'|'right'|'up'|'down' }` — pass null to clear.\",\n },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const transition = (args.transition && typeof args.transition === \"object\" ? args.transition : undefined) as SlideData[\"transition\"];\n adapter.apply({ op: \"slide.setTransition\", slideId: id, transition });\n return textResult(`Transition set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n // ─── Element-level mutations ───────────────────────────────────────────\n\n reg(\n \"element_add\",\n \"Insert an element on a slide. Returns the new element id.\",\n {\n slideId: { type: \"string\" },\n element: { description: \"Partial element — type/x/y/w/h required, id auto-generated when absent.\" },\n },\n [\"slideId\", \"element\"],\n async (args) => {\n const slideId = str(args.slideId);\n const incoming = (args.element && typeof args.element === \"object\" ? args.element : {}) as Partial<SlideElement>;\n if (!incoming.type) return errorResult(\"element.type is required.\");\n const { elementId: newElementId } = await import(\"@particle-academy/fancy-slides\");\n const element = {\n id: incoming.id ?? newElementId(),\n ...incoming,\n } as SlideElement;\n adapter.apply({ op: \"element.add\", slideId, element });\n return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });\n },\n true,\n (args) => slideTarget(str(args?.slideId)),\n );\n\n reg(\n \"element_remove\",\n \"Delete an element by id.\",\n { slideId: { type: \"string\" }, elementId: { type: \"string\" } },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n adapter.apply({ op: \"element.remove\", slideId, elementId });\n return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_update\",\n \"Patch arbitrary fields on an element. Only the keys in `patch` change.\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n patch: { type: \"object\" },\n },\n [\"slideId\", \"elementId\", \"patch\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<SlideElement>;\n adapter.apply({ op: \"element.update\", slideId, elementId, patch });\n return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_move\",\n \"Set element x/y (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"x\", \"y\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const x = clamp(num(args.x, 0), 0, 1);\n const y = clamp(num(args.y, 0), 0, 1);\n adapter.apply({ op: \"element.move\", slideId, elementId, x, y });\n return textResult(`Moved element ${elementId} → (${x}, ${y})`, { x, y });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_resize\",\n \"Set element width/height (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n w: { type: \"number\" },\n h: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"w\", \"h\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const w = clamp(num(args.w, 0), 0, 1);\n const h = clamp(num(args.h, 0), 0, 1);\n adapter.apply({ op: \"element.resize\", slideId, elementId, w, h });\n return textResult(`Resized element ${elementId} → (${w}, ${h})`, { w, h });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_set_animation\",\n \"Set or clear an element's entrance animation (build step).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n animation: {\n description:\n \"Animation `{ effect: 'fade'|'fly-in'|'zoom'|'wipe', trigger?: 'on-click'|'with-prev'|'after-prev', direction?: 'left'|'right'|'up'|'down', duration?: ms, delay?: ms, order?: number }` — pass null to clear.\",\n },\n },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const animation = (args.animation && typeof args.animation === \"object\" ? args.animation : undefined) as ElementAnimation | undefined;\n adapter.apply({ op: \"element.setAnimation\", slideId, elementId, animation });\n return textResult(`Animation ${animation ? \"set on\" : \"cleared from\"} element ${elementId}`, { elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n return {\n id: \"slides\",\n title: \"Slides\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\nfunction num(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction str(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\nfunction firstTextContent(slide: SlideData): string | undefined {\n for (const e of slide.elements) {\n if (e.type === \"text\") {\n const t = (e as { content?: string }).content;\n if (typeof t === \"string\") return t.split(\"\\n\")[0]?.slice(0, 60);\n }\n }\n return undefined;\n}\n\n// NOTE: `reduceDeck` is intentionally NOT re-exported — a static re-export forces\n// the barrel to statically import the optional peer @particle-academy/fancy-slides\n// (issue #3). Consumers writing their own adapter import it from fancy-slides\n// directly: `import { reduceDeck } from \"@particle-academy/fancy-slides\"`.\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { registerDocBridge } from './chunk-
|
|
1
|
+
import { registerDocBridge } from './chunk-AF454WRD.js';
|
|
2
2
|
import { treeReducer } from '@particle-academy/fancy-doc-commons';
|
|
3
3
|
|
|
4
4
|
function cmsReducer() {
|
|
@@ -75,5 +75,5 @@ function registerCmsBridge(host, options) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
export { cmsReducer, registerCmsBridge };
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-7VBB2FJB.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-7VBB2FJB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridges/cms.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/bridges/cms.ts"],"names":[],"mappings":"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","file":"chunk-7VBB2FJB.js","sourcesContent":["/**\n * registerCmsBridge — the greenfield CMS agent bridge, built entirely on\n * {@link registerDocBridge}. cms had NO bridge before (its op-spine was\n * agent-ready but unwired); this is the §8-decided \"build registerCmsBridge on\n * registerDocBridge BEFORE deprecating ScreenSchema\" step.\n *\n * A CMS page is a `DocTree<StyledNode>` (fancy-doc-commons): the generic bridge\n * supplies `cms_describe/get/list/get_node` + `cms_add/update/remove/move` +\n * undo/activity/staging for free; this layer adds the two domain ops a page\n * needs — `cms_set_style` (per-node base StyleProps) and `cms_set_layout` — and a\n * reducer that handles them alongside the substrate tree ops.\n */\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { Bridge } from \"./types\";\nimport { registerDocBridge, type DocAdapter } from \"./doc\";\nimport {\n treeReducer,\n type DocReducer,\n type DocTree,\n type LayoutMode,\n type StyledNode,\n type StyleProps,\n type TreeOp,\n type StagePolicy,\n} from \"@particle-academy/fancy-doc-commons\";\n\n/** The CMS op union: the substrate tree ops + per-node style/layout. */\nexport type CmsOp =\n | TreeOp<StyledNode>\n | { t: \"set_style\"; id: string; patch: Partial<StyleProps> }\n | { t: \"set_layout\"; id: string; layout?: LayoutMode };\n\n/** A pure reducer over a `DocTree<StyledNode>` handling tree ops + style/layout. */\nexport function cmsReducer(): DocReducer<DocTree<StyledNode>, CmsOp> {\n const base = treeReducer<StyledNode>();\n return {\n reduce(doc, op) {\n if (op.t === \"set_style\") {\n const node = doc.nodes[op.id];\n if (!node) return doc;\n return { nodes: { ...doc.nodes, [op.id]: { ...node, style: { ...node.style, base: { ...node.style.base, ...op.patch } } } } };\n }\n if (op.t === \"set_layout\") {\n const node = doc.nodes[op.id];\n if (!node) return doc;\n return { nodes: { ...doc.nodes, [op.id]: { ...node, layout: op.layout } } };\n }\n return base.reduce(doc, op);\n },\n invert(doc, op) {\n if (op.t === \"set_style\") {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const prev: Partial<StyleProps> = {};\n for (const k in op.patch) (prev as Record<string, unknown>)[k as keyof StyleProps] = node.style.base[k as keyof StyleProps];\n return [{ t: \"set_style\", id: op.id, patch: prev }];\n }\n if (op.t === \"set_layout\") {\n const node = doc.nodes[op.id];\n if (!node) return [];\n return [{ t: \"set_layout\", id: op.id, layout: node.layout }];\n }\n return base.invert(doc, op) as CmsOp[];\n },\n };\n}\n\nexport interface CmsBridgeOptions {\n adapter: DocAdapter<StyledNode>;\n agent?: { id: string; name?: string; color?: string };\n /** Auto-apply vs. confirm per op (trust-but-verify). Default: auto. */\n stagePolicy?: StagePolicy<CmsOp>;\n onPending?: (staged: { id: string; op: CmsOp; label: string }) => void;\n}\n\n/** Register the CMS bridge (prefix `cms_`) over a `DocTree<StyledNode>`. */\nexport function registerCmsBridge(host: ToolHost, options: CmsBridgeOptions): Bridge {\n return registerDocBridge<StyledNode, CmsOp>(host, {\n adapter: options.adapter,\n surface: \"cms\",\n agent: options.agent,\n reducer: cmsReducer(),\n stagePolicy: options.stagePolicy,\n onPending: options.onPending,\n // New nodes get an empty base style so they satisfy StyledNode.\n makeNode: ({ id, type, parent, order }, props) => ({ id, type, parent, order, props, style: { base: {} } }),\n describeNode: (n) => ({ id: n.id, type: n.type, parent: n.parent, layout: n.layout }),\n opTools: [\n {\n verb: \"set_style\",\n description: \"Merge a StyleProps patch into a node's base style (color, background, padding, fontSize, gap, …).\",\n properties: { id: { type: \"string\" }, patch: { type: \"object\", description: \"Partial StyleProps.\" } },\n required: [\"id\", \"patch\"],\n build: (args, tree) => {\n const id = String(args.id);\n if (!tree.nodes[id]) return { error: `No node ${id}` };\n return { t: \"set_style\", id, patch: (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<StyleProps> };\n },\n targetId: (args) => String(args.id),\n },\n {\n verb: \"set_layout\",\n description: \"Set a container node's layout mode (free | stack | grid).\",\n properties: { id: { type: \"string\" }, layout: { type: \"string\", enum: [\"free\", \"stack\", \"grid\"] } },\n required: [\"id\"],\n build: (args, tree) => {\n const id = String(args.id);\n if (!tree.nodes[id]) return { error: `No node ${id}` };\n return { t: \"set_layout\", id, layout: args.layout as LayoutMode | undefined };\n },\n targetId: (args) => String(args.id),\n },\n ],\n });\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-CT3LRNH7.js';
|
|
1
2
|
import { wrapToolWithActivity } from './chunk-ULJL53DL.js';
|
|
2
|
-
import {
|
|
3
|
-
import { textResult, errorResult } from './chunk-4KAIV6OD.js';
|
|
3
|
+
import { textResult, errorResult } from './chunk-DF3PLL2E.js';
|
|
4
4
|
import { treeReducer, autoApply, childrenOf, appendOrder, descendantsOf } from '@particle-academy/fancy-doc-commons';
|
|
5
5
|
|
|
6
6
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
@@ -241,5 +241,5 @@ function registerDocBridge(host, options) {
|
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
export { registerDocBridge };
|
|
244
|
-
//# sourceMappingURL=chunk-
|
|
245
|
-
//# sourceMappingURL=chunk-
|
|
244
|
+
//# sourceMappingURL=chunk-AF454WRD.js.map
|
|
245
|
+
//# sourceMappingURL=chunk-AF454WRD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridges/doc.ts"],"names":[],"mappings":"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","file":"chunk-FF5F526J.js","sourcesContent":["/**\n * registerDocBridge — a GENERIC MCP bridge over a `@particle-academy/fancy-doc-commons`\n * `DocTree`. Give it an adapter (`{ get, set }`) and it generates, from the shared\n * op-spine, a full Human+ surface: uniform read tools + the canonical node op tools\n * (add / update / remove / move) under one verb lexicon, with **undo derived from\n * the reducer**, agent-activity broadcasts, unconditional `agent_undo/redo/history`,\n * and an optional **staged-write** (confirm / reject) channel — replacing the ~500-line\n * bespoke bridges (whiteboard/flow/artboard/…) with one builder. A surface adds its\n * domain ops (e.g. cms `set_style`) via `opTools` + a matching reducer.\n */\nimport { 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\";\nimport {\n treeReducer,\n childrenOf,\n descendantsOf,\n appendOrder,\n autoApply,\n type DocTree,\n type DocNode,\n type TreeOp,\n type DocReducer,\n type StagePolicy,\n} from \"@particle-academy/fancy-doc-commons\";\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/** Host-provided access to the document tree. */\nexport interface DocAdapter<N extends DocNode> {\n /** Read the current tree. */\n get(): DocTree<N>;\n /** Replace the tree — host wires this to its `onChange` / `setState`. */\n set(next: DocTree<N>): void;\n /** Optional fancy-screens screen id, for presence scoping. */\n screenId?: string;\n /** Mint a fresh, unique node id. Default: `<surface>-<n>`. */\n newId?(): string;\n}\n\n/**\n * A domain op tool beyond the built-in add/update/remove/move — lets a surface\n * expose its own ops (e.g. cms `set_style`) through the same undo + activity path.\n */\nexport interface DocOpTool<N extends DocNode, TOp> {\n /** Verb, prefixed with the surface (e.g. `set_style` → `cms_set_style`). */\n verb: string;\n description: string;\n properties: Record<string, unknown>;\n required: string[];\n /** Build the op from the args (or return `{ error }`). */\n build(args: JsonObject, tree: DocTree<N>): TOp | { error: string };\n /** Node id this op targets (for the activity target + undo label). */\n targetId?(args: JsonObject): string | undefined;\n}\n\nexport interface DocBridgeOptions<N extends DocNode, TOp = TreeOp<N>> {\n adapter: DocAdapter<N>;\n /** Tool-name prefix + activity kind (e.g. `\"cms\"` → `cms_add`, kind `\"cms\"`). */\n surface: string;\n agent?: { id: string; name?: string; color?: string };\n /** Reducer for reduce + invert. Default: the substrate `treeReducer<N>()`. */\n reducer?: DocReducer<DocTree<N>, TOp>;\n /** Build a full node from the core fields + props (fill surface defaults, e.g. `style`). */\n makeNode?: (core: { id: string; type: string; parent: string | null; order: string }, props: Record<string, unknown>) => N;\n /** Domain op tools beyond the built-ins. */\n opTools?: DocOpTool<N, TOp>[];\n /** Decide auto-apply vs. confirm per op. Default: everything auto-applies. */\n stagePolicy?: StagePolicy<TOp>;\n /** Fired when an op is staged pending human confirmation. */\n onPending?: (staged: { id: string; op: TOp; label: string }) => void;\n /** Summarize a node for describe/list. Default: id/type/parent + prop keys. */\n describeNode?: (node: N) => Record<string, unknown>;\n}\n\n/** Register the generic doc-surface bridge. Returns a {@link Bridge}. */\nexport function registerDocBridge<N extends DocNode, TOp = TreeOp<N>>(\n host: ToolHost,\n options: DocBridgeOptions<N, TOp>,\n): Bridge {\n const { adapter, surface } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const reducer = (options.reducer ?? (treeReducer<N>() as unknown as DocReducer<DocTree<N>, TOp>));\n const stage = options.stagePolicy ?? (autoApply as StagePolicy<TOp>);\n const makeNode =\n options.makeNode ?? (({ id, type, parent, order }, props) => ({ id, type, parent, order, props }) as N);\n const describeNode =\n options.describeNode ?? ((n: N) => ({ id: n.id, type: n.type, parent: n.parent, props: Object.keys(n.props ?? {}) }));\n const disposers: Array<() => void> = [];\n\n // agent_undo / agent_redo / agent_history — always present (undo derives from\n // the reducer, so every doc surface gets working undo for free).\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n let idSeq = 0;\n const mintId = () => adapter.newId?.() ?? `${surface}-${(idSeq += 1)}`;\n const target = (elementId?: string): AgentTarget => ({ kind: surface, screenId: adapter.screenId, elementId });\n\n // Staged ops awaiting confirmation.\n const pending = new Map<string, { op: TOp; label: string; targetId?: string }>();\n\n /** Apply an op immediately: reduce → set → push a snapshot-based undo entry. */\n function commit(op: TOp, label: string, targetId?: string): Record<string, unknown> {\n const prev = adapter.get();\n const next = reducer.reduce(prev, op);\n adapter.set(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: surface,\n action: label,\n label,\n undo: () => adapter.set(prev),\n redo: () => adapter.set(next),\n });\n return { ok: true, id: targetId };\n }\n\n /** Auto-apply, or stage for confirmation per the stage policy. */\n function submit(op: TOp, label: string, targetId?: string): { staged: boolean; id?: string } {\n if (stage(op) === \"confirm\") {\n const id = `${surface}-pending-${(idSeq += 1)}`;\n pending.set(id, { op, label, targetId });\n options.onPending?.({ id, op, label });\n return { staged: true, id };\n }\n commit(op, label, targetId);\n return { staged: false, id: targetId };\n }\n\n const reg = (\n verb: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Record<string, unknown> | Promise<Record<string, unknown>>,\n isMutation: boolean,\n resolveTarget?: (args: JsonObject, result: Record<string, unknown>) => AgentTarget | null,\n ): void => {\n const name = `${surface}_${verb}`;\n const wrapped = async (args: JsonObject) => {\n try {\n // `_text` is the human-facing line; the rest is structuredContent.\n const { _text, ...structured } = await handler(args);\n return textResult(typeof _text === \"string\" ? _text : name, structured);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: surface,\n screenId: adapter.screenId,\n resolveTarget: ({ args, result }) => {\n if ((result.structuredContent as JsonObject | undefined)?.staged) return null;\n return resolveTarget?.(args, (result.structuredContent as JsonObject) ?? {}) ?? target();\n },\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false } },\n final as never,\n ),\n );\n };\n\n // ── Read tools ──────────────────────────────────────────────────────────\n reg(\n \"describe\",\n `Summarize the ${surface} document: node count, roots, and the active surface. Call before reading or writing.`,\n {},\n [],\n () => {\n const tree = adapter.get();\n const ids = Object.keys(tree.nodes);\n return { nodeCount: ids.length, roots: childrenOf(tree, null).map((n) => n.id), _text: `${ids.length} nodes` };\n },\n false,\n );\n reg(\n \"get\",\n `Get the whole ${surface} document tree as JSON.`,\n {},\n [],\n () => ({ tree: adapter.get(), _text: \"full tree\" }),\n false,\n );\n reg(\n \"list\",\n \"List nodes (optionally the children of `parent`), in order.\",\n { parent: { type: [\"string\", \"null\"], description: \"Parent id, or null/omitted for roots.\" } },\n [],\n (args) => {\n const tree = adapter.get();\n const parent = typeof args.parent === \"string\" ? args.parent : null;\n return { nodes: childrenOf(tree, parent).map(describeNode), _text: `children of ${parent ?? \"root\"}` };\n },\n false,\n );\n reg(\n \"get_node\",\n \"Get one node by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const node = adapter.get().nodes[String(args.id)];\n if (!node) throw new Error(`No node ${args.id}`);\n return { node, _text: `node ${node.id}` };\n },\n false,\n );\n\n // ── Canonical op tools ──────────────────────────────────────────────────\n reg(\n \"add\",\n \"Insert a node. Returns its id. Appends under `parent` (or roots) unless `order` is given.\",\n {\n type: { type: \"string\", description: \"Node type discriminant.\" },\n parent: { type: [\"string\", \"null\"], description: \"Parent id, or null for a root.\" },\n props: { type: \"object\", description: \"JSON props bag.\" },\n order: { type: \"string\", description: \"Fractional order key (default: append).\" },\n },\n [\"type\"],\n (args) => {\n const tree = adapter.get();\n const parent = typeof args.parent === \"string\" ? args.parent : null;\n const id = mintId();\n const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n const props = (args.props && typeof args.props === \"object\" ? args.props : {}) as Record<string, unknown>;\n const node = makeNode({ id, type: String(args.type), parent, order }, props);\n const res = submit({ t: \"insert\", node } as unknown as TOp, `add ${args.type} ${id}`, id);\n return { ...res, _text: res.staged ? `staged add ${id}` : `added ${id}` };\n },\n true,\n (_args, result) => target(result.id as string | undefined),\n );\n reg(\n \"update\",\n \"Merge a props patch into a node.\",\n { id: { type: \"string\" }, patch: { type: \"object\" } },\n [\"id\", \"patch\"],\n (args) => {\n const id = String(args.id);\n if (!adapter.get().nodes[id]) throw new Error(`No node ${id}`);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Record<string, unknown>;\n const res = submit({ t: \"set_props\", id, patch } as unknown as TOp, `update ${id}`, id);\n return { ...res, id, _text: res.staged ? `staged update ${id}` : `updated ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n reg(\n \"remove\",\n \"Remove a node and its subtree.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const tree = adapter.get();\n if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n const count = descendantsOf(tree, id).length + 1;\n const res = submit({ t: \"remove\", id } as unknown as TOp, `remove ${id} (${count} node${count === 1 ? \"\" : \"s\"})`, id);\n return { ...res, id, removed: count, _text: res.staged ? `staged remove ${id}` : `removed ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n reg(\n \"move\",\n \"Reparent + reorder a node.\",\n { id: { type: \"string\" }, parent: { type: [\"string\", \"null\"] }, order: { type: \"string\", description: \"Fractional order key (default: append under the new parent).\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const tree = adapter.get();\n if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n const parent = args.parent === null ? null : typeof args.parent === \"string\" ? args.parent : tree.nodes[id]!.parent;\n const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n const res = submit({ t: \"move\", id, parent, order } as unknown as TOp, `move ${id}`, id);\n return { ...res, id, _text: res.staged ? `staged move ${id}` : `moved ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n\n // ── Domain op tools ─────────────────────────────────────────────────────\n for (const t of options.opTools ?? []) {\n reg(\n t.verb,\n t.description,\n t.properties,\n t.required,\n (args) => {\n const built = t.build(args, adapter.get());\n if (built && typeof built === \"object\" && \"error\" in built) throw new Error((built as { error: string }).error);\n const tid = t.targetId?.(args);\n const res = submit(built as TOp, `${t.verb} ${tid ?? \"\"}`.trim(), tid);\n return { ...res, id: tid, _text: res.staged ? `staged ${t.verb}` : t.verb };\n },\n true,\n (args) => target(t.targetId?.(args)),\n );\n }\n\n // ── Staged-write confirm / reject ───────────────────────────────────────\n reg(\n \"confirm\",\n \"Apply a staged op by its pending id (from a staged mutation).\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const p = pending.get(id);\n if (!p) throw new Error(`No pending op ${id}`);\n pending.delete(id);\n commit(p.op, p.label, p.targetId);\n return { ok: true, applied: p.label, id: p.targetId, _text: `applied ${p.label}` };\n },\n true,\n (_args, result) => target(result.id as string | undefined),\n );\n reg(\n \"reject\",\n \"Discard a staged op by its pending id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const p = pending.get(id);\n if (!p) throw new Error(`No pending op ${id}`);\n pending.delete(id);\n return { ok: true, rejected: p.label, _text: `rejected ${p.label}` };\n },\n false,\n );\n\n return {\n id: surface,\n title: surface,\n dispose: () => {\n for (const d of disposers) d();\n pending.clear();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bridges/doc.ts"],"names":[],"mappings":"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","file":"chunk-AF454WRD.js","sourcesContent":["/**\n * registerDocBridge — a GENERIC MCP bridge over a `@particle-academy/fancy-doc-commons`\n * `DocTree`. Give it an adapter (`{ get, set }`) and it generates, from the shared\n * op-spine, a full Human+ surface: uniform read tools + the canonical node op tools\n * (add / update / remove / move) under one verb lexicon, with **undo derived from\n * the reducer**, agent-activity broadcasts, unconditional `agent_undo/redo/history`,\n * and an optional **staged-write** (confirm / reject) channel — replacing the ~500-line\n * bespoke bridges (whiteboard/flow/artboard/…) with one builder. A surface adds its\n * domain ops (e.g. cms `set_style`) via `opTools` + a matching reducer.\n */\nimport { 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\";\nimport {\n treeReducer,\n childrenOf,\n descendantsOf,\n appendOrder,\n autoApply,\n type DocTree,\n type DocNode,\n type TreeOp,\n type DocReducer,\n type StagePolicy,\n} from \"@particle-academy/fancy-doc-commons\";\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/** Host-provided access to the document tree. */\nexport interface DocAdapter<N extends DocNode> {\n /** Read the current tree. */\n get(): DocTree<N>;\n /** Replace the tree — host wires this to its `onChange` / `setState`. */\n set(next: DocTree<N>): void;\n /** Optional fancy-screens screen id, for presence scoping. */\n screenId?: string;\n /** Mint a fresh, unique node id. Default: `<surface>-<n>`. */\n newId?(): string;\n}\n\n/**\n * A domain op tool beyond the built-in add/update/remove/move — lets a surface\n * expose its own ops (e.g. cms `set_style`) through the same undo + activity path.\n */\nexport interface DocOpTool<N extends DocNode, TOp> {\n /** Verb, prefixed with the surface (e.g. `set_style` → `cms_set_style`). */\n verb: string;\n description: string;\n properties: Record<string, unknown>;\n required: string[];\n /** Build the op from the args (or return `{ error }`). */\n build(args: JsonObject, tree: DocTree<N>): TOp | { error: string };\n /** Node id this op targets (for the activity target + undo label). */\n targetId?(args: JsonObject): string | undefined;\n}\n\nexport interface DocBridgeOptions<N extends DocNode, TOp = TreeOp<N>> {\n adapter: DocAdapter<N>;\n /** Tool-name prefix + activity kind (e.g. `\"cms\"` → `cms_add`, kind `\"cms\"`). */\n surface: string;\n agent?: { id: string; name?: string; color?: string };\n /** Reducer for reduce + invert. Default: the substrate `treeReducer<N>()`. */\n reducer?: DocReducer<DocTree<N>, TOp>;\n /** Build a full node from the core fields + props (fill surface defaults, e.g. `style`). */\n makeNode?: (core: { id: string; type: string; parent: string | null; order: string }, props: Record<string, unknown>) => N;\n /** Domain op tools beyond the built-ins. */\n opTools?: DocOpTool<N, TOp>[];\n /** Decide auto-apply vs. confirm per op. Default: everything auto-applies. */\n stagePolicy?: StagePolicy<TOp>;\n /** Fired when an op is staged pending human confirmation. */\n onPending?: (staged: { id: string; op: TOp; label: string }) => void;\n /** Summarize a node for describe/list. Default: id/type/parent + prop keys. */\n describeNode?: (node: N) => Record<string, unknown>;\n}\n\n/** Register the generic doc-surface bridge. Returns a {@link Bridge}. */\nexport function registerDocBridge<N extends DocNode, TOp = TreeOp<N>>(\n host: ToolHost,\n options: DocBridgeOptions<N, TOp>,\n): Bridge {\n const { adapter, surface } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const reducer = (options.reducer ?? (treeReducer<N>() as unknown as DocReducer<DocTree<N>, TOp>));\n const stage = options.stagePolicy ?? (autoApply as StagePolicy<TOp>);\n const makeNode =\n options.makeNode ?? (({ id, type, parent, order }, props) => ({ id, type, parent, order, props }) as N);\n const describeNode =\n options.describeNode ?? ((n: N) => ({ id: n.id, type: n.type, parent: n.parent, props: Object.keys(n.props ?? {}) }));\n const disposers: Array<() => void> = [];\n\n // agent_undo / agent_redo / agent_history — always present (undo derives from\n // the reducer, so every doc surface gets working undo for free).\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n let idSeq = 0;\n const mintId = () => adapter.newId?.() ?? `${surface}-${(idSeq += 1)}`;\n const target = (elementId?: string): AgentTarget => ({ kind: surface, screenId: adapter.screenId, elementId });\n\n // Staged ops awaiting confirmation.\n const pending = new Map<string, { op: TOp; label: string; targetId?: string }>();\n\n /** Apply an op immediately: reduce → set → push a snapshot-based undo entry. */\n function commit(op: TOp, label: string, targetId?: string): Record<string, unknown> {\n const prev = adapter.get();\n const next = reducer.reduce(prev, op);\n adapter.set(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: surface,\n action: label,\n label,\n undo: () => adapter.set(prev),\n redo: () => adapter.set(next),\n });\n return { ok: true, id: targetId };\n }\n\n /** Auto-apply, or stage for confirmation per the stage policy. */\n function submit(op: TOp, label: string, targetId?: string): { staged: boolean; id?: string } {\n if (stage(op) === \"confirm\") {\n const id = `${surface}-pending-${(idSeq += 1)}`;\n pending.set(id, { op, label, targetId });\n options.onPending?.({ id, op, label });\n return { staged: true, id };\n }\n commit(op, label, targetId);\n return { staged: false, id: targetId };\n }\n\n const reg = (\n verb: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Record<string, unknown> | Promise<Record<string, unknown>>,\n isMutation: boolean,\n resolveTarget?: (args: JsonObject, result: Record<string, unknown>) => AgentTarget | null,\n ): void => {\n const name = `${surface}_${verb}`;\n const wrapped = async (args: JsonObject) => {\n try {\n // `_text` is the human-facing line; the rest is structuredContent.\n const { _text, ...structured } = await handler(args);\n return textResult(typeof _text === \"string\" ? _text : name, structured);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: surface,\n screenId: adapter.screenId,\n resolveTarget: ({ args, result }) => {\n if ((result.structuredContent as JsonObject | undefined)?.staged) return null;\n return resolveTarget?.(args, (result.structuredContent as JsonObject) ?? {}) ?? target();\n },\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false } },\n final as never,\n ),\n );\n };\n\n // ── Read tools ──────────────────────────────────────────────────────────\n reg(\n \"describe\",\n `Summarize the ${surface} document: node count, roots, and the active surface. Call before reading or writing.`,\n {},\n [],\n () => {\n const tree = adapter.get();\n const ids = Object.keys(tree.nodes);\n return { nodeCount: ids.length, roots: childrenOf(tree, null).map((n) => n.id), _text: `${ids.length} nodes` };\n },\n false,\n );\n reg(\n \"get\",\n `Get the whole ${surface} document tree as JSON.`,\n {},\n [],\n () => ({ tree: adapter.get(), _text: \"full tree\" }),\n false,\n );\n reg(\n \"list\",\n \"List nodes (optionally the children of `parent`), in order.\",\n { parent: { type: [\"string\", \"null\"], description: \"Parent id, or null/omitted for roots.\" } },\n [],\n (args) => {\n const tree = adapter.get();\n const parent = typeof args.parent === \"string\" ? args.parent : null;\n return { nodes: childrenOf(tree, parent).map(describeNode), _text: `children of ${parent ?? \"root\"}` };\n },\n false,\n );\n reg(\n \"get_node\",\n \"Get one node by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const node = adapter.get().nodes[String(args.id)];\n if (!node) throw new Error(`No node ${args.id}`);\n return { node, _text: `node ${node.id}` };\n },\n false,\n );\n\n // ── Canonical op tools ──────────────────────────────────────────────────\n reg(\n \"add\",\n \"Insert a node. Returns its id. Appends under `parent` (or roots) unless `order` is given.\",\n {\n type: { type: \"string\", description: \"Node type discriminant.\" },\n parent: { type: [\"string\", \"null\"], description: \"Parent id, or null for a root.\" },\n props: { type: \"object\", description: \"JSON props bag.\" },\n order: { type: \"string\", description: \"Fractional order key (default: append).\" },\n },\n [\"type\"],\n (args) => {\n const tree = adapter.get();\n const parent = typeof args.parent === \"string\" ? args.parent : null;\n const id = mintId();\n const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n const props = (args.props && typeof args.props === \"object\" ? args.props : {}) as Record<string, unknown>;\n const node = makeNode({ id, type: String(args.type), parent, order }, props);\n const res = submit({ t: \"insert\", node } as unknown as TOp, `add ${args.type} ${id}`, id);\n return { ...res, _text: res.staged ? `staged add ${id}` : `added ${id}` };\n },\n true,\n (_args, result) => target(result.id as string | undefined),\n );\n reg(\n \"update\",\n \"Merge a props patch into a node.\",\n { id: { type: \"string\" }, patch: { type: \"object\" } },\n [\"id\", \"patch\"],\n (args) => {\n const id = String(args.id);\n if (!adapter.get().nodes[id]) throw new Error(`No node ${id}`);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Record<string, unknown>;\n const res = submit({ t: \"set_props\", id, patch } as unknown as TOp, `update ${id}`, id);\n return { ...res, id, _text: res.staged ? `staged update ${id}` : `updated ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n reg(\n \"remove\",\n \"Remove a node and its subtree.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const tree = adapter.get();\n if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n const count = descendantsOf(tree, id).length + 1;\n const res = submit({ t: \"remove\", id } as unknown as TOp, `remove ${id} (${count} node${count === 1 ? \"\" : \"s\"})`, id);\n return { ...res, id, removed: count, _text: res.staged ? `staged remove ${id}` : `removed ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n reg(\n \"move\",\n \"Reparent + reorder a node.\",\n { id: { type: \"string\" }, parent: { type: [\"string\", \"null\"] }, order: { type: \"string\", description: \"Fractional order key (default: append under the new parent).\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const tree = adapter.get();\n if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n const parent = args.parent === null ? null : typeof args.parent === \"string\" ? args.parent : tree.nodes[id]!.parent;\n const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n const res = submit({ t: \"move\", id, parent, order } as unknown as TOp, `move ${id}`, id);\n return { ...res, id, _text: res.staged ? `staged move ${id}` : `moved ${id}` };\n },\n true,\n (args) => target(String(args.id)),\n );\n\n // ── Domain op tools ─────────────────────────────────────────────────────\n for (const t of options.opTools ?? []) {\n reg(\n t.verb,\n t.description,\n t.properties,\n t.required,\n (args) => {\n const built = t.build(args, adapter.get());\n if (built && typeof built === \"object\" && \"error\" in built) throw new Error((built as { error: string }).error);\n const tid = t.targetId?.(args);\n const res = submit(built as TOp, `${t.verb} ${tid ?? \"\"}`.trim(), tid);\n return { ...res, id: tid, _text: res.staged ? `staged ${t.verb}` : t.verb };\n },\n true,\n (args) => target(t.targetId?.(args)),\n );\n }\n\n // ── Staged-write confirm / reject ───────────────────────────────────────\n reg(\n \"confirm\",\n \"Apply a staged op by its pending id (from a staged mutation).\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const p = pending.get(id);\n if (!p) throw new Error(`No pending op ${id}`);\n pending.delete(id);\n commit(p.op, p.label, p.targetId);\n return { ok: true, applied: p.label, id: p.targetId, _text: `applied ${p.label}` };\n },\n true,\n (_args, result) => target(result.id as string | undefined),\n );\n reg(\n \"reject\",\n \"Discard a staged op by its pending id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = String(args.id);\n const p = pending.get(id);\n if (!p) throw new Error(`No pending op ${id}`);\n pending.delete(id);\n return { ok: true, rejected: p.label, _text: `rejected ${p.label}` };\n },\n false,\n );\n\n return {\n id: surface,\n title: surface,\n dispose: () => {\n for (const d of disposers) d();\n pending.clear();\n },\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { ensureUndoToolsRegistered } from './chunk-CT3LRNH7.js';
|
|
1
2
|
import { wrapToolWithActivity } from './chunk-ULJL53DL.js';
|
|
2
|
-
import {
|
|
3
|
-
import { textResult, errorResult } from './chunk-4KAIV6OD.js';
|
|
3
|
+
import { textResult, errorResult } from './chunk-DF3PLL2E.js';
|
|
4
4
|
|
|
5
5
|
// src/bridges/screens.ts
|
|
6
6
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
@@ -178,5 +178,5 @@ function registerScreensBridge(host, options) {
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
export { registerScreensBridge };
|
|
181
|
-
//# sourceMappingURL=chunk-
|
|
182
|
-
//# sourceMappingURL=chunk-
|
|
181
|
+
//# sourceMappingURL=chunk-BE2XS577.js.map
|
|
182
|
+
//# sourceMappingURL=chunk-BE2XS577.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridges/screens.ts"],"names":[],"mappings":"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","file":"chunk-66WOHZZJ.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\";\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 * 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 */\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) => void;\n /** Optional: instantiate a new screen from a template + config. */\n createScreen?: (spec: ScreenCreateSpec) => void;\n /** Optional: remove a previously-created screen. */\n destroyScreen?: (screenId: string) => void;\n /** Optional: shallow-merge new config into an existing screen. */\n updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => void;\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\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(e instanceof Error ? e.message : String(e)); }\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 ),\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 (args) => {\n if (!adapter.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 adapter.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 });\n adapter.setActive(id);\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 (args) => {\n if (!adapter.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 adapter.destroyScreen(id);\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 (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n adapter.updateScreenContent(String(args.id), { layout: String(args.layout) });\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 (args) => {\n if (!adapter.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 adapter.updateScreenContent(id, partial);\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 (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 adapter.setActive(screenId);\n return textResult(`Navigated to ${screenId}`, { screen: screenId });\n },\n true,\n (args) => target(String(args.screen ?? \"\")),\n );\n\n return {\n id: \"screens\",\n title: \"Screens\",\n dispose: () => { for (const d of disposers) d(); },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bridges/screens.ts"],"names":[],"mappings":"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","file":"chunk-BE2XS577.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\";\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 * 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 */\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) => void;\n /** Optional: instantiate a new screen from a template + config. */\n createScreen?: (spec: ScreenCreateSpec) => void;\n /** Optional: remove a previously-created screen. */\n destroyScreen?: (screenId: string) => void;\n /** Optional: shallow-merge new config into an existing screen. */\n updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => void;\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\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(e instanceof Error ? e.message : String(e)); }\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 ),\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 (args) => {\n if (!adapter.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 adapter.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 });\n adapter.setActive(id);\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 (args) => {\n if (!adapter.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 adapter.destroyScreen(id);\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 (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n adapter.updateScreenContent(String(args.id), { layout: String(args.layout) });\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 (args) => {\n if (!adapter.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 adapter.updateScreenContent(id, partial);\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 (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 adapter.setActive(screenId);\n return textResult(`Navigated to ${screenId}`, { screen: screenId });\n },\n true,\n (args) => target(String(args.screen ?? \"\")),\n );\n\n return {\n id: \"screens\",\n title: \"Screens\",\n dispose: () => { for (const d of disposers) d(); },\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readHistory } from './chunk-
|
|
1
|
+
import { readHistory } from './chunk-CT3LRNH7.js';
|
|
2
2
|
import { useState, useEffect, useCallback } from 'react';
|
|
3
3
|
|
|
4
4
|
function useUndoStack(agentId, intervalMs = 500) {
|
|
@@ -21,5 +21,5 @@ function useUndoStack(agentId, intervalMs = 500) {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export { useUndoStack };
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
24
|
+
//# sourceMappingURL=chunk-BT7HM5I6.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-BT7HM5I6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/undo/use-undo-stack.ts"],"names":[],"mappings":";;;AASO,SAAS,YAAA,CAAa,OAAA,EAAiB,UAAA,GAAa,GAAA,EAAK;AAC9D,EAAA,MAAM,CAAC,SAAS,UAAU,CAAA,GAAI,SAAS,MAAM,WAAA,CAAY,OAAO,CAAC,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,UAAA,CAAW,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,EAAM,UAAU,CAAA;AACvC,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAM,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAM,UAAA,CAAW,WAAA,CAAY,OAAO,CAAC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC7E,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/undo/use-undo-stack.ts"],"names":[],"mappings":";;;AASO,SAAS,YAAA,CAAa,OAAA,EAAiB,UAAA,GAAa,GAAA,EAAK;AAC9D,EAAA,MAAM,CAAC,SAAS,UAAU,CAAA,GAAI,SAAS,MAAM,WAAA,CAAY,OAAO,CAAC,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,UAAA,CAAW,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,EAAM,UAAU,CAAA;AACvC,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAM,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAM,UAAA,CAAW,WAAA,CAAY,OAAO,CAAC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC7E,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B","file":"chunk-BT7HM5I6.js","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { readHistory } from \"./undo-stack\";\n\n/**\n * useUndoStack — minimal React snapshot of an agent's history. Polls every\n * `intervalMs` (default 500). Use this to render an inline \"agent timeline\"\n * in a sidebar or activity panel. No subscription model in v1 — keeping it\n * simple; bridge mutations are infrequent enough that polling is fine.\n */\nexport function useUndoStack(agentId: string, intervalMs = 500) {\n const [history, setHistory] = useState(() => readHistory(agentId));\n\n useEffect(() => {\n let cancelled = false;\n const tick = () => {\n if (cancelled) return;\n setHistory(readHistory(agentId));\n };\n const id = setInterval(tick, intervalMs);\n tick();\n return () => { cancelled = true; clearInterval(id); };\n }, [agentId, intervalMs]);\n\n const refresh = useCallback(() => setHistory(readHistory(agentId)), [agentId]);\n return { history, refresh };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { errorResult, textResult } from './chunk-
|
|
1
|
+
import { errorResult, textResult } from './chunk-DF3PLL2E.js';
|
|
2
2
|
import { undoOne, redoOne, readHistory } from '@particle-academy/fancy-auto-common';
|
|
3
3
|
export { clearStack, pushUndoEntry, readHistory, redoOne, resetAllUndoStacks, undoOne } from '@particle-academy/fancy-auto-common';
|
|
4
4
|
|
|
@@ -79,5 +79,5 @@ function serialize(entry) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export { ensureUndoToolsRegistered, registerUndoTools };
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-CT3LRNH7.js.map
|
|
83
|
+
//# sourceMappingURL=chunk-CT3LRNH7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/undo/undo-tools.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/undo/undo-tools.ts"],"names":[],"mappings":"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","file":"chunk-CT3LRNH7.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport { readHistory, redoOne, undoOne } from \"./undo-stack\";\n\nexport type UndoToolsOptions = {\n /** Default agent id when the caller doesn't pass one. */\n defaultAgentId?: string;\n};\n\n/**\n * Idempotent tracker so multiple bridges on the same server only register\n * agent_undo / agent_redo / agent_history once.\n */\nconst installedHosts = new WeakSet<ToolHost>();\n\n/**\n * ensureUndoToolsRegistered — bridges call this on construction. Safe to\n * call repeatedly with the same server; subsequent calls are no-ops.\n */\nexport function ensureUndoToolsRegistered(host: ToolHost, options: UndoToolsOptions = {}): void {\n if (installedHosts.has(host)) return;\n installedHosts.add(host);\n registerUndoTools(host, options);\n}\n\n/**\n * registerUndoTools — add agent_undo / agent_redo / agent_history to the\n * server. Returns a disposer that unregisters all three.\n */\nexport function registerUndoTools(host: ToolHost, options: UndoToolsOptions = {}): () => void {\n const defaultAgent = options.defaultAgentId ?? \"agent\";\n const disposers: Array<() => void> = [];\n const agentOf = (args: any): string =>\n typeof args?.agentId === \"string\" ? args.agentId : defaultAgent;\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_undo\",\n description: \"Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await undoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to undo.\");\n return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });\n },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_redo\",\n description: \"Redo the most recently undone action.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await redoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to redo.\");\n return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });\n },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_history\",\n description: \"List the agent's undo stack (oldest first). Useful for understanding what's reversible.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const history = readHistory(agentOf(args)).map(serialize);\n const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join(\"\\n\");\n return textResult(text || \"(empty)\", history);\n },\n ),\n );\n\n return () => disposers.forEach((d) => d());\n}\n\nfunction serialize(entry: import(\"./undo-stack\").UndoEntry) {\n return {\n timestamp: entry.timestamp,\n bridgeId: entry.bridgeId,\n action: entry.action,\n label: entry.label,\n };\n}\n"]}
|