@particle-academy/agent-integrations 0.50.0 → 0.51.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.
Files changed (226) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +11 -0
  3. package/dist/bridges/artboard.d.cts +3 -3
  4. package/dist/bridges/artboard.d.ts +3 -3
  5. package/dist/bridges/catalog.d.cts +3 -3
  6. package/dist/bridges/catalog.d.ts +3 -3
  7. package/dist/bridges/charts.d.cts +3 -3
  8. package/dist/bridges/charts.d.ts +3 -3
  9. package/dist/bridges/cms.d.cts +3 -3
  10. package/dist/bridges/cms.d.ts +3 -3
  11. package/dist/bridges/code.d.cts +3 -3
  12. package/dist/bridges/code.d.ts +3 -3
  13. package/dist/bridges/doc.d.cts +3 -3
  14. package/dist/bridges/doc.d.ts +3 -3
  15. package/dist/bridges/features.d.cts +3 -3
  16. package/dist/bridges/features.d.ts +3 -3
  17. package/dist/bridges/files.d.cts +3 -3
  18. package/dist/bridges/files.d.ts +3 -3
  19. package/dist/bridges/flow.d.cts +3 -3
  20. package/dist/bridges/flow.d.ts +3 -3
  21. package/dist/bridges/forms.d.cts +3 -3
  22. package/dist/bridges/forms.d.ts +3 -3
  23. package/dist/bridges/git.d.cts +3 -3
  24. package/dist/bridges/git.d.ts +3 -3
  25. package/dist/bridges/grid.d.cts +3 -3
  26. package/dist/bridges/grid.d.ts +3 -3
  27. package/dist/bridges/map.d.cts +3 -3
  28. package/dist/bridges/map.d.ts +3 -3
  29. package/dist/bridges/navigation.d.cts +3 -3
  30. package/dist/bridges/navigation.d.ts +3 -3
  31. package/dist/bridges/passkeys.d.cts +3 -3
  32. package/dist/bridges/passkeys.d.ts +3 -3
  33. package/dist/bridges/scene.d.cts +3 -3
  34. package/dist/bridges/scene.d.ts +3 -3
  35. package/dist/bridges/screen-doc.d.cts +3 -3
  36. package/dist/bridges/screen-doc.d.ts +3 -3
  37. package/dist/bridges/screens.d.cts +3 -3
  38. package/dist/bridges/screens.d.ts +3 -3
  39. package/dist/bridges/sheets.d.cts +3 -3
  40. package/dist/bridges/sheets.d.ts +3 -3
  41. package/dist/bridges/slides.d.cts +3 -3
  42. package/dist/bridges/slides.d.ts +3 -3
  43. package/dist/bridges/terminal.d.cts +3 -3
  44. package/dist/bridges/terminal.d.ts +3 -3
  45. package/dist/bridges/tui.d.cts +2 -2
  46. package/dist/bridges/tui.d.ts +2 -2
  47. package/dist/bridges/whiteboard.d.cts +3 -3
  48. package/dist/bridges/whiteboard.d.ts +3 -3
  49. package/dist/bridges-artboard.cjs +11 -5
  50. package/dist/bridges-artboard.cjs.map +1 -1
  51. package/dist/bridges-artboard.js +6 -4
  52. package/dist/bridges-artboard.js.map +1 -1
  53. package/dist/bridges-catalog.cjs +11 -5
  54. package/dist/bridges-catalog.cjs.map +1 -1
  55. package/dist/bridges-catalog.js +3 -3
  56. package/dist/bridges-charts.cjs +11 -5
  57. package/dist/bridges-charts.cjs.map +1 -1
  58. package/dist/bridges-charts.js +3 -3
  59. package/dist/bridges-cms.cjs +11 -5
  60. package/dist/bridges-cms.cjs.map +1 -1
  61. package/dist/bridges-cms.js +4 -4
  62. package/dist/bridges-code.cjs +11 -5
  63. package/dist/bridges-code.cjs.map +1 -1
  64. package/dist/bridges-code.js +3 -3
  65. package/dist/bridges-doc.cjs +11 -5
  66. package/dist/bridges-doc.cjs.map +1 -1
  67. package/dist/bridges-doc.js +3 -3
  68. package/dist/bridges-features.cjs +11 -5
  69. package/dist/bridges-features.cjs.map +1 -1
  70. package/dist/bridges-features.js +3 -3
  71. package/dist/bridges-files.cjs +11 -5
  72. package/dist/bridges-files.cjs.map +1 -1
  73. package/dist/bridges-files.js +3 -3
  74. package/dist/bridges-flow.cjs +11 -5
  75. package/dist/bridges-flow.cjs.map +1 -1
  76. package/dist/bridges-flow.js +6 -4
  77. package/dist/bridges-flow.js.map +1 -1
  78. package/dist/bridges-forms.cjs +11 -5
  79. package/dist/bridges-forms.cjs.map +1 -1
  80. package/dist/bridges-forms.js +3 -3
  81. package/dist/bridges-git.cjs +10 -5
  82. package/dist/bridges-git.cjs.map +1 -1
  83. package/dist/bridges-git.js +3 -3
  84. package/dist/bridges-grid.cjs +11 -5
  85. package/dist/bridges-grid.cjs.map +1 -1
  86. package/dist/bridges-grid.js +3 -3
  87. package/dist/bridges-map.cjs +11 -5
  88. package/dist/bridges-map.cjs.map +1 -1
  89. package/dist/bridges-map.js +3 -3
  90. package/dist/bridges-navigation.cjs +11 -5
  91. package/dist/bridges-navigation.cjs.map +1 -1
  92. package/dist/bridges-navigation.js +3 -3
  93. package/dist/bridges-passkeys.cjs +11 -5
  94. package/dist/bridges-passkeys.cjs.map +1 -1
  95. package/dist/bridges-passkeys.js +3 -3
  96. package/dist/bridges-scene.cjs +11 -5
  97. package/dist/bridges-scene.cjs.map +1 -1
  98. package/dist/bridges-scene.js +3 -3
  99. package/dist/bridges-screen-doc.cjs +14 -6
  100. package/dist/bridges-screen-doc.cjs.map +1 -1
  101. package/dist/bridges-screen-doc.js +4 -4
  102. package/dist/bridges-screens.cjs +11 -5
  103. package/dist/bridges-screens.cjs.map +1 -1
  104. package/dist/bridges-screens.js +3 -3
  105. package/dist/bridges-sheets.cjs +11 -5
  106. package/dist/bridges-sheets.cjs.map +1 -1
  107. package/dist/bridges-sheets.js +3 -3
  108. package/dist/bridges-slides.cjs +11 -5
  109. package/dist/bridges-slides.cjs.map +1 -1
  110. package/dist/bridges-slides.js +3 -3
  111. package/dist/bridges-terminal.cjs +11 -5
  112. package/dist/bridges-terminal.cjs.map +1 -1
  113. package/dist/bridges-terminal.js +3 -3
  114. package/dist/bridges-tui.cjs +1 -1
  115. package/dist/bridges-tui.cjs.map +1 -1
  116. package/dist/bridges-tui.js +2 -2
  117. package/dist/bridges-whiteboard.cjs +11 -5
  118. package/dist/bridges-whiteboard.cjs.map +1 -1
  119. package/dist/bridges-whiteboard.js +3 -3
  120. package/dist/{chunk-CZV3WUW5.js → chunk-3GFKC6OK.js} +20 -7
  121. package/dist/chunk-3GFKC6OK.js.map +1 -0
  122. package/dist/{chunk-JLHVQWOV.js → chunk-6Q3PMT7K.js} +4 -4
  123. package/dist/chunk-6Q3PMT7K.js.map +1 -0
  124. package/dist/{chunk-AXWMWYH5.js → chunk-C4AQ2YBW.js} +7 -6
  125. package/dist/chunk-C4AQ2YBW.js.map +1 -0
  126. package/dist/{chunk-NH6HUVXQ.js → chunk-CI5ZVHDY.js} +8 -6
  127. package/dist/chunk-CI5ZVHDY.js.map +1 -0
  128. package/dist/{chunk-5ZWNCHZS.js → chunk-CKJL5C7A.js} +8 -6
  129. package/dist/chunk-CKJL5C7A.js.map +1 -0
  130. package/dist/{chunk-HOZCDDRA.js → chunk-CP3EHLZJ.js} +8 -6
  131. package/dist/chunk-CP3EHLZJ.js.map +1 -0
  132. package/dist/{chunk-VFWFT3OK.js → chunk-DNF3QVTW.js} +8 -6
  133. package/dist/chunk-DNF3QVTW.js.map +1 -0
  134. package/dist/{chunk-BG3QXNM6.js → chunk-HNVHAY4A.js} +8 -6
  135. package/dist/chunk-HNVHAY4A.js.map +1 -0
  136. package/dist/{chunk-5M5ELTHE.js → chunk-KAEPC6N4.js} +8 -6
  137. package/dist/chunk-KAEPC6N4.js.map +1 -0
  138. package/dist/{chunk-3WVXAB3D.js → chunk-M423JOQ3.js} +3 -3
  139. package/dist/{chunk-3WVXAB3D.js.map → chunk-M423JOQ3.js.map} +1 -1
  140. package/dist/{chunk-SWWJUOCY.js → chunk-MKC633WU.js} +3 -3
  141. package/dist/{chunk-SWWJUOCY.js.map → chunk-MKC633WU.js.map} +1 -1
  142. package/dist/{chunk-LQB42OSA.js → chunk-MKJE6V4Z.js} +8 -6
  143. package/dist/chunk-MKJE6V4Z.js.map +1 -0
  144. package/dist/{chunk-MIDZWKIF.js → chunk-NB5AQIR2.js} +8 -6
  145. package/dist/chunk-NB5AQIR2.js.map +1 -0
  146. package/dist/{chunk-VMRUW4B4.js → chunk-OUUHFR4N.js} +8 -6
  147. package/dist/chunk-OUUHFR4N.js.map +1 -0
  148. package/dist/{chunk-FCXSR7I5.js → chunk-P6SJBP5T.js} +8 -6
  149. package/dist/chunk-P6SJBP5T.js.map +1 -0
  150. package/dist/{chunk-5JLTXHX6.js → chunk-PMPBI6I3.js} +7 -5
  151. package/dist/chunk-PMPBI6I3.js.map +1 -0
  152. package/dist/{chunk-4WVLZ6YP.js → chunk-PV4FZDYX.js} +8 -6
  153. package/dist/chunk-PV4FZDYX.js.map +1 -0
  154. package/dist/{chunk-3UUF5KKZ.js → chunk-QEVSNDJW.js} +8 -6
  155. package/dist/chunk-QEVSNDJW.js.map +1 -0
  156. package/dist/{chunk-VOCUGTZB.js → chunk-S4DA2UTJ.js} +8 -6
  157. package/dist/chunk-S4DA2UTJ.js.map +1 -0
  158. package/dist/{chunk-RVMM4BHK.js → chunk-V6EHKHSF.js} +8 -6
  159. package/dist/chunk-V6EHKHSF.js.map +1 -0
  160. package/dist/{chunk-36MKPTVD.js → chunk-VE7TRWZR.js} +8 -6
  161. package/dist/chunk-VE7TRWZR.js.map +1 -0
  162. package/dist/{chunk-Z5NL5D4J.js → chunk-VFUKZ6UA.js} +8 -6
  163. package/dist/chunk-VFUKZ6UA.js.map +1 -0
  164. package/dist/{chunk-3HVYUMQF.js → chunk-VHB3VE53.js} +8 -6
  165. package/dist/chunk-VHB3VE53.js.map +1 -0
  166. package/dist/{chunk-R4XXOGQH.js → chunk-ZDKYKJFH.js} +10 -6
  167. package/dist/chunk-ZDKYKJFH.js.map +1 -0
  168. package/dist/components-shared-whiteboard.cjs +29 -10
  169. package/dist/components-shared-whiteboard.cjs.map +1 -1
  170. package/dist/components-shared-whiteboard.js +3 -3
  171. package/dist/dom-navigation/index.d.cts +3 -3
  172. package/dist/dom-navigation/index.d.ts +3 -3
  173. package/dist/index.cjs +96 -44
  174. package/dist/index.cjs.map +1 -1
  175. package/dist/index.d.cts +5 -5
  176. package/dist/index.d.ts +5 -5
  177. package/dist/index.js +26 -26
  178. package/dist/mcp/index.d.cts +5 -5
  179. package/dist/mcp/index.d.ts +5 -5
  180. package/dist/mcp/stdio.d.cts +3 -3
  181. package/dist/mcp/stdio.d.ts +3 -3
  182. package/dist/mcp.cjs +18 -5
  183. package/dist/mcp.cjs.map +1 -1
  184. package/dist/mcp.js +1 -1
  185. package/dist/presence/index.d.cts +1 -1
  186. package/dist/presence/index.d.ts +1 -1
  187. package/dist/{server-1y0n61R5.d.cts → server-DJJygNo1.d.cts} +2 -2
  188. package/dist/{server-vq6qVl3T.d.ts → server-Dwo9LOxh.d.ts} +2 -2
  189. package/dist/sharing/index.d.cts +3 -3
  190. package/dist/sharing/index.d.ts +3 -3
  191. package/dist/sheets-adapter.d.cts +3 -3
  192. package/dist/sheets-adapter.d.ts +3 -3
  193. package/dist/{tool-host-LYfdPE8u.d.ts → tool-host-BBSaU7IJ.d.cts} +10 -4
  194. package/dist/{tool-host-D67N2a2h.d.cts → tool-host-BqJRPr_T.d.ts} +10 -4
  195. package/dist/{types-DP5yQZQU.d.cts → types-D_H2f-wF.d.cts} +1 -1
  196. package/dist/{types-VX_9je7w.d.ts → types-D_TzdBsK.d.ts} +1 -1
  197. package/dist/{types-gzIpsUDE.d.cts → types-ITRQFAir.d.cts} +26 -1
  198. package/dist/{types-gzIpsUDE.d.ts → types-ITRQFAir.d.ts} +26 -1
  199. package/dist/undo/index.d.cts +2 -2
  200. package/dist/undo/index.d.ts +2 -2
  201. package/dist/undo.cjs +7 -3
  202. package/dist/undo.cjs.map +1 -1
  203. package/dist/undo.js +3 -3
  204. package/package.json +1 -1
  205. package/dist/chunk-36MKPTVD.js.map +0 -1
  206. package/dist/chunk-3HVYUMQF.js.map +0 -1
  207. package/dist/chunk-3UUF5KKZ.js.map +0 -1
  208. package/dist/chunk-4WVLZ6YP.js.map +0 -1
  209. package/dist/chunk-5JLTXHX6.js.map +0 -1
  210. package/dist/chunk-5M5ELTHE.js.map +0 -1
  211. package/dist/chunk-5ZWNCHZS.js.map +0 -1
  212. package/dist/chunk-AXWMWYH5.js.map +0 -1
  213. package/dist/chunk-BG3QXNM6.js.map +0 -1
  214. package/dist/chunk-CZV3WUW5.js.map +0 -1
  215. package/dist/chunk-FCXSR7I5.js.map +0 -1
  216. package/dist/chunk-HOZCDDRA.js.map +0 -1
  217. package/dist/chunk-JLHVQWOV.js.map +0 -1
  218. package/dist/chunk-LQB42OSA.js.map +0 -1
  219. package/dist/chunk-MIDZWKIF.js.map +0 -1
  220. package/dist/chunk-NH6HUVXQ.js.map +0 -1
  221. package/dist/chunk-R4XXOGQH.js.map +0 -1
  222. package/dist/chunk-RVMM4BHK.js.map +0 -1
  223. package/dist/chunk-VFWFT3OK.js.map +0 -1
  224. package/dist/chunk-VMRUW4B4.js.map +0 -1
  225. package/dist/chunk-VOCUGTZB.js.map +0 -1
  226. package/dist/chunk-Z5NL5D4J.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/features.ts"],"names":[],"mappings":"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","file":"chunk-KAEPC6N4.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Headless bridge for `@particle-academy/fancy-features` — feature management\n * with NO UI surface. The adapter is the `FeatureManager` (a `FeatureSource`\n * consumer): define features in the registry, check access for a subject,\n * grant/revoke via group assignment, and meter resource usage. Mutations\n * funnel through `wrapToolWithActivity` so presence + undo compose; `grant` /\n * `revoke` are `pendingMode`-gated (they change what a real user can do).\n *\n * The adapter shapes mirror fancy-features' public `FeatureManager` +\n * `FeatureRegistry` + `GroupStore`, defined LOCALLY so the bridge builds with\n * the sibling absent (optional peer). A live `FeatureManager` (plus its\n * `.registry` / `.groupStore`) satisfies this structurally with no import.\n *\n * SUBJECTS over the wire: `Subject` is opaque (`unknown`) in fancy-features.\n * Agents pass a JSON-serializable subject (string id or `{ id, … }` object);\n * the host's stores key on it via their `defaultSubjectKey`.\n */\n\nexport type FeatureGrant = {\n key: string;\n type: \"boolean\" | \"resource\";\n enabled: boolean;\n includedQuantity?: number | null;\n overageLimit?: number | null;\n source?: string;\n config?: Record<string, unknown>;\n};\n\n/** Normalized feature definition (mirror of fancy-features `FeatureDefinition`). */\nexport type FeatureDefinition = {\n key?: string;\n name?: string;\n description?: string;\n type?: \"boolean\" | \"resource\";\n enabled?: boolean;\n limit?: number;\n [k: string]: unknown;\n};\n\n/**\n * Adapter = the `FeatureManager` + its registry + group store. The bridge only\n * needs these members; a real manager exposes them directly.\n */\nexport type FeaturesBridgeAdapter = {\n /** Stable id for this feature manager instance. */\n id?: string;\n title?: string;\n screenId?: string;\n\n // ── Access checks (FeatureManager) ──\n /** Can the subject access the feature now? `manager.canAccess`. */\n canAccess(feature: string, subject?: unknown, context?: unknown): boolean | Promise<boolean>;\n /** Remaining quota for a resource feature (null = unlimited / n-a). `manager.remaining`. */\n remaining(feature: string, subject?: unknown, context?: unknown): number | null | Promise<number | null>;\n /** All enabled feature keys for the subject. `manager.enabled`. */\n enabled(subject?: unknown, context?: unknown): string[] | Promise<string[]>;\n /** Trace a feature's resolution to an AccessResult. `manager.explain`. */\n explain?(feature: string, subject?: unknown, context?: unknown): Promise<unknown> | unknown;\n\n // ── Registry (define) ──\n /** Register a programmatic feature. `manager.registerFeature` / `manager.registry.register`. */\n registerFeature(key: string, definition: FeatureDefinition): void;\n /** Registered feature keys. `manager.registry.keys`. */\n registryKeys(): string[];\n /** Resolve a registered definition (or null). `manager.registry.definition`. */\n definition?(key: string): FeatureDefinition | null | Promise<FeatureDefinition | null>;\n\n // ── Group store (grant / revoke) ──\n /** Assign a subject to a feature group (the grant primitive). `manager.groupStore.assign`. */\n assignGroup(subject: unknown, groupKey: string): void | Promise<void>;\n /** Detach a subject from a group (the revoke primitive). `manager.groupStore.detach`. */\n detachGroup(subject: unknown, groupKey: string): void | Promise<void>;\n /** Group keys assigned to a subject. `manager.groupStore.list`. */\n listGroups(subject: unknown): string[] | Promise<string[]>;\n\n // ── Usage / metering (resource features) ──\n /** Current usage for a resource feature. `manager.usageFor`. Optional. */\n usageFor?(feature: string, subject: unknown): number | Promise<number>;\n /** Atomic check-and-increment quota. `manager.tryConsume`. Optional. */\n tryConsume?(feature: string, subject: unknown, amount?: number, context?: unknown): boolean | Promise<boolean>;\n};\n\nexport type FeaturesBridgeOptions = {\n adapter: FeaturesBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n /**\n * Trust-but-verify. When on (default), `features_grant` / `features_revoke`\n * (they change a real subject's entitlements) require `confirm:true` OR a\n * host `confirm` hook. Checks + define + usage are unaffected.\n */\n pendingMode?: boolean;\n confirm?: (req: { action: string; subject: unknown; groupKey: string }) => Promise<boolean> | boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst num = (v: unknown, fallback = 0): number => (typeof v === \"number\" && Number.isFinite(v) ? v : fallback);\n\n/**\n * registerFeaturesBridge — full MCP tool set over a headless feature manager.\n *\n * features_list enabled feature keys for a subject\n * features_check can a subject access a feature? (+ remaining for resources)\n * features_explain trace why a feature is on/off for a subject\n * features_define register a feature definition (boolean / resource)\n * features_grant assign a subject to a group (pendingMode-gated, undoable)\n * features_revoke detach a subject from a group (pendingMode-gated, undoable)\n * features_groups list a subject's assigned groups\n * features_consume meter a resource feature (atomic check-and-increment)\n */\nexport function registerFeaturesBridge(host: ToolHost, options: FeaturesBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const pendingMode = options.pendingMode ?? true;\n const featuresId = adapter.id ?? \"features\";\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = `features:${featuresId}`;\n\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (elementId?: string, label?: string): AgentTarget => ({\n kind: \"custom\",\n screenId: adapter.screenId,\n elementId,\n label: label ?? featuresId,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<unknown> | unknown,\n resolveTarget: false | ((args: JsonObject) => AgentTarget),\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = resolveTarget\n ? wrapToolWithActivity(wrapped as never, {\n toolName: name,\n agent,\n kind: \"custom\",\n screenId: adapter.screenId,\n resolveTarget: ({ args }) => resolveTarget(args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as Record<string, never>, required, additionalProperties: false } },\n final as never,\n { owner: bridgeId },\n ),\n );\n };\n\n const guardGrant = async (action: string, subject: unknown, groupKey: string, hasConfirmArg: boolean) => {\n if (!pendingMode) return null;\n if (options.confirm) {\n const ok = await options.confirm({ action, subject, groupKey });\n return ok ? null : errorResult(`Declined: ${action} ${groupKey} (human did not confirm).`);\n }\n if (!hasConfirmArg) {\n return errorResult(`${action} is staged (pendingMode). Re-call with confirm:true to apply, or wire a host confirm hook.`);\n }\n return null;\n };\n\n // ─── Read / check tools ──────────────────────────────────────────────────\n\n reg(\n \"features_list\",\n \"List the feature keys enabled for a subject. Pass `subject` (a string id or object).\",\n { subject: { description: \"Opaque subject — string id or { id, … } object.\" }, context: { description: \"Optional resolution context.\" } },\n [],\n async (args) => {\n const keys = await adapter.enabled(args.subject, args.context);\n return textResult(JSON.stringify(keys, null, 2), { subject: args.subject, enabled: keys });\n },\n false,\n );\n\n reg(\n \"features_check\",\n \"Check whether a subject can access a feature. For resource features also returns the remaining quota.\",\n { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, context: { description: \"Optional context.\" } },\n [\"feature\"],\n async (args) => {\n const feature = str(args.feature);\n const allowed = await adapter.canAccess(feature, args.subject, args.context);\n const remaining = await adapter.remaining(feature, args.subject, args.context);\n const out = { feature, allowed, remaining };\n return textResult(JSON.stringify(out), out);\n },\n false,\n );\n\n reg(\n \"features_explain\",\n \"Trace why a feature is on/off for a subject — returns the AccessResult (source, remaining, limit, used).\",\n { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, context: { description: \"Optional context.\" } },\n [\"feature\"],\n async (args) => {\n if (!adapter.explain) return errorResult(\"Host did not wire explain().\");\n const result = await adapter.explain(str(args.feature), args.subject, args.context);\n return textResult(JSON.stringify(result, null, 2), result as Record<string, unknown>);\n },\n false,\n );\n\n reg(\n \"features_groups\",\n \"List the feature groups a subject is assigned to.\",\n { subject: { description: \"Opaque subject.\" } },\n [\"subject\"],\n async (args) => {\n const groups = await adapter.listGroups(args.subject);\n return textResult(JSON.stringify(groups, null, 2), { subject: args.subject, groups });\n },\n false,\n );\n\n // ─── Define ──────────────────────────────────────────────────────────────\n\n reg(\n \"features_define\",\n \"Register a feature definition. type 'boolean' (on/off) or 'resource' (metered with a `limit`). `enabled` sets the default gate.\",\n {\n key: { type: \"string\" },\n name: { type: \"string\" },\n description: { type: \"string\" },\n type: { type: \"string\", enum: [\"boolean\", \"resource\"] },\n enabled: { type: \"boolean\" },\n limit: { type: \"number\", description: \"Resource quota per period (resource type).\" },\n },\n [\"key\"],\n (args) => {\n const key = str(args.key);\n if (!key) return errorResult(\"key is required.\");\n const existed = adapter.registryKeys().includes(key);\n const definition: FeatureDefinition = {\n ...(args.name !== undefined ? { name: str(args.name) } : {}),\n ...(args.description !== undefined ? { description: str(args.description) } : {}),\n ...(args.type !== undefined ? { type: str(args.type) as \"boolean\" | \"resource\" } : {}),\n ...(args.enabled !== undefined ? { enabled: args.enabled === true } : {}),\n ...(args.limit !== undefined ? { limit: num(args.limit) } : {}),\n };\n adapter.registerFeature(key, definition);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: featuresId,\n action: \"features_define\",\n // Registry has no unregister; undo re-registers the prior definition when we had one.\n label: existed ? `Redefined feature ${key}` : `Defined feature ${key}`,\n undo: () => {},\n redo: () => adapter.registerFeature(key, definition),\n });\n return textResult(`${existed ? \"Redefined\" : \"Defined\"} feature ${key} (${definition.type ?? \"boolean\"})`, { key, definition });\n },\n (args) => target(str(args.key), `define ${str(args.key)}`),\n );\n\n // ─── Grant / revoke (pendingMode-gated) ──────────────────────────────────\n\n reg(\n \"features_grant\",\n \"Grant a subject access by assigning it to a feature group. Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n { subject: { description: \"Opaque subject.\" }, group: { type: \"string\", description: \"Feature group key.\" }, confirm: { type: \"boolean\" } },\n [\"subject\", \"group\"],\n async (args) => {\n const groupKey = str(args.group);\n if (!groupKey) return errorResult(\"group is required.\");\n const blocked = await guardGrant(\"features_grant\", args.subject, groupKey, args.confirm === true);\n if (blocked) return blocked;\n const already = (await adapter.listGroups(args.subject)).includes(groupKey);\n await adapter.assignGroup(args.subject, groupKey);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: featuresId,\n action: \"features_grant\",\n label: `Granted group ${groupKey}`,\n // Only reverse if WE added it (idempotent assign — don't revoke a pre-existing grant).\n undo: async () => { if (!already) await adapter.detachGroup(args.subject, groupKey); },\n redo: async () => { await adapter.assignGroup(args.subject, groupKey); },\n });\n return textResult(`Granted group ${groupKey}`, { subject: args.subject, group: groupKey });\n },\n (args) => target(str(args.group), `grant ${str(args.group)}`),\n );\n\n reg(\n \"features_revoke\",\n \"Revoke access by detaching a subject from a feature group. Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n { subject: { description: \"Opaque subject.\" }, group: { type: \"string\" }, confirm: { type: \"boolean\" } },\n [\"subject\", \"group\"],\n async (args) => {\n const groupKey = str(args.group);\n if (!groupKey) return errorResult(\"group is required.\");\n const blocked = await guardGrant(\"features_revoke\", args.subject, groupKey, args.confirm === true);\n if (blocked) return blocked;\n const had = (await adapter.listGroups(args.subject)).includes(groupKey);\n await adapter.detachGroup(args.subject, groupKey);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: featuresId,\n action: \"features_revoke\",\n label: `Revoked group ${groupKey}`,\n undo: async () => { if (had) await adapter.assignGroup(args.subject, groupKey); },\n redo: async () => { await adapter.detachGroup(args.subject, groupKey); },\n });\n return textResult(`Revoked group ${groupKey}`, { subject: args.subject, group: groupKey });\n },\n (args) => target(str(args.group), `revoke ${str(args.group)}`),\n );\n\n // ─── Usage / metering ────────────────────────────────────────────────────\n\n reg(\n \"features_consume\",\n \"Meter a resource feature: atomic check-and-increment. Returns ok:false if the quota would be exceeded (nothing recorded).\",\n { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, amount: { type: \"number\", description: \"Units to consume. Default 1.\" }, context: { description: \"Optional context.\" } },\n [\"feature\", \"subject\"],\n async (args) => {\n if (!adapter.tryConsume) return errorResult(\"Host did not wire usage metering (tryConsume).\");\n const feature = str(args.feature);\n const amount = num(args.amount, 1);\n const ok = await adapter.tryConsume(feature, args.subject, amount, args.context);\n const remaining = await adapter.remaining(feature, args.subject, args.context);\n const out = { feature, ok, amount, remaining };\n return textResult(JSON.stringify(out), out);\n },\n (args) => target(str(args.feature), `consume ${str(args.feature)}`),\n );\n\n return {\n id: bridgeId,\n title: adapter.title ?? \"Features\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { readHistory } from './chunk-R4XXOGQH.js';
1
+ import { readHistory } from './chunk-ZDKYKJFH.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-3WVXAB3D.js.map
25
- //# sourceMappingURL=chunk-3WVXAB3D.js.map
24
+ //# sourceMappingURL=chunk-M423JOQ3.js.map
25
+ //# sourceMappingURL=chunk-M423JOQ3.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-3WVXAB3D.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
+ {"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-M423JOQ3.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 { registerDocBridge } from './chunk-3HVYUMQF.js';
1
+ import { registerDocBridge } from './chunk-VHB3VE53.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-SWWJUOCY.js.map
79
- //# sourceMappingURL=chunk-SWWJUOCY.js.map
78
+ //# sourceMappingURL=chunk-MKC633WU.js.map
79
+ //# sourceMappingURL=chunk-MKC633WU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bridges/cms.ts"],"names":[],"mappings":";;;AAiCO,SAAS,UAAA,GAAqD;AACnE,EAAA,MAAM,OAAO,WAAA,EAAwB;AACrC,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,KAAK,EAAA,EAAI;AACd,MAAA,IAAI,EAAA,CAAG,MAAM,WAAA,EAAa;AACxB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAO,CAAC,EAAA,CAAG,EAAE,GAAG,EAAE,GAAG,MAAM,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,GAAG,EAAA,CAAG,KAAA,EAAM,EAAE,IAAI,EAAE;AAAA,MAC9H;AACA,MAAA,IAAI,EAAA,CAAG,MAAM,YAAA,EAAc;AACzB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,OAAO,CAAC,EAAA,CAAG,EAAE,GAAG,EAAE,GAAG,IAAA,EAAM,QAAQ,EAAA,CAAG,MAAA,IAAS,EAAE;AAAA,MAC5E;AACA,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,EAAE,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,MAAA,CAAO,KAAK,EAAA,EAAI;AACd,MAAA,IAAI,EAAA,CAAG,MAAM,WAAA,EAAa;AACxB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,QAAA,MAAM,OAA4B,EAAC;AACnC,QAAA,KAAA,MAAW,CAAA,IAAK,EAAA,CAAG,KAAA,EAAQ,IAAA,CAAiC,CAAqB,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAqB,CAAA;AAC1H,QAAA,OAAO,CAAC,EAAE,CAAA,EAAG,WAAA,EAAa,IAAI,EAAA,CAAG,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,MACpD;AACA,MAAA,IAAI,EAAA,CAAG,MAAM,YAAA,EAAc;AACzB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,QAAA,OAAO,CAAC,EAAE,CAAA,EAAG,YAAA,EAAc,EAAA,EAAI,GAAG,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,MAC7D;AACA,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,EAAE,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AAWO,SAAS,iBAAA,CAAkB,MAAgB,OAAA,EAAmC;AACnF,EAAA,OAAO,kBAAqC,IAAA,EAAM;AAAA,IAChD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAA,EAAS,KAAA;AAAA,IACT,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,UAAA,EAAW;AAAA,IACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,WAAW,OAAA,CAAQ,SAAA;AAAA;AAAA,IAEnB,QAAA,EAAU,CAAC,EAAE,EAAA,EAAI,MAAM,MAAA,EAAQ,KAAA,IAAS,KAAA,MAAW,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,IAAG,EAAE,CAAA;AAAA,IACzG,YAAA,EAAc,CAAC,CAAA,MAAO,EAAE,IAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,EAAE,MAAA,EAAO,CAAA;AAAA,IACnF,OAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,WAAA,EAAa,wGAAA;AAAA,QACb,UAAA,EAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,uBAAsB,EAAE;AAAA,QACpG,QAAA,EAAU,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,QACxB,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,KAAS;AACrB,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACzB,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,QAAA,EAAW,EAAE,CAAA,CAAA,EAAG;AACrD,UAAA,OAAO,EAAE,CAAA,EAAG,WAAA,EAAa,EAAA,EAAI,OAAQ,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC,EAA0B;AAAA,QAC9H,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,IAAA,KAAS,MAAA,CAAO,KAAK,EAAE;AAAA,OACpC;AAAA,MACA;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,2DAAA;AAAA,QACb,YAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAG,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,CAAC,QAAQ,OAAA,EAAS,MAAM,GAAE,EAAE;AAAA,QAClG,QAAA,EAAU,CAAC,IAAI,CAAA;AAAA,QACf,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,KAAS;AACrB,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACzB,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,QAAA,EAAW,EAAE,CAAA,CAAA,EAAG;AACrD,UAAA,OAAO,EAAE,CAAA,EAAG,YAAA,EAAc,EAAA,EAAI,MAAA,EAAQ,KAAK,MAAA,EAAiC;AAAA,QAC9E,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,IAAA,KAAS,MAAA,CAAO,KAAK,EAAE;AAAA;AACpC;AACF,GACD,CAAA;AACH","file":"chunk-SWWJUOCY.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
+ {"version":3,"sources":["../src/bridges/cms.ts"],"names":[],"mappings":"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","file":"chunk-MKC633WU.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-R4XXOGQH.js';
1
+ import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-ZDKYKJFH.js';
2
2
  import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
3
- import { textResult, errorResult } from './chunk-CZV3WUW5.js';
3
+ import { textResult, errorResult } from './chunk-3GFKC6OK.js';
4
4
 
5
5
  // src/bridges/whiteboard.ts
6
6
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -13,6 +13,7 @@ function registerWhiteboardBridge(host, options) {
13
13
  const { adapter } = options;
14
14
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
15
15
  const disposers = [];
16
+ const bridgeId = "whiteboard";
16
17
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
17
18
  const wbTarget = (args, result) => ({
18
19
  kind: "whiteboard",
@@ -44,7 +45,8 @@ function registerWhiteboardBridge(host, options) {
44
45
  additionalProperties: false
45
46
  }
46
47
  },
47
- final
48
+ final,
49
+ { owner: bridgeId }
48
50
  )
49
51
  );
50
52
  };
@@ -422,7 +424,7 @@ function registerWhiteboardBridge(host, options) {
422
424
  wbTarget
423
425
  );
424
426
  return {
425
- id: "whiteboard",
427
+ id: bridgeId,
426
428
  title: "Whiteboard",
427
429
  dispose: () => {
428
430
  for (const d of disposers) d();
@@ -432,5 +434,5 @@ function registerWhiteboardBridge(host, options) {
432
434
  }
433
435
 
434
436
  export { registerWhiteboardBridge };
435
- //# sourceMappingURL=chunk-LQB42OSA.js.map
436
- //# sourceMappingURL=chunk-LQB42OSA.js.map
437
+ //# sourceMappingURL=chunk-MKJE6V4Z.js.map
438
+ //# sourceMappingURL=chunk-MKJE6V4Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/whiteboard.ts"],"names":[],"mappings":"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","file":"chunk-MKJE6V4Z.js","sourcesContent":["import type {\n BoardItem,\n ConnectorItem,\n RemoteCursor,\n ShapeItem,\n ShapeKind,\n StickyNoteItem,\n Stroke,\n Viewport,\n} from \"@particle-academy/fancy-whiteboard\";\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\";\n\n/**\n * State accessors / mutators the bridge needs from the host. The host owns\n * whiteboard state (controlled props on fancy-whiteboard components); the\n * bridge calls into these to read or change it.\n */\nexport type WhiteboardBridgeAdapter = {\n getNotes: () => StickyNoteItem[];\n setNotes: (next: StickyNoteItem[] | ((prev: StickyNoteItem[]) => StickyNoteItem[])) => void;\n getShapes: () => ShapeItem[];\n setShapes: (next: ShapeItem[] | ((prev: ShapeItem[]) => ShapeItem[])) => void;\n getConnectors: () => ConnectorItem[];\n setConnectors: (next: ConnectorItem[] | ((prev: ConnectorItem[]) => ConnectorItem[])) => void;\n getStrokes: () => Stroke[];\n setStrokes: (next: Stroke[] | ((prev: Stroke[]) => Stroke[])) => void;\n getViewport: () => Viewport;\n setViewport: (next: Viewport) => void;\n /** Optional: agent presence cursor (for the visualizer). */\n setAgentCursor?: (cursor: RemoteCursor | null) => void;\n};\n\nexport type WhiteboardBridgeOptions = {\n adapter: WhiteboardBridgeAdapter;\n /** Identity used when the agent stamps authorId on items / cursor. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\nconst VALID_SHAPES: ShapeKind[] = [\"rect\", \"rounded-rect\", \"ellipse\", \"diamond\", \"triangle\", \"line\", \"arrow\", \"text\"];\n\nconst num = (v: unknown, fallback?: number): number =>\n typeof v === \"number\" && Number.isFinite(v) ? v : fallback ?? 0;\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst bool = (v: unknown, fallback = false): boolean => (typeof v === \"boolean\" ? v : fallback);\n\nconst newId = (prefix: string) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerWhiteboardBridge — wires a full MCP tool set against a fancy-\n * whiteboard session controlled by the host. Returns a Bridge handle the\n * host can dispose to tear everything down.\n */\nexport function registerWhiteboardBridge(\n host: ToolHost,\n options: WhiteboardBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = \"whiteboard\";\n\n // Register agent_undo / agent_redo / agent_history once per server. Idempotent.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n // Cursor narration is the agent's responsibility — call\n // whiteboard_set_agent_cursor as a separate prerequisite before any\n // mutation. This keeps the protocol honest: each tool does one thing.\n\n // Activity-target resolver shared by every mutation tool. Pulls the id\n // from the freshly-created item (structuredContent) when present, falls\n // back to the args id (for update/delete tools).\n const wbTarget = (args: any, result: any): AgentTarget => ({\n kind: \"whiteboard\",\n elementId: (result?.structuredContent?.id as string | undefined) ?? (args?.id as string | undefined),\n });\n\n\n const reg = (\n name: string,\n description: string,\n inputProperties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n /** Optional: resolve the activity target so the presence layer can render\n * a focus indicator on the touched element. Read tools omit this. */\n resolveTarget?: (args: JsonObject, result: any) => AgentTarget | null,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = resolveTarget\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent: { id: agent.id, name: agent.name, color: agent.color },\n kind: \"whiteboard\",\n resolveTarget: ({ args, result }) => resolveTarget(args, result),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties: inputProperties as any,\n required,\n additionalProperties: false,\n },\n },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n // ───────────── Read tools ─────────────\n\n reg(\"whiteboard_get_state\", \"Get the full board state: viewport, all items, strokes.\", {}, [], () => {\n const state = {\n viewport: adapter.getViewport(),\n notes: adapter.getNotes(),\n shapes: adapter.getShapes(),\n connectors: adapter.getConnectors(),\n strokes: adapter.getStrokes(),\n };\n return textResult(JSON.stringify(state, null, 2), state);\n });\n\n reg(\"whiteboard_list_items\", \"List notes, shapes, and connectors with id, kind, and bounds.\", {}, [], () => {\n const items: Array<{ id: string; kind: string; summary: string }> = [];\n for (const n of adapter.getNotes()) {\n items.push({\n id: n.id,\n kind: \"sticky\",\n summary: `\"${(n.text ?? \"\").slice(0, 40)}\" @(${Math.round(n.x)},${Math.round(n.y)}) ${n.width}×${n.height}`,\n });\n }\n for (const s of adapter.getShapes()) {\n items.push({\n id: s.id,\n kind: `shape:${s.shape}`,\n summary: `${s.text ? `\"${s.text}\" ` : \"\"}@(${Math.round(s.x)},${Math.round(s.y)}) ${s.width}×${s.height}`,\n });\n }\n for (const c of adapter.getConnectors()) {\n items.push({ id: c.id, kind: \"connector\", summary: `from=${JSON.stringify(c.from)} to=${JSON.stringify(c.to)}` });\n }\n return textResult(items.map((i) => `${i.kind} ${i.id}: ${i.summary}`).join(\"\\n\") || \"(empty board)\", items);\n });\n\n reg(\n \"whiteboard_get_item\",\n \"Get a single item (sticky / shape / connector) by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const all: BoardItem[] = [...adapter.getNotes(), ...adapter.getShapes(), ...adapter.getConnectors()];\n const found = all.find((x) => x.id === id);\n if (!found) return errorResult(`No item with id ${id}`);\n return textResult(JSON.stringify(found, null, 2), found);\n },\n );\n\n // ───────────── Sticky CRUD ─────────────\n\n reg(\n \"whiteboard_add_sticky\",\n \"Add a sticky note. Position is in world coordinates.\",\n {\n x: { type: \"number\" },\n y: { type: \"number\" },\n text: { type: \"string\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n color: { type: \"string\", description: \"CSS color, e.g. #fde68a\" },\n },\n [\"x\", \"y\"],\n async (args) => {\n const x = num(args.x);\n const y = num(args.y);\n const width = num(args.width, 180);\n const height = num(args.height, 140);\n// (cursor narration is now an explicit separate tool call)\n const note: StickyNoteItem = {\n id: newId(\"n\"),\n kind: \"sticky\",\n x, y, width, height,\n text: str(args.text),\n color: typeof args.color === \"string\" ? args.color : \"#fde68a\",\n authorId: agent.id,\n };\n adapter.setNotes((all) => [...all, note]);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"whiteboard\",\n action: \"whiteboard_add_sticky\",\n label: `Added sticky ${note.id}`,\n undo: () => adapter.setNotes((all) => all.filter((n) => n.id !== note.id)),\n redo: () => adapter.setNotes((all) => [...all, note]),\n });\n return textResult(`Added sticky ${note.id}`, note);\n },\n wbTarget,\n );\n\n reg(\n \"whiteboard_stream_text\",\n \"Type text into a sticky note character-by-character so the human can read it forming. The tool returns once streaming finishes.\",\n {\n id: { type: \"string\" },\n text: { type: \"string\" },\n cps: { type: \"number\", description: \"Characters per second. Default 25.\" },\n append: { type: \"boolean\", description: \"Append to existing text instead of replacing. Default false.\" },\n },\n [\"id\", \"text\"],\n async (args) => {\n const id = str(args.id);\n const target = str(args.text);\n const cps = Math.max(1, num(args.cps, 25));\n const append = bool(args.append);\n const startNote = adapter.getNotes().find((n) => n.id === id);\n if (!startNote) return errorResult(`No sticky with id ${id}`);\n const base = append ? (startNote.text ?? \"\") : \"\";\n const interval = Math.max(8, Math.round(1000 / cps));\n for (let i = 0; i <= target.length; i++) {\n const nextText = base + target.slice(0, i);\n adapter.setNotes((all) => all.map((n) => (n.id === id ? { ...n, text: nextText } : n)));\n if (i < target.length) await new Promise((r) => setTimeout(r, interval));\n }\n return textResult(`Streamed ${target.length} chars to ${id}`, { id, text: base + target });\n },\n );\n\n reg(\n \"whiteboard_update_sticky\",\n \"Update fields on a sticky note. Only provided fields are changed.\",\n {\n id: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n text: { type: \"string\" },\n color: { type: \"string\" },\n },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n const existing = adapter.getNotes().find((n) => n.id === id);\n if (!existing) return errorResult(`No sticky with id ${id}`);\n const nextX = args.x !== undefined ? num(args.x) : existing.x;\n const nextY = args.y !== undefined ? num(args.y) : existing.y;\n const nextW = args.width !== undefined ? num(args.width) : existing.width;\n const nextH = args.height !== undefined ? num(args.height) : existing.height;\n// (cursor narration is now an explicit separate tool call)\n let updated: StickyNoteItem | null = null;\n adapter.setNotes((all) =>\n all.map((n) => {\n if (n.id !== id) return n;\n updated = {\n ...n,\n x: nextX, y: nextY, width: nextW, height: nextH,\n ...(args.text !== undefined ? { text: str(args.text) } : {}),\n ...(args.color !== undefined ? { color: str(args.color) } : {}),\n };\n return updated;\n }),\n );\n return textResult(`Updated sticky ${id}`, updated);\n },\n wbTarget,\n );\n\n // ───────────── Shape CRUD ─────────────\n\n reg(\n \"whiteboard_add_shape\",\n `Add a shape. Kind must be one of: ${VALID_SHAPES.join(\", \")}.`,\n {\n shape: { type: \"string\", enum: VALID_SHAPES },\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n text: { type: \"string\" },\n fill: { type: \"string\" },\n stroke: { type: \"string\" },\n flipX: { type: \"boolean\" },\n flipY: { type: \"boolean\" },\n },\n [\"shape\", \"x\", \"y\", \"width\", \"height\"],\n async (args) => {\n const kind = str(args.shape) as ShapeKind;\n if (!VALID_SHAPES.includes(kind)) return errorResult(`Invalid shape kind: ${kind}`);\n const x = num(args.x);\n const y = num(args.y);\n const width = num(args.width);\n const height = num(args.height);\n// (cursor narration is now an explicit separate tool call)\n const shape: ShapeItem = {\n id: newId(\"s\"),\n kind: \"shape\",\n shape: kind,\n x, y, width, height,\n ...(args.text !== undefined ? { text: str(args.text) } : {}),\n ...(args.fill !== undefined ? { fill: str(args.fill) } : {}),\n ...(args.stroke !== undefined ? { stroke: str(args.stroke) } : {}),\n ...(args.flipX !== undefined ? { flipX: bool(args.flipX) } : {}),\n ...(args.flipY !== undefined ? { flipY: bool(args.flipY) } : {}),\n };\n adapter.setShapes((all) => [...all, shape]);\n return textResult(`Added ${kind} ${shape.id}`, shape);\n },\n wbTarget,\n );\n\n reg(\n \"whiteboard_update_shape\",\n \"Update fields on a shape.\",\n {\n id: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n text: { type: \"string\" },\n fill: { type: \"string\" },\n stroke: { type: \"string\" },\n },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n const existing = adapter.getShapes().find((s) => s.id === id);\n if (!existing) return errorResult(`No shape with id ${id}`);\n const nextX = args.x !== undefined ? num(args.x) : existing.x;\n const nextY = args.y !== undefined ? num(args.y) : existing.y;\n const nextW = args.width !== undefined ? num(args.width) : existing.width;\n const nextH = args.height !== undefined ? num(args.height) : existing.height;\n// (cursor narration is now an explicit separate tool call)\n let updated: ShapeItem | null = null;\n adapter.setShapes((all) =>\n all.map((s) => {\n if (s.id !== id) return s;\n updated = {\n ...s,\n x: nextX, y: nextY, width: nextW, height: nextH,\n ...(args.text !== undefined ? { text: str(args.text) } : {}),\n ...(args.fill !== undefined ? { fill: str(args.fill) } : {}),\n ...(args.stroke !== undefined ? { stroke: str(args.stroke) } : {}),\n };\n return updated;\n }),\n );\n return textResult(`Updated shape ${id}`, updated);\n },\n wbTarget,\n );\n\n // ───────────── Connectors ─────────────\n\n reg(\n \"whiteboard_add_connector\",\n \"Connect two items by id, or specify explicit world-space points.\",\n {\n from: { description: \"Item id (string) or {x,y}\" },\n to: { description: \"Item id (string) or {x,y}\" },\n color: { type: \"string\" },\n },\n [\"from\", \"to\"],\n (args) => {\n const c: ConnectorItem = {\n id: newId(\"c\"),\n kind: \"connector\",\n from: args.from as any,\n to: args.to as any,\n ...(args.color !== undefined ? { color: str(args.color) } : {}),\n };\n adapter.setConnectors((all) => [...all, c]);\n return textResult(`Added connector ${c.id}`, c);\n },\n wbTarget,\n );\n\n // ───────────── Drawing ─────────────\n\n reg(\n \"whiteboard_add_stroke\",\n \"Add a freeform pen stroke. Points are absolute screen coords (matching the Drawing layer).\",\n {\n points: {\n type: \"array\",\n description: \"Array of {x,y} points\",\n },\n color: { type: \"string\" },\n size: { type: \"number\" },\n },\n [\"points\"],\n (args) => {\n const points = (Array.isArray(args.points) ? args.points : []).map((p: any) => ({\n x: num(p?.x),\n y: num(p?.y),\n }));\n if (!points.length) return errorResult(\"Stroke requires at least one point\");\n const stroke: Stroke = {\n id: newId(\"st\"),\n points,\n color: typeof args.color === \"string\" ? args.color : \"#0f172a\",\n size: typeof args.size === \"number\" ? args.size : 2,\n authorId: agent.id,\n };\n adapter.setStrokes((all) => [...all, stroke]);\n return textResult(`Added stroke ${stroke.id} (${points.length} points)`, stroke);\n },\n wbTarget,\n );\n\n // ───────────── Generic delete ─────────────\n\n reg(\n \"whiteboard_delete_item\",\n \"Remove any item by id (sticky / shape / connector / stroke).\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n // Snapshot the items being removed so undo can re-insert them.\n const removedNotes = adapter.getNotes().filter((x) => x.id === id);\n const removedShapes = adapter.getShapes().filter((x) => x.id === id);\n const removedConnectors = adapter.getConnectors().filter((x) => x.id === id);\n const removedStrokes = adapter.getStrokes().filter((x) => x.id === id);\n const removed = removedNotes.length + removedShapes.length + removedConnectors.length + removedStrokes.length > 0;\n if (!removed) return errorResult(`No item with id ${id}`);\n adapter.setNotes((all) => all.filter((x) => x.id !== id));\n adapter.setShapes((all) => all.filter((x) => x.id !== id));\n adapter.setConnectors((all) => all.filter((x) => x.id !== id));\n adapter.setStrokes((all) => all.filter((x) => x.id !== id));\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"whiteboard\",\n action: \"whiteboard_delete_item\",\n label: `Deleted ${id}`,\n undo: () => {\n if (removedNotes.length) adapter.setNotes((all) => [...all, ...removedNotes]);\n if (removedShapes.length) adapter.setShapes((all) => [...all, ...removedShapes]);\n if (removedConnectors.length) adapter.setConnectors((all) => [...all, ...removedConnectors]);\n if (removedStrokes.length) adapter.setStrokes((all) => [...all, ...removedStrokes]);\n },\n redo: () => {\n adapter.setNotes((all) => all.filter((x) => x.id !== id));\n adapter.setShapes((all) => all.filter((x) => x.id !== id));\n adapter.setConnectors((all) => all.filter((x) => x.id !== id));\n adapter.setStrokes((all) => all.filter((x) => x.id !== id));\n },\n });\n return textResult(`Deleted ${id}`);\n },\n wbTarget,\n );\n\n // ───────────── Viewport / agent presence ─────────────\n\n reg(\n \"whiteboard_set_viewport\",\n \"Pan / zoom the viewport.\",\n { x: { type: \"number\" }, y: { type: \"number\" }, zoom: { type: \"number\" } },\n [],\n (args) => {\n const v = adapter.getViewport();\n const next: Viewport = {\n x: args.x !== undefined ? num(args.x) : v.x,\n y: args.y !== undefined ? num(args.y) : v.y,\n zoom: args.zoom !== undefined ? num(args.zoom) : v.zoom,\n };\n adapter.setViewport(next);\n return textResult(`Viewport → ${JSON.stringify(next)}`, next);\n },\n wbTarget,\n );\n\n reg(\n \"whiteboard_set_agent_cursor\",\n \"Move the agent's presence cursor (or pass null to hide it).\",\n {\n x: { type: \"number\" },\n y: { type: \"number\" },\n hide: { type: \"boolean\" },\n },\n [],\n (args) => {\n if (!adapter.setAgentCursor) return errorResult(\"Host did not provide setAgentCursor\");\n if (bool(args.hide)) {\n adapter.setAgentCursor(null);\n return textResult(\"Agent cursor hidden\");\n }\n const cursor: RemoteCursor = {\n userId: agent.id,\n name: agent.name,\n color: agent.color,\n x: num(args.x),\n y: num(args.y),\n };\n adapter.setAgentCursor(cursor);\n return textResult(`Cursor → (${cursor.x}, ${cursor.y})`, cursor);\n },\n wbTarget,\n );\n\n return {\n id: bridgeId,\n title: \"Whiteboard\",\n dispose: () => {\n for (const d of disposers) d();\n adapter.setAgentCursor?.(null);\n },\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-R4XXOGQH.js';
1
+ import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-ZDKYKJFH.js';
2
2
  import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
3
- import { textResult, errorResult } from './chunk-CZV3WUW5.js';
3
+ import { textResult, errorResult } from './chunk-3GFKC6OK.js';
4
4
 
5
5
  // src/bridges/grid.ts
6
6
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -8,6 +8,7 @@ function registerGridBridge(host, options) {
8
8
  const { adapter } = options;
9
9
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
10
10
  const disposers = [];
11
+ const bridgeId = `grid:${adapter.id}`;
11
12
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
12
13
  const target = (part) => ({
13
14
  kind: "grid",
@@ -37,7 +38,8 @@ function registerGridBridge(host, options) {
37
38
  description,
38
39
  inputSchema: { type: "object", properties, required, additionalProperties: false }
39
40
  },
40
- final
41
+ final,
42
+ { owner: bridgeId }
41
43
  )
42
44
  );
43
45
  };
@@ -195,7 +197,7 @@ function registerGridBridge(host, options) {
195
197
  );
196
198
  }
197
199
  return {
198
- id: `grid:${adapter.id}`,
200
+ id: bridgeId,
199
201
  title: adapter.title ?? adapter.id,
200
202
  dispose: () => {
201
203
  for (const d of disposers) d();
@@ -205,5 +207,5 @@ function registerGridBridge(host, options) {
205
207
  }
206
208
 
207
209
  export { registerGridBridge };
208
- //# sourceMappingURL=chunk-MIDZWKIF.js.map
209
- //# sourceMappingURL=chunk-MIDZWKIF.js.map
210
+ //# sourceMappingURL=chunk-NB5AQIR2.js.map
211
+ //# sourceMappingURL=chunk-NB5AQIR2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/grid.ts"],"names":[],"mappings":"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","file":"chunk-NB5AQIR2.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 { pushUndoEntry } from \"../undo/undo-stack\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose grid types — the public state shape of `@particle-academy/fancy-grid`,\n * mirrored here rather than imported.\n *\n * Same reason the scene bridge mirrors fancy-3d's descriptor: a bridge must not\n * drag its surface package into every consumer's tree. fancy-grid keeps\n * TanStack Table and Virtual as PEERS specifically so nothing bundles them, and\n * an `import type` here would still make fancy-grid a build-time dependency of\n * agent-integrations. The state is four small JSON shapes; the coupling is not\n * worth it.\n */\nexport type GridSort = { id: string; desc: boolean };\nexport type GridFilter = { id: string; value: string };\nexport type GridPagination = { pageIndex: number; pageSize: number };\n\nexport type GridState = {\n sorting?: GridSort[];\n filters?: GridFilter[];\n /** Keyed by row id — see the grid's `getRowId`. */\n rowSelection?: Record<string, boolean>;\n pagination?: GridPagination;\n};\n\nexport type GridBridgeAdapter = {\n id: string;\n title?: string;\n screenId?: string;\n /** Controlled state — the same object the grid's `onStateChange` emits. */\n getState: () => GridState;\n setState: (next: GridState) => void;\n /**\n * Column ids an agent may address. Supplied so a tool can REJECT an unknown\n * column instead of writing a sort nothing applies — a silently ignored sort\n * looks identical to a grid that simply is not sorted.\n */\n getColumnIds?: () => string[];\n /** Row ids currently on screen, for `grid_select_rows` validation. */\n getRowIds?: () => string[];\n /**\n * Write one cell. Absent when the grid is read-only, in which case\n * `grid_edit_cell` is not registered at all rather than failing at call time\n * — an agent should discover the capability from the tool list.\n */\n editCell?: (rowId: string, columnId: string, value: unknown) => void | Promise<void>;\n};\n\nexport type GridBridgeOptions = {\n adapter: GridBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n /**\n * Gate writes behind a human confirmation. `grid_edit_cell` is the only\n * mutation that changes DATA rather than view state, so it is the one that\n * matters here — sorting a grid is not a trust-but-verify action.\n */\n pendingMode?: boolean;\n onPending?: (staged: { id: string; label: string; apply: () => void | Promise<void> }) => void;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerGridBridge — MCP access to a `fancy-grid` surface.\n *\n * `grid_sort`, `grid_filter`, `grid_select_rows` and `grid_edit_cell`, plus a\n * read tool. View state (sort / filter / selection / page) goes through one\n * `setState` channel because that is how the grid is controlled — a bridge that\n * mutated pieces separately would drift from what the component actually\n * accepts.\n */\nexport function registerGridBridge(host: ToolHost, options: GridBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = `grid:${adapter.id}`;\n\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (part?: string): AgentTarget => ({\n kind: \"grid\",\n screenId: adapter.screenId,\n elementId: part ? `${adapter.id}:${part}` : adapter.id,\n label: part ? `${adapter.title ?? adapter.id} → ${part}` : (adapter.title ?? adapter.id),\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<ReturnType<typeof textResult>> | ReturnType<typeof textResult>,\n isMutation: boolean,\n partFromArgs?: (args: JsonObject) => string | undefined,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"grid\",\n screenId: adapter.screenId,\n resolveTarget: ({ args }) => target(partFromArgs?.(args)),\n })\n : wrapped;\n\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false },\n },\n final as never,\n { owner: bridgeId },\n ),\n );\n };\n\n /** Reject an unknown column rather than writing state nothing applies. */\n const assertColumn = (id: string): void => {\n const known = adapter.getColumnIds?.();\n if (known && !known.includes(id)) {\n throw new Error(`Unknown column \"${id}\". Available: ${known.join(\", \")}`);\n }\n };\n\n const commit = (next: GridState, action: string, label: string, previous: GridState): void => {\n adapter.setState(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: `grid:${adapter.id}`,\n action,\n label,\n undo: () => adapter.setState(previous),\n redo: () => adapter.setState(next),\n });\n };\n\n // ───────────── Read ─────────────\n\n reg(\n \"grid_get\",\n \"Read the grid's view state — sorting, filters, selected row ids, pagination — plus the addressable column and row ids.\",\n {},\n [],\n () => {\n const state = adapter.getState();\n return textResult(\n JSON.stringify(\n {\n id: adapter.id,\n title: adapter.title,\n sorting: state.sorting ?? [],\n filters: state.filters ?? [],\n selectedRowIds: Object.entries(state.rowSelection ?? {})\n .filter(([, on]) => on)\n .map(([id]) => id),\n pagination: state.pagination,\n columnIds: adapter.getColumnIds?.() ?? null,\n rowIds: adapter.getRowIds?.() ?? null,\n editable: Boolean(adapter.editCell),\n },\n null,\n 2,\n ),\n );\n },\n false,\n );\n\n // ───────────── View state ─────────────\n\n reg(\n \"grid_sort\",\n \"Sort the grid. Pass an empty array to clear sorting. Multiple entries sort by each in order.\",\n {\n sorting: {\n type: \"array\",\n description: 'e.g. [{ \"id\": \"createdAt\", \"desc\": true }]',\n items: {\n type: \"object\",\n properties: { id: { type: \"string\" }, desc: { type: \"boolean\" } },\n required: [\"id\"],\n additionalProperties: false,\n },\n },\n },\n [\"sorting\"],\n (args) => {\n const raw = Array.isArray(args.sorting) ? (args.sorting as GridSort[]) : [];\n const sorting = raw.map((s) => {\n assertColumn(String(s.id));\n return { id: String(s.id), desc: Boolean(s.desc) };\n });\n\n const previous = adapter.getState();\n commit({ ...previous, sorting }, \"grid_sort\", `Sorted by ${sorting.map((s) => s.id).join(\", \") || \"nothing\"}`, previous);\n return textResult(`Sorted by ${sorting.map((s) => `${s.id}${s.desc ? \" desc\" : \"\"}`).join(\", \") || \"nothing\"}.`);\n },\n true,\n (args) => (Array.isArray(args.sorting) && args.sorting[0] ? String((args.sorting[0] as GridSort).id) : undefined),\n );\n\n reg(\n \"grid_filter\",\n \"Filter the grid. Pass an empty array to clear all filters.\",\n {\n filters: {\n type: \"array\",\n description: 'e.g. [{ \"id\": \"status\", \"value\": \"open\" }]',\n items: {\n type: \"object\",\n properties: { id: { type: \"string\" }, value: { type: \"string\" } },\n required: [\"id\", \"value\"],\n additionalProperties: false,\n },\n },\n },\n [\"filters\"],\n (args) => {\n const raw = Array.isArray(args.filters) ? (args.filters as GridFilter[]) : [];\n const filters = raw.map((f) => {\n assertColumn(String(f.id));\n return { id: String(f.id), value: String(f.value) };\n });\n\n const previous = adapter.getState();\n commit({ ...previous, filters }, \"grid_filter\", `Filtered ${filters.map((f) => f.id).join(\", \") || \"cleared\"}`, previous);\n return textResult(`Filtering on ${filters.map((f) => `${f.id}=${f.value}`).join(\", \") || \"nothing\"}.`);\n },\n true,\n (args) => (Array.isArray(args.filters) && args.filters[0] ? String((args.filters[0] as GridFilter).id) : undefined),\n );\n\n reg(\n \"grid_select_rows\",\n \"Replace the grid's row selection with the given row ids. Pass an empty array to clear.\",\n { rowIds: { type: \"array\", items: { type: \"string\" }, description: \"Row ids, per the grid's getRowId.\" } },\n [\"rowIds\"],\n (args) => {\n const ids = Array.isArray(args.rowIds) ? args.rowIds.map(String) : [];\n const known = adapter.getRowIds?.();\n if (known) {\n const missing = ids.filter((id) => !known.includes(id));\n if (missing.length) {\n // Selecting a row that is not loaded looks like it worked and shows\n // nothing — worth an error rather than a silent no-op.\n throw new Error(`Row id(s) not on this page: ${missing.join(\", \")}`);\n }\n }\n\n const previous = adapter.getState();\n const rowSelection: Record<string, boolean> = {};\n for (const id of ids) rowSelection[id] = true;\n\n commit({ ...previous, rowSelection }, \"grid_select_rows\", `Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}`, previous);\n return textResult(`Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}.`);\n },\n true,\n );\n\n // ───────────── Data ─────────────\n\n if (adapter.editCell) {\n reg(\n \"grid_edit_cell\",\n \"Write one cell. This changes DATA, not just the view.\",\n {\n rowId: { type: \"string\" },\n columnId: { type: \"string\" },\n value: { description: \"New value. Any JSON scalar or object the column accepts.\" },\n },\n [\"rowId\", \"columnId\"],\n async (args) => {\n const rowId = String(args.rowId);\n const columnId = String(args.columnId);\n assertColumn(columnId);\n\n const apply = async () => {\n await adapter.editCell?.(rowId, columnId, args.value);\n };\n\n if (options.pendingMode) {\n // Trust-but-verify: the only tool here that changes stored data\n // stages instead of writing. Sorting a grid is not a destructive act;\n // editing a cell is.\n const id = `grid-edit-${Date.now().toString(36)}`;\n options.onPending?.({ id, label: `set ${columnId} on row ${rowId}`, apply });\n return textResult(`Staged: set ${columnId} on row ${rowId}. Awaiting confirmation.`);\n }\n\n await apply();\n return textResult(`Set ${columnId} on row ${rowId}.`);\n },\n true,\n (args) => `${String(args.rowId)}:${String(args.columnId)}`,\n );\n }\n\n return {\n id: bridgeId,\n title: adapter.title ?? adapter.id,\n dispose: () => {\n for (const d of disposers) d();\n disposers.length = 0;\n },\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { ensureUndoToolsRegistered } from './chunk-R4XXOGQH.js';
1
+ import { ensureUndoToolsRegistered } from './chunk-ZDKYKJFH.js';
2
2
  import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
3
- import { textResult, errorResult } from './chunk-CZV3WUW5.js';
3
+ import { textResult, errorResult } from './chunk-3GFKC6OK.js';
4
4
 
5
5
  // src/bridges/slides.ts
6
6
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -8,6 +8,7 @@ function registerSlidesBridge(host, options) {
8
8
  const { adapter } = options;
9
9
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
10
10
  const disposers = [];
11
+ const bridgeId = "slides";
11
12
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
12
13
  const deckTarget = () => ({
13
14
  kind: "deck",
@@ -54,7 +55,8 @@ function registerSlidesBridge(host, options) {
54
55
  additionalProperties: false
55
56
  }
56
57
  },
57
- final
58
+ final,
59
+ { owner: bridgeId }
58
60
  )
59
61
  );
60
62
  };
@@ -419,7 +421,7 @@ function registerSlidesBridge(host, options) {
419
421
  (args) => elementTarget(str(args?.slideId), str(args?.elementId))
420
422
  );
421
423
  return {
422
- id: "slides",
424
+ id: bridgeId,
423
425
  title: "Slides",
424
426
  dispose: () => {
425
427
  for (const d of disposers.splice(0)) d();
@@ -446,5 +448,5 @@ function firstTextContent(slide) {
446
448
  }
447
449
 
448
450
  export { registerSlidesBridge };
449
- //# sourceMappingURL=chunk-VMRUW4B4.js.map
450
- //# sourceMappingURL=chunk-VMRUW4B4.js.map
451
+ //# sourceMappingURL=chunk-OUUHFR4N.js.map
452
+ //# sourceMappingURL=chunk-OUUHFR4N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/slides.ts"],"names":[],"mappings":"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","file":"chunk-OUUHFR4N.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 // The bridge id is also its registrant identity on the host: the same bridge\n // may re-register (a remount), a different one claiming a name is refused.\n const bridgeId = \"slides\";\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 { owner: bridgeId },\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: bridgeId,\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,6 +1,6 @@
1
- import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-R4XXOGQH.js';
1
+ import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-ZDKYKJFH.js';
2
2
  import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
3
- import { textResult, errorResult } from './chunk-CZV3WUW5.js';
3
+ import { textResult, errorResult } from './chunk-3GFKC6OK.js';
4
4
 
5
5
  // src/bridges/code.ts
6
6
  var MAX_STREAM_CHARS = 1e4;
@@ -9,6 +9,7 @@ function registerCodeBridge(host, options) {
9
9
  const { adapter } = options;
10
10
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
11
11
  const disposers = [];
12
+ const bridgeId = `code:${adapter.id}`;
12
13
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
13
14
  const target = {
14
15
  kind: "code",
@@ -48,7 +49,8 @@ function registerCodeBridge(host, options) {
48
49
  description,
49
50
  inputSchema: { type: "object", properties, required, additionalProperties: false }
50
51
  },
51
- final
52
+ final,
53
+ { owner: bridgeId }
52
54
  )
53
55
  );
54
56
  };
@@ -196,7 +198,7 @@ function registerCodeBridge(host, options) {
196
198
  false
197
199
  );
198
200
  return {
199
- id: `code:${adapter.id}`,
201
+ id: bridgeId,
200
202
  title: adapter.title ?? adapter.id,
201
203
  dispose: () => {
202
204
  for (const d of disposers) d();
@@ -205,5 +207,5 @@ function registerCodeBridge(host, options) {
205
207
  }
206
208
 
207
209
  export { registerCodeBridge };
208
- //# sourceMappingURL=chunk-FCXSR7I5.js.map
209
- //# sourceMappingURL=chunk-FCXSR7I5.js.map
210
+ //# sourceMappingURL=chunk-P6SJBP5T.js.map
211
+ //# sourceMappingURL=chunk-P6SJBP5T.js.map