@pixerate/editor 0.139.1 → 0.140.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 (152) 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 +408 -49
  5. package/dist/agent/index.js +375 -16
  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 +4 -3
  19. package/dist/bridge/cli.js +3 -2
  20. package/dist/bridge/index.cjs +8 -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 +9 -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-2BSBFBOA.cjs +46 -0
  37. package/dist/{chunk-SWZTQWY7.js → chunk-2INPJDNY.js} +1 -1
  38. package/dist/{chunk-CCKP4XAN.cjs → chunk-34RQAGWI.cjs} +27 -7
  39. package/dist/{chunk-HXCBQ7A6.cjs → chunk-3AJMR7EG.cjs} +7 -4
  40. package/dist/{chunk-BKMU3V6K.js → chunk-5ED73EC6.js} +8 -1
  41. package/dist/{chunk-NKBUVQJW.cjs → chunk-5WOY52O6.cjs} +15 -15
  42. package/dist/{chunk-VRIR53SW.js → chunk-6GAYGQDC.js} +10 -8
  43. package/dist/{chunk-HZZXBTLB.js → chunk-6IN474P4.js} +25 -5
  44. package/dist/{chunk-KHMVB3SJ.js → chunk-7KWJEYIK.js} +4 -1
  45. package/dist/{chunk-R47NQICB.cjs → chunk-AGCD3EHB.cjs} +47 -10
  46. package/dist/{chunk-6I63VZ45.js → chunk-CXXKJBQZ.js} +5 -1
  47. package/dist/{chunk-6NXVDJDR.cjs → chunk-G43MNQ4C.cjs} +5 -5
  48. package/dist/chunk-HDK3T2QS.cjs +1159 -0
  49. package/dist/chunk-HF5QZS7Z.js +46 -0
  50. package/dist/{chunk-S7I3RI5Z.cjs → chunk-HMGWFXEC.cjs} +27 -24
  51. package/dist/{chunk-6NCBFBXA.js → chunk-IQ6KKXOU.js} +1 -1
  52. package/dist/{chunk-T6Y5FV7G.cjs → chunk-L434J57V.cjs} +10 -8
  53. package/dist/{chunk-UCRL6JEV.cjs → chunk-L5OWG2NA.cjs} +8 -3
  54. package/dist/{chunk-CZRWP6IW.cjs → chunk-N2FGYZ4Q.cjs} +8 -1
  55. package/dist/{chunk-GUPQ5BNA.cjs → chunk-PUR6BZFA.cjs} +112 -111
  56. package/dist/chunk-RB62U6MS.js +1159 -0
  57. package/dist/{chunk-3V746PF4.cjs → chunk-RUZQMYXH.cjs} +4 -1
  58. package/dist/{chunk-HGHXGCKG.cjs → chunk-SVFEVKLF.cjs} +1 -1
  59. package/dist/{chunk-PCNCT4ZY.js → chunk-UMS6YFA6.js} +40 -3
  60. package/dist/{chunk-4LGWAJDI.js → chunk-V5OOP74P.js} +5 -2
  61. package/dist/{chunk-BWT4IWLK.cjs → chunk-VKF3PWKR.cjs} +7 -7
  62. package/dist/{chunk-PQMADRCI.js → chunk-WBJ6BG4R.js} +23 -22
  63. package/dist/{chunk-WIYAOZZU.js → chunk-WHKNYFM2.js} +7 -2
  64. package/dist/{chunk-TBSPPVTT.js → chunk-XCK7QK5D.js} +1 -1
  65. package/dist/{chunk-F652BKMS.cjs → chunk-YN6JKAUE.cjs} +6 -2
  66. package/dist/{chunk-YTGF4TJR.js → chunk-ZLZKGHSZ.js} +5 -2
  67. package/dist/{chunk-USU2FL3N.js → chunk-ZNHB5RG6.js} +1 -1
  68. package/dist/commands/agentTools.d.cts +1 -1
  69. package/dist/commands/agentTools.d.ts +1 -1
  70. package/dist/commands/index.cjs +3 -0
  71. package/dist/commands/index.js +3 -0
  72. package/dist/compare/index.cjs +4 -3
  73. package/dist/compare/index.js +3 -2
  74. package/dist/diagram/index.cjs +3 -0
  75. package/dist/diagram/index.js +3 -0
  76. package/dist/diagram/tools.d.cts +1 -1
  77. package/dist/diagram/tools.d.ts +1 -1
  78. package/dist/effects/index.cjs +32 -32
  79. package/dist/effects/index.js +1 -1
  80. package/dist/effects/tools.d.cts +5 -1
  81. package/dist/effects/tools.d.ts +5 -1
  82. package/dist/export/index.cjs +4 -3
  83. package/dist/export/index.js +3 -2
  84. package/dist/extensions/index.cjs +11 -8
  85. package/dist/extensions/index.d.cts +1 -0
  86. package/dist/extensions/index.d.ts +1 -0
  87. package/dist/extensions/index.js +10 -7
  88. package/dist/extensions/safe-merge-attributes.d.cts +10 -0
  89. package/dist/extensions/safe-merge-attributes.d.ts +10 -0
  90. package/dist/generation/index.cjs +7 -1
  91. package/dist/generation/index.js +7 -1
  92. package/dist/image-editor/index.cjs +25 -18
  93. package/dist/image-editor/index.js +10 -3
  94. package/dist/image-editor/provider-effect-tools.d.cts +1 -1
  95. package/dist/image-editor/provider-effect-tools.d.ts +1 -1
  96. package/dist/image-editor/tools.d.cts +1 -1
  97. package/dist/image-editor/tools.d.ts +1 -1
  98. package/dist/index.cjs +42 -29
  99. package/dist/index.d.cts +1 -0
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.js +22 -9
  102. package/dist/paint-editor/effect-tools.d.cts +1 -1
  103. package/dist/paint-editor/effect-tools.d.ts +1 -1
  104. package/dist/paint-editor/index.cjs +18 -8
  105. package/dist/paint-editor/index.js +13 -3
  106. package/dist/paint-editor/tools.d.cts +1 -1
  107. package/dist/paint-editor/tools.d.ts +1 -1
  108. package/dist/persistence/index.cjs +3 -2
  109. package/dist/persistence/index.js +2 -1
  110. package/dist/serializers/index.cjs +5 -4
  111. package/dist/serializers/index.js +4 -3
  112. package/dist/tools/bridge-client.d.cts +3 -3
  113. package/dist/tools/bridge-client.d.ts +3 -3
  114. package/dist/tools/capture.d.cts +5 -1
  115. package/dist/tools/capture.d.ts +5 -1
  116. package/dist/tools/definitions.d.cts +2 -2
  117. package/dist/tools/definitions.d.ts +2 -2
  118. package/dist/tools/index.cjs +39 -5
  119. package/dist/tools/index.d.cts +4 -0
  120. package/dist/tools/index.d.ts +4 -0
  121. package/dist/tools/index.js +39 -5
  122. package/dist/tools/mcp-server.d.cts +24 -6
  123. package/dist/tools/mcp-server.d.ts +24 -6
  124. package/dist/tools/registry.d.cts +81 -6
  125. package/dist/tools/registry.d.ts +81 -6
  126. package/dist/tools/safe-json.d.cts +27 -0
  127. package/dist/tools/safe-json.d.ts +27 -0
  128. package/dist/tools/search.d.cts +30 -0
  129. package/dist/tools/search.d.ts +30 -0
  130. package/dist/tools/skills.d.cts +26 -0
  131. package/dist/tools/skills.d.ts +26 -0
  132. package/dist/tools/view.d.cts +95 -0
  133. package/dist/tools/view.d.ts +95 -0
  134. package/dist/vector/effect-tools.d.cts +1 -1
  135. package/dist/vector/effect-tools.d.ts +1 -1
  136. package/dist/vector/index.cjs +13 -7
  137. package/dist/vector/index.js +8 -2
  138. package/dist/video-editor/effect-tools.d.cts +1 -1
  139. package/dist/video-editor/effect-tools.d.ts +1 -1
  140. package/dist/video-editor/index.cjs +275 -269
  141. package/dist/video-editor/index.js +8 -2
  142. package/dist/video-editor/tools.d.cts +1 -1
  143. package/dist/video-editor/tools.d.ts +1 -1
  144. package/package.json +31 -29
  145. package/skills/README.md +8 -3
  146. package/skills/pixerate-agent-tools/SKILL.md +33 -7
  147. package/skills/pixerate-animation-editor/SKILL.md +7 -0
  148. package/skills/pixerate-rich-text/SKILL.md +18 -4
  149. package/dist/chunk-5RRYDFU2.js +0 -466
  150. package/dist/chunk-SPVIXXIB.cjs +0 -466
  151. /package/dist/{chunk-SMJK5HBJ.js → chunk-K73HMKQP.js} +0 -0
  152. /package/dist/{chunk-DDF6WQ62.cjs → chunk-LACYURUW.cjs} +0 -0
@@ -369,13 +369,13 @@ var _chunkV4GUQCDZcjs = require('../chunk-V4GUQCDZ.cjs');
369
369
  var _chunkA2IS7EHEcjs = require('../chunk-A2IS7EHE.cjs');
370
370
 
371
371
 
372
- var _chunkUCRL6JEVcjs = require('../chunk-UCRL6JEV.cjs');
372
+ var _chunkL5OWG2NAcjs = require('../chunk-L5OWG2NA.cjs');
373
373
 
374
374
 
375
375
  var _chunkPY4GWSE2cjs = require('../chunk-PY4GWSE2.cjs');
376
376
 
377
377
 
378
- var _chunkCZRWP6IWcjs = require('../chunk-CZRWP6IW.cjs');
378
+ var _chunkN2FGYZ4Qcjs = require('../chunk-N2FGYZ4Q.cjs');
379
379
 
380
380
 
381
381
 
@@ -583,6 +583,7 @@ var _chunkGNK7SESQcjs = require('../chunk-GNK7SESQ.cjs');
583
583
 
584
584
 
585
585
  var _chunkONZJD2ODcjs = require('../chunk-ONZJD2OD.cjs');
586
+ require('../chunk-2BSBFBOA.cjs');
586
587
 
587
588
 
588
589
 
@@ -633,7 +634,7 @@ require('../chunk-NM3G4VQT.cjs');
633
634
 
634
635
 
635
636
 
636
- var _chunk3V746PF4cjs = require('../chunk-3V746PF4.cjs');
637
+ var _chunkRUZQMYXHcjs = require('../chunk-RUZQMYXH.cjs');
637
638
  require('../chunk-WOFXZ3XU.cjs');
638
639
 
639
640
 
@@ -2835,7 +2836,7 @@ function checkImageEffectPlace(d, place) {
2835
2836
  const allowed = IMAGE_EFFECT_PLACES[place];
2836
2837
  if (d.kind === "motion" || !d.uses.some((u) => allowed.includes(u))) {
2837
2838
  const instead = place === "filter" && d.uses.some((u) => IMAGE_EFFECT_PLACES.layer.includes(u)) ? "; add it as an effect layer with add_effect_layer instead" : place === "layer" && d.uses.includes("filter") ? "; apply it to a layer as a smart filter with apply_effect instead" : "";
2838
- throw new (0, _chunk3V746PF4cjs.EffectUnsupportedError)(
2839
+ throw new (0, _chunkRUZQMYXHcjs.EffectUnsupportedError)(
2839
2840
  `"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect, and ${place === "filter" ? "a smart filter takes filter effects" : "an effect layer takes generator, overlay or title effects"}${instead}.`,
2840
2841
  d.id
2841
2842
  );
@@ -2859,9 +2860,9 @@ function effectPixelsToSurface(p, depth) {
2859
2860
  const d = new Uint16Array(f.length);
2860
2861
  const code = (v) => v > 0 ? v < 1 ? Math.round(v * 65535) : 65535 : 0;
2861
2862
  for (let i = 0; i < f.length; i += 4) {
2862
- d[i] = code(_chunk3V746PF4cjs.linearToSrgb.call(void 0, f[i]));
2863
- d[i + 1] = code(_chunk3V746PF4cjs.linearToSrgb.call(void 0, f[i + 1]));
2864
- d[i + 2] = code(_chunk3V746PF4cjs.linearToSrgb.call(void 0, f[i + 2]));
2863
+ d[i] = code(_chunkRUZQMYXHcjs.linearToSrgb.call(void 0, f[i]));
2864
+ d[i + 1] = code(_chunkRUZQMYXHcjs.linearToSrgb.call(void 0, f[i + 1]));
2865
+ d[i + 2] = code(_chunkRUZQMYXHcjs.linearToSrgb.call(void 0, f[i + 2]));
2865
2866
  d[i + 3] = code(f[i + 3]);
2866
2867
  }
2867
2868
  return _chunkCWM3CUUXcjs.surfaceFromDeepPixels.call(void 0, { width: p.width, height: p.height, data: d }, 4);
@@ -2878,7 +2879,7 @@ var ImageEffectsEngine = (_class4 = class {
2878
2879
  __init31() {this.generation = 0}
2879
2880
 
2880
2881
  constructor(options = {}) {;_class4.prototype.__init26.call(this);_class4.prototype.__init27.call(this);_class4.prototype.__init28.call(this);_class4.prototype.__init29.call(this);_class4.prototype.__init30.call(this);_class4.prototype.__init31.call(this);
2881
- this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunk3V746PF4cjs.EffectsSlot)()));
2882
+ this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunkRUZQMYXHcjs.EffectsSlot)()));
2882
2883
  this.maxEntries = _nullishCoalesce(options.maxEntries, () => ( 24));
2883
2884
  this.pool = new (0, _chunkPY4GWSE2cjs.EffectRendererPool)({ maxRenderers: options.maxRenderers });
2884
2885
  this.detach = this.slot.subscribe(() => {
@@ -2938,7 +2939,7 @@ var ImageEffectsEngine = (_class4 = class {
2938
2939
  const provider = this.slot.require();
2939
2940
  const depth = _nullishCoalesce(size.depth, () => ( 8));
2940
2941
  const out = await this.render(provider, effect, size.width, size.height, depth, { time: _nullishCoalesce(size.time, () => ( 0)), values });
2941
- return out.width === size.width && out.height === size.height ? out : _chunk3V746PF4cjs.createEffectPixels.call(void 0, size.width, size.height);
2942
+ return out.width === size.width && out.height === size.height ? out : _chunkRUZQMYXHcjs.createEffectPixels.call(void 0, size.width, size.height);
2942
2943
  }
2943
2944
  /** Why the result for `key` failed, if it did. */
2944
2945
  failure(key) {
@@ -4151,7 +4152,7 @@ var ImageEditorController = (_class7 = class {
4151
4152
  /** For `compositePixels` and mask evaluation (the renderer keeps its own for the viewport). */
4152
4153
  __init64() {this.compositor = new (0, _chunkV4GUQCDZcjs.LayerCompositor)()}
4153
4154
  /** The effects provider slot (see `setEffectsProvider`). */
4154
- __init65() {this.effects = new (0, _chunk3V746PF4cjs.EffectsSlot)()}
4155
+ __init65() {this.effects = new (0, _chunkRUZQMYXHcjs.EffectsSlot)()}
4155
4156
  /** Renders provider effects: effect smart filter results and effect layers. */
4156
4157
  __init66() {this.effectsEngine = new ImageEffectsEngine({ slot: this.effects })}
4157
4158
  __init67() {this.effectRefresh = "none"}
@@ -4376,7 +4377,7 @@ var ImageEditorController = (_class7 = class {
4376
4377
  */
4377
4378
  async applyEffectFilter(layerId, effect, options = {}) {
4378
4379
  const d = await this.describeEffect(effect, "filter");
4379
- const values = _chunk3V746PF4cjs.resolveEffectValues.call(void 0, d, options.values);
4380
+ const values = _chunkRUZQMYXHcjs.resolveEffectValues.call(void 0, d, options.values);
4380
4381
  const found = _chunkHGTDMKNEcjs.findLayer.call(void 0, this.state.layers, layerId);
4381
4382
  if (!found) throw new (0, _chunkV4GUQCDZcjs.LayerOperationError)(`There is no layer "${layerId}"; call list_layers for the layer ids.`);
4382
4383
  let layers = this.state.layers;
@@ -4414,7 +4415,7 @@ var ImageEditorController = (_class7 = class {
4414
4415
  else if (k in d.controls.properties) base[k] = d.defaults[k];
4415
4416
  else throw new (0, _chunkV4GUQCDZcjs.LayerOperationError)(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
4416
4417
  }
4417
- update.values = { ...base, ..._chunk3V746PF4cjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
4418
+ update.values = { ...base, ..._chunkRUZQMYXHcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
4418
4419
  }
4419
4420
  for (const k of ["enabled", "blend", "opacity"]) if (changes[k] !== void 0) update[k] = changes[k];
4420
4421
  let res = _chunkV4GUQCDZcjs.updateSmartFilter.call(void 0, this.state.layers, layerId, filterId, update, this.canvasSize);
@@ -4429,7 +4430,7 @@ var ImageEditorController = (_class7 = class {
4429
4430
  */
4430
4431
  async addEffectLayer(effect, options = {}) {
4431
4432
  const d = await this.describeEffect(effect, "layer");
4432
- const values = _chunk3V746PF4cjs.resolveEffectValues.call(void 0, d, options.values);
4433
+ const values = _chunkRUZQMYXHcjs.resolveEffectValues.call(void 0, d, options.values);
4433
4434
  const { width, height } = this.naturalSize;
4434
4435
  const pixels = await this.effectsEngine.renderLayer(d.id, values, { width, height, depth: this.bitDepth, time: options.time });
4435
4436
  const blend = _chunkV4GUQCDZcjs.parseBlend.call(void 0, options.blend);
@@ -4472,7 +4473,7 @@ var ImageEditorController = (_class7 = class {
4472
4473
  else if (k in d.controls.properties) base[k] = d.defaults[k];
4473
4474
  else throw new (0, _chunkV4GUQCDZcjs.LayerOperationError)(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
4474
4475
  }
4475
- const values = { ...base, ..._chunk3V746PF4cjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
4476
+ const values = { ...base, ..._chunkRUZQMYXHcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
4476
4477
  const time = _nullishCoalesce(_nullishCoalesce(changes.time, () => ( g.time)), () => ( 0));
4477
4478
  const { width, height } = this.naturalSize;
4478
4479
  const pixels = await this.effectsEngine.renderLayer(d.id, values, { width, height, depth: this.bitDepth, time });
@@ -8759,7 +8760,7 @@ function loadImageEditorDocument(input) {
8759
8760
  if (isV2) parsed = { ...parsed, version: 1 };
8760
8761
  const newer = isObject(parsed) && typeof parsed.version === "number" && parsed.version > IMAGE_EDITOR_STATE_VERSION;
8761
8762
  let dropped = 0;
8762
- const result = _chunkUCRL6JEVcjs.loadDocument.call(void 0,
8763
+ const result = _chunkL5OWG2NAcjs.loadDocument.call(void 0,
8763
8764
  parsed,
8764
8765
  {
8765
8766
  crop: { parse: parseCrop, defaults: null },
@@ -8829,7 +8830,7 @@ function cleanLayers(value, dropped) {
8829
8830
  }
8830
8831
  function loadLayeredDocument(doc) {
8831
8832
  const dropped = { count: 0 };
8832
- const result = _chunkUCRL6JEVcjs.loadDocument.call(void 0,
8833
+ const result = _chunkL5OWG2NAcjs.loadDocument.call(void 0,
8833
8834
  doc,
8834
8835
  {
8835
8836
  width: { parse: (v) => isNumber(v) && v > 0 ? v : (() => {
@@ -13161,13 +13162,16 @@ function createImageEditorToolProvider(controller, options = {}) {
13161
13162
  return {
13162
13163
  id: _nullishCoalesce(options.id, () => ( "image-editor")),
13163
13164
  namespace: options.namespace,
13165
+ title: "Image editor",
13166
+ description: "Layered raster image editing: layers and groups, adjustments and adjustment layers, selections and masks, retouching, painting, shapes and type, transforms, colour management, PSD import and export.",
13167
+ skill: "pixerate-image-editor",
13164
13168
  tools: [
13165
13169
  getAdjustments,
13166
13170
  listControls,
13167
13171
  setAdjustments,
13168
13172
  addLayer,
13169
13173
  renderPreview,
13170
- _chunkCZRWP6IWcjs.createCaptureTool.call(void 0, createImageCaptureSurface(controller), { subject: "the image (source orientation, before crop and rotation)", defaultPadding: 0 }),
13174
+ _chunkN2FGYZ4Qcjs.createCaptureTool.call(void 0, createImageCaptureSurface(controller), { subject: "the image (source orientation, before crop and rotation)", defaultPadding: 0 }),
13171
13175
  ...createImageSelectionTools(controller),
13172
13176
  ...createImageEditTools(controller),
13173
13177
  ...createImageLayerTools(controller),
@@ -15011,9 +15015,12 @@ function createImageEffectsToolProvider(controller, options = {}) {
15011
15015
  return { target, effect: _nullishCoalesce(effects.find((e) => e.id === instance), () => ( effects[effects.length - 1])), effects, ...extra };
15012
15016
  };
15013
15017
  const plainValues = (v) => v;
15014
- return _chunk3V746PF4cjs.createEffectToolProvider.call(void 0, {
15018
+ return _chunkRUZQMYXHcjs.createEffectToolProvider.call(void 0, {
15015
15019
  id: _nullishCoalesce(options.id, () => ( "image-effects")),
15016
15020
  namespace: options.namespace,
15021
+ title: "Image effects",
15022
+ description: "Provider effects (GPU filters and generators) on image layers as smart filters: search, describe, apply, update and remove them.",
15023
+ skill: "pixerate-image-editor",
15017
15024
  target: { noun: "layer", id: "A layer id from list_layers." },
15018
15025
  applyUses: ["filter"],
15019
15026
  applyDetails: "The effect becomes a smart filter: it runs on the layer's pixels after the smart filters below it, with its own blend and opacity, under the smart filter mask, and can be changed or removed later. A pixel, shape or type layer (or a group) is converted to a smart object first, in the same undo step (one layer keeps its id; the result says converted). Generators and overlays go on their own layer through add_effect_layer.",
@@ -369,13 +369,13 @@ import {
369
369
  } from "../chunk-3CI7FRMK.js";
370
370
  import {
371
371
  loadDocument
372
- } from "../chunk-WIYAOZZU.js";
372
+ } from "../chunk-WHKNYFM2.js";
373
373
  import {
374
374
  EffectRendererPool
375
375
  } from "../chunk-EHLOCVWB.js";
376
376
  import {
377
377
  createCaptureTool
378
- } from "../chunk-BKMU3V6K.js";
378
+ } from "../chunk-5ED73EC6.js";
379
379
  import {
380
380
  DEFAULT_GLOBAL_LIGHT,
381
381
  DIRECT_GAUSSIAN_MAX_SIGMA,
@@ -583,6 +583,7 @@ import {
583
583
  writeJpegIcc,
584
584
  writePngIcc
585
585
  } from "../chunk-AJSW5GMP.js";
586
+ import "../chunk-HF5QZS7Z.js";
586
587
  import {
587
588
  DEFAULT_AUTO_LEADING,
588
589
  DEFAULT_TEXT_STYLE,
@@ -633,7 +634,7 @@ import {
633
634
  createEffectToolProvider,
634
635
  linearToSrgb,
635
636
  resolveEffectValues
636
- } from "../chunk-KHMVB3SJ.js";
637
+ } from "../chunk-7KWJEYIK.js";
637
638
  import "../chunk-V2ZCJRDM.js";
638
639
  import {
639
640
  BrushstrokeCache,
@@ -13161,6 +13162,9 @@ function createImageEditorToolProvider(controller, options = {}) {
13161
13162
  return {
13162
13163
  id: options.id ?? "image-editor",
13163
13164
  namespace: options.namespace,
13165
+ title: "Image editor",
13166
+ description: "Layered raster image editing: layers and groups, adjustments and adjustment layers, selections and masks, retouching, painting, shapes and type, transforms, colour management, PSD import and export.",
13167
+ skill: "pixerate-image-editor",
13164
13168
  tools: [
13165
13169
  getAdjustments,
13166
13170
  listControls,
@@ -15014,6 +15018,9 @@ function createImageEffectsToolProvider(controller, options = {}) {
15014
15018
  return createEffectToolProvider({
15015
15019
  id: options.id ?? "image-effects",
15016
15020
  namespace: options.namespace,
15021
+ title: "Image effects",
15022
+ description: "Provider effects (GPU filters and generators) on image layers as smart filters: search, describe, apply, update and remove them.",
15023
+ skill: "pixerate-image-editor",
15017
15024
  target: { noun: "layer", id: "A layer id from list_layers." },
15018
15025
  applyUses: ["filter"],
15019
15026
  applyDetails: "The effect becomes a smart filter: it runs on the layer's pixels after the smart filters below it, with its own blend and opacity, under the smart filter mask, and can be changed or removed later. A pixel, shape or type layer (or a group) is converted to a smart object first, in the same undo step (one layer keeps its id; the result says converted). Generators and overlays go on their own layer through add_effect_layer.",
@@ -12,7 +12,7 @@ import { type ImageLayer } from './layers/model.cjs';
12
12
  export interface ImageEffectsToolProviderOptions {
13
13
  /** Provider id (unique per registry). Default `image-effects`. */
14
14
  id?: string;
15
- /** Always prefix tool names with `<namespace>__`. */
15
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
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);
@@ -12,7 +12,7 @@ import { type ImageLayer } from './layers/model.js';
12
12
  export interface ImageEffectsToolProviderOptions {
13
13
  /** Provider id (unique per registry). Default `image-effects`. */
14
14
  id?: string;
15
- /** Always prefix tool names with `<namespace>__`. */
15
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
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);
@@ -3,7 +3,7 @@ import type { ImageEditorController } from './controller.cjs';
3
3
  export interface ImageEditorToolProviderOptions {
4
4
  /** Provider id (unique per registry). Default `image-editor`. */
5
5
  id?: string;
6
- /** Always prefix tool names with `<namespace>__`. */
6
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
7
7
  namespace?: string;
8
8
  }
9
9
  /**
@@ -3,7 +3,7 @@ import type { ImageEditorController } from './controller.js';
3
3
  export interface ImageEditorToolProviderOptions {
4
4
  /** Provider id (unique per registry). Default `image-editor`. */
5
5
  id?: string;
6
- /** Always prefix tool names with `<namespace>__`. */
6
+ /** Tool-name prefix (`<namespace>__<name>`); defaults to the provider id, `''` for bare names. */
7
7
  namespace?: string;
8
8
  }
9
9
  /**