@jokerized/decksmith 0.1.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 (78) hide show
  1. package/README.md +794 -0
  2. package/dist/cli.js +8906 -0
  3. package/dist/deck-runtime.js +55 -0
  4. package/dist/index.js +8590 -0
  5. package/dist/mcp.js +7809 -0
  6. package/dist/server/errors.js +73 -0
  7. package/dist/server/http.js +504 -0
  8. package/dist/server/main.js +91 -0
  9. package/dist/server/options.js +198 -0
  10. package/dist/server/pipeline.js +356 -0
  11. package/dist/server/queue.js +195 -0
  12. package/dist/server/ui.js +1614 -0
  13. package/dist/server/upload.js +232 -0
  14. package/dist/types/cli.d.ts +1 -0
  15. package/dist/types/deck/runtime.d.ts +59 -0
  16. package/dist/types/deck/subtitles.d.ts +101 -0
  17. package/dist/types/emit/archetypes/annotated-figure.d.ts +103 -0
  18. package/dist/types/emit/archetypes/bar-compare.d.ts +30 -0
  19. package/dist/types/emit/archetypes/callout.d.ts +7 -0
  20. package/dist/types/emit/archetypes/claim-figure.d.ts +9 -0
  21. package/dist/types/emit/archetypes/data-table.d.ts +21 -0
  22. package/dist/types/emit/archetypes/equation-walk.d.ts +2 -0
  23. package/dist/types/emit/archetypes/grid.d.ts +16 -0
  24. package/dist/types/emit/archetypes/index.d.ts +19 -0
  25. package/dist/types/emit/archetypes/line-chart.d.ts +22 -0
  26. package/dist/types/emit/archetypes/pipeline.d.ts +81 -0
  27. package/dist/types/emit/archetypes/split-compare.d.ts +2 -0
  28. package/dist/types/emit/archetypes/stack.d.ts +93 -0
  29. package/dist/types/emit/archetypes/title.d.ts +188 -0
  30. package/dist/types/emit/camera.d.ts +397 -0
  31. package/dist/types/emit/composition.d.ts +191 -0
  32. package/dist/types/emit/island.d.ts +19 -0
  33. package/dist/types/emit/kit.d.ts +256 -0
  34. package/dist/types/emit/svg.d.ts +177 -0
  35. package/dist/types/emit/theme.d.ts +65 -0
  36. package/dist/types/emit/themes/index.d.ts +40 -0
  37. package/dist/types/emit/themes/ink.d.ts +12 -0
  38. package/dist/types/emit/themes/mono.d.ts +20 -0
  39. package/dist/types/emit/themes/paper.d.ts +18 -0
  40. package/dist/types/index.d.ts +200 -0
  41. package/dist/types/mcp/main.d.ts +2 -0
  42. package/dist/types/mcp/prereqs.d.ts +22 -0
  43. package/dist/types/mcp/tools.d.ts +212 -0
  44. package/dist/types/narrate/narrate.d.ts +87 -0
  45. package/dist/types/narrate/tts.d.ts +134 -0
  46. package/dist/types/narrate/voices.d.ts +29 -0
  47. package/dist/types/pack/media.d.ts +61 -0
  48. package/dist/types/pack/pack.d.ts +16 -0
  49. package/dist/types/plan/codex.d.ts +24 -0
  50. package/dist/types/plan/duration.d.ts +394 -0
  51. package/dist/types/plan/prompt.d.ts +47 -0
  52. package/dist/types/plan/refs.d.ts +22 -0
  53. package/dist/types/plan/select.d.ts +116 -0
  54. package/dist/types/prefs.d.ts +43 -0
  55. package/dist/types/render/captions.d.ts +108 -0
  56. package/dist/types/render/ffmpeg.d.ts +129 -0
  57. package/dist/types/render/render.d.ts +123 -0
  58. package/dist/types/render/timing.d.ts +290 -0
  59. package/dist/types/server/errors.d.ts +11 -0
  60. package/dist/types/server/http.d.ts +57 -0
  61. package/dist/types/server/main.d.ts +1 -0
  62. package/dist/types/server/options.d.ts +90 -0
  63. package/dist/types/server/pipeline.d.ts +21 -0
  64. package/dist/types/server/queue.d.ts +105 -0
  65. package/dist/types/server/ui.d.ts +9 -0
  66. package/dist/types/server/upload.d.ts +107 -0
  67. package/dist/types/source/assets.d.ts +11 -0
  68. package/dist/types/source/fonts.d.ts +15 -0
  69. package/dist/types/source/markdown.d.ts +8 -0
  70. package/dist/types/types.d.ts +1992 -0
  71. package/dist/types/verify/budget.d.ts +41 -0
  72. package/dist/types/verify/check.d.ts +78 -0
  73. package/dist/types/verify/drift.d.ts +158 -0
  74. package/dist/types/verify/fidelity.d.ts +247 -0
  75. package/dist/types/verify/index.d.ts +207 -0
  76. package/dist/types/verify/overprint.d.ts +133 -0
  77. package/dist/types/verify/typefloor.d.ts +50 -0
  78. package/package.json +84 -0
@@ -0,0 +1,1992 @@
1
+ /**
2
+ * The contract every layer builds against.
3
+ *
4
+ * Two objects matter. `Source` is what ingestion produces: the document's
5
+ * structure with every asset addressable by id. `Storyboard` is what planning
6
+ * produces: an ordered list of beats, each accountable to something in the
7
+ * Source. Everything downstream is a projection of the Storyboard.
8
+ *
9
+ * The Storyboard describes pedagogy, not geometry. It carries no canvas size,
10
+ * no colours, no coordinates — those are decisions `emit` makes per format, so
11
+ * one storyboard can render as a 16:9 deck and a 9:16 short without replanning.
12
+ */
13
+ import { z } from "zod";
14
+ /** A pointer back into the Source. Provenance is what makes a beat checkable. */
15
+ export declare const refSchema: z.ZodObject<{
16
+ kind: z.ZodEnum<{
17
+ figure: "figure";
18
+ equation: "equation";
19
+ table: "table";
20
+ section: "section";
21
+ }>;
22
+ id: z.ZodString;
23
+ }, z.core.$strip>;
24
+ export declare const figureSchema: z.ZodObject<{
25
+ id: z.ZodString;
26
+ src: z.ZodString;
27
+ caption: z.ZodString;
28
+ width: z.ZodInt;
29
+ height: z.ZodInt;
30
+ }, z.core.$strip>;
31
+ export declare const equationSchema: z.ZodObject<{
32
+ id: z.ZodString;
33
+ tex: z.ZodString;
34
+ display: z.ZodBoolean;
35
+ }, z.core.$strip>;
36
+ export declare const tableSchema: z.ZodObject<{
37
+ id: z.ZodString;
38
+ caption: z.ZodOptional<z.ZodString>;
39
+ columns: z.ZodArray<z.ZodString>;
40
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
41
+ }, z.core.$strip>;
42
+ export declare const sectionSchema: z.ZodObject<{
43
+ id: z.ZodString;
44
+ depth: z.ZodInt;
45
+ heading: z.ZodString;
46
+ text: z.ZodString;
47
+ }, z.core.$strip>;
48
+ export declare const sourceSchema: z.ZodObject<{
49
+ id: z.ZodString;
50
+ title: z.ZodString;
51
+ lang: z.ZodDefault<z.ZodString>;
52
+ sections: z.ZodArray<z.ZodObject<{
53
+ id: z.ZodString;
54
+ depth: z.ZodInt;
55
+ heading: z.ZodString;
56
+ text: z.ZodString;
57
+ }, z.core.$strip>>;
58
+ figures: z.ZodArray<z.ZodObject<{
59
+ id: z.ZodString;
60
+ src: z.ZodString;
61
+ caption: z.ZodString;
62
+ width: z.ZodInt;
63
+ height: z.ZodInt;
64
+ }, z.core.$strip>>;
65
+ equations: z.ZodArray<z.ZodObject<{
66
+ id: z.ZodString;
67
+ tex: z.ZodString;
68
+ display: z.ZodBoolean;
69
+ }, z.core.$strip>>;
70
+ tables: z.ZodArray<z.ZodObject<{
71
+ id: z.ZodString;
72
+ caption: z.ZodOptional<z.ZodString>;
73
+ columns: z.ZodArray<z.ZodString>;
74
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
75
+ }, z.core.$strip>>;
76
+ }, z.core.$strip>;
77
+ /**
78
+ * The explanatory vocabulary. Each archetype is one way of making a point, and
79
+ * maps to exactly one emitter. Adding a domain means adding archetypes here and
80
+ * an emitter beside it — nothing else in the pipeline learns about the domain.
81
+ *
82
+ * These six came out of hand-building a real deck (EXPERIMENT-002), not from
83
+ * guessing at what might be useful.
84
+ */
85
+ /** One symbol in an equation, highlighted while it is explained. */
86
+ export declare const termSchema: z.ZodObject<{
87
+ tex: z.ZodString;
88
+ label: z.ZodString;
89
+ tone: z.ZodEnum<{
90
+ a: "a";
91
+ b: "b";
92
+ c: "c";
93
+ d: "d";
94
+ }>;
95
+ }, z.core.$strip>;
96
+ export declare const titleParamsSchema: z.ZodObject<{
97
+ eyebrow: z.ZodOptional<z.ZodString>;
98
+ headline: z.ZodString;
99
+ sub: z.ZodOptional<z.ZodString>;
100
+ }, z.core.$strip>;
101
+ export declare const claimFigureParamsSchema: z.ZodObject<{
102
+ eyebrow: z.ZodOptional<z.ZodString>;
103
+ headline: z.ZodString;
104
+ claim: z.ZodString;
105
+ figureId: z.ZodString;
106
+ }, z.core.$strip>;
107
+ export declare const equationWalkParamsSchema: z.ZodObject<{
108
+ eyebrow: z.ZodOptional<z.ZodString>;
109
+ headline: z.ZodString;
110
+ equationId: z.ZodString;
111
+ terms: z.ZodArray<z.ZodObject<{
112
+ tex: z.ZodString;
113
+ label: z.ZodString;
114
+ tone: z.ZodEnum<{
115
+ a: "a";
116
+ b: "b";
117
+ c: "c";
118
+ d: "d";
119
+ }>;
120
+ }, z.core.$strip>>;
121
+ }, z.core.$strip>;
122
+ export declare const dataTableParamsSchema: z.ZodObject<{
123
+ eyebrow: z.ZodOptional<z.ZodString>;
124
+ headline: z.ZodString;
125
+ tableId: z.ZodString;
126
+ highlight: z.ZodArray<z.ZodObject<{
127
+ row: z.ZodString;
128
+ tone: z.ZodEnum<{
129
+ a: "a";
130
+ b: "b";
131
+ c: "c";
132
+ d: "d";
133
+ }>;
134
+ }, z.core.$strip>>;
135
+ note: z.ZodOptional<z.ZodString>;
136
+ }, z.core.$strip>;
137
+ export declare const lineChartParamsSchema: z.ZodObject<{
138
+ eyebrow: z.ZodOptional<z.ZodString>;
139
+ headline: z.ZodString;
140
+ xLabel: z.ZodString;
141
+ yLabel: z.ZodString;
142
+ points: z.ZodArray<z.ZodObject<{
143
+ x: z.ZodString;
144
+ y: z.ZodNumber;
145
+ }, z.core.$strip>>;
146
+ deltas: z.ZodOptional<z.ZodArray<z.ZodString>>;
147
+ readout: z.ZodOptional<z.ZodString>;
148
+ }, z.core.$strip>;
149
+ export declare const calloutParamsSchema: z.ZodObject<{
150
+ eyebrow: z.ZodOptional<z.ZodString>;
151
+ headline: z.ZodString;
152
+ panels: z.ZodArray<z.ZodObject<{
153
+ label: z.ZodString;
154
+ lines: z.ZodArray<z.ZodString>;
155
+ }, z.core.$strip>>;
156
+ note: z.ZodOptional<z.ZodString>;
157
+ }, z.core.$strip>;
158
+ /** A labelled stage in a flow. */
159
+ export declare const stageSchema: z.ZodObject<{
160
+ label: z.ZodString;
161
+ note: z.ZodOptional<z.ZodString>;
162
+ tone: z.ZodOptional<z.ZodEnum<{
163
+ a: "a";
164
+ b: "b";
165
+ c: "c";
166
+ d: "d";
167
+ }>>;
168
+ }, z.core.$strip>;
169
+ export declare const pipelineParamsSchema: z.ZodObject<{
170
+ eyebrow: z.ZodOptional<z.ZodString>;
171
+ headline: z.ZodString;
172
+ stages: z.ZodArray<z.ZodObject<{
173
+ label: z.ZodString;
174
+ note: z.ZodOptional<z.ZodString>;
175
+ tone: z.ZodOptional<z.ZodEnum<{
176
+ a: "a";
177
+ b: "b";
178
+ c: "c";
179
+ d: "d";
180
+ }>>;
181
+ }, z.core.$strip>>;
182
+ loop: z.ZodOptional<z.ZodObject<{
183
+ from: z.ZodOptional<z.ZodInt>;
184
+ to: z.ZodInt;
185
+ label: z.ZodString;
186
+ }, z.core.$strip>>;
187
+ note: z.ZodOptional<z.ZodString>;
188
+ }, z.core.$strip>;
189
+ export declare const annotatedFigureParamsSchema: z.ZodObject<{
190
+ eyebrow: z.ZodOptional<z.ZodString>;
191
+ headline: z.ZodString;
192
+ figureId: z.ZodString;
193
+ crop: z.ZodOptional<z.ZodObject<{
194
+ x: z.ZodNumber;
195
+ y: z.ZodNumber;
196
+ w: z.ZodNumber;
197
+ h: z.ZodNumber;
198
+ }, z.core.$strip>>;
199
+ notes: z.ZodArray<z.ZodObject<{
200
+ x: z.ZodNumber;
201
+ y: z.ZodNumber;
202
+ text: z.ZodString;
203
+ tone: z.ZodOptional<z.ZodEnum<{
204
+ a: "a";
205
+ b: "b";
206
+ c: "c";
207
+ d: "d";
208
+ }>>;
209
+ }, z.core.$strip>>;
210
+ }, z.core.$strip>;
211
+ export declare const gridParamsSchema: z.ZodObject<{
212
+ eyebrow: z.ZodOptional<z.ZodString>;
213
+ headline: z.ZodString;
214
+ cols: z.ZodInt;
215
+ rows: z.ZodInt;
216
+ regions: z.ZodArray<z.ZodObject<{
217
+ x: z.ZodInt;
218
+ y: z.ZodInt;
219
+ w: z.ZodInt;
220
+ h: z.ZodInt;
221
+ label: z.ZodString;
222
+ tone: z.ZodEnum<{
223
+ a: "a";
224
+ b: "b";
225
+ c: "c";
226
+ d: "d";
227
+ }>;
228
+ }, z.core.$strip>>;
229
+ note: z.ZodOptional<z.ZodString>;
230
+ }, z.core.$strip>;
231
+ export declare const barCompareParamsSchema: z.ZodObject<{
232
+ eyebrow: z.ZodOptional<z.ZodString>;
233
+ headline: z.ZodString;
234
+ unit: z.ZodOptional<z.ZodString>;
235
+ bars: z.ZodArray<z.ZodObject<{
236
+ label: z.ZodString;
237
+ value: z.ZodNumber;
238
+ tone: z.ZodOptional<z.ZodEnum<{
239
+ a: "a";
240
+ b: "b";
241
+ c: "c";
242
+ d: "d";
243
+ }>>;
244
+ }, z.core.$strip>>;
245
+ note: z.ZodOptional<z.ZodString>;
246
+ }, z.core.$strip>;
247
+ export declare const stackParamsSchema: z.ZodObject<{
248
+ eyebrow: z.ZodOptional<z.ZodString>;
249
+ headline: z.ZodString;
250
+ layers: z.ZodArray<z.ZodObject<{
251
+ label: z.ZodString;
252
+ note: z.ZodOptional<z.ZodString>;
253
+ }, z.core.$strip>>;
254
+ note: z.ZodOptional<z.ZodString>;
255
+ }, z.core.$strip>;
256
+ export declare const splitCompareParamsSchema: z.ZodObject<{
257
+ eyebrow: z.ZodOptional<z.ZodString>;
258
+ headline: z.ZodString;
259
+ left: z.ZodObject<{
260
+ label: z.ZodString;
261
+ figureId: z.ZodOptional<z.ZodString>;
262
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
263
+ }, z.core.$strip>;
264
+ right: z.ZodObject<{
265
+ label: z.ZodString;
266
+ figureId: z.ZodOptional<z.ZodString>;
267
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
268
+ }, z.core.$strip>;
269
+ note: z.ZodOptional<z.ZodString>;
270
+ }, z.core.$strip>;
271
+ /**
272
+ * "This beat happens inside that part of the beat before it."
273
+ *
274
+ * The one field the canvas investigation endorsed, and the only one. A camera
275
+ * move between two beats reads as continuity — rather than as a fancier cut —
276
+ * exactly when the source supplies a containment or adjacency relation between
277
+ * them; the camera renders a relation, it never creates one. Counted honestly
278
+ * over the twelve-beat demo, two or three of eleven transitions have one, which
279
+ * is why this is optional and off by default rather than an infinite canvas.
280
+ *
281
+ * `element` names a part of the containing beat's own drawing, by the suffix
282
+ * `src/emit/svg.ts`'s `id(sid, part, i)` gives it: a pipeline's third stage is
283
+ * `stage2`, a grid's first region is `rgn0`. The shell resolves it against the
284
+ * containing scene and refuses to emit a camera at a part that beat did not
285
+ * draw, so a wrong name is a build error rather than a camera that lands on
286
+ * nothing.
287
+ */
288
+ export declare const insideSchema: z.ZodObject<{
289
+ beat: z.ZodString;
290
+ element: z.ZodString;
291
+ }, z.core.$strip>;
292
+ export declare const beatSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
293
+ narration: z.ZodOptional<z.ZodString>;
294
+ archetype: z.ZodLiteral<"title">;
295
+ params: z.ZodObject<{
296
+ eyebrow: z.ZodOptional<z.ZodString>;
297
+ headline: z.ZodString;
298
+ sub: z.ZodOptional<z.ZodString>;
299
+ }, z.core.$strip>;
300
+ id: z.ZodString;
301
+ intent: z.ZodString;
302
+ inside: z.ZodOptional<z.ZodObject<{
303
+ beat: z.ZodString;
304
+ element: z.ZodString;
305
+ }, z.core.$strip>>;
306
+ claim: z.ZodOptional<z.ZodString>;
307
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
308
+ kind: z.ZodEnum<{
309
+ figure: "figure";
310
+ equation: "equation";
311
+ table: "table";
312
+ section: "section";
313
+ }>;
314
+ id: z.ZodString;
315
+ }, z.core.$strip>>>;
316
+ weight: z.ZodDefault<z.ZodNumber>;
317
+ seconds: z.ZodDefault<z.ZodNumber>;
318
+ }, z.core.$strip>, z.ZodObject<{
319
+ narration: z.ZodOptional<z.ZodString>;
320
+ archetype: z.ZodLiteral<"claim-figure">;
321
+ params: z.ZodObject<{
322
+ eyebrow: z.ZodOptional<z.ZodString>;
323
+ headline: z.ZodString;
324
+ claim: z.ZodString;
325
+ figureId: z.ZodString;
326
+ }, z.core.$strip>;
327
+ id: z.ZodString;
328
+ intent: z.ZodString;
329
+ inside: z.ZodOptional<z.ZodObject<{
330
+ beat: z.ZodString;
331
+ element: z.ZodString;
332
+ }, z.core.$strip>>;
333
+ claim: z.ZodOptional<z.ZodString>;
334
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
335
+ kind: z.ZodEnum<{
336
+ figure: "figure";
337
+ equation: "equation";
338
+ table: "table";
339
+ section: "section";
340
+ }>;
341
+ id: z.ZodString;
342
+ }, z.core.$strip>>>;
343
+ weight: z.ZodDefault<z.ZodNumber>;
344
+ seconds: z.ZodDefault<z.ZodNumber>;
345
+ }, z.core.$strip>, z.ZodObject<{
346
+ narration: z.ZodOptional<z.ZodString>;
347
+ archetype: z.ZodLiteral<"equation-walk">;
348
+ params: z.ZodObject<{
349
+ eyebrow: z.ZodOptional<z.ZodString>;
350
+ headline: z.ZodString;
351
+ equationId: z.ZodString;
352
+ terms: z.ZodArray<z.ZodObject<{
353
+ tex: z.ZodString;
354
+ label: z.ZodString;
355
+ tone: z.ZodEnum<{
356
+ a: "a";
357
+ b: "b";
358
+ c: "c";
359
+ d: "d";
360
+ }>;
361
+ }, z.core.$strip>>;
362
+ }, z.core.$strip>;
363
+ id: z.ZodString;
364
+ intent: z.ZodString;
365
+ inside: z.ZodOptional<z.ZodObject<{
366
+ beat: z.ZodString;
367
+ element: z.ZodString;
368
+ }, z.core.$strip>>;
369
+ claim: z.ZodOptional<z.ZodString>;
370
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
371
+ kind: z.ZodEnum<{
372
+ figure: "figure";
373
+ equation: "equation";
374
+ table: "table";
375
+ section: "section";
376
+ }>;
377
+ id: z.ZodString;
378
+ }, z.core.$strip>>>;
379
+ weight: z.ZodDefault<z.ZodNumber>;
380
+ seconds: z.ZodDefault<z.ZodNumber>;
381
+ }, z.core.$strip>, z.ZodObject<{
382
+ narration: z.ZodOptional<z.ZodString>;
383
+ archetype: z.ZodLiteral<"data-table">;
384
+ params: z.ZodObject<{
385
+ eyebrow: z.ZodOptional<z.ZodString>;
386
+ headline: z.ZodString;
387
+ tableId: z.ZodString;
388
+ highlight: z.ZodArray<z.ZodObject<{
389
+ row: z.ZodString;
390
+ tone: z.ZodEnum<{
391
+ a: "a";
392
+ b: "b";
393
+ c: "c";
394
+ d: "d";
395
+ }>;
396
+ }, z.core.$strip>>;
397
+ note: z.ZodOptional<z.ZodString>;
398
+ }, z.core.$strip>;
399
+ id: z.ZodString;
400
+ intent: z.ZodString;
401
+ inside: z.ZodOptional<z.ZodObject<{
402
+ beat: z.ZodString;
403
+ element: z.ZodString;
404
+ }, z.core.$strip>>;
405
+ claim: z.ZodOptional<z.ZodString>;
406
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
407
+ kind: z.ZodEnum<{
408
+ figure: "figure";
409
+ equation: "equation";
410
+ table: "table";
411
+ section: "section";
412
+ }>;
413
+ id: z.ZodString;
414
+ }, z.core.$strip>>>;
415
+ weight: z.ZodDefault<z.ZodNumber>;
416
+ seconds: z.ZodDefault<z.ZodNumber>;
417
+ }, z.core.$strip>, z.ZodObject<{
418
+ narration: z.ZodOptional<z.ZodString>;
419
+ archetype: z.ZodLiteral<"line-chart">;
420
+ params: z.ZodObject<{
421
+ eyebrow: z.ZodOptional<z.ZodString>;
422
+ headline: z.ZodString;
423
+ xLabel: z.ZodString;
424
+ yLabel: z.ZodString;
425
+ points: z.ZodArray<z.ZodObject<{
426
+ x: z.ZodString;
427
+ y: z.ZodNumber;
428
+ }, z.core.$strip>>;
429
+ deltas: z.ZodOptional<z.ZodArray<z.ZodString>>;
430
+ readout: z.ZodOptional<z.ZodString>;
431
+ }, z.core.$strip>;
432
+ id: z.ZodString;
433
+ intent: z.ZodString;
434
+ inside: z.ZodOptional<z.ZodObject<{
435
+ beat: z.ZodString;
436
+ element: z.ZodString;
437
+ }, z.core.$strip>>;
438
+ claim: z.ZodOptional<z.ZodString>;
439
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
440
+ kind: z.ZodEnum<{
441
+ figure: "figure";
442
+ equation: "equation";
443
+ table: "table";
444
+ section: "section";
445
+ }>;
446
+ id: z.ZodString;
447
+ }, z.core.$strip>>>;
448
+ weight: z.ZodDefault<z.ZodNumber>;
449
+ seconds: z.ZodDefault<z.ZodNumber>;
450
+ }, z.core.$strip>, z.ZodObject<{
451
+ narration: z.ZodOptional<z.ZodString>;
452
+ archetype: z.ZodLiteral<"callout">;
453
+ params: z.ZodObject<{
454
+ eyebrow: z.ZodOptional<z.ZodString>;
455
+ headline: z.ZodString;
456
+ panels: z.ZodArray<z.ZodObject<{
457
+ label: z.ZodString;
458
+ lines: z.ZodArray<z.ZodString>;
459
+ }, z.core.$strip>>;
460
+ note: z.ZodOptional<z.ZodString>;
461
+ }, z.core.$strip>;
462
+ id: z.ZodString;
463
+ intent: z.ZodString;
464
+ inside: z.ZodOptional<z.ZodObject<{
465
+ beat: z.ZodString;
466
+ element: z.ZodString;
467
+ }, z.core.$strip>>;
468
+ claim: z.ZodOptional<z.ZodString>;
469
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
470
+ kind: z.ZodEnum<{
471
+ figure: "figure";
472
+ equation: "equation";
473
+ table: "table";
474
+ section: "section";
475
+ }>;
476
+ id: z.ZodString;
477
+ }, z.core.$strip>>>;
478
+ weight: z.ZodDefault<z.ZodNumber>;
479
+ seconds: z.ZodDefault<z.ZodNumber>;
480
+ }, z.core.$strip>, z.ZodObject<{
481
+ narration: z.ZodOptional<z.ZodString>;
482
+ archetype: z.ZodLiteral<"pipeline">;
483
+ params: z.ZodObject<{
484
+ eyebrow: z.ZodOptional<z.ZodString>;
485
+ headline: z.ZodString;
486
+ stages: z.ZodArray<z.ZodObject<{
487
+ label: z.ZodString;
488
+ note: z.ZodOptional<z.ZodString>;
489
+ tone: z.ZodOptional<z.ZodEnum<{
490
+ a: "a";
491
+ b: "b";
492
+ c: "c";
493
+ d: "d";
494
+ }>>;
495
+ }, z.core.$strip>>;
496
+ loop: z.ZodOptional<z.ZodObject<{
497
+ from: z.ZodOptional<z.ZodInt>;
498
+ to: z.ZodInt;
499
+ label: z.ZodString;
500
+ }, z.core.$strip>>;
501
+ note: z.ZodOptional<z.ZodString>;
502
+ }, z.core.$strip>;
503
+ id: z.ZodString;
504
+ intent: z.ZodString;
505
+ inside: z.ZodOptional<z.ZodObject<{
506
+ beat: z.ZodString;
507
+ element: z.ZodString;
508
+ }, z.core.$strip>>;
509
+ claim: z.ZodOptional<z.ZodString>;
510
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
511
+ kind: z.ZodEnum<{
512
+ figure: "figure";
513
+ equation: "equation";
514
+ table: "table";
515
+ section: "section";
516
+ }>;
517
+ id: z.ZodString;
518
+ }, z.core.$strip>>>;
519
+ weight: z.ZodDefault<z.ZodNumber>;
520
+ seconds: z.ZodDefault<z.ZodNumber>;
521
+ }, z.core.$strip>, z.ZodObject<{
522
+ narration: z.ZodOptional<z.ZodString>;
523
+ archetype: z.ZodLiteral<"annotated-figure">;
524
+ params: z.ZodObject<{
525
+ eyebrow: z.ZodOptional<z.ZodString>;
526
+ headline: z.ZodString;
527
+ figureId: z.ZodString;
528
+ crop: z.ZodOptional<z.ZodObject<{
529
+ x: z.ZodNumber;
530
+ y: z.ZodNumber;
531
+ w: z.ZodNumber;
532
+ h: z.ZodNumber;
533
+ }, z.core.$strip>>;
534
+ notes: z.ZodArray<z.ZodObject<{
535
+ x: z.ZodNumber;
536
+ y: z.ZodNumber;
537
+ text: z.ZodString;
538
+ tone: z.ZodOptional<z.ZodEnum<{
539
+ a: "a";
540
+ b: "b";
541
+ c: "c";
542
+ d: "d";
543
+ }>>;
544
+ }, z.core.$strip>>;
545
+ }, z.core.$strip>;
546
+ id: z.ZodString;
547
+ intent: z.ZodString;
548
+ inside: z.ZodOptional<z.ZodObject<{
549
+ beat: z.ZodString;
550
+ element: z.ZodString;
551
+ }, z.core.$strip>>;
552
+ claim: z.ZodOptional<z.ZodString>;
553
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
554
+ kind: z.ZodEnum<{
555
+ figure: "figure";
556
+ equation: "equation";
557
+ table: "table";
558
+ section: "section";
559
+ }>;
560
+ id: z.ZodString;
561
+ }, z.core.$strip>>>;
562
+ weight: z.ZodDefault<z.ZodNumber>;
563
+ seconds: z.ZodDefault<z.ZodNumber>;
564
+ }, z.core.$strip>, z.ZodObject<{
565
+ narration: z.ZodOptional<z.ZodString>;
566
+ archetype: z.ZodLiteral<"grid">;
567
+ params: z.ZodObject<{
568
+ eyebrow: z.ZodOptional<z.ZodString>;
569
+ headline: z.ZodString;
570
+ cols: z.ZodInt;
571
+ rows: z.ZodInt;
572
+ regions: z.ZodArray<z.ZodObject<{
573
+ x: z.ZodInt;
574
+ y: z.ZodInt;
575
+ w: z.ZodInt;
576
+ h: z.ZodInt;
577
+ label: z.ZodString;
578
+ tone: z.ZodEnum<{
579
+ a: "a";
580
+ b: "b";
581
+ c: "c";
582
+ d: "d";
583
+ }>;
584
+ }, z.core.$strip>>;
585
+ note: z.ZodOptional<z.ZodString>;
586
+ }, z.core.$strip>;
587
+ id: z.ZodString;
588
+ intent: z.ZodString;
589
+ inside: z.ZodOptional<z.ZodObject<{
590
+ beat: z.ZodString;
591
+ element: z.ZodString;
592
+ }, z.core.$strip>>;
593
+ claim: z.ZodOptional<z.ZodString>;
594
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
595
+ kind: z.ZodEnum<{
596
+ figure: "figure";
597
+ equation: "equation";
598
+ table: "table";
599
+ section: "section";
600
+ }>;
601
+ id: z.ZodString;
602
+ }, z.core.$strip>>>;
603
+ weight: z.ZodDefault<z.ZodNumber>;
604
+ seconds: z.ZodDefault<z.ZodNumber>;
605
+ }, z.core.$strip>, z.ZodObject<{
606
+ narration: z.ZodOptional<z.ZodString>;
607
+ archetype: z.ZodLiteral<"bar-compare">;
608
+ params: z.ZodObject<{
609
+ eyebrow: z.ZodOptional<z.ZodString>;
610
+ headline: z.ZodString;
611
+ unit: z.ZodOptional<z.ZodString>;
612
+ bars: z.ZodArray<z.ZodObject<{
613
+ label: z.ZodString;
614
+ value: z.ZodNumber;
615
+ tone: z.ZodOptional<z.ZodEnum<{
616
+ a: "a";
617
+ b: "b";
618
+ c: "c";
619
+ d: "d";
620
+ }>>;
621
+ }, z.core.$strip>>;
622
+ note: z.ZodOptional<z.ZodString>;
623
+ }, z.core.$strip>;
624
+ id: z.ZodString;
625
+ intent: z.ZodString;
626
+ inside: z.ZodOptional<z.ZodObject<{
627
+ beat: z.ZodString;
628
+ element: z.ZodString;
629
+ }, z.core.$strip>>;
630
+ claim: z.ZodOptional<z.ZodString>;
631
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
632
+ kind: z.ZodEnum<{
633
+ figure: "figure";
634
+ equation: "equation";
635
+ table: "table";
636
+ section: "section";
637
+ }>;
638
+ id: z.ZodString;
639
+ }, z.core.$strip>>>;
640
+ weight: z.ZodDefault<z.ZodNumber>;
641
+ seconds: z.ZodDefault<z.ZodNumber>;
642
+ }, z.core.$strip>, z.ZodObject<{
643
+ narration: z.ZodOptional<z.ZodString>;
644
+ archetype: z.ZodLiteral<"stack">;
645
+ params: z.ZodObject<{
646
+ eyebrow: z.ZodOptional<z.ZodString>;
647
+ headline: z.ZodString;
648
+ layers: z.ZodArray<z.ZodObject<{
649
+ label: z.ZodString;
650
+ note: z.ZodOptional<z.ZodString>;
651
+ }, z.core.$strip>>;
652
+ note: z.ZodOptional<z.ZodString>;
653
+ }, z.core.$strip>;
654
+ id: z.ZodString;
655
+ intent: z.ZodString;
656
+ inside: z.ZodOptional<z.ZodObject<{
657
+ beat: z.ZodString;
658
+ element: z.ZodString;
659
+ }, z.core.$strip>>;
660
+ claim: z.ZodOptional<z.ZodString>;
661
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
662
+ kind: z.ZodEnum<{
663
+ figure: "figure";
664
+ equation: "equation";
665
+ table: "table";
666
+ section: "section";
667
+ }>;
668
+ id: z.ZodString;
669
+ }, z.core.$strip>>>;
670
+ weight: z.ZodDefault<z.ZodNumber>;
671
+ seconds: z.ZodDefault<z.ZodNumber>;
672
+ }, z.core.$strip>, z.ZodObject<{
673
+ narration: z.ZodOptional<z.ZodString>;
674
+ archetype: z.ZodLiteral<"split-compare">;
675
+ params: z.ZodObject<{
676
+ eyebrow: z.ZodOptional<z.ZodString>;
677
+ headline: z.ZodString;
678
+ left: z.ZodObject<{
679
+ label: z.ZodString;
680
+ figureId: z.ZodOptional<z.ZodString>;
681
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
682
+ }, z.core.$strip>;
683
+ right: z.ZodObject<{
684
+ label: z.ZodString;
685
+ figureId: z.ZodOptional<z.ZodString>;
686
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
687
+ }, z.core.$strip>;
688
+ note: z.ZodOptional<z.ZodString>;
689
+ }, z.core.$strip>;
690
+ id: z.ZodString;
691
+ intent: z.ZodString;
692
+ inside: z.ZodOptional<z.ZodObject<{
693
+ beat: z.ZodString;
694
+ element: z.ZodString;
695
+ }, z.core.$strip>>;
696
+ claim: z.ZodOptional<z.ZodString>;
697
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
698
+ kind: z.ZodEnum<{
699
+ figure: "figure";
700
+ equation: "equation";
701
+ table: "table";
702
+ section: "section";
703
+ }>;
704
+ id: z.ZodString;
705
+ }, z.core.$strip>>>;
706
+ weight: z.ZodDefault<z.ZodNumber>;
707
+ seconds: z.ZodDefault<z.ZodNumber>;
708
+ }, z.core.$strip>], "archetype">;
709
+ /**
710
+ * Archetypes that draw rather than describe. `verify` warns when a deck leans on
711
+ * the others — a deck of headlines and bullet panels is the thing every slide
712
+ * generator already makes, and is not what this tool is for.
713
+ */
714
+ export declare const DIAGRAMMATIC: ReadonlySet<string>;
715
+ /**
716
+ * The four things a beat can BE, as opposed to the twelve ways it can be drawn.
717
+ *
718
+ * Used by src/plan/select.ts to keep a shortened cut recognisable as the same
719
+ * argument. Coverage has to be checked at this grain and not per-archetype: the
720
+ * demo's twelve beats have twelve distinct archetypes, so "keep one of each
721
+ * archetype" protects the entire deck and cuts nothing, while "keep one of each
722
+ * family" is a rule that can actually bind.
723
+ *
724
+ * - `frame` states or bounds a claim: the title, the assertion over a figure,
725
+ * the caveat at the end. What the deck SAYS.
726
+ * - `structure` shows how something is put together or how two things differ.
727
+ * - `quantity` shows numbers: bars, a curve, a table. The EVIDENCE — and
728
+ * `frame` outnumbers it in most decks, which is why a cut that optimises on
729
+ * weight alone reliably ends up all claim and no proof.
730
+ * - `formal` walks an equation.
731
+ *
732
+ * `claim-figure` sits in `frame`, not `quantity`, even though a figure is on
733
+ * screen: the beat's work is the assertion, and the figure is its illustration.
734
+ */
735
+ export type ArchetypeFamily = "frame" | "structure" | "quantity" | "formal";
736
+ export declare const ARCHETYPE_FAMILY: Readonly<Record<Archetype, ArchetypeFamily>>;
737
+ export declare const storyboardSchema: z.ZodObject<{
738
+ sourceId: z.ZodString;
739
+ title: z.ZodString;
740
+ lang: z.ZodDefault<z.ZodString>;
741
+ theme: z.ZodDefault<z.ZodString>;
742
+ beats: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
743
+ narration: z.ZodOptional<z.ZodString>;
744
+ archetype: z.ZodLiteral<"title">;
745
+ params: z.ZodObject<{
746
+ eyebrow: z.ZodOptional<z.ZodString>;
747
+ headline: z.ZodString;
748
+ sub: z.ZodOptional<z.ZodString>;
749
+ }, z.core.$strip>;
750
+ id: z.ZodString;
751
+ intent: z.ZodString;
752
+ inside: z.ZodOptional<z.ZodObject<{
753
+ beat: z.ZodString;
754
+ element: z.ZodString;
755
+ }, z.core.$strip>>;
756
+ claim: z.ZodOptional<z.ZodString>;
757
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
758
+ kind: z.ZodEnum<{
759
+ figure: "figure";
760
+ equation: "equation";
761
+ table: "table";
762
+ section: "section";
763
+ }>;
764
+ id: z.ZodString;
765
+ }, z.core.$strip>>>;
766
+ weight: z.ZodDefault<z.ZodNumber>;
767
+ seconds: z.ZodDefault<z.ZodNumber>;
768
+ }, z.core.$strip>, z.ZodObject<{
769
+ narration: z.ZodOptional<z.ZodString>;
770
+ archetype: z.ZodLiteral<"claim-figure">;
771
+ params: z.ZodObject<{
772
+ eyebrow: z.ZodOptional<z.ZodString>;
773
+ headline: z.ZodString;
774
+ claim: z.ZodString;
775
+ figureId: z.ZodString;
776
+ }, z.core.$strip>;
777
+ id: z.ZodString;
778
+ intent: z.ZodString;
779
+ inside: z.ZodOptional<z.ZodObject<{
780
+ beat: z.ZodString;
781
+ element: z.ZodString;
782
+ }, z.core.$strip>>;
783
+ claim: z.ZodOptional<z.ZodString>;
784
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
785
+ kind: z.ZodEnum<{
786
+ figure: "figure";
787
+ equation: "equation";
788
+ table: "table";
789
+ section: "section";
790
+ }>;
791
+ id: z.ZodString;
792
+ }, z.core.$strip>>>;
793
+ weight: z.ZodDefault<z.ZodNumber>;
794
+ seconds: z.ZodDefault<z.ZodNumber>;
795
+ }, z.core.$strip>, z.ZodObject<{
796
+ narration: z.ZodOptional<z.ZodString>;
797
+ archetype: z.ZodLiteral<"equation-walk">;
798
+ params: z.ZodObject<{
799
+ eyebrow: z.ZodOptional<z.ZodString>;
800
+ headline: z.ZodString;
801
+ equationId: z.ZodString;
802
+ terms: z.ZodArray<z.ZodObject<{
803
+ tex: z.ZodString;
804
+ label: z.ZodString;
805
+ tone: z.ZodEnum<{
806
+ a: "a";
807
+ b: "b";
808
+ c: "c";
809
+ d: "d";
810
+ }>;
811
+ }, z.core.$strip>>;
812
+ }, z.core.$strip>;
813
+ id: z.ZodString;
814
+ intent: z.ZodString;
815
+ inside: z.ZodOptional<z.ZodObject<{
816
+ beat: z.ZodString;
817
+ element: z.ZodString;
818
+ }, z.core.$strip>>;
819
+ claim: z.ZodOptional<z.ZodString>;
820
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
821
+ kind: z.ZodEnum<{
822
+ figure: "figure";
823
+ equation: "equation";
824
+ table: "table";
825
+ section: "section";
826
+ }>;
827
+ id: z.ZodString;
828
+ }, z.core.$strip>>>;
829
+ weight: z.ZodDefault<z.ZodNumber>;
830
+ seconds: z.ZodDefault<z.ZodNumber>;
831
+ }, z.core.$strip>, z.ZodObject<{
832
+ narration: z.ZodOptional<z.ZodString>;
833
+ archetype: z.ZodLiteral<"data-table">;
834
+ params: z.ZodObject<{
835
+ eyebrow: z.ZodOptional<z.ZodString>;
836
+ headline: z.ZodString;
837
+ tableId: z.ZodString;
838
+ highlight: z.ZodArray<z.ZodObject<{
839
+ row: z.ZodString;
840
+ tone: z.ZodEnum<{
841
+ a: "a";
842
+ b: "b";
843
+ c: "c";
844
+ d: "d";
845
+ }>;
846
+ }, z.core.$strip>>;
847
+ note: z.ZodOptional<z.ZodString>;
848
+ }, z.core.$strip>;
849
+ id: z.ZodString;
850
+ intent: z.ZodString;
851
+ inside: z.ZodOptional<z.ZodObject<{
852
+ beat: z.ZodString;
853
+ element: z.ZodString;
854
+ }, z.core.$strip>>;
855
+ claim: z.ZodOptional<z.ZodString>;
856
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
857
+ kind: z.ZodEnum<{
858
+ figure: "figure";
859
+ equation: "equation";
860
+ table: "table";
861
+ section: "section";
862
+ }>;
863
+ id: z.ZodString;
864
+ }, z.core.$strip>>>;
865
+ weight: z.ZodDefault<z.ZodNumber>;
866
+ seconds: z.ZodDefault<z.ZodNumber>;
867
+ }, z.core.$strip>, z.ZodObject<{
868
+ narration: z.ZodOptional<z.ZodString>;
869
+ archetype: z.ZodLiteral<"line-chart">;
870
+ params: z.ZodObject<{
871
+ eyebrow: z.ZodOptional<z.ZodString>;
872
+ headline: z.ZodString;
873
+ xLabel: z.ZodString;
874
+ yLabel: z.ZodString;
875
+ points: z.ZodArray<z.ZodObject<{
876
+ x: z.ZodString;
877
+ y: z.ZodNumber;
878
+ }, z.core.$strip>>;
879
+ deltas: z.ZodOptional<z.ZodArray<z.ZodString>>;
880
+ readout: z.ZodOptional<z.ZodString>;
881
+ }, z.core.$strip>;
882
+ id: z.ZodString;
883
+ intent: z.ZodString;
884
+ inside: z.ZodOptional<z.ZodObject<{
885
+ beat: z.ZodString;
886
+ element: z.ZodString;
887
+ }, z.core.$strip>>;
888
+ claim: z.ZodOptional<z.ZodString>;
889
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
890
+ kind: z.ZodEnum<{
891
+ figure: "figure";
892
+ equation: "equation";
893
+ table: "table";
894
+ section: "section";
895
+ }>;
896
+ id: z.ZodString;
897
+ }, z.core.$strip>>>;
898
+ weight: z.ZodDefault<z.ZodNumber>;
899
+ seconds: z.ZodDefault<z.ZodNumber>;
900
+ }, z.core.$strip>, z.ZodObject<{
901
+ narration: z.ZodOptional<z.ZodString>;
902
+ archetype: z.ZodLiteral<"callout">;
903
+ params: z.ZodObject<{
904
+ eyebrow: z.ZodOptional<z.ZodString>;
905
+ headline: z.ZodString;
906
+ panels: z.ZodArray<z.ZodObject<{
907
+ label: z.ZodString;
908
+ lines: z.ZodArray<z.ZodString>;
909
+ }, z.core.$strip>>;
910
+ note: z.ZodOptional<z.ZodString>;
911
+ }, z.core.$strip>;
912
+ id: z.ZodString;
913
+ intent: z.ZodString;
914
+ inside: z.ZodOptional<z.ZodObject<{
915
+ beat: z.ZodString;
916
+ element: z.ZodString;
917
+ }, z.core.$strip>>;
918
+ claim: z.ZodOptional<z.ZodString>;
919
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
920
+ kind: z.ZodEnum<{
921
+ figure: "figure";
922
+ equation: "equation";
923
+ table: "table";
924
+ section: "section";
925
+ }>;
926
+ id: z.ZodString;
927
+ }, z.core.$strip>>>;
928
+ weight: z.ZodDefault<z.ZodNumber>;
929
+ seconds: z.ZodDefault<z.ZodNumber>;
930
+ }, z.core.$strip>, z.ZodObject<{
931
+ narration: z.ZodOptional<z.ZodString>;
932
+ archetype: z.ZodLiteral<"pipeline">;
933
+ params: z.ZodObject<{
934
+ eyebrow: z.ZodOptional<z.ZodString>;
935
+ headline: z.ZodString;
936
+ stages: z.ZodArray<z.ZodObject<{
937
+ label: z.ZodString;
938
+ note: z.ZodOptional<z.ZodString>;
939
+ tone: z.ZodOptional<z.ZodEnum<{
940
+ a: "a";
941
+ b: "b";
942
+ c: "c";
943
+ d: "d";
944
+ }>>;
945
+ }, z.core.$strip>>;
946
+ loop: z.ZodOptional<z.ZodObject<{
947
+ from: z.ZodOptional<z.ZodInt>;
948
+ to: z.ZodInt;
949
+ label: z.ZodString;
950
+ }, z.core.$strip>>;
951
+ note: z.ZodOptional<z.ZodString>;
952
+ }, z.core.$strip>;
953
+ id: z.ZodString;
954
+ intent: z.ZodString;
955
+ inside: z.ZodOptional<z.ZodObject<{
956
+ beat: z.ZodString;
957
+ element: z.ZodString;
958
+ }, z.core.$strip>>;
959
+ claim: z.ZodOptional<z.ZodString>;
960
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
961
+ kind: z.ZodEnum<{
962
+ figure: "figure";
963
+ equation: "equation";
964
+ table: "table";
965
+ section: "section";
966
+ }>;
967
+ id: z.ZodString;
968
+ }, z.core.$strip>>>;
969
+ weight: z.ZodDefault<z.ZodNumber>;
970
+ seconds: z.ZodDefault<z.ZodNumber>;
971
+ }, z.core.$strip>, z.ZodObject<{
972
+ narration: z.ZodOptional<z.ZodString>;
973
+ archetype: z.ZodLiteral<"annotated-figure">;
974
+ params: z.ZodObject<{
975
+ eyebrow: z.ZodOptional<z.ZodString>;
976
+ headline: z.ZodString;
977
+ figureId: z.ZodString;
978
+ crop: z.ZodOptional<z.ZodObject<{
979
+ x: z.ZodNumber;
980
+ y: z.ZodNumber;
981
+ w: z.ZodNumber;
982
+ h: z.ZodNumber;
983
+ }, z.core.$strip>>;
984
+ notes: z.ZodArray<z.ZodObject<{
985
+ x: z.ZodNumber;
986
+ y: z.ZodNumber;
987
+ text: z.ZodString;
988
+ tone: z.ZodOptional<z.ZodEnum<{
989
+ a: "a";
990
+ b: "b";
991
+ c: "c";
992
+ d: "d";
993
+ }>>;
994
+ }, z.core.$strip>>;
995
+ }, z.core.$strip>;
996
+ id: z.ZodString;
997
+ intent: z.ZodString;
998
+ inside: z.ZodOptional<z.ZodObject<{
999
+ beat: z.ZodString;
1000
+ element: z.ZodString;
1001
+ }, z.core.$strip>>;
1002
+ claim: z.ZodOptional<z.ZodString>;
1003
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1004
+ kind: z.ZodEnum<{
1005
+ figure: "figure";
1006
+ equation: "equation";
1007
+ table: "table";
1008
+ section: "section";
1009
+ }>;
1010
+ id: z.ZodString;
1011
+ }, z.core.$strip>>>;
1012
+ weight: z.ZodDefault<z.ZodNumber>;
1013
+ seconds: z.ZodDefault<z.ZodNumber>;
1014
+ }, z.core.$strip>, z.ZodObject<{
1015
+ narration: z.ZodOptional<z.ZodString>;
1016
+ archetype: z.ZodLiteral<"grid">;
1017
+ params: z.ZodObject<{
1018
+ eyebrow: z.ZodOptional<z.ZodString>;
1019
+ headline: z.ZodString;
1020
+ cols: z.ZodInt;
1021
+ rows: z.ZodInt;
1022
+ regions: z.ZodArray<z.ZodObject<{
1023
+ x: z.ZodInt;
1024
+ y: z.ZodInt;
1025
+ w: z.ZodInt;
1026
+ h: z.ZodInt;
1027
+ label: z.ZodString;
1028
+ tone: z.ZodEnum<{
1029
+ a: "a";
1030
+ b: "b";
1031
+ c: "c";
1032
+ d: "d";
1033
+ }>;
1034
+ }, z.core.$strip>>;
1035
+ note: z.ZodOptional<z.ZodString>;
1036
+ }, z.core.$strip>;
1037
+ id: z.ZodString;
1038
+ intent: z.ZodString;
1039
+ inside: z.ZodOptional<z.ZodObject<{
1040
+ beat: z.ZodString;
1041
+ element: z.ZodString;
1042
+ }, z.core.$strip>>;
1043
+ claim: z.ZodOptional<z.ZodString>;
1044
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1045
+ kind: z.ZodEnum<{
1046
+ figure: "figure";
1047
+ equation: "equation";
1048
+ table: "table";
1049
+ section: "section";
1050
+ }>;
1051
+ id: z.ZodString;
1052
+ }, z.core.$strip>>>;
1053
+ weight: z.ZodDefault<z.ZodNumber>;
1054
+ seconds: z.ZodDefault<z.ZodNumber>;
1055
+ }, z.core.$strip>, z.ZodObject<{
1056
+ narration: z.ZodOptional<z.ZodString>;
1057
+ archetype: z.ZodLiteral<"bar-compare">;
1058
+ params: z.ZodObject<{
1059
+ eyebrow: z.ZodOptional<z.ZodString>;
1060
+ headline: z.ZodString;
1061
+ unit: z.ZodOptional<z.ZodString>;
1062
+ bars: z.ZodArray<z.ZodObject<{
1063
+ label: z.ZodString;
1064
+ value: z.ZodNumber;
1065
+ tone: z.ZodOptional<z.ZodEnum<{
1066
+ a: "a";
1067
+ b: "b";
1068
+ c: "c";
1069
+ d: "d";
1070
+ }>>;
1071
+ }, z.core.$strip>>;
1072
+ note: z.ZodOptional<z.ZodString>;
1073
+ }, z.core.$strip>;
1074
+ id: z.ZodString;
1075
+ intent: z.ZodString;
1076
+ inside: z.ZodOptional<z.ZodObject<{
1077
+ beat: z.ZodString;
1078
+ element: z.ZodString;
1079
+ }, z.core.$strip>>;
1080
+ claim: z.ZodOptional<z.ZodString>;
1081
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1082
+ kind: z.ZodEnum<{
1083
+ figure: "figure";
1084
+ equation: "equation";
1085
+ table: "table";
1086
+ section: "section";
1087
+ }>;
1088
+ id: z.ZodString;
1089
+ }, z.core.$strip>>>;
1090
+ weight: z.ZodDefault<z.ZodNumber>;
1091
+ seconds: z.ZodDefault<z.ZodNumber>;
1092
+ }, z.core.$strip>, z.ZodObject<{
1093
+ narration: z.ZodOptional<z.ZodString>;
1094
+ archetype: z.ZodLiteral<"stack">;
1095
+ params: z.ZodObject<{
1096
+ eyebrow: z.ZodOptional<z.ZodString>;
1097
+ headline: z.ZodString;
1098
+ layers: z.ZodArray<z.ZodObject<{
1099
+ label: z.ZodString;
1100
+ note: z.ZodOptional<z.ZodString>;
1101
+ }, z.core.$strip>>;
1102
+ note: z.ZodOptional<z.ZodString>;
1103
+ }, z.core.$strip>;
1104
+ id: z.ZodString;
1105
+ intent: z.ZodString;
1106
+ inside: z.ZodOptional<z.ZodObject<{
1107
+ beat: z.ZodString;
1108
+ element: z.ZodString;
1109
+ }, z.core.$strip>>;
1110
+ claim: z.ZodOptional<z.ZodString>;
1111
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1112
+ kind: z.ZodEnum<{
1113
+ figure: "figure";
1114
+ equation: "equation";
1115
+ table: "table";
1116
+ section: "section";
1117
+ }>;
1118
+ id: z.ZodString;
1119
+ }, z.core.$strip>>>;
1120
+ weight: z.ZodDefault<z.ZodNumber>;
1121
+ seconds: z.ZodDefault<z.ZodNumber>;
1122
+ }, z.core.$strip>, z.ZodObject<{
1123
+ narration: z.ZodOptional<z.ZodString>;
1124
+ archetype: z.ZodLiteral<"split-compare">;
1125
+ params: z.ZodObject<{
1126
+ eyebrow: z.ZodOptional<z.ZodString>;
1127
+ headline: z.ZodString;
1128
+ left: z.ZodObject<{
1129
+ label: z.ZodString;
1130
+ figureId: z.ZodOptional<z.ZodString>;
1131
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
1132
+ }, z.core.$strip>;
1133
+ right: z.ZodObject<{
1134
+ label: z.ZodString;
1135
+ figureId: z.ZodOptional<z.ZodString>;
1136
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
1137
+ }, z.core.$strip>;
1138
+ note: z.ZodOptional<z.ZodString>;
1139
+ }, z.core.$strip>;
1140
+ id: z.ZodString;
1141
+ intent: z.ZodString;
1142
+ inside: z.ZodOptional<z.ZodObject<{
1143
+ beat: z.ZodString;
1144
+ element: z.ZodString;
1145
+ }, z.core.$strip>>;
1146
+ claim: z.ZodOptional<z.ZodString>;
1147
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1148
+ kind: z.ZodEnum<{
1149
+ figure: "figure";
1150
+ equation: "equation";
1151
+ table: "table";
1152
+ section: "section";
1153
+ }>;
1154
+ id: z.ZodString;
1155
+ }, z.core.$strip>>>;
1156
+ weight: z.ZodDefault<z.ZodNumber>;
1157
+ seconds: z.ZodDefault<z.ZodNumber>;
1158
+ }, z.core.$strip>], "archetype">>;
1159
+ }, z.core.$strip>;
1160
+ /**
1161
+ * What the person asking for the deck gets to decide.
1162
+ *
1163
+ * Split deliberately: `plan` reads the ones that change what is said, `emit`
1164
+ * reads the ones that change how it looks. Neither reaches for a field it does
1165
+ * not own, which is why a preferences change never invalidates a storyboard.
1166
+ */
1167
+ export declare const prefsSchema: z.ZodObject<{
1168
+ slides: z.ZodDefault<z.ZodInt>;
1169
+ lang: z.ZodDefault<z.ZodString>;
1170
+ tone: z.ZodDefault<z.ZodEnum<{
1171
+ plain: "plain";
1172
+ academic: "academic";
1173
+ conversational: "conversational";
1174
+ punchy: "punchy";
1175
+ }>>;
1176
+ density: z.ZodDefault<z.ZodEnum<{
1177
+ sparse: "sparse";
1178
+ normal: "normal";
1179
+ dense: "dense";
1180
+ }>>;
1181
+ duration: z.ZodOptional<z.ZodNumber>;
1182
+ theme: z.ZodDefault<z.ZodString>;
1183
+ animationSpeed: z.ZodDefault<z.ZodNumber>;
1184
+ narration: z.ZodDefault<z.ZodObject<{
1185
+ enabled: z.ZodDefault<z.ZodBoolean>;
1186
+ voice: z.ZodOptional<z.ZodString>;
1187
+ rate: z.ZodDefault<z.ZodString>;
1188
+ pitch: z.ZodDefault<z.ZodString>;
1189
+ subtitles: z.ZodDefault<z.ZodBoolean>;
1190
+ density: z.ZodDefault<z.ZodEnum<{
1191
+ high: "high";
1192
+ medium: "medium";
1193
+ low: "low";
1194
+ }>>;
1195
+ }, z.core.$strip>>;
1196
+ }, z.core.$strip>;
1197
+ /** One subtitle line with the timing edge-tts measured for it. */
1198
+ export declare const cueSchema: z.ZodObject<{
1199
+ start: z.ZodNumber;
1200
+ end: z.ZodNumber;
1201
+ text: z.ZodString;
1202
+ }, z.core.$strip>;
1203
+ /**
1204
+ * What is spoken at one stop.
1205
+ *
1206
+ * One segment per stop, so the audio and the reveal advance together: the
1207
+ * presenter says the sentence that belongs to the thing that just appeared.
1208
+ * `seconds` is measured from the rendered audio, never estimated — it is what
1209
+ * lets a beat's length follow its narration instead of a number someone guessed.
1210
+ */
1211
+ export declare const segmentSchema: z.ZodObject<{
1212
+ stop: z.ZodInt;
1213
+ text: z.ZodString;
1214
+ audio: z.ZodString;
1215
+ seconds: z.ZodNumber;
1216
+ cues: z.ZodArray<z.ZodObject<{
1217
+ start: z.ZodNumber;
1218
+ end: z.ZodNumber;
1219
+ text: z.ZodString;
1220
+ }, z.core.$strip>>;
1221
+ }, z.core.$strip>;
1222
+ export declare const narrationSchema: z.ZodObject<{
1223
+ voice: z.ZodString;
1224
+ beats: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
1225
+ stop: z.ZodInt;
1226
+ text: z.ZodString;
1227
+ audio: z.ZodString;
1228
+ seconds: z.ZodNumber;
1229
+ cues: z.ZodArray<z.ZodObject<{
1230
+ start: z.ZodNumber;
1231
+ end: z.ZodNumber;
1232
+ text: z.ZodString;
1233
+ }, z.core.$strip>>;
1234
+ }, z.core.$strip>>>;
1235
+ }, z.core.$strip>;
1236
+ /**
1237
+ * How one external asset travels with the deck.
1238
+ *
1239
+ * `bake` copies the bytes in, so the pack works offline and forever. `link`
1240
+ * keeps the URL, so the pack stays small and the asset stays current. `embed` is
1241
+ * for things that are not files at all — a YouTube or Vimeo URL is a player, and
1242
+ * downloading it would be both wrong and, usually, against its terms.
1243
+ */
1244
+ export declare const mediaSchema: z.ZodObject<{
1245
+ id: z.ZodString;
1246
+ policy: z.ZodEnum<{
1247
+ bake: "bake";
1248
+ link: "link";
1249
+ embed: "embed";
1250
+ }>;
1251
+ path: z.ZodOptional<z.ZodString>;
1252
+ url: z.ZodOptional<z.ZodString>;
1253
+ mime: z.ZodOptional<z.ZodString>;
1254
+ bytes: z.ZodOptional<z.ZodInt>;
1255
+ }, z.core.$strip>;
1256
+ /** Bumped only when an older reader could misread a newer pack. */
1257
+ export declare const PACK_VERSION = 1;
1258
+ /**
1259
+ * `deck.json` inside a `.deck` archive: everything needed to rebuild the deck,
1260
+ * and nothing that can be derived from it.
1261
+ *
1262
+ * A pack is the unit a user keeps, sends, and re-opens. It carries the source
1263
+ * and the storyboard rather than the built HTML, because the built HTML is a
1264
+ * projection of those two and every format profile makes a different one.
1265
+ */
1266
+ export declare const packSchema: z.ZodObject<{
1267
+ version: z.ZodLiteral<1>;
1268
+ createdAt: z.ZodString;
1269
+ title: z.ZodString;
1270
+ prefs: z.ZodObject<{
1271
+ slides: z.ZodDefault<z.ZodInt>;
1272
+ lang: z.ZodDefault<z.ZodString>;
1273
+ tone: z.ZodDefault<z.ZodEnum<{
1274
+ plain: "plain";
1275
+ academic: "academic";
1276
+ conversational: "conversational";
1277
+ punchy: "punchy";
1278
+ }>>;
1279
+ density: z.ZodDefault<z.ZodEnum<{
1280
+ sparse: "sparse";
1281
+ normal: "normal";
1282
+ dense: "dense";
1283
+ }>>;
1284
+ duration: z.ZodOptional<z.ZodNumber>;
1285
+ theme: z.ZodDefault<z.ZodString>;
1286
+ animationSpeed: z.ZodDefault<z.ZodNumber>;
1287
+ narration: z.ZodDefault<z.ZodObject<{
1288
+ enabled: z.ZodDefault<z.ZodBoolean>;
1289
+ voice: z.ZodOptional<z.ZodString>;
1290
+ rate: z.ZodDefault<z.ZodString>;
1291
+ pitch: z.ZodDefault<z.ZodString>;
1292
+ subtitles: z.ZodDefault<z.ZodBoolean>;
1293
+ density: z.ZodDefault<z.ZodEnum<{
1294
+ high: "high";
1295
+ medium: "medium";
1296
+ low: "low";
1297
+ }>>;
1298
+ }, z.core.$strip>>;
1299
+ }, z.core.$strip>;
1300
+ source: z.ZodObject<{
1301
+ id: z.ZodString;
1302
+ title: z.ZodString;
1303
+ lang: z.ZodDefault<z.ZodString>;
1304
+ sections: z.ZodArray<z.ZodObject<{
1305
+ id: z.ZodString;
1306
+ depth: z.ZodInt;
1307
+ heading: z.ZodString;
1308
+ text: z.ZodString;
1309
+ }, z.core.$strip>>;
1310
+ figures: z.ZodArray<z.ZodObject<{
1311
+ id: z.ZodString;
1312
+ src: z.ZodString;
1313
+ caption: z.ZodString;
1314
+ width: z.ZodInt;
1315
+ height: z.ZodInt;
1316
+ }, z.core.$strip>>;
1317
+ equations: z.ZodArray<z.ZodObject<{
1318
+ id: z.ZodString;
1319
+ tex: z.ZodString;
1320
+ display: z.ZodBoolean;
1321
+ }, z.core.$strip>>;
1322
+ tables: z.ZodArray<z.ZodObject<{
1323
+ id: z.ZodString;
1324
+ caption: z.ZodOptional<z.ZodString>;
1325
+ columns: z.ZodArray<z.ZodString>;
1326
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
1327
+ }, z.core.$strip>>;
1328
+ }, z.core.$strip>;
1329
+ storyboard: z.ZodObject<{
1330
+ sourceId: z.ZodString;
1331
+ title: z.ZodString;
1332
+ lang: z.ZodDefault<z.ZodString>;
1333
+ theme: z.ZodDefault<z.ZodString>;
1334
+ beats: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
1335
+ narration: z.ZodOptional<z.ZodString>;
1336
+ archetype: z.ZodLiteral<"title">;
1337
+ params: z.ZodObject<{
1338
+ eyebrow: z.ZodOptional<z.ZodString>;
1339
+ headline: z.ZodString;
1340
+ sub: z.ZodOptional<z.ZodString>;
1341
+ }, z.core.$strip>;
1342
+ id: z.ZodString;
1343
+ intent: z.ZodString;
1344
+ inside: z.ZodOptional<z.ZodObject<{
1345
+ beat: z.ZodString;
1346
+ element: z.ZodString;
1347
+ }, z.core.$strip>>;
1348
+ claim: z.ZodOptional<z.ZodString>;
1349
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1350
+ kind: z.ZodEnum<{
1351
+ figure: "figure";
1352
+ equation: "equation";
1353
+ table: "table";
1354
+ section: "section";
1355
+ }>;
1356
+ id: z.ZodString;
1357
+ }, z.core.$strip>>>;
1358
+ weight: z.ZodDefault<z.ZodNumber>;
1359
+ seconds: z.ZodDefault<z.ZodNumber>;
1360
+ }, z.core.$strip>, z.ZodObject<{
1361
+ narration: z.ZodOptional<z.ZodString>;
1362
+ archetype: z.ZodLiteral<"claim-figure">;
1363
+ params: z.ZodObject<{
1364
+ eyebrow: z.ZodOptional<z.ZodString>;
1365
+ headline: z.ZodString;
1366
+ claim: z.ZodString;
1367
+ figureId: z.ZodString;
1368
+ }, z.core.$strip>;
1369
+ id: z.ZodString;
1370
+ intent: z.ZodString;
1371
+ inside: z.ZodOptional<z.ZodObject<{
1372
+ beat: z.ZodString;
1373
+ element: z.ZodString;
1374
+ }, z.core.$strip>>;
1375
+ claim: z.ZodOptional<z.ZodString>;
1376
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1377
+ kind: z.ZodEnum<{
1378
+ figure: "figure";
1379
+ equation: "equation";
1380
+ table: "table";
1381
+ section: "section";
1382
+ }>;
1383
+ id: z.ZodString;
1384
+ }, z.core.$strip>>>;
1385
+ weight: z.ZodDefault<z.ZodNumber>;
1386
+ seconds: z.ZodDefault<z.ZodNumber>;
1387
+ }, z.core.$strip>, z.ZodObject<{
1388
+ narration: z.ZodOptional<z.ZodString>;
1389
+ archetype: z.ZodLiteral<"equation-walk">;
1390
+ params: z.ZodObject<{
1391
+ eyebrow: z.ZodOptional<z.ZodString>;
1392
+ headline: z.ZodString;
1393
+ equationId: z.ZodString;
1394
+ terms: z.ZodArray<z.ZodObject<{
1395
+ tex: z.ZodString;
1396
+ label: z.ZodString;
1397
+ tone: z.ZodEnum<{
1398
+ a: "a";
1399
+ b: "b";
1400
+ c: "c";
1401
+ d: "d";
1402
+ }>;
1403
+ }, z.core.$strip>>;
1404
+ }, z.core.$strip>;
1405
+ id: z.ZodString;
1406
+ intent: z.ZodString;
1407
+ inside: z.ZodOptional<z.ZodObject<{
1408
+ beat: z.ZodString;
1409
+ element: z.ZodString;
1410
+ }, z.core.$strip>>;
1411
+ claim: z.ZodOptional<z.ZodString>;
1412
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1413
+ kind: z.ZodEnum<{
1414
+ figure: "figure";
1415
+ equation: "equation";
1416
+ table: "table";
1417
+ section: "section";
1418
+ }>;
1419
+ id: z.ZodString;
1420
+ }, z.core.$strip>>>;
1421
+ weight: z.ZodDefault<z.ZodNumber>;
1422
+ seconds: z.ZodDefault<z.ZodNumber>;
1423
+ }, z.core.$strip>, z.ZodObject<{
1424
+ narration: z.ZodOptional<z.ZodString>;
1425
+ archetype: z.ZodLiteral<"data-table">;
1426
+ params: z.ZodObject<{
1427
+ eyebrow: z.ZodOptional<z.ZodString>;
1428
+ headline: z.ZodString;
1429
+ tableId: z.ZodString;
1430
+ highlight: z.ZodArray<z.ZodObject<{
1431
+ row: z.ZodString;
1432
+ tone: z.ZodEnum<{
1433
+ a: "a";
1434
+ b: "b";
1435
+ c: "c";
1436
+ d: "d";
1437
+ }>;
1438
+ }, z.core.$strip>>;
1439
+ note: z.ZodOptional<z.ZodString>;
1440
+ }, z.core.$strip>;
1441
+ id: z.ZodString;
1442
+ intent: z.ZodString;
1443
+ inside: z.ZodOptional<z.ZodObject<{
1444
+ beat: z.ZodString;
1445
+ element: z.ZodString;
1446
+ }, z.core.$strip>>;
1447
+ claim: z.ZodOptional<z.ZodString>;
1448
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1449
+ kind: z.ZodEnum<{
1450
+ figure: "figure";
1451
+ equation: "equation";
1452
+ table: "table";
1453
+ section: "section";
1454
+ }>;
1455
+ id: z.ZodString;
1456
+ }, z.core.$strip>>>;
1457
+ weight: z.ZodDefault<z.ZodNumber>;
1458
+ seconds: z.ZodDefault<z.ZodNumber>;
1459
+ }, z.core.$strip>, z.ZodObject<{
1460
+ narration: z.ZodOptional<z.ZodString>;
1461
+ archetype: z.ZodLiteral<"line-chart">;
1462
+ params: z.ZodObject<{
1463
+ eyebrow: z.ZodOptional<z.ZodString>;
1464
+ headline: z.ZodString;
1465
+ xLabel: z.ZodString;
1466
+ yLabel: z.ZodString;
1467
+ points: z.ZodArray<z.ZodObject<{
1468
+ x: z.ZodString;
1469
+ y: z.ZodNumber;
1470
+ }, z.core.$strip>>;
1471
+ deltas: z.ZodOptional<z.ZodArray<z.ZodString>>;
1472
+ readout: z.ZodOptional<z.ZodString>;
1473
+ }, z.core.$strip>;
1474
+ id: z.ZodString;
1475
+ intent: z.ZodString;
1476
+ inside: z.ZodOptional<z.ZodObject<{
1477
+ beat: z.ZodString;
1478
+ element: z.ZodString;
1479
+ }, z.core.$strip>>;
1480
+ claim: z.ZodOptional<z.ZodString>;
1481
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1482
+ kind: z.ZodEnum<{
1483
+ figure: "figure";
1484
+ equation: "equation";
1485
+ table: "table";
1486
+ section: "section";
1487
+ }>;
1488
+ id: z.ZodString;
1489
+ }, z.core.$strip>>>;
1490
+ weight: z.ZodDefault<z.ZodNumber>;
1491
+ seconds: z.ZodDefault<z.ZodNumber>;
1492
+ }, z.core.$strip>, z.ZodObject<{
1493
+ narration: z.ZodOptional<z.ZodString>;
1494
+ archetype: z.ZodLiteral<"callout">;
1495
+ params: z.ZodObject<{
1496
+ eyebrow: z.ZodOptional<z.ZodString>;
1497
+ headline: z.ZodString;
1498
+ panels: z.ZodArray<z.ZodObject<{
1499
+ label: z.ZodString;
1500
+ lines: z.ZodArray<z.ZodString>;
1501
+ }, z.core.$strip>>;
1502
+ note: z.ZodOptional<z.ZodString>;
1503
+ }, z.core.$strip>;
1504
+ id: z.ZodString;
1505
+ intent: z.ZodString;
1506
+ inside: z.ZodOptional<z.ZodObject<{
1507
+ beat: z.ZodString;
1508
+ element: z.ZodString;
1509
+ }, z.core.$strip>>;
1510
+ claim: z.ZodOptional<z.ZodString>;
1511
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1512
+ kind: z.ZodEnum<{
1513
+ figure: "figure";
1514
+ equation: "equation";
1515
+ table: "table";
1516
+ section: "section";
1517
+ }>;
1518
+ id: z.ZodString;
1519
+ }, z.core.$strip>>>;
1520
+ weight: z.ZodDefault<z.ZodNumber>;
1521
+ seconds: z.ZodDefault<z.ZodNumber>;
1522
+ }, z.core.$strip>, z.ZodObject<{
1523
+ narration: z.ZodOptional<z.ZodString>;
1524
+ archetype: z.ZodLiteral<"pipeline">;
1525
+ params: z.ZodObject<{
1526
+ eyebrow: z.ZodOptional<z.ZodString>;
1527
+ headline: z.ZodString;
1528
+ stages: z.ZodArray<z.ZodObject<{
1529
+ label: z.ZodString;
1530
+ note: z.ZodOptional<z.ZodString>;
1531
+ tone: z.ZodOptional<z.ZodEnum<{
1532
+ a: "a";
1533
+ b: "b";
1534
+ c: "c";
1535
+ d: "d";
1536
+ }>>;
1537
+ }, z.core.$strip>>;
1538
+ loop: z.ZodOptional<z.ZodObject<{
1539
+ from: z.ZodOptional<z.ZodInt>;
1540
+ to: z.ZodInt;
1541
+ label: z.ZodString;
1542
+ }, z.core.$strip>>;
1543
+ note: z.ZodOptional<z.ZodString>;
1544
+ }, z.core.$strip>;
1545
+ id: z.ZodString;
1546
+ intent: z.ZodString;
1547
+ inside: z.ZodOptional<z.ZodObject<{
1548
+ beat: z.ZodString;
1549
+ element: z.ZodString;
1550
+ }, z.core.$strip>>;
1551
+ claim: z.ZodOptional<z.ZodString>;
1552
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1553
+ kind: z.ZodEnum<{
1554
+ figure: "figure";
1555
+ equation: "equation";
1556
+ table: "table";
1557
+ section: "section";
1558
+ }>;
1559
+ id: z.ZodString;
1560
+ }, z.core.$strip>>>;
1561
+ weight: z.ZodDefault<z.ZodNumber>;
1562
+ seconds: z.ZodDefault<z.ZodNumber>;
1563
+ }, z.core.$strip>, z.ZodObject<{
1564
+ narration: z.ZodOptional<z.ZodString>;
1565
+ archetype: z.ZodLiteral<"annotated-figure">;
1566
+ params: z.ZodObject<{
1567
+ eyebrow: z.ZodOptional<z.ZodString>;
1568
+ headline: z.ZodString;
1569
+ figureId: z.ZodString;
1570
+ crop: z.ZodOptional<z.ZodObject<{
1571
+ x: z.ZodNumber;
1572
+ y: z.ZodNumber;
1573
+ w: z.ZodNumber;
1574
+ h: z.ZodNumber;
1575
+ }, z.core.$strip>>;
1576
+ notes: z.ZodArray<z.ZodObject<{
1577
+ x: z.ZodNumber;
1578
+ y: z.ZodNumber;
1579
+ text: z.ZodString;
1580
+ tone: z.ZodOptional<z.ZodEnum<{
1581
+ a: "a";
1582
+ b: "b";
1583
+ c: "c";
1584
+ d: "d";
1585
+ }>>;
1586
+ }, z.core.$strip>>;
1587
+ }, z.core.$strip>;
1588
+ id: z.ZodString;
1589
+ intent: z.ZodString;
1590
+ inside: z.ZodOptional<z.ZodObject<{
1591
+ beat: z.ZodString;
1592
+ element: z.ZodString;
1593
+ }, z.core.$strip>>;
1594
+ claim: z.ZodOptional<z.ZodString>;
1595
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1596
+ kind: z.ZodEnum<{
1597
+ figure: "figure";
1598
+ equation: "equation";
1599
+ table: "table";
1600
+ section: "section";
1601
+ }>;
1602
+ id: z.ZodString;
1603
+ }, z.core.$strip>>>;
1604
+ weight: z.ZodDefault<z.ZodNumber>;
1605
+ seconds: z.ZodDefault<z.ZodNumber>;
1606
+ }, z.core.$strip>, z.ZodObject<{
1607
+ narration: z.ZodOptional<z.ZodString>;
1608
+ archetype: z.ZodLiteral<"grid">;
1609
+ params: z.ZodObject<{
1610
+ eyebrow: z.ZodOptional<z.ZodString>;
1611
+ headline: z.ZodString;
1612
+ cols: z.ZodInt;
1613
+ rows: z.ZodInt;
1614
+ regions: z.ZodArray<z.ZodObject<{
1615
+ x: z.ZodInt;
1616
+ y: z.ZodInt;
1617
+ w: z.ZodInt;
1618
+ h: z.ZodInt;
1619
+ label: z.ZodString;
1620
+ tone: z.ZodEnum<{
1621
+ a: "a";
1622
+ b: "b";
1623
+ c: "c";
1624
+ d: "d";
1625
+ }>;
1626
+ }, z.core.$strip>>;
1627
+ note: z.ZodOptional<z.ZodString>;
1628
+ }, z.core.$strip>;
1629
+ id: z.ZodString;
1630
+ intent: z.ZodString;
1631
+ inside: z.ZodOptional<z.ZodObject<{
1632
+ beat: z.ZodString;
1633
+ element: z.ZodString;
1634
+ }, z.core.$strip>>;
1635
+ claim: z.ZodOptional<z.ZodString>;
1636
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1637
+ kind: z.ZodEnum<{
1638
+ figure: "figure";
1639
+ equation: "equation";
1640
+ table: "table";
1641
+ section: "section";
1642
+ }>;
1643
+ id: z.ZodString;
1644
+ }, z.core.$strip>>>;
1645
+ weight: z.ZodDefault<z.ZodNumber>;
1646
+ seconds: z.ZodDefault<z.ZodNumber>;
1647
+ }, z.core.$strip>, z.ZodObject<{
1648
+ narration: z.ZodOptional<z.ZodString>;
1649
+ archetype: z.ZodLiteral<"bar-compare">;
1650
+ params: z.ZodObject<{
1651
+ eyebrow: z.ZodOptional<z.ZodString>;
1652
+ headline: z.ZodString;
1653
+ unit: z.ZodOptional<z.ZodString>;
1654
+ bars: z.ZodArray<z.ZodObject<{
1655
+ label: z.ZodString;
1656
+ value: z.ZodNumber;
1657
+ tone: z.ZodOptional<z.ZodEnum<{
1658
+ a: "a";
1659
+ b: "b";
1660
+ c: "c";
1661
+ d: "d";
1662
+ }>>;
1663
+ }, z.core.$strip>>;
1664
+ note: z.ZodOptional<z.ZodString>;
1665
+ }, z.core.$strip>;
1666
+ id: z.ZodString;
1667
+ intent: z.ZodString;
1668
+ inside: z.ZodOptional<z.ZodObject<{
1669
+ beat: z.ZodString;
1670
+ element: z.ZodString;
1671
+ }, z.core.$strip>>;
1672
+ claim: z.ZodOptional<z.ZodString>;
1673
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1674
+ kind: z.ZodEnum<{
1675
+ figure: "figure";
1676
+ equation: "equation";
1677
+ table: "table";
1678
+ section: "section";
1679
+ }>;
1680
+ id: z.ZodString;
1681
+ }, z.core.$strip>>>;
1682
+ weight: z.ZodDefault<z.ZodNumber>;
1683
+ seconds: z.ZodDefault<z.ZodNumber>;
1684
+ }, z.core.$strip>, z.ZodObject<{
1685
+ narration: z.ZodOptional<z.ZodString>;
1686
+ archetype: z.ZodLiteral<"stack">;
1687
+ params: z.ZodObject<{
1688
+ eyebrow: z.ZodOptional<z.ZodString>;
1689
+ headline: z.ZodString;
1690
+ layers: z.ZodArray<z.ZodObject<{
1691
+ label: z.ZodString;
1692
+ note: z.ZodOptional<z.ZodString>;
1693
+ }, z.core.$strip>>;
1694
+ note: z.ZodOptional<z.ZodString>;
1695
+ }, z.core.$strip>;
1696
+ id: z.ZodString;
1697
+ intent: z.ZodString;
1698
+ inside: z.ZodOptional<z.ZodObject<{
1699
+ beat: z.ZodString;
1700
+ element: z.ZodString;
1701
+ }, z.core.$strip>>;
1702
+ claim: z.ZodOptional<z.ZodString>;
1703
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1704
+ kind: z.ZodEnum<{
1705
+ figure: "figure";
1706
+ equation: "equation";
1707
+ table: "table";
1708
+ section: "section";
1709
+ }>;
1710
+ id: z.ZodString;
1711
+ }, z.core.$strip>>>;
1712
+ weight: z.ZodDefault<z.ZodNumber>;
1713
+ seconds: z.ZodDefault<z.ZodNumber>;
1714
+ }, z.core.$strip>, z.ZodObject<{
1715
+ narration: z.ZodOptional<z.ZodString>;
1716
+ archetype: z.ZodLiteral<"split-compare">;
1717
+ params: z.ZodObject<{
1718
+ eyebrow: z.ZodOptional<z.ZodString>;
1719
+ headline: z.ZodString;
1720
+ left: z.ZodObject<{
1721
+ label: z.ZodString;
1722
+ figureId: z.ZodOptional<z.ZodString>;
1723
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
1724
+ }, z.core.$strip>;
1725
+ right: z.ZodObject<{
1726
+ label: z.ZodString;
1727
+ figureId: z.ZodOptional<z.ZodString>;
1728
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
1729
+ }, z.core.$strip>;
1730
+ note: z.ZodOptional<z.ZodString>;
1731
+ }, z.core.$strip>;
1732
+ id: z.ZodString;
1733
+ intent: z.ZodString;
1734
+ inside: z.ZodOptional<z.ZodObject<{
1735
+ beat: z.ZodString;
1736
+ element: z.ZodString;
1737
+ }, z.core.$strip>>;
1738
+ claim: z.ZodOptional<z.ZodString>;
1739
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
1740
+ kind: z.ZodEnum<{
1741
+ figure: "figure";
1742
+ equation: "equation";
1743
+ table: "table";
1744
+ section: "section";
1745
+ }>;
1746
+ id: z.ZodString;
1747
+ }, z.core.$strip>>>;
1748
+ weight: z.ZodDefault<z.ZodNumber>;
1749
+ seconds: z.ZodDefault<z.ZodNumber>;
1750
+ }, z.core.$strip>], "archetype">>;
1751
+ }, z.core.$strip>;
1752
+ narration: z.ZodOptional<z.ZodObject<{
1753
+ voice: z.ZodString;
1754
+ beats: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
1755
+ stop: z.ZodInt;
1756
+ text: z.ZodString;
1757
+ audio: z.ZodString;
1758
+ seconds: z.ZodNumber;
1759
+ cues: z.ZodArray<z.ZodObject<{
1760
+ start: z.ZodNumber;
1761
+ end: z.ZodNumber;
1762
+ text: z.ZodString;
1763
+ }, z.core.$strip>>;
1764
+ }, z.core.$strip>>>;
1765
+ }, z.core.$strip>>;
1766
+ media: z.ZodDefault<z.ZodArray<z.ZodObject<{
1767
+ id: z.ZodString;
1768
+ policy: z.ZodEnum<{
1769
+ bake: "bake";
1770
+ link: "link";
1771
+ embed: "embed";
1772
+ }>;
1773
+ path: z.ZodOptional<z.ZodString>;
1774
+ url: z.ZodOptional<z.ZodString>;
1775
+ mime: z.ZodOptional<z.ZodString>;
1776
+ bytes: z.ZodOptional<z.ZodInt>;
1777
+ }, z.core.$strip>>>;
1778
+ }, z.core.$strip>;
1779
+ /**
1780
+ * The profiles that ship with a name. `FORMATS` is keyed by these and nothing
1781
+ * else; `DESTINATIONS` and the budget helpers are indexed by them.
1782
+ *
1783
+ * `Format["id"]` is deliberately WIDER than this — a canvas the caller sized
1784
+ * itself is a real format with a real id, and it is not in this union. See
1785
+ * `resizeFormat`.
1786
+ */
1787
+ export type PresetId = "deck-16x9" | "video-16x9" | "short-9x16" | "post-1x1";
1788
+ /**
1789
+ * Output profiles. A profile decides canvas, pacing, and how many beats
1790
+ * survive — never what the beats mean.
1791
+ *
1792
+ * A plain type, not a schema: the preset table below is the only source of NAMED
1793
+ * formats there is, and the one other constructor (`resizeFormat`) validates its
1794
+ * own arguments, so there is no boundary at which one could arrive unvalidated.
1795
+ */
1796
+ export interface Format {
1797
+ /**
1798
+ * A `PresetId` for the four named profiles, `custom-<w>x<h>` for a canvas the
1799
+ * caller sized. Printed in build lines and in cut explanations, so it has to
1800
+ * describe the thing that was actually built: a resized profile keeps its
1801
+ * base's pacing but NOT its name, because "short-9x16" over a 1080x1350 canvas
1802
+ * would be a lie in every message that quotes it.
1803
+ */
1804
+ id: string;
1805
+ width: number;
1806
+ height: number;
1807
+ /** Keep only beats at or above this weight. */
1808
+ minWeight: number;
1809
+ /** Deck mode emits a slideshow island; video mode does not. */
1810
+ navigable: boolean;
1811
+ /**
1812
+ * The longest NARRATED cut this format may produce, in seconds.
1813
+ *
1814
+ * A length, like a canvas, is part of what a format is: a 9x16 file that runs
1815
+ * four minutes is not a short, it is a tall video nobody can post. So the
1816
+ * number is a hard ceiling and `verify`'s budget gate reads it — see
1817
+ * src/verify/budget.ts for why exceeding it fails the build rather than
1818
+ * silently trimming beats.
1819
+ *
1820
+ * `Infinity` where no platform imposes one. That is not "unchecked": a
1821
+ * presented deck is paced by the person clicking through it, and long-form
1822
+ * video has no ceiling worth encoding, so any finite number here would be a
1823
+ * house rule dressed up as a constraint.
1824
+ *
1825
+ * Optional in the TYPE, mandatory in the TABLE — `test/types.test.ts` asserts
1826
+ * every entry in `FORMATS` states one. A required field cannot tell "chose
1827
+ * Infinity" apart from "forgot the field", and it would force every test
1828
+ * fixture that needs a canvas to invent a length it does not care about.
1829
+ * Absent reads as unbudgeted, which is the safe direction for a fixture and
1830
+ * the one the coherence test refuses for a shipped profile.
1831
+ */
1832
+ maxSeconds?: number;
1833
+ /**
1834
+ * A tighter ceiling that only some destinations impose — a warning, not a
1835
+ * failure. Omitted when every destination for the format agrees on `maxSeconds`.
1836
+ */
1837
+ warnSeconds?: number;
1838
+ }
1839
+ /** A real place a built file gets uploaded, and the length it stops accepting at. */
1840
+ export interface Destination {
1841
+ /** What a person would call it. Printed in budget findings. */
1842
+ name: string;
1843
+ /** Longest video this destination takes, in seconds. */
1844
+ maxSeconds: number;
1845
+ }
1846
+ /**
1847
+ * Where each format's file is actually going.
1848
+ *
1849
+ * The budget numbers used to be two literals with a comment, and a comment is
1850
+ * not a check: Instagram raised Reels from 90 seconds to three minutes in early
1851
+ * 2025, and the table went on quoting 90 as an Instagram limit long after that
1852
+ * stopped being true. A number in a table nobody can trace is a trap, so
1853
+ * `maxSeconds` and `warnSeconds` are DERIVED from this list — you cannot state a
1854
+ * budget here without naming the destination it came from.
1855
+ *
1856
+ * WHAT IS DELIBERATELY ABSENT. TikTok takes ten minutes and LinkedIn takes
1857
+ * fifteen, and neither is listed, because the cap is the LOOSEST limit among a
1858
+ * format's destinations: adding one permissive platform would raise `short-9x16`
1859
+ * to 600s and the gate would stop failing the four-minute short it exists to
1860
+ * catch. So a destination belongs here only if it CONSTRAINS the deliverable —
1861
+ * a platform that accepts anything the others accept adds nothing but slack.
1862
+ *
1863
+ * Verified by hand, not by network (nothing here may reach one). These move;
1864
+ * when one does, the finding it produces names it, so the stale number is
1865
+ * findable from the message rather than only from this file.
1866
+ */
1867
+ export declare const DESTINATIONS: Readonly<Record<PresetId, readonly Destination[]>>;
1868
+ /** The loosest destination: what the format may produce at all. */
1869
+ export declare function maxSecondsFor(id: string): number;
1870
+ /** The tightest destination, when it is tighter — a warning, never a failure. */
1871
+ export declare function warnSecondsFor(id: string): number | undefined;
1872
+ /** The destination a given ceiling came from, for a message that can name it. */
1873
+ export declare function destinationAt(id: string, seconds: number): Destination | undefined;
1874
+ export declare const FORMATS: Record<string, Format>;
1875
+ /**
1876
+ * The smallest edge a canvas may have.
1877
+ *
1878
+ * Not a taste call. Every absolute measurement in `src/emit/kit.ts` is scaled by
1879
+ * `width / 1920`; at 64px wide that factor is 0.033, which rounds the scene
1880
+ * padding to 4px and puts every emitted type size under 3px. The composition is
1881
+ * still valid HTML — it is just an image of grey smears, and no gate can tell
1882
+ * that from a deck. Below this there is nothing left to be wrong about.
1883
+ */
1884
+ export declare const MIN_EDGE = 64;
1885
+ /**
1886
+ * The largest edge a canvas may have.
1887
+ *
1888
+ * Chrome's `Page.captureScreenshot` — which is how `render` gets every frame —
1889
+ * is bounded by the maximum texture size, 16384px on the desktop builds
1890
+ * hyperframes drives. Past it capture fails partway through a job that has
1891
+ * already burned an hour, which is the worst possible place to learn a number.
1892
+ */
1893
+ export declare const MAX_EDGE = 16384;
1894
+ /**
1895
+ * The most lopsided canvas the layout survives, long edge over short.
1896
+ *
1897
+ * DERIVED, not chosen for looks. `padY` in src/emit/kit.ts is `84 × width/1920`
1898
+ * — the vertical padding scales with WIDTH, because the type it clears scales
1899
+ * with width — so on a canvas `k` times wider than tall the two paddings take
1900
+ * `0.0875 × k` of the height. At k = 8 that is 70% of the frame gone to margin
1901
+ * and 30% left to draw in; at k = 11.4 the content box is exactly zero and every
1902
+ * archetype lays out into negative space without a single gate firing. 8 is the
1903
+ * last ratio at which "the slide is mostly margin" is still a slide.
1904
+ *
1905
+ * Applied in both directions. The tall side has no such collapse — it fails
1906
+ * through the type scale instead, which `canvasWarnings` reports below.
1907
+ */
1908
+ export declare const MAX_ASPECT = 8;
1909
+ /**
1910
+ * Below this width the deck is legible only to a machine.
1911
+ *
1912
+ * Half of the 1920 canvas every measurement in `src/emit` was chosen against.
1913
+ *
1914
+ * MEASURED, on the demo storyboard, by emitting at each canvas and bisecting
1915
+ * (experiments/011-sizing/sweep.mjs). Two things came out of it, and they are
1916
+ * why this is a WARNING and only a warning:
1917
+ *
1918
+ * - The archetypes already refuse rather than shrink. The smallest 16:9 canvas
1919
+ * the demo lays out on is about 1325x745; below it `split-compare` throws
1920
+ * `the panels do not fit beside each other at the 40px floor`, by name, with
1921
+ * the beat id. Square gives up around 740x740 and 9:16 around 429x763 — the
1922
+ * narrow shapes get further because they stack instead of sitting side by
1923
+ * side. So the range between here and there produces a clear build error, not
1924
+ * a bad deck, and does not need a warning on top of it.
1925
+ * - Under that boundary the sizes that DO emit put the 40px type floor between
1926
+ * 20 and 28 real canvas pixels depending on `REF_PULL` in src/emit/kit.ts,
1927
+ * and text that small does not survive H.264 chroma subsampling at any
1928
+ * bitrate. Nothing in the gate stack measures rendered glyph size, so this
1929
+ * line is the only warning that will ever be given.
1930
+ *
1931
+ * Not an error, because a 100x100 deck is a legal thing to ask for — a thumbnail
1932
+ * strip, a favicon-scale loop — and this is not the place to argue about it.
1933
+ */
1934
+ export declare const LEGIBLE_W = 960;
1935
+ /**
1936
+ * Why this canvas cannot be built, in one sentence, or nothing.
1937
+ *
1938
+ * Separate from `canvasWarnings` because the two have different consequences and
1939
+ * the caller must not have to tell them apart by reading the prose.
1940
+ */
1941
+ export declare function canvasProblem(width: number, height: number): string | undefined;
1942
+ /**
1943
+ * What is legal but probably not what the caller meant. Printed, never fatal.
1944
+ */
1945
+ export declare function canvasWarnings(width: number, height: number): string[];
1946
+ /**
1947
+ * The same profile on a different canvas.
1948
+ *
1949
+ * WHAT IS AND IS NOT DERIVED. `minWeight`, the duration budget and `navigable`
1950
+ * come from `base` untouched, because there is nothing about a pixel count that
1951
+ * implies any of them: `short-9x16`'s 0.6 floor and 180-second ceiling are facts
1952
+ * about YouTube Shorts, not about being 1080 wide, and inventing an equivalent
1953
+ * for 1080x1350 would be exactly the house-rule-dressed-as-a-constraint that the
1954
+ * note on `DESTINATIONS` exists to forbid. So a resized format inherits from a
1955
+ * profile the caller NAMED — `--width 1080 --height 1350` alone means
1956
+ * "deck-16x9 at another size": unbudgeted, no floor, navigable — and
1957
+ * `--format short-9x16 --width 1080 --height 1350` means "a Reel, but 4:5".
1958
+ *
1959
+ * A canvas identical to the base's returns the base itself, so that stating the
1960
+ * size you were going to get anyway cannot rename your format or cost you the
1961
+ * budget attached to its name.
1962
+ */
1963
+ export declare function resizeFormat(base: Format, width: number, height: number): Format;
1964
+ /** Whether this format's canvas was given rather than named. */
1965
+ export declare function isCustom(format: Format): boolean;
1966
+ /** Verdicts are produced and printed in one process; nothing parses them back. */
1967
+ export interface Finding {
1968
+ severity: "error" | "warning" | "info";
1969
+ /** Which gate produced it: lint | runtime | layout | motion | contrast. */
1970
+ gate: string;
1971
+ rule: string;
1972
+ message: string;
1973
+ beatId?: string;
1974
+ }
1975
+ export interface Verdict {
1976
+ passed: boolean;
1977
+ findings: Finding[];
1978
+ }
1979
+ export type Ref = z.infer<typeof refSchema>;
1980
+ export type Figure = z.infer<typeof figureSchema>;
1981
+ export type Equation = z.infer<typeof equationSchema>;
1982
+ export type Table = z.infer<typeof tableSchema>;
1983
+ export type Section = z.infer<typeof sectionSchema>;
1984
+ export type Source = z.infer<typeof sourceSchema>;
1985
+ export type Term = z.infer<typeof termSchema>;
1986
+ export type Beat = z.infer<typeof beatSchema>;
1987
+ export type Archetype = Beat["archetype"];
1988
+ export type Storyboard = z.infer<typeof storyboardSchema>;
1989
+ /** Narrow a beat to one archetype — the emitters' entry point. */
1990
+ export type BeatOf<A extends Archetype> = Extract<Beat, {
1991
+ archetype: A;
1992
+ }>;