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