@cyanheads/pixoo-mcp-server 1.1.4 → 1.2.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 (59) hide show
  1. package/AGENTS.md +11 -7
  2. package/CLAUDE.md +11 -7
  3. package/Dockerfile +30 -10
  4. package/README.md +61 -85
  5. package/changelog/1.2.x/1.2.0.md +28 -0
  6. package/changelog/1.2.x/1.2.1.md +35 -0
  7. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.d.ts.map +1 -1
  8. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.js +1 -0
  9. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.d.ts +77 -11
  11. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.js +69 -59
  13. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.d.ts +3 -3
  15. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.js +57 -45
  17. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.d.ts +1 -0
  19. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.js +121 -32
  21. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/pixoo-overlay-text.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/pixoo-overlay-text.tool.js +17 -3
  24. package/dist/mcp-server/tools/definitions/pixoo-overlay-text.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.js +9 -8
  27. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/device-push.d.ts +24 -0
  29. package/dist/mcp-server/tools/device-push.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/device-push.js +50 -0
  31. package/dist/mcp-server/tools/device-push.js.map +1 -0
  32. package/dist/renderer/icons.d.ts +14 -4
  33. package/dist/renderer/icons.d.ts.map +1 -1
  34. package/dist/renderer/icons.js +30 -22
  35. package/dist/renderer/icons.js.map +1 -1
  36. package/dist/renderer/keyframes.d.ts +35 -3
  37. package/dist/renderer/keyframes.d.ts.map +1 -1
  38. package/dist/renderer/keyframes.js +85 -52
  39. package/dist/renderer/keyframes.js.map +1 -1
  40. package/dist/renderer/preview.d.ts +17 -19
  41. package/dist/renderer/preview.d.ts.map +1 -1
  42. package/dist/renderer/preview.js +55 -34
  43. package/dist/renderer/preview.js.map +1 -1
  44. package/dist/renderer/remote-image.d.ts +10 -2
  45. package/dist/renderer/remote-image.d.ts.map +1 -1
  46. package/dist/renderer/remote-image.js +13 -1
  47. package/dist/renderer/remote-image.js.map +1 -1
  48. package/dist/renderer/scene-renderer.d.ts +14 -9
  49. package/dist/renderer/scene-renderer.d.ts.map +1 -1
  50. package/dist/renderer/scene-renderer.js +166 -137
  51. package/dist/renderer/scene-renderer.js.map +1 -1
  52. package/dist/renderer/text-engine.d.ts +14 -1
  53. package/dist/renderer/text-engine.d.ts.map +1 -1
  54. package/dist/renderer/text-engine.js +22 -4
  55. package/dist/renderer/text-engine.js.map +1 -1
  56. package/dist/services/pixoo/pixoo-service.js +1 -1
  57. package/dist/services/pixoo/pixoo-service.js.map +1 -1
  58. package/package.json +6 -5
  59. package/server.json +3 -3
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Keyframe interpolation and effect compiler for animation presets.
3
3
  * @module renderer/keyframes
4
4
  */
5
- import { lerpColor, resolveColor } from '@cyanheads/pixoo-toolkit';
5
+ import { lerpColor, resolveColor, rgbToHex } from '@cyanheads/pixoo-toolkit';
6
6
  export const EFFECT_NAMES = [
7
7
  'float',
8
8
  'scroll-left',
@@ -14,7 +14,14 @@ export const EFFECT_NAMES = [
14
14
  'fade-in',
15
15
  'fade-out',
16
16
  ];
17
- /** Compile a named effect preset into a keyframe map. */
17
+ /**
18
+ * Compile a named effect preset into a keyframe map.
19
+ *
20
+ * `amplitude` is pixels of movement for `float`, `scroll-left`/`scroll-right` (speed), and
21
+ * `drift`, default 2. For `pulse` and `twinkle` it is the depth of the opacity dip below 100,
22
+ * on a 0–1 scale: default 0.5 for `pulse` (a 50–100 ramp) and 0.6 for `twinkle` (40–100).
23
+ * `blink`, `fade-in`, and `fade-out` ignore it.
24
+ */
18
25
  export function compileEffect(name, opts, totalFrames) {
19
26
  const amp = opts.amplitude ?? 2;
20
27
  const period = opts.period ?? totalFrames;
@@ -45,12 +52,12 @@ export function compileEffect(name, opts, totalFrames) {
45
52
  return { dx: frames };
46
53
  }
47
54
  case 'pulse': {
55
+ const depth = (opts.amplitude ?? 0.5) * 100;
48
56
  const frames = [];
49
57
  for (let i = 0; i < totalFrames; i++) {
50
58
  const t = (i / period + phase) * 2 * Math.PI;
51
59
  const brightness = 0.5 + 0.5 * Math.sin(t);
52
- // Encode brightness as opacity 50–100
53
- frames.push([i, Math.round(50 + 50 * brightness)]);
60
+ frames.push([i, Math.round(100 - depth + depth * brightness)]);
54
61
  }
55
62
  return { opacity: frames };
56
63
  }
@@ -63,10 +70,12 @@ export function compileEffect(name, opts, totalFrames) {
63
70
  return { visible: frames };
64
71
  }
65
72
  case 'twinkle': {
73
+ const depth = (opts.amplitude ?? 0.6) * 100;
66
74
  const frames = [];
67
75
  for (let i = 0; i < totalFrames; i++) {
68
76
  const t = (i / period + phase) * 2 * Math.PI;
69
- frames.push([i, Math.round(40 + 60 * (0.5 + 0.5 * Math.sin(t + Math.random() * 0.3)))]);
77
+ const brightness = 0.5 + 0.5 * Math.sin(t + Math.random() * 0.3);
78
+ frames.push([i, Math.round(100 - depth + depth * brightness)]);
70
79
  }
71
80
  return { opacity: frames };
72
81
  }
@@ -97,59 +106,83 @@ export function compileEffect(name, opts, totalFrames) {
97
106
  return {};
98
107
  }
99
108
  }
100
- /** Interpolate a keyframe property at a given frame index. */
101
- export function interpolateKeyframe(frames, frameIdx) {
102
- if (frames.length === 0)
103
- return 0;
109
+ /**
110
+ * The keyframes around `frameIdx` and how far between them it falls: `t` runs from 0 on
111
+ * `from`'s frame to 1 on `to`'s. Before the first keyframe or past the last, that keyframe's
112
+ * value is held: `from` and `to` are both it and `t` is 0. `undefined` for an empty track.
113
+ */
114
+ function keyframeSpan(frames, frameIdx) {
104
115
  const first = frames[0];
105
- const last = frames[frames.length - 1];
116
+ const last = frames.at(-1);
106
117
  if (!first || !last)
107
- return 0;
118
+ return;
108
119
  if (frameIdx <= first[0])
109
- return first[1];
110
- if (frameIdx >= last[0])
111
- return last[1];
112
- // Find surrounding keyframes
113
- let lo = 0;
114
- let hi = frames.length - 1;
115
- for (let i = 0; i < frames.length - 1; i++) {
116
- const a = frames[i];
117
- const b = frames[i + 1];
118
- if (a && b && a[0] <= frameIdx && b[0] >= frameIdx) {
119
- lo = i;
120
- hi = i + 1;
121
- break;
120
+ return { from: first[1], to: first[1], t: 0 };
121
+ if (frameIdx < last[0]) {
122
+ let before = first;
123
+ for (const keyframe of frames) {
124
+ if (keyframe[0] >= frameIdx) {
125
+ const t = (frameIdx - before[0]) / (keyframe[0] - before[0]);
126
+ return { from: before[1], to: keyframe[1], t };
127
+ }
128
+ before = keyframe;
122
129
  }
123
130
  }
124
- const loEntry = frames[lo];
125
- const hiEntry = frames[hi];
126
- if (!loEntry || !hiEntry)
131
+ return { from: last[1], to: last[1], t: 0 };
132
+ }
133
+ /**
134
+ * A number, or a string that reads as one (`"40"`, `"000"`, `"-2.5"`); `undefined` otherwise.
135
+ * `pixoo_compose_scene` validates `dx`, `dy`, and `opacity` keyframes with it, so the input
136
+ * schema and the interpolation agree on what a numeric string is.
137
+ */
138
+ export function numericValue(value) {
139
+ if (typeof value === 'number')
140
+ return value;
141
+ if (typeof value !== 'string' || value.trim() === '')
142
+ return;
143
+ const number = Number(value);
144
+ return Number.isFinite(number) ? number : undefined;
145
+ }
146
+ /**
147
+ * Interpolate a keyframe property at a given frame index. Booleans snap at the midpoint.
148
+ * Numbers lerp, and so do numeric strings, read as the same numbers — `"000"` is 0 here, never
149
+ * a color: only the `color` track lerps through RGB, in {@link interpolateColorKeyframe}.
150
+ * Any other value holds until the next keyframe.
151
+ */
152
+ export function interpolateKeyframe(frames, frameIdx) {
153
+ const span = keyframeSpan(frames, frameIdx);
154
+ if (!span)
127
155
  return 0;
128
- const [f0, v0] = loEntry;
129
- const [f1, v1] = hiEntry;
130
- if (f0 === f1)
131
- return v0;
132
- const t = (frameIdx - f0) / (f1 - f0);
133
- // Boolean: snap at midpoint
134
- if (typeof v0 === 'boolean')
135
- return t < 0.5 ? v0 : v1;
136
- // Number: lerp
137
- if (typeof v0 === 'number' && typeof v1 === 'number') {
138
- return v0 + (v1 - v0) * t;
139
- }
140
- // Color string: lerp through RGB
141
- if (typeof v0 === 'string' && typeof v1 === 'string') {
142
- try {
143
- const c0 = resolveColor(v0);
144
- const c1 = resolveColor(v1);
145
- const lerped = lerpColor(c0, c1, t);
146
- return `rgb(${lerped[0]},${lerped[1]},${lerped[2]})`;
147
- }
148
- catch {
149
- return v0;
150
- }
151
- }
152
- return v0;
156
+ const { from, to, t } = span;
157
+ if (typeof from === 'boolean')
158
+ return t < 0.5 ? from : to;
159
+ const n0 = numericValue(from);
160
+ const n1 = numericValue(to);
161
+ if (n0 !== undefined && n1 !== undefined)
162
+ return n0 + (n1 - n0) * t;
163
+ return from;
164
+ }
165
+ /**
166
+ * Interpolate a `color` keyframe track at a frame index: each keyframe value, number or
167
+ * string, is read as a color and the track lerps through RGB, returning `#rrggbb` between
168
+ * keyframes so it resolves like any other color. Every keyframe value is resolved first, so
169
+ * one that isn't a color fails on every frame — including a keyframe the scene never
170
+ * reaches, which interpolation alone would skip past by holding the previous color.
171
+ *
172
+ * @throws {Error} The toolkit's `Unknown color` error for the first value that isn't a color,
173
+ * or an error for an empty track, which input validation rejects before any render.
174
+ */
175
+ export function interpolateColorKeyframe(frames, frameIdx) {
176
+ for (const [, value] of frames)
177
+ resolveColor(String(value));
178
+ const span = keyframeSpan(frames, frameIdx);
179
+ if (!span)
180
+ throw new Error('A color keyframe track needs at least one keyframe.');
181
+ const { from, to, t } = span;
182
+ if (t === 0)
183
+ return String(from);
184
+ const lerped = lerpColor(resolveColor(String(from)), resolveColor(String(to)), t);
185
+ return `#${rgbToHex(lerped).toString(16).padStart(6, '0')}`;
153
186
  }
154
187
  /** Get the interpolated value for a named property at a frame index. */
155
188
  export function getKeyframeValue(keyframes, prop, frameIdx, defaultValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"keyframes.js","sourceRoot":"","sources":["../../src/renderer/keyframes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyframes.js","sourceRoot":"","sources":["../../src/renderer/keyframes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAoB7E,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,OAAO;IACP,aAAa;IACb,cAAc;IACd,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,SAAS;IACT,UAAU;CACX,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAgB,EAChB,IAIC,EACD,WAAmB;IAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAE9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,cAAc,EAAE,CAAC;YACpB,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;YAC5C,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;YAC5C,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QACD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAKD;;;;GAIG;AACH,SAAS,YAAY,CACnB,MAAuB,EACvB,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO;IAC5B,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACxE,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,CAAC;YACD,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB,EAAE,QAAgB;IAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAE7B,IAAI,OAAO,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1D,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAuB,EAAE,QAAgB;IAChF,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM;QAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAClF,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAC9B,SAAkC,EAClC,IAAY,EACZ,QAAgB,EAChB,YAAuC;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /**
2
- * @fileoverview Preview encoding utilities: PNG content blocks, contact sheets, GIF saving.
2
+ * @fileoverview Preview encoding utilities: PNG content blocks, contact sheets, and the
3
+ * PNG/GIF preview files written to PIXOO_OUTPUT_DIR or a temp directory.
3
4
  * @module renderer/preview
4
5
  */
5
6
  import { Canvas } from '@cyanheads/pixoo-toolkit';
@@ -9,26 +10,23 @@ export interface ImageContentBlock {
9
10
  mimeType: 'image/png' | 'image/gif';
10
11
  type: 'image';
11
12
  }
12
- /** Output files record. */
13
- export interface OutputFiles {
14
- gif?: string;
15
- preview?: string;
16
- }
13
+ /** Writes a render's preview file into `dir` and resolves to the file's path. */
14
+ export type PreviewWriter = (dir: string) => Promise<string>;
17
15
  /** Encode a single canvas as a base64 PNG content block (8× upscaled → 512px). */
18
16
  export declare function encodePreviewBlock(canvas: Canvas): ImageContentBlock;
19
17
  /**
20
- * Build a contact-sheet preview from animation frames.
21
- * Returns the middle frame encoded as a PNG (works universally across MCP clients).
22
- */
23
- export declare function buildContactSheet(frames: Canvas[]): ImageContentBlock;
24
- /**
25
- * Optionally save a preview PNG to PIXOO_OUTPUT_DIR.
26
- * Returns the saved path, or undefined if no output dir is configured.
27
- */
28
- export declare function savePngPreview(canvas: Canvas, baseName: string): Promise<string | undefined>;
29
- /**
30
- * Optionally save an animation GIF to PIXOO_OUTPUT_DIR.
31
- * Returns the saved path, or undefined if no output dir is configured.
18
+ * Build a contact-sheet preview: every frame, in order, tiled left-to-right and
19
+ * top-to-bottom in a `ceil(sqrt(n))`-column grid, each tile an integer upscale that
20
+ * keeps the sheet within the 512px preview budget. A single frame encodes exactly as
21
+ * {@link encodePreviewBlock} does.
32
22
  */
33
- export declare function saveGifPreview(frames: Canvas[], speed: number, baseName: string): Promise<string | undefined>;
23
+ export declare function buildContactSheet(frames: Canvas[]): Promise<ImageContentBlock>;
24
+ /** Save a canvas as an 8× upscaled PNG in `dir`; returns the saved path. */
25
+ export declare function savePngPreview(canvas: Canvas, dir: string, baseName: string): Promise<string>;
26
+ /** Save animation frames as an 8× upscaled GIF in `dir`; returns the saved path. */
27
+ export declare function saveGifPreview(frames: Canvas[], speed: number, dir: string, baseName: string): Promise<string>;
28
+ /** Write the preview into PIXOO_OUTPUT_DIR when one is configured; returns the paths written. */
29
+ export declare function autoSavePreview(write: PreviewWriter): Promise<string[]>;
30
+ /** Write the preview into a fresh directory under the OS temp dir; returns its path. */
31
+ export declare function saveTempPreview(write: PreviewWriter): Promise<string>;
34
32
  //# sourceMappingURL=preview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/renderer/preview.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAiC,MAAM,0BAA0B,CAAC;AAGjF,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAIpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CASrE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO7B"}
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/renderer/preview.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,MAAM,EAA0C,MAAM,0BAA0B,CAAC;AAG1F,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAS7D,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAIpE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+BpF;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,oFAAoF;AACpF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,iGAAiG;AACjG,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E;AAED,wFAAwF;AACxF,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E"}
@@ -1,11 +1,18 @@
1
1
  /**
2
- * @fileoverview Preview encoding utilities: PNG content blocks, contact sheets, GIF saving.
2
+ * @fileoverview Preview encoding utilities: PNG content blocks, contact sheets, and the
3
+ * PNG/GIF preview files written to PIXOO_OUTPUT_DIR or a temp directory.
3
4
  * @module renderer/preview
4
5
  */
5
6
  import * as fs from 'node:fs/promises';
7
+ import * as os from 'node:os';
6
8
  import * as path from 'node:path';
7
- import { Canvas, canvasToPng, saveAnimationGif } from '@cyanheads/pixoo-toolkit';
9
+ import { Canvas, canvasToPng, saveAnimationGif, savePng } from '@cyanheads/pixoo-toolkit';
8
10
  import { getServerConfig } from '../config/server-config.js';
11
+ /** Edge length, in pixels, a preview image is scaled toward. */
12
+ const PREVIEW_BUDGET_PX = 512;
13
+ /** Gutter between contact-sheet tiles, which also fills the grid's unused cells. */
14
+ const SHEET_GAP_PX = 2;
15
+ const SHEET_GAP_COLOR = { r: 48, g: 48, b: 48 };
9
16
  /** Encode a single canvas as a base64 PNG content block (8× upscaled → 512px). */
10
17
  export function encodePreviewBlock(canvas) {
11
18
  const pngBuffer = canvasToPng(canvas, 8);
@@ -13,44 +20,58 @@ export function encodePreviewBlock(canvas) {
13
20
  return { type: 'image', data: base64, mimeType: 'image/png' };
14
21
  }
15
22
  /**
16
- * Build a contact-sheet preview from animation frames.
17
- * Returns the middle frame encoded as a PNG (works universally across MCP clients).
23
+ * Build a contact-sheet preview: every frame, in order, tiled left-to-right and
24
+ * top-to-bottom in a `ceil(sqrt(n))`-column grid, each tile an integer upscale that
25
+ * keeps the sheet within the 512px preview budget. A single frame encodes exactly as
26
+ * {@link encodePreviewBlock} does.
18
27
  */
19
- export function buildContactSheet(frames) {
20
- // Return the middle frame as a representative preview
21
- const midFrame = frames[Math.floor(frames.length / 2)] ?? frames[0];
22
- if (!midFrame) {
23
- // Empty frame set — return a black canvas
24
- const fallback = new Canvas(64);
25
- return encodePreviewBlock(fallback);
26
- }
27
- return encodePreviewBlock(midFrame);
28
+ export async function buildContactSheet(frames) {
29
+ const [first] = frames;
30
+ if (!first || frames.length === 1)
31
+ return encodePreviewBlock(first ?? new Canvas(64));
32
+ const cols = Math.ceil(Math.sqrt(frames.length));
33
+ const rows = Math.ceil(frames.length / cols);
34
+ const scale = Math.max(1, Math.floor((PREVIEW_BUDGET_PX - (cols - 1) * SHEET_GAP_PX) / (cols * first.width)));
35
+ const pitch = first.width * scale + SHEET_GAP_PX;
36
+ const { default: sharp } = await import('sharp');
37
+ const png = await sharp({
38
+ create: {
39
+ width: cols * pitch - SHEET_GAP_PX,
40
+ height: rows * pitch - SHEET_GAP_PX,
41
+ channels: 3,
42
+ background: SHEET_GAP_COLOR,
43
+ },
44
+ })
45
+ .composite(frames.map((frame, i) => ({
46
+ input: Buffer.from(canvasToPng(frame, scale)),
47
+ left: (i % cols) * pitch,
48
+ top: Math.floor(i / cols) * pitch,
49
+ })))
50
+ .png()
51
+ .toBuffer();
52
+ return { type: 'image', data: png.toString('base64'), mimeType: 'image/png' };
28
53
  }
29
- /**
30
- * Optionally save a preview PNG to PIXOO_OUTPUT_DIR.
31
- * Returns the saved path, or undefined if no output dir is configured.
32
- */
33
- export async function savePngPreview(canvas, baseName) {
34
- const cfg = getServerConfig();
35
- if (!cfg.pixooOutputDir)
36
- return;
37
- await fs.mkdir(cfg.pixooOutputDir, { recursive: true });
38
- const filePath = path.join(cfg.pixooOutputDir, `${baseName}.png`);
39
- const { savePng } = await import('@cyanheads/pixoo-toolkit');
54
+ /** Save a canvas as an 8× upscaled PNG in `dir`; returns the saved path. */
55
+ export async function savePngPreview(canvas, dir, baseName) {
56
+ await fs.mkdir(dir, { recursive: true });
57
+ const filePath = path.join(dir, `${baseName}.png`);
40
58
  await savePng(canvas, filePath, 8);
41
59
  return filePath;
42
60
  }
43
- /**
44
- * Optionally save an animation GIF to PIXOO_OUTPUT_DIR.
45
- * Returns the saved path, or undefined if no output dir is configured.
46
- */
47
- export async function saveGifPreview(frames, speed, baseName) {
48
- const cfg = getServerConfig();
49
- if (!cfg.pixooOutputDir)
50
- return;
51
- await fs.mkdir(cfg.pixooOutputDir, { recursive: true });
52
- const filePath = path.join(cfg.pixooOutputDir, `${baseName}.gif`);
61
+ /** Save animation frames as an 8× upscaled GIF in `dir`; returns the saved path. */
62
+ export async function saveGifPreview(frames, speed, dir, baseName) {
63
+ await fs.mkdir(dir, { recursive: true });
64
+ const filePath = path.join(dir, `${baseName}.gif`);
53
65
  await saveAnimationGif(frames, filePath, speed, 8);
54
66
  return filePath;
55
67
  }
68
+ /** Write the preview into PIXOO_OUTPUT_DIR when one is configured; returns the paths written. */
69
+ export async function autoSavePreview(write) {
70
+ const dir = getServerConfig().pixooOutputDir;
71
+ return dir ? [await write(dir)] : [];
72
+ }
73
+ /** Write the preview into a fresh directory under the OS temp dir; returns its path. */
74
+ export async function saveTempPreview(write) {
75
+ return write(await fs.mkdtemp(path.join(os.tmpdir(), 'pixoo-preview-')));
76
+ }
56
77
  //# sourceMappingURL=preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/renderer/preview.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAe5D,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgB;IAChD,sDAAsD;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO;IAChC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAClE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC7D,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAgB,EAChB,KAAa,EACb,QAAgB;IAEhB,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO;IAChC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAClE,MAAM,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/renderer/preview.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * image elements and the pixoo_push_image tool.
5
5
  * @module renderer/remote-image
6
6
  */
7
- import { type RequestContext } from '@cyanheads/mcp-ts-core/utils';
7
+ import type { Context } from '@cyanheads/mcp-ts-core';
8
8
  /** True when the string is a URL rather than a local filesystem path. */
9
9
  export declare function isRemoteSource(source: string): boolean;
10
10
  /**
@@ -14,8 +14,16 @@ export declare function isRemoteSource(source: string): boolean;
14
14
  * Private and loopback addresses are deliberately reachable: this server drives a
15
15
  * LAN device, so a NAS or local web server is a legitimate image host.
16
16
  *
17
+ * The download runs under `ctx.signal`: a cancelled request tears the response stream
18
+ * down instead of reading on to the deadline or the byte cap.
19
+ *
17
20
  * @throws {McpError} NotFound with `reason: 'asset_not_found'` for a non-https URL,
18
21
  * an unreachable or non-2xx endpoint, or a response over {@link MAX_IMAGE_BYTES}.
22
+ * @throws {McpError} RequestCancelled when `ctx.signal` aborts while the body streams.
23
+ * @throws {McpError} Timeout when the body outlasts {@link FETCH_TIMEOUT_MS}, or when the
24
+ * `ctx.signal` abort is a caller-side deadline (a `TimeoutError` reason). A tool handler
25
+ * still answers the deadline as RequestCancelled: the handler factory settles any throw
26
+ * after the request's signal fired as a cancellation.
19
27
  */
20
- export declare function fetchRemoteImageToTempPng(source: string, ctx: RequestContext): Promise<string>;
28
+ export declare function fetchRemoteImageToTempPng(source: string, ctx: Context): Promise<string>;
21
29
  //# sourceMappingURL=remote-image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-image.d.ts","sourceRoot":"","sources":["../../src/renderer/remote-image.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAQrF,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,MAAM,CAAC,CA6DjB"}
1
+ {"version":3,"file":"remote-image.d.ts","sourceRoot":"","sources":["../../src/renderer/remote-image.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUtD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE7F"}
@@ -23,8 +23,16 @@ export function isRemoteSource(source) {
23
23
  * Private and loopback addresses are deliberately reachable: this server drives a
24
24
  * LAN device, so a NAS or local web server is a legitimate image host.
25
25
  *
26
+ * The download runs under `ctx.signal`: a cancelled request tears the response stream
27
+ * down instead of reading on to the deadline or the byte cap.
28
+ *
26
29
  * @throws {McpError} NotFound with `reason: 'asset_not_found'` for a non-https URL,
27
30
  * an unreachable or non-2xx endpoint, or a response over {@link MAX_IMAGE_BYTES}.
31
+ * @throws {McpError} RequestCancelled when `ctx.signal` aborts while the body streams.
32
+ * @throws {McpError} Timeout when the body outlasts {@link FETCH_TIMEOUT_MS}, or when the
33
+ * `ctx.signal` abort is a caller-side deadline (a `TimeoutError` reason). A tool handler
34
+ * still answers the deadline as RequestCancelled: the handler factory settles any throw
35
+ * after the request's signal fired as a cancellation.
28
36
  */
29
37
  export async function fetchRemoteImageToTempPng(source, ctx) {
30
38
  if (!source.startsWith('https://')) {
@@ -34,7 +42,11 @@ export async function fetchRemoteImageToTempPng(source, ctx) {
34
42
  recovery: { hint: 'Use an https URL, or pass an absolute local file path instead.' },
35
43
  });
36
44
  }
37
- const resp = await fetchWithTimeout(source, FETCH_TIMEOUT_MS, ctx).catch((err) => {
45
+ // A throw here after the signal fired still reaches the caller as a cancellation:
46
+ // the handler factory reclassifies any error once the request's signal has aborted.
47
+ const resp = await fetchWithTimeout(source, FETCH_TIMEOUT_MS, ctx, {
48
+ signal: ctx.signal,
49
+ }).catch((err) => {
38
50
  throw notFound(`Failed to fetch image from "${source}": ${err instanceof Error ? err.message : String(err)}`, {
39
51
  reason: 'asset_not_found',
40
52
  url: source,
@@ -1 +1 @@
1
- {"version":3,"file":"remote-image.js","sourceRoot":"","sources":["../../src/renderer/remote-image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-image.js","sourceRoot":"","sources":["../../src/renderer/remote-image.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
  * @fileoverview Scene renderer — element vocabulary, layout resolver, frame rendering.
3
3
  * @module renderer/scene-renderer
4
4
  */
5
- import type { RequestContext } from '@cyanheads/mcp-ts-core/utils';
6
- import { Canvas, downsampleSprite } from '@cyanheads/pixoo-toolkit';
5
+ import type { Context } from '@cyanheads/mcp-ts-core';
6
+ import { Canvas, downsampleSprite, type PixooSize } from '@cyanheads/pixoo-toolkit';
7
7
  import { type EffectName, type KeyframeMap } from './keyframes.js';
8
8
  import { type LayoutEntry, type SemanticX, type SemanticY, type TextStyle } from './text-engine.js';
9
9
  import { type PaletteName, type ThemeName } from './themes.js';
@@ -154,18 +154,23 @@ export interface SpriteElement extends BaseElement {
154
154
  y?: number;
155
155
  }
156
156
  export type SceneElement = TextElement | IconElement | RectElement | CircleElement | LineElement | ProgressElement | SparklineElement | BitmapElement | PixelsElement | ImageElement | SpriteElement;
157
- /** Pre-loaded asset cache for images and sprites. */
157
+ /**
158
+ * Pre-loaded asset cache for images and sprites. Images are keyed by element: the
159
+ * loader bakes each element's fit, size, and position into its canvas, so two
160
+ * elements sharing a source still need a canvas each.
161
+ */
158
162
  export interface AssetCache {
159
- images: Map<string, Canvas>;
163
+ images: Map<ImageElement, Canvas>;
160
164
  sprites: Map<string, Awaited<ReturnType<typeof downsampleSprite>>>;
161
165
  }
162
166
  /**
163
- * Preload all async assets referenced in elements.
167
+ * Preload all async assets referenced in elements. Images load onto a `size` canvas,
168
+ * the scene's own, so an image with no `w`/`h` fits the display.
164
169
  *
165
- * `ctx` is threaded through so a remote image fetch correlates to the
166
- * originating request in logs and traces.
170
+ * `ctx` is threaded through so a remote image fetch correlates to the originating
171
+ * request in logs and traces, and stops when that request is cancelled.
167
172
  */
168
- export declare function preloadAssets(elements: SceneElement[], ctx: RequestContext): Promise<AssetCache>;
173
+ export declare function preloadAssets(elements: SceneElement[], ctx: Context, size: PixooSize): Promise<AssetCache>;
169
174
  /** Apply a background spec to a canvas. */
170
175
  export declare function applyBackground(canvas: Canvas, bg: BackgroundSpec): void;
171
176
  /** Render a single element onto a canvas at a specific frame. */
@@ -176,7 +181,7 @@ export declare function renderFrame(frameIdx: number, totalFrames: number, backg
176
181
  layoutEntries: LayoutEntry[];
177
182
  };
178
183
  /** Render all frames of a scene. */
179
- export declare function renderScene(background: BackgroundSpec, elements: SceneElement[], frameCount: number, ctx: RequestContext, size?: 16 | 32 | 64): Promise<{
184
+ export declare function renderScene(background: BackgroundSpec, elements: SceneElement[], frameCount: number, ctx: Context, size?: PixooSize): Promise<{
180
185
  frames: Canvas[];
181
186
  layoutEntries: LayoutEntry[];
182
187
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"scene-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/scene-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/scene-renderer.ts"],"names":[],"mappings":"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"}