@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
@@ -48,6 +48,7 @@ function extractMeta(result) {
48
48
 
49
49
  // src/undo/undo-tools.ts
50
50
  var installedHosts = /* @__PURE__ */ new WeakSet();
51
+ var UNDO_TOOLS_OWNER = "agent-undo";
51
52
  function ensureUndoToolsRegistered(host, options = {}) {
52
53
  if (installedHosts.has(host)) return;
53
54
  installedHosts.add(host);
@@ -72,7 +73,8 @@ function registerUndoTools(host, options = {}) {
72
73
  const entry = await fancyAutoCommon.undoOne(agentOf(args));
73
74
  if (!entry) return errorResult("Nothing to undo.");
74
75
  return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
75
- }
76
+ },
77
+ { owner: UNDO_TOOLS_OWNER }
76
78
  )
77
79
  );
78
80
  disposers.push(
@@ -90,7 +92,8 @@ function registerUndoTools(host, options = {}) {
90
92
  const entry = await fancyAutoCommon.redoOne(agentOf(args));
91
93
  if (!entry) return errorResult("Nothing to redo.");
92
94
  return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
93
- }
95
+ },
96
+ { owner: UNDO_TOOLS_OWNER }
94
97
  )
95
98
  );
96
99
  disposers.push(
@@ -108,7 +111,8 @@ function registerUndoTools(host, options = {}) {
108
111
  const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
109
112
  const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
110
113
  return textResult(text || "(empty)", history);
111
- }
114
+ },
115
+ { owner: UNDO_TOOLS_OWNER }
112
116
  )
113
117
  );
114
118
  return () => disposers.forEach((d) => d());
@@ -131,6 +135,7 @@ function registerFlowBridge(host, options) {
131
135
  const { adapter } = options;
132
136
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
133
137
  const disposers = [];
138
+ const bridgeId = "flow";
134
139
  const pendingMode = options.pendingMode ?? false;
135
140
  const validateConfigMode = options.validateConfig ?? "reject";
136
141
  let connValidator = void 0;
@@ -172,7 +177,8 @@ function registerFlowBridge(host, options) {
172
177
  description,
173
178
  inputSchema: { type: "object", properties, required, additionalProperties: false }
174
179
  },
175
- final
180
+ final,
181
+ { owner: bridgeId }
176
182
  )
177
183
  );
178
184
  };
@@ -517,7 +523,7 @@ function registerFlowBridge(host, options) {
517
523
  flTarget
518
524
  );
519
525
  return {
520
- id: "flow",
526
+ id: bridgeId,
521
527
  title: "Flow",
522
528
  dispose: () => {
523
529
  for (const d of disposers) d();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp/server.ts","../src/presence/wrap-tool-with-activity.ts","../src/undo/undo-tools.ts","../src/bridges/flow.ts"],"names":["emitActivity","undoOne","redoOne","readHistory"],"mappings":";;;;;AAoOO,SAAS,UAAA,CAAW,MAAc,UAAA,EAAkC;AACzE,EAAA,OAAO;AAAA,IACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IAChC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,iBAAA,EAAmB,UAAA,KAAe;AAAC,GACtE;AACF;AAEO,SAAS,YAAY,IAAA,EAA8B;AACxD,EAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAC5D;;;AC9LO,SAAS,oBAAA,CACd,SACA,OAAA,EAmBoB;AACpB,EAAA,OAAO,OAAO,IAAA,KAAS;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AACjC,IAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA;AAE3B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAA,GAAS,OAAA,CAAQ,cAAc,EAAE,QAAA,EAAU,QAAQ,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC7E,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,IAC5D;AACA,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,IAAAA,4BAAA,CAAa;AAAA,MACX,OAAA,EAAS,QAAQ,KAAA,CAAM,EAAA;AAAA,MACvB,SAAA,EAAW,QAAQ,KAAA,CAAM,IAAA;AAAA,MACzB,UAAA,EAAY,QAAQ,KAAA,CAAM,KAAA;AAAA,MAC1B,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,QAAQ,QAAA,EAAS;AAAA,MACtG,QAAQ,OAAA,CAAQ,QAAA;AAAA,MAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM,QAAQ,SAAA,GAAY,OAAA,CAAQ,UAAU,MAAM,CAAA,GAAI,YAAY,MAAM,CAAA;AAAA,MACxE,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAEA,SAAS,YAAY,MAAA,EAA6D;AAChF,EAAA,MAAM,KAAK,MAAA,CAAO,iBAAA;AAClB,EAAA,IAAI,EAAA,IAAM,OAAO,EAAA,KAAO,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAG;AACtD,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;;;ACxFA,IAAM,cAAA,uBAAqB,OAAA,EAAkB;AAMtC,SAAS,yBAAA,CAA0B,IAAA,EAAgB,OAAA,GAA4B,EAAC,EAAS;AAC9F,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9B,EAAA,cAAA,CAAe,IAAI,IAAI,CAAA;AACvB,EAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACjC;AAMO,SAAS,iBAAA,CAAkB,IAAA,EAAgB,OAAA,GAA4B,EAAC,EAAe;AAC5F,EAAA,MAAM,YAAA,GAAe,QAAQ,cAAA,IAAkB,OAAA;AAC/C,EAAA,MAAM,YAA+B,EAAC;AACtC,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KACf,OAAO,MAAM,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,YAAA;AAErD,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,IAAA,CAAK,YAAA;AAAA,MACH;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,8FAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,YAAY,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,UAC1C,oBAAA,EAAsB;AAAA;AACxB,OACF;AAAA,MACA,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,KAAA,GAAQ,MAAMC,uBAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA;AACzC,QAAA,IAAI,CAAC,KAAA,EAAO,OAAO,WAAA,CAAY,kBAAkB,CAAA;AACjD,QAAA,OAAO,UAAA,CAAW,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA,EAAG,CAAA;AAAA,MACxE;AAAA;AACF,GACF;AAEA,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,IAAA,CAAK,YAAA;AAAA,MACH;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,uCAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,YAAY,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,UAC1C,oBAAA,EAAsB;AAAA;AACxB,OACF;AAAA,MACA,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,KAAA,GAAQ,MAAMC,uBAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA;AACzC,QAAA,IAAI,CAAC,KAAA,EAAO,OAAO,WAAA,CAAY,kBAAkB,CAAA;AACjD,QAAA,OAAO,UAAA,CAAW,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA,EAAG,CAAA;AAAA,MACxE;AAAA;AACF,GACF;AAEA,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,IAAA,CAAK,YAAA;AAAA,MACH;AAAA,QACE,IAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAa,yFAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,YAAY,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,UAC1C,oBAAA,EAAsB;AAAA;AACxB,OACF;AAAA,MACA,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,UAAUC,2BAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAE,IAAI,SAAS,CAAA;AACxD,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,GAAG,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzH,QAAA,OAAO,UAAA,CAAW,IAAA,IAAQ,SAAA,EAAW,OAAO,CAAA;AAAA,MAC9C;AAAA;AACF,GACF;AAEA,EAAA,OAAO,MAAM,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAG,CAAA;AAC3C;AAEA,SAAS,UAAU,KAAA,EAAyC;AAC1D,EAAA,OAAO;AAAA,IACL,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,OAAO,KAAA,CAAM;AAAA,GACf;AACF;;;ACbA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAGrE,IAAM,GAAA,GAAM,CAAC,CAAA,EAAY,QAAA,KACvB,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAgB,CAAA;AAChE,IAAM,GAAA,GAAM,CAAC,CAAA,EAAY,QAAA,GAAW,OAAgB,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,QAAA;AAEhF,IAAM,KAAA,GAAQ,CAAC,MAAA,KACb,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAQzE,SAAS,kBAAA,CACd,MACA,OAAA,EACQ;AACR,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;AAEtC,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,KAAA;AAC3C,EAAA,MAAM,kBAAA,GAAqB,QAAQ,cAAA,IAAkB,QAAA;AAKrD,EAAA,IAAI,aAAA,GAA0D,MAAA;AAC9D,EAAA,MAAM,mBAAmB,YAAmD;AAC1E,IAAA,IAAI,aAAA,KAAkB,QAAW,OAAO,aAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,mBAAA,KAAwB,KAAA,EAAO,OAAQ,aAAA,GAAgB,IAAA;AACnE,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,yBAAA,EAA0B,GAAI,MAAM,OAAO,8BAAqC,CAAA;AACxF,MAAA,MAAM,OACJ,OAAA,CAAQ,mBAAA,IAAuB,QAAQ,mBAAA,KAAwB,IAAA,GAC3D,QAAQ,mBAAA,GACR,KAAA,CAAA;AACN,MAAA,aAAA,GAAgB,yBAAA,CAA0B,MAAM,OAAA,CAAQ,QAAA,IAAmB,IAAI,CAAA;AAAA,IACjF,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,aAAA,IAAiB,IAAA;AAAA,EAC1B,CAAA;AAIA,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAI5D,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAW,MAAA,MAAgC;AAAA,IAC3D,IAAA,EAAM,MAAA;AAAA,IACN,SAAA,EAAY,MAAA,EAAQ,iBAAA,EAAmB,EAAA,IAA8B,IAAA,EAAM;AAAA,GAC7E,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,EAAS;AAAA,MAC5B,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,MAC5D,IAAA,EAAM,MAAA;AAAA,MACN,aAAA,EAAe,CAAC,EAAE,IAAA,EAAM,QAAO,KAAM,aAAA,CAAc,MAAM,MAAM;AAAA,KAChE,CAAA,GACD,OAAA;AACJ,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,EAA+B,QAAA,EAAU,sBAAsB,KAAA;AAAM,SACtG;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAIA,EAAA,GAAA,CAAI,kBAAkB,oCAAA,EAAsC,EAAC,EAAG,IAAI,MAAM;AACxE,IAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAO,OAAA,CAAQ,UAAS,EAAG,KAAA,EAAO,OAAA,CAAQ,QAAA,EAAS,EAAE;AAChF,IAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,CAAC,GAAG,KAAK,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,mBAAmB,0DAAA,EAA4D,EAAC,EAAG,IAAI,MAAM;AAC/F,IAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,EAAS,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC3C,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA;AAAA,MACf,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,MAC1B,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,MAC1B,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,MAAA,IAAU;AAAA,KAC5B,CAAE,CAAA;AACF,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,eAAA;AAC9G,IAAA,OAAO,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,EAC/B,CAAC,CAAA;AAED,EAAA,GAAA;AAAA,IACE,eAAA;AAAA,IACA,wCAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAS,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AACvD,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,WAAA,CAAY,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AACrD,MAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACvD;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,sBAAA;AAAA,IACA,uHAAA;AAAA,IACA,EAAE,QAAA,EAAU,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,yFAAwF,EAAE;AAAA,IACrI,EAAC;AAAA,IACD,OAAO,IAAA,KAAS;AAEd,MAAA,IAAI;AAEF,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAC5E,QAAA,MAAM,WAAW,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW,KAAA,CAAA;AACrE,QAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,aAAA,EAAc,CAAE,OAAO,CAAC,CAAA,KAAW,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,GAAI,aAAA,EAAc,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UACtH,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,EAAC;AAAA,UACrB,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,EAAC;AAAA,UACvB,YAAA,EAAA,CAAe,EAAE,YAAA,IAAgB,IAAI,GAAA,CAAI,CAAC,CAAA,MAAY,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,UAAU,CAAC,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE;AAAA,SAC7H,CAAE,CAAA;AACF,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAW,GAAG,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,UAAA,GAAQ,CAAA,CAAE,cAAc,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9H,QAAA,OAAO,UAAA,CAAW,IAAA,IAAQ,uBAAA,EAAyB,GAAG,CAAA;AAAA,MACxD,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,WAAA,CAAY,sCAAsC,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACvG;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,sBAAA;AAAA,IACA,iIAAA;AAAA,IACA,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IAC3B,CAAC,MAAM,CAAA;AAAA,IACP,OAAO,IAAA,KAAS;AACd,MAAA,IAAI;AAEF,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAC1E,QAAA,MAAM,CAAA,GAAS,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACzC,QAAA,IAAI,CAAC,CAAA,EAAG,OAAO,YAAY,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC7D,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,EAAC;AAAA,UACrB,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,EAAC;AAAA,UACvB,YAAA,EAAc,CAAA,CAAE,YAAA,IAAgB,EAAC;AAAA,UACjC,aAAA,EAAe,EAAE,aAAA,IAAiB;AAAA,SACpC;AACA,QAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,MAC7D,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,WAAA,CAAY,sCAAsC,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACvG;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,mBAAmB,uBAAA,EAAyB,EAAC,EAAG,IAAI,MAAM;AAC5D,IAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,EAAS,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC3C,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,YAAA,GAAe,CAAA,CAAA,EAAI,CAAA,CAAE,YAAY,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MAC9D,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,YAAA,GAAe,CAAA,CAAA,EAAI,CAAA,CAAE,YAAY,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,KAC9D,CAAE,CAAA;AACF,IAAA,OAAO,UAAA,CAAW,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,QAAA,EAAM,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,cAAc,KAAK,CAAA;AAAA,EACtG,CAAC,CAAA;AAID,EAAA,GAAA;AAAA,IACE,eAAA;AAAA,IACA,2HAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2DAAA,EAA4D;AAAA,MACjG,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC9B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4CAAA,EAA6C;AAAA,MACpF,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA;AAA+B,KACtE;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,GAAG,CAAA;AAAA,IAC1B,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAG9B,MAAA,IAAI,OAAA,GAAe,IAAA;AACnB,MAAA,IAAI;AAEF,QAAA,MAAM,EAAE,WAAA,EAAa,gBAAA,EAAiB,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAC5F,QAAA,OAAA,GAAU,YAAY,QAAQ,CAAA;AAC9B,QAAA,IAAI,QAAA,GAAoC,OAAA,GAAU,gBAAA,CAAiB,OAAO,IAAI,EAAC;AAAA,MACjF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,WAAoC,EAAC;AAAA,MAC3C;AACA,MAAA,MAAM,QAAA,GAAW,CAAC,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,UAAU,MAAA,EAAQ,UAAU,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAClG,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AACzB,QAAA,OAAO,WAAA,CAAY,CAAA,cAAA,EAAiB,QAAQ,CAAA,mDAAA,CAAgD,CAAA;AAAA,MAC9F;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,GAAG,CAAA;AACpB,MAAA,MAAM,MAAA,GAAS,EAAE,GAAG,QAAA,EAAU,GAAK,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAa,IAAA,CAAK,MAAA,GAAqC,EAAC,EAAG;AACpI,MAAA,IAAI,iBAA2B,EAAC;AAChC,MAAA,IAAI,OAAA,IAAW,uBAAuB,KAAA,EAAO;AAC3C,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAC7E,UAAA,MAAM,MAAA,GAAU,cAAA,CAAe,OAAA,EAAS,MAAM,KAAK,EAAC;AACpD,UAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,YAAA,IAAI,uBAAuB,QAAA,EAAU;AACnC,cAAA,OAAO,WAAA;AAAA,gBACL,CAAA,mBAAA,EAAsB,QAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,oDAAA;AAAA,eAC5E;AAAA,YACF;AACA,YAAA,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,UAC9C;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,EAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAE;AAAA,QAC3C,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,UACrB,GAAI,IAAA,CAAK,WAAA,GAAc,EAAE,WAAA,EAAa,IAAI,IAAA,CAAK,WAAW,CAAA,EAAE,GAAI,EAAC;AAAA,UACjE,MAAA;AAAA,UACA,GAAI,QAAA,KAAa,MAAA,IAAU,IAAA,CAAK,IAAA,GAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAE,GAAI;AAAC;AACrE,OACF;AACA,MAAA,OAAA,CAAQ,SAAS,CAAC,GAAA,KAAQ,CAAC,GAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AACxC,MAAA,OAAO,UAAA;AAAA,QACL,SAAS,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,GAAA,CAAI,KAAK,KAAK,CAAC,CAAA,EAAA,EAAK,cAAA,CAAe,SAAS,CAAA,yBAAA,EAAuB,cAAA,CAAe,KAAK,IAAI,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,QAChI;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,kBAAA;AAAA,IACA,uDAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACpB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC9B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,KAC3B;AAAA,IACA,CAAC,IAAI,CAAA;AAAA,IACL,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAEtB,MAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,EAAS,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAC1D,MAAA,IAAI,CAAC,OAAA,EAAS,OAAO,WAAA,CAAY,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAExD,MAAA,MAAM,eACJ,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,KAAW,WAClC,EAAE,GAAI,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAC,EAAI,GAAI,KAAK,MAAA,EAAmC,GAC9E,QAAQ,IAAA,CAAK,MAAA;AAEnB,MAAA,IAAI,iBAA2B,EAAC;AAChC,MAAA,IAAI,KAAK,MAAA,IAAU,OAAO,KAAK,MAAA,KAAW,QAAA,IAAY,uBAAuB,KAAA,EAAO;AAClF,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAe,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAC1F,UAAA,MAAM,UAAU,WAAA,CAAa,OAAA,CAAQ,IAAA,CAAa,IAAA,IAAQ,QAAQ,IAAI,CAAA;AACtE,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,SAAU,cAAA,CAAe,OAAA,EAAS,gBAAgB,EAAE,KAAK,EAAC;AAChE,YAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,cAAA,IAAI,uBAAuB,QAAA,EAAU;AACnC,gBAAA,OAAO,WAAA,CAAY,CAAA,mBAAA,EAAsB,EAAE,CAAA,EAAA,EAAK,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,cAC5F;AACA,cAAA,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAoB;AAAA,QACxB,GAAG,OAAA;AAAA,QACH,QAAA,EAAU;AAAA,UACR,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,CAAA,GAAY,IAAI,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,CAAA;AAAA,UACzD,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,CAAA,GAAY,IAAI,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS;AAAA,SAC3D;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,GAAG,OAAA,CAAQ,IAAA;AAAA,UACX,GAAI,IAAA,CAAK,KAAA,KAAU,KAAA,CAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAE,GAAI,EAAC;AAAA,UAC7D,GAAI,IAAA,CAAK,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,EAAE,GAAI,EAAC;AAAA,UAC/E,GAAI,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI;AAAC;AACnF,OACF;AACA,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,OAAA,GAAU,CAAE,CAAC,CAAA;AACrE,MAAA,OAAO,UAAA;AAAA,QACL,CAAA,aAAA,EAAgB,EAAE,CAAA,EAAG,cAAA,CAAe,MAAA,GAAS,CAAA,yBAAA,EAAuB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,QACpG;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,kBAAA;AAAA,IACA,yDAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAItB,MAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,EAAS,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AACzD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,WAAA,CAAY,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAEvD,MAAA,IAAI,WAAA,IAAe,QAAQ,OAAA,EAAS;AAClC,QAAA,MAAM,EAAA,GAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,MAAA,EAAQ,aAAA,EAAe,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AACjG,QAAA,IAAI,CAAC,EAAA,EAAI,OAAO,UAAA,CAAW,CAAA,eAAA,EAAkB,EAAE,CAAA,2BAAA,CAA6B,CAAA;AAAA,MAC9E;AACA,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AACxD,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,EAAA,IAAM,CAAA,CAAE,MAAA,KAAW,EAAE,CAAC,CAAA;AAC/E,MAAA,OAAO,UAAA,CAAW,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA;AAAA,IACE,cAAA;AAAA,IACA,sEAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC/B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC/B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,KAC1B;AAAA,IACA,CAAC,UAAU,QAAQ,CAAA;AAAA,IACnB,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,MAAM,eAAe,IAAA,CAAK,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,GAAI,KAAA,CAAA;AAClE,MAAA,MAAM,eAAe,IAAA,CAAK,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,GAAI,KAAA,CAAA;AAClE,MAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,EAAS;AAC7B,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,EAAG,OAAO,WAAA,CAAY,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE,CAAA;AACpF,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,EAAG,OAAO,WAAA,CAAY,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE,CAAA;AAIpF,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,EAAiB;AACxC,MAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,YAAA,IAAgB,IAAA,EAAM,YAAA,EAAc,YAAA,IAAgB,IAAA,EAAM,CAAA,EAAG;AACrH,QAAA,IAAI,WAAW,MAAA,EAAQ,OAAO,WAAA,CAAY,CAAA,oBAAA,EAAuB,MAAM,CAAA,WAAA,CAAa,CAAA;AACpF,QAAA,OAAO,WAAA;AAAA,UACL,CAAA,mBAAA,EAAsB,MAAM,CAAA,EAAG,YAAA,GAAe,IAAI,YAAY,CAAA,CAAA,GAAK,EAAE,CAAA,QAAA,EAAM,MAAM,CAAA,EAAG,YAAA,GAAe,CAAA,CAAA,EAAI,YAAY,KAAK,EAAE,CAAA,0FAAA;AAAA,SAC5H;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,EAAA,EAAI,MAAM,GAAG,CAAA;AAAA,QACb,MAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,QACvC,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,QACvC,GAAI,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAI,IAAA,CAAK,KAAK,CAAA,EAAE,GAAI;AAAC,OACjD;AACA,MAAA,OAAA,CAAQ,SAAS,CAAC,QAAA,KAAa,CAAC,GAAG,QAAA,EAAU,IAAI,CAAC,CAAA;AAClD,MAAA,OAAO,UAAA,CAAW,aAAa,MAAM,CAAA,EAAG,KAAK,YAAA,GAAe,CAAA,CAAA,EAAI,IAAA,CAAK,YAAY,CAAA,CAAA,GAAK,EAAE,WAAM,MAAM,CAAA,EAAG,KAAK,YAAA,GAAe,CAAA,CAAA,EAAI,KAAK,YAAY,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,IACjK,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,EAAS,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AAChD,QAAA,OAAO,WAAA,CAAY,CAAA,QAAA,EAAW,EAAE,CAAA,CAAE,CAAA;AAAA,MACpC;AACA,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AACxD,MAAA,OAAO,UAAA,CAAW,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA;AAAA,IACE,sBAAA;AAAA,IACA,oIAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MAC/E,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS,KACzB;AAAA,IACA,CAAC,MAAM,QAAQ,CAAA;AAAA,IACf,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,SAAY,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAA;AACxD,MAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,QAAA,OAAA,CAAQ,aAAA,CAAc,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,MACxC,CAAA,MAAO;AAEL,QAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,QAAA,OAAA,CAAQ,QAAA;AAAA,UAAS,CAAC,GAAA,KAChB,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACb,YAAA,IAAI,CAAA,CAAE,EAAA,KAAO,EAAA,EAAI,OAAO,CAAA;AACxB,YAAA,KAAA,GAAQ,IAAA;AACR,YAAA,OAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAK,EAAE;AAAA,UAC/D,CAAC;AAAA,SACH;AACA,QAAA,IAAI,CAAC,KAAA,EAAO,OAAO,WAAA,CAAY,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAAA,MACxD;AACA,MAAA,OAAO,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,QAAA,EAAM,MAAM,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,IAClE,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,UAAA;AAAA,IACA,6HAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,EAAK,OAAO,YAAY,qCAAqC,CAAA;AAC1E,MAAA,IAAI,WAAA,IAAe,QAAQ,OAAA,EAAS;AAClC,QAAA,MAAM,KAAK,MAAM,OAAA,CAAQ,QAAQ,EAAE,MAAA,EAAQ,OAAO,CAAA;AAClD,QAAA,IAAI,CAAC,EAAA,EAAI,OAAO,UAAA,CAAW,gCAAgC,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAI;AACjC,MAAA,OAAO,UAAA,CAAW,OAAO,EAAA,GAAK,cAAA,GAAiB,eAAe,MAAA,CAAO,KAAA,IAAS,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,IACnG,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,aAAA;AAAA,IACA,0BAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,YAAY,wCAAwC,CAAA;AAChF,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,OAAO,WAAW,eAAe,CAAA;AAAA,IACnC,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,SAAS,MAAM;AACb,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAAA,IAC/B;AAAA,GACF;AACF","file":"bridges-flow.cjs","sourcesContent":["import {\n type CallToolResult,\n type JsonObject,\n type JsonRpcMessage,\n type JsonRpcRequest,\n type JsonRpcId,\n type RegisteredTool,\n type ServerCapabilities,\n type ServerInfo,\n type ToolDefinition,\n type ToolHandler,\n JSONRPC_INTERNAL_ERROR,\n JSONRPC_INVALID_PARAMS,\n JSONRPC_METHOD_NOT_FOUND,\n MCP_PROTOCOL_VERSION,\n} from \"./types\";\nimport { ToolRegistry } from \"./tool-host\";\n\nexport type McpServerOptions = {\n info: ServerInfo;\n /** Defaults to { tools: { listChanged: true } } */\n capabilities?: ServerCapabilities;\n /** Free-text instructions surfaced to clients during initialize. */\n instructions?: string;\n /**\n * The protocol revisions this server speaks, NEWEST FIRST.\n *\n * `initialize` echoes the client's requested revision when it is in this\n * list, and answers the first entry otherwise — the spec's rule, which leaves\n * the client to decide whether it can live with the answer.\n *\n * Defaults to `[MCP_PROTOCOL_VERSION]`: one revision, answered whatever the\n * client asks, which is exactly what this server did before the option\n * existed. Only list a revision the tools you register are correct under.\n */\n protocolVersions?: readonly string[];\n};\n\nexport type Transport = {\n /** Called by the server when it has a message to deliver to the client. */\n send: (message: JsonRpcMessage) => void;\n /** Called by the server when it's torn down so the transport can clean up. */\n close?: () => void;\n};\n\n/**\n * MicroMcpServer — protocol-level MCP server, transport-agnostic.\n *\n * Use it like:\n *\n * const server = new MicroMcpServer({ info: { name: \"session\", version: \"0.1\" } });\n * server.registerTool({ name: \"...\", inputSchema: { type: \"object\" } }, async (args) => ({...}));\n * const transport = new InProcessTransport();\n * server.attach(transport);\n * transport.deliver({ ... }); // client → server frames\n *\n * The same server can serve multiple transports (e.g. an in-process agent\n * AND a relayed external client) by attaching each one.\n */\nexport class MicroMcpServer extends ToolRegistry {\n private transports = new Set<Transport>();\n /**\n * Transports owed a `tools/list_changed` at the end of this tick. Empty when\n * none is scheduled. See {@link scheduleListChangedNotification}.\n */\n private listChangedOwed = new Set<Transport>();\n\n readonly info: ServerInfo;\n readonly capabilities: ServerCapabilities;\n readonly instructions?: string;\n readonly protocolVersions: readonly string[];\n\n constructor(options: McpServerOptions) {\n super();\n this.info = options.info;\n this.capabilities = options.capabilities ?? { tools: { listChanged: true } };\n this.instructions = options.instructions;\n if (options.protocolVersions && options.protocolVersions.length === 0) {\n // No answer exists for a client's initialize. Fail here, next to the\n // mistake, rather than in a handshake nobody is watching.\n throw new Error(\"MicroMcpServer: protocolVersions is empty — a server must speak at least one protocol revision.\");\n }\n this.protocolVersions = options.protocolVersions ? [...options.protocolVersions] : [MCP_PROTOCOL_VERSION];\n }\n\n attach(transport: Transport): () => void {\n this.transports.add(transport);\n return () => this.detach(transport);\n }\n\n detach(transport: Transport): void {\n if (this.transports.delete(transport)) {\n transport.close?.();\n }\n }\n\n unregisterTool(name: string): void {\n if (this.tools.delete(name)) {\n this.scheduleListChangedNotification();\n }\n }\n\n protected onToolsChanged(): void {\n this.scheduleListChangedNotification();\n }\n\n /**\n * Receive a JSON-RPC frame from a client (called by the transport).\n * The transport is responsible for sending the response back.\n */\n async receive(transport: Transport, message: JsonRpcMessage): Promise<void> {\n if (!(\"method\" in message)) return; // It's a response, not a request — ignore.\n\n const isNotification = !(\"id\" in message);\n if (isNotification) {\n // Notifications are fire-and-forget. We ignore unknown methods.\n return;\n }\n\n const request = message as JsonRpcRequest;\n try {\n const result = await this.handle(request, transport);\n transport.send({ jsonrpc: \"2.0\", id: request.id, result });\n } catch (err) {\n transport.send({\n jsonrpc: \"2.0\",\n id: request.id,\n error: this.toRpcError(err),\n });\n }\n }\n\n private async handle(request: JsonRpcRequest, transport: Transport): Promise<any> {\n const { method, params } = request;\n switch (method) {\n case \"initialize\":\n return {\n protocolVersion: this.negotiate(params?.protocolVersion),\n capabilities: this.capabilities,\n serverInfo: this.info,\n ...(this.instructions ? { instructions: this.instructions } : {}),\n };\n\n case \"tools/list\":\n return { tools: this.listTools() };\n\n case \"tools/call\": {\n const name = params?.name;\n const args = (params?.arguments ?? {}) as JsonObject;\n if (typeof name !== \"string\") {\n throw rpcError(JSONRPC_INVALID_PARAMS, \"tools/call requires `name`\");\n }\n const tool = this.tools.get(name);\n if (!tool) {\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, this.missingToolMessage(name));\n }\n const result = await tool.handler(args, { transport });\n return result satisfies CallToolResult;\n }\n\n case \"ping\":\n return {};\n\n default:\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unsupported method: ${method}`);\n }\n }\n\n /** The revision to answer `initialize` with: the one asked for if spoken, else the newest. */\n private negotiate(requested: unknown): string {\n return typeof requested === \"string\" && this.protocolVersions.includes(requested)\n ? requested\n : this.protocolVersions[0];\n }\n\n /**\n * Tell the transports that SAW the old tool list that it changed.\n *\n * Changes in one tick coalesce into one notification. The recipients are the\n * transports attached at the moment of a change, not at the moment the\n * notification goes out: a transport attached afterwards never had the old\n * list, so \"your list is stale\" is noise to it — and on stdio, where a host\n * builds the server and attaches stdin/stdout in the same tick, it was the\n * first frame a client received, before it had even sent `initialize`.\n */\n private scheduleListChangedNotification(): void {\n if (this.transports.size === 0) return;\n const scheduled = this.listChangedOwed.size > 0;\n for (const t of this.transports) this.listChangedOwed.add(t);\n if (scheduled) return;\n queueMicrotask(() => {\n const owed = this.listChangedOwed;\n this.listChangedOwed = new Set();\n for (const t of owed) {\n // Detached since the change: it is not listening any more.\n if (this.transports.has(t)) t.send({ jsonrpc: \"2.0\", method: \"notifications/tools/list_changed\" });\n }\n });\n }\n\n /** Send an application notification to every client, or one attached transport. */\n notify(message: JsonRpcMessage, transport?: Transport): void {\n if (transport) transport.send(message);\n else this.broadcast(message);\n }\n\n private broadcast(message: JsonRpcMessage): void {\n for (const t of this.transports) t.send(message);\n }\n\n private toRpcError(err: unknown): { code: number; message: string; data?: any } {\n if (err && typeof err === \"object\" && \"code\" in err && \"message\" in err) {\n return err as any;\n }\n return {\n code: JSONRPC_INTERNAL_ERROR,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function rpcError(code: number, message: string, data?: any) {\n return { code, message, ...(data !== undefined ? { data } : {}) };\n}\n\n/**\n * Helper to build a CallToolResult from a string or structured value.\n */\nexport function textResult(text: string, structured?: any): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n ...(structured !== undefined ? { structuredContent: structured } : {}),\n };\n}\n\nexport function errorResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }], isError: true };\n}\n\n// Internal helper so the JsonRpcId import isn't dropped by tsup\ntype _KeepIdImport = JsonRpcId;\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n /**\n * Build the `meta` broadcast to all relay peers. Defaults to the tool's full\n * `structuredContent`. Override to REDACT sensitive fields before fan-out —\n * e.g. the terminal bridge strips raw command/keystroke bytes so a command\n * line (or its secrets) is never broadcast verbatim to every peer.\n */\n buildMeta?: (result: CallToolResult) => Record<string, unknown> | undefined;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: options.buildMeta ? options.buildMeta(result) : extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport { readHistory, redoOne, undoOne } from \"./undo-stack\";\n\nexport type UndoToolsOptions = {\n /** Default agent id when the caller doesn't pass one. */\n defaultAgentId?: string;\n};\n\n/**\n * Idempotent tracker so multiple bridges on the same server only register\n * agent_undo / agent_redo / agent_history once.\n */\nconst installedHosts = new WeakSet<ToolHost>();\n\n/**\n * ensureUndoToolsRegistered — bridges call this on construction. Safe to\n * call repeatedly with the same server; subsequent calls are no-ops.\n */\nexport function ensureUndoToolsRegistered(host: ToolHost, options: UndoToolsOptions = {}): void {\n if (installedHosts.has(host)) return;\n installedHosts.add(host);\n registerUndoTools(host, options);\n}\n\n/**\n * registerUndoTools — add agent_undo / agent_redo / agent_history to the\n * server. Returns a disposer that unregisters all three.\n */\nexport function registerUndoTools(host: ToolHost, options: UndoToolsOptions = {}): () => void {\n const defaultAgent = options.defaultAgentId ?? \"agent\";\n const disposers: Array<() => void> = [];\n const agentOf = (args: any): string =>\n typeof args?.agentId === \"string\" ? args.agentId : defaultAgent;\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_undo\",\n description: \"Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await undoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to undo.\");\n return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });\n },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_redo\",\n description: \"Redo the most recently undone action.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await redoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to redo.\");\n return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });\n },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_history\",\n description: \"List the agent's undo stack (oldest first). Useful for understanding what's reversible.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const history = readHistory(agentOf(args)).map(serialize);\n const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join(\"\\n\");\n return textResult(text || \"(empty)\", history);\n },\n ),\n );\n\n return () => disposers.forEach((d) => d());\n}\n\nfunction serialize(entry: import(\"./undo-stack\").UndoEntry) {\n return {\n timestamp: entry.timestamp,\n bridgeId: entry.bridgeId,\n action: entry.action,\n label: entry.label,\n };\n}\n","// Loose types so this bridge builds standalone without a hard dep on\n// fancy-flow. Hosts that have fancy-flow installed get full editor\n// integration via the runtime dynamic imports below.\ntype FlowNode = {\n id: string;\n type?: string;\n position: { x: number; y: number };\n data: { kind?: string; label?: string; description?: string; status?: string; statusText?: string; config?: Record<string, unknown>; [k: string]: unknown };\n};\ntype FlowEdge = {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n label?: string;\n [k: string]: unknown;\n};\ntype FlowGraph = { nodes: FlowNode[]; edges: FlowEdge[] };\ntype NodeRunStatus = \"idle\" | \"queued\" | \"running\" | \"done\" | \"error\";\ntype ExecutorRegistry = Record<string, unknown>;\ntype RunResult = { ok: boolean; outputs: Record<string, unknown>; error?: string };\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 { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget as FlAgentTarget } from \"../presence/types\";\n\n/**\n * Adapter the host provides — same shape as the editor's local state plus\n * an optional `run`/`cancel` pair so agents can trigger executions.\n */\nexport type FlowBridgeAdapter = {\n getNodes: () => FlowNode[];\n setNodes: (next: FlowNode[] | ((prev: FlowNode[]) => FlowNode[])) => void;\n getEdges: () => FlowEdge[];\n setEdges: (next: FlowEdge[] | ((prev: FlowEdge[]) => FlowEdge[])) => void;\n /** Optional: invoke runFlow with the host's executor registry. */\n run?: (executors?: ExecutorRegistry) => Promise<RunResult>;\n /** Optional: cancel the in-flight run. */\n cancel?: () => void;\n /** Optional: set per-node status text without going through the runner\n * (useful for agents narrating). */\n setNodeStatus?: (id: string, status: NodeRunStatus, text?: string) => void;\n /**\n * Human confirm gate for staged actions (trust-but-verify). When\n * `pendingMode` is on, the bridge calls this before a destructive action;\n * return false to decline. Wire it to a human control.\n */\n confirm?: (request: FlowConfirmRequest) => Promise<boolean> | boolean;\n};\n\n/** What a staged (pendingMode) flow action asks a human to approve. */\nexport type FlowConfirmRequest =\n | { action: \"delete_node\"; nodeId: string; label?: string }\n | { action: \"run\" };\n\nexport type FlowBridgeOptions = {\n adapter: FlowBridgeAdapter;\n /** Identity tagged onto agent-authored nodes. */\n agent?: { id: string; name?: string; color?: string };\n /**\n * Enforce port-type compatibility on `flow_connect`, using fancy-flow's\n * `createConnectionValidator` — the SAME rule `<FlowCanvas>` applies, so an\n * agent can't build an edge the canvas would refuse. `true` (default) uses the\n * default rule (untyped ports permissive); pass `ConnectionValidatorOptions`\n * to tune it, or `false` to disable. No-ops if fancy-flow (>= 0.18.0) isn't\n * importable — the bridge falls back to the existence-only check.\n */\n validateConnections?: boolean | Record<string, unknown>;\n /**\n * Validate a node's config against its kind's `configSchema` on\n * `flow_add_node` / `flow_update_node`. `\"reject\"` (default) refuses an\n * invalid write; `\"warn\"` applies it but reports the issues; `\"off\"` skips.\n * No-ops for the legacy 6-pack (no schema) and when fancy-flow isn't importable.\n */\n validateConfig?: \"reject\" | \"warn\" | \"off\";\n /**\n * Stage destructive/human-visible actions (`flow_delete_node`, `flow_run`) for\n * human confirmation via `adapter.confirm` instead of applying immediately.\n * **Default: OFF** — flow authoring is high-frequency, unlike a form submit.\n * When on without an `adapter.confirm`, the action proceeds (nothing to gate).\n */\n pendingMode?: boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\nconst KINDS: string[] = [\"trigger\", \"action\", \"decision\", \"output\", \"note\", \"subgraph\"];\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);\n\nconst newId = (prefix: string) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerFlowBridge — wires an MCP tool set against a fancy-flow editor's\n * controlled state. Mirrors the whiteboard bridge in shape: read tools,\n * mutation tools (add / update / delete nodes + edges), and optional\n * run/cancel if the host provides those callbacks.\n */\nexport function registerFlowBridge(\n host: ToolHost,\n options: FlowBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n const pendingMode = options.pendingMode ?? false;\n const validateConfigMode = options.validateConfig ?? \"reject\";\n\n // Lazily build the connection validator from fancy-flow (>= 0.18.0) and cache\n // it. `undefined` = not yet tried, `null` = unavailable/disabled → fall back\n // to the existence-only check. The validator reads nodes live via the getter.\n let connValidator: ((c: any) => boolean) | null | undefined = undefined;\n const getConnValidator = async (): Promise<((c: any) => boolean) | null> => {\n if (connValidator !== undefined) return connValidator;\n if (options.validateConnections === false) return (connValidator = null);\n try {\n // @ts-ignore — optional peer dep, may not be installed\n const { createConnectionValidator } = await import(\"@particle-academy/fancy-flow\" as any);\n const opts =\n options.validateConnections && options.validateConnections !== true\n ? options.validateConnections\n : undefined;\n connValidator = createConnectionValidator(() => adapter.getNodes() as any, opts);\n } catch {\n connValidator = null;\n }\n return connValidator ?? null;\n };\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 // Activity-target resolver shared by every mutation tool. Pulls element id\n // from the freshly-added node/edge (structuredContent), falling back to args.\n const flTarget = (args: any, result: any): FlAgentTarget => ({\n kind: \"flow\",\n elementId: (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) => FlAgentTarget | 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: \"flow\",\n resolveTarget: ({ args, result }) => resolveTarget(args, result),\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 ),\n );\n };\n\n // ───────────── Read tools ─────────────\n\n reg(\"flow_get_state\", \"Get the full graph: nodes + edges.\", {}, [], () => {\n const state: FlowGraph = { nodes: adapter.getNodes(), edges: adapter.getEdges() };\n return textResult(JSON.stringify(state, null, 2), state);\n });\n\n reg(\"flow_list_nodes\", \"Summarise every node: id, kind, label, position, status.\", {}, [], () => {\n const items = adapter.getNodes().map((n) => ({\n id: n.id,\n kind: n.type,\n label: n.data?.label,\n x: Math.round(n.position.x),\n y: Math.round(n.position.y),\n status: n.data?.status ?? \"idle\",\n }));\n const text = items.map((i) => `${i.kind} ${i.id}: \"${i.label}\" @(${i.x},${i.y}) [${i.status}]`).join(\"\\n\") || \"(empty graph)\";\n return textResult(text, items);\n });\n\n reg(\n \"flow_get_node\",\n \"Get a single node's full record by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const node = adapter.getNodes().find((n) => n.id === id);\n if (!node) return errorResult(`No node with id ${id}`);\n return textResult(JSON.stringify(node, null, 2), node);\n },\n );\n\n reg(\n \"flow_list_node_kinds\",\n \"List every node kind registered in fancy-flow's registry. Use this to discover what's authorable before adding nodes.\",\n { category: { type: \"string\", description: \"Optional category filter: trigger | logic | data | ai | io | human | output | custom.\" } },\n [],\n async (args) => {\n // Dynamic import keeps the bridge usable even when fancy-flow isn't loaded.\n try {\n // @ts-ignore — optional peer dep, may not be installed\n const { listNodeKinds } = await import(\"@particle-academy/fancy-flow\" as any);\n const category = typeof args.category === \"string\" ? args.category : undefined;\n const all = (category ? listNodeKinds().filter((k: any) => k.category === category) : listNodeKinds()).map((k: any) => ({\n name: k.name,\n category: k.category,\n label: k.label,\n description: k.description,\n icon: k.icon,\n accent: k.accent,\n inputs: k.inputs ?? [],\n outputs: k.outputs ?? [],\n configFields: (k.configSchema ?? []).map((f: any) => ({ key: f.key, type: f.type, label: f.label, required: !!f.required })),\n }));\n const text = all.map((k: any) => `${k.category}/${k.name}: ${k.label}${k.description ? \" — \" + k.description : \"\"}`).join(\"\\n\");\n return textResult(text || \"(no kinds registered)\", all);\n } catch (e) {\n return errorResult(`fancy-flow registry not available: ${e instanceof Error ? e.message : String(e)}`);\n }\n },\n );\n\n reg(\n \"flow_get_node_schema\",\n \"Get the full configSchema + ports for a node kind. Use to know exactly what fields a kind accepts before calling flow_add_node.\",\n { name: { type: \"string\" } },\n [\"name\"],\n async (args) => {\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind } = await import(\"@particle-academy/fancy-flow\" as any);\n const k: any = getNodeKind(str(args.name));\n if (!k) return errorResult(`No kind registered: ${args.name}`);\n const summary = {\n name: k.name,\n category: k.category,\n label: k.label,\n description: k.description,\n inputs: k.inputs ?? [],\n outputs: k.outputs ?? [],\n configSchema: k.configSchema ?? [],\n defaultConfig: k.defaultConfig ?? null,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n } catch (e) {\n return errorResult(`fancy-flow registry not available: ${e instanceof Error ? e.message : String(e)}`);\n }\n },\n );\n\n reg(\"flow_list_edges\", \"Summarise every edge.\", {}, [], () => {\n const items = adapter.getEdges().map((e) => ({\n id: e.id,\n from: `${e.source}${e.sourceHandle ? `:${e.sourceHandle}` : \"\"}`,\n to: `${e.target}${e.targetHandle ? `:${e.targetHandle}` : \"\"}`,\n }));\n return textResult(items.map((i) => `${i.id}: ${i.from} → ${i.to}`).join(\"\\n\") || \"(no edges)\", items);\n });\n\n // ───────────── Node CRUD ─────────────\n\n reg(\n \"flow_add_node\",\n \"Add a node of any kind registered in fancy-flow's registry. Call flow_list_node_kinds first to discover what's available.\",\n {\n kind: { type: \"string\", description: \"Registry kind name (e.g. memory_store, llm_call, branch).\" },\n label: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n description: { type: \"string\" },\n config: { type: \"object\", description: \"Config fields per the kind's configSchema.\" },\n body: { type: \"string\", description: \"Note kinds only — body text.\" },\n },\n [\"kind\", \"label\", \"x\", \"y\"],\n async (args) => {\n const kindName = str(args.kind);\n // Resolve the kind dynamically from the registry. Falls back to the\n // legacy 6-pack so old graphs keep working.\n let kindDef: any = null;\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind, defaultConfigFor } = await import(\"@particle-academy/fancy-flow\" as any);\n kindDef = getNodeKind(kindName);\n var defaults: Record<string, unknown> = kindDef ? defaultConfigFor(kindDef) : {};\n } catch {\n var defaults: Record<string, unknown> = {};\n }\n const isLegacy = [\"trigger\", \"action\", \"decision\", \"output\", \"note\", \"subgraph\"].includes(kindName);\n if (!kindDef && !isLegacy) {\n return errorResult(`Unknown kind: ${kindName} — call flow_list_node_kinds for the registry.`);\n }\n const id = newId(\"n\");\n const config = { ...defaults, ...((args.config && typeof args.config === \"object\") ? (args.config as Record<string, unknown>) : {}) };\n let configWarnings: string[] = [];\n if (kindDef && validateConfigMode !== \"off\") {\n try {\n // @ts-ignore — optional peer dep\n const { validateConfig } = await import(\"@particle-academy/fancy-flow\" as any);\n const issues = (validateConfig(kindDef, config) ?? []) as Array<{ message: string }>;\n if (issues.length) {\n if (validateConfigMode === \"reject\") {\n return errorResult(\n `Config invalid for ${kindName}: ${issues.map((i) => i.message).join(\"; \")}. Call flow_get_node_schema for the accepted fields.`,\n );\n }\n configWarnings = issues.map((i) => i.message);\n }\n } catch {\n /* fancy-flow not importable → skip validation */\n }\n }\n const node: FlowNode = {\n id,\n type: kindName,\n position: { x: num(args.x), y: num(args.y) },\n data: {\n kind: kindName,\n label: str(args.label),\n ...(args.description ? { description: str(args.description) } : {}),\n config,\n ...(kindName === \"note\" && args.body ? { body: str(args.body) } : {}),\n } as any,\n };\n adapter.setNodes((all) => [...all, node]);\n return textResult(\n `Added ${kindName} ${id} (\"${str(args.label)}\")${configWarnings.length ? ` — config warnings: ${configWarnings.join(\"; \")}` : \"\"}`,\n node,\n );\n },\n flTarget,\n );\n\n reg(\n \"flow_update_node\",\n \"Update fields on a node. Only provided fields change.\",\n {\n id: { type: \"string\" },\n label: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n description: { type: \"string\" },\n config: { type: \"object\" },\n },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n // Read first so config validation can veto BEFORE any mutation applies.\n const current = adapter.getNodes().find((n) => n.id === id);\n if (!current) return errorResult(`No node with id ${id}`);\n\n const mergedConfig =\n args.config && typeof args.config === \"object\"\n ? { ...(current.data.config ?? {}), ...(args.config as Record<string, unknown>) }\n : current.data.config;\n\n let configWarnings: string[] = [];\n if (args.config && typeof args.config === \"object\" && validateConfigMode !== \"off\") {\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind, validateConfig } = await import(\"@particle-academy/fancy-flow\" as any);\n const kindDef = getNodeKind((current.data as any).kind ?? current.type);\n if (kindDef) {\n const issues = (validateConfig(kindDef, mergedConfig ?? {}) ?? []) as Array<{ message: string }>;\n if (issues.length) {\n if (validateConfigMode === \"reject\") {\n return errorResult(`Config invalid for ${id}: ${issues.map((i) => i.message).join(\"; \")}.`);\n }\n configWarnings = issues.map((i) => i.message);\n }\n }\n } catch {\n /* fancy-flow not importable → skip validation */\n }\n }\n\n const updated: FlowNode = {\n ...current,\n position: {\n x: args.x !== undefined ? num(args.x) : current.position.x,\n y: args.y !== undefined ? num(args.y) : current.position.y,\n },\n data: {\n ...current.data,\n ...(args.label !== undefined ? { label: str(args.label) } : {}),\n ...(args.description !== undefined ? { description: str(args.description) } : {}),\n ...(args.config && typeof args.config === \"object\" ? { config: mergedConfig } : {}),\n },\n };\n adapter.setNodes((all) => all.map((n) => (n.id === id ? updated : n)));\n return textResult(\n `Updated node ${id}${configWarnings.length ? ` — config warnings: ${configWarnings.join(\"; \")}` : \"\"}`,\n updated,\n );\n },\n flTarget,\n );\n\n reg(\n \"flow_delete_node\",\n \"Remove a node by id (also removes any connected edges).\",\n { id: { type: \"string\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n // Validate existence BEFORE scheduling the state update — React's\n // functional updaters may run async in strict mode, so checking a\n // flag set inside the updater would race the response.\n const target = adapter.getNodes().find((n) => n.id === id);\n if (!target) return errorResult(`No node with id ${id}`);\n // Destructive → stage for human confirmation when pendingMode is on.\n if (pendingMode && adapter.confirm) {\n const ok = await adapter.confirm({ action: \"delete_node\", nodeId: id, label: target.data?.label });\n if (!ok) return textResult(`Delete of node ${id} was declined by the human.`);\n }\n adapter.setNodes((all) => all.filter((n) => n.id !== id));\n adapter.setEdges((all) => all.filter((e) => e.source !== id && e.target !== id));\n return textResult(`Deleted node ${id}`);\n },\n flTarget,\n );\n\n // ───────────── Edges ─────────────\n\n reg(\n \"flow_connect\",\n \"Create an edge between two nodes (optionally specifying handle ids).\",\n {\n source: { type: \"string\" },\n target: { type: \"string\" },\n sourceHandle: { type: \"string\" },\n targetHandle: { type: \"string\" },\n label: { type: \"string\" },\n },\n [\"source\", \"target\"],\n async (args) => {\n const source = str(args.source);\n const target = str(args.target);\n const sourceHandle = args.sourceHandle ? str(args.sourceHandle) : undefined;\n const targetHandle = args.targetHandle ? str(args.targetHandle) : undefined;\n const all = adapter.getNodes();\n if (!all.find((n) => n.id === source)) return errorResult(`No source node ${source}`);\n if (!all.find((n) => n.id === target)) return errorResult(`No target node ${target}`);\n\n // Enforce port-type compatibility with the SAME rule <FlowCanvas> applies,\n // so an agent can't build an edge the canvas would refuse (no drift).\n const validate = await getConnValidator();\n if (validate && !validate({ source, target, sourceHandle: sourceHandle ?? null, targetHandle: targetHandle ?? null })) {\n if (source === target) return errorResult(`Cannot connect node ${source} to itself.`);\n return errorResult(\n `Invalid connection ${source}${sourceHandle ? `:${sourceHandle}` : \"\"} → ${target}${targetHandle ? `:${targetHandle}` : \"\"}: incompatible port types or unknown handle. Call flow_get_node_schema to check the ports.`,\n );\n }\n\n const edge: FlowEdge = {\n id: newId(\"e\"),\n source,\n target,\n ...(sourceHandle ? { sourceHandle } : {}),\n ...(targetHandle ? { targetHandle } : {}),\n ...(args.label ? { label: str(args.label) } : {}),\n };\n adapter.setEdges((existing) => [...existing, edge]);\n return textResult(`Connected ${source}${edge.sourceHandle ? `:${edge.sourceHandle}` : \"\"} → ${target}${edge.targetHandle ? `:${edge.targetHandle}` : \"\"}`, edge);\n },\n flTarget,\n );\n\n reg(\n \"flow_disconnect\",\n \"Remove an edge by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n if (!adapter.getEdges().some((e) => e.id === id)) {\n return errorResult(`No edge ${id}`);\n }\n adapter.setEdges((all) => all.filter((e) => e.id !== id));\n return textResult(`Disconnected ${id}`);\n },\n flTarget,\n );\n\n // ───────────── Status / run ─────────────\n\n reg(\n \"flow_set_node_status\",\n \"Manually set a node's status badge (idle | queued | running | done | error) and optional text. Useful for narration outside a run.\",\n {\n id: { type: \"string\" },\n status: { type: \"string\", enum: [\"idle\", \"queued\", \"running\", \"done\", \"error\"] },\n text: { type: \"string\" },\n },\n [\"id\", \"status\"],\n (args) => {\n const id = str(args.id);\n const status = str(args.status) as NodeRunStatus;\n const text = args.text !== undefined ? str(args.text) : undefined;\n if (adapter.setNodeStatus) {\n adapter.setNodeStatus(id, status, text);\n } else {\n // Fall back to mutating the node data directly.\n let found = false;\n adapter.setNodes((all) =>\n all.map((n) => {\n if (n.id !== id) return n;\n found = true;\n return { ...n, data: { ...n.data, status, statusText: text } };\n }),\n );\n if (!found) return errorResult(`No node with id ${id}`);\n }\n return textResult(`${id} → ${status}${text ? ` (${text})` : \"\"}`);\n },\n flTarget,\n );\n\n reg(\n \"flow_run\",\n \"Trigger a run of the current graph. Returns the topological result. Requires the host to have wired `run` into the adapter.\",\n {},\n [],\n async () => {\n if (!adapter.run) return errorResult(\"Host did not provide a run handler.\");\n if (pendingMode && adapter.confirm) {\n const ok = await adapter.confirm({ action: \"run\" });\n if (!ok) return textResult(\"Run was declined by the human.\");\n }\n const result = await adapter.run();\n return textResult(result.ok ? \"Run complete\" : `Run failed: ${result.error ?? \"unknown\"}`, result);\n },\n flTarget,\n );\n\n reg(\n \"flow_cancel\",\n \"Cancel an in-flight run.\",\n {},\n [],\n () => {\n if (!adapter.cancel) return errorResult(\"Host did not provide a cancel handler.\");\n adapter.cancel();\n return textResult(\"Run cancelled\");\n },\n flTarget,\n );\n\n return {\n id: \"flow\",\n title: \"Flow\",\n dispose: () => {\n for (const d of disposers) d();\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/mcp/server.ts","../src/presence/wrap-tool-with-activity.ts","../src/undo/undo-tools.ts","../src/bridges/flow.ts"],"names":["emitActivity","undoOne","redoOne","readHistory"],"mappings":"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","file":"bridges-flow.cjs","sourcesContent":["import {\n type CallToolResult,\n type JsonObject,\n type JsonRpcMessage,\n type JsonRpcRequest,\n type JsonRpcId,\n type RegisteredTool,\n type ServerCapabilities,\n type ServerInfo,\n type ToolDefinition,\n type ToolHandler,\n JSONRPC_INTERNAL_ERROR,\n JSONRPC_INVALID_PARAMS,\n JSONRPC_METHOD_NOT_FOUND,\n MCP_PROTOCOL_VERSION,\n} from \"./types\";\nimport { ToolRegistry } from \"./tool-host\";\n\nexport type McpServerOptions = {\n info: ServerInfo;\n /** Defaults to { tools: { listChanged: true } } */\n capabilities?: ServerCapabilities;\n /** Free-text instructions surfaced to clients during initialize. */\n instructions?: string;\n /**\n * The protocol revisions this server speaks, NEWEST FIRST.\n *\n * `initialize` echoes the client's requested revision when it is in this\n * list, and answers the first entry otherwise — the spec's rule, which leaves\n * the client to decide whether it can live with the answer.\n *\n * Defaults to `[MCP_PROTOCOL_VERSION]`: one revision, answered whatever the\n * client asks, which is exactly what this server did before the option\n * existed. Only list a revision the tools you register are correct under.\n */\n protocolVersions?: readonly string[];\n};\n\nexport type Transport = {\n /** Called by the server when it has a message to deliver to the client. */\n send: (message: JsonRpcMessage) => void;\n /** Called by the server when it's torn down so the transport can clean up. */\n close?: () => void;\n};\n\n/**\n * MicroMcpServer — protocol-level MCP server, transport-agnostic.\n *\n * Use it like:\n *\n * const server = new MicroMcpServer({ info: { name: \"session\", version: \"0.1\" } });\n * server.registerTool({ name: \"...\", inputSchema: { type: \"object\" } }, async (args) => ({...}));\n * const transport = new InProcessTransport();\n * server.attach(transport);\n * transport.deliver({ ... }); // client → server frames\n *\n * The same server can serve multiple transports (e.g. an in-process agent\n * AND a relayed external client) by attaching each one.\n */\nexport class MicroMcpServer extends ToolRegistry {\n private transports = new Set<Transport>();\n /**\n * Transports owed a `tools/list_changed` at the end of this tick. Empty when\n * none is scheduled. See {@link scheduleListChangedNotification}.\n */\n private listChangedOwed = new Set<Transport>();\n\n readonly info: ServerInfo;\n readonly capabilities: ServerCapabilities;\n readonly instructions?: string;\n readonly protocolVersions: readonly string[];\n\n constructor(options: McpServerOptions) {\n super();\n this.info = options.info;\n this.capabilities = options.capabilities ?? { tools: { listChanged: true } };\n this.instructions = options.instructions;\n if (options.protocolVersions && options.protocolVersions.length === 0) {\n // No answer exists for a client's initialize. Fail here, next to the\n // mistake, rather than in a handshake nobody is watching.\n throw new Error(\"MicroMcpServer: protocolVersions is empty — a server must speak at least one protocol revision.\");\n }\n this.protocolVersions = options.protocolVersions ? [...options.protocolVersions] : [MCP_PROTOCOL_VERSION];\n }\n\n attach(transport: Transport): () => void {\n this.transports.add(transport);\n return () => this.detach(transport);\n }\n\n detach(transport: Transport): void {\n if (this.transports.delete(transport)) {\n transport.close?.();\n }\n }\n\n unregisterTool(name: string): void {\n if (this.tools.delete(name)) {\n this.scheduleListChangedNotification();\n }\n }\n\n protected onToolsChanged(): void {\n this.scheduleListChangedNotification();\n }\n\n /**\n * Receive a JSON-RPC frame from a client (called by the transport).\n * The transport is responsible for sending the response back.\n */\n async receive(transport: Transport, message: JsonRpcMessage): Promise<void> {\n if (!(\"method\" in message)) return; // It's a response, not a request — ignore.\n\n const isNotification = !(\"id\" in message);\n if (isNotification) {\n // Notifications are fire-and-forget. We ignore unknown methods.\n return;\n }\n\n const request = message as JsonRpcRequest;\n try {\n const result = await this.handle(request, transport);\n transport.send({ jsonrpc: \"2.0\", id: request.id, result });\n } catch (err) {\n transport.send({\n jsonrpc: \"2.0\",\n id: request.id,\n error: this.toRpcError(err),\n });\n }\n }\n\n private async handle(request: JsonRpcRequest, transport: Transport): Promise<any> {\n const { method, params } = request;\n switch (method) {\n case \"initialize\":\n return {\n protocolVersion: this.negotiate(params?.protocolVersion),\n capabilities: this.capabilities,\n serverInfo: this.info,\n ...(this.instructions ? { instructions: this.instructions } : {}),\n };\n\n case \"tools/list\":\n return { tools: this.listTools() };\n\n case \"tools/call\": {\n const name = params?.name;\n const args = (params?.arguments ?? {}) as JsonObject;\n if (typeof name !== \"string\") {\n throw rpcError(JSONRPC_INVALID_PARAMS, \"tools/call requires `name`\");\n }\n const tool = this.tools.get(name);\n if (!tool) {\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, this.missingToolMessage(name));\n }\n const result = await tool.handler(args, { transport });\n return result satisfies CallToolResult;\n }\n\n case \"ping\":\n return {};\n\n default:\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unsupported method: ${method}`);\n }\n }\n\n /** The revision to answer `initialize` with: the one asked for if spoken, else the newest. */\n private negotiate(requested: unknown): string {\n return typeof requested === \"string\" && this.protocolVersions.includes(requested)\n ? requested\n : this.protocolVersions[0];\n }\n\n /**\n * Tell the transports that SAW the old tool list that it changed.\n *\n * Changes in one tick coalesce into one notification. The recipients are the\n * transports attached at the moment of a change, not at the moment the\n * notification goes out: a transport attached afterwards never had the old\n * list, so \"your list is stale\" is noise to it — and on stdio, where a host\n * builds the server and attaches stdin/stdout in the same tick, it was the\n * first frame a client received, before it had even sent `initialize`.\n */\n private scheduleListChangedNotification(): void {\n if (this.transports.size === 0) return;\n const scheduled = this.listChangedOwed.size > 0;\n for (const t of this.transports) this.listChangedOwed.add(t);\n if (scheduled) return;\n queueMicrotask(() => {\n const owed = this.listChangedOwed;\n this.listChangedOwed = new Set();\n for (const t of owed) {\n // Detached since the change: it is not listening any more.\n if (this.transports.has(t)) t.send({ jsonrpc: \"2.0\", method: \"notifications/tools/list_changed\" });\n }\n });\n }\n\n /** Send an application notification to every client, or one attached transport. */\n notify(message: JsonRpcMessage, transport?: Transport): void {\n if (transport) transport.send(message);\n else this.broadcast(message);\n }\n\n private broadcast(message: JsonRpcMessage): void {\n for (const t of this.transports) t.send(message);\n }\n\n private toRpcError(err: unknown): { code: number; message: string; data?: any } {\n if (err && typeof err === \"object\" && \"code\" in err && \"message\" in err) {\n return err as any;\n }\n return {\n code: JSONRPC_INTERNAL_ERROR,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function rpcError(code: number, message: string, data?: any) {\n return { code, message, ...(data !== undefined ? { data } : {}) };\n}\n\n/**\n * Helper to build a CallToolResult from a string or structured value.\n */\nexport function textResult(text: string, structured?: any): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n ...(structured !== undefined ? { structuredContent: structured } : {}),\n };\n}\n\nexport function errorResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }], isError: true };\n}\n\n// Internal helper so the JsonRpcId import isn't dropped by tsup\ntype _KeepIdImport = JsonRpcId;\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n /**\n * Build the `meta` broadcast to all relay peers. Defaults to the tool's full\n * `structuredContent`. Override to REDACT sensitive fields before fan-out —\n * e.g. the terminal bridge strips raw command/keystroke bytes so a command\n * line (or its secrets) is never broadcast verbatim to every peer.\n */\n buildMeta?: (result: CallToolResult) => Record<string, unknown> | undefined;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: options.buildMeta ? options.buildMeta(result) : extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport { readHistory, redoOne, undoOne } from \"./undo-stack\";\n\nexport type UndoToolsOptions = {\n /** Default agent id when the caller doesn't pass one. */\n defaultAgentId?: string;\n};\n\n/**\n * Idempotent tracker so multiple bridges on the same server only register\n * agent_undo / agent_redo / agent_history once.\n */\nconst installedHosts = new WeakSet<ToolHost>();\n\n/**\n * The one owner every copy of the undo tools registers under. They are SHARED\n * on purpose — every bridge ensures them, and a host may also call\n * `registerUndoTools` itself — so all of those are the same registrant, and a\n * second registration replaces the first instead of being refused as a\n * collision. Anything else claiming `agent_undo` is still refused.\n */\nconst UNDO_TOOLS_OWNER = \"agent-undo\";\n\n/**\n * ensureUndoToolsRegistered — bridges call this on construction. Safe to\n * call repeatedly with the same server; subsequent calls are no-ops.\n */\nexport function ensureUndoToolsRegistered(host: ToolHost, options: UndoToolsOptions = {}): void {\n if (installedHosts.has(host)) return;\n installedHosts.add(host);\n registerUndoTools(host, options);\n}\n\n/**\n * registerUndoTools — add agent_undo / agent_redo / agent_history to the\n * server. Returns a disposer that unregisters all three.\n */\nexport function registerUndoTools(host: ToolHost, options: UndoToolsOptions = {}): () => void {\n const defaultAgent = options.defaultAgentId ?? \"agent\";\n const disposers: Array<() => void> = [];\n const agentOf = (args: any): string =>\n typeof args?.agentId === \"string\" ? args.agentId : defaultAgent;\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_undo\",\n description: \"Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await undoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to undo.\");\n return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });\n },\n { owner: UNDO_TOOLS_OWNER },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_redo\",\n description: \"Redo the most recently undone action.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const entry = await redoOne(agentOf(args));\n if (!entry) return errorResult(\"Nothing to redo.\");\n return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });\n },\n { owner: UNDO_TOOLS_OWNER },\n ),\n );\n\n disposers.push(\n host.registerTool(\n {\n name: \"agent_history\",\n description: \"List the agent's undo stack (oldest first). Useful for understanding what's reversible.\",\n inputSchema: {\n type: \"object\",\n properties: { agentId: { type: \"string\" } },\n additionalProperties: false,\n },\n },\n async (args) => {\n const history = readHistory(agentOf(args)).map(serialize);\n const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join(\"\\n\");\n return textResult(text || \"(empty)\", history);\n },\n { owner: UNDO_TOOLS_OWNER },\n ),\n );\n\n return () => disposers.forEach((d) => d());\n}\n\nfunction serialize(entry: import(\"./undo-stack\").UndoEntry) {\n return {\n timestamp: entry.timestamp,\n bridgeId: entry.bridgeId,\n action: entry.action,\n label: entry.label,\n };\n}\n","// Loose types so this bridge builds standalone without a hard dep on\n// fancy-flow. Hosts that have fancy-flow installed get full editor\n// integration via the runtime dynamic imports below.\ntype FlowNode = {\n id: string;\n type?: string;\n position: { x: number; y: number };\n data: { kind?: string; label?: string; description?: string; status?: string; statusText?: string; config?: Record<string, unknown>; [k: string]: unknown };\n};\ntype FlowEdge = {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n label?: string;\n [k: string]: unknown;\n};\ntype FlowGraph = { nodes: FlowNode[]; edges: FlowEdge[] };\ntype NodeRunStatus = \"idle\" | \"queued\" | \"running\" | \"done\" | \"error\";\ntype ExecutorRegistry = Record<string, unknown>;\ntype RunResult = { ok: boolean; outputs: Record<string, unknown>; error?: string };\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 { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget as FlAgentTarget } from \"../presence/types\";\n\n/**\n * Adapter the host provides — same shape as the editor's local state plus\n * an optional `run`/`cancel` pair so agents can trigger executions.\n */\nexport type FlowBridgeAdapter = {\n getNodes: () => FlowNode[];\n setNodes: (next: FlowNode[] | ((prev: FlowNode[]) => FlowNode[])) => void;\n getEdges: () => FlowEdge[];\n setEdges: (next: FlowEdge[] | ((prev: FlowEdge[]) => FlowEdge[])) => void;\n /** Optional: invoke runFlow with the host's executor registry. */\n run?: (executors?: ExecutorRegistry) => Promise<RunResult>;\n /** Optional: cancel the in-flight run. */\n cancel?: () => void;\n /** Optional: set per-node status text without going through the runner\n * (useful for agents narrating). */\n setNodeStatus?: (id: string, status: NodeRunStatus, text?: string) => void;\n /**\n * Human confirm gate for staged actions (trust-but-verify). When\n * `pendingMode` is on, the bridge calls this before a destructive action;\n * return false to decline. Wire it to a human control.\n */\n confirm?: (request: FlowConfirmRequest) => Promise<boolean> | boolean;\n};\n\n/** What a staged (pendingMode) flow action asks a human to approve. */\nexport type FlowConfirmRequest =\n | { action: \"delete_node\"; nodeId: string; label?: string }\n | { action: \"run\" };\n\nexport type FlowBridgeOptions = {\n adapter: FlowBridgeAdapter;\n /** Identity tagged onto agent-authored nodes. */\n agent?: { id: string; name?: string; color?: string };\n /**\n * Enforce port-type compatibility on `flow_connect`, using fancy-flow's\n * `createConnectionValidator` — the SAME rule `<FlowCanvas>` applies, so an\n * agent can't build an edge the canvas would refuse. `true` (default) uses the\n * default rule (untyped ports permissive); pass `ConnectionValidatorOptions`\n * to tune it, or `false` to disable. No-ops if fancy-flow (>= 0.18.0) isn't\n * importable — the bridge falls back to the existence-only check.\n */\n validateConnections?: boolean | Record<string, unknown>;\n /**\n * Validate a node's config against its kind's `configSchema` on\n * `flow_add_node` / `flow_update_node`. `\"reject\"` (default) refuses an\n * invalid write; `\"warn\"` applies it but reports the issues; `\"off\"` skips.\n * No-ops for the legacy 6-pack (no schema) and when fancy-flow isn't importable.\n */\n validateConfig?: \"reject\" | \"warn\" | \"off\";\n /**\n * Stage destructive/human-visible actions (`flow_delete_node`, `flow_run`) for\n * human confirmation via `adapter.confirm` instead of applying immediately.\n * **Default: OFF** — flow authoring is high-frequency, unlike a form submit.\n * When on without an `adapter.confirm`, the action proceeds (nothing to gate).\n */\n pendingMode?: boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\nconst KINDS: string[] = [\"trigger\", \"action\", \"decision\", \"output\", \"note\", \"subgraph\"];\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);\n\nconst newId = (prefix: string) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerFlowBridge — wires an MCP tool set against a fancy-flow editor's\n * controlled state. Mirrors the whiteboard bridge in shape: read tools,\n * mutation tools (add / update / delete nodes + edges), and optional\n * run/cancel if the host provides those callbacks.\n */\nexport function registerFlowBridge(\n host: ToolHost,\n options: FlowBridgeOptions,\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 = \"flow\";\n\n const pendingMode = options.pendingMode ?? false;\n const validateConfigMode = options.validateConfig ?? \"reject\";\n\n // Lazily build the connection validator from fancy-flow (>= 0.18.0) and cache\n // it. `undefined` = not yet tried, `null` = unavailable/disabled → fall back\n // to the existence-only check. The validator reads nodes live via the getter.\n let connValidator: ((c: any) => boolean) | null | undefined = undefined;\n const getConnValidator = async (): Promise<((c: any) => boolean) | null> => {\n if (connValidator !== undefined) return connValidator;\n if (options.validateConnections === false) return (connValidator = null);\n try {\n // @ts-ignore — optional peer dep, may not be installed\n const { createConnectionValidator } = await import(\"@particle-academy/fancy-flow\" as any);\n const opts =\n options.validateConnections && options.validateConnections !== true\n ? options.validateConnections\n : undefined;\n connValidator = createConnectionValidator(() => adapter.getNodes() as any, opts);\n } catch {\n connValidator = null;\n }\n return connValidator ?? null;\n };\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 // Activity-target resolver shared by every mutation tool. Pulls element id\n // from the freshly-added node/edge (structuredContent), falling back to args.\n const flTarget = (args: any, result: any): FlAgentTarget => ({\n kind: \"flow\",\n elementId: (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) => FlAgentTarget | 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: \"flow\",\n resolveTarget: ({ args, result }) => resolveTarget(args, result),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n },\n final as any,\n { owner: bridgeId },\n ),\n );\n };\n\n // ───────────── Read tools ─────────────\n\n reg(\"flow_get_state\", \"Get the full graph: nodes + edges.\", {}, [], () => {\n const state: FlowGraph = { nodes: adapter.getNodes(), edges: adapter.getEdges() };\n return textResult(JSON.stringify(state, null, 2), state);\n });\n\n reg(\"flow_list_nodes\", \"Summarise every node: id, kind, label, position, status.\", {}, [], () => {\n const items = adapter.getNodes().map((n) => ({\n id: n.id,\n kind: n.type,\n label: n.data?.label,\n x: Math.round(n.position.x),\n y: Math.round(n.position.y),\n status: n.data?.status ?? \"idle\",\n }));\n const text = items.map((i) => `${i.kind} ${i.id}: \"${i.label}\" @(${i.x},${i.y}) [${i.status}]`).join(\"\\n\") || \"(empty graph)\";\n return textResult(text, items);\n });\n\n reg(\n \"flow_get_node\",\n \"Get a single node's full record by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const node = adapter.getNodes().find((n) => n.id === id);\n if (!node) return errorResult(`No node with id ${id}`);\n return textResult(JSON.stringify(node, null, 2), node);\n },\n );\n\n reg(\n \"flow_list_node_kinds\",\n \"List every node kind registered in fancy-flow's registry. Use this to discover what's authorable before adding nodes.\",\n { category: { type: \"string\", description: \"Optional category filter: trigger | logic | data | ai | io | human | output | custom.\" } },\n [],\n async (args) => {\n // Dynamic import keeps the bridge usable even when fancy-flow isn't loaded.\n try {\n // @ts-ignore — optional peer dep, may not be installed\n const { listNodeKinds } = await import(\"@particle-academy/fancy-flow\" as any);\n const category = typeof args.category === \"string\" ? args.category : undefined;\n const all = (category ? listNodeKinds().filter((k: any) => k.category === category) : listNodeKinds()).map((k: any) => ({\n name: k.name,\n category: k.category,\n label: k.label,\n description: k.description,\n icon: k.icon,\n accent: k.accent,\n inputs: k.inputs ?? [],\n outputs: k.outputs ?? [],\n configFields: (k.configSchema ?? []).map((f: any) => ({ key: f.key, type: f.type, label: f.label, required: !!f.required })),\n }));\n const text = all.map((k: any) => `${k.category}/${k.name}: ${k.label}${k.description ? \" — \" + k.description : \"\"}`).join(\"\\n\");\n return textResult(text || \"(no kinds registered)\", all);\n } catch (e) {\n return errorResult(`fancy-flow registry not available: ${e instanceof Error ? e.message : String(e)}`);\n }\n },\n );\n\n reg(\n \"flow_get_node_schema\",\n \"Get the full configSchema + ports for a node kind. Use to know exactly what fields a kind accepts before calling flow_add_node.\",\n { name: { type: \"string\" } },\n [\"name\"],\n async (args) => {\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind } = await import(\"@particle-academy/fancy-flow\" as any);\n const k: any = getNodeKind(str(args.name));\n if (!k) return errorResult(`No kind registered: ${args.name}`);\n const summary = {\n name: k.name,\n category: k.category,\n label: k.label,\n description: k.description,\n inputs: k.inputs ?? [],\n outputs: k.outputs ?? [],\n configSchema: k.configSchema ?? [],\n defaultConfig: k.defaultConfig ?? null,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n } catch (e) {\n return errorResult(`fancy-flow registry not available: ${e instanceof Error ? e.message : String(e)}`);\n }\n },\n );\n\n reg(\"flow_list_edges\", \"Summarise every edge.\", {}, [], () => {\n const items = adapter.getEdges().map((e) => ({\n id: e.id,\n from: `${e.source}${e.sourceHandle ? `:${e.sourceHandle}` : \"\"}`,\n to: `${e.target}${e.targetHandle ? `:${e.targetHandle}` : \"\"}`,\n }));\n return textResult(items.map((i) => `${i.id}: ${i.from} → ${i.to}`).join(\"\\n\") || \"(no edges)\", items);\n });\n\n // ───────────── Node CRUD ─────────────\n\n reg(\n \"flow_add_node\",\n \"Add a node of any kind registered in fancy-flow's registry. Call flow_list_node_kinds first to discover what's available.\",\n {\n kind: { type: \"string\", description: \"Registry kind name (e.g. memory_store, llm_call, branch).\" },\n label: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n description: { type: \"string\" },\n config: { type: \"object\", description: \"Config fields per the kind's configSchema.\" },\n body: { type: \"string\", description: \"Note kinds only — body text.\" },\n },\n [\"kind\", \"label\", \"x\", \"y\"],\n async (args) => {\n const kindName = str(args.kind);\n // Resolve the kind dynamically from the registry. Falls back to the\n // legacy 6-pack so old graphs keep working.\n let kindDef: any = null;\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind, defaultConfigFor } = await import(\"@particle-academy/fancy-flow\" as any);\n kindDef = getNodeKind(kindName);\n var defaults: Record<string, unknown> = kindDef ? defaultConfigFor(kindDef) : {};\n } catch {\n var defaults: Record<string, unknown> = {};\n }\n const isLegacy = [\"trigger\", \"action\", \"decision\", \"output\", \"note\", \"subgraph\"].includes(kindName);\n if (!kindDef && !isLegacy) {\n return errorResult(`Unknown kind: ${kindName} — call flow_list_node_kinds for the registry.`);\n }\n const id = newId(\"n\");\n const config = { ...defaults, ...((args.config && typeof args.config === \"object\") ? (args.config as Record<string, unknown>) : {}) };\n let configWarnings: string[] = [];\n if (kindDef && validateConfigMode !== \"off\") {\n try {\n // @ts-ignore — optional peer dep\n const { validateConfig } = await import(\"@particle-academy/fancy-flow\" as any);\n const issues = (validateConfig(kindDef, config) ?? []) as Array<{ message: string }>;\n if (issues.length) {\n if (validateConfigMode === \"reject\") {\n return errorResult(\n `Config invalid for ${kindName}: ${issues.map((i) => i.message).join(\"; \")}. Call flow_get_node_schema for the accepted fields.`,\n );\n }\n configWarnings = issues.map((i) => i.message);\n }\n } catch {\n /* fancy-flow not importable → skip validation */\n }\n }\n const node: FlowNode = {\n id,\n type: kindName,\n position: { x: num(args.x), y: num(args.y) },\n data: {\n kind: kindName,\n label: str(args.label),\n ...(args.description ? { description: str(args.description) } : {}),\n config,\n ...(kindName === \"note\" && args.body ? { body: str(args.body) } : {}),\n } as any,\n };\n adapter.setNodes((all) => [...all, node]);\n return textResult(\n `Added ${kindName} ${id} (\"${str(args.label)}\")${configWarnings.length ? ` — config warnings: ${configWarnings.join(\"; \")}` : \"\"}`,\n node,\n );\n },\n flTarget,\n );\n\n reg(\n \"flow_update_node\",\n \"Update fields on a node. Only provided fields change.\",\n {\n id: { type: \"string\" },\n label: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n description: { type: \"string\" },\n config: { type: \"object\" },\n },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n // Read first so config validation can veto BEFORE any mutation applies.\n const current = adapter.getNodes().find((n) => n.id === id);\n if (!current) return errorResult(`No node with id ${id}`);\n\n const mergedConfig =\n args.config && typeof args.config === \"object\"\n ? { ...(current.data.config ?? {}), ...(args.config as Record<string, unknown>) }\n : current.data.config;\n\n let configWarnings: string[] = [];\n if (args.config && typeof args.config === \"object\" && validateConfigMode !== \"off\") {\n try {\n // @ts-ignore — optional peer dep\n const { getNodeKind, validateConfig } = await import(\"@particle-academy/fancy-flow\" as any);\n const kindDef = getNodeKind((current.data as any).kind ?? current.type);\n if (kindDef) {\n const issues = (validateConfig(kindDef, mergedConfig ?? {}) ?? []) as Array<{ message: string }>;\n if (issues.length) {\n if (validateConfigMode === \"reject\") {\n return errorResult(`Config invalid for ${id}: ${issues.map((i) => i.message).join(\"; \")}.`);\n }\n configWarnings = issues.map((i) => i.message);\n }\n }\n } catch {\n /* fancy-flow not importable → skip validation */\n }\n }\n\n const updated: FlowNode = {\n ...current,\n position: {\n x: args.x !== undefined ? num(args.x) : current.position.x,\n y: args.y !== undefined ? num(args.y) : current.position.y,\n },\n data: {\n ...current.data,\n ...(args.label !== undefined ? { label: str(args.label) } : {}),\n ...(args.description !== undefined ? { description: str(args.description) } : {}),\n ...(args.config && typeof args.config === \"object\" ? { config: mergedConfig } : {}),\n },\n };\n adapter.setNodes((all) => all.map((n) => (n.id === id ? updated : n)));\n return textResult(\n `Updated node ${id}${configWarnings.length ? ` — config warnings: ${configWarnings.join(\"; \")}` : \"\"}`,\n updated,\n );\n },\n flTarget,\n );\n\n reg(\n \"flow_delete_node\",\n \"Remove a node by id (also removes any connected edges).\",\n { id: { type: \"string\" } },\n [\"id\"],\n async (args) => {\n const id = str(args.id);\n // Validate existence BEFORE scheduling the state update — React's\n // functional updaters may run async in strict mode, so checking a\n // flag set inside the updater would race the response.\n const target = adapter.getNodes().find((n) => n.id === id);\n if (!target) return errorResult(`No node with id ${id}`);\n // Destructive → stage for human confirmation when pendingMode is on.\n if (pendingMode && adapter.confirm) {\n const ok = await adapter.confirm({ action: \"delete_node\", nodeId: id, label: target.data?.label });\n if (!ok) return textResult(`Delete of node ${id} was declined by the human.`);\n }\n adapter.setNodes((all) => all.filter((n) => n.id !== id));\n adapter.setEdges((all) => all.filter((e) => e.source !== id && e.target !== id));\n return textResult(`Deleted node ${id}`);\n },\n flTarget,\n );\n\n // ───────────── Edges ─────────────\n\n reg(\n \"flow_connect\",\n \"Create an edge between two nodes (optionally specifying handle ids).\",\n {\n source: { type: \"string\" },\n target: { type: \"string\" },\n sourceHandle: { type: \"string\" },\n targetHandle: { type: \"string\" },\n label: { type: \"string\" },\n },\n [\"source\", \"target\"],\n async (args) => {\n const source = str(args.source);\n const target = str(args.target);\n const sourceHandle = args.sourceHandle ? str(args.sourceHandle) : undefined;\n const targetHandle = args.targetHandle ? str(args.targetHandle) : undefined;\n const all = adapter.getNodes();\n if (!all.find((n) => n.id === source)) return errorResult(`No source node ${source}`);\n if (!all.find((n) => n.id === target)) return errorResult(`No target node ${target}`);\n\n // Enforce port-type compatibility with the SAME rule <FlowCanvas> applies,\n // so an agent can't build an edge the canvas would refuse (no drift).\n const validate = await getConnValidator();\n if (validate && !validate({ source, target, sourceHandle: sourceHandle ?? null, targetHandle: targetHandle ?? null })) {\n if (source === target) return errorResult(`Cannot connect node ${source} to itself.`);\n return errorResult(\n `Invalid connection ${source}${sourceHandle ? `:${sourceHandle}` : \"\"} → ${target}${targetHandle ? `:${targetHandle}` : \"\"}: incompatible port types or unknown handle. Call flow_get_node_schema to check the ports.`,\n );\n }\n\n const edge: FlowEdge = {\n id: newId(\"e\"),\n source,\n target,\n ...(sourceHandle ? { sourceHandle } : {}),\n ...(targetHandle ? { targetHandle } : {}),\n ...(args.label ? { label: str(args.label) } : {}),\n };\n adapter.setEdges((existing) => [...existing, edge]);\n return textResult(`Connected ${source}${edge.sourceHandle ? `:${edge.sourceHandle}` : \"\"} → ${target}${edge.targetHandle ? `:${edge.targetHandle}` : \"\"}`, edge);\n },\n flTarget,\n );\n\n reg(\n \"flow_disconnect\",\n \"Remove an edge by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n if (!adapter.getEdges().some((e) => e.id === id)) {\n return errorResult(`No edge ${id}`);\n }\n adapter.setEdges((all) => all.filter((e) => e.id !== id));\n return textResult(`Disconnected ${id}`);\n },\n flTarget,\n );\n\n // ───────────── Status / run ─────────────\n\n reg(\n \"flow_set_node_status\",\n \"Manually set a node's status badge (idle | queued | running | done | error) and optional text. Useful for narration outside a run.\",\n {\n id: { type: \"string\" },\n status: { type: \"string\", enum: [\"idle\", \"queued\", \"running\", \"done\", \"error\"] },\n text: { type: \"string\" },\n },\n [\"id\", \"status\"],\n (args) => {\n const id = str(args.id);\n const status = str(args.status) as NodeRunStatus;\n const text = args.text !== undefined ? str(args.text) : undefined;\n if (adapter.setNodeStatus) {\n adapter.setNodeStatus(id, status, text);\n } else {\n // Fall back to mutating the node data directly.\n let found = false;\n adapter.setNodes((all) =>\n all.map((n) => {\n if (n.id !== id) return n;\n found = true;\n return { ...n, data: { ...n.data, status, statusText: text } };\n }),\n );\n if (!found) return errorResult(`No node with id ${id}`);\n }\n return textResult(`${id} → ${status}${text ? ` (${text})` : \"\"}`);\n },\n flTarget,\n );\n\n reg(\n \"flow_run\",\n \"Trigger a run of the current graph. Returns the topological result. Requires the host to have wired `run` into the adapter.\",\n {},\n [],\n async () => {\n if (!adapter.run) return errorResult(\"Host did not provide a run handler.\");\n if (pendingMode && adapter.confirm) {\n const ok = await adapter.confirm({ action: \"run\" });\n if (!ok) return textResult(\"Run was declined by the human.\");\n }\n const result = await adapter.run();\n return textResult(result.ok ? \"Run complete\" : `Run failed: ${result.error ?? \"unknown\"}`, result);\n },\n flTarget,\n );\n\n reg(\n \"flow_cancel\",\n \"Cancel an in-flight run.\",\n {},\n [],\n () => {\n if (!adapter.cancel) return errorResult(\"Host did not provide a cancel handler.\");\n adapter.cancel();\n return textResult(\"Run cancelled\");\n },\n flTarget,\n );\n\n return {\n id: bridgeId,\n title: \"Flow\",\n dispose: () => {\n for (const d of disposers) d();\n },\n };\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { ensureUndoToolsRegistered } from './chunk-R4XXOGQH.js';
1
+ import { ensureUndoToolsRegistered } from './chunk-ZDKYKJFH.js';
2
2
  import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
3
3
  import './chunk-C3TYI5TJ.js';
4
- import { errorResult, textResult } from './chunk-CZV3WUW5.js';
4
+ import { errorResult, textResult } from './chunk-3GFKC6OK.js';
5
5
 
6
6
  // src/bridges/flow.ts
7
7
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
@@ -12,6 +12,7 @@ function registerFlowBridge(host, options) {
12
12
  const { adapter } = options;
13
13
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
14
14
  const disposers = [];
15
+ const bridgeId = "flow";
15
16
  const pendingMode = options.pendingMode ?? false;
16
17
  const validateConfigMode = options.validateConfig ?? "reject";
17
18
  let connValidator = void 0;
@@ -53,7 +54,8 @@ function registerFlowBridge(host, options) {
53
54
  description,
54
55
  inputSchema: { type: "object", properties, required, additionalProperties: false }
55
56
  },
56
- final
57
+ final,
58
+ { owner: bridgeId }
57
59
  )
58
60
  );
59
61
  };
@@ -398,7 +400,7 @@ function registerFlowBridge(host, options) {
398
400
  flTarget
399
401
  );
400
402
  return {
401
- id: "flow",
403
+ id: bridgeId,
402
404
  title: "Flow",
403
405
  dispose: () => {
404
406
  for (const d of disposers) d();