@pinepaper.studio/mcp-server 1.6.30 → 1.6.31

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 (61) hide show
  1. package/README.de.md +1 -1
  2. package/README.es.md +1 -1
  3. package/README.fr.md +1 -1
  4. package/README.hi.md +1 -1
  5. package/README.ja.md +1 -1
  6. package/README.ko.md +1 -1
  7. package/README.md +52 -1
  8. package/README.pt-BR.md +1 -1
  9. package/README.zh-CN.md +1 -1
  10. package/SECURITY.md +15 -0
  11. package/dist/browser/puppeteer-controller.d.ts.map +1 -1
  12. package/dist/browser/puppeteer-controller.js +41 -26
  13. package/dist/browser/puppeteer-controller.js.map +1 -1
  14. package/dist/build-info.json +2 -2
  15. package/dist/i18n/i18n-manager.d.ts.map +1 -1
  16. package/dist/i18n/i18n-manager.js +57 -3
  17. package/dist/i18n/i18n-manager.js.map +1 -1
  18. package/dist/ontology/upstream-vocabulary.d.ts +1 -1
  19. package/dist/ontology/upstream-vocabulary.js +1 -1
  20. package/dist/tools/batch-op-names.d.ts +27 -0
  21. package/dist/tools/batch-op-names.d.ts.map +1 -0
  22. package/dist/tools/batch-op-names.js +102 -0
  23. package/dist/tools/batch-op-names.js.map +1 -0
  24. package/dist/tools/definitions.d.ts.map +1 -1
  25. package/dist/tools/definitions.js +13 -12
  26. package/dist/tools/definitions.js.map +1 -1
  27. package/dist/tools/engine-lists.d.ts +5 -2
  28. package/dist/tools/engine-lists.d.ts.map +1 -1
  29. package/dist/tools/engine-lists.js +15 -2
  30. package/dist/tools/engine-lists.js.map +1 -1
  31. package/dist/tools/engine-surface.d.ts +1 -1
  32. package/dist/tools/engine-surface.d.ts.map +1 -1
  33. package/dist/tools/engine-surface.js +4 -3
  34. package/dist/tools/engine-surface.js.map +1 -1
  35. package/dist/tools/handlers.d.ts +7 -0
  36. package/dist/tools/handlers.d.ts.map +1 -1
  37. package/dist/tools/handlers.js +29 -1
  38. package/dist/tools/handlers.js.map +1 -1
  39. package/dist/tools/shape-params.d.ts +2 -2
  40. package/dist/tools/shape-params.js +2 -2
  41. package/dist/tools/stick-vocabulary.d.ts +1 -1
  42. package/dist/tools/stick-vocabulary.js +1 -1
  43. package/dist/types/code-generator.d.ts +17 -1
  44. package/dist/types/code-generator.d.ts.map +1 -1
  45. package/dist/types/code-generator.js +123 -62
  46. package/dist/types/code-generator.js.map +1 -1
  47. package/dist/types/schemas.js +1 -1
  48. package/dist/types/schemas.js.map +1 -1
  49. package/dist/utils/capabilities.d.ts.map +1 -1
  50. package/dist/utils/capabilities.js +3 -1
  51. package/dist/utils/capabilities.js.map +1 -1
  52. package/dist/utils/env.d.ts +47 -6
  53. package/dist/utils/env.d.ts.map +1 -1
  54. package/dist/utils/env.js +52 -6
  55. package/dist/utils/env.js.map +1 -1
  56. package/dist/utils/safe-fetch.d.ts +1 -0
  57. package/dist/utils/safe-fetch.d.ts.map +1 -1
  58. package/dist/utils/safe-fetch.js +3 -4
  59. package/dist/utils/safe-fetch.js.map +1 -1
  60. package/manifest.json +2 -2
  61. package/package.json +2 -2
@@ -6,6 +6,58 @@
6
6
  */
7
7
  import { DEFAULT_LOCALE, SUPPORTED_LOCALES, RTL_LOCALES, } from './types.js';
8
8
  // =============================================================================
9
+ // LOCALE MODULES
10
+ // =============================================================================
11
+ /**
12
+ * One literal import per supported locale. A locale file is loaded only from this table, so a locale name (it can
13
+ * come from PINEPAPER_LOCALE or LANG) never becomes part of a module path: an unknown name finds no entry and falls
14
+ * back to English rather than importing whatever file a crafted name points at. Literal specifiers also let a
15
+ * reader or a bundler see exactly which files can be loaded.
16
+ */
17
+ const LOCALE_MODULES = {
18
+ 'en': () => import('./locales/en.js'),
19
+ 'es': () => import('./locales/es.js'),
20
+ 'fr': () => import('./locales/fr.js'),
21
+ 'de': () => import('./locales/de.js'),
22
+ 'it': () => import('./locales/it.js'),
23
+ 'pt': () => import('./locales/pt.js'),
24
+ 'pt-BR': () => import('./locales/pt-BR.js'),
25
+ 'nl': () => import('./locales/nl.js'),
26
+ 'pl': () => import('./locales/pl.js'),
27
+ 'ru': () => import('./locales/ru.js'),
28
+ 'uk': () => import('./locales/uk.js'),
29
+ 'zh-CN': () => import('./locales/zh-CN.js'),
30
+ 'zh-TW': () => import('./locales/zh-TW.js'),
31
+ 'ja': () => import('./locales/ja.js'),
32
+ 'ko': () => import('./locales/ko.js'),
33
+ 'th': () => import('./locales/th.js'),
34
+ 'vi': () => import('./locales/vi.js'),
35
+ 'id': () => import('./locales/id.js'),
36
+ 'ms': () => import('./locales/ms.js'),
37
+ 'tl': () => import('./locales/tl.js'),
38
+ 'hi': () => import('./locales/hi.js'),
39
+ 'bn': () => import('./locales/bn.js'),
40
+ 'ta': () => import('./locales/ta.js'),
41
+ 'te': () => import('./locales/te.js'),
42
+ 'mr': () => import('./locales/mr.js'),
43
+ 'gu': () => import('./locales/gu.js'),
44
+ 'kn': () => import('./locales/kn.js'),
45
+ 'ml': () => import('./locales/ml.js'),
46
+ 'pa': () => import('./locales/pa.js'),
47
+ 'ar': () => import('./locales/ar.js'),
48
+ 'he': () => import('./locales/he.js'),
49
+ 'fa': () => import('./locales/fa.js'),
50
+ 'tr': () => import('./locales/tr.js'),
51
+ 'sv': () => import('./locales/sv.js'),
52
+ 'da': () => import('./locales/da.js'),
53
+ 'no': () => import('./locales/no.js'),
54
+ 'fi': () => import('./locales/fi.js'),
55
+ 'cs': () => import('./locales/cs.js'),
56
+ 'el': () => import('./locales/el.js'),
57
+ 'hu': () => import('./locales/hu.js'),
58
+ 'ro': () => import('./locales/ro.js'),
59
+ };
60
+ // =============================================================================
9
61
  // I18N MANAGER
10
62
  // =============================================================================
11
63
  export class I18nManager {
@@ -25,9 +77,11 @@ export class I18nManager {
25
77
  return;
26
78
  }
27
79
  try {
28
- // Dynamic import of locale file
29
- const module = await import(`./locales/${locale}.js`);
30
- this.translations.set(locale, module.default || module[locale]);
80
+ const load = Object.prototype.hasOwnProperty.call(LOCALE_MODULES, locale) ? LOCALE_MODULES[locale] : undefined;
81
+ if (!load)
82
+ throw new Error(`not a supported locale`);
83
+ const module = await load();
84
+ this.translations.set(locale, (module.default || module[locale]));
31
85
  this.loadedLocales.add(locale);
32
86
  }
33
87
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-manager.js","sourceRoot":"","sources":["../../src/i18n/i18n-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"i18n-manager.js","sourceRoot":"","sources":["../../src/i18n/i18n-manager.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * FxTool's ITEM_TYPE_MAP and type classes (anchor, description, parentType,
5
5
  * mcpTool, mcpAction), read from the loaded module.
6
6
  *
7
- * Source: FxTool origin/main 11cd6959010ba1934e930644b05b936d8cac6170
7
+ * Source: FxTool origin/main dfbfc262ab9f8d8a6886da7614d23b7e23c59989
8
8
  * js/ontology/Vocabulary.js
9
9
  * sha256: da20dfd493e60485
10
10
  *
@@ -4,7 +4,7 @@
4
4
  * FxTool's ITEM_TYPE_MAP and type classes (anchor, description, parentType,
5
5
  * mcpTool, mcpAction), read from the loaded module.
6
6
  *
7
- * Source: FxTool origin/main 11cd6959010ba1934e930644b05b936d8cac6170
7
+ * Source: FxTool origin/main dfbfc262ab9f8d8a6886da7614d23b7e23c59989
8
8
  * js/ontology/Vocabulary.js
9
9
  * sha256: da20dfd493e60485
10
10
  *
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A batch op takes the names its standalone tool takes.
3
+ *
4
+ * Each op type grew its own prefixed names (relationOptions, effectParams, generatorParams, maskPreset …) while the
5
+ * standalone tools say params / options / preset / region, and pinepaper_animate takes intensity / speed / delay at
6
+ * its top level. An agent that learned one tool wrote the other's names, and the value was dropped: reported as an
7
+ * ignored argument at best, and in silence where the name happened to belong to another op type (`speed` on an
8
+ * animate op, `preset` on a mask op). Measured live before this change:
9
+ * animate animationOptions { intensity, speed, delay } → none applied, nothing reported
10
+ * relation params { radius } → not applied (reported)
11
+ * apply_mask preset 'iris' → not applied, nothing reported
12
+ *
13
+ * So the batch translates them before anything runs, and the reply lists each translation. The batch's own name
14
+ * wins when both are given: the other one is left in place, where the ignored-argument check reports it.
15
+ */
16
+ /** Op-level renames: the standalone tool's name → the batch op's name. */
17
+ export declare const BATCH_OP_RENAMES: Readonly<Record<string, Readonly<Record<string, string>>>>;
18
+ /** pinepaper_animate's names → the engine's, which the batch hands to app.animate as they are. */
19
+ export declare const ANIMATION_OPTION_NAMES: Readonly<Record<string, string>>;
20
+ export declare function normalizeBatchOperationNames(args: Record<string, unknown>): {
21
+ args: Record<string, unknown>;
22
+ renamed: string[];
23
+ };
24
+ export declare const RENAMED_ARGUMENTS_META_KEY = "pinepaper.studio/renamedArguments";
25
+ /** The reply's line for what was translated, so a name that changed never changes in silence. */
26
+ export declare function renamedArgumentsNote(renamed: string[]): string;
27
+ //# sourceMappingURL=batch-op-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-op-names.d.ts","sourceRoot":"","sources":["../../src/tools/batch-op-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAKtF,CAAC;AAEH,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlE,CAAC;AAaH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmDhI;AAED,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAE9E,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAG9D"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * A batch op takes the names its standalone tool takes.
3
+ *
4
+ * Each op type grew its own prefixed names (relationOptions, effectParams, generatorParams, maskPreset …) while the
5
+ * standalone tools say params / options / preset / region, and pinepaper_animate takes intensity / speed / delay at
6
+ * its top level. An agent that learned one tool wrote the other's names, and the value was dropped: reported as an
7
+ * ignored argument at best, and in silence where the name happened to belong to another op type (`speed` on an
8
+ * animate op, `preset` on a mask op). Measured live before this change:
9
+ * animate animationOptions { intensity, speed, delay } → none applied, nothing reported
10
+ * relation params { radius } → not applied (reported)
11
+ * apply_mask preset 'iris' → not applied, nothing reported
12
+ *
13
+ * So the batch translates them before anything runs, and the reply lists each translation. The batch's own name
14
+ * wins when both are given: the other one is left in place, where the ignored-argument check reports it.
15
+ */
16
+ /** Op-level renames: the standalone tool's name → the batch op's name. */
17
+ export const BATCH_OP_RENAMES = Object.freeze({
18
+ relation: Object.freeze({ params: 'relationOptions' }),
19
+ apply_effect: Object.freeze({ params: 'effectParams' }),
20
+ apply_mask: Object.freeze({ preset: 'maskPreset', options: 'maskOptions' }),
21
+ execute_generator: Object.freeze({ params: 'generatorParams', region: 'generatorRegion' }),
22
+ });
23
+ /** pinepaper_animate's names → the engine's, which the batch hands to app.animate as they are. */
24
+ export const ANIMATION_OPTION_NAMES = Object.freeze({
25
+ speed: 'animationSpeed',
26
+ intensity: 'animationIntensity',
27
+ delay: 'animationDelay',
28
+ waveform: 'animationWaveform',
29
+ origin: 'animationOrigin',
30
+ });
31
+ /**
32
+ * Not folded into a modify op's properties: what the op reads at its top level, and pinepaper_modify_item's other
33
+ * arguments, which the batch op does not support (folded, they would become property writes; left, the
34
+ * ignored-argument check names them). Any other key is a change to the item, as on create.
35
+ */
36
+ const MODIFY_NOT_PROPERTIES = new Set(['type', 'itemId', 'properties', 'position', '_step', 'id',
37
+ 'data', 'atTime', 'easing', 'screenSpace', 'stepTiming', 'counter']);
38
+ const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
39
+ export function normalizeBatchOperationNames(args) {
40
+ if (!Array.isArray(args.operations))
41
+ return { args, renamed: [] };
42
+ const renamed = [];
43
+ const operations = args.operations.map((raw, i) => {
44
+ if (!isObj(raw))
45
+ return raw;
46
+ const op = { ...raw };
47
+ const type = typeof op.type === 'string' ? op.type : 'create';
48
+ const at = `operations[${i}]`;
49
+ const move = (from, to) => {
50
+ if (op[from] === undefined || op[to] !== undefined)
51
+ return;
52
+ op[to] = op[from];
53
+ delete op[from];
54
+ renamed.push(`${at}.${from} → ${to}`);
55
+ };
56
+ for (const [from, to] of Object.entries(BATCH_OP_RENAMES[type] ?? {}))
57
+ move(from, to);
58
+ if (type === 'animate') {
59
+ const opts = isObj(op.animationOptions) ? { ...op.animationOptions } : {};
60
+ let changed = false;
61
+ for (const [short, long] of Object.entries(ANIMATION_OPTION_NAMES)) {
62
+ if (opts[short] !== undefined && opts[long] === undefined) {
63
+ opts[long] = opts[short];
64
+ delete opts[short];
65
+ renamed.push(`${at}.animationOptions.${short} → animationOptions.${long}`);
66
+ changed = true;
67
+ }
68
+ if (op[short] !== undefined && opts[long] === undefined) {
69
+ opts[long] = op[short];
70
+ delete op[short];
71
+ renamed.push(`${at}.${short} → animationOptions.${long}`);
72
+ changed = true;
73
+ }
74
+ }
75
+ if (changed)
76
+ op.animationOptions = opts;
77
+ }
78
+ if (type === 'modify') {
79
+ const props = isObj(op.properties) ? { ...op.properties } : {};
80
+ let changed = false;
81
+ for (const k of Object.keys(op)) {
82
+ if (MODIFY_NOT_PROPERTIES.has(k) || op[k] === undefined || props[k] !== undefined)
83
+ continue;
84
+ props[k] = op[k];
85
+ delete op[k];
86
+ renamed.push(`${at}.${k} → properties.${k}`);
87
+ changed = true;
88
+ }
89
+ if (changed)
90
+ op.properties = props;
91
+ }
92
+ return op;
93
+ });
94
+ return renamed.length ? { args: { ...args, operations }, renamed } : { args, renamed };
95
+ }
96
+ export const RENAMED_ARGUMENTS_META_KEY = 'pinepaper.studio/renamedArguments';
97
+ /** The reply's line for what was translated, so a name that changed never changes in silence. */
98
+ export function renamedArgumentsNote(renamed) {
99
+ const shown = renamed.slice(0, 20);
100
+ return `Read under the batch op's own names: ${shown.join(', ')}${renamed.length > shown.length ? ` (and ${renamed.length - shown.length} more)` : ''}.`;
101
+ }
102
+ //# sourceMappingURL=batch-op-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-op-names.js","sourceRoot":"","sources":["../../src/tools/batch-op-names.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqE/C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAYnE;AAED,0EAA0E;AAC1E,eAAO,MAAM,eAAe,QAAmB,CAAC;AAEhD,yGAAyG;AACzG,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAAmG,CAAC;AAE5I,eAAO,MAAM,cAAc,QA8K+G,CAAC;AAW3I,eAAO,MAAM,eAAe,EAAE,IAAI,EAylTjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,CAO3D;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,CAQrE"}
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqE/C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAYnE;AAED,0EAA0E;AAC1E,eAAO,MAAM,eAAe,QAAmB,CAAC;AAEhD,yGAAyG;AACzG,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAAmG,CAAC;AAE5I,eAAO,MAAM,cAAc,QA8K+G,CAAC;AAW3I,eAAO,MAAM,eAAe,EAAE,IAAI,EA0lTjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,CAO3D;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,CAQrE"}
@@ -3474,13 +3474,14 @@ EXAMPLE: { itemId: 'item_7', color: '#00b140', threshold: 60, smoothing: 12 }`,
3474
3474
  "tem.data, so the text can quote live state (\"Score: {score}\") instead of a literal fixed when you authored it.\n · on_event_increment (params: property, by) / on_event_toggle — counters and flip-flops.\n · on_event_fire_after (params: delay, timeline) — chain one beat to the next.\n · on_event_fire_if (params: predicate, event, else?) — the only reaction that TESTS graph state rather than mutating it. When the source fires it evaluates params.predicate and pulses the EVENT params.event if it holds (params.else if not); its target is not fired, so the visible change comes from a reaction on that second event. params.predicate is an ExpressionIR object, not a string: { op:'const', value" +
3475
3475
  " } · { op:'cmp', cmp: eq|neq|gt|gte|lt|lte, a, b } · { op:'logic', logic: and|or|not, args:[…] } · { op:'graph', read: data|active|visible, item, property } (data reads item.data[property]). A string predicate, or no event, is refused.\n · on_event_add_relation / on_event_remove_relation — the scene rewires itself.\n · on_event_play_sound (source = the EVENT, target null; params: sound, gain?, note?) — play a sound when the event fires: a catalogue name (effect, drum or instrument; aliases accepted) or a define_sfx spec; gain is a multiplier capped at full scale; note is for instruments (default C5). An unknown sound is refused with the catalogue. Wire a click sound as on_click_fire (but" +
3476
3476
  "ton → event) + on_event_play_sound (event → null). For a sound at a TIME, pinepaper_event create { at: seconds | [seconds] } fires the event on the timeline (and in video exports); a scene chain's cutSound puts one on every cut. LIMITS: the exported widget player does not run timed triggers, and a browser may block sound until the viewer's first click or key.\n · on_event_store_set / on_event_store_increment / restores_from — persistent state. The target is a store node whose id is the storage SCOPE, so two stores in a scene and two widgets on a page do not collide. restores_from is the read half and fires ONCE at load.\n- Proximity (pointer over an item): on_enter_* / on_exit_* mirror th" +
3477
- "e on_event_* reactions above (set_color, set_property, set_property_from_template, set_visibility, set_data, increment, toggle) — hover states without a single line of script.\n- Exclusive state: exclusive_group makes at most one member active (on_event_set_active is how you activate one — tabs, steppers, quiz cards; on_event_step_active moves the active member by relationOptions.delta, default +1, for next / previous arrows, and wraps unless wrap: false. Its groupName names the exclusive_group, default '_default'; items gives the step order). menubar_group is the same grouping WITHOUT the mutex.\n\nThere are 80 relation types and this list names the families rather than every member. For " +
3478
- "the live catalogue — what exists in THIS build, with definitions — call pinepaper_query_capabilities { kind: 'relation' }, which reads the engine's registry rather than a list written down here.\n\nRELATION COMPATIBILITY:\n- Universal relations (position-based) work with ALL item types including imported SVGs/images:\n orbits, follows, attached_to, maintains_distance, points_at, mirrors, parallax, bounds_to\n- morphs_to has type-specific behavior:\n Path→Path: point interpolation\n Circle→Circle: radius interpolation\n Text→Text: font blend\n Cross-type: particle denoising transition\n- group_morphs_to: pair-by-index morph between two paper.Groups (any two — graph vertices+edges, lett" +
3479
- "er collages, dashboard clusters). Path.Line children deform via endpoints; other children translate; excess children fade. Params: duration, hold, loop, easing (linear|easeIn|easeOut|easeInOut), deformLines.\n- moves_along_path: self-relation (targetId=null); item is driven along a path. Source the path EITHER from params.path (array of {x,y} or [x,y]) OR from params.equation (S10 B5) — a math curve the item TRAVERSES, sampled deterministically on the Expression IR: params.equation = { kind: function|parametric|fourier|preset, expr | xExpr/yExpr | harmonics | preset, min, max, samples, scale, cx, cy, flipY, warp } (same equation contract as pinepaper_equation_path, but origin is cx/cy, def" +
3480
- "ault 0). y is MATH-UP by default (flipY: true): on screen the curve is mirrored about cy, so a curve written in screen coordinates (y down) needs flipY: false. Params: path OR equation, speed, closed, phase, easing (linear|easeIn|easeOut|easeInOut|sine|bounce|pingpong).\n\nGEOMETRIC CONSTRUCTION CONSTRAINTS (Layer 2) — the source item is RE-DERIVED every frame from its anchor item(s), so dragging an anchor updates the dependent live (GeoGebra-style), and the construction persists as relation graph data (edit it by editing relations, not by re-running code). Anchor A is the relation target; extra anchors ride in params:\n- is_midpoint_of: source = midpoint(target, params.other). params.othe" +
3481
- "r = id of the second endpoint (B).\n- lies_on_line: source held on the line target→params.other at fraction params.t (0=A, 1=B; default 0.5). params.other (B), params.t.\n- is_centroid_of: source = centroid(target, ...params.others). params.others = array of the remaining point ids.\n- is_circumcenter_of: source = circumcenter(target, params.other1, params.other2); holds position when the three anchors are collinear. params.other1 (B), params.other2 (C).\n- concentric_with: source stays centered on the target (shared center).\n- construction_reveal: self-relation (targetId=null); opacity 0→1 starting at params.revealAt (timeline seconds) over params.fadeIn seconds — loop- and scrub-correct" +
3482
- ". Pair with pinepaper_construction_sequence to reveal a figure one step at a time.\n\nPROCEDURAL / DETERMINISTIC BINDING (Expression IR — S10 G1) — bind a property to another property or to a math function of time. Pass params.signal:true to route through the pure, seed/frame-deterministic signal interpreter (replay-stable — same time → identical output); omit it for the per-frame compute fallback.\n- driven_by: source's sourceProperty = target's targetProperty * multiplier + offset (optionally clamped). sourceProperty ∈ x|y|rotation|opacity|scale|strokeWidth|fillColor|strokeColor; targetProperty ∈ x|y|rotation|opacity|scale. For fillColor/strokeColor the (clamped 0..1) driven value interp" +
3483
- "olates colorFrom→colorTo — so a relation drives COLOR. NEEDS a target (the property source). params: sourceProperty, targetProperty, multiplier, offset, clamp {min,max}, colorFrom, colorTo, signal. e.g. tint a dot by a planet's x: sourceProperty 'fillColor', targetProperty 'x', colorFrom '#0055ff', colorTo '#ff3300', signal true.\n- time_expression: self-relation (targetId=null); the source's params.property (x, y, rotation, opacity or scale) is driven by a formula of t (scene time) and v (params.baseValue). params: property (default 'y'), expression (e.g. 'sin(t*2)*50 + v'), baseValue, signal (true also evaluates it as a pure f(t) via the Expression IR). The formula grammar: " +
3477
+ "e on_event_* reactions above (set_color, set_property, set_property_from_template, set_visibility, set_data, increment, toggle) — hover states without a single line of script.\n- Exclusive state: exclusive_group makes at most one member active — tabs, steppers, quiz cards. MEMBERSHIP is pairwise: bind exclusive_group from one member to each other member with the same relationOptions.groupName (default '_default'); nothing else adds an item to the group. Being active has NO LOOK OF ITS OWN: give each member on_enter_set_property / on_exit_set_property (say opacity 1 / 0.3), with the member as both source and target, and those reactions draw the change, in exports too. on_event_set_active ac" +
3478
+ "tivates its target. on_event_step_active moves the active member by relationOptions.delta (default +1) for next / previous arrows, wrapping unless wrap: false; a current studio runs it with no target, an older one needs a targetId (any item, e.g. one member) and is refused without one, and its relationOptions.items only sets the step order of items already in the group. menubar_group is the same grouping WITHOUT the mutex.\n\nThere are 80 relation types and this list names the families rather than every member. For the live catalogue — what exists in THIS build, with definitions — call pinepaper_query_capabilities { kind: 'relation' }, which reads the engine's registry rather than a list w" +
3479
+ "ritten down here.\n\nRELATION COMPATIBILITY:\n- Universal relations (position-based) work with ALL item types including imported SVGs/images:\n orbits, follows, attached_to, maintains_distance, points_at, mirrors, parallax, bounds_to\n- morphs_to has type-specific behavior:\n Path→Path: point interpolation\n Circle→Circle: radius interpolation\n Text→Text: font blend\n Cross-type: particle denoising transition\n- group_morphs_to: pair-by-index morph between two paper.Groups (any two — graph vertices+edges, letter collages, dashboard clusters). Path.Line children deform via endpoints; other children translate; excess children fade. Params: duration, hold, loop, easing (linear|easeIn|ea" +
3480
+ "seOut|easeInOut), deformLines.\n- moves_along_path: self-relation (targetId=null); item is driven along a path. Source the path EITHER from params.path (array of {x,y} or [x,y]) OR from params.equation (S10 B5) — a math curve the item TRAVERSES, sampled deterministically on the Expression IR: params.equation = { kind: function|parametric|fourier|preset, expr | xExpr/yExpr | harmonics | preset, min, max, samples, scale, cx, cy, flipY, warp } (same equation contract as pinepaper_equation_path, but origin is cx/cy, default 0). y is MATH-UP by default (flipY: true): on screen the curve is mirrored about cy, so a curve written in screen coordinates (y down) needs flipY: false. Params: path OR e" +
3481
+ "quation, speed, closed, phase, easing (linear|easeIn|easeOut|easeInOut|sine|bounce|pingpong).\n\nGEOMETRIC CONSTRUCTION CONSTRAINTS (Layer 2) — the source item is RE-DERIVED every frame from its anchor item(s), so dragging an anchor updates the dependent live (GeoGebra-style), and the construction persists as relation graph data (edit it by editing relations, not by re-running code). Anchor A is the relation target; extra anchors ride in params:\n- is_midpoint_of: source = midpoint(target, params.other). params.other = id of the second endpoint (B).\n- lies_on_line: source held on the line target→params.other at fraction params.t (0=A, 1=B; default 0.5). params.other (B), params.t.\n- is_c" +
3482
+ "entroid_of: source = centroid(target, ...params.others). params.others = array of the remaining point ids.\n- is_circumcenter_of: source = circumcenter(target, params.other1, params.other2); holds position when the three anchors are collinear. params.other1 (B), params.other2 (C).\n- concentric_with: source stays centered on the target (shared center).\n- construction_reveal: self-relation (targetId=null); opacity 0→1 starting at params.revealAt (timeline seconds) over params.fadeIn seconds — loop- and scrub-correct. Pair with pinepaper_construction_sequence to reveal a figure one step at a time.\n\nPROCEDURAL / DETERMINISTIC BINDING (Expression IR — S10 G1) — bind a property to another pr" +
3483
+ "operty or to a math function of time. Pass params.signal:true to route through the pure, seed/frame-deterministic signal interpreter (replay-stable — same time → identical output); omit it for the per-frame compute fallback.\n- driven_by: source's sourceProperty = target's targetProperty * multiplier + offset (optionally clamped). sourceProperty ∈ x|y|rotation|opacity|scale|strokeWidth|fillColor|strokeColor; targetProperty ∈ x|y|rotation|opacity|scale. For fillColor/strokeColor the (clamped 0..1) driven value interpolates colorFrom→colorTo — so a relation drives COLOR. NEEDS a target (the property source). params: sourceProperty, targetProperty, multiplier, offset, clamp {min,max}, colorFr" +
3484
+ "om, colorTo, signal. e.g. tint a dot by a planet's x: sourceProperty 'fillColor', targetProperty 'x', colorFrom '#0055ff', colorTo '#ff3300', signal true.\n- time_expression: self-relation (targetId=null); the source's params.property (x, y, rotation, opacity or scale) is driven by a formula of t (scene time) and v (params.baseValue). params: property (default 'y'), expression (e.g. 'sin(t*2)*50 + v'), baseValue, signal (true also evaluates it as a pure f(t) via the Expression IR). The formula grammar: " +
3484
3485
  String(expressionGrammarText()) +
3485
3486
  ". A name outside it, or a wrong argument count, is refused by name: it would parse to nothing and the item would not move.\n\nEVENT-DRIVEN SCENE CHAINS (S11) — build a LONG scene as a graph of timed events, not a keyframe track. First make events with pinepaper_event (action:'create' → eventId). The relations below have an EVENT as their sourceId; firing the event runs the reaction. Chain beats over animation time with on_event_fire_after (timeline:'canvas'), have beats mutate the scene with on_event_add_relation, then kick it off with pinepaper_event action:'pulse'. Because canvas-timed fires are on the animation clock, the whole chain is scrub-, loop-, and replay-stable.\n- on_event_fire" +
3486
3487
  "_after: sourceId=event, targetId=the NEXT event. When source fires, pulse target after params.delay ms. params.timeline: 'canvas' (animation clock — use for scene chains) | 'wall' (real setTimeout). This is the chaining primitive.\n- on_event_fire_if: sourceId=event, targetId=any item (it is not fired). params.event = the event to pulse when params.predicate holds, params.else = the one when it does not. A branch is two relations: A —on_event_fire_if { predicate, event: B }→ any item; B —on_event_set_color→ lamp. Example predicate, \"score is at least 3\": { op:'cmp', cmp:'gte', a:{ op:'graph', read:'data', item:'item_3', property:'score' }, b:{ op:'const', value:3 } }.\n- on_event_add_rel" +
@@ -3574,7 +3575,6 @@ String(expressionGrammarText()) +
3574
3575
 
3575
3576
 
3576
3577
 
3577
-
3578
3578
 
3579
3579
 
3580
3580
  ),
@@ -8742,10 +8742,10 @@ EXAMPLES:
8742
8742
  "S may fail).\n\nONTOLOGY PREFLIGHT: Before code generation, this tool validates itemType, relationType, effectType, and generatorName against the canonical PinePaper vocabulary. A typo (e.g. \"circel\") returns a structured VALIDATION_ERROR with the operation index, the offending field, the canonical valid list, and a suggested fix — fix and retry rather than guessing. Pass skipValidation: true to bypass when intentionally using experimental vocabulary.\n\nWORKFLOW:\n1. pinepaper_agent_start_job → 2. the craft tools that fit the brief (styled_scene, story, character, text_style, compose…) → 3. pinepaper_agent_batch_execute (the primitive glue, in one call) → 4. pinepaper_agent_end_job (scr" +
8743
8743
  "eenshot for validation)\nAfter validation: user reviews screenshot → feedback → modify/recreate as needed.\n\nOPERATION TYPES (" +
8744
8744
  String(AgentBatchOperationTypeSchema.options.length) +
8745
- ") — use in this order:\n\nCANVAS SETUP:\n set_canvas_size — {width, height} or {preset: \"instagram-post\"|\"instagram-story\"|\"youtube-thumbnail\"|\"tiktok\"|\"full-hd-1080p\"|...} (studio preset keys, not platform names; an unknown one is refused with the list)\n set_background — {backgroundColor: \"#hex\"}\n execute_generator — {generatorName, generatorParams} → fills canvas with procedural art (paints WITHOUT fully registering items — see get_items; custom generator names need skipValidation:true)\n Generators: drawBokeh, drawGradientMesh, drawWaves, drawSunburst, drawSunsetScene, drawGrid, drawCircuit, drawPattern, drawStackedCircles, drawGeometricAbstract, drawWindField, drawF" +
8746
- "luidFlow, drawOrganicFlow, drawNoiseTexture, drawGlobeWireframe\n PineMath: drawFunctionPlot (y=f(x) plots), drawParametricCurve (x(t),y(t)), drawSimulation (pendulum, Lorenz, spring-mass), drawSpectrumAnalyzer (FFT), draw3DSurface (torus, sphere, Klein bottle)\n\nITEMS:\n create — {itemType, position: {x,y} or [x,y], properties}\n itemType: text, circle, rectangle, star, triangle, polygon, ellipse, path, line, arc, pentagon, hexagon, diamond, arrow, heart\n Properties per type:\n text: {content, fontSize, fontFamily, color, fontWeight}\n circle: {radius, color, strokeColor, strokeWidth}\n rectangle: {width, height, color, cornerRadius}\n star: {radius1, radiu" +
8747
- "s2, points, color}\n ellipse: {radiusX, radiusY, color}\n triangle/polygon: {width/sides, height/radius, color}\n All: opacity, shadowColor, shadowBlur, blendMode, strokeColor, strokeWidth\n modify — {itemId, properties} — instant reposition/restyle. To MOVE an item, set {x,y} here (a one-shot position change, not an animation).\n delete — {itemId}\n group — {itemIds: [\"$0\",\"$1\",...], groupName} — combine the parts of a composite object into ONE draggable/animatable entity. ALWAYS group a specific named object (car, robot, house, character) after creating its parts. Returns {groupId}, and the group takes the next \"$N\" like a create; safe — user can ungroup. Do NOT gro" +
8748
- "up a whole scene whose pieces move independently.\n\nANIMATION:\n animate — Loop animation: {itemId, animationType, animationOptions}\n animationType: " +
8745
+ ") — use in this order:\nEach op also takes its standalone tool's names: params (relation, apply_effect, execute_generator), preset / options (apply_mask), region (execute_generator), intensity / speed / delay / waveform / origin (animate, at the top or in animationOptions), and a modify op's changes flat beside itemId. The reply lists what it translated.\n\nCANVAS SETUP:\n set_canvas_size — {width, height} or {preset: \"instagram-post\"|\"instagram-story\"|\"youtube-thumbnail\"|\"tiktok\"|\"full-hd-1080p\"|...} (studio preset keys, not platform names; an unknown one is refused with the list)\n set_background — {backgroundColor: \"#hex\"}\n execute_generator — {generatorName, generatorPa" +
8746
+ "rams} → fills canvas with procedural art (paints WITHOUT fully registering items — see get_items; custom generator names need skipValidation:true)\n Generators: drawBokeh, drawGradientMesh, drawWaves, drawSunburst, drawSunsetScene, drawGrid, drawCircuit, drawPattern, drawStackedCircles, drawGeometricAbstract, drawWindField, drawFluidFlow, drawOrganicFlow, drawNoiseTexture, drawGlobeWireframe\n PineMath: drawFunctionPlot (y=f(x) plots), drawParametricCurve (x(t),y(t)), drawSimulation (pendulum, Lorenz, spring-mass), drawSpectrumAnalyzer (FFT), draw3DSurface (torus, sphere, Klein bottle)\n\nITEMS:\n create — {itemType, position: {x,y} or [x,y], properties}\n itemType: text, circle," +
8747
+ " rectangle, star, triangle, polygon, ellipse, path, line, arc, pentagon, hexagon, diamond, arrow, heart\n Properties per type:\n text: {content, fontSize, fontFamily, color, fontWeight}\n circle: {radius, color, strokeColor, strokeWidth}\n rectangle: {width, height, color, cornerRadius}\n star: {radius1, radius2, points, color}\n ellipse: {radiusX, radiusY, color}\n triangle/polygon: {width/sides, height/radius, color}\n All: opacity, shadowColor, shadowBlur, blendMode, strokeColor, strokeWidth\n modify — {itemId, properties} — instant reposition/restyle. To MOVE an item, set {x,y} here (a one-shot position change, not an animation).\n delete — {itemId" +
8748
+ "}\n group — {itemIds: [\"$0\",\"$1\",...], groupName} — combine the parts of a composite object into ONE draggable/animatable entity. ALWAYS group a specific named object (car, robot, house, character) after creating its parts. Returns {groupId}, and the group takes the next \"$N\" like a create; safe — user can ungroup. Do NOT group a whole scene whose pieces move independently.\n\nANIMATION:\n animate — Loop animation: {itemId, animationType, animationOptions}\n animationType: " +
8749
8749
  String(SIMPLE_ANIMATION_TYPES_LIST) +
8750
8750
  "\n keyframe_animate — Timed animation: {itemId, keyframes: [{time, properties, easing}], duration, loop, append}. Replaces the item's track unless append: true (or mode: 'merge', the studio's spelling); two ops on one item in a batch are merged into one.\n Animatable properties: opacity, scale, scaleX, scaleY, x, y, rotation, fillColor, strokeColor, strokeWidth, width, height, radius, fontSize, trimStart/trimEnd/trimOffset (path draw-on)\n Easing (on the keyframe being moved TO): " +
8751
8751
  String(KEYFRAME_EASINGS_LIST) +
@@ -8816,6 +8816,7 @@ String(EFFECT_TYPES_LIST) +
8816
8816
 
8817
8817
 
8818
8818
 
8819
+
8819
8820
 
8820
8821
 
8821
8822
  ),