@particle-academy/agent-integrations 0.49.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +11 -0
  3. package/dist/bridges/artboard.d.cts +3 -3
  4. package/dist/bridges/artboard.d.ts +3 -3
  5. package/dist/bridges/catalog.d.cts +3 -3
  6. package/dist/bridges/catalog.d.ts +3 -3
  7. package/dist/bridges/charts.d.cts +3 -3
  8. package/dist/bridges/charts.d.ts +3 -3
  9. package/dist/bridges/cms.d.cts +3 -3
  10. package/dist/bridges/cms.d.ts +3 -3
  11. package/dist/bridges/code.d.cts +3 -3
  12. package/dist/bridges/code.d.ts +3 -3
  13. package/dist/bridges/doc.d.cts +3 -3
  14. package/dist/bridges/doc.d.ts +3 -3
  15. package/dist/bridges/features.d.cts +3 -3
  16. package/dist/bridges/features.d.ts +3 -3
  17. package/dist/bridges/files.d.cts +3 -3
  18. package/dist/bridges/files.d.ts +3 -3
  19. package/dist/bridges/flow.d.cts +3 -3
  20. package/dist/bridges/flow.d.ts +3 -3
  21. package/dist/bridges/forms.d.cts +3 -3
  22. package/dist/bridges/forms.d.ts +3 -3
  23. package/dist/bridges/git.d.cts +3 -3
  24. package/dist/bridges/git.d.ts +3 -3
  25. package/dist/bridges/grid.d.cts +3 -3
  26. package/dist/bridges/grid.d.ts +3 -3
  27. package/dist/bridges/map.d.cts +3 -3
  28. package/dist/bridges/map.d.ts +3 -3
  29. package/dist/bridges/navigation.d.cts +3 -3
  30. package/dist/bridges/navigation.d.ts +3 -3
  31. package/dist/bridges/passkeys.d.cts +3 -3
  32. package/dist/bridges/passkeys.d.ts +3 -3
  33. package/dist/bridges/scene.d.cts +3 -3
  34. package/dist/bridges/scene.d.ts +3 -3
  35. package/dist/bridges/screen-doc.d.cts +3 -3
  36. package/dist/bridges/screen-doc.d.ts +3 -3
  37. package/dist/bridges/screens.d.cts +3 -3
  38. package/dist/bridges/screens.d.ts +3 -3
  39. package/dist/bridges/sheets.d.cts +3 -3
  40. package/dist/bridges/sheets.d.ts +3 -3
  41. package/dist/bridges/slides.d.cts +3 -3
  42. package/dist/bridges/slides.d.ts +3 -3
  43. package/dist/bridges/terminal.d.cts +3 -3
  44. package/dist/bridges/terminal.d.ts +3 -3
  45. package/dist/bridges/tui.d.cts +2 -2
  46. package/dist/bridges/tui.d.ts +2 -2
  47. package/dist/bridges/whiteboard.d.cts +3 -3
  48. package/dist/bridges/whiteboard.d.ts +3 -3
  49. package/dist/bridges-artboard.cjs +11 -5
  50. package/dist/bridges-artboard.cjs.map +1 -1
  51. package/dist/bridges-artboard.js +6 -4
  52. package/dist/bridges-artboard.js.map +1 -1
  53. package/dist/bridges-catalog.cjs +35 -13
  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 +21 -11
  69. package/dist/bridges-features.cjs.map +1 -1
  70. package/dist/bridges-features.js +3 -3
  71. package/dist/bridges-files.cjs +11 -5
  72. package/dist/bridges-files.cjs.map +1 -1
  73. package/dist/bridges-files.js +3 -3
  74. package/dist/bridges-flow.cjs +11 -5
  75. package/dist/bridges-flow.cjs.map +1 -1
  76. package/dist/bridges-flow.js +6 -4
  77. package/dist/bridges-flow.js.map +1 -1
  78. package/dist/bridges-forms.cjs +11 -5
  79. package/dist/bridges-forms.cjs.map +1 -1
  80. package/dist/bridges-forms.js +3 -3
  81. package/dist/bridges-git.cjs +10 -5
  82. package/dist/bridges-git.cjs.map +1 -1
  83. package/dist/bridges-git.js +3 -3
  84. package/dist/bridges-grid.cjs +11 -5
  85. package/dist/bridges-grid.cjs.map +1 -1
  86. package/dist/bridges-grid.js +3 -3
  87. package/dist/bridges-map.cjs +11 -5
  88. package/dist/bridges-map.cjs.map +1 -1
  89. package/dist/bridges-map.js +3 -3
  90. package/dist/bridges-navigation.cjs +15 -9
  91. package/dist/bridges-navigation.cjs.map +1 -1
  92. package/dist/bridges-navigation.js +3 -3
  93. package/dist/bridges-passkeys.cjs +17 -7
  94. package/dist/bridges-passkeys.cjs.map +1 -1
  95. package/dist/bridges-passkeys.js +3 -3
  96. package/dist/bridges-scene.cjs +11 -5
  97. package/dist/bridges-scene.cjs.map +1 -1
  98. package/dist/bridges-scene.js +3 -3
  99. package/dist/bridges-screen-doc.cjs +14 -6
  100. package/dist/bridges-screen-doc.cjs.map +1 -1
  101. package/dist/bridges-screen-doc.js +4 -4
  102. package/dist/bridges-screens.cjs +11 -5
  103. package/dist/bridges-screens.cjs.map +1 -1
  104. package/dist/bridges-screens.js +3 -3
  105. package/dist/bridges-sheets.cjs +11 -5
  106. package/dist/bridges-sheets.cjs.map +1 -1
  107. package/dist/bridges-sheets.js +3 -3
  108. package/dist/bridges-slides.cjs +11 -5
  109. package/dist/bridges-slides.cjs.map +1 -1
  110. package/dist/bridges-slides.js +3 -3
  111. package/dist/bridges-terminal.cjs +11 -5
  112. package/dist/bridges-terminal.cjs.map +1 -1
  113. package/dist/bridges-terminal.js +3 -3
  114. package/dist/bridges-tui.cjs +1 -1
  115. package/dist/bridges-tui.cjs.map +1 -1
  116. package/dist/bridges-tui.js +2 -2
  117. package/dist/bridges-whiteboard.cjs +11 -5
  118. package/dist/bridges-whiteboard.cjs.map +1 -1
  119. package/dist/bridges-whiteboard.js +3 -3
  120. package/dist/{chunk-CZV3WUW5.js → chunk-3GFKC6OK.js} +20 -7
  121. package/dist/chunk-3GFKC6OK.js.map +1 -0
  122. package/dist/{chunk-JLHVQWOV.js → chunk-6Q3PMT7K.js} +4 -4
  123. package/dist/chunk-6Q3PMT7K.js.map +1 -0
  124. package/dist/{chunk-AXWMWYH5.js → chunk-C4AQ2YBW.js} +7 -6
  125. package/dist/chunk-C4AQ2YBW.js.map +1 -0
  126. package/dist/{chunk-CS3CHGYC.js → chunk-CI5ZVHDY.js} +32 -14
  127. package/dist/chunk-CI5ZVHDY.js.map +1 -0
  128. package/dist/{chunk-5ZWNCHZS.js → chunk-CKJL5C7A.js} +8 -6
  129. package/dist/chunk-CKJL5C7A.js.map +1 -0
  130. package/dist/{chunk-HOZCDDRA.js → chunk-CP3EHLZJ.js} +8 -6
  131. package/dist/chunk-CP3EHLZJ.js.map +1 -0
  132. package/dist/{chunk-VFWFT3OK.js → chunk-DNF3QVTW.js} +8 -6
  133. package/dist/chunk-DNF3QVTW.js.map +1 -0
  134. package/dist/{chunk-OHNGURUJ.js → chunk-HNVHAY4A.js} +12 -10
  135. package/dist/chunk-HNVHAY4A.js.map +1 -0
  136. package/dist/{chunk-GVTBMJU6.js → chunk-KAEPC6N4.js} +18 -12
  137. package/dist/chunk-KAEPC6N4.js.map +1 -0
  138. package/dist/{chunk-3WVXAB3D.js → chunk-M423JOQ3.js} +3 -3
  139. package/dist/{chunk-3WVXAB3D.js.map → chunk-M423JOQ3.js.map} +1 -1
  140. package/dist/{chunk-SWWJUOCY.js → chunk-MKC633WU.js} +3 -3
  141. package/dist/{chunk-SWWJUOCY.js.map → chunk-MKC633WU.js.map} +1 -1
  142. package/dist/{chunk-LQB42OSA.js → chunk-MKJE6V4Z.js} +8 -6
  143. package/dist/chunk-MKJE6V4Z.js.map +1 -0
  144. package/dist/{chunk-MIDZWKIF.js → chunk-NB5AQIR2.js} +8 -6
  145. package/dist/chunk-NB5AQIR2.js.map +1 -0
  146. package/dist/{chunk-VMRUW4B4.js → chunk-OUUHFR4N.js} +8 -6
  147. package/dist/chunk-OUUHFR4N.js.map +1 -0
  148. package/dist/{chunk-FCXSR7I5.js → chunk-P6SJBP5T.js} +8 -6
  149. package/dist/chunk-P6SJBP5T.js.map +1 -0
  150. package/dist/{chunk-5JLTXHX6.js → chunk-PMPBI6I3.js} +7 -5
  151. package/dist/chunk-PMPBI6I3.js.map +1 -0
  152. package/dist/{chunk-G6CRHFWU.js → chunk-PV4FZDYX.js} +14 -8
  153. package/dist/chunk-PV4FZDYX.js.map +1 -0
  154. package/dist/{chunk-3UUF5KKZ.js → chunk-QEVSNDJW.js} +8 -6
  155. package/dist/chunk-QEVSNDJW.js.map +1 -0
  156. package/dist/{chunk-VOCUGTZB.js → chunk-S4DA2UTJ.js} +8 -6
  157. package/dist/chunk-S4DA2UTJ.js.map +1 -0
  158. package/dist/{chunk-RVMM4BHK.js → chunk-V6EHKHSF.js} +8 -6
  159. package/dist/chunk-V6EHKHSF.js.map +1 -0
  160. package/dist/{chunk-36MKPTVD.js → chunk-VE7TRWZR.js} +8 -6
  161. package/dist/chunk-VE7TRWZR.js.map +1 -0
  162. package/dist/{chunk-Z5NL5D4J.js → chunk-VFUKZ6UA.js} +8 -6
  163. package/dist/chunk-VFUKZ6UA.js.map +1 -0
  164. package/dist/{chunk-3HVYUMQF.js → chunk-VHB3VE53.js} +8 -6
  165. package/dist/chunk-VHB3VE53.js.map +1 -0
  166. package/dist/{chunk-R4XXOGQH.js → chunk-ZDKYKJFH.js} +10 -6
  167. package/dist/chunk-ZDKYKJFH.js.map +1 -0
  168. package/dist/components-shared-whiteboard.cjs +29 -10
  169. package/dist/components-shared-whiteboard.cjs.map +1 -1
  170. package/dist/components-shared-whiteboard.js +3 -3
  171. package/dist/dom-navigation/index.d.cts +3 -3
  172. package/dist/dom-navigation/index.d.ts +3 -3
  173. package/dist/index.cjs +140 -64
  174. package/dist/index.cjs.map +1 -1
  175. package/dist/index.d.cts +5 -5
  176. package/dist/index.d.ts +5 -5
  177. package/dist/index.js +26 -26
  178. package/dist/mcp/index.d.cts +5 -5
  179. package/dist/mcp/index.d.ts +5 -5
  180. package/dist/mcp/stdio.d.cts +3 -3
  181. package/dist/mcp/stdio.d.ts +3 -3
  182. package/dist/mcp.cjs +18 -5
  183. package/dist/mcp.cjs.map +1 -1
  184. package/dist/mcp.js +1 -1
  185. package/dist/presence/index.d.cts +1 -1
  186. package/dist/presence/index.d.ts +1 -1
  187. package/dist/{server-1y0n61R5.d.cts → server-DJJygNo1.d.cts} +2 -2
  188. package/dist/{server-vq6qVl3T.d.ts → server-Dwo9LOxh.d.ts} +2 -2
  189. package/dist/sharing/index.d.cts +3 -3
  190. package/dist/sharing/index.d.ts +3 -3
  191. package/dist/sheets-adapter.d.cts +3 -3
  192. package/dist/sheets-adapter.d.ts +3 -3
  193. package/dist/{tool-host-LYfdPE8u.d.ts → tool-host-BBSaU7IJ.d.cts} +10 -4
  194. package/dist/{tool-host-D67N2a2h.d.cts → tool-host-BqJRPr_T.d.ts} +10 -4
  195. package/dist/{types-DP5yQZQU.d.cts → types-D_H2f-wF.d.cts} +1 -1
  196. package/dist/{types-VX_9je7w.d.ts → types-D_TzdBsK.d.ts} +1 -1
  197. package/dist/{types-gzIpsUDE.d.cts → types-ITRQFAir.d.cts} +26 -1
  198. package/dist/{types-gzIpsUDE.d.ts → types-ITRQFAir.d.ts} +26 -1
  199. package/dist/undo/index.d.cts +2 -2
  200. package/dist/undo/index.d.ts +2 -2
  201. package/dist/undo.cjs +7 -3
  202. package/dist/undo.cjs.map +1 -1
  203. package/dist/undo.js +3 -3
  204. package/package.json +1 -1
  205. package/dist/chunk-36MKPTVD.js.map +0 -1
  206. package/dist/chunk-3HVYUMQF.js.map +0 -1
  207. package/dist/chunk-3UUF5KKZ.js.map +0 -1
  208. package/dist/chunk-5JLTXHX6.js.map +0 -1
  209. package/dist/chunk-5ZWNCHZS.js.map +0 -1
  210. package/dist/chunk-AXWMWYH5.js.map +0 -1
  211. package/dist/chunk-CS3CHGYC.js.map +0 -1
  212. package/dist/chunk-CZV3WUW5.js.map +0 -1
  213. package/dist/chunk-FCXSR7I5.js.map +0 -1
  214. package/dist/chunk-G6CRHFWU.js.map +0 -1
  215. package/dist/chunk-GVTBMJU6.js.map +0 -1
  216. package/dist/chunk-HOZCDDRA.js.map +0 -1
  217. package/dist/chunk-JLHVQWOV.js.map +0 -1
  218. package/dist/chunk-LQB42OSA.js.map +0 -1
  219. package/dist/chunk-MIDZWKIF.js.map +0 -1
  220. package/dist/chunk-OHNGURUJ.js.map +0 -1
  221. package/dist/chunk-R4XXOGQH.js.map +0 -1
  222. package/dist/chunk-RVMM4BHK.js.map +0 -1
  223. package/dist/chunk-VFWFT3OK.js.map +0 -1
  224. package/dist/chunk-VMRUW4B4.js.map +0 -1
  225. package/dist/chunk-VOCUGTZB.js.map +0 -1
  226. package/dist/chunk-Z5NL5D4J.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -60,13 +60,23 @@ var ToolRegistry = class {
60
60
  */
61
61
  this.withdrawn = /* @__PURE__ */ new Set();
62
62
  }
63
- registerTool(definition, handler) {
64
- this.tools.set(definition.name, { definition, handler });
65
- this.withdrawn.delete(definition.name);
63
+ registerTool(definition, handler, options = {}) {
64
+ const name = definition.name;
65
+ const { owner, replace = false } = options;
66
+ const held = this.tools.get(name);
67
+ if (held && !replace && (owner === void 0 || held.owner !== owner)) {
68
+ throw new Error(
69
+ `Tool "${name}" is already registered by ${describeOwner(held.owner)}; ${describeOwner(owner)} cannot register it too. Two registrants for one name would leave the first one listed but unreachable. Give one of them a different tool name, dispose the first registration, or pass { replace: true } to take the name over deliberately.`
70
+ );
71
+ }
72
+ const record = owner === void 0 ? { definition, handler } : { definition, handler, owner };
73
+ this.tools.set(name, record);
74
+ this.withdrawn.delete(name);
66
75
  this.onToolsChanged();
67
76
  return () => {
68
- if (this.tools.delete(definition.name)) {
69
- this.withdrawn.add(definition.name);
77
+ if (this.tools.get(name) === record) {
78
+ this.tools.delete(name);
79
+ this.withdrawn.add(name);
70
80
  this.onToolsChanged();
71
81
  }
72
82
  };
@@ -95,6 +105,9 @@ var ToolRegistry = class {
95
105
  onToolsChanged() {
96
106
  }
97
107
  };
108
+ function describeOwner(owner) {
109
+ return owner === void 0 ? "an unnamed registrant (pass { owner } to registerTool to identify it)" : `"${owner}"`;
110
+ }
98
111
 
99
112
  // src/mcp/server.ts
100
113
  var MicroMcpServer = class extends ToolRegistry {
@@ -434,7 +447,7 @@ function registerTuiBridge(host, options) {
434
447
  } catch (error) {
435
448
  return errorResult(error instanceof Error ? error.message : String(error));
436
449
  }
437
- }));
450
+ }, { owner: "tui" }));
438
451
  };
439
452
  const publish = async (surfaceId, type, payload, actor = defaultActor, priority = "normal") => options.eventStore.append({ appId: options.appId, sessionId: options.sessionId, surfaceId, type, payload, actor, priority });
440
453
  register("tui_surfaces_list", "List addressable Fancy TUI surfaces and commands.", {}, [], () => options.registry.list().map((surface) => ({ id: surface.id, kind: surface.kind, label: surface.label, commands: surface.commands?.map((command) => ({ name: command.name, description: command.description, policy: command.policy ?? "execute", inputSchema: command.inputSchema })) ?? [] })));
@@ -514,6 +527,7 @@ function registerTuiBridge(host, options) {
514
527
 
515
528
  // src/undo/undo-tools.ts
516
529
  var installedHosts = /* @__PURE__ */ new WeakSet();
530
+ var UNDO_TOOLS_OWNER = "agent-undo";
517
531
  function ensureUndoToolsRegistered(host, options = {}) {
518
532
  if (installedHosts.has(host)) return;
519
533
  installedHosts.add(host);
@@ -538,7 +552,8 @@ function registerUndoTools(host, options = {}) {
538
552
  const entry = await fancyAutoCommon.undoOne(agentOf(args));
539
553
  if (!entry) return errorResult("Nothing to undo.");
540
554
  return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
541
- }
555
+ },
556
+ { owner: UNDO_TOOLS_OWNER }
542
557
  )
543
558
  );
544
559
  disposers.push(
@@ -556,7 +571,8 @@ function registerUndoTools(host, options = {}) {
556
571
  const entry = await fancyAutoCommon.redoOne(agentOf(args));
557
572
  if (!entry) return errorResult("Nothing to redo.");
558
573
  return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
559
- }
574
+ },
575
+ { owner: UNDO_TOOLS_OWNER }
560
576
  )
561
577
  );
562
578
  disposers.push(
@@ -574,7 +590,8 @@ function registerUndoTools(host, options = {}) {
574
590
  const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
575
591
  const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
576
592
  return textResult(text || "(empty)", history);
577
- }
593
+ },
594
+ { owner: UNDO_TOOLS_OWNER }
578
595
  )
579
596
  );
580
597
  return () => disposers.forEach((d) => d());
@@ -595,6 +612,7 @@ function registerFormBridge(host, options) {
595
612
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
596
613
  const pendingMode = options.pendingMode ?? true;
597
614
  const disposers = [];
615
+ const bridgeId = `form:${adapter.id}`;
598
616
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
599
617
  const formId = adapter.id;
600
618
  const target = (args) => ({
@@ -625,7 +643,8 @@ function registerFormBridge(host, options) {
625
643
  description,
626
644
  inputSchema: { type: "object", properties, required, additionalProperties: false }
627
645
  },
628
- final
646
+ final,
647
+ { owner: bridgeId }
629
648
  )
630
649
  );
631
650
  };
@@ -743,7 +762,7 @@ function registerFormBridge(host, options) {
743
762
  true
744
763
  );
745
764
  return {
746
- id: `form:${formId}`,
765
+ id: bridgeId,
747
766
  title: adapter.title ?? formId,
748
767
  dispose: () => {
749
768
  for (const d of disposers) d();
@@ -757,6 +776,7 @@ function registerSheetsBridge(host, options) {
757
776
  const { adapter } = options;
758
777
  const agent = { ...DEFAULT_AGENT2, ...options.agent ?? {} };
759
778
  const disposers = [];
779
+ const bridgeId = "sheets";
760
780
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
761
781
  const target = (sheetId, address) => ({
762
782
  kind: "sheet",
@@ -786,7 +806,8 @@ function registerSheetsBridge(host, options) {
786
806
  description,
787
807
  inputSchema: { type: "object", properties, required, additionalProperties: false }
788
808
  },
789
- final
809
+ final,
810
+ { owner: bridgeId }
790
811
  )
791
812
  );
792
813
  };
@@ -966,7 +987,7 @@ function registerSheetsBridge(host, options) {
966
987
  (args) => target(getSheetId(args), String(args.address ?? ""))
967
988
  );
968
989
  return {
969
- id: "sheets",
990
+ id: bridgeId,
970
991
  title: "Sheets",
971
992
  dispose: () => {
972
993
  for (const d of disposers) d();
@@ -1105,6 +1126,7 @@ function registerCodeBridge(host, options) {
1105
1126
  const { adapter } = options;
1106
1127
  const agent = { ...DEFAULT_AGENT3, ...options.agent ?? {} };
1107
1128
  const disposers = [];
1129
+ const bridgeId = `code:${adapter.id}`;
1108
1130
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1109
1131
  const target = {
1110
1132
  kind: "code",
@@ -1144,7 +1166,8 @@ function registerCodeBridge(host, options) {
1144
1166
  description,
1145
1167
  inputSchema: { type: "object", properties, required, additionalProperties: false }
1146
1168
  },
1147
- final
1169
+ final,
1170
+ { owner: bridgeId }
1148
1171
  )
1149
1172
  );
1150
1173
  };
@@ -1292,7 +1315,7 @@ function registerCodeBridge(host, options) {
1292
1315
  false
1293
1316
  );
1294
1317
  return {
1295
- id: `code:${adapter.id}`,
1318
+ id: bridgeId,
1296
1319
  title: adapter.title ?? adapter.id,
1297
1320
  dispose: () => {
1298
1321
  for (const d of disposers) d();
@@ -1306,6 +1329,7 @@ function registerChartsBridge(host, options) {
1306
1329
  const { adapter } = options;
1307
1330
  const agent = { ...DEFAULT_AGENT4, ...options.agent ?? {} };
1308
1331
  const disposers = [];
1332
+ const bridgeId = `chart:${adapter.id}`;
1309
1333
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1310
1334
  const target = {
1311
1335
  kind: "chart",
@@ -1331,7 +1355,8 @@ function registerChartsBridge(host, options) {
1331
1355
  disposers.push(
1332
1356
  host.registerTool(
1333
1357
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
1334
- final
1358
+ final,
1359
+ { owner: bridgeId }
1335
1360
  )
1336
1361
  );
1337
1362
  };
@@ -1407,7 +1432,7 @@ function registerChartsBridge(host, options) {
1407
1432
  true
1408
1433
  );
1409
1434
  return {
1410
- id: `chart:${adapter.id}`,
1435
+ id: bridgeId,
1411
1436
  title: adapter.title ?? adapter.id,
1412
1437
  dispose: () => {
1413
1438
  for (const d of disposers) d();
@@ -1421,6 +1446,7 @@ function registerGridBridge(host, options) {
1421
1446
  const { adapter } = options;
1422
1447
  const agent = { ...DEFAULT_AGENT5, ...options.agent ?? {} };
1423
1448
  const disposers = [];
1449
+ const bridgeId = `grid:${adapter.id}`;
1424
1450
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1425
1451
  const target = (part) => ({
1426
1452
  kind: "grid",
@@ -1450,7 +1476,8 @@ function registerGridBridge(host, options) {
1450
1476
  description,
1451
1477
  inputSchema: { type: "object", properties, required, additionalProperties: false }
1452
1478
  },
1453
- final
1479
+ final,
1480
+ { owner: bridgeId }
1454
1481
  )
1455
1482
  );
1456
1483
  };
@@ -1608,7 +1635,7 @@ function registerGridBridge(host, options) {
1608
1635
  );
1609
1636
  }
1610
1637
  return {
1611
- id: `grid:${adapter.id}`,
1638
+ id: bridgeId,
1612
1639
  title: adapter.title ?? adapter.id,
1613
1640
  dispose: () => {
1614
1641
  for (const d of disposers) d();
@@ -1623,6 +1650,7 @@ function registerSceneBridge(host, options) {
1623
1650
  const { adapter } = options;
1624
1651
  const agent = { ...DEFAULT_AGENT6, ...options.agent ?? {} };
1625
1652
  const disposers = [];
1653
+ const bridgeId = `scene:${adapter.id}`;
1626
1654
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1627
1655
  const target = (objectId) => ({
1628
1656
  kind: "scene",
@@ -1648,7 +1676,8 @@ function registerSceneBridge(host, options) {
1648
1676
  disposers.push(
1649
1677
  host.registerTool(
1650
1678
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
1651
- final
1679
+ final,
1680
+ { owner: bridgeId }
1652
1681
  )
1653
1682
  );
1654
1683
  };
@@ -1801,7 +1830,7 @@ function registerSceneBridge(host, options) {
1801
1830
  true
1802
1831
  );
1803
1832
  return {
1804
- id: `scene:${adapter.id}`,
1833
+ id: bridgeId,
1805
1834
  title: adapter.title ?? adapter.id,
1806
1835
  dispose: () => {
1807
1836
  for (const d of disposers) d();
@@ -1845,6 +1874,7 @@ function registerScreensBridge(host, options) {
1845
1874
  const { adapter } = options;
1846
1875
  const agent = { ...DEFAULT_AGENT7, ...options.agent ?? {} };
1847
1876
  const disposers = [];
1877
+ const bridgeId = "screens";
1848
1878
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1849
1879
  const target = (screenId) => ({
1850
1880
  kind: "screens",
@@ -1868,7 +1898,8 @@ function registerScreensBridge(host, options) {
1868
1898
  disposers.push(
1869
1899
  host.registerTool(
1870
1900
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
1871
- final
1901
+ final,
1902
+ { owner: bridgeId }
1872
1903
  )
1873
1904
  );
1874
1905
  };
@@ -2037,7 +2068,7 @@ function registerScreensBridge(host, options) {
2037
2068
  (args) => target(String(args.screen ?? ""))
2038
2069
  );
2039
2070
  return {
2040
- id: "screens",
2071
+ id: bridgeId,
2041
2072
  title: "Screens",
2042
2073
  dispose: () => {
2043
2074
  for (const d of disposers) d();
@@ -2051,6 +2082,7 @@ function registerSlidesBridge(host, options) {
2051
2082
  const { adapter } = options;
2052
2083
  const agent = { ...DEFAULT_AGENT8, ...options.agent ?? {} };
2053
2084
  const disposers = [];
2085
+ const bridgeId = "slides";
2054
2086
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
2055
2087
  const deckTarget = () => ({
2056
2088
  kind: "deck",
@@ -2097,7 +2129,8 @@ function registerSlidesBridge(host, options) {
2097
2129
  additionalProperties: false
2098
2130
  }
2099
2131
  },
2100
- final
2132
+ final,
2133
+ { owner: bridgeId }
2101
2134
  )
2102
2135
  );
2103
2136
  };
@@ -2462,7 +2495,7 @@ function registerSlidesBridge(host, options) {
2462
2495
  (args) => elementTarget(str(args?.slideId), str(args?.elementId))
2463
2496
  );
2464
2497
  return {
2465
- id: "slides",
2498
+ id: bridgeId,
2466
2499
  title: "Slides",
2467
2500
  dispose: () => {
2468
2501
  for (const d of disposers.splice(0)) d();
@@ -2497,6 +2530,7 @@ function registerMapBridge(host, options) {
2497
2530
  const { adapter } = options;
2498
2531
  const agent = { ...DEFAULT_AGENT9, ...options.agent ?? {} };
2499
2532
  const disposers = [];
2533
+ const bridgeId = "map";
2500
2534
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
2501
2535
  const mTarget = (args, result) => ({
2502
2536
  kind: "map",
@@ -2528,7 +2562,8 @@ function registerMapBridge(host, options) {
2528
2562
  additionalProperties: false
2529
2563
  }
2530
2564
  },
2531
- final
2565
+ final,
2566
+ { owner: bridgeId }
2532
2567
  )
2533
2568
  );
2534
2569
  };
@@ -2807,7 +2842,7 @@ function registerMapBridge(host, options) {
2807
2842
  }
2808
2843
  );
2809
2844
  return {
2810
- id: "map",
2845
+ id: bridgeId,
2811
2846
  title: "Map",
2812
2847
  dispose: () => {
2813
2848
  for (const d of disposers) d();
@@ -2819,6 +2854,7 @@ function registerMapBridge(host, options) {
2819
2854
  function registerGitBridge(host, options) {
2820
2855
  const agent = { id: "agent", name: "Agent", color: "#a855f7", ...options.agent ?? {} };
2821
2856
  const disposers = [];
2857
+ const bridgeId = "git";
2822
2858
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
2823
2859
  const reg = (name, description, properties, required, handler, mutation2 = false) => {
2824
2860
  const wrapped = async (args) => {
@@ -2838,7 +2874,7 @@ function registerGitBridge(host, options) {
2838
2874
  name,
2839
2875
  description,
2840
2876
  inputSchema: { type: "object", properties, required, additionalProperties: false }
2841
- }, final));
2877
+ }, final, { owner: bridgeId }));
2842
2878
  };
2843
2879
  reg("git_status", "Read normalized working-tree and branch status.", {}, [], async () => {
2844
2880
  const result = await options.adapter.status();
@@ -2899,7 +2935,7 @@ function registerGitBridge(host, options) {
2899
2935
  draft: { type: "boolean" },
2900
2936
  apply: { type: "boolean" }
2901
2937
  }, ["title", "sourceBranch", "targetBranch"]);
2902
- return { id: "git", title: "Git", dispose: () => disposers.forEach((dispose) => dispose()) };
2938
+ return { id: bridgeId, title: "Git", dispose: () => disposers.forEach((dispose) => dispose()) };
2903
2939
  }
2904
2940
 
2905
2941
  // src/bridges/files.ts
@@ -2943,6 +2979,7 @@ function registerFilesBridge(host, options) {
2943
2979
  const agent = { ...DEFAULT_AGENT10, ...options.agent ?? {} };
2944
2980
  const pendingMode = options.pendingMode ?? true;
2945
2981
  const disposers = [];
2982
+ const bridgeId = "files";
2946
2983
  const guard = (path) => {
2947
2984
  if (options.root !== void 0) assertPathWithinRoot(options.root, path);
2948
2985
  return path;
@@ -2978,7 +3015,8 @@ function registerFilesBridge(host, options) {
2978
3015
  additionalProperties: false
2979
3016
  }
2980
3017
  },
2981
- final
3018
+ final,
3019
+ { owner: bridgeId }
2982
3020
  )
2983
3021
  );
2984
3022
  };
@@ -3168,7 +3206,7 @@ function registerFilesBridge(host, options) {
3168
3206
  fTarget
3169
3207
  );
3170
3208
  return {
3171
- id: "files",
3209
+ id: bridgeId,
3172
3210
  title: "Files",
3173
3211
  dispose: () => {
3174
3212
  for (const d of disposers) d();
@@ -3184,6 +3222,7 @@ function registerTerminalBridge(host, options) {
3184
3222
  const pendingMode = options.pendingMode ?? true;
3185
3223
  const screenId = options.screenId ?? options.adapter?.screenId;
3186
3224
  const disposers = [];
3225
+ const bridgeId = "terminal";
3187
3226
  const staged = /* @__PURE__ */ new Map();
3188
3227
  let seq = 0;
3189
3228
  ensureUndoToolsRegistered(host);
@@ -3250,7 +3289,8 @@ function registerTerminalBridge(host, options) {
3250
3289
  description,
3251
3290
  inputSchema: { type: "object", properties, required, additionalProperties: false }
3252
3291
  },
3253
- final
3292
+ final,
3293
+ { owner: bridgeId }
3254
3294
  )
3255
3295
  );
3256
3296
  };
@@ -3447,7 +3487,7 @@ function registerTerminalBridge(host, options) {
3447
3487
  );
3448
3488
  }
3449
3489
  return {
3450
- id: "terminal",
3490
+ id: bridgeId,
3451
3491
  title: "Terminal",
3452
3492
  dispose: () => {
3453
3493
  disposers.forEach((d) => d());
@@ -3492,6 +3532,7 @@ function registerNavigationBridge(host, options) {
3492
3532
  const agent = { ...DEFAULT_AGENT12, ...options.agent ?? {} };
3493
3533
  const pendingMode = options.pendingMode ?? true;
3494
3534
  const disposers = [];
3535
+ const bridgeId = "navigation";
3495
3536
  let groundedRevision = null;
3496
3537
  const staleIntent = async () => {
3497
3538
  const current = await adapter.getRevision?.();
@@ -3535,7 +3576,8 @@ function registerNavigationBridge(host, options) {
3535
3576
  description,
3536
3577
  inputSchema: { type: "object", properties, required, additionalProperties: false }
3537
3578
  },
3538
- final
3579
+ final,
3580
+ { owner: bridgeId }
3539
3581
  )
3540
3582
  );
3541
3583
  };
@@ -3626,11 +3668,11 @@ function registerNavigationBridge(host, options) {
3626
3668
  bridgeId: "navigation",
3627
3669
  action: "nav_visit",
3628
3670
  label: `Navigate to ${url}`,
3629
- undo: () => {
3630
- adapter.visit(from);
3671
+ undo: async () => {
3672
+ await adapter.visit(from);
3631
3673
  },
3632
- redo: () => {
3633
- adapter.visit(url);
3674
+ redo: async () => {
3675
+ await adapter.visit(url);
3634
3676
  }
3635
3677
  });
3636
3678
  return textResult(`Navigated to ${url}`, { url });
@@ -3771,7 +3813,7 @@ function registerNavigationBridge(host, options) {
3771
3813
  (args) => target(`Submit ${String(args.handle ?? "")}`, String(args.handle ?? ""))
3772
3814
  );
3773
3815
  return {
3774
- id: "navigation",
3816
+ id: bridgeId,
3775
3817
  title: "Co-browsing",
3776
3818
  dispose: () => {
3777
3819
  for (const d of disposers) d();
@@ -3789,6 +3831,7 @@ function registerCatalogBridge(host, options) {
3789
3831
  const pendingMode = options.pendingMode ?? true;
3790
3832
  const catalogId = adapter.id ?? "catalog";
3791
3833
  const disposers = [];
3834
+ const bridgeId = `catalog:${catalogId}`;
3792
3835
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
3793
3836
  const target = (elementId, label) => ({
3794
3837
  kind: "custom",
@@ -3814,7 +3857,8 @@ function registerCatalogBridge(host, options) {
3814
3857
  disposers.push(
3815
3858
  host.registerTool(
3816
3859
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
3817
- final
3860
+ final,
3861
+ { owner: bridgeId }
3818
3862
  )
3819
3863
  );
3820
3864
  };
@@ -3911,8 +3955,12 @@ function registerCatalogBridge(host, options) {
3911
3955
  bridgeId: catalogId,
3912
3956
  action: "catalog_create_product",
3913
3957
  label: `Created product ${product.id} (${product.name})`,
3914
- undo: () => void adapter.products.remove(product.id),
3915
- redo: () => void adapter.createProduct({ ...product })
3958
+ undo: async () => {
3959
+ await adapter.products.remove(product.id);
3960
+ },
3961
+ redo: async () => {
3962
+ await adapter.createProduct({ ...product });
3963
+ }
3916
3964
  });
3917
3965
  return textResult(`Created product ${product.id} (${product.name})`, product);
3918
3966
  },
@@ -3953,8 +4001,12 @@ function registerCatalogBridge(host, options) {
3953
4001
  bridgeId: catalogId,
3954
4002
  action: "catalog_create_price",
3955
4003
  label: `Created price ${price.id} on ${productId}`,
3956
- undo: () => void adapter.prices.remove(price.id),
3957
- redo: () => void adapter.createPrice({ ...price })
4004
+ undo: async () => {
4005
+ await adapter.prices.remove(price.id);
4006
+ },
4007
+ redo: async () => {
4008
+ await adapter.createPrice({ ...price });
4009
+ }
3958
4010
  });
3959
4011
  return textResult(`Created ${type} price ${price.id} on ${productId}`, price);
3960
4012
  },
@@ -3978,8 +4030,12 @@ function registerCatalogBridge(host, options) {
3978
4030
  bridgeId: catalogId,
3979
4031
  action: "catalog_delete_product",
3980
4032
  label: `Deleted product ${id} (${product.name})`,
3981
- undo: () => void adapter.createProduct({ ...snapshot }),
3982
- redo: () => void adapter.products.remove(id)
4033
+ undo: async () => {
4034
+ await adapter.createProduct({ ...snapshot });
4035
+ },
4036
+ redo: async () => {
4037
+ await adapter.products.remove(id);
4038
+ }
3983
4039
  });
3984
4040
  return textResult(`Deleted product ${id}`, { id });
3985
4041
  },
@@ -4003,8 +4059,12 @@ function registerCatalogBridge(host, options) {
4003
4059
  bridgeId: catalogId,
4004
4060
  action: "catalog_delete_price",
4005
4061
  label: `Deleted price ${id}`,
4006
- undo: () => void adapter.createPrice({ ...snapshot }),
4007
- redo: () => void adapter.prices.remove(id)
4062
+ undo: async () => {
4063
+ await adapter.createPrice({ ...snapshot });
4064
+ },
4065
+ redo: async () => {
4066
+ await adapter.prices.remove(id);
4067
+ }
4008
4068
  });
4009
4069
  return textResult(`Deleted price ${id}`, { id });
4010
4070
  },
@@ -4072,7 +4132,7 @@ function registerCatalogBridge(host, options) {
4072
4132
  (args) => target(str4(args.priceId), `checkout ${str4(args.priceId)}`)
4073
4133
  );
4074
4134
  return {
4075
- id: `catalog:${catalogId}`,
4135
+ id: bridgeId,
4076
4136
  title: adapter.title ?? "Catalog",
4077
4137
  dispose: () => {
4078
4138
  for (const d of disposers.splice(0)) d();
@@ -4090,6 +4150,7 @@ function registerFeaturesBridge(host, options) {
4090
4150
  const pendingMode = options.pendingMode ?? true;
4091
4151
  const featuresId = adapter.id ?? "features";
4092
4152
  const disposers = [];
4153
+ const bridgeId = `features:${featuresId}`;
4093
4154
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
4094
4155
  const target = (elementId, label) => ({
4095
4156
  kind: "custom",
@@ -4115,7 +4176,8 @@ function registerFeaturesBridge(host, options) {
4115
4176
  disposers.push(
4116
4177
  host.registerTool(
4117
4178
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
4118
- final
4179
+ final,
4180
+ { owner: bridgeId }
4119
4181
  )
4120
4182
  );
4121
4183
  };
@@ -4234,10 +4296,12 @@ function registerFeaturesBridge(host, options) {
4234
4296
  action: "features_grant",
4235
4297
  label: `Granted group ${groupKey}`,
4236
4298
  // Only reverse if WE added it (idempotent assign — don't revoke a pre-existing grant).
4237
- undo: () => {
4238
- if (!already) void adapter.detachGroup(args.subject, groupKey);
4299
+ undo: async () => {
4300
+ if (!already) await adapter.detachGroup(args.subject, groupKey);
4239
4301
  },
4240
- redo: () => void adapter.assignGroup(args.subject, groupKey)
4302
+ redo: async () => {
4303
+ await adapter.assignGroup(args.subject, groupKey);
4304
+ }
4241
4305
  });
4242
4306
  return textResult(`Granted group ${groupKey}`, { subject: args.subject, group: groupKey });
4243
4307
  },
@@ -4260,10 +4324,12 @@ function registerFeaturesBridge(host, options) {
4260
4324
  bridgeId: featuresId,
4261
4325
  action: "features_revoke",
4262
4326
  label: `Revoked group ${groupKey}`,
4263
- undo: () => {
4264
- if (had) void adapter.assignGroup(args.subject, groupKey);
4327
+ undo: async () => {
4328
+ if (had) await adapter.assignGroup(args.subject, groupKey);
4265
4329
  },
4266
- redo: () => void adapter.detachGroup(args.subject, groupKey)
4330
+ redo: async () => {
4331
+ await adapter.detachGroup(args.subject, groupKey);
4332
+ }
4267
4333
  });
4268
4334
  return textResult(`Revoked group ${groupKey}`, { subject: args.subject, group: groupKey });
4269
4335
  },
@@ -4286,7 +4352,7 @@ function registerFeaturesBridge(host, options) {
4286
4352
  (args) => target(str5(args.feature), `consume ${str5(args.feature)}`)
4287
4353
  );
4288
4354
  return {
4289
- id: `features:${featuresId}`,
4355
+ id: bridgeId,
4290
4356
  title: adapter.title ?? "Features",
4291
4357
  dispose: () => {
4292
4358
  for (const d of disposers.splice(0)) d();
@@ -4321,6 +4387,7 @@ function registerPasskeyBridge(host, options) {
4321
4387
  const agent = { ...DEFAULT_AGENT15, ...options.agent ?? {} };
4322
4388
  const surfaceId = adapter.id ?? "passkeys";
4323
4389
  const disposers = [];
4390
+ const bridgeId = `passkeys:${surfaceId}`;
4324
4391
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
4325
4392
  const target = (elementId, label) => ({
4326
4393
  kind: "custom",
@@ -4355,7 +4422,8 @@ function registerPasskeyBridge(host, options) {
4355
4422
  additionalProperties: false
4356
4423
  }
4357
4424
  },
4358
- final
4425
+ final,
4426
+ { owner: bridgeId }
4359
4427
  )
4360
4428
  );
4361
4429
  };
@@ -4421,8 +4489,12 @@ function registerPasskeyBridge(host, options) {
4421
4489
  bridgeId: surfaceId,
4422
4490
  action: "passkey_rename",
4423
4491
  label: `Renamed passkey to ${name || "(unnamed)"}`,
4424
- undo: () => void adapter.rename({ id, name: previous }),
4425
- redo: () => void adapter.rename({ id, name })
4492
+ undo: async () => {
4493
+ await adapter.rename({ id, name: previous });
4494
+ },
4495
+ redo: async () => {
4496
+ await adapter.rename({ id, name });
4497
+ }
4426
4498
  });
4427
4499
  return textResult(`Renamed passkey ${id} to ${name || "(unnamed)"}`, { id, name, previous });
4428
4500
  },
@@ -4472,7 +4544,7 @@ function registerPasskeyBridge(host, options) {
4472
4544
  (args) => target(void 0, `begin enrollment${args.name ? ` (${str6(args.name)})` : ""}`)
4473
4545
  );
4474
4546
  return {
4475
- id: `passkeys:${surfaceId}`,
4547
+ id: bridgeId,
4476
4548
  title: adapter.title ?? "Passkeys",
4477
4549
  dispose: () => {
4478
4550
  for (const d of disposers.splice(0)) d();
@@ -4488,6 +4560,7 @@ function registerDocBridge(host, options) {
4488
4560
  const makeNode = options.makeNode ?? (({ id, type, parent, order }, props) => ({ id, type, parent, order, props }));
4489
4561
  const describeNode = options.describeNode ?? ((n) => ({ id: n.id, type: n.type, parent: n.parent, props: Object.keys(n.props ?? {}) }));
4490
4562
  const disposers = [];
4563
+ const bridgeId = surface;
4491
4564
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
4492
4565
  let idSeq = 0;
4493
4566
  const mintId = () => {
@@ -4548,7 +4621,8 @@ function registerDocBridge(host, options) {
4548
4621
  disposers.push(
4549
4622
  host.registerTool(
4550
4623
  { name, description, inputSchema: { type: "object", properties, required, additionalProperties: false } },
4551
- final
4624
+ final,
4625
+ { owner: bridgeId }
4552
4626
  )
4553
4627
  );
4554
4628
  };
@@ -4723,7 +4797,7 @@ function registerDocBridge(host, options) {
4723
4797
  false
4724
4798
  );
4725
4799
  return {
4726
- id: surface,
4800
+ id: bridgeId,
4727
4801
  title: surface,
4728
4802
  dispose: () => {
4729
4803
  for (const d of disposers) d();
@@ -4876,7 +4950,9 @@ function registerScreenDocBridge(host, options) {
4876
4950
  authored.length ? `${authored.length} addressable, ${syntheticCount} positional` : `no addressable ids \u2014 all ${syntheticCount} nodes are positional`,
4877
4951
  { addressable: authored, syntheticCount }
4878
4952
  );
4879
- })
4953
+ }),
4954
+ // Same registrant as the doc bridge above, which registers under its surface.
4955
+ { owner: surface }
4880
4956
  );
4881
4957
  return {
4882
4958
  id: surface,