@particle-academy/agent-integrations 0.24.0 → 0.26.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 (64) hide show
  1. package/dist/bridges/sheets.d.cts +3 -1
  2. package/dist/bridges/sheets.d.ts +3 -1
  3. package/dist/bridges/slides.d.cts +0 -1
  4. package/dist/bridges/slides.d.ts +0 -1
  5. package/dist/bridges-charts.cjs +77 -0
  6. package/dist/bridges-charts.cjs.map +1 -1
  7. package/dist/bridges-charts.js +2 -1
  8. package/dist/bridges-code.cjs +77 -0
  9. package/dist/bridges-code.cjs.map +1 -1
  10. package/dist/bridges-code.js +2 -1
  11. package/dist/bridges-files.cjs +1 -1
  12. package/dist/bridges-files.cjs.map +1 -1
  13. package/dist/bridges-files.js +1 -1
  14. package/dist/bridges-flow.cjs +77 -0
  15. package/dist/bridges-flow.cjs.map +1 -1
  16. package/dist/bridges-flow.js +2 -0
  17. package/dist/bridges-flow.js.map +1 -1
  18. package/dist/bridges-forms.cjs +77 -0
  19. package/dist/bridges-forms.cjs.map +1 -1
  20. package/dist/bridges-forms.js +2 -1
  21. package/dist/bridges-map.cjs +1 -1
  22. package/dist/bridges-map.cjs.map +1 -1
  23. package/dist/bridges-map.js +1 -1
  24. package/dist/bridges-scene.cjs +77 -0
  25. package/dist/bridges-scene.cjs.map +1 -1
  26. package/dist/bridges-scene.js +2 -1
  27. package/dist/bridges-screens.cjs +77 -0
  28. package/dist/bridges-screens.cjs.map +1 -1
  29. package/dist/bridges-screens.js +2 -1
  30. package/dist/bridges-sheets.cjs +85 -5
  31. package/dist/bridges-sheets.cjs.map +1 -1
  32. package/dist/bridges-sheets.js +2 -1
  33. package/dist/bridges-slides.cjs +86 -13
  34. package/dist/bridges-slides.cjs.map +1 -1
  35. package/dist/bridges-slides.js +2 -1
  36. package/dist/{chunk-FSUAKQ3X.js → chunk-46H4C5AP.js} +13 -9
  37. package/dist/chunk-46H4C5AP.js.map +1 -0
  38. package/dist/{chunk-5AD35HS5.js → chunk-775LJJTJ.js} +4 -2
  39. package/dist/chunk-775LJJTJ.js.map +1 -0
  40. package/dist/{chunk-UOMSY7MZ.js → chunk-CLFDQ2BW.js} +3 -3
  41. package/dist/{chunk-UOMSY7MZ.js.map → chunk-CLFDQ2BW.js.map} +1 -1
  42. package/dist/{chunk-SJ7H242B.js → chunk-EP3G4LYW.js} +4 -2
  43. package/dist/chunk-EP3G4LYW.js.map +1 -0
  44. package/dist/{chunk-VUMFO2UW.js → chunk-K3S6WSHZ.js} +4 -2
  45. package/dist/chunk-K3S6WSHZ.js.map +1 -0
  46. package/dist/{chunk-3VRQGDKV.js → chunk-NKRSLCS7.js} +3 -3
  47. package/dist/{chunk-3VRQGDKV.js.map → chunk-NKRSLCS7.js.map} +1 -1
  48. package/dist/{chunk-FYGMFIY5.js → chunk-QDF37J3V.js} +4 -2
  49. package/dist/chunk-QDF37J3V.js.map +1 -0
  50. package/dist/{chunk-4ZVSKAF5.js → chunk-V5BXBX7U.js} +9 -5
  51. package/dist/chunk-V5BXBX7U.js.map +1 -0
  52. package/dist/{chunk-CKK4QKD2.js → chunk-YMX7G3XM.js} +4 -2
  53. package/dist/chunk-YMX7G3XM.js.map +1 -0
  54. package/dist/index.cjs +104 -90
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.js +10 -10
  57. package/package.json +1 -1
  58. package/dist/chunk-4ZVSKAF5.js.map +0 -1
  59. package/dist/chunk-5AD35HS5.js.map +0 -1
  60. package/dist/chunk-CKK4QKD2.js.map +0 -1
  61. package/dist/chunk-FSUAKQ3X.js.map +0 -1
  62. package/dist/chunk-FYGMFIY5.js.map +0 -1
  63. package/dist/chunk-SJ7H242B.js.map +0 -1
  64. package/dist/chunk-VUMFO2UW.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { ensureUndoToolsRegistered } from './chunk-KJ5AOOV7.js';
1
2
  import { wrapToolWithActivity } from './chunk-ULJL53DL.js';
2
3
  import { textResult, errorResult } from './chunk-4KAIV6OD.js';
3
4
 
@@ -7,6 +8,7 @@ function registerScreensBridge(host, options) {
7
8
  const { adapter } = options;
8
9
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
9
10
  const disposers = [];
11
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
10
12
  const target = (screenId) => ({
11
13
  kind: "screens",
12
14
  screenId,
@@ -176,5 +178,5 @@ function registerScreensBridge(host, options) {
176
178
  }
177
179
 
178
180
  export { registerScreensBridge };
179
- //# sourceMappingURL=chunk-CKK4QKD2.js.map
180
- //# sourceMappingURL=chunk-CKK4QKD2.js.map
181
+ //# sourceMappingURL=chunk-YMX7G3XM.js.map
182
+ //# sourceMappingURL=chunk-YMX7G3XM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/screens.ts"],"names":[],"mappings":"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","file":"chunk-YMX7G3XM.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose snapshot of a screen — what's in fancy-screens' ScreenMeta plus\n * the host's optional activity status. Kept here so this bridge has no\n * hard dep on fancy-screens.\n */\nexport type ScreenSnapshot = {\n id: string;\n title?: string;\n /** Whether this screen is the one the human / agent is looking at. */\n active: boolean;\n /** Optional category / kind (e.g. \"form\", \"whiteboard\"). */\n kind?: string;\n};\n\n/**\n * Spec for a dynamically-created screen. The host's `createScreen`\n * implementation looks up `kind` in its template registry and instantiates\n * the matching surface (form / whiteboard / sheet / chart / markdown / etc.).\n */\nexport type ScreenCreateSpec = {\n id: string;\n title?: string;\n /** Template kind. Hosts decide the catalog. */\n kind: string;\n /** Template-specific config. Form: { fields }. Sheet: { headers }. etc. */\n config?: Record<string, unknown>;\n};\n\n/**\n * Adapter exposes the host's screen-navigation surface to the bridge.\n * Hosts wire this up against react-router, a custom tab state, or the\n * fancy-screens registry — wherever \"current screen\" lives.\n *\n * The optional create / destroy / update hooks let agents author screens\n * dynamically against a host-defined template catalog.\n */\nexport type ScreensBridgeAdapter = {\n /** List every available screen. */\n listScreens: () => ScreenSnapshot[];\n /** Read which screen is currently active. */\n getActive: () => string | null;\n /** Navigate to a screen by id. Host updates router / tab state. */\n setActive: (screenId: string) => void;\n /** Optional: instantiate a new screen from a template + config. */\n createScreen?: (spec: ScreenCreateSpec) => void;\n /** Optional: remove a previously-created screen. */\n destroyScreen?: (screenId: string) => void;\n /** Optional: shallow-merge new config into an existing screen. */\n updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => void;\n /** Optional: enumerate the kinds the host knows how to instantiate. */\n listKinds?: () => Array<{ kind: string; label?: string; description?: string; configSchema?: unknown }>;\n};\n\nexport type ScreensBridgeOptions = {\n adapter: ScreensBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerScreensBridge — top-level navigation bridge so agents can\n * switch between screens (`screens_navigate`) and discover what surfaces\n * exist (`screens_list`, `screens_describe_active`).\n *\n * Pair with the per-surface bridges (whiteboard, form, sheet, etc.) so\n * the agent has both navigation and per-screen control.\n */\nexport function registerScreensBridge(\n host: ToolHost,\n options: ScreensBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n // agent_undo / agent_redo / agent_history are registered whenever any bridge\n // mounts, so undo availability doesn't hinge on which bridges are co-present.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (screenId: string): AgentTarget => ({\n kind: \"screens\",\n screenId,\n label: `Screen ${screenId}`,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n isMutation: boolean,\n targetFromArgs?: (args: JsonObject) => AgentTarget,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try { return await handler(args); }\n catch (e) { return errorResult(e instanceof Error ? e.message : String(e)); }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name, agent, kind: \"screens\",\n resolveTarget: ({ args }) => targetFromArgs?.(args) ?? null,\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n final as any,\n ),\n );\n };\n\n reg(\n \"screens_list\",\n \"List every screen the host has registered. Returns id, title, active flag, and optional kind.\",\n {},\n [],\n () => {\n const screens = adapter.listScreens();\n const text = screens\n .map((s) => `${s.active ? \"▸\" : \" \"} ${s.id}${s.title ? ` — ${s.title}` : \"\"}${s.kind ? ` [${s.kind}]` : \"\"}`)\n .join(\"\\n\");\n return textResult(text || \"(no screens)\", { screens, active: adapter.getActive() });\n },\n false,\n );\n\n reg(\n \"screens_describe_active\",\n \"Get the currently-active screen id (or null).\",\n {},\n [],\n () => {\n const active = adapter.getActive();\n return textResult(active ?? \"(none)\", { active });\n },\n false,\n );\n\n reg(\n \"screens_list_kinds\",\n \"List the screen kinds (templates) the host knows how to instantiate. Use this before screens_create to know what's available.\",\n {},\n [],\n () => {\n if (!adapter.listKinds) return errorResult(\"Host did not register a kind catalog. Cannot create screens dynamically.\");\n const kinds = adapter.listKinds();\n const text = kinds.map((k) => `${k.kind}${k.label ? ` — ${k.label}` : \"\"}${k.description ? ` (${k.description})` : \"\"}`).join(\"\\n\");\n return textResult(text || \"(no kinds registered)\", kinds);\n },\n false,\n );\n\n reg(\n \"screens_create\",\n \"Instantiate a new screen from a template kind + config. Switches the active view to the new screen.\",\n {\n id: { type: \"string\", description: \"Stable screen id. Must be unique.\" },\n title: { type: \"string\" },\n kind: { type: \"string\", description: \"Template kind — call screens_list_kinds for the catalog.\" },\n config: { type: \"object\", description: \"Template-specific config (e.g. { fields: [...] } for a form).\" },\n },\n [\"id\", \"kind\"],\n (args) => {\n if (!adapter.createScreen) return errorResult(\"Host did not provide createScreen.\");\n const id = String(args.id);\n const kind = String(args.kind);\n if (adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`Screen ${id} already exists. Use screens_destroy first or pick a fresh id.`);\n }\n adapter.createScreen({\n id,\n title: typeof args.title === \"string\" ? args.title : undefined,\n kind,\n config: (args.config && typeof args.config === \"object\") ? args.config as Record<string, unknown> : undefined,\n });\n adapter.setActive(id);\n return textResult(`Created ${kind} screen \"${id}\"`, { id, kind });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_destroy\",\n \"Remove a previously-created screen. Active screen falls back to the first remaining one (or null).\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n if (!adapter.destroyScreen) return errorResult(\"Host did not provide destroyScreen.\");\n const id = String(args.id);\n if (!adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`No screen with id ${id}`);\n }\n adapter.destroyScreen(id);\n return textResult(`Destroyed screen ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_set_layout\",\n \"Change the layout of an existing composite screen. Layouts: 'single', 'split-h' (left/right), 'split-v' (top/bottom), 'grid-2x2', 'stack' (tabs).\",\n {\n id: { type: \"string\" },\n layout: { type: \"string\", enum: [\"single\", \"split-h\", \"split-v\", \"grid-2x2\", \"stack\"] },\n },\n [\"id\", \"layout\"],\n (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n adapter.updateScreenContent(String(args.id), { layout: String(args.layout) });\n return textResult(`Layout of ${args.id} → ${args.layout}`, { id: args.id, layout: args.layout });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_update_content\",\n \"Merge new config into an existing screen (e.g. add a field to a form, append a sheet column, change chart series).\",\n {\n id: { type: \"string\" },\n partial: { type: \"object\", description: \"Shallow-merged into the screen's config.\" },\n },\n [\"id\", \"partial\"],\n (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n const id = String(args.id);\n const partial = (args.partial && typeof args.partial === \"object\") ? args.partial as Record<string, unknown> : {};\n adapter.updateScreenContent(id, partial);\n return textResult(`Updated content of ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_navigate\",\n \"Switch the human's view to a different screen. The host updates its router / tab state and re-renders.\",\n { screen: { type: \"string\", description: \"Screen id to activate.\" } },\n [\"screen\"],\n (args) => {\n const screenId = String(args.screen ?? \"\");\n const screens = adapter.listScreens();\n if (!screens.find((s) => s.id === screenId)) {\n return errorResult(`No screen registered with id \"${screenId}\". Call screens_list first.`);\n }\n adapter.setActive(screenId);\n return textResult(`Navigated to ${screenId}`, { screen: screenId });\n },\n true,\n (args) => target(String(args.screen ?? \"\")),\n );\n\n return {\n id: \"screens\",\n title: \"Screens\",\n dispose: () => { for (const d of disposers) d(); },\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,9 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var fancyAutoCommon = require('@particle-academy/fancy-auto-common');
4
- var fancySheets = require('@particle-academy/fancy-sheets');
5
4
  var react = require('react');
6
- var fancySlides = require('@particle-academy/fancy-slides');
7
5
  var jsxRuntime = require('react/jsx-runtime');
8
6
  var reactDom = require('react-dom');
9
7
 
@@ -287,12 +285,89 @@ function extractMeta(result) {
287
285
  return void 0;
288
286
  }
289
287
 
288
+ // src/undo/undo-tools.ts
289
+ var installedHosts = /* @__PURE__ */ new WeakSet();
290
+ function ensureUndoToolsRegistered(host, options = {}) {
291
+ if (installedHosts.has(host)) return;
292
+ installedHosts.add(host);
293
+ registerUndoTools(host, options);
294
+ }
295
+ function registerUndoTools(host, options = {}) {
296
+ const defaultAgent = options.defaultAgentId ?? "agent";
297
+ const disposers = [];
298
+ const agentOf = (args) => typeof args?.agentId === "string" ? args.agentId : defaultAgent;
299
+ disposers.push(
300
+ host.registerTool(
301
+ {
302
+ name: "agent_undo",
303
+ description: "Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.",
304
+ inputSchema: {
305
+ type: "object",
306
+ properties: { agentId: { type: "string" } },
307
+ additionalProperties: false
308
+ }
309
+ },
310
+ async (args) => {
311
+ const entry = await fancyAutoCommon.undoOne(agentOf(args));
312
+ if (!entry) return errorResult("Nothing to undo.");
313
+ return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
314
+ }
315
+ )
316
+ );
317
+ disposers.push(
318
+ host.registerTool(
319
+ {
320
+ name: "agent_redo",
321
+ description: "Redo the most recently undone action.",
322
+ inputSchema: {
323
+ type: "object",
324
+ properties: { agentId: { type: "string" } },
325
+ additionalProperties: false
326
+ }
327
+ },
328
+ async (args) => {
329
+ const entry = await fancyAutoCommon.redoOne(agentOf(args));
330
+ if (!entry) return errorResult("Nothing to redo.");
331
+ return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
332
+ }
333
+ )
334
+ );
335
+ disposers.push(
336
+ host.registerTool(
337
+ {
338
+ name: "agent_history",
339
+ description: "List the agent's undo stack (oldest first). Useful for understanding what's reversible.",
340
+ inputSchema: {
341
+ type: "object",
342
+ properties: { agentId: { type: "string" } },
343
+ additionalProperties: false
344
+ }
345
+ },
346
+ async (args) => {
347
+ const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
348
+ const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
349
+ return textResult(text || "(empty)", history);
350
+ }
351
+ )
352
+ );
353
+ return () => disposers.forEach((d) => d());
354
+ }
355
+ function serialize(entry) {
356
+ return {
357
+ timestamp: entry.timestamp,
358
+ bridgeId: entry.bridgeId,
359
+ action: entry.action,
360
+ label: entry.label
361
+ };
362
+ }
363
+
290
364
  // src/bridges/forms.ts
291
365
  var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
292
366
  function registerFormBridge(host, options) {
293
367
  const { adapter } = options;
294
368
  const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
295
369
  const disposers = [];
370
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
296
371
  const formId = adapter.id;
297
372
  const target = (args) => ({
298
373
  kind: "form",
@@ -438,11 +513,14 @@ function registerFormBridge(host, options) {
438
513
  }
439
514
  };
440
515
  }
516
+
517
+ // src/bridges/sheets.ts
441
518
  var DEFAULT_AGENT2 = { id: "agent", name: "Agent", color: "#a855f7" };
442
519
  function registerSheetsBridge(host, options) {
443
520
  const { adapter } = options;
444
521
  const agent = { ...DEFAULT_AGENT2, ...options.agent ?? {} };
445
522
  const disposers = [];
523
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
446
524
  const target = (sheetId, address) => ({
447
525
  kind: "sheet",
448
526
  screenId: adapter.screenId,
@@ -556,13 +634,14 @@ function registerSheetsBridge(host, options) {
556
634
  value: { description: "string | number | boolean | null. Strings starting with '=' are stored as formulas." }
557
635
  },
558
636
  ["address", "value"],
559
- (args) => {
637
+ async (args) => {
560
638
  const sheetId = getSheetId(args);
561
639
  const address = String(args.address);
562
640
  const value = args.value;
563
641
  const wb = adapter.getWorkbook();
564
642
  if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);
565
- adapter.setWorkbook(fancySheets.reduceWorkbook(wb, setCellOp(sheetId, address, value)));
643
+ const { reduceWorkbook } = await import('@particle-academy/fancy-sheets');
644
+ adapter.setWorkbook(reduceWorkbook(wb, setCellOp(sheetId, address, value)));
566
645
  return textResult(`${sheetId}!${address} \u2190 ${JSON.stringify(value)}`, { sheet: sheetId, address, value });
567
646
  },
568
647
  true,
@@ -576,13 +655,14 @@ function registerSheetsBridge(host, options) {
576
655
  cells: { type: "object" }
577
656
  },
578
657
  ["cells"],
579
- (args) => {
658
+ async (args) => {
580
659
  const sheetId = getSheetId(args);
581
660
  const wb = adapter.getWorkbook();
582
661
  if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);
583
662
  const cells = args.cells && typeof args.cells === "object" ? args.cells : {};
663
+ const { reduceWorkbook } = await import('@particle-academy/fancy-sheets');
584
664
  let next = wb;
585
- for (const [addr, v] of Object.entries(cells)) next = fancySheets.reduceWorkbook(next, setCellOp(sheetId, addr, v));
665
+ for (const [addr, v] of Object.entries(cells)) next = reduceWorkbook(next, setCellOp(sheetId, addr, v));
586
666
  adapter.setWorkbook(next);
587
667
  return textResult(`Set ${Object.keys(cells).length} cells in ${sheetId}`, { sheet: sheetId, count: Object.keys(cells).length });
588
668
  },
@@ -787,6 +867,7 @@ function registerCodeBridge(host, options) {
787
867
  const { adapter } = options;
788
868
  const agent = { ...DEFAULT_AGENT3, ...options.agent ?? {} };
789
869
  const disposers = [];
870
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
790
871
  const target = {
791
872
  kind: "code",
792
873
  screenId: adapter.screenId,
@@ -953,6 +1034,7 @@ function registerChartsBridge(host, options) {
953
1034
  const { adapter } = options;
954
1035
  const agent = { ...DEFAULT_AGENT4, ...options.agent ?? {} };
955
1036
  const disposers = [];
1037
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
956
1038
  const target = {
957
1039
  kind: "chart",
958
1040
  screenId: adapter.screenId,
@@ -1067,6 +1149,7 @@ function registerSceneBridge(host, options) {
1067
1149
  const { adapter } = options;
1068
1150
  const agent = { ...DEFAULT_AGENT5, ...options.agent ?? {} };
1069
1151
  const disposers = [];
1152
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1070
1153
  const target = (objectId) => ({
1071
1154
  kind: "scene",
1072
1155
  screenId: adapter.screenId,
@@ -1264,6 +1347,7 @@ function registerScreensBridge(host, options) {
1264
1347
  const { adapter } = options;
1265
1348
  const agent = { ...DEFAULT_AGENT6, ...options.agent ?? {} };
1266
1349
  const disposers = [];
1350
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1267
1351
  const target = (screenId) => ({
1268
1352
  kind: "screens",
1269
1353
  screenId,
@@ -1431,11 +1515,14 @@ function registerScreensBridge(host, options) {
1431
1515
  }
1432
1516
  };
1433
1517
  }
1518
+
1519
+ // src/bridges/slides.ts
1434
1520
  var DEFAULT_AGENT7 = { id: "agent", name: "Agent", color: "#a855f7" };
1435
1521
  function registerSlidesBridge(host, options) {
1436
1522
  const { adapter } = options;
1437
1523
  const agent = { ...DEFAULT_AGENT7, ...options.agent ?? {} };
1438
1524
  const disposers = [];
1525
+ ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
1439
1526
  const deckTarget = () => ({
1440
1527
  kind: "deck",
1441
1528
  screenId: adapter.screenId,
@@ -1589,14 +1676,15 @@ function registerSlidesBridge(host, options) {
1589
1676
  "Replace the entire deck atomically \u2014 stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.",
1590
1677
  { deck: { description: "A complete Deck object." } },
1591
1678
  ["deck"],
1592
- (args) => {
1679
+ async (args) => {
1593
1680
  const incoming = args.deck;
1594
1681
  if (!incoming || typeof incoming !== "object") {
1595
1682
  return errorResult("deck must be a complete Deck object ({ id, title, theme, slides }).");
1596
1683
  }
1684
+ const { parseDeck } = await import('@particle-academy/fancy-slides');
1597
1685
  let deck;
1598
1686
  try {
1599
- deck = fancySlides.parseDeck(incoming);
1687
+ deck = parseDeck(incoming);
1600
1688
  } catch (e) {
1601
1689
  return errorResult(e instanceof Error ? e.message : String(e));
1602
1690
  }
@@ -1614,11 +1702,12 @@ function registerSlidesBridge(host, options) {
1614
1702
  slide: { description: "Partial slide payload \u2014 id is auto-generated when absent." }
1615
1703
  },
1616
1704
  [],
1617
- (args) => {
1705
+ async (args) => {
1618
1706
  const deck = adapter.getDeck();
1619
1707
  const incoming = args.slide && typeof args.slide === "object" ? args.slide : {};
1708
+ const { slideId: newSlideId } = await import('@particle-academy/fancy-slides');
1620
1709
  const slide = {
1621
- id: incoming.id ?? fancySlides.slideId(),
1710
+ id: incoming.id ?? newSlideId(),
1622
1711
  layout: incoming.layout ?? "blank",
1623
1712
  elements: incoming.elements ?? [],
1624
1713
  background: incoming.background,
@@ -1732,12 +1821,13 @@ function registerSlidesBridge(host, options) {
1732
1821
  element: { description: "Partial element \u2014 type/x/y/w/h required, id auto-generated when absent." }
1733
1822
  },
1734
1823
  ["slideId", "element"],
1735
- (args) => {
1824
+ async (args) => {
1736
1825
  const slideId = str(args.slideId);
1737
1826
  const incoming = args.element && typeof args.element === "object" ? args.element : {};
1738
1827
  if (!incoming.type) return errorResult("element.type is required.");
1828
+ const { elementId: newElementId } = await import('@particle-academy/fancy-slides');
1739
1829
  const element = {
1740
- id: incoming.id ?? fancySlides.elementId(),
1830
+ id: incoming.id ?? newElementId(),
1741
1831
  ...incoming
1742
1832
  };
1743
1833
  adapter.apply({ op: "element.add", slideId, element });
@@ -1869,84 +1959,8 @@ function firstTextContent(slide) {
1869
1959
  return void 0;
1870
1960
  }
1871
1961
 
1872
- // src/undo/undo-tools.ts
1873
- var installedHosts = /* @__PURE__ */ new WeakSet();
1874
- function ensureUndoToolsRegistered(host, options = {}) {
1875
- if (installedHosts.has(host)) return;
1876
- installedHosts.add(host);
1877
- registerUndoTools(host, options);
1878
- }
1879
- function registerUndoTools(host, options = {}) {
1880
- const defaultAgent = options.defaultAgentId ?? "agent";
1881
- const disposers = [];
1882
- const agentOf = (args) => typeof args?.agentId === "string" ? args.agentId : defaultAgent;
1883
- disposers.push(
1884
- host.registerTool(
1885
- {
1886
- name: "agent_undo",
1887
- description: "Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.",
1888
- inputSchema: {
1889
- type: "object",
1890
- properties: { agentId: { type: "string" } },
1891
- additionalProperties: false
1892
- }
1893
- },
1894
- async (args) => {
1895
- const entry = await fancyAutoCommon.undoOne(agentOf(args));
1896
- if (!entry) return errorResult("Nothing to undo.");
1897
- return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
1898
- }
1899
- )
1900
- );
1901
- disposers.push(
1902
- host.registerTool(
1903
- {
1904
- name: "agent_redo",
1905
- description: "Redo the most recently undone action.",
1906
- inputSchema: {
1907
- type: "object",
1908
- properties: { agentId: { type: "string" } },
1909
- additionalProperties: false
1910
- }
1911
- },
1912
- async (args) => {
1913
- const entry = await fancyAutoCommon.redoOne(agentOf(args));
1914
- if (!entry) return errorResult("Nothing to redo.");
1915
- return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
1916
- }
1917
- )
1918
- );
1919
- disposers.push(
1920
- host.registerTool(
1921
- {
1922
- name: "agent_history",
1923
- description: "List the agent's undo stack (oldest first). Useful for understanding what's reversible.",
1924
- inputSchema: {
1925
- type: "object",
1926
- properties: { agentId: { type: "string" } },
1927
- additionalProperties: false
1928
- }
1929
- },
1930
- async (args) => {
1931
- const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
1932
- const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
1933
- return textResult(text || "(empty)", history);
1934
- }
1935
- )
1936
- );
1937
- return () => disposers.forEach((d) => d());
1938
- }
1939
- function serialize(entry) {
1940
- return {
1941
- timestamp: entry.timestamp,
1942
- bridgeId: entry.bridgeId,
1943
- action: entry.action,
1944
- label: entry.label
1945
- };
1946
- }
1947
-
1948
1962
  // src/bridges/map.ts
1949
- var DEFAULT_AGENT8 = { id: "agent", name: "Agent", color: "#7c3aed" };
1963
+ var DEFAULT_AGENT8 = { id: "agent", name: "Agent", color: "#a855f7" };
1950
1964
  var num2 = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : 0;
1951
1965
  var str2 = (v, fallback = "") => typeof v === "string" ? v : fallback;
1952
1966
  var newId = (prefix) => `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;
@@ -2273,7 +2287,7 @@ function registerMapBridge(host, options) {
2273
2287
  }
2274
2288
 
2275
2289
  // src/bridges/files.ts
2276
- var DEFAULT_AGENT9 = { id: "agent", name: "Agent", color: "#0ea5e9" };
2290
+ var DEFAULT_AGENT9 = { id: "agent", name: "Agent", color: "#a855f7" };
2277
2291
  var str3 = (v, fallback = "") => typeof v === "string" ? v : fallback;
2278
2292
  var num3 = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : 0;
2279
2293
  var asPaths = (v) => {