@pixerate/editor 0.147.0 → 0.149.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 (71) hide show
  1. package/dist/agent/index.cjs +8 -4
  2. package/dist/agent/index.js +6 -2
  3. package/dist/animation-editor/effect-tools.d.cts +5 -0
  4. package/dist/animation-editor/effect-tools.d.ts +5 -0
  5. package/dist/animation-editor/index.cjs +4 -4
  6. package/dist/animation-editor/index.js +4 -4
  7. package/dist/animation-editor/playback.d.cts +3 -2
  8. package/dist/animation-editor/playback.d.ts +3 -2
  9. package/dist/animation-editor/tools.d.cts +5 -0
  10. package/dist/animation-editor/tools.d.ts +5 -0
  11. package/dist/chart/index.cjs +2 -2
  12. package/dist/chart/index.js +2 -2
  13. package/dist/chart/playback.d.cts +2 -2
  14. package/dist/chart/playback.d.ts +2 -2
  15. package/dist/chart/tools.d.cts +5 -0
  16. package/dist/chart/tools.d.ts +5 -0
  17. package/dist/{chunk-HUHBJWTD.js → chunk-3EVMUYF4.js} +16 -0
  18. package/dist/{chunk-D2ENR3LB.cjs → chunk-FR7GHH2K.cjs} +33 -17
  19. package/dist/{chunk-SA37RU2O.js → chunk-OOV64UEB.js} +1 -1
  20. package/dist/{chunk-AG2EXVCR.cjs → chunk-ZCFHPORF.cjs} +2 -2
  21. package/dist/commands/index.cjs +2 -2
  22. package/dist/commands/index.js +1 -1
  23. package/dist/effects/authoring-session.d.cts +25 -0
  24. package/dist/effects/authoring-session.d.ts +25 -0
  25. package/dist/effects/authoring-tools.d.cts +31 -0
  26. package/dist/effects/authoring-tools.d.ts +31 -0
  27. package/dist/effects/authoring.d.cts +152 -0
  28. package/dist/effects/authoring.d.ts +152 -0
  29. package/dist/effects/conformance.d.cts +2 -0
  30. package/dist/effects/conformance.d.ts +2 -0
  31. package/dist/effects/fake.d.cts +2 -0
  32. package/dist/effects/fake.d.ts +2 -0
  33. package/dist/effects/index.cjs +1216 -9
  34. package/dist/effects/index.d.cts +3 -0
  35. package/dist/effects/index.d.ts +3 -0
  36. package/dist/effects/index.js +1210 -3
  37. package/dist/effects/types.d.cts +9 -2
  38. package/dist/effects/types.d.ts +9 -2
  39. package/dist/effects/ui.d.cts +8 -0
  40. package/dist/effects/ui.d.ts +8 -0
  41. package/dist/image-editor/index.cjs +4 -4
  42. package/dist/image-editor/index.js +4 -4
  43. package/dist/image-editor/playback.d.cts +2 -2
  44. package/dist/image-editor/playback.d.ts +2 -2
  45. package/dist/image-editor/provider-effect-tools.d.cts +5 -0
  46. package/dist/image-editor/provider-effect-tools.d.ts +5 -0
  47. package/dist/image-editor/tools.d.cts +5 -0
  48. package/dist/image-editor/tools.d.ts +5 -0
  49. package/dist/paint-editor/effect-tools.d.cts +5 -0
  50. package/dist/paint-editor/effect-tools.d.ts +5 -0
  51. package/dist/paint-editor/index.cjs +3 -3
  52. package/dist/paint-editor/index.js +3 -3
  53. package/dist/paint-editor/playback.d.cts +2 -2
  54. package/dist/paint-editor/playback.d.ts +2 -2
  55. package/dist/paint-editor/tools.d.cts +5 -0
  56. package/dist/paint-editor/tools.d.ts +5 -0
  57. package/dist/tools/index.cjs +7 -3
  58. package/dist/tools/index.js +6 -2
  59. package/dist/tools/playback.d.cts +28 -0
  60. package/dist/tools/playback.d.ts +28 -0
  61. package/dist/video-editor/effect-tools.d.cts +5 -0
  62. package/dist/video-editor/effect-tools.d.ts +5 -0
  63. package/dist/video-editor/index.cjs +4 -4
  64. package/dist/video-editor/index.js +4 -4
  65. package/dist/video-editor/playback.d.cts +3 -2
  66. package/dist/video-editor/playback.d.ts +3 -2
  67. package/dist/video-editor/tools.d.cts +5 -0
  68. package/dist/video-editor/tools.d.ts +5 -0
  69. package/package.json +1 -1
  70. package/skills/README.md +1 -0
  71. package/skills/pixerate-effect-authoring/SKILL.md +80 -0
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { JsonSchema } from '../tools/schema.cjs';
10
10
  import type { FlairSvgAnimation } from '../animation-editor/flair.cjs';
11
+ import type { EffectAuthoringSession, EffectAuthoringSource } from './authoring.cjs';
11
12
  /** How an effect is drawn: a pixel shader, an animated vector picture, or motion applied to someone else's vector art. */
12
13
  export type EffectKind = 'shader' | 'vector' | 'motion';
13
14
  /**
@@ -166,8 +167,10 @@ export interface EffectProviderCapabilities {
166
167
  supportsVector: boolean;
167
168
  /** Largest width or height a renderer accepts (px). */
168
169
  maxSize?: number;
170
+ /** Implements `openAuthoring`: effects can be edited, not only used. */
171
+ supportsAuthoring?: boolean;
169
172
  }
170
- type MaybePromise<T> = T | Promise<T>;
173
+ export type MaybePromise<T> = T | Promise<T>;
171
174
  /**
172
175
  * A source of effects. Implementations live outside this library (for example Flair's
173
176
  * `flairEffects()`); `createFakeEffectProvider` is a small reference implementation.
@@ -194,5 +197,9 @@ export interface EffectProvider {
194
197
  * effect cannot use with `EffectUnsupportedError`.
195
198
  */
196
199
  applyVectorEffect?(id: string, target: EffectVectorTarget, values?: EffectValues): MaybePromise<EffectVectorMotion>;
200
+ /**
201
+ * Opens an effect for editing. Present when `capabilities.supportsAuthoring`. Unknown ids throw
202
+ * `UnknownEffectError`; an effect the provider cannot edit throws `EffectUnsupportedError`.
203
+ */
204
+ openAuthoring?(from: EffectAuthoringSource): MaybePromise<EffectAuthoringSession>;
197
205
  }
198
- export {};
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { JsonSchema } from '../tools/schema.js';
10
10
  import type { FlairSvgAnimation } from '../animation-editor/flair.js';
11
+ import type { EffectAuthoringSession, EffectAuthoringSource } from './authoring.js';
11
12
  /** How an effect is drawn: a pixel shader, an animated vector picture, or motion applied to someone else's vector art. */
12
13
  export type EffectKind = 'shader' | 'vector' | 'motion';
13
14
  /**
@@ -166,8 +167,10 @@ export interface EffectProviderCapabilities {
166
167
  supportsVector: boolean;
167
168
  /** Largest width or height a renderer accepts (px). */
168
169
  maxSize?: number;
170
+ /** Implements `openAuthoring`: effects can be edited, not only used. */
171
+ supportsAuthoring?: boolean;
169
172
  }
170
- type MaybePromise<T> = T | Promise<T>;
173
+ export type MaybePromise<T> = T | Promise<T>;
171
174
  /**
172
175
  * A source of effects. Implementations live outside this library (for example Flair's
173
176
  * `flairEffects()`); `createFakeEffectProvider` is a small reference implementation.
@@ -194,5 +197,9 @@ export interface EffectProvider {
194
197
  * effect cannot use with `EffectUnsupportedError`.
195
198
  */
196
199
  applyVectorEffect?(id: string, target: EffectVectorTarget, values?: EffectValues): MaybePromise<EffectVectorMotion>;
200
+ /**
201
+ * Opens an effect for editing. Present when `capabilities.supportsAuthoring`. Unknown ids throw
202
+ * `UnknownEffectError`; an effect the provider cannot edit throws `EffectUnsupportedError`.
203
+ */
204
+ openAuthoring?(from: EffectAuthoringSource): MaybePromise<EffectAuthoringSession>;
197
205
  }
198
- export {};
@@ -23,6 +23,14 @@ export declare const effectFieldValue: (field: ParameterField, value: unknown) =
23
23
  * differ, for a transition's two sides).
24
24
  */
25
25
  export declare function effectSamplePicture(width: number, height: number, variant?: number): EffectPixels;
26
+ /**
27
+ * Sample pictures for an effect's image inputs (`effectSamplePicture`; a transition's `to` gets
28
+ * the second variant), so previews of filters and transitions have something to change.
29
+ */
30
+ export declare function effectSampleInputs(description: Pick<EffectDescription, 'inputs'>, size: {
31
+ width: number;
32
+ height: number;
33
+ }): Record<string, EffectPixels>;
26
34
  /**
27
35
  * A small preview of an effect from the provider's own renderer: filters run on a sample picture,
28
36
  * transitions go half way between two, generators and overlays draw at `time` (default half
@@ -23,6 +23,14 @@ export declare const effectFieldValue: (field: ParameterField, value: unknown) =
23
23
  * differ, for a transition's two sides).
24
24
  */
25
25
  export declare function effectSamplePicture(width: number, height: number, variant?: number): EffectPixels;
26
+ /**
27
+ * Sample pictures for an effect's image inputs (`effectSamplePicture`; a transition's `to` gets
28
+ * the second variant), so previews of filters and transitions have something to change.
29
+ */
30
+ export declare function effectSampleInputs(description: Pick<EffectDescription, 'inputs'>, size: {
31
+ width: number;
32
+ height: number;
33
+ }): Record<string, EffectPixels>;
26
34
  /**
27
35
  * A small preview of an effect from the provider's own renderer: filters run on a sample picture,
28
36
  * transitions go half way between two, generators and overlays draw at `time` (default half
@@ -9300,12 +9300,12 @@ function planImageToolPlayback(tool, args) {
9300
9300
  }
9301
9301
  return steps.length ? steps : null;
9302
9302
  }
9303
- function withImagePlayback(provider, surface = "image") {
9303
+ function withImagePlayback(provider, surface) {
9304
9304
  const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planImageToolPlayback(tool.name, args) };
9305
9305
  const tools = provider.tools;
9306
9306
  return {
9307
9307
  ...provider,
9308
- playbackSurface: _nullishCoalesce(provider.playbackSurface, () => ( surface)),
9308
+ playbackSurface: _nullishCoalesce(_nullishCoalesce(surface, () => ( provider.playbackSurface)), () => ( "image")),
9309
9309
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
9310
9310
  };
9311
9311
  }
@@ -13275,7 +13275,7 @@ function createImageEditorToolProvider(controller, options = {}) {
13275
13275
  ..._chunkGNK7SESQcjs.createPigmentTools.call(void 0, ),
13276
13276
  ...createImagePsdTools(controller)
13277
13277
  ]
13278
- });
13278
+ }, options.playbackSurface);
13279
13279
  }
13280
13280
 
13281
13281
  // src/image-editor/curve-editing.ts
@@ -15172,7 +15172,7 @@ function createImageEffectsToolProvider(controller, options = {}) {
15172
15172
  }
15173
15173
  }
15174
15174
  ]
15175
- }));
15175
+ }), options.playbackSurface);
15176
15176
  }
15177
15177
 
15178
15178
 
@@ -9300,12 +9300,12 @@ function planImageToolPlayback(tool, args) {
9300
9300
  }
9301
9301
  return steps.length ? steps : null;
9302
9302
  }
9303
- function withImagePlayback(provider, surface = "image") {
9303
+ function withImagePlayback(provider, surface) {
9304
9304
  const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planImageToolPlayback(tool.name, args) };
9305
9305
  const tools = provider.tools;
9306
9306
  return {
9307
9307
  ...provider,
9308
- playbackSurface: provider.playbackSurface ?? surface,
9308
+ playbackSurface: surface ?? provider.playbackSurface ?? "image",
9309
9309
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
9310
9310
  };
9311
9311
  }
@@ -13275,7 +13275,7 @@ function createImageEditorToolProvider(controller, options = {}) {
13275
13275
  ...createPigmentTools(),
13276
13276
  ...createImagePsdTools(controller)
13277
13277
  ]
13278
- });
13278
+ }, options.playbackSurface);
13279
13279
  }
13280
13280
 
13281
13281
  // src/image-editor/curve-editing.ts
@@ -15172,7 +15172,7 @@ function createImageEffectsToolProvider(controller, options = {}) {
15172
15172
  }
15173
15173
  }
15174
15174
  ]
15175
- }));
15175
+ }), options.playbackSurface);
15176
15176
  }
15177
15177
  export {
15178
15178
  ADJUSTMENT_KEYS,
@@ -16,7 +16,7 @@ export declare function createImagePlaybackLocator(controller: Pick<ImageEditorC
16
16
  export declare function planImageToolPlayback(tool: string, args: Record<string, any>): PlaybackStep[] | null;
17
17
  /**
18
18
  * Gives an image tool provider agent playback: each write tool plans its steps with
19
- * `planImageToolPlayback` and every call plays on the `surface` (default `image`, where
20
- * `ImageEditor` attaches itself).
19
+ * `planImageToolPlayback` and every call plays on `surface`. An explicit `surface` wins over the
20
+ * provider's own `playbackSurface`; with neither, it is `image` (where `ImageEditor` attaches itself).
21
21
  */
22
22
  export declare function withImagePlayback(provider: AgentToolProvider, surface?: string): AgentToolProvider;
@@ -16,7 +16,7 @@ export declare function createImagePlaybackLocator(controller: Pick<ImageEditorC
16
16
  export declare function planImageToolPlayback(tool: string, args: Record<string, any>): PlaybackStep[] | null;
17
17
  /**
18
18
  * Gives an image tool provider agent playback: each write tool plans its steps with
19
- * `planImageToolPlayback` and every call plays on the `surface` (default `image`, where
20
- * `ImageEditor` attaches itself).
19
+ * `planImageToolPlayback` and every call plays on `surface`. An explicit `surface` wins over the
20
+ * provider's own `playbackSurface`; with neither, it is `image` (where `ImageEditor` attaches itself).
21
21
  */
22
22
  export declare function withImagePlayback(provider: AgentToolProvider, surface?: string): AgentToolProvider;
@@ -16,6 +16,11 @@ export interface ImageEffectsToolProviderOptions {
16
16
  namespace?: string;
17
17
  /** The document cannot be edited: write tools are hidden. A string is the reason. */
18
18
  readOnly?: boolean | string | (() => boolean | string);
19
+ /**
20
+ * The agent playback surface its calls are acted out on (default `image`, where `ImageEditor` attaches).
21
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
22
+ */
23
+ playbackSurface?: string;
19
24
  }
20
25
  /** A layer's provider effects as the tools report them: an effect layer's own effect, then its effect smart filters. */
21
26
  export declare function imageLayerAppliedEffects(layer: ImageLayer): AppliedEffectInfo[];
@@ -16,6 +16,11 @@ export interface ImageEffectsToolProviderOptions {
16
16
  namespace?: string;
17
17
  /** The document cannot be edited: write tools are hidden. A string is the reason. */
18
18
  readOnly?: boolean | string | (() => boolean | string);
19
+ /**
20
+ * The agent playback surface its calls are acted out on (default `image`, where `ImageEditor` attaches).
21
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
22
+ */
23
+ playbackSurface?: string;
19
24
  }
20
25
  /** A layer's provider effects as the tools report them: an effect layer's own effect, then its effect smart filters. */
21
26
  export declare function imageLayerAppliedEffects(layer: ImageLayer): AppliedEffectInfo[];
@@ -5,6 +5,11 @@ export interface ImageEditorToolProviderOptions {
5
5
  id?: string;
6
6
  /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
7
7
  namespace?: string;
8
+ /**
9
+ * The agent playback surface its calls are acted out on (default `image`, where `ImageEditor` attaches).
10
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
11
+ */
12
+ playbackSurface?: string;
8
13
  }
9
14
  /**
10
15
  * Agent tools for an image editor, for a `ToolRegistry`:
@@ -5,6 +5,11 @@ export interface ImageEditorToolProviderOptions {
5
5
  id?: string;
6
6
  /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
7
7
  namespace?: string;
8
+ /**
9
+ * The agent playback surface its calls are acted out on (default `image`, where `ImageEditor` attaches).
10
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
11
+ */
12
+ playbackSurface?: string;
8
13
  }
9
14
  /**
10
15
  * Agent tools for an image editor, for a `ToolRegistry`:
@@ -13,6 +13,11 @@ export interface PaintEffectsToolProviderOptions {
13
13
  namespace?: string;
14
14
  /** The painting cannot be edited: write tools are hidden. A string is the reason. */
15
15
  readOnly?: boolean | string | (() => boolean | string);
16
+ /**
17
+ * The agent playback surface its calls are acted out on (default `paint`, where `PaintEditor` attaches).
18
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
19
+ */
20
+ playbackSurface?: string;
16
21
  }
17
22
  /** The target id of the effect paper. */
18
23
  export declare const PAPER_TARGET = "paper";
@@ -13,6 +13,11 @@ export interface PaintEffectsToolProviderOptions {
13
13
  namespace?: string;
14
14
  /** The painting cannot be edited: write tools are hidden. A string is the reason. */
15
15
  readOnly?: boolean | string | (() => boolean | string);
16
+ /**
17
+ * The agent playback surface its calls are acted out on (default `paint`, where `PaintEditor` attaches).
18
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
19
+ */
20
+ playbackSurface?: string;
16
21
  }
17
22
  /** The target id of the effect paper. */
18
23
  export declare const PAPER_TARGET = "paper";
@@ -6046,7 +6046,7 @@ function withPaintPlayback(provider, options) {
6046
6046
  const tools = provider.tools;
6047
6047
  return {
6048
6048
  ...provider,
6049
- playbackSurface: _nullishCoalesce(_nullishCoalesce(provider.playbackSurface, () => ( options.surface)), () => ( "paint")),
6049
+ playbackSurface: _nullishCoalesce(_nullishCoalesce(options.surface, () => ( provider.playbackSurface)), () => ( "paint")),
6050
6050
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
6051
6051
  };
6052
6052
  }
@@ -7836,7 +7836,7 @@ function createPaintEditorToolProvider(controller, options = {}) {
7836
7836
  description: "Natural-media painting: paper and grain, dry and wet brushes, the brush library, strokes as data, pigment mixing, stencils, guides, layers and export.",
7837
7837
  skill: "pixerate-paint-editor",
7838
7838
  tools
7839
- }, { director: !!options.director });
7839
+ }, { director: !!options.director, surface: options.playbackSurface });
7840
7840
  }
7841
7841
 
7842
7842
  // src/paint-editor/ui.ts
@@ -8554,7 +8554,7 @@ function createPaintEffectsToolProvider(controller, options = {}) {
8554
8554
  }
8555
8555
  }
8556
8556
  ]
8557
- }), { director: false });
8557
+ }), { director: false, surface: options.playbackSurface });
8558
8558
  }
8559
8559
 
8560
8560
 
@@ -6046,7 +6046,7 @@ function withPaintPlayback(provider, options) {
6046
6046
  const tools = provider.tools;
6047
6047
  return {
6048
6048
  ...provider,
6049
- playbackSurface: provider.playbackSurface ?? options.surface ?? "paint",
6049
+ playbackSurface: options.surface ?? provider.playbackSurface ?? "paint",
6050
6050
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
6051
6051
  };
6052
6052
  }
@@ -7836,7 +7836,7 @@ function createPaintEditorToolProvider(controller, options = {}) {
7836
7836
  description: "Natural-media painting: paper and grain, dry and wet brushes, the brush library, strokes as data, pigment mixing, stencils, guides, layers and export.",
7837
7837
  skill: "pixerate-paint-editor",
7838
7838
  tools
7839
- }, { director: !!options.director });
7839
+ }, { director: !!options.director, surface: options.playbackSurface });
7840
7840
  }
7841
7841
 
7842
7842
  // src/paint-editor/ui.ts
@@ -8554,7 +8554,7 @@ function createPaintEffectsToolProvider(controller, options = {}) {
8554
8554
  }
8555
8555
  }
8556
8556
  ]
8557
- }), { director: false });
8557
+ }), { director: false, surface: options.playbackSurface });
8558
8558
  }
8559
8559
  export {
8560
8560
  BLEND_MENU_GROUPS,
@@ -7,8 +7,8 @@ export declare function paintPlaybackPanel(tool: string): PaintPlaybackPanel | n
7
7
  /** The cursor steps for one paint tool call (by bare name), or null to fall back to the ids it names. */
8
8
  export declare function planPaintToolPlayback(tool: string, _args: Record<string, any>): PlaybackStep[] | null;
9
9
  /**
10
- * Gives a paint tool provider agent playback on `surface` (default `paint`, where `PaintEditor`
11
- * attaches). With a director, strokes, fills and replays play through it (`playback: 'self'`).
10
+ * Gives a paint tool provider agent playback on `surface`. An explicit `surface` wins over the
11
+ * provider's own `playbackSurface`; with neither, it is `paint` (where `PaintEditor` attaches). With a director, strokes, fills and replays play through it (`playback: 'self'`).
12
12
  */
13
13
  export declare function withPaintPlayback(provider: AgentToolProvider, options: {
14
14
  director: boolean;
@@ -7,8 +7,8 @@ export declare function paintPlaybackPanel(tool: string): PaintPlaybackPanel | n
7
7
  /** The cursor steps for one paint tool call (by bare name), or null to fall back to the ids it names. */
8
8
  export declare function planPaintToolPlayback(tool: string, _args: Record<string, any>): PlaybackStep[] | null;
9
9
  /**
10
- * Gives a paint tool provider agent playback on `surface` (default `paint`, where `PaintEditor`
11
- * attaches). With a director, strokes, fills and replays play through it (`playback: 'self'`).
10
+ * Gives a paint tool provider agent playback on `surface`. An explicit `surface` wins over the
11
+ * provider's own `playbackSurface`; with neither, it is `paint` (where `PaintEditor` attaches). With a director, strokes, fills and replays play through it (`playback: 'self'`).
12
12
  */
13
13
  export declare function withPaintPlayback(provider: AgentToolProvider, options: {
14
14
  director: boolean;
@@ -20,6 +20,11 @@ export interface PaintEditorToolProviderOptions {
20
20
  director?: PaintDirector;
21
21
  /** The agent's cursor (default `{ id: 'agent', name: 'Agent' }`). */
22
22
  actor?: PresenceActorInfo;
23
+ /**
24
+ * The agent playback surface its calls are acted out on (default `paint`, where `PaintEditor` attaches).
25
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
26
+ */
27
+ playbackSurface?: string;
23
28
  }
24
29
  /** Agent tools for one paint editor. */
25
30
  export declare function createPaintEditorToolProvider(controller: PaintEditorController, options?: PaintEditorToolProviderOptions): AgentToolProvider;
@@ -20,6 +20,11 @@ export interface PaintEditorToolProviderOptions {
20
20
  director?: PaintDirector;
21
21
  /** The agent's cursor (default `{ id: 'agent', name: 'Agent' }`). */
22
22
  actor?: PresenceActorInfo;
23
+ /**
24
+ * The agent playback surface its calls are acted out on (default `paint`, where `PaintEditor` attaches).
25
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
26
+ */
27
+ playbackSurface?: string;
23
28
  }
24
29
  /** Agent tools for one paint editor. */
25
30
  export declare function createPaintEditorToolProvider(controller: PaintEditorController, options?: PaintEditorToolProviderOptions): AgentToolProvider;
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkAG2EXVCRcjs = require('../chunk-AG2EXVCR.cjs');
5
+ var _chunkZCFHPORFcjs = require('../chunk-ZCFHPORF.cjs');
6
6
 
7
7
 
8
8
 
@@ -38,7 +38,9 @@ var _chunkY4BWZB6Jcjs = require('../chunk-Y4BWZB6J.cjs');
38
38
 
39
39
 
40
40
 
41
- var _chunkD2ENR3LBcjs = require('../chunk-D2ENR3LB.cjs');
41
+
42
+
43
+ var _chunkFR7GHH2Kcjs = require('../chunk-FR7GHH2K.cjs');
42
44
 
43
45
 
44
46
 
@@ -171,4 +173,6 @@ var _chunkWOFXZ3XUcjs = require('../chunk-WOFXZ3XU.cjs');
171
173
 
172
174
 
173
175
 
174
- exports.AgentPlayback = _chunkD2ENR3LBcjs.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 = _chunkD2ENR3LBcjs.createAgentPlayback; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkUJGAA6AKcjs.createInstantPresenceClock; exports.createMcpServer = _chunkY4BWZB6Jcjs.createMcpServer; exports.createPlaybackToolProvider = _chunkD2ENR3LBcjs.createPlaybackToolProvider; exports.createToolRegistry = _chunkY4BWZB6Jcjs.createToolRegistry; exports.derivePlaybackSteps = _chunkD2ENR3LBcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkY4BWZB6Jcjs.errorResult; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkills = _chunkY4BWZB6Jcjs.listSkills; exports.parseSkillFrontmatter = _chunkY4BWZB6Jcjs.parseSkillFrontmatter; exports.playbackRefsFromArgs = _chunkD2ENR3LBcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunkD2ENR3LBcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkY4BWZB6Jcjs.readSkillFile; exports.readingTime = _chunkD2ENR3LBcjs.readingTime; exports.realPresenceClock = _chunkUJGAA6AKcjs.realPresenceClock; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runToolScript = _chunkAG2EXVCRcjs.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.toolResultError = _chunkAG2EXVCRcjs.toolResultError; exports.toolResultValue = _chunkAG2EXVCRcjs.toolResultValue; exports.toolsetInstructions = _chunkY4BWZB6Jcjs.toolsetInstructions; exports.toolsetName = _chunkY4BWZB6Jcjs.toolsetName; exports.tweenPresenceCursor = _chunkUJGAA6AKcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunkD2ENR3LBcjs.unionRects; exports.unknownToolMessage = _chunkY4BWZB6Jcjs.unknownToolMessage; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
176
+
177
+
178
+ exports.AgentPlayback = _chunkFR7GHH2Kcjs.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 = _chunkFR7GHH2Kcjs.createAgentPlayback; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkUJGAA6AKcjs.createInstantPresenceClock; exports.createMcpServer = _chunkY4BWZB6Jcjs.createMcpServer; exports.createPlaybackToolProvider = _chunkFR7GHH2Kcjs.createPlaybackToolProvider; exports.createToolRegistry = _chunkY4BWZB6Jcjs.createToolRegistry; exports.derivePlaybackSteps = _chunkFR7GHH2Kcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkY4BWZB6Jcjs.errorResult; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkills = _chunkY4BWZB6Jcjs.listSkills; exports.locatePlaybackChrome = _chunkFR7GHH2Kcjs.locatePlaybackChrome; exports.parseSkillFrontmatter = _chunkY4BWZB6Jcjs.parseSkillFrontmatter; exports.playbackRectFromClient = _chunkFR7GHH2Kcjs.playbackRectFromClient; exports.playbackRefsFromArgs = _chunkFR7GHH2Kcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunkFR7GHH2Kcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkY4BWZB6Jcjs.readSkillFile; exports.readingTime = _chunkFR7GHH2Kcjs.readingTime; exports.realPresenceClock = _chunkUJGAA6AKcjs.realPresenceClock; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runToolScript = _chunkZCFHPORFcjs.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.toolResultError = _chunkZCFHPORFcjs.toolResultError; exports.toolResultValue = _chunkZCFHPORFcjs.toolResultValue; exports.toolsetInstructions = _chunkY4BWZB6Jcjs.toolsetInstructions; exports.toolsetName = _chunkY4BWZB6Jcjs.toolsetName; exports.tweenPresenceCursor = _chunkUJGAA6AKcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunkFR7GHH2Kcjs.unionRects; exports.unknownToolMessage = _chunkY4BWZB6Jcjs.unknownToolMessage; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
@@ -2,7 +2,7 @@ import {
2
2
  runToolScript,
3
3
  toolResultError,
4
4
  toolResultValue
5
- } from "../chunk-SA37RU2O.js";
5
+ } from "../chunk-OOV64UEB.js";
6
6
  import {
7
7
  JSON_RPC_ERRORS,
8
8
  MCP_PROTOCOL_VERSIONS,
@@ -34,11 +34,13 @@ import {
34
34
  createAgentPlayback,
35
35
  createPlaybackToolProvider,
36
36
  derivePlaybackSteps,
37
+ locatePlaybackChrome,
38
+ playbackRectFromClient,
37
39
  playbackRefsFromArgs,
38
40
  playbackRefsFromResult,
39
41
  readingTime,
40
42
  unionRects
41
- } from "../chunk-HUHBJWTD.js";
43
+ } from "../chunk-3EVMUYF4.js";
42
44
  import {
43
45
  CAPTURE_EXCLUDE_SELECTOR,
44
46
  CAPTURE_OVERLAY_SELECTORS,
@@ -147,7 +149,9 @@ export {
147
149
  errorResult,
148
150
  isUnsafeJsonKey,
149
151
  listSkills,
152
+ locatePlaybackChrome,
150
153
  parseSkillFrontmatter,
154
+ playbackRectFromClient,
151
155
  playbackRefsFromArgs,
152
156
  playbackRefsFromResult,
153
157
  rasterizeElement,
@@ -150,6 +150,34 @@ export declare function derivePlaybackSteps(args: unknown, defaultKind?: string)
150
150
  export declare function readingTime(text: string): number;
151
151
  /** Smallest rectangle around `rects`, or null. */
152
152
  export declare function unionRects(rects: readonly (PlaybackRect | null | undefined)[]): PlaybackRect | null;
153
+ /** A box in client (viewport) pixels, as `Element.getBoundingClientRect()` returns it. */
154
+ export interface PlaybackClientRect {
155
+ left: number;
156
+ top: number;
157
+ width: number;
158
+ height: number;
159
+ }
160
+ /**
161
+ * A client-pixel box (e.g. `element.getBoundingClientRect()`) in a surface's coordinates, through
162
+ * its `fromViewport` (identity without one). Null for an empty box (a hidden element).
163
+ */
164
+ export declare function playbackRectFromClient(rect: PlaybackClientRect | null | undefined, fromViewport?: (point: PlaybackPoint) => PlaybackPoint): PlaybackRect | null;
165
+ /**
166
+ * How a host's own chrome (a HUD, toolbar or panel over or beside an editor) answers a surface's
167
+ * refs. The canvas and element playback surfaces take these options; their own locator runs first.
168
+ */
169
+ export interface PlaybackChromeOptions {
170
+ /** Where `ref` is, in the surface's coordinates (flow units on a canvas, element pixels on an element surface), or null. */
171
+ locate?(ref: PlaybackRef): PlaybackRect | null;
172
+ /** The element that shows `ref` anywhere on the page, or null; its client box is mapped to surface coordinates. */
173
+ locateElement?(ref: PlaybackRef): {
174
+ getBoundingClientRect(): PlaybackClientRect;
175
+ } | null;
176
+ /** Show `ref` for an `open` step (switch to a tab, expand a panel). Without it, `open` steps are skipped. */
177
+ open?(ref: PlaybackRef): void | Promise<void>;
178
+ }
179
+ /** Finds `ref` through `chrome.locate`, then `chrome.locateElement` (mapped with `fromViewport`), or null. */
180
+ export declare function locatePlaybackChrome(ref: PlaybackRef, chrome: PlaybackChromeOptions | null | undefined, fromViewport?: (point: PlaybackPoint) => PlaybackPoint): PlaybackRect | null;
153
181
  /**
154
182
  * Acts out tool calls on attached surfaces. Install it on a registry (`registry.use(playback.middleware)`
155
183
  * or `playback.install(registry)`); editors attach their surfaces while mounted. Results never change:
@@ -150,6 +150,34 @@ export declare function derivePlaybackSteps(args: unknown, defaultKind?: string)
150
150
  export declare function readingTime(text: string): number;
151
151
  /** Smallest rectangle around `rects`, or null. */
152
152
  export declare function unionRects(rects: readonly (PlaybackRect | null | undefined)[]): PlaybackRect | null;
153
+ /** A box in client (viewport) pixels, as `Element.getBoundingClientRect()` returns it. */
154
+ export interface PlaybackClientRect {
155
+ left: number;
156
+ top: number;
157
+ width: number;
158
+ height: number;
159
+ }
160
+ /**
161
+ * A client-pixel box (e.g. `element.getBoundingClientRect()`) in a surface's coordinates, through
162
+ * its `fromViewport` (identity without one). Null for an empty box (a hidden element).
163
+ */
164
+ export declare function playbackRectFromClient(rect: PlaybackClientRect | null | undefined, fromViewport?: (point: PlaybackPoint) => PlaybackPoint): PlaybackRect | null;
165
+ /**
166
+ * How a host's own chrome (a HUD, toolbar or panel over or beside an editor) answers a surface's
167
+ * refs. The canvas and element playback surfaces take these options; their own locator runs first.
168
+ */
169
+ export interface PlaybackChromeOptions {
170
+ /** Where `ref` is, in the surface's coordinates (flow units on a canvas, element pixels on an element surface), or null. */
171
+ locate?(ref: PlaybackRef): PlaybackRect | null;
172
+ /** The element that shows `ref` anywhere on the page, or null; its client box is mapped to surface coordinates. */
173
+ locateElement?(ref: PlaybackRef): {
174
+ getBoundingClientRect(): PlaybackClientRect;
175
+ } | null;
176
+ /** Show `ref` for an `open` step (switch to a tab, expand a panel). Without it, `open` steps are skipped. */
177
+ open?(ref: PlaybackRef): void | Promise<void>;
178
+ }
179
+ /** Finds `ref` through `chrome.locate`, then `chrome.locateElement` (mapped with `fromViewport`), or null. */
180
+ export declare function locatePlaybackChrome(ref: PlaybackRef, chrome: PlaybackChromeOptions | null | undefined, fromViewport?: (point: PlaybackPoint) => PlaybackPoint): PlaybackRect | null;
153
181
  /**
154
182
  * Acts out tool calls on attached surfaces. Install it on a registry (`registry.use(playback.middleware)`
155
183
  * or `playback.install(registry)`); editors attach their surfaces while mounted. Results never change:
@@ -15,6 +15,11 @@ export interface VideoEffectsToolProviderOptions {
15
15
  namespace?: string;
16
16
  /** The project cannot be edited: write tools are hidden. A string is the reason. */
17
17
  readOnly?: boolean | string | (() => boolean | string);
18
+ /**
19
+ * The agent playback surface its calls are acted out on (default `video`, where `VideoTimeline` attaches).
20
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
21
+ */
22
+ playbackSurface?: string;
18
23
  }
19
24
  /** A clip's effects as the tools report them: its effect clip picture, its effect transition, then its stack. */
20
25
  export declare function videoClipAppliedEffects(clip: VideoClip): AppliedEffectInfo[];
@@ -15,6 +15,11 @@ export interface VideoEffectsToolProviderOptions {
15
15
  namespace?: string;
16
16
  /** The project cannot be edited: write tools are hidden. A string is the reason. */
17
17
  readOnly?: boolean | string | (() => boolean | string);
18
+ /**
19
+ * The agent playback surface its calls are acted out on (default `video`, where `VideoTimeline` attaches).
20
+ * Set it when one registry holds several editors of this kind, each attached under its own surface id.
21
+ */
22
+ playbackSurface?: string;
18
23
  }
19
24
  /** A clip's effects as the tools report them: its effect clip picture, its effect transition, then its stack. */
20
25
  export declare function videoClipAppliedEffects(clip: VideoClip): AppliedEffectInfo[];
@@ -3267,12 +3267,12 @@ function planVideoToolPlayback(tool, args) {
3267
3267
  if (str2(args.marker)) return click({ kind: "marker", id: args.marker });
3268
3268
  return null;
3269
3269
  }
3270
- function withVideoPlayback(provider, surface = "video") {
3270
+ function withVideoPlayback(provider, surface) {
3271
3271
  const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planVideoToolPlayback(tool.name, args) };
3272
3272
  const tools = provider.tools;
3273
3273
  return {
3274
3274
  ...provider,
3275
- playbackSurface: _nullishCoalesce(provider.playbackSurface, () => ( surface)),
3275
+ playbackSurface: _nullishCoalesce(_nullishCoalesce(surface, () => ( provider.playbackSurface)), () => ( "video")),
3276
3276
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
3277
3277
  };
3278
3278
  }
@@ -4686,7 +4686,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4686
4686
  }
4687
4687
  });
4688
4688
  }
4689
- });
4689
+ }, options.playbackSurface);
4690
4690
  }
4691
4691
 
4692
4692
  // src/video-editor/effect-tools.ts
@@ -4861,7 +4861,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4861
4861
  }
4862
4862
  }
4863
4863
  ]
4864
- }));
4864
+ }), options.playbackSurface);
4865
4865
  }
4866
4866
 
4867
4867
 
@@ -3267,12 +3267,12 @@ function planVideoToolPlayback(tool, args) {
3267
3267
  if (str2(args.marker)) return click({ kind: "marker", id: args.marker });
3268
3268
  return null;
3269
3269
  }
3270
- function withVideoPlayback(provider, surface = "video") {
3270
+ function withVideoPlayback(provider, surface) {
3271
3271
  const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planVideoToolPlayback(tool.name, args) };
3272
3272
  const tools = provider.tools;
3273
3273
  return {
3274
3274
  ...provider,
3275
- playbackSurface: provider.playbackSurface ?? surface,
3275
+ playbackSurface: surface ?? provider.playbackSurface ?? "video",
3276
3276
  tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
3277
3277
  };
3278
3278
  }
@@ -4686,7 +4686,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4686
4686
  }
4687
4687
  });
4688
4688
  }
4689
- });
4689
+ }, options.playbackSurface);
4690
4690
  }
4691
4691
 
4692
4692
  // src/video-editor/effect-tools.ts
@@ -4861,7 +4861,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4861
4861
  }
4862
4862
  }
4863
4863
  ]
4864
- }));
4864
+ }), options.playbackSurface);
4865
4865
  }
4866
4866
  export {
4867
4867
  VIDEO_BLEND_MODES,
@@ -14,7 +14,8 @@ export declare function parseVideoTimeRef(ref: PlaybackRef): VideoPlaybackTime |
14
14
  export declare function planVideoToolPlayback(tool: string, args: Record<string, any>): PlaybackStep[] | null;
15
15
  /**
16
16
  * Gives a video tool provider agent playback: each write tool plans its steps with
17
- * `planVideoToolPlayback` and every call plays on `surface` (default `video`, where `VideoTimeline`
18
- * attaches itself). `seek_video` (a read in name only) and `edit_video` (a batch) play too.
17
+ * `planVideoToolPlayback` and every call plays on `surface`. An explicit `surface` wins over the
18
+ * provider's own `playbackSurface`; with neither, it is `video` (where `VideoTimeline` attaches
19
+ * itself). `seek_video` (a read in name only) and `edit_video` (a batch) play too.
19
20
  */
20
21
  export declare function withVideoPlayback(provider: AgentToolProvider, surface?: string): AgentToolProvider;