@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.
- package/README.md +29 -0
- package/dist/bridges/artboard.d.cts +2 -2
- package/dist/bridges/artboard.d.ts +2 -2
- package/dist/bridges/catalog.d.cts +2 -2
- package/dist/bridges/catalog.d.ts +2 -2
- package/dist/bridges/charts.d.cts +2 -2
- package/dist/bridges/charts.d.ts +2 -2
- package/dist/bridges/cms.d.cts +2 -2
- package/dist/bridges/cms.d.ts +2 -2
- package/dist/bridges/code.d.cts +2 -2
- package/dist/bridges/code.d.ts +2 -2
- package/dist/bridges/doc.d.cts +2 -2
- package/dist/bridges/doc.d.ts +2 -2
- package/dist/bridges/features.d.cts +2 -2
- package/dist/bridges/features.d.ts +2 -2
- package/dist/bridges/files.d.cts +2 -2
- package/dist/bridges/files.d.ts +2 -2
- package/dist/bridges/flow.d.cts +2 -2
- package/dist/bridges/flow.d.ts +2 -2
- package/dist/bridges/forms.d.cts +2 -2
- package/dist/bridges/forms.d.ts +2 -2
- package/dist/bridges/git.d.cts +2 -2
- package/dist/bridges/git.d.ts +2 -2
- package/dist/bridges/grid.d.cts +2 -2
- package/dist/bridges/grid.d.ts +2 -2
- package/dist/bridges/map.d.cts +2 -2
- package/dist/bridges/map.d.ts +2 -2
- package/dist/bridges/passkeys.d.cts +2 -2
- package/dist/bridges/passkeys.d.ts +2 -2
- package/dist/bridges/scene.d.cts +2 -2
- package/dist/bridges/scene.d.ts +2 -2
- package/dist/bridges/screens.d.cts +2 -2
- package/dist/bridges/screens.d.ts +2 -2
- package/dist/bridges/sheets.d.cts +2 -2
- package/dist/bridges/sheets.d.ts +2 -2
- package/dist/bridges/slides.d.cts +2 -2
- package/dist/bridges/slides.d.ts +2 -2
- package/dist/bridges/terminal.d.cts +2 -2
- package/dist/bridges/terminal.d.ts +2 -2
- package/dist/bridges/tui.d.cts +1 -1
- package/dist/bridges/tui.d.ts +1 -1
- package/dist/bridges/whiteboard.d.cts +2 -2
- package/dist/bridges/whiteboard.d.ts +2 -2
- package/dist/bridges-artboard.cjs.map +1 -1
- package/dist/bridges-artboard.js +2 -2
- package/dist/bridges-catalog.cjs.map +1 -1
- package/dist/bridges-catalog.js +3 -3
- package/dist/bridges-charts.cjs.map +1 -1
- package/dist/bridges-charts.js +3 -3
- package/dist/bridges-cms.cjs.map +1 -1
- package/dist/bridges-cms.js +4 -4
- package/dist/bridges-code.cjs.map +1 -1
- package/dist/bridges-code.js +3 -3
- package/dist/bridges-doc.cjs.map +1 -1
- package/dist/bridges-doc.js +3 -3
- package/dist/bridges-features.cjs.map +1 -1
- package/dist/bridges-features.js +3 -3
- package/dist/bridges-files.cjs.map +1 -1
- package/dist/bridges-files.js +3 -3
- package/dist/bridges-flow.cjs.map +1 -1
- package/dist/bridges-flow.js +2 -2
- package/dist/bridges-forms.cjs.map +1 -1
- package/dist/bridges-forms.js +3 -3
- package/dist/bridges-git.cjs.map +1 -1
- package/dist/bridges-git.js +3 -3
- package/dist/bridges-grid.cjs.map +1 -1
- package/dist/bridges-grid.js +3 -3
- package/dist/bridges-map.cjs.map +1 -1
- package/dist/bridges-map.js +3 -3
- package/dist/bridges-passkeys.cjs.map +1 -1
- package/dist/bridges-passkeys.js +3 -3
- package/dist/bridges-scene.cjs.map +1 -1
- package/dist/bridges-scene.js +3 -3
- package/dist/bridges-screens.cjs.map +1 -1
- package/dist/bridges-screens.js +3 -3
- package/dist/bridges-sheets.cjs.map +1 -1
- package/dist/bridges-sheets.js +3 -3
- package/dist/bridges-slides.cjs.map +1 -1
- package/dist/bridges-slides.js +3 -3
- package/dist/bridges-terminal.cjs.map +1 -1
- package/dist/bridges-terminal.js +3 -3
- package/dist/bridges-tui.cjs.map +1 -1
- package/dist/bridges-tui.js +2 -2
- package/dist/bridges-whiteboard.cjs.map +1 -1
- package/dist/bridges-whiteboard.js +3 -3
- package/dist/{chunk-2U5JB6ZA.js → chunk-2LSU3NFO.js} +4 -4
- package/dist/{chunk-2U5JB6ZA.js.map → chunk-2LSU3NFO.js.map} +1 -1
- package/dist/{chunk-PR4SXFZH.js → chunk-2Q4EGZHJ.js} +4 -4
- package/dist/{chunk-PR4SXFZH.js.map → chunk-2Q4EGZHJ.js.map} +1 -1
- package/dist/{chunk-G5EZNWXJ.js → chunk-5W6YOXLT.js} +4 -4
- package/dist/{chunk-G5EZNWXJ.js.map → chunk-5W6YOXLT.js.map} +1 -1
- package/dist/{chunk-CA7GIJJC.js → chunk-7LLMILTM.js} +4 -4
- package/dist/{chunk-CA7GIJJC.js.map → chunk-7LLMILTM.js.map} +1 -1
- package/dist/{chunk-MFMBR6LN.js → chunk-E2I3YVKC.js} +3 -3
- package/dist/{chunk-MFMBR6LN.js.map → chunk-E2I3YVKC.js.map} +1 -1
- package/dist/{chunk-USQGA672.js → chunk-EIBV76IB.js} +4 -4
- package/dist/{chunk-USQGA672.js.map → chunk-EIBV76IB.js.map} +1 -1
- package/dist/{chunk-WCKSDFTM.js → chunk-GT63LSPJ.js} +4 -4
- package/dist/{chunk-WCKSDFTM.js.map → chunk-GT63LSPJ.js.map} +1 -1
- package/dist/{chunk-CT3LRNH7.js → chunk-HVDHT7DM.js} +3 -3
- package/dist/{chunk-CT3LRNH7.js.map → chunk-HVDHT7DM.js.map} +1 -1
- package/dist/{chunk-7THGQUX3.js → chunk-LOD77NCD.js} +4 -4
- package/dist/{chunk-7THGQUX3.js.map → chunk-LOD77NCD.js.map} +1 -1
- package/dist/{chunk-BHQJJ2YG.js → chunk-MZ74LLDS.js} +4 -4
- package/dist/{chunk-BHQJJ2YG.js.map → chunk-MZ74LLDS.js.map} +1 -1
- package/dist/{chunk-D756GBMQ.js → chunk-N5VOPV64.js} +4 -4
- package/dist/{chunk-D756GBMQ.js.map → chunk-N5VOPV64.js.map} +1 -1
- package/dist/{chunk-ZNGTC4CO.js → chunk-NIFPRC7P.js} +4 -4
- package/dist/{chunk-ZNGTC4CO.js.map → chunk-NIFPRC7P.js.map} +1 -1
- package/dist/{chunk-JJUABMAP.js → chunk-NIXOY473.js} +3 -3
- package/dist/{chunk-JJUABMAP.js.map → chunk-NIXOY473.js.map} +1 -1
- package/dist/{chunk-OAFJ53X3.js → chunk-NKAH67JK.js} +4 -4
- package/dist/{chunk-OAFJ53X3.js.map → chunk-NKAH67JK.js.map} +1 -1
- package/dist/{chunk-RIXYCFDO.js → chunk-PCFRBVKS.js} +4 -4
- package/dist/{chunk-RIXYCFDO.js.map → chunk-PCFRBVKS.js.map} +1 -1
- package/dist/{chunk-4D3II37O.js → chunk-PUMQDV67.js} +4 -4
- package/dist/{chunk-4D3II37O.js.map → chunk-PUMQDV67.js.map} +1 -1
- package/dist/{chunk-DF3PLL2E.js → chunk-QJYRWEXD.js} +28 -5
- package/dist/chunk-QJYRWEXD.js.map +1 -0
- package/dist/{chunk-GRHPEK6M.js → chunk-QOANLXSW.js} +53 -8
- package/dist/chunk-QOANLXSW.js.map +1 -0
- package/dist/{chunk-XY2TDE6E.js → chunk-SXVRIIXW.js} +4 -4
- package/dist/{chunk-XY2TDE6E.js.map → chunk-SXVRIIXW.js.map} +1 -1
- package/dist/{chunk-6YUBWQTS.js → chunk-TEB5U6Y5.js} +4 -4
- package/dist/{chunk-6YUBWQTS.js.map → chunk-TEB5U6Y5.js.map} +1 -1
- package/dist/{chunk-MJ2S25ON.js → chunk-VJD3Y7E5.js} +4 -4
- package/dist/{chunk-MJ2S25ON.js.map → chunk-VJD3Y7E5.js.map} +1 -1
- package/dist/{chunk-BT7HM5I6.js → chunk-WEXMZMJH.js} +3 -3
- package/dist/{chunk-BT7HM5I6.js.map → chunk-WEXMZMJH.js.map} +1 -1
- package/dist/{chunk-UZHNKUER.js → chunk-Z4L2GOAK.js} +4 -4
- package/dist/{chunk-UZHNKUER.js.map → chunk-Z4L2GOAK.js.map} +1 -1
- package/dist/components-shared-whiteboard.cjs +26 -3
- package/dist/components-shared-whiteboard.cjs.map +1 -1
- package/dist/components-shared-whiteboard.js +3 -3
- package/dist/index.cjs +88 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +88 -8
- package/dist/index.d.ts +88 -8
- package/dist/index.js +87 -26
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.cts +3 -3
- package/dist/mcp/index.d.ts +3 -3
- package/dist/mcp.cjs +26 -3
- package/dist/mcp.cjs.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/relay-server/index.d.cts +36 -1
- package/dist/relay-server/index.d.ts +36 -1
- package/dist/relay-server-cli.cjs +51 -6
- package/dist/relay-server-cli.cjs.map +1 -1
- package/dist/relay-server-cli.js +1 -1
- package/dist/relay-server.cjs +51 -6
- package/dist/relay-server.cjs.map +1 -1
- package/dist/relay-server.js +1 -1
- package/dist/{server-DDD3IZ56.d.cts → server-BJNF7pQe.d.cts} +1 -1
- package/dist/{server-CDX643Kz.d.ts → server-Dt97UxuD.d.ts} +1 -1
- package/dist/sharing/index.d.cts +2 -2
- package/dist/sharing/index.d.ts +2 -2
- package/dist/sheets-adapter.d.cts +2 -2
- package/dist/sheets-adapter.d.ts +2 -2
- package/dist/{tool-host-EuYHYSSH.d.cts → tool-host-BpEBqf5u.d.cts} +17 -0
- package/dist/{tool-host-CWTOJEm2.d.ts → tool-host-xY5F-eqG.d.ts} +17 -0
- package/dist/{types-NFGP769G.d.cts → types-C4NaIW6B.d.cts} +1 -1
- package/dist/{types-BKD6uf86.d.ts → types-DSwsNTBG.d.ts} +1 -1
- package/dist/undo/index.d.cts +1 -1
- package/dist/undo/index.d.ts +1 -1
- package/dist/undo.cjs.map +1 -1
- package/dist/undo.js +3 -3
- package/docs/relay-server.md +34 -0
- package/package.json +1 -1
- package/dist/chunk-DF3PLL2E.js.map +0 -1
- 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-
|
|
5
|
-
import './chunk-
|
|
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-
|
|
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))
|
|
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(
|
|
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,
|
|
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;
|