@pixerate/editor 0.140.4 → 0.142.1

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 (125) hide show
  1. package/dist/agent/canvasPlayback.d.cts +15 -0
  2. package/dist/agent/canvasPlayback.d.ts +15 -0
  3. package/dist/agent/index.cjs +173 -33
  4. package/dist/agent/index.d.cts +1 -0
  5. package/dist/agent/index.d.ts +1 -0
  6. package/dist/agent/index.js +147 -7
  7. package/dist/agent/providers.d.cts +12 -1
  8. package/dist/agent/providers.d.ts +12 -1
  9. package/dist/agent/types.d.cts +3 -0
  10. package/dist/agent/types.d.ts +3 -0
  11. package/dist/animation/index.cjs +2 -2
  12. package/dist/animation/index.js +1 -1
  13. package/dist/animation/presence.d.cts +1 -75
  14. package/dist/animation/presence.d.ts +1 -75
  15. package/dist/animation-editor/index.cjs +69 -19
  16. package/dist/animation-editor/index.d.cts +1 -0
  17. package/dist/animation-editor/index.d.ts +1 -0
  18. package/dist/animation-editor/index.js +54 -4
  19. package/dist/animation-editor/playback.d.cts +10 -0
  20. package/dist/animation-editor/playback.d.ts +10 -0
  21. package/dist/bridge/cli.cjs +3 -3
  22. package/dist/bridge/cli.js +2 -2
  23. package/dist/bridge/index.cjs +3 -3
  24. package/dist/bridge/index.js +2 -2
  25. package/dist/canvas/index.cjs +336 -646
  26. package/dist/canvas/index.d.cts +1 -0
  27. package/dist/canvas/index.d.ts +1 -0
  28. package/dist/canvas/index.js +44 -354
  29. package/dist/canvas/playback.d.cts +14 -0
  30. package/dist/canvas/playback.d.ts +14 -0
  31. package/dist/chart/index.cjs +255 -171
  32. package/dist/chart/index.d.cts +1 -0
  33. package/dist/chart/index.d.ts +1 -0
  34. package/dist/chart/index.js +244 -160
  35. package/dist/chart/playback.d.cts +22 -0
  36. package/dist/chart/playback.d.ts +22 -0
  37. package/dist/chunk-54GVEVXS.js +408 -0
  38. package/dist/{chunk-E747F3D5.js → chunk-CC6WKVIH.js} +86 -5
  39. package/dist/chunk-DW4CV5H4.js +591 -0
  40. package/dist/{chunk-UMS6YFA6.js → chunk-EAQ4BGNS.js} +1 -1
  41. package/dist/{chunk-AGCD3EHB.cjs → chunk-ENIZYNEF.cjs} +7 -7
  42. package/dist/{chunk-BSGPXPTW.js → chunk-PEEP2YR7.js} +1 -1
  43. package/dist/{chunk-VTY64I6H.cjs → chunk-QSM3MDDJ.cjs} +85 -85
  44. package/dist/{chunk-2RUNJYOX.cjs → chunk-QZFEX2N4.cjs} +86 -5
  45. package/dist/{chunk-RB62U6MS.js → chunk-RFBFTLVN.js} +27 -5
  46. package/dist/chunk-UBRYHNRU.cjs +591 -0
  47. package/dist/{chunk-GEY73RUW.cjs → chunk-UJGAA6AK.cjs} +1 -1
  48. package/dist/{chunk-LMSFXRAJ.js → chunk-VGJTUCWM.js} +1 -1
  49. package/dist/chunk-X2HQP7DF.cjs +408 -0
  50. package/dist/chunk-XH32BATE.cjs +68 -0
  51. package/dist/{chunk-HDK3T2QS.cjs → chunk-Y4BWZB6J.cjs} +29 -7
  52. package/dist/chunk-Y6SGC6KO.js +68 -0
  53. package/dist/commands/index.cjs +37 -1
  54. package/dist/commands/index.js +36 -0
  55. package/dist/commands/registry.d.cts +11 -0
  56. package/dist/commands/registry.d.ts +11 -0
  57. package/dist/diagram/index.cjs +7 -7
  58. package/dist/diagram/index.js +1 -1
  59. package/dist/image-editor/index.cjs +108 -16
  60. package/dist/image-editor/index.d.cts +1 -0
  61. package/dist/image-editor/index.d.ts +1 -0
  62. package/dist/image-editor/index.js +107 -15
  63. package/dist/image-editor/playback.d.cts +22 -0
  64. package/dist/image-editor/playback.d.ts +22 -0
  65. package/dist/index.cjs +7 -3
  66. package/dist/index.js +6 -2
  67. package/dist/paint-editor/index.cjs +73 -25
  68. package/dist/paint-editor/index.d.cts +1 -0
  69. package/dist/paint-editor/index.d.ts +1 -0
  70. package/dist/paint-editor/index.js +68 -20
  71. package/dist/paint-editor/playback.d.cts +16 -0
  72. package/dist/paint-editor/playback.d.ts +16 -0
  73. package/dist/parameters/index.cjs +32 -8
  74. package/dist/parameters/index.d.cts +1 -0
  75. package/dist/parameters/index.d.ts +1 -0
  76. package/dist/parameters/index.js +28 -4
  77. package/dist/parameters/playback.d.cts +10 -0
  78. package/dist/parameters/playback.d.ts +10 -0
  79. package/dist/spreadsheet/index.cjs +7 -3
  80. package/dist/spreadsheet/index.d.cts +1 -0
  81. package/dist/spreadsheet/index.d.ts +1 -0
  82. package/dist/spreadsheet/index.js +6 -2
  83. package/dist/spreadsheet/playback.d.cts +15 -0
  84. package/dist/spreadsheet/playback.d.ts +15 -0
  85. package/dist/tools/index.cjs +40 -3
  86. package/dist/tools/index.d.cts +3 -0
  87. package/dist/tools/index.d.ts +3 -0
  88. package/dist/tools/index.js +39 -2
  89. package/dist/tools/playback.d.cts +205 -0
  90. package/dist/tools/playback.d.ts +205 -0
  91. package/dist/tools/presence.d.cts +82 -0
  92. package/dist/tools/presence.d.ts +82 -0
  93. package/dist/tools/registry.d.cts +45 -6
  94. package/dist/tools/registry.d.ts +45 -6
  95. package/dist/tools/script.d.cts +77 -0
  96. package/dist/tools/script.d.ts +77 -0
  97. package/dist/tools/view.d.cts +2 -4
  98. package/dist/tools/view.d.ts +2 -4
  99. package/dist/vector/index.cjs +217 -100
  100. package/dist/vector/index.d.cts +1 -0
  101. package/dist/vector/index.d.ts +1 -0
  102. package/dist/vector/index.js +140 -23
  103. package/dist/vector/playback.d.cts +13 -0
  104. package/dist/vector/playback.d.ts +13 -0
  105. package/dist/video-editor/index.cjs +81 -28
  106. package/dist/video-editor/index.d.cts +1 -0
  107. package/dist/video-editor/index.d.ts +1 -0
  108. package/dist/video-editor/index.js +58 -5
  109. package/dist/video-editor/playback.d.cts +20 -0
  110. package/dist/video-editor/playback.d.ts +20 -0
  111. package/package.json +1 -1
  112. package/skills/pixerate-agent-tools/SKILL.md +13 -0
  113. package/skills/pixerate-animation-editor/SKILL.md +1 -0
  114. package/skills/pixerate-canvas/SKILL.md +3 -0
  115. package/skills/pixerate-chart/SKILL.md +1 -0
  116. package/skills/pixerate-image-editor/SKILL.md +2 -2
  117. package/skills/pixerate-paint-editor/SKILL.md +1 -0
  118. package/skills/pixerate-parameters/SKILL.md +1 -0
  119. package/skills/pixerate-spreadsheet/SKILL.md +1 -0
  120. package/skills/pixerate-vector/SKILL.md +5 -0
  121. package/skills/pixerate-video-editor/SKILL.md +1 -0
  122. package/dist/chunk-BTZS3KZY.js +0 -221
  123. package/dist/chunk-K73HMKQP.js +0 -0
  124. package/dist/chunk-LACYURUW.cjs +0 -1
  125. package/dist/chunk-MRD3NXKR.cjs +0 -221
@@ -0,0 +1,15 @@
1
+ import { type NodeRectOptions } from '../canvas/arrange.cjs';
2
+ import type { CanvasEdge, CanvasNode } from '../canvas/types.cjs';
3
+ import { type PlaybackStep } from '../tools/playback.cjs';
4
+ import { type planToolCall } from './planner.cjs';
5
+ import type { AgentStep, EditorSnapshot } from './types.cjs';
6
+ /**
7
+ * Turns the planner's model steps into cursor steps (flow coordinates), against the nodes as they
8
+ * are before the call. Steps after `commit` play once the change is on the canvas.
9
+ */
10
+ export declare function planCanvasPlaybackSteps<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(steps: readonly AgentStep<TNode, TEdge>[], nodes: readonly TNode[], rectOptions?: NodeRectOptions): PlaybackStep[];
11
+ /**
12
+ * The cursor steps for one canvas edit tool call (`canvas_add_node`, `edit_canvas`, ...), or `null`
13
+ * when the call is invalid (the handler then reports the error) or is not a canvas edit.
14
+ */
15
+ export declare function planCanvasToolPlayback<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(name: string, args: Record<string, any>, snapshot: EditorSnapshot<TNode, TEdge>, plannerOptions?: Parameters<typeof planToolCall>[3], rectOptions?: NodeRectOptions): PlaybackStep[] | null;
@@ -0,0 +1,15 @@
1
+ import { type NodeRectOptions } from '../canvas/arrange.js';
2
+ import type { CanvasEdge, CanvasNode } from '../canvas/types.js';
3
+ import { type PlaybackStep } from '../tools/playback.js';
4
+ import { type planToolCall } from './planner.js';
5
+ import type { AgentStep, EditorSnapshot } from './types.js';
6
+ /**
7
+ * Turns the planner's model steps into cursor steps (flow coordinates), against the nodes as they
8
+ * are before the call. Steps after `commit` play once the change is on the canvas.
9
+ */
10
+ export declare function planCanvasPlaybackSteps<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(steps: readonly AgentStep<TNode, TEdge>[], nodes: readonly TNode[], rectOptions?: NodeRectOptions): PlaybackStep[];
11
+ /**
12
+ * The cursor steps for one canvas edit tool call (`canvas_add_node`, `edit_canvas`, ...), or `null`
13
+ * when the call is invalid (the handler then reports the error) or is not a canvas edit.
14
+ */
15
+ export declare function planCanvasToolPlayback<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(name: string, args: Record<string, any>, snapshot: EditorSnapshot<TNode, TEdge>, plannerOptions?: Parameters<typeof planToolCall>[3], rectOptions?: NodeRectOptions): PlaybackStep[] | null;
@@ -10,9 +10,18 @@ var _chunkGLQQ2VILcjs = require('../chunk-GLQQ2VIL.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunkMRD3NXKRcjs = require('../chunk-MRD3NXKR.cjs');
13
+
14
+
15
+ var _chunkUBRYHNRUcjs = require('../chunk-UBRYHNRU.cjs');
14
16
  require('../chunk-4EFNS2HV.cjs');
15
- require('../chunk-LACYURUW.cjs');
17
+
18
+
19
+
20
+
21
+ var _chunkXH32BATEcjs = require('../chunk-XH32BATE.cjs');
22
+
23
+
24
+
16
25
 
17
26
 
18
27
 
@@ -35,10 +44,16 @@ require('../chunk-LACYURUW.cjs');
35
44
 
36
45
 
37
46
 
47
+ var _chunkY4BWZB6Jcjs = require('../chunk-Y4BWZB6J.cjs');
38
48
 
39
49
 
40
50
 
41
- var _chunkHDK3T2QScjs = require('../chunk-HDK3T2QS.cjs');
51
+
52
+
53
+
54
+
55
+
56
+ var _chunkX2HQP7DFcjs = require('../chunk-X2HQP7DF.cjs');
42
57
 
43
58
 
44
59
 
@@ -121,7 +136,8 @@ var _chunk2BSBFBOAcjs = require('../chunk-2BSBFBOA.cjs');
121
136
 
122
137
 
123
138
 
124
- var _chunk2RUNJYOXcjs = require('../chunk-2RUNJYOX.cjs');
139
+
140
+ var _chunkQZFEX2N4cjs = require('../chunk-QZFEX2N4.cjs');
125
141
 
126
142
 
127
143
 
@@ -130,6 +146,14 @@ var _chunk55AKPTLMcjs = require('../chunk-55AKPTLM.cjs');
130
146
  require('../chunk-N3KJFGXT.cjs');
131
147
 
132
148
 
149
+
150
+
151
+
152
+
153
+
154
+ var _chunkUJGAA6AKcjs = require('../chunk-UJGAA6AK.cjs');
155
+
156
+
133
157
  var _chunkWOFXZ3XUcjs = require('../chunk-WOFXZ3XU.cjs');
134
158
  require('../chunk-FJ2MSI43.cjs');
135
159
 
@@ -170,10 +194,10 @@ function planAgentCommand(command, snapshot, options = {}) {
170
194
  };
171
195
  }
172
196
  if (anchorId) {
173
- pos = _chunkMRD3NXKRcjs.placeBeside.call(void 0, rects, defaultNodeSize, normalizeSide(command.side), anchorId);
197
+ pos = _chunkUBRYHNRUcjs.placeBeside.call(void 0, rects, defaultNodeSize, normalizeSide(command.side), anchorId);
174
198
  } else if (nodes.length > 0) {
175
199
  const lastNode = nodes[nodes.length - 1];
176
- pos = _chunkMRD3NXKRcjs.placeBeside.call(void 0, rects, defaultNodeSize, "right", lastNode.id);
200
+ pos = _chunkUBRYHNRUcjs.placeBeside.call(void 0, rects, defaultNodeSize, "right", lastNode.id);
177
201
  } else {
178
202
  pos = { x: 100, y: 100 };
179
203
  }
@@ -241,12 +265,12 @@ function planAgentCommand(command, snapshot, options = {}) {
241
265
  stored[n.id] = { ...n.position };
242
266
  }
243
267
  }
244
- layouted = _chunkMRD3NXKRcjs.ensureLayout.call(void 0, nodes, edges, {
268
+ layouted = _chunkUBRYHNRUcjs.ensureLayout.call(void 0, nodes, edges, {
245
269
  direction: dir,
246
270
  storedPositions: stored
247
271
  });
248
272
  } else {
249
- layouted = _chunkMRD3NXKRcjs.getLayoutedNodes.call(void 0, nodes, edges, void 0, { direction: dir });
273
+ layouted = _chunkUBRYHNRUcjs.getLayoutedNodes.call(void 0, nodes, edges, void 0, { direction: dir });
250
274
  }
251
275
  const positions = {};
252
276
  for (const node of layouted) {
@@ -459,6 +483,87 @@ function planToolCall(name, args, snapshot, options) {
459
483
  var _state = require('@tiptap/pm/state');
460
484
  var _history = require('@tiptap/pm/history');
461
485
 
486
+ // src/agent/canvasPlayback.ts
487
+ var centre = (r) => ({ x: r.x + r.width / 2, y: r.y + r.height / 2 });
488
+ var labelOf = (data) => {
489
+ const label = _nullishCoalesce(_nullishCoalesce(_optionalChain([data, 'optionalAccess', _16 => _16.label]), () => ( _optionalChain([data, 'optionalAccess', _17 => _17.title]))), () => ( _optionalChain([data, 'optionalAccess', _18 => _18.text])));
490
+ return typeof label === "string" && label.trim() ? label : null;
491
+ };
492
+ function planCanvasPlaybackSteps(steps, nodes, rectOptions) {
493
+ const placed = new Map(_chunkUBRYHNRUcjs.createNodeLookup.call(void 0, nodes));
494
+ const rectOf = (id) => {
495
+ const node = placed.get(id);
496
+ return node ? _chunkUBRYHNRUcjs.getNodeRect.call(void 0, node, placed, rectOptions) : null;
497
+ };
498
+ const before = [];
499
+ const after = [];
500
+ const click = (rect) => rect ? [{ type: "move", to: centre(rect) }, { type: "focus", rect }, { type: "press" }, { type: "release" }] : [];
501
+ for (const step of steps) {
502
+ switch (step.type) {
503
+ case "step:canvas_add_node": {
504
+ placed.set(step.node.id, step.node);
505
+ const rect = rectOf(step.node.id);
506
+ const label = labelOf(step.node.data);
507
+ before.push(...click(rect), ...label ? [{ type: "type", text: label }] : []);
508
+ break;
509
+ }
510
+ case "step:canvas_add_edge": {
511
+ const a = rectOf(step.edge.source);
512
+ const b = rectOf(step.edge.target);
513
+ if (!a || !b) break;
514
+ const label = typeof step.edge.label === "string" ? step.edge.label : labelOf(step.edge.data);
515
+ before.push(
516
+ { type: "move", to: { x: a.x + a.width, y: a.y + a.height / 2 } },
517
+ { type: "press" },
518
+ { type: "drag", to: { x: b.x, y: b.y + b.height / 2 } },
519
+ { type: "release" },
520
+ ...label ? [{ type: "type", text: label }] : []
521
+ );
522
+ break;
523
+ }
524
+ case "step:canvas_update_node": {
525
+ const rect = rectOf(step.id);
526
+ const label = labelOf(step.data);
527
+ before.push(...click(rect), ...rect && label ? [{ type: "type", text: label }] : []);
528
+ break;
529
+ }
530
+ case "step:canvas_remove_nodes":
531
+ for (const id of step.nodeIds.slice(0, 8)) before.push(...click(rectOf(id)));
532
+ break;
533
+ case "step:canvas_select":
534
+ for (const id of step.nodeIds.slice(0, 8)) before.push(...click(rectOf(id)));
535
+ break;
536
+ case "step:canvas_highlight":
537
+ for (const id of step.nodeIds.slice(0, 8)) {
538
+ const rect = rectOf(id);
539
+ if (rect) before.push({ type: "move", to: centre(rect) }, { type: "focus", rect });
540
+ }
541
+ break;
542
+ case "step:canvas_move_nodes": {
543
+ const moved = Object.entries(step.positions);
544
+ for (const [id, position] of moved) {
545
+ const node = placed.get(id);
546
+ if (node) placed.set(id, { ...node, position });
547
+ }
548
+ const rect = _chunkX2HQP7DFcjs.unionRects.call(void 0, moved.map(([id]) => rectOf(id)));
549
+ if (rect) after.push({ type: "move", to: centre(rect) }, { type: "focus", rect }, { type: "wait", ms: 450 });
550
+ break;
551
+ }
552
+ default:
553
+ break;
554
+ }
555
+ }
556
+ if (!before.length && !after.length) return [];
557
+ return [...before, { type: "commit" }, ...after];
558
+ }
559
+ function planCanvasToolPlayback(name, args, snapshot, plannerOptions, rectOptions) {
560
+ const command = toolCallToAgentCommand(name, args);
561
+ if (!command || !command.type.startsWith("canvas:") || validateAgentCommand(command, snapshot)) return null;
562
+ const steps = planAgentCommand(command, snapshot, plannerOptions);
563
+ const planned = planCanvasPlaybackSteps(steps, _nullishCoalesce(_optionalChain([snapshot, 'access', _19 => _19.canvas, 'optionalAccess', _20 => _20.nodes]), () => ( [])), rectOptions);
564
+ return planned.length ? planned : null;
565
+ }
566
+
462
567
  // src/agent/documentChartTools.ts
463
568
 
464
569
  var READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
@@ -573,7 +678,7 @@ function createDocumentChartTools(editor) {
573
678
  const ed = editor();
574
679
  checkPosition(ed, at);
575
680
  const spec = checkedSpec(input);
576
- const id = _nullishCoalesce(_optionalChain([ed, 'access', _16 => _16.extensionManager, 'access', _17 => _17.extensions, 'access', _18 => _18.find, 'call', _19 => _19((e) => e.name === "chart"), 'optionalAccess', _20 => _20.options, 'access', _21 => _21.generateId, 'optionalCall', _22 => _22()]), () => ( `chart-${Date.now().toString(36)}`));
681
+ const id = _nullishCoalesce(_optionalChain([ed, 'access', _21 => _21.extensionManager, 'access', _22 => _22.extensions, 'access', _23 => _23.find, 'call', _24 => _24((e) => e.name === "chart"), 'optionalAccess', _25 => _25.options, 'access', _26 => _26.generateId, 'optionalCall', _27 => _27()]), () => ( `chart-${Date.now().toString(36)}`));
577
682
  const node = { type: "chart", attrs: { id, spec, width, ...height !== void 0 ? { height } : {} } };
578
683
  const chain = ed.chain().command(({ tr }) => (_history.closeHistory.call(void 0, tr), true));
579
684
  const ok = (at !== void 0 ? chain.insertContentAt(at, node) : chain.insertContent(node)).run();
@@ -788,7 +893,7 @@ function createDocumentFormatTools(editor, changed) {
788
893
  const formatText = (ed) => {
789
894
  const { schema } = ed;
790
895
  const has = (name) => !!schema.marks[name];
791
- const hasAttr = (mark, attr) => !!_optionalChain([schema, 'access', _23 => _23.marks, 'access', _24 => _24[mark], 'optionalAccess', _25 => _25.spec, 'access', _26 => _26.attrs, 'optionalAccess', _27 => _27[attr]]);
896
+ const hasAttr = (mark, attr) => !!_optionalChain([schema, 'access', _28 => _28.marks, 'access', _29 => _29[mark], 'optionalAccess', _30 => _30.spec, 'access', _31 => _31.attrs, 'optionalAccess', _32 => _32[attr]]);
792
897
  const properties = { ...RANGE_PROPERTIES };
793
898
  for (const [arg, mark, what] of TOGGLE_MARKS) {
794
899
  if (has(mark)) properties[arg] = { type: "boolean", description: `${what} true sets it, false clears it; omit to leave it.` };
@@ -863,7 +968,7 @@ function createDocumentFormatTools(editor, changed) {
863
968
  const blockTypes = (ed) => BLOCK_TYPES.filter(([, node]) => !!ed.schema.nodes[node] && (!LIST_ITEMS[node] || !!ed.schema.nodes[LIST_ITEMS[node]]));
864
969
  const headingLevels = (ed) => {
865
970
  const ext = ed.extensionManager.extensions.find((e) => e.name === "heading");
866
- return _nullishCoalesce(_optionalChain([ext, 'optionalAccess', _28 => _28.options, 'optionalAccess', _29 => _29.levels]), () => ( [1, 2, 3, 4, 5, 6]));
971
+ return _nullishCoalesce(_optionalChain([ext, 'optionalAccess', _33 => _33.options, 'optionalAccess', _34 => _34.levels]), () => ( [1, 2, 3, 4, 5, 6]));
867
972
  };
868
973
  const setBlockType = (ed) => {
869
974
  const types = blockTypes(ed);
@@ -913,8 +1018,8 @@ function createDocumentFormatTools(editor, changed) {
913
1018
  const setTextAlign = (ed) => {
914
1019
  const ext = ed.extensionManager.extensions.find((e) => e.name === "textAlign");
915
1020
  if (!ext) return null;
916
- const alignments = (_nullishCoalesce(_optionalChain([ext, 'access', _30 => _30.options, 'optionalAccess', _31 => _31.alignments]), () => ( ["left", "center", "right", "justify"]))).slice();
917
- const types = _nullishCoalesce(_optionalChain([ext, 'access', _32 => _32.options, 'optionalAccess', _33 => _33.types]), () => ( ["heading", "paragraph"]));
1021
+ const alignments = (_nullishCoalesce(_optionalChain([ext, 'access', _35 => _35.options, 'optionalAccess', _36 => _36.alignments]), () => ( ["left", "center", "right", "justify"]))).slice();
1022
+ const types = _nullishCoalesce(_optionalChain([ext, 'access', _37 => _37.options, 'optionalAccess', _38 => _38.types]), () => ( ["heading", "paragraph"]));
918
1023
  return {
919
1024
  name: "set_text_align",
920
1025
  title: "Align text",
@@ -981,13 +1086,13 @@ function textBlocks(editor) {
981
1086
  function createTextPresence(editor, providerId, option) {
982
1087
  const config = option === false ? null : option === true || option === void 0 ? {} : option;
983
1088
  const caret = {
984
- id: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _34 => _34.id]), () => ( providerId)),
985
- name: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _35 => _35.name]), () => ( _chunkL434J57Vcjs.DEFAULT_AGENT_CARET_NAME)),
986
- color: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _36 => _36.color]), () => ( _chunkL434J57Vcjs.DEFAULT_AGENT_CARET_COLOR))
1089
+ id: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _39 => _39.id]), () => ( providerId)),
1090
+ name: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _40 => _40.name]), () => ( _chunkL434J57Vcjs.DEFAULT_AGENT_CARET_NAME)),
1091
+ color: _nullishCoalesce(_optionalChain([config, 'optionalAccess', _41 => _41.color]), () => ( _chunkL434J57Vcjs.DEFAULT_AGENT_CARET_COLOR))
987
1092
  };
988
- const typing = !_optionalChain([config, 'optionalAccess', _37 => _37.typing]) ? null : config.typing === true ? {} : config.typing;
989
- const idleMs = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _38 => _38.idleMs]), () => ( 12e3));
990
- const changedMs = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _39 => _39.changedMs]), () => ( 1500));
1093
+ const typing = !_optionalChain([config, 'optionalAccess', _42 => _42.typing]) ? null : config.typing === true ? {} : config.typing;
1094
+ const idleMs = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _43 => _43.idleMs]), () => ( 12e3));
1095
+ const changedMs = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _44 => _44.changedMs]), () => ( 1500));
991
1096
  let idleTimer;
992
1097
  let tintTimer;
993
1098
  const live = () => {
@@ -1065,6 +1170,13 @@ function findMatches(editor, query, args, replacement) {
1065
1170
  function createRichTextToolProvider(target, options) {
1066
1171
  const editor = () => toEditor(target);
1067
1172
  const charts = createDocumentChartTools(editor);
1173
+ const withCaret = (tool) => tool.name !== "insert_chart" ? tool : {
1174
+ ...tool,
1175
+ handler: (args, context) => {
1176
+ if (typeof args.at === "number") presence.show(args.at);
1177
+ return tool.handler(args, context);
1178
+ }
1179
+ };
1068
1180
  const presence = createTextPresence(editor, options.id, options.presence);
1069
1181
  const formatting = createDocumentFormatTools(editor, (ranges) => presence.changed(ranges.filter((r) => r.from < r.to)));
1070
1182
  const getText = {
@@ -1366,7 +1478,7 @@ function createRichTextToolProvider(target, options) {
1366
1478
  if (!ed || ed.isDestroyed) return [];
1367
1479
  if (!ed.isEditable) return [getText, findText, ...charts.read()];
1368
1480
  const tools = [getText, findText, insertText, replaceText, replaceRange, replaceSelection, setSelection, ...formatting.tools(ed)];
1369
- return [...tools, ..._chunkL434J57Vcjs.isTableEnabled.call(void 0, ed) ? [editTable] : [], ...charts.read(), ...charts.write()];
1481
+ return [...tools, ..._chunkL434J57Vcjs.isTableEnabled.call(void 0, ed) ? [editTable] : [], ...charts.read(), ...charts.write().map(withCaret)];
1370
1482
  },
1371
1483
  subscribe: (notify) => {
1372
1484
  const ed = editor();
@@ -1396,7 +1508,7 @@ function parseRange(ref) {
1396
1508
  if (extra !== void 0) throw new Error(`Invalid range "${ref}". Use A1 notation, e.g. "A1:C5".`);
1397
1509
  const start = parseCell(startRef);
1398
1510
  const end = parseCell(endRef);
1399
- return _chunk2RUNJYOXcjs.normalizeRange.call(void 0, { startRow: start.row, startCol: start.col, endRow: end.row, endCol: end.col });
1511
+ return _chunkQZFEX2N4cjs.normalizeRange.call(void 0, { startRow: start.row, startCol: start.col, endRow: end.row, endCol: end.col });
1400
1512
  }
1401
1513
  var formatRange = (r) => `${_chunk55AKPTLMcjs.indexToColName.call(void 0, r.startCol)}${r.startRow + 1}:${_chunk55AKPTLMcjs.indexToColName.call(void 0, r.endCol)}${r.endRow + 1}`;
1402
1514
  var CELL_INPUT = { type: ["string", "number", "boolean", "null"] };
@@ -1458,7 +1570,7 @@ function createSpreadsheetToolProvider(controller, options) {
1458
1570
  values,
1459
1571
  raw,
1460
1572
  errors,
1461
- merges: controller.getMerges().filter((m) => _chunk2RUNJYOXcjs.rangesIntersect.call(void 0, m, read)).map(formatRange),
1573
+ merges: controller.getMerges().filter((m) => _chunkQZFEX2N4cjs.rangesIntersect.call(void 0, m, read)).map(formatRange),
1462
1574
  sheet: { rows: rowCount, columns: colCount }
1463
1575
  };
1464
1576
  }
@@ -1653,8 +1765,8 @@ function createSpreadsheetToolProvider(controller, options) {
1653
1765
  ({ range }) => {
1654
1766
  const r = parseRange(range);
1655
1767
  inSheet(r, range);
1656
- if (_chunk2RUNJYOXcjs.isSingleCellRange.call(void 0, r)) throw new Error(`${range} is a single cell; give a range of at least two cells.`);
1657
- const partial = controller.getMerges().find((m) => _chunk2RUNJYOXcjs.rangesIntersect.call(void 0, m, r) && !_chunk2RUNJYOXcjs.rangeContainsRange.call(void 0, r, m));
1768
+ if (_chunkQZFEX2N4cjs.isSingleCellRange.call(void 0, r)) throw new Error(`${range} is a single cell; give a range of at least two cells.`);
1769
+ const partial = controller.getMerges().find((m) => _chunkQZFEX2N4cjs.rangesIntersect.call(void 0, m, r) && !_chunkQZFEX2N4cjs.rangeContainsRange.call(void 0, r, m));
1658
1770
  if (partial) throw new Error(`${range} partly overlaps the merged range ${formatRange(partial)}; include all of it or unmerge it first.`);
1659
1771
  const readOnly = readOnlyIn(r);
1660
1772
  if (readOnly.length) throw new Error(`Read-only cells: ${readOnly.slice(0, 20).join(", ")}. Nothing was merged.`);
@@ -1679,7 +1791,7 @@ function createSpreadsheetToolProvider(controller, options) {
1679
1791
  false,
1680
1792
  ({ range }) => {
1681
1793
  const r = parseRange(range);
1682
- const touched = controller.getMerges().filter((m) => _chunk2RUNJYOXcjs.rangesIntersect.call(void 0, m, r));
1794
+ const touched = controller.getMerges().filter((m) => _chunkQZFEX2N4cjs.rangesIntersect.call(void 0, m, r));
1683
1795
  if (!touched.length) throw new Error(`No merged cells in ${range}. get_range lists the merges in a range.`);
1684
1796
  controller.unmergeCells(r);
1685
1797
  return { unmerged: touched.map(formatRange) };
@@ -1695,14 +1807,14 @@ function createSpreadsheetToolProvider(controller, options) {
1695
1807
  ({ range }) => {
1696
1808
  const s = parseRange(range);
1697
1809
  inSheet(s, range);
1698
- if (_chunk2RUNJYOXcjs.isSingleCellRange.call(void 0, s)) throw new Error(`${range} is a single cell; give a range of at least two cells.`);
1810
+ if (_chunkQZFEX2N4cjs.isSingleCellRange.call(void 0, s)) throw new Error(`${range} is a single cell; give a range of at least two cells.`);
1699
1811
  const t = {
1700
1812
  startRow: s.startRow,
1701
1813
  startCol: s.startCol,
1702
1814
  endRow: s.startRow + (s.endCol - s.startCol),
1703
1815
  endCol: s.startCol + (s.endRow - s.startRow)
1704
1816
  };
1705
- const merge = controller.getMerges().find((m) => _chunk2RUNJYOXcjs.rangesIntersect.call(void 0, m, s) || _chunk2RUNJYOXcjs.rangesIntersect.call(void 0, m, t));
1817
+ const merge = controller.getMerges().find((m) => _chunkQZFEX2N4cjs.rangesIntersect.call(void 0, m, s) || _chunkQZFEX2N4cjs.rangesIntersect.call(void 0, m, t));
1706
1818
  if (merge) throw new Error(`Cannot transpose ${range}: the merged range ${formatRange(merge)} is in the way; unmerge it first.`);
1707
1819
  const readOnly = [.../* @__PURE__ */ new Set([...readOnlyIn(s), ...readOnlyIn(t)])];
1708
1820
  if (readOnly.length) throw new Error(`Read-only cells: ${readOnly.slice(0, 20).join(", ")}. Nothing was transposed.`);
@@ -1716,14 +1828,18 @@ function createSpreadsheetToolProvider(controller, options) {
1716
1828
  title: "Spreadsheet",
1717
1829
  description: "A spreadsheet: read and set cells and ranges, insert and delete rows and columns, merge and transpose.",
1718
1830
  skill: "pixerate-spreadsheet",
1719
- tools: [getRange, setCell, setRange, insertRows, deleteRows, insertColumns, deleteColumns, mergeCells, unmergeCells, transposeRange]
1831
+ // Agent playback: `<SpreadsheetEditor playback>` attaches as `spreadsheet` and finds the cells.
1832
+ playbackSurface: _nullishCoalesce(options.playbackSurface, () => ( "spreadsheet")),
1833
+ tools: [getRange, setCell, setRange, insertRows, deleteRows, insertColumns, deleteColumns, mergeCells, unmergeCells, transposeRange].map(
1834
+ (tool) => ({ ...tool, plan: (args) => _chunkQZFEX2N4cjs.planSpreadsheetToolPlayback.call(void 0, tool.name, args) })
1835
+ )
1720
1836
  };
1721
1837
  }
1722
1838
  function missingArgumentsMessage(name, args) {
1723
1839
  const required = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS[name][args.operation];
1724
1840
  if (!required) return `Unknown operation "${args.operation}".`;
1725
1841
  const missing = required.filter(
1726
- (key) => key === "id" ? args.id === void 0 && _optionalChain([args, 'access', _40 => _40.node, 'optionalAccess', _41 => _41.id]) === void 0 : args[key] === void 0
1842
+ (key) => key === "id" ? args.id === void 0 && _optionalChain([args, 'access', _45 => _45.node, 'optionalAccess', _46 => _46.id]) === void 0 : args[key] === void 0
1727
1843
  );
1728
1844
  return missing.length ? `Operation "${args.operation}" requires ${required.join(", ")}; missing: ${missing.join(", ")}.` : `Operation "${args.operation}" has invalid arguments (expected ${required.join(", ")} with the types in the schema).`;
1729
1845
  }
@@ -1755,8 +1871,8 @@ function createEditorMcpToolProvider(options) {
1755
1871
  await options.applySteps(steps);
1756
1872
  return describeSteps(steps);
1757
1873
  };
1758
- const canvas = _nullishCoalesce(_optionalChain([options, 'access', _42 => _42.surfaces, 'optionalAccess', _43 => _43.canvas]), () => ( true));
1759
- const prompt = _nullishCoalesce(_optionalChain([options, 'access', _44 => _44.surfaces, 'optionalAccess', _45 => _45.prompt]), () => ( true));
1874
+ const canvas = _nullishCoalesce(_optionalChain([options, 'access', _47 => _47.surfaces, 'optionalAccess', _48 => _48.canvas]), () => ( true));
1875
+ const prompt = _nullishCoalesce(_optionalChain([options, 'access', _49 => _49.surfaces, 'optionalAccess', _50 => _50.prompt]), () => ( true));
1760
1876
  const editTools = options.toolStyle === "combined" ? [...canvas ? [_chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS] : [], ...prompt ? [_chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT] : []] : [...canvas ? _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS : [], ...prompt ? _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS : []];
1761
1877
  const tools = [
1762
1878
  {
@@ -1769,7 +1885,12 @@ function createEditorMcpToolProvider(options) {
1769
1885
  };
1770
1886
  }
1771
1887
  },
1772
- ...editTools.map((definition) => ({ ...definition, handler: edit(definition.name) }))
1888
+ ...editTools.map((definition) => ({
1889
+ ...definition,
1890
+ handler: edit(definition.name),
1891
+ // The cursor goes where the planner puts the change (see `planCanvasToolPlayback`).
1892
+ plan: (args) => planCanvasToolPlayback(definition.name, args, options.getSnapshot(), options.plannerOptions, options.rectOptions)
1893
+ }))
1773
1894
  ];
1774
1895
  if (options.captureView) {
1775
1896
  const capture = options.captureView;
@@ -1787,6 +1908,7 @@ function createEditorMcpToolProvider(options) {
1787
1908
  title: "Canvas and prompt editor",
1788
1909
  description: "The node canvas and the prompt: editor state, nodes and edges, layout, prompt text, and a view of the editor.",
1789
1910
  skill: "pixerate-canvas",
1911
+ ...options.playbackSurface ? { playbackSurface: options.playbackSurface } : {},
1790
1912
  tools
1791
1913
  };
1792
1914
  }
@@ -2065,4 +2187,22 @@ function createCanvasComponentToolProvider(controller, options = { id: "canvas-c
2065
2187
 
2066
2188
 
2067
2189
 
2068
- exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkHDK3T2QScjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkHDK3T2QScjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkHDK3T2QScjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkHDK3T2QScjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkHDK3T2QScjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkHDK3T2QScjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkHDK3T2QScjs.ToolRegistry; exports.ToolRegistryError = _chunkHDK3T2QScjs.ToolRegistryError; exports.ToolRegistryView = _chunkHDK3T2QScjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkHDK3T2QScjs.baseToolName; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkHDK3T2QScjs.connectToolBridge; exports.createCanvasComponentToolProvider = createCanvasComponentToolProvider; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createDocumentChartTools = createDocumentChartTools; exports.createEditorMcpToolProvider = createEditorMcpToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createMcpServer = _chunkHDK3T2QScjs.createMcpServer; exports.createRichTextToolProvider = createRichTextToolProvider; exports.createSpreadsheetToolProvider = createSpreadsheetToolProvider; exports.createToolRegistry = _chunkHDK3T2QScjs.createToolRegistry; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkHDK3T2QScjs.errorResult; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkills = _chunkHDK3T2QScjs.listSkills; exports.normalizeSide = normalizeSide; exports.parseSkillFrontmatter = _chunkHDK3T2QScjs.parseSkillFrontmatter; exports.planAgentCommand = planAgentCommand; exports.planToolCall = planToolCall; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkHDK3T2QScjs.readSkillFile; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.searchTokens = _chunkHDK3T2QScjs.searchTokens; exports.searchTools = _chunkHDK3T2QScjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkHDK3T2QScjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkHDK3T2QScjs.toToolResult; exports.toolCallToAgentCommand = toolCallToAgentCommand; exports.toolsetInstructions = _chunkHDK3T2QScjs.toolsetInstructions; exports.toolsetName = _chunkHDK3T2QScjs.toolsetName; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unknownToolMessage = _chunkHDK3T2QScjs.unknownToolMessage; exports.validateAgentCommand = validateAgentCommand; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
2190
+
2191
+
2192
+
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+
2204
+
2205
+
2206
+
2207
+
2208
+ exports.AgentPlayback = _chunkX2HQP7DFcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkY4BWZB6Jcjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkY4BWZB6Jcjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkUJGAA6AKcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkUJGAA6AKcjs.PerformanceQueue; exports.PresenceStore = _chunkUJGAA6AKcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkY4BWZB6Jcjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkY4BWZB6Jcjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkY4BWZB6Jcjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkY4BWZB6Jcjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkY4BWZB6Jcjs.ToolRegistry; exports.ToolRegistryError = _chunkY4BWZB6Jcjs.ToolRegistryError; exports.ToolRegistryView = _chunkY4BWZB6Jcjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkY4BWZB6Jcjs.baseToolName; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkY4BWZB6Jcjs.connectToolBridge; exports.createAgentPlayback = _chunkX2HQP7DFcjs.createAgentPlayback; exports.createCanvasComponentToolProvider = createCanvasComponentToolProvider; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createDocumentChartTools = createDocumentChartTools; exports.createEditorMcpToolProvider = createEditorMcpToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkUJGAA6AKcjs.createInstantPresenceClock; exports.createMcpServer = _chunkY4BWZB6Jcjs.createMcpServer; exports.createRichTextToolProvider = createRichTextToolProvider; exports.createSpreadsheetToolProvider = createSpreadsheetToolProvider; exports.createToolRegistry = _chunkY4BWZB6Jcjs.createToolRegistry; exports.derivePlaybackSteps = _chunkX2HQP7DFcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkY4BWZB6Jcjs.errorResult; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkills = _chunkY4BWZB6Jcjs.listSkills; exports.normalizeSide = normalizeSide; exports.parseSkillFrontmatter = _chunkY4BWZB6Jcjs.parseSkillFrontmatter; exports.planAgentCommand = planAgentCommand; exports.planCanvasPlaybackSteps = planCanvasPlaybackSteps; exports.planCanvasToolPlayback = planCanvasToolPlayback; exports.planToolCall = planToolCall; exports.playbackRefsFromArgs = _chunkX2HQP7DFcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunkX2HQP7DFcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkY4BWZB6Jcjs.readSkillFile; exports.readingTime = _chunkX2HQP7DFcjs.readingTime; exports.realPresenceClock = _chunkUJGAA6AKcjs.realPresenceClock; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runToolScript = _chunkXH32BATEcjs.runToolScript; exports.searchTokens = _chunkY4BWZB6Jcjs.searchTokens; exports.searchTools = _chunkY4BWZB6Jcjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkY4BWZB6Jcjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkY4BWZB6Jcjs.toToolResult; exports.toolCallToAgentCommand = toolCallToAgentCommand; exports.toolResultError = _chunkXH32BATEcjs.toolResultError; exports.toolResultValue = _chunkXH32BATEcjs.toolResultValue; exports.toolsetInstructions = _chunkY4BWZB6Jcjs.toolsetInstructions; exports.toolsetName = _chunkY4BWZB6Jcjs.toolsetName; exports.tweenPresenceCursor = _chunkUJGAA6AKcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunkX2HQP7DFcjs.unionRects; exports.unknownToolMessage = _chunkY4BWZB6Jcjs.unknownToolMessage; exports.validateAgentCommand = validateAgentCommand; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
@@ -4,3 +4,4 @@ export * from '../tools/index.cjs';
4
4
  export * from './providers.cjs';
5
5
  export * from './documentChartTools.cjs';
6
6
  export * from './componentTools.cjs';
7
+ export * from './canvasPlayback.cjs';
@@ -4,3 +4,4 @@ export * from '../tools/index.js';
4
4
  export * from './providers.js';
5
5
  export * from './documentChartTools.js';
6
6
  export * from './componentTools.js';
7
+ export * from './canvasPlayback.js';