@particle-academy/agent-integrations 0.40.0 → 0.42.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/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 +38 -3
- package/dist/bridges/files.d.ts +38 -3
- 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 +45 -0
- 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-A25E22WW.js → chunk-N5VOPV64.js} +49 -5
- package/dist/chunk-N5VOPV64.js.map +1 -0
- 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-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 +132 -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/{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/package.json +1 -1
- package/dist/chunk-A25E22WW.js.map +0 -1
- package/dist/chunk-DF3PLL2E.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;
|
|
@@ -2800,6 +2823,13 @@ function registerGitBridge(host, options) {
|
|
|
2800
2823
|
// src/bridges/files.ts
|
|
2801
2824
|
var DEFAULT_AGENT10 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
2802
2825
|
var MAX_SNAPSHOT_DEPTH = 8;
|
|
2826
|
+
function invalidFolderName(name) {
|
|
2827
|
+
const trimmed = name.trim();
|
|
2828
|
+
if (trimmed === "") return "A folder name is required.";
|
|
2829
|
+
if (trimmed.includes("/") || trimmed.includes("\\")) return "A folder name may not contain a path separator.";
|
|
2830
|
+
if (trimmed === "." || trimmed === "..") return "That folder name is reserved.";
|
|
2831
|
+
return null;
|
|
2832
|
+
}
|
|
2803
2833
|
function assertPathWithinRoot(root, path) {
|
|
2804
2834
|
const segments = path.replace(/[\\/]+/g, "/").split("/");
|
|
2805
2835
|
if (segments.includes("..")) {
|
|
@@ -2829,6 +2859,7 @@ var asPaths = (v) => {
|
|
|
2829
2859
|
function registerFilesBridge(host, options) {
|
|
2830
2860
|
const { adapter } = options;
|
|
2831
2861
|
const agent = { ...DEFAULT_AGENT10, ...options.agent ?? {} };
|
|
2862
|
+
const pendingMode = options.pendingMode ?? true;
|
|
2832
2863
|
const disposers = [];
|
|
2833
2864
|
const guard = (path) => {
|
|
2834
2865
|
if (options.root !== void 0) assertPathWithinRoot(options.root, path);
|
|
@@ -2995,6 +3026,42 @@ function registerFilesBridge(host, options) {
|
|
|
2995
3026
|
},
|
|
2996
3027
|
fTarget
|
|
2997
3028
|
);
|
|
3029
|
+
if (adapter.createFolder) {
|
|
3030
|
+
reg(
|
|
3031
|
+
"files_create_folder",
|
|
3032
|
+
"Create a folder inside `parentPath`. Staged for human confirmation unless the host disabled pendingMode.",
|
|
3033
|
+
{
|
|
3034
|
+
parentPath: { type: "string", description: "Directory to create in; defaults to the current directory." },
|
|
3035
|
+
name: { type: "string", description: "The new folder's name. A leaf name \u2014 no separators." },
|
|
3036
|
+
confirm: { type: "boolean", description: "Acknowledge a staged write when the host wired no confirm hook." }
|
|
3037
|
+
},
|
|
3038
|
+
["name"],
|
|
3039
|
+
async (args) => {
|
|
3040
|
+
const parentPath = guard(args.parentPath !== void 0 ? str3(args.parentPath) : adapter.getPath());
|
|
3041
|
+
const name = str3(args.name).trim();
|
|
3042
|
+
const invalid = invalidFolderName(name);
|
|
3043
|
+
if (invalid) return errorResult(invalid);
|
|
3044
|
+
const label = `${parentPath}/${name}`;
|
|
3045
|
+
if (pendingMode) {
|
|
3046
|
+
if (options.confirm) {
|
|
3047
|
+
const ok = await options.confirm({ action: "files_create_folder", path: label, label });
|
|
3048
|
+
if (!ok) return errorResult(`Declined: create folder ${label} (human did not confirm).`);
|
|
3049
|
+
} else if (args.confirm !== true) {
|
|
3050
|
+
return errorResult(
|
|
3051
|
+
`Staged: create folder ${label}. Re-call with confirm:true to proceed.`
|
|
3052
|
+
);
|
|
3053
|
+
}
|
|
3054
|
+
}
|
|
3055
|
+
try {
|
|
3056
|
+
await adapter.createFolder({ parentPath, name });
|
|
3057
|
+
} catch (e) {
|
|
3058
|
+
return errorResult(e instanceof Error ? e.message : String(e));
|
|
3059
|
+
}
|
|
3060
|
+
return textResult(`Created folder ${label}.`, { parentPath, name, path: label });
|
|
3061
|
+
},
|
|
3062
|
+
(args) => ({ kind: "directory", path: `${str3(args.parentPath)}/${str3(args.name)}`, label: str3(args.name) })
|
|
3063
|
+
);
|
|
3064
|
+
}
|
|
2998
3065
|
reg(
|
|
2999
3066
|
"files_request_snapshot",
|
|
3000
3067
|
"Request a fresh snapshot subtree rooted at `path` (snapshot mode) \u2014 e.g. to pull a remote machine's current tree. Requires the host to wire requestSnapshot.",
|
|
@@ -4955,6 +5022,58 @@ function attachSseRelay(server, options) {
|
|
|
4955
5022
|
|
|
4956
5023
|
// src/sharing/use-co-browse-session.ts
|
|
4957
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
|
|
4958
5077
|
var DEFAULT_AGENT17 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
4959
5078
|
var USER = { id: "human", name: "You" };
|
|
4960
5079
|
function useCoBrowseSession(options) {
|
|
@@ -4962,6 +5081,8 @@ function useCoBrowseSession(options) {
|
|
|
4962
5081
|
const agent = { ...DEFAULT_AGENT17, ...options.agent ?? {} };
|
|
4963
5082
|
const relayBaseUrl = options.relayBaseUrl ?? "/agent-relay";
|
|
4964
5083
|
const serverRef = react.useRef(null);
|
|
5084
|
+
const contributionsRef = react.useRef(null);
|
|
5085
|
+
if (!contributionsRef.current) contributionsRef.current = new BridgeContributions();
|
|
4965
5086
|
const relayRef = react.useRef(null);
|
|
4966
5087
|
const detachInProc = react.useRef(null);
|
|
4967
5088
|
const disposeBridge = react.useRef(null);
|
|
@@ -4975,6 +5096,7 @@ function useCoBrowseSession(options) {
|
|
|
4975
5096
|
});
|
|
4976
5097
|
const bridge = registerNavigationBridge(server, { adapter, agent, pendingMode: options.pendingMode });
|
|
4977
5098
|
extraBridges?.(server);
|
|
5099
|
+
contributionsRef.current.bind(server);
|
|
4978
5100
|
const inProc = attachInProcess(server);
|
|
4979
5101
|
detachInProc.current = () => inProc.close();
|
|
4980
5102
|
disposeBridge.current = bridge.dispose;
|
|
@@ -4982,6 +5104,7 @@ function useCoBrowseSession(options) {
|
|
|
4982
5104
|
return () => {
|
|
4983
5105
|
relayRef.current?.close();
|
|
4984
5106
|
relayRef.current = null;
|
|
5107
|
+
contributionsRef.current.unbind();
|
|
4985
5108
|
disposeBridge.current?.();
|
|
4986
5109
|
detachInProc.current?.();
|
|
4987
5110
|
serverRef.current = null;
|
|
@@ -5040,8 +5163,13 @@ function useCoBrowseSession(options) {
|
|
|
5040
5163
|
meta: event
|
|
5041
5164
|
});
|
|
5042
5165
|
}, []);
|
|
5166
|
+
const contributeBridges = react.useCallback(
|
|
5167
|
+
(contribute) => contributionsRef.current.add(contribute),
|
|
5168
|
+
[]
|
|
5169
|
+
);
|
|
5043
5170
|
return {
|
|
5044
5171
|
server: serverRef.current,
|
|
5172
|
+
contributeBridges,
|
|
5045
5173
|
session,
|
|
5046
5174
|
relayState,
|
|
5047
5175
|
agentConnected: agentCount > 0,
|
|
@@ -6239,6 +6367,7 @@ Object.defineProperty(exports, "undoOne", {
|
|
|
6239
6367
|
exports.AgentActivityHighlight = AgentActivityHighlight;
|
|
6240
6368
|
exports.AgentCursor = AgentCursor;
|
|
6241
6369
|
exports.AgentPanel = AgentPanel;
|
|
6370
|
+
exports.BridgeContributions = BridgeContributions;
|
|
6242
6371
|
exports.BridgedForm = BridgedForm;
|
|
6243
6372
|
exports.CLAUDE_CONNECTORS_URL = CLAUDE_CONNECTORS_URL;
|
|
6244
6373
|
exports.CONNECTOR_GLYPHS = CONNECTOR_GLYPHS;
|