@particle-academy/agent-integrations 0.41.0 → 0.43.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 (171) hide show
  1. package/README.md +29 -0
  2. package/dist/bridges/artboard.d.cts +2 -2
  3. package/dist/bridges/artboard.d.ts +2 -2
  4. package/dist/bridges/catalog.d.cts +2 -2
  5. package/dist/bridges/catalog.d.ts +2 -2
  6. package/dist/bridges/charts.d.cts +2 -2
  7. package/dist/bridges/charts.d.ts +2 -2
  8. package/dist/bridges/cms.d.cts +2 -2
  9. package/dist/bridges/cms.d.ts +2 -2
  10. package/dist/bridges/code.d.cts +2 -2
  11. package/dist/bridges/code.d.ts +2 -2
  12. package/dist/bridges/doc.d.cts +2 -2
  13. package/dist/bridges/doc.d.ts +2 -2
  14. package/dist/bridges/features.d.cts +2 -2
  15. package/dist/bridges/features.d.ts +2 -2
  16. package/dist/bridges/files.d.cts +2 -2
  17. package/dist/bridges/files.d.ts +2 -2
  18. package/dist/bridges/flow.d.cts +2 -2
  19. package/dist/bridges/flow.d.ts +2 -2
  20. package/dist/bridges/forms.d.cts +2 -2
  21. package/dist/bridges/forms.d.ts +2 -2
  22. package/dist/bridges/git.d.cts +2 -2
  23. package/dist/bridges/git.d.ts +2 -2
  24. package/dist/bridges/grid.d.cts +2 -2
  25. package/dist/bridges/grid.d.ts +2 -2
  26. package/dist/bridges/map.d.cts +2 -2
  27. package/dist/bridges/map.d.ts +2 -2
  28. package/dist/bridges/passkeys.d.cts +2 -2
  29. package/dist/bridges/passkeys.d.ts +2 -2
  30. package/dist/bridges/scene.d.cts +2 -2
  31. package/dist/bridges/scene.d.ts +2 -2
  32. package/dist/bridges/screens.d.cts +2 -2
  33. package/dist/bridges/screens.d.ts +2 -2
  34. package/dist/bridges/sheets.d.cts +2 -2
  35. package/dist/bridges/sheets.d.ts +2 -2
  36. package/dist/bridges/slides.d.cts +2 -2
  37. package/dist/bridges/slides.d.ts +2 -2
  38. package/dist/bridges/terminal.d.cts +2 -2
  39. package/dist/bridges/terminal.d.ts +2 -2
  40. package/dist/bridges/tui.d.cts +1 -1
  41. package/dist/bridges/tui.d.ts +1 -1
  42. package/dist/bridges/whiteboard.d.cts +2 -2
  43. package/dist/bridges/whiteboard.d.ts +2 -2
  44. package/dist/bridges-artboard.cjs.map +1 -1
  45. package/dist/bridges-artboard.js +2 -2
  46. package/dist/bridges-catalog.cjs.map +1 -1
  47. package/dist/bridges-catalog.js +3 -3
  48. package/dist/bridges-charts.cjs.map +1 -1
  49. package/dist/bridges-charts.js +3 -3
  50. package/dist/bridges-cms.cjs.map +1 -1
  51. package/dist/bridges-cms.js +4 -4
  52. package/dist/bridges-code.cjs.map +1 -1
  53. package/dist/bridges-code.js +3 -3
  54. package/dist/bridges-doc.cjs.map +1 -1
  55. package/dist/bridges-doc.js +3 -3
  56. package/dist/bridges-features.cjs.map +1 -1
  57. package/dist/bridges-features.js +3 -3
  58. package/dist/bridges-files.cjs.map +1 -1
  59. package/dist/bridges-files.js +3 -3
  60. package/dist/bridges-flow.cjs.map +1 -1
  61. package/dist/bridges-flow.js +2 -2
  62. package/dist/bridges-forms.cjs.map +1 -1
  63. package/dist/bridges-forms.js +3 -3
  64. package/dist/bridges-git.cjs.map +1 -1
  65. package/dist/bridges-git.js +3 -3
  66. package/dist/bridges-grid.cjs.map +1 -1
  67. package/dist/bridges-grid.js +3 -3
  68. package/dist/bridges-map.cjs.map +1 -1
  69. package/dist/bridges-map.js +3 -3
  70. package/dist/bridges-passkeys.cjs.map +1 -1
  71. package/dist/bridges-passkeys.js +3 -3
  72. package/dist/bridges-scene.cjs.map +1 -1
  73. package/dist/bridges-scene.js +3 -3
  74. package/dist/bridges-screens.cjs.map +1 -1
  75. package/dist/bridges-screens.js +3 -3
  76. package/dist/bridges-sheets.cjs.map +1 -1
  77. package/dist/bridges-sheets.js +3 -3
  78. package/dist/bridges-slides.cjs.map +1 -1
  79. package/dist/bridges-slides.js +3 -3
  80. package/dist/bridges-terminal.cjs.map +1 -1
  81. package/dist/bridges-terminal.js +3 -3
  82. package/dist/bridges-tui.cjs.map +1 -1
  83. package/dist/bridges-tui.js +2 -2
  84. package/dist/bridges-whiteboard.cjs.map +1 -1
  85. package/dist/bridges-whiteboard.js +3 -3
  86. package/dist/{chunk-2U5JB6ZA.js → chunk-2LSU3NFO.js} +4 -4
  87. package/dist/{chunk-2U5JB6ZA.js.map → chunk-2LSU3NFO.js.map} +1 -1
  88. package/dist/{chunk-PR4SXFZH.js → chunk-2Q4EGZHJ.js} +4 -4
  89. package/dist/{chunk-PR4SXFZH.js.map → chunk-2Q4EGZHJ.js.map} +1 -1
  90. package/dist/{chunk-G5EZNWXJ.js → chunk-5W6YOXLT.js} +4 -4
  91. package/dist/{chunk-G5EZNWXJ.js.map → chunk-5W6YOXLT.js.map} +1 -1
  92. package/dist/{chunk-CA7GIJJC.js → chunk-7LLMILTM.js} +4 -4
  93. package/dist/{chunk-CA7GIJJC.js.map → chunk-7LLMILTM.js.map} +1 -1
  94. package/dist/{chunk-MFMBR6LN.js → chunk-E2I3YVKC.js} +3 -3
  95. package/dist/{chunk-MFMBR6LN.js.map → chunk-E2I3YVKC.js.map} +1 -1
  96. package/dist/{chunk-USQGA672.js → chunk-EIBV76IB.js} +4 -4
  97. package/dist/{chunk-USQGA672.js.map → chunk-EIBV76IB.js.map} +1 -1
  98. package/dist/{chunk-WCKSDFTM.js → chunk-GT63LSPJ.js} +4 -4
  99. package/dist/{chunk-WCKSDFTM.js.map → chunk-GT63LSPJ.js.map} +1 -1
  100. package/dist/{chunk-CT3LRNH7.js → chunk-HVDHT7DM.js} +3 -3
  101. package/dist/{chunk-CT3LRNH7.js.map → chunk-HVDHT7DM.js.map} +1 -1
  102. package/dist/{chunk-7THGQUX3.js → chunk-LOD77NCD.js} +4 -4
  103. package/dist/{chunk-7THGQUX3.js.map → chunk-LOD77NCD.js.map} +1 -1
  104. package/dist/{chunk-BHQJJ2YG.js → chunk-MZ74LLDS.js} +4 -4
  105. package/dist/{chunk-BHQJJ2YG.js.map → chunk-MZ74LLDS.js.map} +1 -1
  106. package/dist/{chunk-D756GBMQ.js → chunk-N5VOPV64.js} +4 -4
  107. package/dist/{chunk-D756GBMQ.js.map → chunk-N5VOPV64.js.map} +1 -1
  108. package/dist/{chunk-ZNGTC4CO.js → chunk-NIFPRC7P.js} +4 -4
  109. package/dist/{chunk-ZNGTC4CO.js.map → chunk-NIFPRC7P.js.map} +1 -1
  110. package/dist/{chunk-JJUABMAP.js → chunk-NIXOY473.js} +3 -3
  111. package/dist/{chunk-JJUABMAP.js.map → chunk-NIXOY473.js.map} +1 -1
  112. package/dist/{chunk-OAFJ53X3.js → chunk-NKAH67JK.js} +4 -4
  113. package/dist/{chunk-OAFJ53X3.js.map → chunk-NKAH67JK.js.map} +1 -1
  114. package/dist/{chunk-RIXYCFDO.js → chunk-PCFRBVKS.js} +4 -4
  115. package/dist/{chunk-RIXYCFDO.js.map → chunk-PCFRBVKS.js.map} +1 -1
  116. package/dist/{chunk-4D3II37O.js → chunk-PUMQDV67.js} +4 -4
  117. package/dist/{chunk-4D3II37O.js.map → chunk-PUMQDV67.js.map} +1 -1
  118. package/dist/{chunk-DF3PLL2E.js → chunk-QJYRWEXD.js} +28 -5
  119. package/dist/chunk-QJYRWEXD.js.map +1 -0
  120. package/dist/{chunk-GRHPEK6M.js → chunk-QOANLXSW.js} +53 -8
  121. package/dist/chunk-QOANLXSW.js.map +1 -0
  122. package/dist/{chunk-XY2TDE6E.js → chunk-SXVRIIXW.js} +4 -4
  123. package/dist/{chunk-XY2TDE6E.js.map → chunk-SXVRIIXW.js.map} +1 -1
  124. package/dist/{chunk-6YUBWQTS.js → chunk-TEB5U6Y5.js} +4 -4
  125. package/dist/{chunk-6YUBWQTS.js.map → chunk-TEB5U6Y5.js.map} +1 -1
  126. package/dist/{chunk-MJ2S25ON.js → chunk-VJD3Y7E5.js} +4 -4
  127. package/dist/{chunk-MJ2S25ON.js.map → chunk-VJD3Y7E5.js.map} +1 -1
  128. package/dist/{chunk-BT7HM5I6.js → chunk-WEXMZMJH.js} +3 -3
  129. package/dist/{chunk-BT7HM5I6.js.map → chunk-WEXMZMJH.js.map} +1 -1
  130. package/dist/{chunk-UZHNKUER.js → chunk-Z4L2GOAK.js} +4 -4
  131. package/dist/{chunk-UZHNKUER.js.map → chunk-Z4L2GOAK.js.map} +1 -1
  132. package/dist/components-shared-whiteboard.cjs +26 -3
  133. package/dist/components-shared-whiteboard.cjs.map +1 -1
  134. package/dist/components-shared-whiteboard.js +3 -3
  135. package/dist/index.cjs +88 -3
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.cts +88 -8
  138. package/dist/index.d.ts +88 -8
  139. package/dist/index.js +87 -26
  140. package/dist/index.js.map +1 -1
  141. package/dist/mcp/index.d.cts +3 -3
  142. package/dist/mcp/index.d.ts +3 -3
  143. package/dist/mcp.cjs +26 -3
  144. package/dist/mcp.cjs.map +1 -1
  145. package/dist/mcp.js +1 -1
  146. package/dist/relay-server/index.d.cts +36 -1
  147. package/dist/relay-server/index.d.ts +36 -1
  148. package/dist/relay-server-cli.cjs +51 -6
  149. package/dist/relay-server-cli.cjs.map +1 -1
  150. package/dist/relay-server-cli.js +1 -1
  151. package/dist/relay-server.cjs +51 -6
  152. package/dist/relay-server.cjs.map +1 -1
  153. package/dist/relay-server.js +1 -1
  154. package/dist/{server-DDD3IZ56.d.cts → server-BJNF7pQe.d.cts} +1 -1
  155. package/dist/{server-CDX643Kz.d.ts → server-Dt97UxuD.d.ts} +1 -1
  156. package/dist/sharing/index.d.cts +2 -2
  157. package/dist/sharing/index.d.ts +2 -2
  158. package/dist/sheets-adapter.d.cts +2 -2
  159. package/dist/sheets-adapter.d.ts +2 -2
  160. package/dist/{tool-host-EuYHYSSH.d.cts → tool-host-BpEBqf5u.d.cts} +17 -0
  161. package/dist/{tool-host-CWTOJEm2.d.ts → tool-host-xY5F-eqG.d.ts} +17 -0
  162. package/dist/{types-NFGP769G.d.cts → types-C4NaIW6B.d.cts} +1 -1
  163. package/dist/{types-BKD6uf86.d.ts → types-DSwsNTBG.d.ts} +1 -1
  164. package/dist/undo/index.d.cts +1 -1
  165. package/dist/undo/index.d.ts +1 -1
  166. package/dist/undo.cjs.map +1 -1
  167. package/dist/undo.js +3 -3
  168. package/docs/relay-server.md +34 -0
  169. package/package.json +1 -1
  170. package/dist/chunk-DF3PLL2E.js.map +0 -1
  171. package/dist/chunk-GRHPEK6M.js.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { ShareControls, AgentCursor, AgentActivityHighlight, AgentPanel } from './chunk-QDC7MXBH.js';
2
2
  import { createSessionDescriptor, attachSseRelay } from './chunk-6TZ5IBRN.js';
3
3
  import { attachInProcess } from './chunk-AFUULW5E.js';
4
- import { registerWhiteboardBridge } from './chunk-2U5JB6ZA.js';
5
- import './chunk-CT3LRNH7.js';
4
+ import { registerWhiteboardBridge } from './chunk-2LSU3NFO.js';
5
+ import './chunk-HVDHT7DM.js';
6
6
  import './chunk-2VENWGLZ.js';
7
7
  import './chunk-C3TYI5TJ.js';
8
- import { MicroMcpServer } from './chunk-DF3PLL2E.js';
8
+ import { MicroMcpServer } from './chunk-QJYRWEXD.js';
9
9
  import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
10
10
  import { Board, Connector, Shape, StickyNote, CursorLayer } from '@particle-academy/fancy-whiteboard';
11
11
  import { jsxs, jsx } from 'react/jsx-runtime';
package/dist/index.cjs CHANGED
@@ -44,14 +44,37 @@ var MCP_PROTOCOL_VERSION = "2025-06-18";
44
44
  var ToolRegistry = class {
45
45
  constructor() {
46
46
  this.tools = /* @__PURE__ */ new Map();
47
+ /**
48
+ * Tools that existed and were withdrawn, kept so a call that races an unmount
49
+ * can say WHICH thing happened.
50
+ *
51
+ * The tool surface is dynamic by design — "site tools always, page tools while
52
+ * mounted" — so an agent deciding to call a tool while the human navigates
53
+ * away is normal traffic, not an edge case. Reporting that as `Unknown tool`
54
+ * is the least useful thing available: it reads as "the agent is broken" or
55
+ * "you asked for something imaginary", when the truth is "that surface just
56
+ * closed".
57
+ *
58
+ * Names only. Nothing about the handler is retained, so this cannot keep a
59
+ * disposed surface alive.
60
+ */
61
+ this.withdrawn = /* @__PURE__ */ new Set();
47
62
  }
48
63
  registerTool(definition, handler) {
49
64
  this.tools.set(definition.name, { definition, handler });
65
+ this.withdrawn.delete(definition.name);
50
66
  this.onToolsChanged();
51
67
  return () => {
52
- if (this.tools.delete(definition.name)) this.onToolsChanged();
68
+ if (this.tools.delete(definition.name)) {
69
+ this.withdrawn.add(definition.name);
70
+ this.onToolsChanged();
71
+ }
53
72
  };
54
73
  }
74
+ /** Why `name` is not callable, phrased for whoever has to act on it. */
75
+ missingToolMessage(name) {
76
+ return this.withdrawn.has(name) ? `Tool "${name}" was withdrawn: the surface it targets is no longer mounted. Call tools/list for the current surface \u2014 the site-wide tools remain available.` : `Unknown tool: ${name}`;
77
+ }
55
78
  getTool(name) {
56
79
  return this.tools.get(name) ?? null;
57
80
  }
@@ -61,7 +84,7 @@ var ToolRegistry = class {
61
84
  async callTool(name, args = {}) {
62
85
  const tool = this.tools.get(name);
63
86
  if (!tool) {
64
- throw new Error(`Unknown tool: ${name}`);
87
+ throw new Error(this.missingToolMessage(name));
65
88
  }
66
89
  return tool.handler(args);
67
90
  }
@@ -142,7 +165,7 @@ var MicroMcpServer = class extends ToolRegistry {
142
165
  }
143
166
  const tool = this.tools.get(name);
144
167
  if (!tool) {
145
- throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unknown tool: ${name}`);
168
+ throw rpcError(JSONRPC_METHOD_NOT_FOUND, this.missingToolMessage(name));
146
169
  }
147
170
  const result = await tool.handler(args, { transport });
148
171
  return result;
@@ -4999,6 +5022,58 @@ function attachSseRelay(server, options) {
4999
5022
 
5000
5023
  // src/sharing/use-co-browse-session.ts
5001
5024
  init_registry();
5025
+
5026
+ // src/sharing/bridge-contributions.ts
5027
+ var BridgeContributions = class {
5028
+ constructor() {
5029
+ this.contributions = /* @__PURE__ */ new Map();
5030
+ this.applied = /* @__PURE__ */ new Map();
5031
+ this.server = null;
5032
+ }
5033
+ /**
5034
+ * Contribute bridges for as long as the returned disposer is uncalled.
5035
+ *
5036
+ * Applies immediately when a server is already live, and is held for the next
5037
+ * one otherwise — so a page need not know whether sharing has started.
5038
+ */
5039
+ add(contribute) {
5040
+ const key = /* @__PURE__ */ Symbol("bridge-contribution");
5041
+ this.contributions.set(key, contribute);
5042
+ if (this.server) this.apply(key, contribute, this.server);
5043
+ return () => {
5044
+ this.contributions.delete(key);
5045
+ this.withdraw(key);
5046
+ };
5047
+ }
5048
+ /** Attach a server and apply every live contribution to it. */
5049
+ bind(server) {
5050
+ if (this.server === server) return;
5051
+ if (this.server) this.unbind();
5052
+ this.server = server;
5053
+ for (const [key, contribute] of this.contributions) this.apply(key, contribute, server);
5054
+ }
5055
+ /**
5056
+ * Detach the current server, withdrawing what was applied to it. Contributions
5057
+ * themselves are KEPT: a session can be stopped and restarted under a page
5058
+ * that never unmounted, and its tools must come back rather than silently
5059
+ * vanish.
5060
+ */
5061
+ unbind() {
5062
+ for (const key of [...this.applied.keys()]) this.withdraw(key);
5063
+ this.server = null;
5064
+ }
5065
+ apply(key, contribute, server) {
5066
+ const dispose = contribute(server);
5067
+ if (typeof dispose === "function") this.applied.set(key, dispose);
5068
+ }
5069
+ withdraw(key) {
5070
+ const dispose = this.applied.get(key);
5071
+ this.applied.delete(key);
5072
+ dispose?.();
5073
+ }
5074
+ };
5075
+
5076
+ // src/sharing/use-co-browse-session.ts
5002
5077
  var DEFAULT_AGENT17 = { id: "agent", name: "Agent", color: "#a855f7" };
5003
5078
  var USER = { id: "human", name: "You" };
5004
5079
  function useCoBrowseSession(options) {
@@ -5006,6 +5081,8 @@ function useCoBrowseSession(options) {
5006
5081
  const agent = { ...DEFAULT_AGENT17, ...options.agent ?? {} };
5007
5082
  const relayBaseUrl = options.relayBaseUrl ?? "/agent-relay";
5008
5083
  const serverRef = react.useRef(null);
5084
+ const contributionsRef = react.useRef(null);
5085
+ if (!contributionsRef.current) contributionsRef.current = new BridgeContributions();
5009
5086
  const relayRef = react.useRef(null);
5010
5087
  const detachInProc = react.useRef(null);
5011
5088
  const disposeBridge = react.useRef(null);
@@ -5019,6 +5096,7 @@ function useCoBrowseSession(options) {
5019
5096
  });
5020
5097
  const bridge = registerNavigationBridge(server, { adapter, agent, pendingMode: options.pendingMode });
5021
5098
  extraBridges?.(server);
5099
+ contributionsRef.current.bind(server);
5022
5100
  const inProc = attachInProcess(server);
5023
5101
  detachInProc.current = () => inProc.close();
5024
5102
  disposeBridge.current = bridge.dispose;
@@ -5026,6 +5104,7 @@ function useCoBrowseSession(options) {
5026
5104
  return () => {
5027
5105
  relayRef.current?.close();
5028
5106
  relayRef.current = null;
5107
+ contributionsRef.current.unbind();
5029
5108
  disposeBridge.current?.();
5030
5109
  detachInProc.current?.();
5031
5110
  serverRef.current = null;
@@ -5084,8 +5163,13 @@ function useCoBrowseSession(options) {
5084
5163
  meta: event
5085
5164
  });
5086
5165
  }, []);
5166
+ const contributeBridges = react.useCallback(
5167
+ (contribute) => contributionsRef.current.add(contribute),
5168
+ []
5169
+ );
5087
5170
  return {
5088
5171
  server: serverRef.current,
5172
+ contributeBridges,
5089
5173
  session,
5090
5174
  relayState,
5091
5175
  agentConnected: agentCount > 0,
@@ -6283,6 +6367,7 @@ Object.defineProperty(exports, "undoOne", {
6283
6367
  exports.AgentActivityHighlight = AgentActivityHighlight;
6284
6368
  exports.AgentCursor = AgentCursor;
6285
6369
  exports.AgentPanel = AgentPanel;
6370
+ exports.BridgeContributions = BridgeContributions;
6286
6371
  exports.BridgedForm = BridgedForm;
6287
6372
  exports.CLAUDE_CONNECTORS_URL = CLAUDE_CONNECTORS_URL;
6288
6373
  exports.CONNECTOR_GLYPHS = CONNECTOR_GLYPHS;