rtistree 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/THIRD_PARTY_NOTICES.md +25 -0
  5. package/dist/art-direction.d.ts +77 -0
  6. package/dist/art-direction.js +186 -0
  7. package/dist/art-direction.js.map +1 -0
  8. package/dist/artifacts.d.ts +24 -0
  9. package/dist/artifacts.js +49 -0
  10. package/dist/artifacts.js.map +1 -0
  11. package/dist/assets.d.ts +16 -0
  12. package/dist/assets.js +96 -0
  13. package/dist/assets.js.map +1 -0
  14. package/dist/benchmark.d.ts +76 -0
  15. package/dist/benchmark.js +118 -0
  16. package/dist/benchmark.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +300 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands.d.ts +5315 -0
  21. package/dist/commands.js +591 -0
  22. package/dist/commands.js.map +1 -0
  23. package/dist/components.d.ts +20 -0
  24. package/dist/components.js +98 -0
  25. package/dist/components.js.map +1 -0
  26. package/dist/construction.d.ts +53 -0
  27. package/dist/construction.js +80 -0
  28. package/dist/construction.js.map +1 -0
  29. package/dist/critique.d.ts +44 -0
  30. package/dist/critique.js +45 -0
  31. package/dist/critique.js.map +1 -0
  32. package/dist/detail.d.ts +5 -0
  33. package/dist/detail.js +52 -0
  34. package/dist/detail.js.map +1 -0
  35. package/dist/document.d.ts +64 -0
  36. package/dist/document.js +56 -0
  37. package/dist/document.js.map +1 -0
  38. package/dist/export.d.ts +405 -0
  39. package/dist/export.js +344 -0
  40. package/dist/export.js.map +1 -0
  41. package/dist/font-inspection.d.ts +8 -0
  42. package/dist/font-inspection.js +34 -0
  43. package/dist/font-inspection.js.map +1 -0
  44. package/dist/graphics.d.ts +9 -0
  45. package/dist/graphics.js +72 -0
  46. package/dist/graphics.js.map +1 -0
  47. package/dist/history-storage.d.ts +10 -0
  48. package/dist/history-storage.js +59 -0
  49. package/dist/history-storage.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.js +28 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/layout.d.ts +18 -0
  54. package/dist/layout.js +155 -0
  55. package/dist/layout.js.map +1 -0
  56. package/dist/loader.d.ts +9 -0
  57. package/dist/loader.js +108 -0
  58. package/dist/loader.js.map +1 -0
  59. package/dist/mcp.d.ts +4 -0
  60. package/dist/mcp.js +223 -0
  61. package/dist/mcp.js.map +1 -0
  62. package/dist/merge.d.ts +6 -0
  63. package/dist/merge.js +49 -0
  64. package/dist/merge.js.map +1 -0
  65. package/dist/native.d.ts +3 -0
  66. package/dist/native.js +6 -0
  67. package/dist/native.js.map +1 -0
  68. package/dist/paint.d.ts +9 -0
  69. package/dist/paint.js +331 -0
  70. package/dist/paint.js.map +1 -0
  71. package/dist/path-edit.d.ts +20 -0
  72. package/dist/path-edit.js +30 -0
  73. package/dist/path-edit.js.map +1 -0
  74. package/dist/pdf-output.d.ts +21 -0
  75. package/dist/pdf-output.js +297 -0
  76. package/dist/pdf-output.js.map +1 -0
  77. package/dist/pipeline.d.ts +39 -0
  78. package/dist/pipeline.js +227 -0
  79. package/dist/pipeline.js.map +1 -0
  80. package/dist/print-scene.d.ts +490 -0
  81. package/dist/print-scene.js +55 -0
  82. package/dist/print-scene.js.map +1 -0
  83. package/dist/production-workflow.d.ts +251 -0
  84. package/dist/production-workflow.js +335 -0
  85. package/dist/production-workflow.js.map +1 -0
  86. package/dist/program-worker.d.ts +1 -0
  87. package/dist/program-worker.js +31 -0
  88. package/dist/program-worker.js.map +1 -0
  89. package/dist/program.d.ts +85 -0
  90. package/dist/program.js +246 -0
  91. package/dist/program.js.map +1 -0
  92. package/dist/project-config.d.ts +91 -0
  93. package/dist/project-config.js +187 -0
  94. package/dist/project-config.js.map +1 -0
  95. package/dist/project.d.ts +897 -0
  96. package/dist/project.js +347 -0
  97. package/dist/project.js.map +1 -0
  98. package/dist/raster-edit.d.ts +61 -0
  99. package/dist/raster-edit.js +91 -0
  100. package/dist/raster-edit.js.map +1 -0
  101. package/dist/raster-studio.d.ts +84 -0
  102. package/dist/raster-studio.js +236 -0
  103. package/dist/raster-studio.js.map +1 -0
  104. package/dist/render.d.ts +79 -0
  105. package/dist/render.js +437 -0
  106. package/dist/render.js.map +1 -0
  107. package/dist/rich-text.d.ts +10 -0
  108. package/dist/rich-text.js +56 -0
  109. package/dist/rich-text.js.map +1 -0
  110. package/dist/schema.d.ts +1912 -0
  111. package/dist/schema.js +571 -0
  112. package/dist/schema.js.map +1 -0
  113. package/dist/spatial.d.ts +10 -0
  114. package/dist/spatial.js +29 -0
  115. package/dist/spatial.js.map +1 -0
  116. package/dist/studio-reference.d.ts +153 -0
  117. package/dist/studio-reference.js +39 -0
  118. package/dist/studio-reference.js.map +1 -0
  119. package/dist/svg.d.ts +5 -0
  120. package/dist/svg.js +315 -0
  121. package/dist/svg.js.map +1 -0
  122. package/dist/techniques.d.ts +74 -0
  123. package/dist/techniques.js +164 -0
  124. package/dist/techniques.js.map +1 -0
  125. package/dist/verify.d.ts +36 -0
  126. package/dist/verify.js +277 -0
  127. package/dist/verify.js.map +1 -0
  128. package/dist/viewport.d.ts +3 -0
  129. package/dist/viewport.js +71 -0
  130. package/dist/viewport.js.map +1 -0
  131. package/dist/workflow.d.ts +53 -0
  132. package/dist/workflow.js +66 -0
  133. package/dist/workflow.js.map +1 -0
  134. package/docs/agent-art-workflow.md +201 -0
  135. package/docs/agent-setup.md +83 -0
  136. package/docs/atelier.md +117 -0
  137. package/docs/cli-reference.md +61 -0
  138. package/docs/decisions/001-runtime-and-renderer.md +35 -0
  139. package/docs/decisions/002-composable-scenes-and-history.md +28 -0
  140. package/docs/decisions/003-editing-refinement-and-agent-validation.md +45 -0
  141. package/docs/decisions/004-print-production-and-projects.md +19 -0
  142. package/docs/decisions/005-programmable-digital-art.md +15 -0
  143. package/docs/decisions/006-staged-2d-art-production.md +13 -0
  144. package/docs/decisions/007-foundation-first-art-direction.md +13 -0
  145. package/docs/decisions/008-agent-onboarding-and-trial-lessons.md +48 -0
  146. package/docs/engine-overview.md +174 -0
  147. package/docs/evolution.md +179 -0
  148. package/docs/getting-started.md +107 -0
  149. package/docs/next-milestone.md +61 -0
  150. package/docs/previews/a3-production.json +36 -0
  151. package/docs/previews/benchmark.json +42 -0
  152. package/docs/previews/landscape.png +0 -0
  153. package/docs/previews/performance.json +24 -0
  154. package/docs/previews/poster.png +0 -0
  155. package/docs/production.md +107 -0
  156. package/docs/releasing.md +60 -0
  157. package/docs/scene-format.md +126 -0
  158. package/docs/studio.md +108 -0
  159. package/examples/hello/README.md +14 -0
  160. package/examples/hello/refine.json +10 -0
  161. package/examples/hello/render.mjs +9 -0
  162. package/examples/hello/scene.json +19 -0
  163. package/licenses/DM-Serif-Display-OFL.txt +93 -0
  164. package/licenses/Inter-OFL.txt +93 -0
  165. package/package.json +84 -0
  166. package/schemas/authoring.schema.json +2177 -0
  167. package/schemas/brief.schema.json +57 -0
  168. package/schemas/command.schema.json +3154 -0
  169. package/schemas/construction.schema.json +159 -0
  170. package/schemas/critique.schema.json +101 -0
  171. package/schemas/document.schema.json +41 -0
  172. package/schemas/export.schema.json +89 -0
  173. package/schemas/fragment.schema.json +1861 -0
  174. package/schemas/patch.schema.json +3177 -0
  175. package/schemas/pipeline.schema.json +205 -0
  176. package/schemas/production.schema.json +452 -0
  177. package/schemas/program.schema.json +152 -0
  178. package/schemas/project.schema.json +115 -0
  179. package/schemas/raster-read.schema.json +42 -0
  180. package/schemas/raster-write.schema.json +75 -0
  181. package/schemas/scene.schema.json +2014 -0
@@ -0,0 +1,297 @@
1
+ import PDFDocument from 'pdfkit';
2
+ import sharp from 'sharp';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { readFile } from 'node:fs/promises';
6
+ import { createCanvas } from './native.js';
7
+ import { registerFonts, registerProjectFonts, localAssetPath } from './assets.js';
8
+ import { exportLayers, resolveLayout } from './layout.js';
9
+ import { layoutText } from './render.js';
10
+ import { printScene } from './print-scene.js';
11
+ const alpha = (hex) => (hex.length === 9 ? parseInt(hex.slice(7), 16) / 255 : 1);
12
+ export async function makePdf(scene, root, renderer, preset, profile) {
13
+ const prepared = printScene(scene, preset.ppi), g = prepared.geometry, mark = preset.crop_marks ? 18 : 0;
14
+ const pageSize = g.full_mm.map((v) => (v * 72) / 25.4 + 2 * mark);
15
+ const doc = new PDFDocument({
16
+ autoFirstPage: false,
17
+ pdfVersion: '1.7',
18
+ compress: true,
19
+ info: {
20
+ Title: 'Rtistree artwork',
21
+ Creator: 'Rtistree',
22
+ CreationDate: new Date(0),
23
+ ModDate: new Date(0),
24
+ },
25
+ });
26
+ const chunks = [];
27
+ const completed = new Promise((resolve, reject) => {
28
+ doc.on('data', (b) => chunks.push(b));
29
+ doc.on('end', () => resolve(Buffer.concat(chunks)));
30
+ doc.on('error', reject);
31
+ });
32
+ doc.addPage({ size: pageSize, margin: 0 });
33
+ const page = doc.page;
34
+ page.dictionary.data.TrimBox = [
35
+ mark + g.bleed_pt,
36
+ mark + g.bleed_pt,
37
+ mark + g.bleed_pt + g.trim_pt[0],
38
+ mark + g.bleed_pt + g.trim_pt[1],
39
+ ];
40
+ page.dictionary.data.BleedBox = [mark, mark, pageSize[0] - mark, pageSize[1] - mark];
41
+ let icc;
42
+ if (profile) {
43
+ icc = doc.ref({ N: 4 });
44
+ icc.end(profile.bytes);
45
+ const intent = doc.ref({
46
+ Type: 'OutputIntent',
47
+ S: 'GTS_PDFX',
48
+ OutputConditionIdentifier: new String('Project ICC profile'),
49
+ Info: new String('ICC-managed CMYK output; PDF/X conformance not asserted'),
50
+ DestOutputProfile: icc,
51
+ });
52
+ intent.end(undefined);
53
+ doc._root.data.OutputIntents = [intent];
54
+ }
55
+ let maximumInk = 0;
56
+ const colourCache = new Map();
57
+ async function colour(hex) {
58
+ if (preset.colour_space !== 'cmyk')
59
+ return hex.slice(0, 7);
60
+ if (preset.black === 'k-only' && hex.slice(0, 7).toLowerCase() === '#000000')
61
+ return [0, 0, 0, 100];
62
+ if (colourCache.has(hex))
63
+ return colourCache.get(hex);
64
+ const { data } = await sharp({
65
+ create: { width: 1, height: 1, channels: 3, background: hex.slice(0, 7) },
66
+ })
67
+ .withIccProfile(profile.path)
68
+ .toColourspace('cmyk')
69
+ .raw()
70
+ .toBuffer({ resolveWithObject: true });
71
+ const c = [...data].map((v) => (v / 255) * 100);
72
+ maximumInk = Math.max(maximumInk, c.reduce((a, b) => a + b, 0));
73
+ colourCache.set(hex, c);
74
+ return c;
75
+ }
76
+ async function raster(png, x, y, w, h) {
77
+ if (preset.colour_space === 'srgb') {
78
+ doc.image(png, x, y, { width: w, height: h });
79
+ return;
80
+ }
81
+ const source = sharp(png), meta = await source.metadata();
82
+ const alpha = meta.hasAlpha
83
+ ? await sharp(png).extractChannel('alpha').raw().toBuffer()
84
+ : undefined;
85
+ const { data, info } = await source
86
+ .removeAlpha()
87
+ .withIccProfile(profile.path)
88
+ .toColourspace('cmyk')
89
+ .raw()
90
+ .toBuffer({ resolveWithObject: true });
91
+ for (let i = 0; i < data.length; i += 4)
92
+ maximumInk = Math.max(maximumInk, ((data[i] + data[i + 1] + data[i + 2] + data[i + 3]) / 255) * 100);
93
+ let smask;
94
+ if (alpha) {
95
+ smask = doc.ref({
96
+ Type: 'XObject',
97
+ Subtype: 'Image',
98
+ Width: info.width,
99
+ Height: info.height,
100
+ ColorSpace: 'DeviceGray',
101
+ BitsPerComponent: 8,
102
+ });
103
+ smask.end(alpha);
104
+ }
105
+ const ref = doc.ref({
106
+ Type: 'XObject',
107
+ Subtype: 'Image',
108
+ Width: info.width,
109
+ Height: info.height,
110
+ ColorSpace: ['ICCBased', icc],
111
+ BitsPerComponent: 8,
112
+ ...(smask ? { SMask: smask } : {}),
113
+ });
114
+ ref.end(data);
115
+ const name = `Rt${Object.keys(page.xobjects).length}`;
116
+ page.xobjects[name] = ref;
117
+ doc
118
+ .save()
119
+ .transform(w, 0, 0, -h, x, y + h)
120
+ .addContent(`/${name} Do`)
121
+ .restore();
122
+ }
123
+ await registerFonts();
124
+ const aliases = (await registerProjectFonts(scene, root)).aliases;
125
+ const fontPath = async (n) => {
126
+ const s = n.layer.style, custom = scene.fonts?.[s.font];
127
+ if (custom)
128
+ return readFile(await localAssetPath(root, custom.source));
129
+ const pkg = s.font === 'display' ? '@fontsource/dm-serif-display' : '@fontsource/inter', filename = s.font === 'display'
130
+ ? 'dm-serif-display-latin-400-normal.woff'
131
+ : `inter-latin-${s.weight === 'bold' ? 700 : 400}-normal.woff`;
132
+ return readFile(resolve(dirname(createRequire(import.meta.url).resolve(`${pkg}/package.json`)), 'files', filename));
133
+ };
134
+ const vectorIds = [], rasterIds = [];
135
+ const simple = (n) => (['text', 'vector'].includes(n.layer.type) ||
136
+ (n.layer.type === 'procedural' && n.layer.generator?.type !== 'noise')) &&
137
+ !n.layer.mask &&
138
+ !n.layer.effects.length &&
139
+ !n.layer.operations.length &&
140
+ !n.layer.tiles.length &&
141
+ !n.layer.regions?.length &&
142
+ n.layer.blend_mode === 'normal';
143
+ // Any adjustment or backdrop blend needs the composite. Ordinary top-level layers remain separate.
144
+ const hybrid = preset.mode === 'hybrid' &&
145
+ !scene.layers.some((l) => l.type === 'adjustment' || l.blend_mode !== 'normal');
146
+ const sx = g.trim_pt[0] / scene.canvas.width, sy = g.trim_pt[1] / scene.canvas.height;
147
+ doc
148
+ .save()
149
+ .rect(mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark)
150
+ .clip();
151
+ const backgroundAlpha = alpha(scene.canvas.background);
152
+ const background = '#' +
153
+ [1, 3, 5]
154
+ .map((i) => Math.round(parseInt(scene.canvas.background.slice(i, i + 2), 16) * backgroundAlpha +
155
+ parseInt(preset.background.slice(i, i + 2), 16) * (1 - backgroundAlpha))
156
+ .toString(16)
157
+ .padStart(2, '0'))
158
+ .join('');
159
+ doc
160
+ .rect(mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark)
161
+ .fill(await colour(background));
162
+ if (!hybrid) {
163
+ const r = await renderer.render(prepared.scene, root, { cache: false, ...prepared.options });
164
+ await raster(r.png, mark, mark, pageSize[0] - mark * 2, pageSize[1] - mark * 2);
165
+ rasterIds.push(...scene.layers.map((l) => l.id));
166
+ }
167
+ else
168
+ for (const n of exportLayers(resolveLayout(scene))) {
169
+ if (!n.layer.visible)
170
+ continue;
171
+ const l = n.layer;
172
+ if (!simple(n)) {
173
+ const r = await renderer.render(prepared.scene, root, {
174
+ cache: false,
175
+ ...prepared.options,
176
+ layer: l.id,
177
+ });
178
+ await raster(r.png, mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark);
179
+ rasterIds.push(l.id);
180
+ continue;
181
+ }
182
+ vectorIds.push(l.id);
183
+ doc
184
+ .save()
185
+ .translate(mark + g.bleed_pt, mark + g.bleed_pt)
186
+ .scale(sx, sy)
187
+ .transform(...n.matrix)
188
+ .opacity(l.opacity);
189
+ const w = n.bounds[2], h = n.bounds[3];
190
+ if (l.type === 'procedural') {
191
+ const auto = scene.layers.includes(l) && !l.bounds && !l.width && !l.height, x = auto ? -g.bleed_pt / sx : 0, y = auto ? -g.bleed_pt / sy : 0, dw = auto ? w + (2 * g.bleed_pt) / sx : w, dh = auto ? h + (2 * g.bleed_pt) / sy : h;
192
+ const gen = l.generator;
193
+ if (gen.type === 'solid')
194
+ doc
195
+ .fillOpacity(l.opacity * alpha(gen.colour))
196
+ .rect(x, y, dw, dh)
197
+ .fill(await colour(gen.colour));
198
+ else if (gen.type === 'gradient') {
199
+ const angle = (gen.angle * Math.PI) / 180, dx = Math.cos(angle), dy = Math.sin(angle), span = Math.abs(dw * dx) + Math.abs(dh * dy);
200
+ const gradient = doc
201
+ .linearGradient(x + dw / 2 - (dx * span) / 2, y + dh / 2 - (dy * span) / 2, x + dw / 2 + (dx * span) / 2, y + dh / 2 + (dy * span) / 2)
202
+ .stop(0, (await colour(gen.from)), alpha(gen.from))
203
+ .stop(1, (await colour(gen.to)), alpha(gen.to));
204
+ doc.rect(x, y, dw, dh).fill(gradient);
205
+ }
206
+ }
207
+ else if (l.shape) {
208
+ const s = l.shape;
209
+ doc.fillColor(await colour(s.fill), l.opacity * alpha(s.fill));
210
+ if (s.dash?.length)
211
+ doc.addContent(`[${s.dash.join(' ')}] ${s.dash_offset ?? 0} d`);
212
+ if (s.type === 'rectangle')
213
+ doc.roundedRect(0, 0, w, h, Math.min(s.radius, w / 2, h / 2));
214
+ else if (s.type === 'ellipse')
215
+ doc.ellipse(w / 2, h / 2, w / 2, h / 2);
216
+ else
217
+ doc.path(s.d);
218
+ if (s.stroke)
219
+ doc
220
+ .lineWidth(s.stroke_width)
221
+ .lineCap(s.line_cap ?? 'butt')
222
+ .lineJoin(s.line_join ?? 'miter')
223
+ .strokeColor(await colour(s.stroke), l.opacity * alpha(s.stroke))
224
+ .fillAndStroke();
225
+ else
226
+ doc.fill();
227
+ }
228
+ else {
229
+ const ctx = createCanvas(1, 1).getContext('2d'), layout = layoutText(ctx, l, w, h, aliases), s = l.style;
230
+ doc
231
+ .rect(0, 0, w, h)
232
+ .clip()
233
+ .font(await fontPath(n))
234
+ .fontSize(s.size)
235
+ .fillColor(await colour(s.colour), l.opacity * alpha(s.colour));
236
+ for (let i = 0; i < layout.lines.length; i++) {
237
+ if (layout.spans) {
238
+ for (const span of layout.spans[i]) {
239
+ const node = { ...n, layer: { ...l, style: { ...s, weight: span.weight } } };
240
+ doc
241
+ .font(await fontPath(node))
242
+ .fontSize(s.size)
243
+ .fillColor(await colour(span.colour), l.opacity * alpha(span.colour))
244
+ .text(span.text, span.x, i * s.size * s.line_height, {
245
+ lineBreak: false,
246
+ baseline: 'top',
247
+ characterSpacing: s.tracking ?? 0,
248
+ features: (s.kerning === false
249
+ ? { kern: false }
250
+ : ['kern']),
251
+ });
252
+ }
253
+ }
254
+ else {
255
+ const line = layout.lines[i], width = ctx.measureText(line).width, x = s.align === 'center' ? (w - width) / 2 : s.align === 'right' ? w - width : 0;
256
+ doc.text(line, x, i * s.size * s.line_height, {
257
+ lineBreak: false,
258
+ baseline: 'top',
259
+ characterSpacing: s.tracking ?? 0,
260
+ features: (s.kerning === false
261
+ ? { kern: false }
262
+ : ['kern']),
263
+ });
264
+ }
265
+ }
266
+ }
267
+ doc.restore();
268
+ }
269
+ doc.restore();
270
+ if (mark) {
271
+ doc.strokeColor(preset.colour_space === 'cmyk' ? [0, 0, 0, 100] : '#000000').lineWidth(0.25);
272
+ const x0 = mark + g.bleed_pt, x1 = x0 + g.trim_pt[0], y0 = mark + g.bleed_pt, y1 = y0 + g.trim_pt[1];
273
+ for (const x of [x0, x1]) {
274
+ doc
275
+ .moveTo(x, 2)
276
+ .lineTo(x, mark - 3)
277
+ .moveTo(x, pageSize[1] - mark + 3)
278
+ .lineTo(x, pageSize[1] - 2);
279
+ }
280
+ for (const y of [y0, y1])
281
+ doc
282
+ .moveTo(2, y)
283
+ .lineTo(mark - 3, y)
284
+ .moveTo(pageSize[0] - mark + 3, y)
285
+ .lineTo(pageSize[0] - 2, y);
286
+ doc.stroke();
287
+ }
288
+ doc.end();
289
+ return {
290
+ bytes: await completed,
291
+ vector_layers: vectorIds,
292
+ raster_layers: rasterIds,
293
+ geometry: g,
294
+ maximum_ink_percent: maximumInk,
295
+ };
296
+ }
297
+ //# sourceMappingURL=pdf-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-output.js","sourceRoot":"","sources":["../src/pdf-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import type { Project } from './project.js';
3
+ export declare const studioId: z.ZodString;
4
+ export declare const pipelineSchema: z.ZodObject<{
5
+ version: z.ZodLiteral<1>;
6
+ id: z.ZodString;
7
+ shared: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
8
+ nodes: z.ZodArray<z.ZodObject<{
9
+ id: z.ZodString;
10
+ source: z.ZodOptional<z.ZodString>;
11
+ code: z.ZodOptional<z.ZodString>;
12
+ width: z.ZodNumber;
13
+ height: z.ZodNumber;
14
+ seed: z.ZodDefault<z.ZodNumber>;
15
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
16
+ bindings: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
17
+ inputs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
18
+ node: z.ZodString;
19
+ }, z.core.$strict>, z.ZodObject<{
20
+ asset: z.ZodString;
21
+ }, z.core.$strict>]>>>;
22
+ target: z.ZodOptional<z.ZodString>;
23
+ timeout_ms: z.ZodDefault<z.ZodNumber>;
24
+ }, z.core.$strict>>;
25
+ }, z.core.$strict>;
26
+ export type Pipeline = z.infer<typeof pipelineSchema>;
27
+ /** Managed state is scoped to the scene entry point and checked against symlink escapes. */
28
+ export declare function studioDirectory(project: Project, ...parts: string[]): Promise<string>;
29
+ export declare function buildPipeline(project: Project, raw: unknown, expected_hash?: string): Promise<{
30
+ pipeline: string;
31
+ scene_hash: string;
32
+ nodes: {
33
+ id: string;
34
+ status: 'built' | 'cached';
35
+ key: string;
36
+ output_hash: string;
37
+ }[];
38
+ changed: boolean;
39
+ }>;
@@ -0,0 +1,227 @@
1
+ import { readFile, mkdir, realpath } from 'node:fs/promises';
2
+ import { join, dirname, relative } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { canonical, localAssetPath, sha256, sceneHash } from './assets.js';
5
+ import { writeArtifact } from './artifacts.js';
6
+ import { bakeProgram, programSchema, PROGRAM_VERSION } from './program.js';
7
+ import { TECHNIQUE_VERSION } from './techniques.js';
8
+ import { projectPath } from './project-config.js';
9
+ import { flattenLayers, assetSchema } from './schema.js';
10
+ export const studioId = z.string().regex(/^[a-zA-Z][a-zA-Z0-9_-]{0,79}$/);
11
+ export const pipelineSchema = z.strictObject({
12
+ version: z.literal(1),
13
+ id: studioId,
14
+ shared: z.record(studioId, z.json()).default({}),
15
+ nodes: z
16
+ .array(z.strictObject({
17
+ id: studioId,
18
+ source: z.string().min(1).optional(),
19
+ code: z.string().min(1).max(262144).optional(),
20
+ width: z.number().int().min(1).max(8192),
21
+ height: z.number().int().min(1).max(8192),
22
+ seed: z.number().int().min(0).max(0xffffffff).default(0),
23
+ parameters: z.record(studioId, z.json()).default({}),
24
+ bindings: z.record(studioId, studioId).default({}),
25
+ inputs: z
26
+ .record(studioId, z.union([z.strictObject({ node: studioId }), z.strictObject({ asset: studioId })]))
27
+ .default({}),
28
+ target: studioId.optional(),
29
+ timeout_ms: z.number().int().min(50).max(30000).default(10000),
30
+ }))
31
+ .min(1)
32
+ .max(32),
33
+ });
34
+ /** Managed state is scoped to the scene entry point and checked against symlink escapes. */
35
+ export async function studioDirectory(project, ...parts) {
36
+ const path = join(project.root, 'studio', sha256(relative(project.root, project.source.file)).slice(7, 23), ...parts);
37
+ let parent = dirname(path);
38
+ for (;;) {
39
+ try {
40
+ projectPath(project.root, relative(project.root, await realpath(parent)));
41
+ break;
42
+ }
43
+ catch (e) {
44
+ if (e.code !== 'ENOENT')
45
+ throw e;
46
+ parent = dirname(parent);
47
+ }
48
+ }
49
+ await mkdir(dirname(path), { recursive: true });
50
+ return path;
51
+ }
52
+ export async function buildPipeline(project, raw, expected_hash) {
53
+ const graph = pipelineSchema.parse(raw), scene = await project.scene(), before = sceneHash(scene);
54
+ if (expected_hash && expected_hash !== before)
55
+ throw new Error('Stale scene hash');
56
+ const byId = new Map(graph.nodes.map((n) => [n.id, n]));
57
+ if (byId.size !== graph.nodes.length)
58
+ throw new Error('Duplicate pipeline node');
59
+ const targets = graph.nodes.flatMap((n) => (n.target ? [n.target] : []));
60
+ if (new Set(targets).size !== targets.length)
61
+ throw new Error('Duplicate pipeline target');
62
+ const ordered = [], visiting = new Set(), visited = new Set();
63
+ function visit(id) {
64
+ if (visiting.has(id))
65
+ throw new Error(`Pipeline cycle at ${id}`);
66
+ if (visited.has(id))
67
+ return;
68
+ const n = byId.get(id);
69
+ if (!n)
70
+ throw new Error(`Unknown pipeline dependency ${id}`);
71
+ if (Boolean(n.code) === Boolean(n.source))
72
+ throw new Error('Each node requires exactly one code or source');
73
+ visiting.add(id);
74
+ for (const input of Object.values(n.inputs))
75
+ if ('node' in input)
76
+ visit(input.node);
77
+ visiting.delete(id);
78
+ visited.add(id);
79
+ ordered.push(n);
80
+ }
81
+ graph.nodes.forEach((n) => visit(n.id));
82
+ const assets = { ...scene.assets }, results = [];
83
+ const commands = [];
84
+ const sources = new Map();
85
+ const generatedIds = new Set(graph.nodes.map((n) => `${graph.id}_${n.id}`));
86
+ for (const node of graph.nodes) {
87
+ studioId.parse(`${graph.id}_${node.id}`);
88
+ for (const input of Object.values(node.inputs))
89
+ if ('asset' in input && generatedIds.has(input.asset))
90
+ throw new Error('Use a node reference for pipeline-produced inputs');
91
+ }
92
+ for (const node of ordered) {
93
+ const code = node.code ?? (await readFile(await localAssetPath(project.root, node.source), 'utf8'));
94
+ sources.set(node.id, code);
95
+ const parameters = { ...node.parameters };
96
+ for (const [name, key] of Object.entries(node.bindings)) {
97
+ if (!Object.hasOwn(graph.shared, key))
98
+ throw new Error(`Missing shared parameter ${key}`);
99
+ parameters[name] = graph.shared[key];
100
+ }
101
+ const inputs = {}, hashes = {};
102
+ for (const [name, input] of Object.entries(node.inputs)) {
103
+ const id = 'node' in input ? `${graph.id}_${input.node}` : input.asset;
104
+ const asset = assets[id];
105
+ if (!asset)
106
+ throw new Error(`Unknown pipeline input ${id}`);
107
+ const bytes = await readFile(await localAssetPath(project.root, asset.source));
108
+ if (asset.hash && asset.hash !== sha256(bytes))
109
+ throw new Error('Pipeline input hash mismatch');
110
+ inputs[name] = id;
111
+ hashes[name] = sha256(bytes);
112
+ }
113
+ const asset_id = `${graph.id}_${node.id}`;
114
+ const spec = programSchema.parse({
115
+ code,
116
+ parameters,
117
+ inputs,
118
+ asset_id,
119
+ width: node.width,
120
+ height: node.height,
121
+ seed: node.seed,
122
+ timeout_ms: node.timeout_ms,
123
+ reason: `Build ${graph.id}/${node.id}`,
124
+ });
125
+ const key = sha256(canonical({
126
+ code,
127
+ parameters,
128
+ inputs: hashes,
129
+ width: node.width,
130
+ height: node.height,
131
+ seed: node.seed,
132
+ timeout_ms: node.timeout_ms,
133
+ runtime: {
134
+ program: PROGRAM_VERSION,
135
+ techniques: TECHNIQUE_VERSION,
136
+ node: process.version,
137
+ skia: '1.0.8',
138
+ },
139
+ }));
140
+ const cache = await studioDirectory(project, 'cache', key.slice(7) + '.json');
141
+ let asset;
142
+ try {
143
+ const cached = JSON.parse(await readFile(await localAssetPath(project.root, relative(project.root, cache)), 'utf8'));
144
+ if (cached.key !== key)
145
+ throw new Error('Cache key mismatch');
146
+ asset = assetSchema.parse(cached.asset);
147
+ if (!asset.hash || !asset.recipe)
148
+ throw new Error('Incomplete cache');
149
+ if (sha256(await readFile(await localAssetPath(project.root, asset.source))) !== asset.hash ||
150
+ sha256(await readFile(await localAssetPath(project.root, asset.recipe.source))) !==
151
+ asset.recipe.hash)
152
+ throw new Error('Corrupt cache');
153
+ const recipe = JSON.parse(await readFile(await localAssetPath(project.root, asset.recipe.source), 'utf8'));
154
+ if (recipe.source !== code ||
155
+ recipe.source_hash !== sha256(code) ||
156
+ recipe.output_hash !== asset.hash ||
157
+ recipe.width !== spec.width ||
158
+ recipe.height !== spec.height ||
159
+ recipe.seed !== spec.seed ||
160
+ recipe.timeout_ms !== spec.timeout_ms ||
161
+ canonical(recipe.parameters) !== canonical(parameters))
162
+ throw new Error('Cache recipe does not match the requested program');
163
+ for (const input of Object.values(recipe.inputs))
164
+ if (sha256(await readFile(await localAssetPath(project.root, join(dirname(asset.recipe.source), input.source)))) !== input.hash)
165
+ throw new Error('Corrupt cache input');
166
+ }
167
+ catch {
168
+ asset = undefined;
169
+ }
170
+ const status = asset ? 'cached' : 'built';
171
+ if (!asset) {
172
+ asset = assetSchema.parse((await bakeProgram(project.root, spec, assets)).asset);
173
+ await writeArtifact(cache, canonical({ key, asset }));
174
+ }
175
+ assets[asset_id] = asset;
176
+ results.push({ id: node.id, status, key, output_hash: asset.hash });
177
+ if (canonical(scene.assets[asset_id] ?? null) !== canonical(asset))
178
+ commands.push({ type: 'registerAsset', id: asset_id, asset });
179
+ }
180
+ // Preserve authored node order for painter's compositing order, independently of DAG traversal.
181
+ for (const node of graph.nodes)
182
+ if (node.target) {
183
+ const id = `${graph.id}_${node.id}`, target = flattenLayers(scene.layers).find((l) => l.id === node.target);
184
+ if (target?.source === id)
185
+ continue;
186
+ commands.push(target
187
+ ? { type: 'setSource', target: node.target, source: id }
188
+ : {
189
+ type: 'addLayer',
190
+ layer: {
191
+ id: node.target,
192
+ type: 'raster',
193
+ source: id,
194
+ bounds: [0, 0, scene.canvas.width, scene.canvas.height],
195
+ },
196
+ });
197
+ }
198
+ // Pin editable inline code and bindings with the scene so candidate restoration restores its build graph.
199
+ const frozen = {
200
+ ...graph,
201
+ nodes: graph.nodes.map((n) => {
202
+ const { source, ...rest } = n;
203
+ return { ...rest, code: sources.get(n.id) };
204
+ }),
205
+ };
206
+ const next = structuredClone(scene);
207
+ const { applyCommand } = await import('./commands.js');
208
+ let changed = next;
209
+ for (const command of commands)
210
+ changed = applyCommand(changed, command);
211
+ changed.metadata = {
212
+ ...changed.metadata,
213
+ [`pipeline_${graph.id}`]: JSON.parse(canonical(frozen)),
214
+ };
215
+ if (sceneHash(changed) === before) {
216
+ if (sceneHash(await project.scene()) !== before)
217
+ throw new Error('Stale scene hash');
218
+ return { pipeline: graph.id, scene_hash: before, nodes: results, changed: false };
219
+ }
220
+ const entry = await project.apply({
221
+ reason: `Rebuild pipeline ${graph.id}`,
222
+ expected_hash: before,
223
+ commands: [{ type: 'restoreScene', scene: changed }],
224
+ });
225
+ return { pipeline: graph.id, scene_hash: entry.after_hash, nodes: results, changed: true };
226
+ }
227
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}