@particle-academy/agent-integrations 0.50.0 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +69 -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 +55 -10
  22. package/dist/bridges/forms.d.ts +55 -10
  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 +123 -16
  79. package/dist/bridges-forms.cjs.map +1 -1
  80. package/dist/bridges-forms.js +4 -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 +15 -7
  103. package/dist/bridges-screens.cjs.map +1 -1
  104. package/dist/bridges-screens.js +4 -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-HOZCDDRA.js → chunk-7HHZBPDE.js} +9 -29
  125. package/dist/chunk-7HHZBPDE.js.map +1 -0
  126. package/dist/{chunk-VFWFT3OK.js → chunk-AL77RO25.js} +97 -17
  127. package/dist/chunk-AL77RO25.js.map +1 -0
  128. package/dist/{chunk-AXWMWYH5.js → chunk-C4AQ2YBW.js} +7 -6
  129. package/dist/chunk-C4AQ2YBW.js.map +1 -0
  130. package/dist/{chunk-NH6HUVXQ.js → chunk-CI5ZVHDY.js} +8 -6
  131. package/dist/chunk-CI5ZVHDY.js.map +1 -0
  132. package/dist/{chunk-5ZWNCHZS.js → chunk-CKJL5C7A.js} +8 -6
  133. package/dist/chunk-CKJL5C7A.js.map +1 -0
  134. package/dist/chunk-DPBAEWB5.js +28 -0
  135. package/dist/chunk-DPBAEWB5.js.map +1 -0
  136. package/dist/{chunk-BG3QXNM6.js → chunk-HNVHAY4A.js} +8 -6
  137. package/dist/chunk-HNVHAY4A.js.map +1 -0
  138. package/dist/{chunk-5M5ELTHE.js → chunk-KAEPC6N4.js} +8 -6
  139. package/dist/chunk-KAEPC6N4.js.map +1 -0
  140. package/dist/{chunk-3WVXAB3D.js → chunk-M423JOQ3.js} +3 -3
  141. package/dist/{chunk-3WVXAB3D.js.map → chunk-M423JOQ3.js.map} +1 -1
  142. package/dist/{chunk-SWWJUOCY.js → chunk-MKC633WU.js} +3 -3
  143. package/dist/{chunk-SWWJUOCY.js.map → chunk-MKC633WU.js.map} +1 -1
  144. package/dist/{chunk-LQB42OSA.js → chunk-MKJE6V4Z.js} +8 -6
  145. package/dist/chunk-MKJE6V4Z.js.map +1 -0
  146. package/dist/{chunk-MIDZWKIF.js → chunk-NB5AQIR2.js} +8 -6
  147. package/dist/chunk-NB5AQIR2.js.map +1 -0
  148. package/dist/{chunk-VMRUW4B4.js → chunk-OUUHFR4N.js} +8 -6
  149. package/dist/chunk-OUUHFR4N.js.map +1 -0
  150. package/dist/{chunk-FCXSR7I5.js → chunk-P6SJBP5T.js} +8 -6
  151. package/dist/chunk-P6SJBP5T.js.map +1 -0
  152. package/dist/{chunk-5JLTXHX6.js → chunk-PMPBI6I3.js} +7 -5
  153. package/dist/chunk-PMPBI6I3.js.map +1 -0
  154. package/dist/{chunk-4WVLZ6YP.js → chunk-PV4FZDYX.js} +8 -6
  155. package/dist/chunk-PV4FZDYX.js.map +1 -0
  156. package/dist/{chunk-3UUF5KKZ.js → chunk-QEVSNDJW.js} +8 -6
  157. package/dist/chunk-QEVSNDJW.js.map +1 -0
  158. package/dist/{chunk-VOCUGTZB.js → chunk-S4DA2UTJ.js} +8 -6
  159. package/dist/chunk-S4DA2UTJ.js.map +1 -0
  160. package/dist/{chunk-RVMM4BHK.js → chunk-V6EHKHSF.js} +8 -6
  161. package/dist/chunk-V6EHKHSF.js.map +1 -0
  162. package/dist/{chunk-36MKPTVD.js → chunk-VE7TRWZR.js} +8 -6
  163. package/dist/chunk-VE7TRWZR.js.map +1 -0
  164. package/dist/{chunk-Z5NL5D4J.js → chunk-VFUKZ6UA.js} +8 -6
  165. package/dist/chunk-VFUKZ6UA.js.map +1 -0
  166. package/dist/{chunk-3HVYUMQF.js → chunk-VHB3VE53.js} +8 -6
  167. package/dist/chunk-VHB3VE53.js.map +1 -0
  168. package/dist/{chunk-R4XXOGQH.js → chunk-ZDKYKJFH.js} +10 -6
  169. package/dist/chunk-ZDKYKJFH.js.map +1 -0
  170. package/dist/components-shared-whiteboard.cjs +29 -10
  171. package/dist/components-shared-whiteboard.cjs.map +1 -1
  172. package/dist/components-shared-whiteboard.js +3 -3
  173. package/dist/dom-navigation/index.d.cts +3 -3
  174. package/dist/dom-navigation/index.d.ts +3 -3
  175. package/dist/index.cjs +211 -78
  176. package/dist/index.cjs.map +1 -1
  177. package/dist/index.d.cts +6 -6
  178. package/dist/index.d.ts +6 -6
  179. package/dist/index.js +27 -26
  180. package/dist/index.js.map +1 -1
  181. package/dist/mcp/index.d.cts +5 -5
  182. package/dist/mcp/index.d.ts +5 -5
  183. package/dist/mcp/stdio.d.cts +3 -3
  184. package/dist/mcp/stdio.d.ts +3 -3
  185. package/dist/mcp.cjs +18 -5
  186. package/dist/mcp.cjs.map +1 -1
  187. package/dist/mcp.js +1 -1
  188. package/dist/presence/index.d.cts +1 -1
  189. package/dist/presence/index.d.ts +1 -1
  190. package/dist/{server-1y0n61R5.d.cts → server-DJJygNo1.d.cts} +2 -2
  191. package/dist/{server-vq6qVl3T.d.ts → server-Dwo9LOxh.d.ts} +2 -2
  192. package/dist/sharing/index.d.cts +3 -3
  193. package/dist/sharing/index.d.ts +3 -3
  194. package/dist/sheets-adapter.d.cts +3 -3
  195. package/dist/sheets-adapter.d.ts +3 -3
  196. package/dist/{tool-host-LYfdPE8u.d.ts → tool-host-BBSaU7IJ.d.cts} +10 -4
  197. package/dist/{tool-host-D67N2a2h.d.cts → tool-host-BqJRPr_T.d.ts} +10 -4
  198. package/dist/{types-DP5yQZQU.d.cts → types-D_H2f-wF.d.cts} +1 -1
  199. package/dist/{types-VX_9je7w.d.ts → types-D_TzdBsK.d.ts} +1 -1
  200. package/dist/{types-gzIpsUDE.d.cts → types-ITRQFAir.d.cts} +26 -1
  201. package/dist/{types-gzIpsUDE.d.ts → types-ITRQFAir.d.ts} +26 -1
  202. package/dist/undo/index.d.cts +2 -2
  203. package/dist/undo/index.d.ts +2 -2
  204. package/dist/undo.cjs +7 -3
  205. package/dist/undo.cjs.map +1 -1
  206. package/dist/undo.js +3 -3
  207. package/docs/multi-form-hosts.md +97 -0
  208. package/package.json +1 -1
  209. package/dist/chunk-36MKPTVD.js.map +0 -1
  210. package/dist/chunk-3HVYUMQF.js.map +0 -1
  211. package/dist/chunk-3UUF5KKZ.js.map +0 -1
  212. package/dist/chunk-4WVLZ6YP.js.map +0 -1
  213. package/dist/chunk-5JLTXHX6.js.map +0 -1
  214. package/dist/chunk-5M5ELTHE.js.map +0 -1
  215. package/dist/chunk-5ZWNCHZS.js.map +0 -1
  216. package/dist/chunk-AXWMWYH5.js.map +0 -1
  217. package/dist/chunk-BG3QXNM6.js.map +0 -1
  218. package/dist/chunk-CZV3WUW5.js.map +0 -1
  219. package/dist/chunk-FCXSR7I5.js.map +0 -1
  220. package/dist/chunk-HOZCDDRA.js.map +0 -1
  221. package/dist/chunk-JLHVQWOV.js.map +0 -1
  222. package/dist/chunk-LQB42OSA.js.map +0 -1
  223. package/dist/chunk-MIDZWKIF.js.map +0 -1
  224. package/dist/chunk-NH6HUVXQ.js.map +0 -1
  225. package/dist/chunk-R4XXOGQH.js.map +0 -1
  226. package/dist/chunk-RVMM4BHK.js.map +0 -1
  227. package/dist/chunk-VFWFT3OK.js.map +0 -1
  228. package/dist/chunk-VMRUW4B4.js.map +0 -1
  229. package/dist/chunk-VOCUGTZB.js.map +0 -1
  230. package/dist/chunk-Z5NL5D4J.js.map +0 -1
@@ -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":";;;;;AAmEA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAW9D,SAAS,kBAAA,CAAmB,MAAgB,OAAA,EAAoC;AACrF,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC3D,EAAA,MAAM,YAA+B,EAAC;AAGtC,EAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,OAAA,CAAQ,EAAE,CAAA,CAAA;AAEnC,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,MAAgC;AAAA,IAC9C,IAAA,EAAM,MAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA,EAAW,OAAO,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,KAAK,OAAA,CAAQ,EAAA;AAAA,IACpD,KAAA,EAAO,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAE,CAAA,QAAA,EAAM,IAAI,CAAA,CAAA,GAAM,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ;AAAA,GACvF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CACV,IAAA,EACA,WAAA,EACA,YACA,QAAA,EACA,OAAA,EACA,YACA,YAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAqB;AAC1C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,GACV,oBAAA,CAAqB,OAAA,EAAS;AAAA,MAC5B,QAAA,EAAU,IAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAA,EAAe,CAAC,EAAE,IAAA,OAAW,MAAA,CAAO,YAAA,GAAe,IAAI,CAAC;AAAA,KACzD,CAAA,GACD,OAAA;AAEJ,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,IAAA,CAAK,YAAA;AAAA,QACH;AAAA,UACE,IAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAa,EAAE,IAAA,EAAM,UAAU,UAAA,EAAiC,QAAA,EAAU,sBAAsB,KAAA;AAAM,SACxG;AAAA,QACA,KAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS;AACpB,KACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAqB;AACzC,IAAA,MAAM,KAAA,GAAQ,QAAQ,YAAA,IAAe;AACrC,IAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,EAAE,iBAAiB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAiB,MAAA,EAAgB,OAAe,QAAA,KAA8B;AAC5F,IAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,IAAA,aAAA,CAAc,MAAM,EAAA,EAAI;AAAA,MACtB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,CAAA,KAAA,EAAQ,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,MAC5B,MAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrC,IAAA,EAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI;AAAA,KAClC,CAAA;AAAA,EACH,CAAA;AAIA,EAAA,GAAA;AAAA,IACE,UAAA;AAAA,IACA,kIAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,MAAA,OAAO,UAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,UACH;AAAA,YACE,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,YAC3B,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,YAC3B,cAAA,EAAgB,OAAO,OAAA,CAAQ,KAAA,CAAM,gBAAgB,EAAE,EACpD,MAAA,CAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAA,CACrB,IAAI,CAAC,CAAC,EAAE,CAAA,KAAM,EAAE,CAAA;AAAA,YACnB,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,SAAA,EAAW,OAAA,CAAQ,YAAA,IAAe,IAAK,IAAA;AAAA,YACvC,MAAA,EAAQ,OAAA,CAAQ,SAAA,IAAY,IAAK,IAAA;AAAA,YACjC,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,QAAQ;AAAA,WACpC;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA;AAAA,IACE,WAAA;AAAA,IACA,8FAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU,EAAE;AAAA,UAChE,QAAA,EAAU,CAAC,IAAI,CAAA;AAAA,UACf,oBAAA,EAAsB;AAAA;AACxB;AACF,KACF;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAK,IAAA,CAAK,UAAyB,EAAC;AAC1E,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACzB,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,IAAA,EAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,MACnD,CAAC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,SAAQ,EAAG,WAAA,EAAa,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,SAAS,IAAI,QAAQ,CAAA;AACvH,MAAA,OAAO,UAAA,CAAW,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,EAAE,CAAA,EAAG,EAAE,IAAA,GAAO,OAAA,GAAU,EAAE,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACjH,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAI,MAAA,CAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAe,EAAE,CAAA,GAAI;AAAA,GACzG;AAEA,EAAA,GAAA;AAAA,IACE,aAAA;AAAA,IACA,4DAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,UAChE,QAAA,EAAU,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,UACxB,oBAAA,EAAsB;AAAA;AACxB;AACF,KACF;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAK,IAAA,CAAK,UAA2B,EAAC;AAC5E,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACzB,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAE;AAAA,MACpD,CAAC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,SAAQ,EAAG,aAAA,EAAe,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,SAAS,IAAI,QAAQ,CAAA;AACxH,MAAA,OAAO,WAAW,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACvG,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAI,MAAA,CAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAiB,EAAE,CAAA,GAAI;AAAA,GAC3G;AAEA,EAAA,GAAA;AAAA,IACE,kBAAA;AAAA,IACA,wFAAA;AAAA,IACA,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,mCAAA,EAAoC,EAAE;AAAA,IACzG,CAAC,QAAQ,CAAA;AAAA,IACT,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,IAAY;AAClC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAC,OAAO,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA;AACtD,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAGlB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QACrE;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAM,eAAwC,EAAC;AAC/C,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,YAAA,CAAa,EAAE,CAAA,GAAI,IAAA;AAEzC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,YAAA,EAAa,EAAG,oBAAoB,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,IAAA,EAAO,IAAI,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,IAAI,QAAQ,CAAA;AAC9H,MAAA,OAAO,UAAA,CAAW,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,IAAA,EAAO,IAAI,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,GAAA;AAAA,MACE,gBAAA;AAAA,MACA,uDAAA;AAAA,MACA;AAAA,QACE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAO,EAAE,WAAA,EAAa,0DAAA;AAA2D,OACnF;AAAA,MACA,CAAC,SAAS,UAAU,CAAA;AAAA,MACpB,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACrC,QAAA,YAAA,CAAa,QAAQ,CAAA;AAErB,QAAA,MAAM,QAAQ,YAAY;AACxB,UAAA,MAAM,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,QAAA,EAAU,KAAK,KAAK,CAAA;AAAA,QACtD,CAAA;AAEA,QAAA,IAAI,QAAQ,WAAA,EAAa;AAIvB,UAAA,MAAM,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC/C,UAAA,OAAA,CAAQ,SAAA,GAAY,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,IAAA,EAAO,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,EAAI,KAAA,EAAO,CAAA;AAC3E,UAAA,OAAO,UAAA,CAAW,CAAA,YAAA,EAAe,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAAA,QACrF;AAEA,QAAA,MAAM,KAAA,EAAM;AACZ,QAAA,OAAO,UAAA,CAAW,CAAA,IAAA,EAAO,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACtD,CAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAC,IAAA,KAAS,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAA;AAAA,IAChC,SAAS,MAAM;AACb,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAC7B,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AAAA,IACrB;AAAA,GACF;AACF","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":";;;;;AAuCA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AA4B9D,SAAS,oBAAA,CAAqB,MAAgB,OAAA,EAAsC;AACvF,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC3D,EAAA,MAAM,YAA+B,EAAC;AAGtC,EAAA,MAAM,QAAA,GAAW,QAAA;AAIjB,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAE5D,EAAA,MAAM,aAAa,OAAoB;AAAA,IACnC,IAAA,EAAM,MAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,CAAE,EAAA;AAAA,IAC7B,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAQ,CAAE;AAAA,GAC7B,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,MAAkC;AAAA,IACnD,IAAA,EAAM,OAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA,EAAW,OAAA;AAAA,IACX,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,GAC3B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,EAAiB,SAAA,MAAoC;AAAA,IACxE,IAAA,EAAM,eAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA;AAAA,IACA,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,GAClC,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CACR,IAAA,EACA,WAAA,EACA,YACA,QAAA,EACA,OAAA,EACA,YACA,aAAA,KACC;AACD,IAAA,MAAM,OAAA,IAAW,OAAO,IAAA,KAAqB;AACzC,MAAA,IAAI;AACA,QAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AACR,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACjE;AAAA,IACJ,CAAA,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,IAAc,aAAA,GACtB,oBAAA,CAAqB,OAAA,EAAS;AAAA,MAC1B,QAAA,EAAU,IAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAA,EAAe,CAAC,GAAA,KAAQ,aAAA,CAAc,IAAI,IAAkB;AAAA,KAC/D,CAAA,GACD,OAAA;AACN,IAAA,SAAA,CAAU,IAAA;AAAA,MACN,IAAA,CAAK,YAAA;AAAA,QACD;AAAA,UACI,IAAA;AAAA,UACA,WAAA;AAAA,UACA,WAAA,EAAa;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,UAAA;AAAA,YACA,QAAA;AAAA,YACA,oBAAA,EAAsB;AAAA;AAC1B,SACJ;AAAA,QACA,KAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS;AACtB,KACJ;AAAA,EACJ,CAAA;AAIA,EAAA,GAAA;AAAA,IACI,eAAA;AAAA,IACA,wFAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACF,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,MAAA,MAAM,gBAAwC,EAAC;AAC/C,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,MAAA,EAAQ;AACzB,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU;AACxB,UAAA,aAAA,CAAc,EAAE,IAAI,CAAA,GAAA,CAAK,cAAc,CAAA,CAAE,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,QAC3D;AAAA,MACJ;AACA,MAAA,MAAM,OAAA,GAAU;AAAA,QACZ,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,KAAA,EAAO,KAAK,KAAA,EAAO,IAAA;AAAA,QACnB;AAAA,OACJ;AACA,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,GAAA;AAAA,IACI,UAAA;AAAA,IACA,0BAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACF,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,GAAA;AAAA,IACI,YAAA;AAAA,IACA,qEAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACF,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACjC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,YAAA,EAAc,EAAE,QAAA,CAAS,MAAA;AAAA,QACzB,KAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,KAAA,IAAgC,iBAAiB,CAAC;AAAA,OAC1E,CAAE,CAAA;AACF,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,GAAA;AAAA,IACI,WAAA;AAAA,IACA,mCAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAQ,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAC9D,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,WAAA,CAAY,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAE,CAAA;AACvD,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,CAAC,GAAG,KAAK,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA;AAAA,GACJ;AAIA,EAAA,GAAA;AAAA,IACI,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IAC5B,CAAC,OAAO,CAAA;AAAA,IACR,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAC5B,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,eAAA,EAAiB,OAAO,CAAA;AAC5C,MAAA,OAAO,WAAW,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAA,EAAK,EAAE,OAAO,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,GAAA;AAAA,IACI,kBAAA;AAAA,IACA,yGAAA;AAAA,IACA,EAAE,KAAA,EAAO,EAAE,WAAA,EAAa,sCAAqC,EAAE;AAAA,IAC/D,CAAC,OAAO,CAAA;AAAA,IACR,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACvB,QAAA,KAAA,GAAQ,EAAE,MAAM,CAAA,EAAE;AAAA,MACtB,WAAW,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,UAAW,CAAA,EAA+B;AAC/E,QAAA,KAAA,GAAQ,CAAA;AAAA,MACZ,CAAA,MAAO;AACH,QAAA,OAAO,YAAY,+DAA+D,CAAA;AAAA,MACtF;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,eAAA,EAAiB,OAAO,CAAA;AAC5C,MAAA,OAAO,WAAW,CAAA,eAAA,EAAkB,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,GAAA;AAAA,IACI,UAAA;AAAA,IACA,iNAAA;AAAA,IACA,EAAE,IAAA,EAAM,EAAE,WAAA,EAAa,2BAA0B,EAAE;AAAA,IACnD,CAAC,MAAM,CAAA;AAAA,IACP,OAAO,IAAA,KAAS;AACZ,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,MAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC3C,QAAA,OAAO,YAAY,qEAAqE,CAAA;AAAA,MAC5F;AACA,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACnE,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AAEA,QAAA,IAAA,GAAO,UAAU,QAAmB,CAAA;AAAA,MACxC,SAAS,CAAA,EAAG;AACR,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACjE;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,cAAA,EAAgB,MAAM,CAAA;AAC1C,MAAA,OAAO,WAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,KAAK,CAAA,GAAA,EAAM,KAAK,MAAA,CAAO,MAAM,CAAA,QAAA,CAAA,EAAY,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC/H,CAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACJ;AAIA,EAAA,GAAA;AAAA,IACI,WAAA;AAAA,IACA,2GAAA;AAAA,IACA;AAAA,MACI,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,KAAA,EAAO,EAAE,WAAA,EAAa,gEAAA;AAA4D,KACtF;AAAA,IACA,EAAC;AAAA,IACD,OAAO,IAAA,KAAS;AACZ,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,MAAA,MAAM,QAAA,GAAY,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC;AAC/E,MAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,MAAM,OAAO,gCAAgC,CAAA;AAC7E,MAAA,MAAM,KAAA,GAAmB;AAAA,QACrB,EAAA,EAAI,QAAA,CAAS,EAAA,IAAM,UAAA,EAAW;AAAA,QAC9B,MAAA,EAAQ,SAAS,MAAA,IAAU,OAAA;AAAA,QAC3B,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY,EAAC;AAAA,QAChC,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,UAAU,QAAA,CAAS;AAAA,OACvB;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC9E,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,OAAO,CAAA;AAC/C,MAAA,OAAO,UAAA,CAAW,CAAA,YAAA,EAAe,KAAA,CAAM,EAAE,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,CAAA;AAAA,IAC1F,CAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,UAAA;AAAW,GACrB;AAEA,EAAA,GAAA;AAAA,IACI,cAAA;AAAA,IACA,uBAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,cAAA,EAAgB,OAAA,EAAS,IAAI,CAAA;AACjD,MAAA,OAAO,WAAW,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,GAAA;AAAA,IACI,eAAA;AAAA,IACA,8BAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,IAAY,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IACtD,CAAC,MAAM,SAAS,CAAA;AAAA,IAChB,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,CAAC,CAAA;AACnC,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,iBAAiB,OAAA,EAAS,EAAA,EAAI,SAAS,CAAA;AAC3D,MAAA,OAAO,UAAA,CAAW,eAAe,EAAE,CAAA,QAAA,EAAM,OAAO,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,OAAA,EAAS,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,GAAA;AAAA,IACI,kBAAA;AAAA,IACA,iCAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,IAAY,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IACrD,CAAC,MAAM,QAAQ,CAAA;AAAA,IACf,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,iBAAA,EAAmB,SAAS,EAAA,EAAI,MAAA,EAAQ,MAAA,IAAU,OAAA,EAAS,CAAA;AAC/E,MAAA,OAAO,UAAA,CAAW,SAAS,EAAE,CAAA,eAAA,EAAa,MAAM,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,MAAA,EAAQ,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,GAAA;AAAA,IACI,iBAAA;AAAA,IACA,8BAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,IAAY,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IACpD,CAAC,MAAM,OAAO,CAAA;AAAA,IACd,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAC5B,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,kBAAkB,OAAA,EAAS,EAAA,EAAI,OAAO,CAAA;AAC1D,MAAA,OAAO,WAAW,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,GAAA;AAAA,IACI,sBAAA;AAAA,IACA,oCAAA;AAAA,IACA;AAAA,MACI,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,UAAA,EAAY,EAAE,WAAA,EAAa,8EAAA;AAA0E,KACzG;AAAA,IACA,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,EAAA,GAAM,KAAK,UAAA,IAAc,OAAO,KAAK,UAAA,KAAe,QAAA,GAAW,KAAK,UAAA,GAAa,MAAA;AACvF,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,qBAAA,EAAuB,SAAS,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AACxE,MAAA,OAAO,WAAW,CAAA,wBAAA,EAA2B,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,GAAA;AAAA,IACI,sBAAA;AAAA,IACA,6CAAA;AAAA,IACA;AAAA,MACI,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,UAAA,EAAY;AAAA,QACR,WAAA,EACI;AAAA;AACR,KACJ;AAAA,IACA,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,UAAA,GAAc,KAAK,UAAA,IAAc,OAAO,KAAK,UAAA,KAAe,QAAA,GAAW,KAAK,UAAA,GAAa,MAAA;AAC/F,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,uBAAuB,OAAA,EAAS,EAAA,EAAI,YAAY,CAAA;AACpE,MAAA,OAAO,WAAW,CAAA,wBAAA,EAA2B,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC;AAAA,GACvC;AAIA,EAAA,GAAA;AAAA,IACI,aAAA;AAAA,IACA,2DAAA;AAAA,IACA;AAAA,MACI,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC1B,OAAA,EAAS,EAAE,WAAA,EAAa,8EAAA;AAA0E,KACtG;AAAA,IACA,CAAC,WAAW,SAAS,CAAA;AAAA,IACrB,OAAO,IAAA,KAAS;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,QAAA,GAAY,KAAK,OAAA,IAAW,OAAO,KAAK,OAAA,KAAY,QAAA,GAAW,IAAA,CAAK,OAAA,GAAU,EAAC;AACrF,MAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAM,OAAO,YAAY,2BAA2B,CAAA;AAClE,MAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACjF,MAAA,MAAM,OAAA,GAAU;AAAA,QACZ,EAAA,EAAI,QAAA,CAAS,EAAA,IAAM,YAAA,EAAa;AAAA,QAChC,GAAG;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,aAAA,EAAe,OAAA,EAAS,SAAS,CAAA;AACrD,MAAA,OAAO,UAAA,CAAW,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,YAAY,OAAA,CAAQ,EAAE,CAAA,IAAA,EAAO,OAAO,IAAI,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,SAAS,CAAA;AAAA,IAC9G,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,OAAO,CAAC;AAAA,GAC5C;AAEA,EAAA,GAAA;AAAA,IACI,gBAAA;AAAA,IACA,0BAAA;AAAA,IACA,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,IAAY,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IAC7D,CAAC,WAAW,WAAW,CAAA;AAAA,IACvB,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACpC,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,gBAAA,EAAkB,OAAA,EAAS,WAAW,CAAA;AAC1D,MAAA,OAAO,UAAA,CAAW,mBAAmB,SAAS,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,EAAE,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IAC5F,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,EAAM,SAAS,CAAC;AAAA,GACpE;AAEA,EAAA,GAAA;AAAA,IACI,gBAAA;AAAA,IACA,wEAAA;AAAA,IACA;AAAA,MACI,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,KAC5B;AAAA,IACA,CAAC,SAAA,EAAW,WAAA,EAAa,OAAO,CAAA;AAAA,IAChC,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACpC,MAAA,MAAM,KAAA,GAAS,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC;AAC5E,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,kBAAkB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AACjE,MAAA,OAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,EAAI,EAAE,MAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,EAAM,SAAS,CAAC;AAAA,GACpE;AAEA,EAAA,GAAA;AAAA,IACI,cAAA;AAAA,IACA,yCAAA;AAAA,IACA;AAAA,MACI,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA;AAAS,KACxB;AAAA,IACA,CAAC,SAAA,EAAW,WAAA,EAAa,GAAA,EAAK,GAAG,CAAA;AAAA,IACjC,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,cAAA,EAAgB,SAAS,SAAA,EAAW,CAAA,EAAG,GAAG,CAAA;AAC9D,MAAA,OAAO,UAAA,CAAW,CAAA,cAAA,EAAiB,SAAS,CAAA,SAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,EAAM,SAAS,CAAC;AAAA,GACpE;AAEA,EAAA,GAAA;AAAA,IACI,gBAAA;AAAA,IACA,kDAAA;AAAA,IACA;AAAA,MACI,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA;AAAS,KACxB;AAAA,IACA,CAAC,SAAA,EAAW,WAAA,EAAa,GAAA,EAAK,GAAG,CAAA;AAAA,IACjC,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,EAAA,EAAI,gBAAA,EAAkB,SAAS,SAAA,EAAW,CAAA,EAAG,GAAG,CAAA;AAChE,MAAA,OAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,SAAS,CAAA,SAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,EAAM,SAAS,CAAC;AAAA,GACpE;AAEA,EAAA,GAAA;AAAA,IACI,uBAAA;AAAA,IACA,4DAAA;AAAA,IACA;AAAA,MACI,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,SAAA,EAAW;AAAA,QACP,WAAA,EACI;AAAA;AACR,KACJ;AAAA,IACA,CAAC,WAAW,WAAW,CAAA;AAAA,IACvB,CAAC,IAAA,KAAS;AACN,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACpC,MAAA,MAAM,SAAA,GAAa,KAAK,SAAA,IAAa,OAAO,KAAK,SAAA,KAAc,QAAA,GAAW,KAAK,SAAA,GAAY,MAAA;AAC3F,MAAA,OAAA,CAAQ,MAAM,EAAE,EAAA,EAAI,wBAAwB,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAC3E,MAAA,OAAO,UAAA,CAAW,CAAA,UAAA,EAAa,SAAA,GAAY,QAAA,GAAW,cAAc,YAAY,SAAS,CAAA,CAAA,EAAI,EAAE,SAAA,EAAW,CAAA;AAAA,IAC9G,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,EAAM,SAAS,CAAC;AAAA,GACpE;AAEA,EAAA,OAAO;AAAA,IACH,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,SAAS,MAAM;AACX,MAAA,KAAA,MAAW,CAAA,IAAK,SAAA,CAAU,MAAA,CAAO,CAAC,GAAG,CAAA,EAAE;AAAA,IAC3C;AAAA,GACJ;AACJ;AAIA,SAAS,GAAA,CAAI,CAAA,EAAY,QAAA,GAAW,CAAA,EAAW;AAC3C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,QAAA,CAAS,CAAC,IAAI,CAAA,GAAI,QAAA;AAC7D;AAEA,SAAS,GAAA,CAAI,CAAA,EAAY,QAAA,GAAW,EAAA,EAAY;AAC5C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,QAAA;AACvC;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACzC;AAEA,SAAS,iBAAiB,KAAA,EAAsC;AAC5D,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,QAAA,EAAU;AAC5B,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAK,CAAA,CAA2B,OAAA;AACtC,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACnE;AAAA,EACJ;AACA,EAAA,OAAO,MAAA;AACX","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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/code.ts"],"names":[],"mappings":"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","file":"chunk-P6SJBP5T.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/** Streaming append is a UX nicety; large content must use code_set_value. */\nconst MAX_STREAM_CHARS = 10_000;\n\n/**\n * Adapter the host wires to a fancy-code CodeEditor (typically via the\n * useCodeEditor hook's context value).\n */\nexport type CodeBridgeAdapter = {\n /** Stable id for this editor instance. */\n id: string;\n /** Display label. */\n title?: string;\n /** Optional fancy-screens screen id. */\n screenId?: string;\n /** Read the current document text. */\n getValue: () => string;\n /** Replace the document. */\n setValue: (value: string) => void;\n /** Read the current selection text (empty string if none). */\n getSelection?: () => string;\n /** Replace the current selection with text. */\n replaceSelection?: (text: string) => void;\n /** Programmatic focus. */\n focus?: () => void;\n /** Read / set the active language. */\n getLanguage?: () => string;\n /** Set the active language. */\n setLanguage?: (lang: string) => void;\n};\n\nexport type CodeBridgeOptions = {\n adapter: CodeBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerCodeBridge — schema-aware MCP access to a single CodeEditor.\n * Tools cover read, full replace, append, selection replace, language\n * switch, and a streaming append helper for \"type characters into the\n * editor over time\" UX.\n */\nexport function registerCodeBridge(\n host: ToolHost,\n options: CodeBridgeOptions,\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 = `code:${adapter.id}`;\n\n // agent_undo / agent_redo / agent_history are registered whenever any bridge\n // mounts, so undo availability doesn't hinge on which bridges are co-present.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target: AgentTarget = {\n kind: \"code\",\n screenId: adapter.screenId,\n elementId: adapter.id,\n label: adapter.title ?? adapter.id,\n };\n\n // Record a reversible document edit so agent_undo/redo actually work for code\n // (they were registered but the code bridge pushed nothing — false\n // recoverability). Captures the whole-document before/after; restore is a\n // full setValue either way.\n const recordUndo = (action: string, label: string, prevValue: string, nextValue: string): void => {\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"code\",\n action,\n label,\n undo: () => adapter.setValue(prevValue),\n redo: () => adapter.setValue(nextValue),\n });\n };\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n isMutation: boolean,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"code\",\n screenId: adapter.screenId,\n resolveTarget: () => target,\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n reg(\n \"code_describe\",\n `Describe the editor \"${adapter.id}\" — language + length + has-selection.`,\n {},\n [],\n () => {\n const value = adapter.getValue();\n const language = adapter.getLanguage?.() ?? \"unknown\";\n const summary = { id: adapter.id, language, length: value.length, lines: value.split(\"\\n\").length };\n return textResult(JSON.stringify(summary), summary);\n },\n false,\n );\n\n reg(\n \"code_get_value\",\n \"Read the full document text.\",\n {},\n [],\n () => {\n const value = adapter.getValue();\n return textResult(value, { value });\n },\n false,\n );\n\n reg(\n \"code_get_selection\",\n \"Read the currently-selected text (empty string if no selection).\",\n {},\n [],\n () => {\n if (!adapter.getSelection) return errorResult(\"Host did not provide getSelection.\");\n const value = adapter.getSelection();\n return textResult(value, { value });\n },\n false,\n );\n\n reg(\n \"code_set_value\",\n \"Replace the entire document.\",\n { value: { type: \"string\" } },\n [\"value\"],\n (args) => {\n const value = String(args.value ?? \"\");\n const prev = adapter.getValue();\n adapter.setValue(value);\n recordUndo(\"code_set_value\", \"Replace document\", prev, value);\n return textResult(`Replaced document (${value.length} chars)`, { length: value.length });\n },\n true,\n );\n\n reg(\n \"code_append\",\n \"Append text to the end of the document.\",\n { text: { type: \"string\" } },\n [\"text\"],\n (args) => {\n const text = String(args.text ?? \"\");\n const prev = adapter.getValue();\n const next = prev + text;\n adapter.setValue(next);\n recordUndo(\"code_append\", `Append ${text.length} chars`, prev, next);\n return textResult(`Appended ${text.length} chars`, { length: next.length });\n },\n true,\n );\n\n reg(\n \"code_stream_append\",\n \"Type characters into the document one at a time so the human can read it forming. Returns when streaming finishes.\",\n {\n text: { type: \"string\" },\n cps: { type: \"number\", description: \"Characters per second. Default 25.\" },\n },\n [\"text\"],\n async (args) => {\n const text = String(args.text ?? \"\");\n if (text.length > MAX_STREAM_CHARS) {\n return errorResult(\n `Text too long to stream (${text.length} > ${MAX_STREAM_CHARS}). Use code_set_value / code_append for large content.`,\n );\n }\n const cps = Math.max(1, Number(args.cps ?? 25));\n const interval = Math.max(8, Math.round(1000 / cps));\n const start = adapter.getValue();\n for (let i = 1; i <= text.length; i++) {\n adapter.setValue(start + text.slice(0, i));\n if (i < text.length) await new Promise((r) => setTimeout(r, interval));\n }\n recordUndo(\"code_stream_append\", `Append ${text.length} chars`, start, start + text);\n return textResult(`Streamed ${text.length} chars`, { length: text.length });\n },\n true,\n );\n\n reg(\n \"code_replace_selection\",\n \"Replace the currently-selected text with the supplied text.\",\n { text: { type: \"string\" } },\n [\"text\"],\n (args) => {\n if (!adapter.replaceSelection) return errorResult(\"Host did not provide replaceSelection.\");\n // No selection-range API, so restore is whole-document before/after.\n const prev = adapter.getValue();\n adapter.replaceSelection(String(args.text ?? \"\"));\n recordUndo(\"code_replace_selection\", \"Replace selection\", prev, adapter.getValue());\n return textResult(\"Selection replaced\", { });\n },\n true,\n );\n\n reg(\n \"code_set_language\",\n \"Switch the active syntax highlighting / formatter.\",\n { language: { type: \"string\", description: \"e.g. 'javascript', 'php', 'sql'.\" } },\n [\"language\"],\n (args) => {\n if (!adapter.setLanguage) return errorResult(\"Host did not provide setLanguage.\");\n const lang = String(args.language ?? \"\");\n const prevLang = adapter.getLanguage?.();\n adapter.setLanguage(lang);\n if (prevLang !== undefined) {\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"code\",\n action: \"code_set_language\",\n label: `Language → ${lang}`,\n undo: () => adapter.setLanguage?.(prevLang),\n redo: () => adapter.setLanguage?.(lang),\n });\n }\n return textResult(`Language → ${lang}`, { language: lang });\n },\n true,\n );\n\n reg(\n \"code_focus\",\n \"Move browser focus to the editor.\",\n {},\n [],\n () => {\n if (!adapter.focus) return errorResult(\"Host did not provide focus.\");\n adapter.focus();\n return textResult(\"Focused\", { });\n },\n // Focus is not a document mutation — don't broadcast it as one or log undo.\n false,\n );\n\n return {\n id: bridgeId,\n title: adapter.title ?? adapter.id,\n dispose: () => {\n for (const d of disposers) d();\n },\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { registerDocBridge } from './chunk-3HVYUMQF.js';
2
- import { textResult } from './chunk-CZV3WUW5.js';
1
+ import { registerDocBridge } from './chunk-VHB3VE53.js';
2
+ import { textResult } from './chunk-3GFKC6OK.js';
3
3
  import { childrenOf, appendOrder } from '@particle-academy/fancy-doc-commons';
4
4
 
5
5
  var SCREEN_TEXT_NODE_TYPE = "#text";
@@ -75,7 +75,9 @@ function registerScreenDocBridge(host, options) {
75
75
  authored.length ? `${authored.length} addressable, ${syntheticCount} positional` : `no addressable ids \u2014 all ${syntheticCount} nodes are positional`,
76
76
  { addressable: authored, syntheticCount }
77
77
  );
78
- })
78
+ }),
79
+ // Same registrant as the doc bridge above, which registers under its surface.
80
+ { owner: surface }
79
81
  );
80
82
  return {
81
83
  id: surface,
@@ -88,5 +90,5 @@ function registerScreenDocBridge(host, options) {
88
90
  }
89
91
 
90
92
  export { SCREEN_TEXT_NODE_TYPE, registerScreenDocBridge };
91
- //# sourceMappingURL=chunk-5JLTXHX6.js.map
92
- //# sourceMappingURL=chunk-5JLTXHX6.js.map
93
+ //# sourceMappingURL=chunk-PMPBI6I3.js.map
94
+ //# sourceMappingURL=chunk-PMPBI6I3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/screen-doc.ts"],"names":[],"mappings":"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","file":"chunk-PMPBI6I3.js","sourcesContent":["/**\n * registerScreenDocBridge — an agent bridge over the CONTENT of one rendered\n * `<Screen doc={…}>` (fancy-screens ≥ 0.6), built on {@link registerDocBridge}.\n *\n * This is the other half of {@link registerScreensBridge}, and the halves are\n * not interchangeable. That one moves *between* screens and creates them from\n * host templates, treating a screen's contents as an opaque `config` blob. This\n * one addresses the nodes *inside* one screen: read them, patch a prop, retext a\n * label, reparent a card.\n *\n * Until fancy-screens 0.6 there was no way to do that at all — `ScreenSchema`\n * nodes had no `id`, so an agent could emit a whole surface and then not touch\n * anything in it. That was a standing violation of the component contract's\n * stable-handles requirement, on the one shipped \"agent emits a UI\" path.\n *\n * A screen document is a plain `DocTree`, so the generic bridge supplies\n * describe/get/list/get_node + add/update/remove/move + undo + agent activity +\n * staged writes for free. What this layer adds is everything that is specific to\n * a screen being a rendered React tree:\n *\n * - **Synthetic ids are reported as such.** fancy-screens mints a position-derived\n * id for any node the author left anonymous. It looks like a handle and is not\n * one: insert a sibling above it and it points at a different node, silently.\n * Every read here says which kind of id it handed back, and `screen_addressable`\n * lists only the durable ones.\n * - **Literal text is a node**, not a prop, so that a string and an element can be\n * siblings without losing their order. `screen_set_text` hides that from the\n * agent, which otherwise has to know the reserved `#text` type to change a label.\n *\n * No dependency on fancy-screens — the contract is the `DocTree`, mirroring how\n * `bridges/screens.ts` keeps its own snapshot types loose.\n */\nimport { textResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { Bridge } from \"./types\";\nimport { registerDocBridge, type DocAdapter, type DocOpTool } from \"./doc\";\nexport type { DocAdapter } from \"./doc\";\nimport {\n childrenOf,\n appendOrder,\n type DocNode,\n type StagePolicy,\n type TreeOp,\n} from \"@particle-academy/fancy-doc-commons\";\n\n/**\n * Reserved node type for a literal string child. Must match fancy-screens'\n * `TEXT_NODE_TYPE`; duplicated rather than imported to keep this bridge free of\n * a fancy-screens dependency.\n */\nexport const SCREEN_TEXT_NODE_TYPE = \"#text\";\n\n/** A screen document node — a `DocNode` plus the minted-id flag. */\nexport interface ScreenDocNode extends DocNode {\n /**\n * True when fancy-screens minted this id because the author supplied none.\n * A synthetic id is derived from position, so it is not a durable handle.\n */\n synthetic?: boolean;\n}\n\nexport type ScreenDocOp = TreeOp<ScreenDocNode>;\n\nexport interface ScreenDocBridgeOptions {\n adapter: DocAdapter<ScreenDocNode>;\n /**\n * Tool-name prefix. Default `\"screen\"` → `screen_add`, `screen_set_text`, …\n *\n * Tool names are global, so a host wiring more than one doc-driven screen at\n * once must give each a distinct prefix (`\"screen_checkout\"`).\n */\n surface?: string;\n agent?: { id: string; name?: string; color?: string };\n /** Auto-apply vs. confirm per op (trust-but-verify). Default: auto. */\n stagePolicy?: StagePolicy<ScreenDocOp>;\n onPending?: (staged: { id: string; op: ScreenDocOp; label: string }) => void;\n}\n\n/** Register the screen-content bridge (prefix `screen_`) over a screen's `DocTree`. */\nexport function registerScreenDocBridge(host: ToolHost, options: ScreenDocBridgeOptions): Bridge {\n const { adapter } = options;\n const surface = options.surface ?? \"screen\";\n\n const setText: DocOpTool<ScreenDocNode, ScreenDocOp> = {\n verb: \"set_text\",\n description:\n \"Replace the literal text of an element node — the natural way to change a label, heading or paragraph. Pass the ELEMENT's id, not the text node's.\",\n properties: {\n id: { type: \"string\", description: \"Id of the element whose text to set.\" },\n text: { type: \"string\" },\n },\n required: [\"id\", \"text\"],\n build: (args, tree) => {\n const id = String(args.id);\n const node = tree.nodes[id];\n if (!node) return { error: `No node ${id}` };\n if (node.type === SCREEN_TEXT_NODE_TYPE) {\n return { t: \"set_props\", id, patch: { value: String(args.text) } };\n }\n\n const texts = childrenOf(tree, id).filter((c) => c.type === SCREEN_TEXT_NODE_TYPE);\n if (texts.length === 1) {\n return { t: \"set_props\", id: texts[0]!.id, patch: { value: String(args.text) } };\n }\n if (texts.length === 0) {\n // Nothing to retext, so give it text. The minted child is addressable in\n // its own right, which is what makes the follow-up edit possible.\n return {\n t: \"insert\",\n node: {\n id: `${id}-text`,\n type: SCREEN_TEXT_NODE_TYPE,\n parent: id,\n order: appendOrder(tree, id),\n props: { value: String(args.text) },\n },\n };\n }\n // Ambiguous on purpose: picking one would look like it worked.\n return {\n error: `Node ${id} has ${texts.length} text children (${texts.map((t) => t.id).join(\", \")}) — set_text on the one you mean`,\n };\n },\n targetId: (args) => String(args.id),\n };\n\n const bridge = registerDocBridge<ScreenDocNode, ScreenDocOp>(host, {\n adapter,\n surface,\n agent: options.agent,\n stagePolicy: options.stagePolicy,\n onPending: options.onPending,\n // Anything the AGENT adds is authored by definition — it chose or was given\n // the id — so it must not inherit the synthetic flag from its neighbours.\n makeNode: ({ id, type, parent, order }, props) => ({ id, type, parent, order, props }),\n describeNode: (n) => ({\n id: n.id,\n type: n.type,\n parent: n.parent,\n ...(n.synthetic ? { synthetic: true } : {}),\n ...(n.type === SCREEN_TEXT_NODE_TYPE ? { text: String(n.props?.value ?? \"\") } : { props: Object.keys(n.props ?? {}) }),\n }),\n opTools: [setText],\n });\n\n // A read tool, so it lives here rather than in `opTools` (which are mutations).\n const disposeAddressable = host.registerTool(\n {\n name: `${surface}_addressable`,\n description:\n \"List the node ids that are safe to remember and use later. Ids NOT listed here were minted from a node's position: they resolve today and silently point at a different node once a sibling is inserted above them. Address those in the same turn you read them, and never store one.\",\n inputSchema: { type: \"object\", properties: {} as never, required: [], additionalProperties: false },\n },\n (async () => {\n const nodes = Object.values(adapter.get().nodes);\n const authored = nodes.filter((n) => !n.synthetic).map((n) => ({ id: n.id, type: n.type }));\n const syntheticCount = nodes.length - authored.length;\n\n return textResult(\n authored.length\n ? `${authored.length} addressable, ${syntheticCount} positional`\n : `no addressable ids — all ${syntheticCount} nodes are positional`,\n { addressable: authored, syntheticCount },\n );\n }) as never,\n // Same registrant as the doc bridge above, which registers under its surface.\n { owner: surface },\n );\n\n return {\n id: surface,\n title: \"Screen content\",\n dispose: () => {\n disposeAddressable();\n bridge.dispose();\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/passkeys.ts
6
6
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -29,6 +29,7 @@ function registerPasskeyBridge(host, options) {
29
29
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
30
30
  const surfaceId = adapter.id ?? "passkeys";
31
31
  const disposers = [];
32
+ const bridgeId = `passkeys:${surfaceId}`;
32
33
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
33
34
  const target = (elementId, label) => ({
34
35
  kind: "custom",
@@ -63,7 +64,8 @@ function registerPasskeyBridge(host, options) {
63
64
  additionalProperties: false
64
65
  }
65
66
  },
66
- final
67
+ final,
68
+ { owner: bridgeId }
67
69
  )
68
70
  );
69
71
  };
@@ -184,7 +186,7 @@ function registerPasskeyBridge(host, options) {
184
186
  (args) => target(void 0, `begin enrollment${args.name ? ` (${str(args.name)})` : ""}`)
185
187
  );
186
188
  return {
187
- id: `passkeys:${surfaceId}`,
189
+ id: bridgeId,
188
190
  title: adapter.title ?? "Passkeys",
189
191
  dispose: () => {
190
192
  for (const d of disposers.splice(0)) d();
@@ -193,5 +195,5 @@ function registerPasskeyBridge(host, options) {
193
195
  }
194
196
 
195
197
  export { PASSKEY_BRIDGE_TOOLS, registerPasskeyBridge };
196
- //# sourceMappingURL=chunk-4WVLZ6YP.js.map
197
- //# sourceMappingURL=chunk-4WVLZ6YP.js.map
198
+ //# sourceMappingURL=chunk-PV4FZDYX.js.map
199
+ //# sourceMappingURL=chunk-PV4FZDYX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/passkeys.ts"],"names":[],"mappings":";;;;;AAiKA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAErE,IAAM,GAAA,GAAM,CAAC,CAAA,EAAY,QAAA,GAAW,OAAgB,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,QAAA;AAUhF,SAAS,UAAU,MAAA,EAAgD;AACjE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAAA,IAClB,MAAM,OAAO,MAAA,EAAQ,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,IAAA;AAAA,IACvD,SAAA,EAAW,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AAAA,IAChC,YAAY,OAAO,MAAA,EAAQ,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,IAAA;AAAA,IACzE,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,IAAI,EAAC;AAAA,IAC3F,QAAA,EAAU,QAAQ,QAAA,KAAa,IAAA;AAAA,IAC/B,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC1B,UAAU,OAAO,MAAA,EAAQ,QAAA,KAAa,QAAA,GAAW,OAAO,QAAA,GAAW;AAAA,GACrE;AACF;AAQO,IAAM,oBAAA,GAAuB;AAAA,EAClC,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAUO,SAAS,qBAAA,CAAsB,MAAgB,OAAA,EAAuC;AAC3F,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC3D,EAAA,MAAM,SAAA,GAAY,QAAQ,EAAA,IAAM,UAAA;AAChC,EAAA,MAAM,YAA+B,EAAC;AAGtC,EAAA,MAAM,QAAA,GAAW,YAAY,SAAS,CAAA,CAAA;AAEtC,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,EAAoB,KAAA,MAAiC;AAAA,IACnE,IAAA,EAAM,QAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA;AAAA,IACA,OAAO,KAAA,IAAS;AAAA,GAClB,CAAA;AAEA,EAAA,MAAM,MAAM,CACV,IAAA,EACA,aACA,UAAA,EACA,QAAA,EACA,SACA,aAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAqB;AAC1C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,aAAA,GACV,oBAAA,CAAqB,OAAA,EAAkB;AAAA,MACrC,QAAA,EAAU,IAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,eAAe,CAAC,EAAE,IAAA,EAAK,KAAM,cAAc,IAAkB;AAAA,KAC9D,CAAA,GACD,OAAA;AACJ,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,IAAA,CAAK,YAAA;AAAA,QACH;AAAA,UACE,IAAA;AAAA,UACA,WAAA;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,UAAA;AAAA,YACA,QAAA;AAAA,YACA,oBAAA,EAAsB;AAAA;AACxB,SACF;AAAA,QACA,KAAA;AAAA,QACA,EAAE,OAAO,QAAA;AAAS;AACpB,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAW,OAAO,EAAA,KAAA,CACrB,MAAM,OAAA,CAAQ,MAAK,EAAG,GAAA,CAAI,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAIpE,EAAA,GAAA;AAAA,IACE,cAAA;AAAA,IACA,+QAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,YAAY;AACV,MAAA,MAAM,YAAY,MAAM,OAAA,CAAQ,IAAA,EAAK,EAAG,IAAI,SAAS,CAAA;AACrD,MAAA,OAAO,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,gBAAA;AAAA,IACA,sNAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,YAAY;AACV,MAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,GAAU,MAAM,OAAA,CAAQ,SAAQ,GAAI,IAAA;AAC5D,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,GAAQ,MAAM,OAAA,CAAQ,OAAM,GAAI,IAAA;AACtD,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,OAAA;AAAA,QACA,KAAA;AAAA;AAAA;AAAA,QAGA,mBAAA,EAAqB,KAAA;AAAA,QACrB,IAAA,EAAM;AAAA,OACR;AACA,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,GAAG,GAAG,CAAA;AAAA,IACrD,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA;AAAA,IACE,gBAAA;AAAA,IACA,kGAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0BAAA,EAA2B;AAAA,MAC9D,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6DAAA;AAA8D,KACrG;AAAA,IACA,CAAC,MAAM,MAAM,CAAA;AAAA,IACb,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,MAAA,IAAI,CAAC,EAAA,EAAI,OAAO,WAAA,CAAY,iBAAiB,CAAA;AAE7C,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,EAAE,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,WAAA,CAAY,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,CAAG,CAAA;AAE7D,MAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,WAAA;AAAA,YACL;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,EAAA,GAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,MAAA,EAAQ,gBAAA,EAAkB,EAAA,EAAI,IAAA,EAAM,CAAA;AACvE,QAAA,IAAI,CAAC,EAAA,EAAI,OAAO,WAAA,CAAY,CAAA,iBAAA,EAAoB,EAAE,CAAA,yBAAA,CAA2B,CAAA;AAAA,MAC/E;AAEA,MAAA,MAAM,QAAA,GAAW,SAAS,IAAA,IAAQ,EAAA;AAClC,MAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,EAAA,EAAI,MAAM,CAAA;AACjC,MAAA,aAAA,CAAc,MAAM,EAAA,EAAI;AAAA,QACtB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,QAAA,EAAU,SAAA;AAAA,QACV,MAAA,EAAQ,gBAAA;AAAA,QACR,KAAA,EAAO,CAAA,mBAAA,EAAsB,IAAA,IAAQ,WAAW,CAAA,CAAA;AAAA,QAChD,MAAM,YAAY;AAAE,UAAA,MAAM,QAAQ,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAU,CAAA;AAAA,QAAG,CAAA;AAAA,QAClE,MAAM,YAAY;AAAE,UAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,EAAA,EAAI,MAAM,CAAA;AAAA,QAAG;AAAA,OACzD,CAAA;AAED,MAAA,OAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,EAAE,CAAA,IAAA,EAAO,IAAA,IAAQ,WAAW,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,IAC7F,CAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,OAAA,EAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE;AAAA,GACzD;AAIA,EAAA,GAAA;AAAA,IACE,gBAAA;AAAA,IACA,6QAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,4BAA2B,EAAE;AAAA,IAClE,CAAC,IAAI,CAAA;AAAA,IACL,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,IAAI,CAAC,EAAA,EAAI,OAAO,WAAA,CAAY,iBAAiB,CAAA;AAE7C,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,EAAE,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,WAAA,CAAY,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,CAAG,CAAA;AAE7D,MAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,aAAA,CAAc,EAAE,IAAI,CAAA;AACnD,MAAA,MAAM,aAAA,GAAgB,UAAU,aAAA,KAAkB,IAAA;AAClD,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,EAAA;AAAA,QACA,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,MAAA,EAAQ,IAAA;AAAA,QACR,aAAA,EAAe,IAAA;AAAA,QACf;AAAA,OACF;AAEA,MAAA,OAAO,UAAA;AAAA,QACL,aAAA,GACI,sBAAsB,QAAA,CAAS,IAAA,IAAQ,EAAE,CAAA,uIAAA,CAAA,GACzC,CAAA,mBAAA,EAAsB,QAAA,CAAS,IAAA,IAAQ,EAAE,CAAA,4DAAA,CAAA;AAAA,QAC7C;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE;AAAA,GACjE;AAIA,EAAA,GAAA;AAAA,IACE,0BAAA;AAAA,IACA,uOAAA;AAAA,IACA,EAAE,IAAA,EAAM,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,mDAAkD,EAAE;AAAA,IAC3F,EAAC;AAAA,IACD,OAAO,IAAA,KAAS;AACd,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,EAAiB,OAAO,YAAY,sCAAsC,CAAA;AACvF,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,SAAY,MAAA,GAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AAChE,MAAA,MAAM,OAAA,CAAQ,gBAAgB,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,MAAM,CAAA;AAChE,MAAA,MAAM,GAAA,GAAM,EAAE,aAAA,EAAe,IAAA,EAAe,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAK,EAAG;AACpF,MAAA,OAAO,UAAA;AAAA,QACL,oIAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,MAAA,EAAW,mBAAmB,IAAA,CAAK,IAAA,GAAO,CAAA,EAAA,EAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE;AAAA,GAC1F;AAOA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,QAAQ,KAAA,IAAS,UAAA;AAAA,IACxB,SAAS,MAAM;AACb,MAAA,KAAA,MAAW,CAAA,IAAK,SAAA,CAAU,MAAA,CAAO,CAAC,GAAG,CAAA,EAAE;AAAA,IACzC;AAAA,GACF;AACF","file":"chunk-PV4FZDYX.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 * Bridge for `@particle-academy/fancy-passkeys-ui` — the **management** half of\n * a passkey (WebAuthn) surface, and only that half.\n *\n * ## The absence is the design\n *\n * There is **no tool here that completes an authentication or registration\n * ceremony**, and there must never be one. Not `passkey_authenticate`, not\n * `passkey_sign_in`, not `passkey_complete`, not a \"headless\" variant behind a\n * flag.\n *\n * The reason is construction, not policy. `navigator.credentials.get()` requires\n * a user gesture and a biometric or PIN — both things only the person at the\n * keyboard has. An agent-drivable passkey login would be a bypass of the exact\n * property that makes a passkey worth more than a password: that possession of\n * the credential cannot be delegated, replayed, or phished. A bridge offering\n * one would quietly turn a phishing-resistant factor back into a bearer token.\n *\n * So the boundary sits where the cryptography already puts it, and the tool set\n * is drawn to match: **read the management surface, rename, propose, ask the\n * human to start a ceremony.** `bridges/__tests__/passkeys.test.ts` asserts the\n * registered tool names against a closed list, so \"finishing\" this bridge with a\n * sign-in tool fails CI rather than shipping.\n *\n * ## What it does do\n *\n * passkey_list the user's credentials (whitelisted fields only)\n * passkey_status browser support + what the surface currently shows\n * passkey_rename relabel one credential, by credential ID (undoable)\n * passkey_revoke **STAGES** a revoke for the human to confirm\n * passkey_begin_enrollment opens the enrollment prompt; returns immediately\n *\n * `passkey_revoke` never revokes. Revoking a passkey is destructive and revoking\n * the last one is a lockout, so the confirming click comes from the human at the\n * surface — there is deliberately **no `pendingMode: false`**, no `confirm: true`\n * argument, and no host hook that turns staging off. On this bridge staging is\n * not a mode.\n *\n * The adapter type is declared LOCALLY (like `features` / `catalog`) so the\n * bridge builds and type-checks with the sibling package absent. A host wiring a\n * live `PasskeyManager` satisfies it structurally, with no import.\n */\n\n/**\n * One credential as the bridge is willing to describe it — the `PasskeySummary`\n * shape both passkey backends already serialise.\n *\n * Everything the server stores that is NOT on this list — the COSE public key,\n * the user handle, the signature counter, the attestation statement and trust\n * path — is absent on purpose, and {@link toSummary} re-projects onto exactly\n * these keys rather than trusting the adapter to have withheld them. A host that\n * hands `list()` its raw ORM model (the obvious thing to do) therefore cannot\n * leak credential material through an MCP tool by accident.\n */\nexport type PasskeySummaryLike = {\n /** base64url credential ID — the handle every action here is keyed by. */\n id: string;\n /** Human-chosen label, or null when the user never named it. */\n name: string | null;\n /** ISO-8601. */\n createdAt: string;\n /** ISO-8601, or null when never used to sign in. */\n lastUsedAt: string | null;\n /** Transport hints (\"internal\", \"hybrid\", \"usb\", …). */\n transports: string[];\n /** True for a synced passkey (BE/BS flags); false means this device only. */\n backedUp: boolean;\n /** Authenticator model id. Stored, never a trust decision. */\n aaguid: string;\n /** ISO-8601 when the signature counter regressed — a suspected clone. */\n clonedAt: string | null;\n};\n\n/** What the browser can do, as the three `./client` predicates report it. */\nexport type PasskeySupport = {\n supported: boolean;\n /** Touch ID / Windows Hello present? `null` while unknown. */\n platformAuthenticator?: boolean | null;\n /** Can the browser offer a passkey from a username field? `null` while unknown. */\n conditionalUi?: boolean | null;\n};\n\n/** A read of what the management surface is currently showing. */\nexport type PasskeySurfaceState = {\n status?: \"idle\" | \"busy\" | \"error\";\n /** `{ code, message }` as carried in surface state — never an Error. */\n error?: { code: string; message: string } | null;\n /** The revoke awaiting a human's confirmation, if any. */\n pendingRevoke?: { id: string; isLastPasskey: boolean } | null;\n /** Credential ID currently being renamed, if any. */\n renamingId?: string | null;\n};\n\n/**\n * Host-provided access to the management surface. Mirrors the props a\n * `PasskeyManager` is already wired with, so a host usually passes the same four\n * callbacks it passed the component.\n */\nexport type PasskeyBridgeAdapter = {\n /** Stable id for this surface instance. Surfaces in activity logs. */\n id?: string;\n title?: string;\n screenId?: string;\n\n /** The signed-in user's credentials. */\n list(): PasskeySummaryLike[] | Promise<PasskeySummaryLike[]>;\n\n /** Relabel one credential. Cosmetic, reversible, and undoable here. */\n rename(input: { id: string; name: string }): void | Promise<void>;\n\n /**\n * **Stage** a revoke for human confirmation — the `pendingRevoke` the surface\n * renders a confirm/cancel dialog for. It must NOT revoke; a host that wires\n * this to a delete call has removed the human from the loop the bridge was\n * built around.\n */\n proposeRevoke(input: { id: string }): PasskeyProposal | Promise<PasskeyProposal>;\n\n /**\n * Open the enrollment prompt on the human's screen and return immediately.\n * The ceremony completes on their authenticator or not at all.\n */\n beginEnrollment?(input: { name?: string }): void | Promise<void>;\n\n /** Browser capability flags, if the host tracks them. */\n support?(): PasskeySupport | Promise<PasskeySupport>;\n\n /** What the surface currently shows. */\n state?(): PasskeySurfaceState | Promise<PasskeySurfaceState>;\n};\n\nexport type PasskeyProposal = { staged: true; isLastPasskey: boolean };\n\nexport type PasskeyBridgeOptions = {\n adapter: PasskeyBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n /**\n * Also route `passkey_rename` through {@link confirm}. Off by default: a\n * rename is cosmetic, reversible and pushed onto the undo stack. Worth turning\n * on where the label itself carries trust — a rogue credential relabelled\n * \"Avery's iPhone\" survives a human's audit of the list.\n */\n confirmRename?: boolean;\n /**\n * Host confirmation hook for renames, when {@link confirmRename} is on.\n *\n * Note there is no revoke case: a revoke is staged into the surface and\n * confirmed there, never through a hook the agent's own host supplies.\n */\n confirm?: (req: { action: \"passkey_rename\"; id: string; name: string }) => boolean | Promise<boolean>;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\n\n/**\n * Project an adapter record onto exactly the public summary fields.\n *\n * Deliberately a whitelist and not a `delete` of known-bad keys: a blacklist has\n * to be updated every time a backend grows a column, and the failure mode of\n * forgetting is silently publishing credential material to every agent in the\n * session.\n */\nfunction toSummary(record: PasskeySummaryLike): PasskeySummaryLike {\n return {\n id: str(record?.id),\n name: typeof record?.name === \"string\" ? record.name : null,\n createdAt: str(record?.createdAt),\n lastUsedAt: typeof record?.lastUsedAt === \"string\" ? record.lastUsedAt : null,\n transports: Array.isArray(record?.transports) ? record.transports.map((t) => String(t)) : [],\n backedUp: record?.backedUp === true,\n aaguid: str(record?.aaguid),\n clonedAt: typeof record?.clonedAt === \"string\" ? record.clonedAt : null,\n };\n}\n\n/**\n * The complete set of tools this bridge may ever register.\n *\n * Exported so the test suite — and anyone auditing what an agent can reach —\n * can assert the registered names against it rather than eyeballing the file.\n */\nexport const PASSKEY_BRIDGE_TOOLS = [\n \"passkey_list\",\n \"passkey_status\",\n \"passkey_rename\",\n \"passkey_revoke\",\n \"passkey_begin_enrollment\",\n] as const;\n\n/**\n * registerPasskeyBridge — MCP tools over a passkey **management** surface.\n *\n * Read the credential list, read browser support and surface state, rename a\n * credential, propose a revoke for the human to confirm, and ask for an\n * enrollment prompt. Nothing signs anyone in; see the file header for why that\n * is a property rather than a gap.\n */\nexport function registerPasskeyBridge(host: ToolHost, options: PasskeyBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const surfaceId = adapter.id ?? \"passkeys\";\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 = `passkeys:${surfaceId}`;\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 ?? surfaceId,\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 {\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 const findById = async (id: string): Promise<PasskeySummaryLike | null> =>\n (await adapter.list()).map(toSummary).find((p) => p.id === id) ?? null;\n\n // ─── Read ────────────────────────────────────────────────────────────────\n\n reg(\n \"passkey_list\",\n \"List the signed-in user's passkeys: credential id, label, when it was added and last used, transports, whether it is a synced passkey, and whether the server flagged it as a possible clone. Read-only. Public keys, user handles and signature counters are never returned.\",\n {},\n [],\n async () => {\n const passkeys = (await adapter.list()).map(toSummary);\n return textResult(JSON.stringify(passkeys, null, 2), { passkeys, count: passkeys.length });\n },\n false,\n );\n\n reg(\n \"passkey_status\",\n \"Read what this browser can do (passkey support, a built-in authenticator, autofill sign-in) and what the management surface is currently showing (busy/error, a revoke awaiting confirmation, a rename in progress).\",\n {},\n [],\n async () => {\n const support = adapter.support ? await adapter.support() : null;\n const state = adapter.state ? await adapter.state() : null;\n const out = {\n support,\n state,\n // Said in the payload, not only in the docs: an agent reading this to\n // work out \"how do I sign the user in\" should find the answer here.\n canCompleteCeremony: false,\n note: \"A passkey ceremony needs a user gesture and a biometric or PIN. No tool on this bridge can perform one; ask the human to complete it on their device.\",\n };\n return textResult(JSON.stringify(out, null, 2), out);\n },\n false,\n );\n\n // ─── Rename (undoable) ───────────────────────────────────────────────────\n\n reg(\n \"passkey_rename\",\n \"Rename one passkey, by credential id (from passkey_list). Cosmetic and undoable with agent_undo.\",\n {\n id: { type: \"string\", description: \"base64url credential id.\" },\n name: { type: \"string\", description: \"New label, e.g. 'MacBook Touch ID'. Empty string clears it.\" },\n },\n [\"id\", \"name\"],\n async (args) => {\n const id = str(args.id);\n const name = str(args.name);\n if (!id) return errorResult(\"id is required.\");\n\n const existing = await findById(id);\n if (!existing) return errorResult(`No passkey with id ${id}.`);\n\n if (options.confirmRename) {\n if (!options.confirm) {\n return errorResult(\n \"passkey_rename requires confirmation (confirmRename), but the host wired no confirm hook.\",\n );\n }\n const ok = await options.confirm({ action: \"passkey_rename\", id, name });\n if (!ok) return errorResult(`Declined: rename ${id} (human did not confirm).`);\n }\n\n const previous = existing.name ?? \"\";\n await adapter.rename({ id, name });\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: surfaceId,\n action: \"passkey_rename\",\n label: `Renamed passkey to ${name || \"(unnamed)\"}`,\n undo: async () => { await adapter.rename({ id, name: previous }); },\n redo: async () => { await adapter.rename({ id, name }); },\n });\n\n return textResult(`Renamed passkey ${id} to ${name || \"(unnamed)\"}`, { id, name, previous });\n },\n (args) => target(str(args.id), `rename ${str(args.id)}`),\n );\n\n // ─── Revoke — PROPOSAL ONLY ──────────────────────────────────────────────\n\n reg(\n \"passkey_revoke\",\n \"PROPOSE revoking one passkey. This does NOT revoke it: the request is staged on the surface and the human confirms or cancels there. Revoking the last passkey can lock the user out, and the response says when that is the case so you can tell them before they confirm.\",\n { id: { type: \"string\", description: \"base64url credential id.\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n if (!id) return errorResult(\"id is required.\");\n\n const existing = await findById(id);\n if (!existing) return errorResult(`No passkey with id ${id}.`);\n\n const proposal = await adapter.proposeRevoke({ id });\n const isLastPasskey = proposal?.isLastPasskey === true;\n const out = {\n id,\n name: existing.name,\n staged: true as const,\n awaitingHuman: true as const,\n isLastPasskey,\n };\n\n return textResult(\n isLastPasskey\n ? `Staged a revoke of ${existing.name ?? id}. This is the account's LAST passkey — confirming it removes passkey sign-in entirely. Waiting for the human to confirm or cancel.`\n : `Staged a revoke of ${existing.name ?? id}. Waiting for the human to confirm or cancel on the surface.`,\n out,\n );\n },\n (args) => target(str(args.id), `propose revoke ${str(args.id)}`),\n );\n\n // ─── Enrollment — opens the prompt, never completes it ───────────────────\n\n reg(\n \"passkey_begin_enrollment\",\n \"Ask the surface to start enrolling a new passkey. This only opens the prompt: the ceremony completes on the human's authenticator (Touch ID, Windows Hello, phone, security key) or it does not complete at all. Returns immediately.\",\n { name: { type: \"string\", description: \"Optional label to pre-fill for the new passkey.\" } },\n [],\n async (args) => {\n if (!adapter.beginEnrollment) return errorResult(\"Host did not wire beginEnrollment().\");\n const name = args.name === undefined ? undefined : str(args.name);\n await adapter.beginEnrollment(name === undefined ? {} : { name });\n const out = { awaitingHuman: true as const, ...(name === undefined ? {} : { name }) };\n return textResult(\n \"Enrollment prompt opened. The human has to complete it on their authenticator — there is no tool that can finish it for them.\",\n out,\n );\n },\n (args) => target(undefined, `begin enrollment${args.name ? ` (${str(args.name)})` : \"\"}`),\n );\n\n // ── There is deliberately NO tool below that completes a ceremony. ────────\n // No passkey_authenticate, no passkey_sign_in, no passkey_complete, no\n // passkey_assert. Do not \"finish\" this bridge by adding one — see the header,\n // and see the closed-tool-list test that will fail if you do.\n\n return {\n id: bridgeId,\n title: adapter.title ?? \"Passkeys\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\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/map.ts
6
6
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -11,6 +11,7 @@ function registerMapBridge(host, options) {
11
11
  const { adapter } = options;
12
12
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
13
13
  const disposers = [];
14
+ const bridgeId = "map";
14
15
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
15
16
  const mTarget = (args, result) => ({
16
17
  kind: "map",
@@ -42,7 +43,8 @@ function registerMapBridge(host, options) {
42
43
  additionalProperties: false
43
44
  }
44
45
  },
45
- final
46
+ final,
47
+ { owner: bridgeId }
46
48
  )
47
49
  );
48
50
  };
@@ -321,7 +323,7 @@ function registerMapBridge(host, options) {
321
323
  }
322
324
  );
323
325
  return {
324
- id: "map",
326
+ id: bridgeId,
325
327
  title: "Map",
326
328
  dispose: () => {
327
329
  for (const d of disposers) d();
@@ -330,5 +332,5 @@ function registerMapBridge(host, options) {
330
332
  }
331
333
 
332
334
  export { registerMapBridge };
333
- //# sourceMappingURL=chunk-3UUF5KKZ.js.map
334
- //# sourceMappingURL=chunk-3UUF5KKZ.js.map
335
+ //# sourceMappingURL=chunk-QEVSNDJW.js.map
336
+ //# sourceMappingURL=chunk-QEVSNDJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/map.ts"],"names":[],"mappings":"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","file":"chunk-QEVSNDJW.js","sourcesContent":["// Loose types so this bridge builds standalone without a hard dep on\n// @particle-academy/fancy-map. Hosts that use fancy-map pass its own\n// MapMarker / MapView values straight through — the shapes match.\ntype LatLng = { lat: number; lng: number };\ntype MapView = { center: LatLng; zoom: number; bearing?: number; pitch?: number };\ntype MapMarker = {\n id: string;\n position: LatLng;\n label?: string;\n color?: string;\n icon?: string;\n draggable?: boolean;\n data?: Record<string, unknown>;\n};\n\nimport { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget as MapAgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Adapter the host provides — getters/setters over the SAME controlled state it\n * passes to fancy-map's `<Map>` (view, markers, selection), plus optional\n * `fitBounds` (from the map's onReady handle) and `setFollow` (drives the map's\n * `follow` prop so an agent can make the camera track a moving marker).\n */\nexport type MapBridgeAdapter = {\n getView: () => MapView;\n setView: (next: MapView) => void;\n getMarkers: () => MapMarker[];\n setMarkers: (next: MapMarker[] | ((prev: MapMarker[]) => MapMarker[])) => void;\n getSelected: () => string | null;\n setSelected: (id: string | null) => void;\n /** Fit the camera to points (wire to the `MapHandle.fitBounds` from `<Map onReady>`). */\n fitBounds?: (points: LatLng[], padding?: number) => void;\n /** Make the camera follow a marker as it moves (drives the map's `follow` prop). */\n setFollow?: (id: string | null) => void;\n};\n\nexport type MapBridgeOptions = {\n adapter: MapBridgeAdapter;\n /** Identity tagged onto agent-authored markers. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\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 newId = (prefix: string) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerMapBridge — an MCP tool set over a fancy-map `<Map>`'s controlled\n * state, so a human and an agent cohabit one map. The agent moves the camera,\n * drops/updates/removes markers, selects, fits bounds, and follows a live\n * track; every mutation broadcasts AgentActivity (for presence) and pushes an\n * undo entry (so the human can step the agent back). Mirrors the whiteboard /\n * flow bridges in shape.\n */\nexport function registerMapBridge(host: ToolHost, options: MapBridgeOptions): 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 = \"map\";\n\n // Register agent_undo / agent_redo / agent_history once per host. Idempotent.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const mTarget = (args: any, result: any): MapAgentTarget => ({\n kind: \"map\",\n elementId:\n (result?.structuredContent?.id as string | undefined) ?? (args?.id as string | undefined),\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n resolveTarget?: (args: JsonObject, result: any) => MapAgentTarget | 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: \"map\",\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: properties as any,\n required,\n additionalProperties: false,\n },\n },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n // ───────────── Read ─────────────\n\n reg(\"map_get_state\", \"Get the map's camera, markers, and current selection.\", {}, [], () => {\n const state = {\n view: adapter.getView(),\n markers: adapter.getMarkers(),\n selectedId: adapter.getSelected(),\n };\n return textResult(JSON.stringify(state, null, 2), state);\n });\n\n // ───────────── Camera ─────────────\n\n reg(\n \"map_set_view\",\n \"Move the camera to an absolute position. Any omitted field is left unchanged.\",\n {\n lat: { type: \"number\", description: \"New center latitude.\" },\n lng: { type: \"number\", description: \"New center longitude.\" },\n zoom: { type: \"number\", description: \"New zoom level (higher = closer).\" },\n },\n [],\n (args) => {\n const prev = adapter.getView();\n const next: MapView = {\n center: {\n lat: args.lat !== undefined ? num(args.lat) : prev.center.lat,\n lng: args.lng !== undefined ? num(args.lng) : prev.center.lng,\n },\n zoom: args.zoom !== undefined ? num(args.zoom) : prev.zoom,\n };\n adapter.setView(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_set_view\",\n label: `Moved camera to ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)} z${next.zoom}`,\n undo: () => adapter.setView(prev),\n redo: () => adapter.setView(next),\n });\n return textResult(`Camera → ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)} z${next.zoom}`, next);\n },\n mTarget,\n );\n\n reg(\n \"map_pan\",\n \"Pan the camera by a relative offset in degrees (positive dLat = north, positive dLng = east).\",\n { dLat: { type: \"number\" }, dLng: { type: \"number\" } },\n [],\n (args) => {\n const prev = adapter.getView();\n const next: MapView = {\n ...prev,\n center: { lat: prev.center.lat + num(args.dLat), lng: prev.center.lng + num(args.dLng) },\n };\n adapter.setView(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_pan\",\n label: \"Panned camera\",\n undo: () => adapter.setView(prev),\n redo: () => adapter.setView(next),\n });\n return textResult(`Panned to ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)}`, next);\n },\n mTarget,\n );\n\n reg(\n \"map_zoom\",\n \"Zoom the camera by a relative delta (e.g. +1 zooms in one level, -2 out two).\",\n { delta: { type: \"number\" } },\n [\"delta\"],\n (args) => {\n const prev = adapter.getView();\n const next: MapView = { ...prev, zoom: prev.zoom + num(args.delta) };\n adapter.setView(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_zoom\",\n label: `Zoom → ${next.zoom}`,\n undo: () => adapter.setView(prev),\n redo: () => adapter.setView(next),\n });\n return textResult(`Zoom → ${next.zoom}`, next);\n },\n );\n\n reg(\n \"map_fit_bounds\",\n \"Fit the camera to enclose points. Pass `points`, or omit to fit all current markers.\",\n {\n points: {\n type: \"array\",\n description: \"Points to enclose, e.g. [{lat,lng},…].\",\n items: {\n type: \"object\",\n properties: { lat: { type: \"number\" }, lng: { type: \"number\" } },\n required: [\"lat\", \"lng\"],\n },\n },\n padding: { type: \"number\", description: \"Padding in pixels (default 40).\" },\n },\n [],\n (args) => {\n if (!adapter.fitBounds) {\n return errorResult(\"Host did not wire fitBounds (pass the <Map onReady> handle's fitBounds).\");\n }\n const points: LatLng[] = Array.isArray(args.points)\n ? (args.points as any[]).map((p) => ({ lat: num(p?.lat), lng: num(p?.lng) }))\n : adapter.getMarkers().map((m) => m.position);\n if (!points.length) {\n return errorResult(\"No points to fit (map has no markers).\");\n }\n adapter.fitBounds(points, args.padding !== undefined ? num(args.padding) : undefined);\n return textResult(`Fit camera to ${points.length} point(s).`);\n },\n );\n\n // ───────────── Markers ─────────────\n\n reg(\n \"map_add_marker\",\n \"Drop a marker. `id` is optional (auto-generated); `icon` is an emoji or 1–2 chars.\",\n {\n id: { type: \"string\" },\n lat: { type: \"number\" },\n lng: { type: \"number\" },\n label: { type: \"string\" },\n color: { type: \"string\", description: \"CSS color, e.g. #2563eb.\" },\n icon: { type: \"string\", description: \"Emoji / short text in the pin.\" },\n draggable: { type: \"boolean\" },\n data: { type: \"object\", description: \"Arbitrary JSON payload carried with the marker.\" },\n },\n [\"lat\", \"lng\"],\n (args) => {\n const id = args.id ? str(args.id) : newId(\"m\");\n if (adapter.getMarkers().some((m) => m.id === id)) {\n return errorResult(`A marker with id ${id} already exists — use map_update_marker.`);\n }\n const marker: MapMarker = {\n id,\n position: { lat: num(args.lat), lng: num(args.lng) },\n ...(args.label !== undefined ? { label: str(args.label) } : {}),\n ...(args.color !== undefined ? { color: str(args.color) } : {}),\n ...(args.icon !== undefined ? { icon: str(args.icon) } : {}),\n ...(args.draggable !== undefined ? { draggable: !!args.draggable } : {}),\n ...(args.data && typeof args.data === \"object\"\n ? { data: args.data as Record<string, unknown> }\n : {}),\n };\n adapter.setMarkers((all) => [...all, marker]);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_add_marker\",\n label: `Added marker ${id}`,\n undo: () => adapter.setMarkers((all) => all.filter((m) => m.id !== id)),\n redo: () => adapter.setMarkers((all) => [...all, marker]),\n });\n return textResult(`Added marker ${id} at ${marker.position.lat.toFixed(4)},${marker.position.lng.toFixed(4)}`, marker);\n },\n mTarget,\n );\n\n reg(\n \"map_update_marker\",\n \"Update a marker. Only provided fields change — update lat/lng repeatedly to drive a live track.\",\n {\n id: { type: \"string\" },\n lat: { type: \"number\" },\n lng: { type: \"number\" },\n label: { type: \"string\" },\n color: { type: \"string\" },\n icon: { type: \"string\" },\n draggable: { type: \"boolean\" },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const prev = adapter.getMarkers().find((m) => m.id === id);\n if (!prev) {\n return errorResult(`No marker with id ${id}`);\n }\n const next: MapMarker = {\n ...prev,\n position: {\n lat: args.lat !== undefined ? num(args.lat) : prev.position.lat,\n lng: args.lng !== undefined ? num(args.lng) : prev.position.lng,\n },\n ...(args.label !== undefined ? { label: str(args.label) } : {}),\n ...(args.color !== undefined ? { color: str(args.color) } : {}),\n ...(args.icon !== undefined ? { icon: str(args.icon) } : {}),\n ...(args.draggable !== undefined ? { draggable: !!args.draggable } : {}),\n };\n adapter.setMarkers((all) => all.map((m) => (m.id === id ? next : m)));\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_update_marker\",\n label: `Updated marker ${id}`,\n undo: () => adapter.setMarkers((all) => all.map((m) => (m.id === id ? prev : m))),\n redo: () => adapter.setMarkers((all) => all.map((m) => (m.id === id ? next : m))),\n });\n return textResult(`Updated marker ${id}`, next);\n },\n mTarget,\n );\n\n reg(\n \"map_remove_marker\",\n \"Remove a marker by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const prev = adapter.getMarkers().find((m) => m.id === id);\n if (!prev) {\n return errorResult(`No marker with id ${id}`);\n }\n adapter.setMarkers((all) => all.filter((m) => m.id !== id));\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_remove_marker\",\n label: `Removed marker ${id}`,\n undo: () => adapter.setMarkers((all) => [...all, prev]),\n redo: () => adapter.setMarkers((all) => all.filter((m) => m.id !== id)),\n });\n return textResult(`Removed marker ${id}`);\n },\n mTarget,\n );\n\n reg(\n \"map_select\",\n \"Select a marker (or pass no id / null to clear the selection).\",\n { id: { type: \"string\" } },\n [],\n (args) => {\n const prev = adapter.getSelected();\n const id = args.id === undefined || args.id === null ? null : str(args.id);\n if (id !== null && !adapter.getMarkers().some((m) => m.id === id)) {\n return errorResult(`No marker with id ${id}`);\n }\n adapter.setSelected(id);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: \"map\",\n action: \"map_select\",\n label: id ? `Selected ${id}` : \"Cleared selection\",\n undo: () => adapter.setSelected(prev),\n redo: () => adapter.setSelected(id),\n });\n return textResult(id ? `Selected marker ${id}` : \"Cleared selection\", { selectedId: id });\n },\n mTarget,\n );\n\n // ───────────── Live tracking (camera follow) ─────────────\n\n reg(\n \"map_start_track\",\n \"Make the camera follow a marker as its position updates (live tracking). Requires the host to wire setFollow.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n if (!adapter.setFollow) {\n return errorResult(\"Host did not wire setFollow (pass the map's `follow` setter).\");\n }\n const id = str(args.id);\n if (!adapter.getMarkers().some((m) => m.id === id)) {\n return errorResult(`No marker with id ${id}`);\n }\n adapter.setFollow(id);\n return textResult(`Camera now following ${id}`, { follow: id });\n },\n mTarget,\n );\n\n reg(\n \"map_stop_track\",\n \"Stop following any marker (releases the camera). Requires the host to wire setFollow.\",\n {},\n [],\n () => {\n if (!adapter.setFollow) {\n return errorResult(\"Host did not wire setFollow.\");\n }\n adapter.setFollow(null);\n return textResult(\"Camera released (no longer following).\", { follow: null });\n },\n );\n\n return {\n id: bridgeId,\n title: \"Map\",\n dispose: () => {\n for (const d of disposers) d();\n },\n };\n}\n"]}