@pixerate/editor 0.139.1 → 0.140.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 (120) hide show
  1. package/README.md +25 -4
  2. package/dist/agent/formatTools.d.cts +15 -0
  3. package/dist/agent/formatTools.d.ts +15 -0
  4. package/dist/agent/index.cjs +397 -46
  5. package/dist/agent/index.js +365 -14
  6. package/dist/agent/providers.d.cts +5 -3
  7. package/dist/agent/providers.d.ts +5 -3
  8. package/dist/animation-editor/effect-tools.d.cts +1 -1
  9. package/dist/animation-editor/effect-tools.d.ts +1 -1
  10. package/dist/animation-editor/index.cjs +250 -116
  11. package/dist/animation-editor/index.js +228 -94
  12. package/dist/animation-editor/instructions.d.cts +1 -1
  13. package/dist/animation-editor/instructions.d.ts +1 -1
  14. package/dist/animation-editor/parse.d.cts +3 -1
  15. package/dist/animation-editor/parse.d.ts +3 -1
  16. package/dist/animation-editor/tools.d.cts +8 -3
  17. package/dist/animation-editor/tools.d.ts +8 -3
  18. package/dist/bridge/cli.cjs +3 -3
  19. package/dist/bridge/cli.js +2 -2
  20. package/dist/bridge/index.cjs +7 -3
  21. package/dist/bridge/index.d.cts +7 -0
  22. package/dist/bridge/index.d.ts +7 -0
  23. package/dist/bridge/index.js +8 -4
  24. package/dist/bridge/skills.d.cts +9 -0
  25. package/dist/bridge/skills.d.ts +9 -0
  26. package/dist/canvas/effect-tools.d.cts +1 -1
  27. package/dist/canvas/effect-tools.d.ts +1 -1
  28. package/dist/canvas/index.cjs +22 -17
  29. package/dist/canvas/index.js +8 -3
  30. package/dist/chart/file-tools.d.cts +1 -1
  31. package/dist/chart/file-tools.d.ts +1 -1
  32. package/dist/chart/index.cjs +7 -1
  33. package/dist/chart/index.js +7 -1
  34. package/dist/chart/tools.d.cts +1 -1
  35. package/dist/chart/tools.d.ts +1 -1
  36. package/dist/{chunk-BKMU3V6K.js → chunk-5ED73EC6.js} +8 -1
  37. package/dist/{chunk-VRIR53SW.js → chunk-5G3KYRER.js} +2 -1
  38. package/dist/{chunk-KHMVB3SJ.js → chunk-7KWJEYIK.js} +4 -1
  39. package/dist/{chunk-R47NQICB.cjs → chunk-HDCH35UM.cjs} +47 -10
  40. package/dist/{chunk-6NCBFBXA.js → chunk-IQ6KKXOU.js} +1 -1
  41. package/dist/{chunk-PCNCT4ZY.js → chunk-KIBEEN5K.js} +40 -3
  42. package/dist/{chunk-CZRWP6IW.cjs → chunk-N2FGYZ4Q.cjs} +8 -1
  43. package/dist/{chunk-T6Y5FV7G.cjs → chunk-RPW7YL3D.cjs} +2 -1
  44. package/dist/{chunk-3V746PF4.cjs → chunk-RUZQMYXH.cjs} +4 -1
  45. package/dist/{chunk-GUPQ5BNA.cjs → chunk-RWML7TWG.cjs} +44 -44
  46. package/dist/{chunk-HGHXGCKG.cjs → chunk-SVFEVKLF.cjs} +1 -1
  47. package/dist/{chunk-PQMADRCI.js → chunk-UOJS6PUP.js} +1 -1
  48. package/dist/{chunk-BWT4IWLK.cjs → chunk-VKF3PWKR.cjs} +7 -7
  49. package/dist/chunk-WBKLYLZE.js +1156 -0
  50. package/dist/{chunk-TBSPPVTT.js → chunk-XCK7QK5D.js} +1 -1
  51. package/dist/chunk-ZAOOIJ6I.cjs +1156 -0
  52. package/dist/commands/agentTools.d.cts +1 -1
  53. package/dist/commands/agentTools.d.ts +1 -1
  54. package/dist/commands/index.cjs +3 -0
  55. package/dist/commands/index.js +3 -0
  56. package/dist/diagram/index.cjs +3 -0
  57. package/dist/diagram/index.js +3 -0
  58. package/dist/diagram/tools.d.cts +1 -1
  59. package/dist/diagram/tools.d.ts +1 -1
  60. package/dist/effects/index.cjs +32 -32
  61. package/dist/effects/index.js +1 -1
  62. package/dist/effects/tools.d.cts +5 -1
  63. package/dist/effects/tools.d.ts +5 -1
  64. package/dist/extensions/index.cjs +3 -3
  65. package/dist/extensions/index.js +2 -2
  66. package/dist/generation/index.cjs +7 -1
  67. package/dist/generation/index.js +7 -1
  68. package/dist/image-editor/index.cjs +21 -15
  69. package/dist/image-editor/index.js +8 -2
  70. package/dist/image-editor/provider-effect-tools.d.cts +1 -1
  71. package/dist/image-editor/provider-effect-tools.d.ts +1 -1
  72. package/dist/image-editor/tools.d.cts +1 -1
  73. package/dist/image-editor/tools.d.ts +1 -1
  74. package/dist/index.cjs +8 -8
  75. package/dist/index.js +2 -2
  76. package/dist/paint-editor/effect-tools.d.cts +1 -1
  77. package/dist/paint-editor/effect-tools.d.ts +1 -1
  78. package/dist/paint-editor/index.cjs +18 -8
  79. package/dist/paint-editor/index.js +13 -3
  80. package/dist/paint-editor/tools.d.cts +1 -1
  81. package/dist/paint-editor/tools.d.ts +1 -1
  82. package/dist/tools/bridge-client.d.cts +3 -3
  83. package/dist/tools/bridge-client.d.ts +3 -3
  84. package/dist/tools/capture.d.cts +5 -1
  85. package/dist/tools/capture.d.ts +5 -1
  86. package/dist/tools/definitions.d.cts +2 -2
  87. package/dist/tools/definitions.d.ts +2 -2
  88. package/dist/tools/index.cjs +31 -5
  89. package/dist/tools/index.d.cts +3 -0
  90. package/dist/tools/index.d.ts +3 -0
  91. package/dist/tools/index.js +31 -5
  92. package/dist/tools/mcp-server.d.cts +24 -6
  93. package/dist/tools/mcp-server.d.ts +24 -6
  94. package/dist/tools/registry.d.cts +81 -6
  95. package/dist/tools/registry.d.ts +81 -6
  96. package/dist/tools/search.d.cts +30 -0
  97. package/dist/tools/search.d.ts +30 -0
  98. package/dist/tools/skills.d.cts +26 -0
  99. package/dist/tools/skills.d.ts +26 -0
  100. package/dist/tools/view.d.cts +95 -0
  101. package/dist/tools/view.d.ts +95 -0
  102. package/dist/vector/effect-tools.d.cts +1 -1
  103. package/dist/vector/effect-tools.d.ts +1 -1
  104. package/dist/vector/index.cjs +13 -7
  105. package/dist/vector/index.js +8 -2
  106. package/dist/video-editor/effect-tools.d.cts +1 -1
  107. package/dist/video-editor/effect-tools.d.ts +1 -1
  108. package/dist/video-editor/index.cjs +275 -269
  109. package/dist/video-editor/index.js +8 -2
  110. package/dist/video-editor/tools.d.cts +1 -1
  111. package/dist/video-editor/tools.d.ts +1 -1
  112. package/package.json +4 -2
  113. package/skills/README.md +8 -3
  114. package/skills/pixerate-agent-tools/SKILL.md +33 -7
  115. package/skills/pixerate-animation-editor/SKILL.md +7 -0
  116. package/skills/pixerate-rich-text/SKILL.md +18 -4
  117. package/dist/chunk-5RRYDFU2.js +0 -466
  118. package/dist/chunk-SPVIXXIB.cjs +0 -466
  119. /package/dist/{chunk-SMJK5HBJ.js → chunk-MCTQXUXR.js} +0 -0
  120. /package/dist/{chunk-DDF6WQ62.cjs → chunk-R6DFK5OX.cjs} +0 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agent skill files (`skills/<name>/SKILL.md` plus its `references/*.md`), keyed by
3
+ * path relative to the skills directory: `pixerate-chart/SKILL.md`,
4
+ * `pixerate-vector/references/commands.md`. In Node, `loadSkillFiles()` from
5
+ * `@pixerate/editor/bridge` reads the ones shipped with the package; in a browser,
6
+ * import them as text (with Vite, `import.meta.glob('…/skills/**\/*.md', { query: '?raw', import: 'default', eager: true })`).
7
+ */
8
+ export type SkillFiles = Readonly<Record<string, string>>;
9
+ export interface SkillInfo {
10
+ /** Skill name (its directory), e.g. `pixerate-chart`. */
11
+ name: string;
12
+ /** The frontmatter `description`: what the skill covers and when to use it. */
13
+ description: string;
14
+ /** Other files of the skill relative to its directory, e.g. `references/commands.md`. */
15
+ references: string[];
16
+ }
17
+ /** Reads `name` and `description` from a SKILL.md's YAML frontmatter. */
18
+ export declare function parseSkillFrontmatter(markdown: string): {
19
+ name?: string;
20
+ description?: string;
21
+ body: string;
22
+ };
23
+ /** The skills in a set of skill files, sorted by name. */
24
+ export declare function listSkills(files: SkillFiles): SkillInfo[];
25
+ /** One file of a skill (`SKILL.md` by default), or `undefined` if there is none. */
26
+ export declare function readSkillFile(files: SkillFiles, skill: string, file?: string): string | undefined;
@@ -0,0 +1,95 @@
1
+ import type { McpListToolsResult, McpToolDefinition, McpToolResult, ToolSource, ToolsetInfo } from './registry.cjs';
2
+ import { type SkillFiles } from './skills.cjs';
3
+ export interface ToolDiscoveryOptions {
4
+ /** Toolsets listed from the start (default none: the agent enables what it needs). */
5
+ enabled?: readonly string[];
6
+ /** Skill files `get_skill` serves (see {@link SkillFiles}). Without them there is no `get_skill`. */
7
+ skills?: SkillFiles;
8
+ /** Default and maximum number of `search_tools` results (default 10, at most 50). */
9
+ searchLimit?: number;
10
+ }
11
+ export interface ToolViewOptions {
12
+ /**
13
+ * Toolsets the agent may see and call (names from `registry.toolsets()`), or a
14
+ * predicate. Default: all. Change it later with `setToolsets`, e.g. to follow
15
+ * the focused editor.
16
+ */
17
+ toolsets?: readonly string[] | ((toolset: ToolsetInfo) => boolean);
18
+ /** Only expose tools annotated `readOnlyHint: true`; write tools are refused with the reason. */
19
+ readOnly?: boolean;
20
+ /**
21
+ * Serve discovery tools (`list_toolsets`, `search_tools`, `enable_tools`,
22
+ * `disable_tools` and, with skills, `get_skill`) and list only the toolsets
23
+ * and tools that are enabled, so a large catalogue costs the agent a handful
24
+ * of tool definitions until it asks for more. Tools that are allowed but not
25
+ * enabled can still be called by name.
26
+ */
27
+ discovery?: boolean | ToolDiscoveryOptions;
28
+ }
29
+ /** Names of the tools a discovery view adds. */
30
+ export declare const TOOL_DISCOVERY_TOOLS: readonly ["list_toolsets", "search_tools", "enable_tools", "disable_tools", "get_skill"];
31
+ /**
32
+ * A filtered view of a {@link ToolSource} (usually a `ToolRegistry`, from
33
+ * `registry.view()`) that is itself a `ToolSource`, so `createMcpServer`,
34
+ * `connectToolBridge` and further views accept it.
35
+ *
36
+ * - **Scope** an agent to some toolsets (`toolsets`) or to read tools
37
+ * (`readOnly`). Tools outside the scope are neither listed nor callable.
38
+ * - **Discover** (`discovery`): list only what the agent enabled, plus tools to
39
+ * browse and search the rest and to enable it. `listChanged` fires whenever
40
+ * the listing changes.
41
+ */
42
+ export declare class ToolRegistryView implements ToolSource {
43
+ private readonly source;
44
+ readonly capabilities: {
45
+ readonly tools: {
46
+ readonly listChanged: true;
47
+ };
48
+ };
49
+ private allow;
50
+ private readonly readOnly;
51
+ private readonly discovery;
52
+ private readonly enabledSets;
53
+ private readonly enabledTools;
54
+ private readonly listeners;
55
+ private readonly meta;
56
+ private unsubscribe;
57
+ private lastSignature;
58
+ constructor(source: ToolSource, options?: ToolViewOptions);
59
+ /** Changes which toolsets the agent may use (`undefined`: all). Fires `listChanged` if the listing changes. */
60
+ setToolsets(toolsets: ToolViewOptions['toolsets']): void;
61
+ /**
62
+ * Lists more tools in a discovery view, as the `enable_tools` tool does.
63
+ * Throws for names the view does not allow. Returns the tool names newly listed.
64
+ */
65
+ enableTools(selection: {
66
+ tools?: readonly string[];
67
+ toolsets?: readonly string[];
68
+ }): string[];
69
+ /** Stops listing tools in a discovery view, as `disable_tools` does. Returns the tool names no longer listed. */
70
+ disableTools(selection: {
71
+ tools?: readonly string[];
72
+ toolsets?: readonly string[];
73
+ }): string[];
74
+ /** Allowed toolsets, each with only its allowed tools. */
75
+ toolsets(): ToolsetInfo[];
76
+ listTools(): McpListToolsResult;
77
+ hasTool(name: string): boolean;
78
+ getTool(name: string): McpToolDefinition | undefined;
79
+ callTool(name: string, args?: Record<string, unknown>, options?: {
80
+ signal?: AbortSignal;
81
+ }): Promise<McpToolResult>;
82
+ onListChanged(listener: (tools: McpToolDefinition[]) => void): () => void;
83
+ /** Stops following the source and drops every listener. */
84
+ dispose(): void;
85
+ private changed;
86
+ private signature;
87
+ private allowsSet;
88
+ private catalogue;
89
+ private listed;
90
+ /** Resolves an exposed or unique bare name among the allowed tools, or explains why it isn't one. */
91
+ private find;
92
+ /** Normalizes names to exposed tool and toolset names, or throws naming every unknown one. */
93
+ private checkSelection;
94
+ private createDiscoveryTools;
95
+ }
@@ -0,0 +1,95 @@
1
+ import type { McpListToolsResult, McpToolDefinition, McpToolResult, ToolSource, ToolsetInfo } from './registry.js';
2
+ import { type SkillFiles } from './skills.js';
3
+ export interface ToolDiscoveryOptions {
4
+ /** Toolsets listed from the start (default none: the agent enables what it needs). */
5
+ enabled?: readonly string[];
6
+ /** Skill files `get_skill` serves (see {@link SkillFiles}). Without them there is no `get_skill`. */
7
+ skills?: SkillFiles;
8
+ /** Default and maximum number of `search_tools` results (default 10, at most 50). */
9
+ searchLimit?: number;
10
+ }
11
+ export interface ToolViewOptions {
12
+ /**
13
+ * Toolsets the agent may see and call (names from `registry.toolsets()`), or a
14
+ * predicate. Default: all. Change it later with `setToolsets`, e.g. to follow
15
+ * the focused editor.
16
+ */
17
+ toolsets?: readonly string[] | ((toolset: ToolsetInfo) => boolean);
18
+ /** Only expose tools annotated `readOnlyHint: true`; write tools are refused with the reason. */
19
+ readOnly?: boolean;
20
+ /**
21
+ * Serve discovery tools (`list_toolsets`, `search_tools`, `enable_tools`,
22
+ * `disable_tools` and, with skills, `get_skill`) and list only the toolsets
23
+ * and tools that are enabled, so a large catalogue costs the agent a handful
24
+ * of tool definitions until it asks for more. Tools that are allowed but not
25
+ * enabled can still be called by name.
26
+ */
27
+ discovery?: boolean | ToolDiscoveryOptions;
28
+ }
29
+ /** Names of the tools a discovery view adds. */
30
+ export declare const TOOL_DISCOVERY_TOOLS: readonly ["list_toolsets", "search_tools", "enable_tools", "disable_tools", "get_skill"];
31
+ /**
32
+ * A filtered view of a {@link ToolSource} (usually a `ToolRegistry`, from
33
+ * `registry.view()`) that is itself a `ToolSource`, so `createMcpServer`,
34
+ * `connectToolBridge` and further views accept it.
35
+ *
36
+ * - **Scope** an agent to some toolsets (`toolsets`) or to read tools
37
+ * (`readOnly`). Tools outside the scope are neither listed nor callable.
38
+ * - **Discover** (`discovery`): list only what the agent enabled, plus tools to
39
+ * browse and search the rest and to enable it. `listChanged` fires whenever
40
+ * the listing changes.
41
+ */
42
+ export declare class ToolRegistryView implements ToolSource {
43
+ private readonly source;
44
+ readonly capabilities: {
45
+ readonly tools: {
46
+ readonly listChanged: true;
47
+ };
48
+ };
49
+ private allow;
50
+ private readonly readOnly;
51
+ private readonly discovery;
52
+ private readonly enabledSets;
53
+ private readonly enabledTools;
54
+ private readonly listeners;
55
+ private readonly meta;
56
+ private unsubscribe;
57
+ private lastSignature;
58
+ constructor(source: ToolSource, options?: ToolViewOptions);
59
+ /** Changes which toolsets the agent may use (`undefined`: all). Fires `listChanged` if the listing changes. */
60
+ setToolsets(toolsets: ToolViewOptions['toolsets']): void;
61
+ /**
62
+ * Lists more tools in a discovery view, as the `enable_tools` tool does.
63
+ * Throws for names the view does not allow. Returns the tool names newly listed.
64
+ */
65
+ enableTools(selection: {
66
+ tools?: readonly string[];
67
+ toolsets?: readonly string[];
68
+ }): string[];
69
+ /** Stops listing tools in a discovery view, as `disable_tools` does. Returns the tool names no longer listed. */
70
+ disableTools(selection: {
71
+ tools?: readonly string[];
72
+ toolsets?: readonly string[];
73
+ }): string[];
74
+ /** Allowed toolsets, each with only its allowed tools. */
75
+ toolsets(): ToolsetInfo[];
76
+ listTools(): McpListToolsResult;
77
+ hasTool(name: string): boolean;
78
+ getTool(name: string): McpToolDefinition | undefined;
79
+ callTool(name: string, args?: Record<string, unknown>, options?: {
80
+ signal?: AbortSignal;
81
+ }): Promise<McpToolResult>;
82
+ onListChanged(listener: (tools: McpToolDefinition[]) => void): () => void;
83
+ /** Stops following the source and drops every listener. */
84
+ dispose(): void;
85
+ private changed;
86
+ private signature;
87
+ private allowsSet;
88
+ private catalogue;
89
+ private listed;
90
+ /** Resolves an exposed or unique bare name among the allowed tools, or explains why it isn't one. */
91
+ private find;
92
+ /** Normalizes names to exposed tool and toolset names, or throws naming every unknown one. */
93
+ private checkSelection;
94
+ private createDiscoveryTools;
95
+ }
@@ -9,7 +9,7 @@ import type { VectorEditorController } from './controller.cjs';
9
9
  export interface VectorEffectsToolProviderOptions {
10
10
  /** Provider id (unique per registry). Default `vector-effects`. */
11
11
  id?: string;
12
- /** Always prefix tool names with `<namespace>__`. */
12
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
13
13
  namespace?: string;
14
14
  /** The document cannot be edited: write tools are hidden. A string is the reason. */
15
15
  readOnly?: boolean | string | (() => boolean | string);
@@ -9,7 +9,7 @@ import type { VectorEditorController } from './controller.js';
9
9
  export interface VectorEffectsToolProviderOptions {
10
10
  /** Provider id (unique per registry). Default `vector-effects`. */
11
11
  id?: string;
12
- /** Always prefix tool names with `<namespace>__`. */
12
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
13
13
  namespace?: string;
14
14
  /** The document cannot be edited: write tools are hidden. A string is the reason. */
15
15
  readOnly?: boolean | string | (() => boolean | string);
@@ -541,7 +541,7 @@ var _chunkNM3G4VQTcjs = require('../chunk-NM3G4VQT.cjs');
541
541
 
542
542
 
543
543
 
544
- var _chunk3V746PF4cjs = require('../chunk-3V746PF4.cjs');
544
+ var _chunkRUZQMYXHcjs = require('../chunk-RUZQMYXH.cjs');
545
545
  require('../chunk-WOFXZ3XU.cjs');
546
546
 
547
547
 
@@ -7968,7 +7968,7 @@ var VectorEditorController = (_class7 = class _VectorEditorController {
7968
7968
  }
7969
7969
  // --- Provider effects ---
7970
7970
  /** The effects provider slot (see `setEffectsProvider`). */
7971
- __init59() {this.effects = new (0, _chunk3V746PF4cjs.EffectsSlot)()}
7971
+ __init59() {this.effects = new (0, _chunkRUZQMYXHcjs.EffectsSlot)()}
7972
7972
  /** The registered effects provider, or `null`. */
7973
7973
  get effectsProvider() {
7974
7974
  return this.effects.provider;
@@ -7992,10 +7992,10 @@ var VectorEditorController = (_class7 = class _VectorEditorController {
7992
7992
  /** The effect's picture as group children, scaled into `box` (an affine fit). */
7993
7993
  async vectorEffectPicture(effect, values) {
7994
7994
  const provider = this.effects.require();
7995
- if (!provider.applyVectorEffect) throw new (0, _chunk3V746PF4cjs.EffectUnsupportedError)(`${provider.name} has no vector effects.`);
7995
+ if (!provider.applyVectorEffect) throw new (0, _chunkRUZQMYXHcjs.EffectUnsupportedError)(`${provider.name} has no vector effects.`);
7996
7996
  const d = await provider.describe(effect);
7997
- if (d.kind !== "vector") throw new (0, _chunk3V746PF4cjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.kind} effect; the vector editor adds vector effects, which bring their own picture${d.kind === "motion" ? " (apply motion in the animation editor)" : ""}.`, d.id);
7998
- const resolved = _chunk3V746PF4cjs.resolveEffectValues.call(void 0, d, values);
7997
+ if (d.kind !== "vector") throw new (0, _chunkRUZQMYXHcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.kind} effect; the vector editor adds vector effects, which bring their own picture${d.kind === "motion" ? " (apply motion in the animation editor)" : ""}.`, d.id);
7998
+ const resolved = _chunkRUZQMYXHcjs.resolveEffectValues.call(void 0, d, values);
7999
7999
  const motion = await provider.applyVectorEffect(d.id, this.toSvg(), resolved);
8000
8000
  const parsed = _chunkRCUX6CT2cjs.parseVectorSvg.call(void 0, motion.svg);
8001
8001
  if (!parsed.nodes.length) throw new Error(`"${d.name}" drew no shapes the editor can read.`);
@@ -18396,7 +18396,10 @@ function createVectorGenerationToolProvider(controller, options) {
18396
18396
  };
18397
18397
  return {
18398
18398
  id: _nullishCoalesce(options.id, () => ( "vector-generation")),
18399
- ...options.namespace ? { namespace: options.namespace } : {},
18399
+ ...options.namespace !== void 0 ? { namespace: options.namespace } : {},
18400
+ title: "Vector generation",
18401
+ description: "Generate vector art from a prompt with a configured model, and regenerate it.",
18402
+ skill: "pixerate-vector",
18400
18403
  tools: () => readOnly() ? [list] : [list, generate, regenerate],
18401
18404
  // The write tools come and go with a read-only state that can change.
18402
18405
  ...typeof options.readOnly === "function" ? { subscribe: (notify) => controller.subscribe(() => notify()) } : {}
@@ -18551,9 +18554,12 @@ function createVectorEffectsToolProvider(controller, options = {}) {
18551
18554
  const effects = _optionalChain([g, 'optionalAccess', _753 => _753.providerEffect]) ? [info(g)] : [];
18552
18555
  return { target: id, effect: _nullishCoalesce(removed, () => ( effects[0])), effects };
18553
18556
  };
18554
- return _chunk3V746PF4cjs.createEffectToolProvider.call(void 0, {
18557
+ return _chunkRUZQMYXHcjs.createEffectToolProvider.call(void 0, {
18555
18558
  id: _nullishCoalesce(options.id, () => ( "vector-effects")),
18556
18559
  namespace: options.namespace,
18560
+ title: "Vector effects",
18561
+ description: "Provider effects placed in the vector document as effect groups.",
18562
+ skill: "pixerate-vector",
18557
18563
  target: { noun: "group", id: `For apply_effect: "document" for the top level, or a group id to put the picture in. For update_effect and remove_effect: the effect group's id from list_applied_effects.` },
18558
18564
  applyUses: ["title", "overlay", "generator", "interactive"],
18559
18565
  applyDetails: `Only vector effects (kind vector: lower thirds, stickers, loaders, badges) can be added: the effect's SVG at rest becomes a group of editable shapes, fitted into the middle half of the document and selected; move or scale it like any group. Its motion plays in the animation editor (add_vector_effect there). update_effect with effect "picture" draws it again with new values; remove_effect keeps the shapes as a plain group. index, enabled and opacity do not apply.`,
@@ -541,7 +541,7 @@ import {
541
541
  EffectsSlot,
542
542
  createEffectToolProvider,
543
543
  resolveEffectValues
544
- } from "../chunk-KHMVB3SJ.js";
544
+ } from "../chunk-7KWJEYIK.js";
545
545
  import "../chunk-V2ZCJRDM.js";
546
546
  import {
547
547
  GRAIN_PATTERNS
@@ -18396,7 +18396,10 @@ function createVectorGenerationToolProvider(controller, options) {
18396
18396
  };
18397
18397
  return {
18398
18398
  id: options.id ?? "vector-generation",
18399
- ...options.namespace ? { namespace: options.namespace } : {},
18399
+ ...options.namespace !== void 0 ? { namespace: options.namespace } : {},
18400
+ title: "Vector generation",
18401
+ description: "Generate vector art from a prompt with a configured model, and regenerate it.",
18402
+ skill: "pixerate-vector",
18400
18403
  tools: () => readOnly() ? [list] : [list, generate, regenerate],
18401
18404
  // The write tools come and go with a read-only state that can change.
18402
18405
  ...typeof options.readOnly === "function" ? { subscribe: (notify) => controller.subscribe(() => notify()) } : {}
@@ -18554,6 +18557,9 @@ function createVectorEffectsToolProvider(controller, options = {}) {
18554
18557
  return createEffectToolProvider({
18555
18558
  id: options.id ?? "vector-effects",
18556
18559
  namespace: options.namespace,
18560
+ title: "Vector effects",
18561
+ description: "Provider effects placed in the vector document as effect groups.",
18562
+ skill: "pixerate-vector",
18557
18563
  target: { noun: "group", id: `For apply_effect: "document" for the top level, or a group id to put the picture in. For update_effect and remove_effect: the effect group's id from list_applied_effects.` },
18558
18564
  applyUses: ["title", "overlay", "generator", "interactive"],
18559
18565
  applyDetails: `Only vector effects (kind vector: lower thirds, stickers, loaders, badges) can be added: the effect's SVG at rest becomes a group of editable shapes, fitted into the middle half of the document and selected; move or scale it like any group. Its motion plays in the animation editor (add_vector_effect there). update_effect with effect "picture" draws it again with new values; remove_effect keeps the shapes as a plain group. index, enabled and opacity do not apply.`,
@@ -11,7 +11,7 @@ import { type VideoClip } from './types.cjs';
11
11
  export interface VideoEffectsToolProviderOptions {
12
12
  /** Provider id (unique per registry). Default `video-effects`. */
13
13
  id?: string;
14
- /** Always prefix tool names with `<namespace>__`. */
14
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
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);
@@ -11,7 +11,7 @@ import { type VideoClip } from './types.js';
11
11
  export interface VideoEffectsToolProviderOptions {
12
12
  /** Provider id (unique per registry). Default `video-effects`. */
13
13
  id?: string;
14
- /** Always prefix tool names with `<namespace>__`. */
14
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
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);