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,251 @@
1
+ import { z } from 'zod';
2
+ import type { Project } from './project.js';
3
+ export declare const referenceStudySchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ source: z.ZodString;
6
+ observation: z.ZodString;
7
+ application: z.ZodString;
8
+ }, z.core.$strict>;
9
+ export declare const productionPlanSchema: z.ZodObject<{
10
+ id: z.ZodString;
11
+ brief: z.ZodString;
12
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
13
+ id: z.ZodString;
14
+ source: z.ZodString;
15
+ observation: z.ZodString;
16
+ application: z.ZodString;
17
+ }, z.core.$strict>>>;
18
+ stages: z.ZodArray<z.ZodObject<{
19
+ id: z.ZodString;
20
+ goal: z.ZodString;
21
+ criteria: z.ZodArray<z.ZodObject<{
22
+ id: z.ZodString;
23
+ description: z.ZodString;
24
+ }, z.core.$strict>>;
25
+ minimum_alternatives: z.ZodOptional<z.ZodNumber>;
26
+ require_references: z.ZodOptional<z.ZodBoolean>;
27
+ required_reviewer: z.ZodOptional<z.ZodEnum<{
28
+ any: "any";
29
+ human: "human";
30
+ }>>;
31
+ minimum_fidelity: z.ZodDefault<z.ZodNumber>;
32
+ minimum_quality: z.ZodDefault<z.ZodNumber>;
33
+ }, z.core.$strict>>;
34
+ }, z.core.$strict>;
35
+ export declare const candidateReviewSchema: z.ZodObject<{
36
+ candidate: z.ZodString;
37
+ scene_hash: z.ZodString;
38
+ png_hash: z.ZodString;
39
+ reviewer: z.ZodString;
40
+ method: z.ZodEnum<{
41
+ human: "human";
42
+ "vision-agent": "vision-agent";
43
+ }>;
44
+ fidelity: z.ZodNumber;
45
+ quality: z.ZodNumber;
46
+ criteria: z.ZodArray<z.ZodObject<{
47
+ id: z.ZodString;
48
+ pass: z.ZodBoolean;
49
+ evidence: z.ZodString;
50
+ }, z.core.$strict>>;
51
+ strengths: z.ZodString;
52
+ weaknesses: z.ZodString;
53
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
54
+ criterion: z.ZodString;
55
+ severity: z.ZodEnum<{
56
+ blocking: "blocking";
57
+ minor: "minor";
58
+ }>;
59
+ observation: z.ZodString;
60
+ correction: z.ZodString;
61
+ }, z.core.$strict>>>;
62
+ comparison: z.ZodOptional<z.ZodObject<{
63
+ parent: z.ZodString;
64
+ verdict: z.ZodEnum<{
65
+ improved: "improved";
66
+ unchanged: "unchanged";
67
+ worse: "worse";
68
+ }>;
69
+ evidence: z.ZodString;
70
+ }, z.core.$strict>>;
71
+ }, z.core.$strict>;
72
+ export declare const productionRequestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
73
+ action: z.ZodLiteral<"plan">;
74
+ plan: z.ZodObject<{
75
+ id: z.ZodString;
76
+ brief: z.ZodString;
77
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
78
+ id: z.ZodString;
79
+ source: z.ZodString;
80
+ observation: z.ZodString;
81
+ application: z.ZodString;
82
+ }, z.core.$strict>>>;
83
+ stages: z.ZodArray<z.ZodObject<{
84
+ id: z.ZodString;
85
+ goal: z.ZodString;
86
+ criteria: z.ZodArray<z.ZodObject<{
87
+ id: z.ZodString;
88
+ description: z.ZodString;
89
+ }, z.core.$strict>>;
90
+ minimum_alternatives: z.ZodOptional<z.ZodNumber>;
91
+ require_references: z.ZodOptional<z.ZodBoolean>;
92
+ required_reviewer: z.ZodOptional<z.ZodEnum<{
93
+ any: "any";
94
+ human: "human";
95
+ }>>;
96
+ minimum_fidelity: z.ZodDefault<z.ZodNumber>;
97
+ minimum_quality: z.ZodDefault<z.ZodNumber>;
98
+ }, z.core.$strict>>;
99
+ }, z.core.$strict>;
100
+ }, z.core.$strict>, z.ZodObject<{
101
+ action: z.ZodLiteral<"status">;
102
+ session: z.ZodString;
103
+ }, z.core.$strict>, z.ZodObject<{
104
+ action: z.ZodLiteral<"study">;
105
+ session: z.ZodString;
106
+ reference: z.ZodObject<{
107
+ id: z.ZodString;
108
+ source: z.ZodString;
109
+ observation: z.ZodString;
110
+ application: z.ZodString;
111
+ }, z.core.$strict>;
112
+ }, z.core.$strict>, z.ZodObject<{
113
+ action: z.ZodLiteral<"capture">;
114
+ session: z.ZodString;
115
+ candidate: z.ZodString;
116
+ expected_hash: z.ZodString;
117
+ notes: z.ZodDefault<z.ZodString>;
118
+ revision: z.ZodOptional<z.ZodObject<{
119
+ parent: z.ZodString;
120
+ hypothesis: z.ZodString;
121
+ }, z.core.$strict>>;
122
+ crops: z.ZodDefault<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>>;
123
+ }, z.core.$strict>, z.ZodObject<{
124
+ action: z.ZodLiteral<"review">;
125
+ session: z.ZodString;
126
+ review: z.ZodObject<{
127
+ candidate: z.ZodString;
128
+ scene_hash: z.ZodString;
129
+ png_hash: z.ZodString;
130
+ reviewer: z.ZodString;
131
+ method: z.ZodEnum<{
132
+ human: "human";
133
+ "vision-agent": "vision-agent";
134
+ }>;
135
+ fidelity: z.ZodNumber;
136
+ quality: z.ZodNumber;
137
+ criteria: z.ZodArray<z.ZodObject<{
138
+ id: z.ZodString;
139
+ pass: z.ZodBoolean;
140
+ evidence: z.ZodString;
141
+ }, z.core.$strict>>;
142
+ strengths: z.ZodString;
143
+ weaknesses: z.ZodString;
144
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
145
+ criterion: z.ZodString;
146
+ severity: z.ZodEnum<{
147
+ blocking: "blocking";
148
+ minor: "minor";
149
+ }>;
150
+ observation: z.ZodString;
151
+ correction: z.ZodString;
152
+ }, z.core.$strict>>>;
153
+ comparison: z.ZodOptional<z.ZodObject<{
154
+ parent: z.ZodString;
155
+ verdict: z.ZodEnum<{
156
+ improved: "improved";
157
+ unchanged: "unchanged";
158
+ worse: "worse";
159
+ }>;
160
+ evidence: z.ZodString;
161
+ }, z.core.$strict>>;
162
+ }, z.core.$strict>;
163
+ }, z.core.$strict>, z.ZodObject<{
164
+ action: z.ZodLiteral<"compare">;
165
+ session: z.ZodString;
166
+ }, z.core.$strict>, z.ZodObject<{
167
+ action: z.ZodLiteral<"select">;
168
+ session: z.ZodString;
169
+ candidate: z.ZodString;
170
+ expected_hash: z.ZodString;
171
+ }, z.core.$strict>, z.ZodObject<{
172
+ action: z.ZodLiteral<"advance">;
173
+ session: z.ZodString;
174
+ expected_hash: z.ZodString;
175
+ }, z.core.$strict>], "action">;
176
+ type Candidate = {
177
+ id: string;
178
+ stage: string;
179
+ scene_hash: string;
180
+ png_hash: string;
181
+ technical: {
182
+ status: string;
183
+ rule_count: number;
184
+ };
185
+ notes: string;
186
+ review?: z.infer<typeof candidateReviewSchema>;
187
+ review_history?: z.infer<typeof candidateReviewSchema>[];
188
+ revision?: {
189
+ parent: string;
190
+ hypothesis: string;
191
+ };
192
+ };
193
+ type Session = {
194
+ version: 1;
195
+ plan: z.infer<typeof productionPlanSchema>;
196
+ stage: number;
197
+ complete: boolean;
198
+ candidates: Candidate[];
199
+ selected: Record<string, string>;
200
+ };
201
+ /** Explicit stage gates. Visual ratings are supplied by an observer, never inferred from technical tests. */
202
+ export declare function production(project: Project, raw: unknown): Promise<Session | {
203
+ version: 1;
204
+ plan: z.infer<typeof productionPlanSchema>;
205
+ stage: number;
206
+ complete: boolean;
207
+ candidates: Candidate[];
208
+ selected: Record<string, string>;
209
+ readiness: {
210
+ candidate: string;
211
+ eligible: boolean;
212
+ blockers: string[];
213
+ }[];
214
+ image?: undefined;
215
+ ranked?: undefined;
216
+ gates?: undefined;
217
+ } | {
218
+ image: string;
219
+ stage: {
220
+ id: string;
221
+ goal: string;
222
+ criteria: {
223
+ id: string;
224
+ description: string;
225
+ }[];
226
+ minimum_alternatives?: number | undefined;
227
+ require_references?: boolean | undefined;
228
+ required_reviewer?: "any" | "human" | undefined;
229
+ minimum_fidelity: number;
230
+ minimum_quality: number;
231
+ };
232
+ ranked: Candidate[];
233
+ selected: string | null;
234
+ gates: {
235
+ candidate: string;
236
+ eligible: boolean;
237
+ blockers: string[];
238
+ }[];
239
+ } | {
240
+ version: 1;
241
+ plan: z.infer<typeof productionPlanSchema>;
242
+ stage: number;
243
+ complete: boolean;
244
+ candidates: Candidate[];
245
+ selected: Record<string, string>;
246
+ image?: undefined;
247
+ ranked?: undefined;
248
+ gates?: undefined;
249
+ directory: string;
250
+ }>;
251
+ export {};
@@ -0,0 +1,335 @@
1
+ import { readFile, open, unlink } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import sharp from 'sharp';
4
+ import { z } from 'zod';
5
+ import { studioDirectory, studioId } from './pipeline.js';
6
+ import { canonical, sceneHash, sha256 } from './assets.js';
7
+ import { writeArtifact } from './artifacts.js';
8
+ import { parseScene, boundsSchema } from './schema.js';
9
+ import { verifyRendered } from './verify.js';
10
+ import { createCanvas, loadImage } from './native.js';
11
+ export const referenceStudySchema = z.strictObject({
12
+ id: studioId,
13
+ source: z.string().min(1).max(2000),
14
+ observation: z.string().min(1).max(2000),
15
+ application: z.string().min(1).max(2000),
16
+ });
17
+ export const productionPlanSchema = z
18
+ .strictObject({
19
+ id: studioId,
20
+ brief: z.string().min(1).max(8000),
21
+ references: z.array(referenceStudySchema).max(24).optional(),
22
+ stages: z
23
+ .array(z.strictObject({
24
+ id: studioId,
25
+ goal: z.string().min(1).max(2000),
26
+ criteria: z
27
+ .array(z.strictObject({ id: studioId, description: z.string().min(1).max(1000) }))
28
+ .min(1)
29
+ .max(20),
30
+ minimum_alternatives: z.number().int().min(1).max(12).optional(),
31
+ require_references: z.boolean().optional(),
32
+ required_reviewer: z.enum(['any', 'human']).optional(),
33
+ minimum_fidelity: z.number().min(0).max(1).default(0.7),
34
+ minimum_quality: z.number().min(0).max(1).default(0.7),
35
+ }))
36
+ .min(1)
37
+ .max(12),
38
+ })
39
+ .superRefine((p, c) => {
40
+ if (new Set(p.stages.map((s) => s.id)).size !== p.stages.length ||
41
+ p.stages.some((s) => new Set(s.criteria.map((c) => c.id)).size !== s.criteria.length))
42
+ c.addIssue({ code: 'custom', message: 'Stage and criterion IDs must be unique' });
43
+ });
44
+ export const candidateReviewSchema = z.strictObject({
45
+ candidate: studioId,
46
+ scene_hash: z.string(),
47
+ png_hash: z.string(),
48
+ reviewer: z.string().min(1).max(200),
49
+ method: z.enum(['human', 'vision-agent']),
50
+ fidelity: z.number().min(0).max(1),
51
+ quality: z.number().min(0).max(1),
52
+ criteria: z
53
+ .array(z.strictObject({ id: studioId, pass: z.boolean(), evidence: z.string().min(1).max(2000) }))
54
+ .max(20),
55
+ strengths: z.string().min(1).max(4000),
56
+ weaknesses: z.string().min(1).max(4000),
57
+ issues: z
58
+ .array(z.strictObject({
59
+ criterion: studioId,
60
+ severity: z.enum(['blocking', 'minor']),
61
+ observation: z.string().min(1).max(2000),
62
+ correction: z.string().min(1).max(2000),
63
+ }))
64
+ .max(40)
65
+ .optional(),
66
+ comparison: z
67
+ .strictObject({
68
+ parent: studioId,
69
+ verdict: z.enum(['improved', 'unchanged', 'worse']),
70
+ evidence: z.string().min(1).max(4000),
71
+ })
72
+ .optional(),
73
+ });
74
+ export const productionRequestSchema = z.discriminatedUnion('action', [
75
+ z.strictObject({ action: z.literal('plan'), plan: productionPlanSchema }),
76
+ z.strictObject({ action: z.literal('status'), session: studioId }),
77
+ z.strictObject({
78
+ action: z.literal('study'),
79
+ session: studioId,
80
+ reference: referenceStudySchema,
81
+ }),
82
+ z.strictObject({
83
+ action: z.literal('capture'),
84
+ session: studioId,
85
+ candidate: studioId,
86
+ expected_hash: z.string(),
87
+ notes: z.string().max(4000).default(''),
88
+ revision: z
89
+ .strictObject({ parent: studioId, hypothesis: z.string().min(1).max(4000) })
90
+ .optional(),
91
+ crops: z.array(boundsSchema).max(8).default([]),
92
+ }),
93
+ z.strictObject({ action: z.literal('review'), session: studioId, review: candidateReviewSchema }),
94
+ z.strictObject({ action: z.literal('compare'), session: studioId }),
95
+ z.strictObject({
96
+ action: z.literal('select'),
97
+ session: studioId,
98
+ candidate: studioId,
99
+ expected_hash: z.string(),
100
+ }),
101
+ z.strictObject({ action: z.literal('advance'), session: studioId, expected_hash: z.string() }),
102
+ ]);
103
+ /** Explicit stage gates. Visual ratings are supplied by an observer, never inferred from technical tests. */
104
+ export async function production(project, raw) {
105
+ const request = productionRequestSchema.parse(raw), id = request.action === 'plan' ? request.plan.id : request.session;
106
+ const file = await studioDirectory(project, 'sessions', id, 'session.json'), dir = join(file, '..');
107
+ const lock = await open(file + '.lock', 'wx').catch(() => {
108
+ throw new Error('Production session is busy');
109
+ });
110
+ try {
111
+ let state;
112
+ try {
113
+ state = JSON.parse(await readFile(file, 'utf8'));
114
+ }
115
+ catch (e) {
116
+ if (e.code !== 'ENOENT')
117
+ throw e;
118
+ if (request.action !== 'plan')
119
+ throw new Error('Unknown production session');
120
+ state = {
121
+ version: 1,
122
+ plan: request.plan,
123
+ stage: 0,
124
+ complete: false,
125
+ candidates: [],
126
+ selected: {},
127
+ };
128
+ await writeArtifact(file, canonical(state));
129
+ return state;
130
+ }
131
+ if (request.action === 'plan')
132
+ throw new Error('Production plan already exists; use a new ID for a changed brief');
133
+ const stage = state.plan.stages[state.stage];
134
+ const gateReasons = (c) => {
135
+ const reasons = [];
136
+ if (c.technical.status !== 'pass')
137
+ reasons.push('Technical verification failed');
138
+ if (!c.review)
139
+ reasons.push('Visual review required');
140
+ else {
141
+ if (c.review.fidelity < stage.minimum_fidelity)
142
+ reasons.push('Brief fidelity below the stage threshold');
143
+ if (c.review.quality < stage.minimum_quality)
144
+ reasons.push('Artistic quality below the stage threshold');
145
+ if (!stage.criteria.every((k) => c.review.criteria.find((v) => v.id === k.id)?.pass))
146
+ reasons.push('Failed stage criteria');
147
+ }
148
+ if (stage.require_references && !state.plan.references?.length)
149
+ reasons.push('Reference study required');
150
+ const alternatives = state.candidates.filter((v) => v.stage === stage.id && !v.revision);
151
+ if (new Set(alternatives.map((v) => v.png_hash)).size < (stage.minimum_alternatives ?? 1))
152
+ reasons.push('More distinct initial alternatives required');
153
+ if (stage.required_reviewer === 'human' && c.review?.method !== 'human')
154
+ reasons.push('Human review required');
155
+ if (c.review?.issues?.some((i) => i.severity === 'blocking'))
156
+ reasons.push('Unresolved blocking issues');
157
+ if (c.revision && c.review?.comparison?.verdict !== 'improved')
158
+ reasons.push('Revision must visibly improve its parent');
159
+ return reasons;
160
+ };
161
+ const eligible = (c) => gateReasons(c).length === 0;
162
+ if (request.action === 'status')
163
+ return {
164
+ ...state,
165
+ readiness: state.candidates
166
+ .filter((c) => c.stage === stage.id)
167
+ .map((c) => ({
168
+ candidate: c.id,
169
+ eligible: Boolean(eligible(c)),
170
+ blockers: gateReasons(c),
171
+ })),
172
+ };
173
+ const readCandidate = async (c) => {
174
+ const scene = parseScene(JSON.parse(await readFile(join(dir, c.id, 'scene.json'), 'utf8'))), png = await readFile(join(dir, c.id, 'image.png'));
175
+ if (sceneHash(scene) !== c.scene_hash || sha256(png) !== c.png_hash)
176
+ throw new Error('Candidate artifact hash mismatch');
177
+ return { scene, png };
178
+ };
179
+ if (request.action === 'study') {
180
+ if (state.complete)
181
+ throw new Error('Production session is complete');
182
+ if ((state.plan.references?.length ?? 0) >= 24 ||
183
+ state.plan.references?.some((r) => r.id === request.reference.id))
184
+ throw new Error('Reference IDs must be unique, with at most 24 studies');
185
+ state.plan.references = [...(state.plan.references ?? []), request.reference];
186
+ }
187
+ else if (request.action === 'capture') {
188
+ if (state.complete)
189
+ throw new Error('Production session is complete');
190
+ if (state.candidates.length >= 64)
191
+ throw new Error('Production session supports at most 64 candidates');
192
+ if (state.candidates.some((c) => c.id === request.candidate))
193
+ throw new Error('Candidate IDs are immutable');
194
+ if (request.revision) {
195
+ const parent = state.candidates.find((c) => c.id === request.revision.parent && c.stage === stage.id);
196
+ if (!parent)
197
+ throw new Error('Revision parent must belong to the active stage');
198
+ await readCandidate(parent);
199
+ }
200
+ const scene = await project.scene(), hash = sceneHash(scene);
201
+ if (hash !== request.expected_hash)
202
+ throw new Error('Stale scene hash');
203
+ const render = await project.renderer.render(scene, project.root, { cache: false });
204
+ const report = await verifyRendered(scene, project.root, project.renderer, render);
205
+ const path = join(dir, request.candidate);
206
+ // Validate all requested crops before writing any candidate artifacts.
207
+ for (const [x, y, w, h] of request.crops)
208
+ if (![x, y, w, h].every(Number.isInteger) ||
209
+ x < 0 ||
210
+ y < 0 ||
211
+ w < 1 ||
212
+ h < 1 ||
213
+ x + w > render.width ||
214
+ y + h > render.height)
215
+ throw new Error('Candidate crop must be integer pixels inside the canvas');
216
+ await writeArtifact(join(path, 'scene.json'), canonical(scene));
217
+ await writeArtifact(join(path, 'image.png'), render.png);
218
+ await writeArtifact(join(path, 'thumbnail.png'), await sharp(render.png).resize({ width: 480, height: 320, fit: 'inside' }).png().toBuffer());
219
+ for (const [i, [left, top, width, height]] of request.crops.entries())
220
+ await writeArtifact(join(path, `detail-${i + 1}.png`), await sharp(render.png).extract({ left, top, width, height }).png().toBuffer());
221
+ await writeArtifact(join(path, 'technical.json'), canonical(report));
222
+ state.candidates.push({
223
+ id: request.candidate,
224
+ stage: stage.id,
225
+ scene_hash: hash,
226
+ png_hash: sha256(render.png),
227
+ technical: { status: report.status, rule_count: scene.verification.rules.length },
228
+ notes: request.notes,
229
+ ...(request.revision ? { revision: request.revision } : {}),
230
+ });
231
+ }
232
+ else if (request.action === 'review') {
233
+ const c = state.candidates.find((c) => c.id === request.review.candidate);
234
+ if (!c || c.stage !== stage.id || state.complete)
235
+ throw new Error('Review must address a candidate of the active stage');
236
+ await readCandidate(c);
237
+ if (c.scene_hash !== request.review.scene_hash || c.png_hash !== request.review.png_hash)
238
+ throw new Error('Stale candidate review');
239
+ const keys = request.review.criteria.map((c) => c.id);
240
+ if (keys.length !== stage.criteria.length ||
241
+ new Set(keys).size !== keys.length ||
242
+ stage.criteria.some((c) => !keys.includes(c.id)))
243
+ throw new Error('Review must address every stage criterion exactly once');
244
+ if (request.review.issues?.some((i) => !stage.criteria.some((k) => k.id === i.criterion)))
245
+ throw new Error('Issue refers to unknown criterion');
246
+ if (request.review.issues?.some((i) => i.severity === 'blocking' &&
247
+ request.review.criteria.find((k) => k.id === i.criterion)?.pass))
248
+ throw new Error('A blocking issue cannot have a passing criterion');
249
+ if (c.revision && request.review.comparison?.parent !== c.revision.parent)
250
+ throw new Error('Revision review must compare its declared parent');
251
+ if (!c.revision && request.review.comparison)
252
+ throw new Error('Comparison requires a captured revision');
253
+ c.review_history = [...(c.review_history ?? (c.review ? [c.review] : [])), request.review];
254
+ c.review = request.review;
255
+ }
256
+ else if (request.action === 'compare') {
257
+ const candidates = state.candidates.filter((c) => c.stage === stage.id);
258
+ if (!candidates.length)
259
+ throw new Error('No candidates to compare');
260
+ const sheet = createCanvas(960, Math.ceil(candidates.length / 2) * 360), ctx = sheet.getContext('2d');
261
+ ctx.fillStyle = '#202329';
262
+ ctx.fillRect(0, 0, sheet.width, sheet.height);
263
+ for (const [i, c] of candidates.entries()) {
264
+ const { png } = await readCandidate(c), thumb = await sharp(png)
265
+ .resize({ width: 464, height: 316, fit: 'inside' })
266
+ .png()
267
+ .toBuffer(), im = await loadImage(thumb), x = (i % 2) * 480 + 8, y = Math.floor(i / 2) * 360 + 8;
268
+ ctx.drawImage(im, x + (464 - im.width) / 2, y + (316 - im.height) / 2);
269
+ ctx.fillStyle = '#eeeeee';
270
+ ctx.font = '16px Rtistree-inter';
271
+ ctx.fillText(`${c.id} · ${eligible(c) ? 'eligible' : c.review ? 'needs work' : 'unreviewed'}`, x, y + 340);
272
+ }
273
+ const path = join(dir, `${stage.id}-comparison.png`);
274
+ await writeArtifact(path, sheet.toBuffer('image/png'));
275
+ return {
276
+ image: path,
277
+ stage,
278
+ ranked: candidates
279
+ .slice()
280
+ .sort((a, b) => Number(Boolean(eligible(b))) - Number(Boolean(eligible(a))) ||
281
+ (b.review?.quality ?? -1) - (a.review?.quality ?? -1) ||
282
+ (b.review?.fidelity ?? -1) - (a.review?.fidelity ?? -1)),
283
+ selected: state.selected[stage.id] ?? null,
284
+ gates: candidates.map((c) => ({
285
+ candidate: c.id,
286
+ eligible: Boolean(eligible(c)),
287
+ blockers: gateReasons(c),
288
+ })),
289
+ };
290
+ }
291
+ else if (request.action === 'select') {
292
+ if (state.complete)
293
+ throw new Error('Production session is complete');
294
+ const c = state.candidates.find((c) => c.id === request.candidate && c.stage === stage.id);
295
+ if (!c || !eligible(c))
296
+ throw new Error('Candidate has not passed technical, brief and stage quality gates' +
297
+ (c ? ': ' + gateReasons(c).join('; ') : ''));
298
+ const old = state.candidates.find((c) => c.id === state.selected[stage.id]);
299
+ if (old?.review &&
300
+ (c.review.quality < old.review.quality || c.review.fidelity < old.review.fidelity))
301
+ throw new Error('Candidate regresses against the selected alternative');
302
+ const { scene, png } = await readCandidate(c);
303
+ const check = await project.renderer.render(scene, project.root, { cache: false });
304
+ if (!check.png.equals(png))
305
+ throw new Error('Candidate no longer reproduces');
306
+ await project.apply({
307
+ expected_hash: request.expected_hash,
308
+ reason: `Select ${id}/${c.id} for ${stage.id}`,
309
+ commands: [{ type: 'restoreScene', scene }],
310
+ });
311
+ state.selected[stage.id] = c.id;
312
+ }
313
+ else if (request.action === 'advance') {
314
+ if (state.complete)
315
+ throw new Error('Production session is already complete');
316
+ const c = state.candidates.find((c) => c.id === state.selected[stage.id]);
317
+ if (!c || !eligible(c))
318
+ throw new Error('Select an eligible candidate before advancing');
319
+ const current = sceneHash(await project.scene());
320
+ if (current !== request.expected_hash || current !== c.scene_hash)
321
+ throw new Error('Selected candidate must still be the current scene');
322
+ if (state.stage === state.plan.stages.length - 1)
323
+ state.complete = true;
324
+ else
325
+ state.stage++;
326
+ }
327
+ await writeArtifact(file, canonical(state));
328
+ return { ...state, directory: dir };
329
+ }
330
+ finally {
331
+ await lock.close();
332
+ await unlink(file + '.lock');
333
+ }
334
+ }
335
+ //# sourceMappingURL=production-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production-workflow.js","sourceRoot":"","sources":["../src/production-workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { parentPort, workerData } from 'node:worker_threads';
2
+ import { Script, createContext } from 'node:vm';
3
+ import { createCanvas, loadImage } from './native.js';
4
+ import { createRasterStudio } from './raster-studio.js';
5
+ import { registerFonts } from './assets.js';
6
+ try {
7
+ const { source, width, height, seed, parameters, inputs, timeout_ms } = workerData;
8
+ await registerFonts();
9
+ const images = Object.create(null);
10
+ for (const [name, bytes] of Object.entries(inputs)) {
11
+ const image = await loadImage(Buffer.from(bytes)), c = createCanvas(image.width, image.height);
12
+ c.getContext('2d').drawImage(image, 0, 0);
13
+ images[name] = c;
14
+ }
15
+ const art = createRasterStudio(width, height, seed, images);
16
+ // Convenience isolation, NOT a security sandbox: native objects expose host methods.
17
+ const context = createContext({ art, parameters, Date: undefined, performance: undefined }, { codeGeneration: { strings: false, wasm: false } });
18
+ new Script('Math.random = art.random; Object.freeze(Math);').runInContext(context);
19
+ const result = new Script(`(function(art, parameters) { "use strict";\n${source}\n})(art, parameters)`, { filename: 'raster-program.js' }).runInContext(context, { timeout: timeout_ms });
20
+ if (!result ||
21
+ result.width !== width ||
22
+ result.height !== height ||
23
+ typeof result.toBuffer !== 'function')
24
+ throw new Error('Program must return a Canvas with the declared dimensions');
25
+ const png = result.toBuffer('image/png');
26
+ parentPort.postMessage({ png });
27
+ }
28
+ catch (error) {
29
+ parentPort.postMessage({ error: error instanceof Error ? error.message : String(error) });
30
+ }
31
+ //# sourceMappingURL=program-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program-worker.js","sourceRoot":"","sources":["../src/program-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,IAAI,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;IACnF,MAAM,aAAa,EAAE,CAAC;IACtB,MAAM,MAAM,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC,EAC7D,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,qFAAqF;IACrF,MAAM,OAAO,GAAG,aAAa,CAC3B,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,EAC5D,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CACpD,CAAC;IACF,IAAI,MAAM,CAAC,gDAAgD,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,+CAA+C,MAAM,uBAAuB,EAC5E,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAClC,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,IACE,CAAC,MAAM;QACP,MAAM,CAAC,KAAK,KAAK,KAAK;QACtB,MAAM,CAAC,MAAM,KAAK,MAAM;QACxB,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;QAErC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,UAAW,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,UAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC7F,CAAC"}