@nodetool-ai/execution 0.8.1 → 0.8.2

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 (158) hide show
  1. package/README.md +23 -127
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/app-debug/app-spec.d.ts.map +1 -1
  4. package/dist/app-debug/app-spec.js +3 -0
  5. package/dist/app-debug/app-spec.js.map +1 -1
  6. package/dist/app-debug/application-target.d.ts +1 -1
  7. package/dist/app-debug/application-target.d.ts.map +1 -1
  8. package/dist/app-debug/application-target.js +5 -3
  9. package/dist/app-debug/application-target.js.map +1 -1
  10. package/dist/app-debug/index.d.ts +4 -2
  11. package/dist/app-debug/index.d.ts.map +1 -1
  12. package/dist/app-debug/index.js +3 -2
  13. package/dist/app-debug/index.js.map +1 -1
  14. package/dist/app-debug/run-recording.d.ts +20 -0
  15. package/dist/app-debug/run-recording.d.ts.map +1 -0
  16. package/dist/app-debug/run-recording.js +105 -0
  17. package/dist/app-debug/run-recording.js.map +1 -0
  18. package/dist/app-debug/runtime.d.ts +2 -0
  19. package/dist/app-debug/runtime.d.ts.map +1 -1
  20. package/dist/app-debug/runtime.js +14 -3
  21. package/dist/app-debug/runtime.js.map +1 -1
  22. package/dist/app-debug/simulate.d.ts +10 -1
  23. package/dist/app-debug/simulate.d.ts.map +1 -1
  24. package/dist/app-debug/simulate.js +57 -26
  25. package/dist/app-debug/simulate.js.map +1 -1
  26. package/dist/app-debug/summarize.d.ts +1 -0
  27. package/dist/app-debug/summarize.d.ts.map +1 -1
  28. package/dist/app-debug/summarize.js +1 -0
  29. package/dist/app-debug/summarize.js.map +1 -1
  30. package/dist/app-debug/types.d.ts +6 -4
  31. package/dist/app-debug/types.d.ts.map +1 -1
  32. package/dist/app-run-generation.d.ts +8 -0
  33. package/dist/app-run-generation.d.ts.map +1 -0
  34. package/dist/app-run-generation.js +61 -0
  35. package/dist/app-run-generation.js.map +1 -0
  36. package/dist/browser-app-run.d.ts +10 -0
  37. package/dist/browser-app-run.d.ts.map +1 -0
  38. package/dist/browser-app-run.js +108 -0
  39. package/dist/browser-app-run.js.map +1 -0
  40. package/dist/browser-run-spans.d.ts +4 -0
  41. package/dist/browser-run-spans.d.ts.map +1 -0
  42. package/dist/browser-run-spans.js +115 -0
  43. package/dist/browser-run-spans.js.map +1 -0
  44. package/dist/browser-trace-policy.d.ts +12 -0
  45. package/dist/browser-trace-policy.d.ts.map +1 -0
  46. package/dist/browser-trace-policy.js +40 -0
  47. package/dist/browser-trace-policy.js.map +1 -0
  48. package/dist/cost-ledger.d.ts +3 -0
  49. package/dist/cost-ledger.d.ts.map +1 -1
  50. package/dist/cost-ledger.js +23 -2
  51. package/dist/cost-ledger.js.map +1 -1
  52. package/dist/debug/types.d.ts +1 -0
  53. package/dist/debug/types.d.ts.map +1 -1
  54. package/dist/generation-lifecycle.d.ts +5 -4
  55. package/dist/generation-lifecycle.d.ts.map +1 -1
  56. package/dist/generation-lifecycle.js +71 -10
  57. package/dist/generation-lifecycle.js.map +1 -1
  58. package/dist/generation-recovery-worker.d.ts.map +1 -1
  59. package/dist/generation-recovery-worker.js +2 -0
  60. package/dist/generation-recovery-worker.js.map +1 -1
  61. package/dist/generation-tracker.d.ts +2 -15
  62. package/dist/generation-tracker.d.ts.map +1 -1
  63. package/dist/generation-tracker.js +92 -6
  64. package/dist/generation-tracker.js.map +1 -1
  65. package/dist/index.d.ts +9 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +6 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/js-script-debug/index.d.ts +1 -0
  70. package/dist/js-script-debug/index.d.ts.map +1 -1
  71. package/dist/js-script-debug/index.js +1 -0
  72. package/dist/js-script-debug/index.js.map +1 -1
  73. package/dist/js-script-debug/type-check.d.ts +16 -0
  74. package/dist/js-script-debug/type-check.d.ts.map +1 -0
  75. package/dist/js-script-debug/type-check.js +139 -0
  76. package/dist/js-script-debug/type-check.js.map +1 -0
  77. package/dist/js-script-debug/validate.d.ts +8 -0
  78. package/dist/js-script-debug/validate.d.ts.map +1 -1
  79. package/dist/js-script-debug/validate.js +4 -0
  80. package/dist/js-script-debug/validate.js.map +1 -1
  81. package/dist/message-stream.d.ts +1 -32
  82. package/dist/message-stream.d.ts.map +1 -1
  83. package/dist/message-stream.js +1 -57
  84. package/dist/message-stream.js.map +1 -1
  85. package/dist/preflight.d.ts +43 -2
  86. package/dist/preflight.d.ts.map +1 -1
  87. package/dist/preflight.js +78 -4
  88. package/dist/preflight.js.map +1 -1
  89. package/dist/run-trace-store.d.ts +9 -0
  90. package/dist/run-trace-store.d.ts.map +1 -0
  91. package/dist/run-trace-store.js +57 -0
  92. package/dist/run-trace-store.js.map +1 -0
  93. package/dist/runs.d.ts +16 -0
  94. package/dist/runs.d.ts.map +1 -0
  95. package/dist/runs.js +431 -0
  96. package/dist/runs.js.map +1 -0
  97. package/dist/service/app-debug-service.d.ts +4 -2
  98. package/dist/service/app-debug-service.d.ts.map +1 -1
  99. package/dist/service/app-debug-service.js +73 -31
  100. package/dist/service/app-debug-service.js.map +1 -1
  101. package/dist/service/app-operation.d.ts +38 -0
  102. package/dist/service/app-operation.d.ts.map +1 -0
  103. package/dist/service/app-operation.js +269 -0
  104. package/dist/service/app-operation.js.map +1 -0
  105. package/dist/service/app-run-server.d.ts +3 -1
  106. package/dist/service/app-run-server.d.ts.map +1 -1
  107. package/dist/service/app-run-server.js +22 -14
  108. package/dist/service/app-run-server.js.map +1 -1
  109. package/dist/service/index.d.ts +4 -0
  110. package/dist/service/index.d.ts.map +1 -1
  111. package/dist/service/index.js +2 -0
  112. package/dist/service/index.js.map +1 -1
  113. package/dist/service/run-trace-lifecycle.d.ts +34 -0
  114. package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
  115. package/dist/service/run-trace-lifecycle.js +135 -0
  116. package/dist/service/run-trace-lifecycle.js.map +1 -0
  117. package/dist/service/workflow-run.d.ts +5 -16
  118. package/dist/service/workflow-run.d.ts.map +1 -1
  119. package/dist/service/workflow-run.js +54 -52
  120. package/dist/service/workflow-run.js.map +1 -1
  121. package/dist/session.d.ts +1 -1
  122. package/dist/session.d.ts.map +1 -1
  123. package/dist/session.js +109 -100
  124. package/dist/session.js.map +1 -1
  125. package/dist/sketch-debug/markdown.d.ts.map +1 -1
  126. package/dist/sketch-debug/markdown.js +1 -0
  127. package/dist/sketch-debug/markdown.js.map +1 -1
  128. package/dist/sketch-debug/report.d.ts.map +1 -1
  129. package/dist/sketch-debug/report.js +4 -4
  130. package/dist/sketch-debug/report.js.map +1 -1
  131. package/dist/sketch-debug/types.d.ts +2 -0
  132. package/dist/sketch-debug/types.d.ts.map +1 -1
  133. package/dist/timeline-debug/frame-geometry.d.ts +118 -0
  134. package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
  135. package/dist/timeline-debug/frame-geometry.js +231 -0
  136. package/dist/timeline-debug/frame-geometry.js.map +1 -0
  137. package/dist/timeline-debug/index.d.ts +1 -0
  138. package/dist/timeline-debug/index.d.ts.map +1 -1
  139. package/dist/timeline-debug/index.js +1 -0
  140. package/dist/timeline-debug/index.js.map +1 -1
  141. package/dist/timeline-debug/legibility.d.ts +8 -4
  142. package/dist/timeline-debug/legibility.d.ts.map +1 -1
  143. package/dist/timeline-debug/legibility.js +47 -18
  144. package/dist/timeline-debug/legibility.js.map +1 -1
  145. package/dist/timeline-debug/score.d.ts +110 -0
  146. package/dist/timeline-debug/score.d.ts.map +1 -0
  147. package/dist/timeline-debug/score.js +231 -0
  148. package/dist/timeline-debug/score.js.map +1 -0
  149. package/dist/timeline-debug/showcase.d.ts +12 -0
  150. package/dist/timeline-debug/showcase.d.ts.map +1 -1
  151. package/dist/timeline-debug/showcase.js +669 -13
  152. package/dist/timeline-debug/showcase.js.map +1 -1
  153. package/dist/timeline-debug/validate.d.ts.map +1 -1
  154. package/dist/timeline-debug/validate.js +121 -2
  155. package/dist/timeline-debug/validate.js.map +1 -1
  156. package/dist/types.d.ts +18 -10
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +13 -13
@@ -0,0 +1,231 @@
1
+ import { buildTransformMatrix, containBaseScale, IDENTITY_TRANSFORM, layoutTextBlock, parseSvgPath } from "@nodetool-ai/timeline/scene";
2
+ /** A `path` shape's frame-pixel bounding box from its `d` data, or
3
+ * `undefined` when the data does not parse. Cubic/quad control points are
4
+ * included, which can only overestimate the box (Bezier curves stay inside
5
+ * their control points' convex hull) — the safe direction for a proxy that
6
+ * would otherwise call a small mark a full-frame background bed. */
7
+ function svgPathLocalBox(d, canvas) {
8
+ const parsed = parseSvgPath(d);
9
+ if (!parsed.ok) {
10
+ return undefined;
11
+ }
12
+ let minX = Number.POSITIVE_INFINITY;
13
+ let minY = Number.POSITIVE_INFINITY;
14
+ let maxX = Number.NEGATIVE_INFINITY;
15
+ let maxY = Number.NEGATIVE_INFINITY;
16
+ const consider = (x, y) => {
17
+ minX = Math.min(minX, x);
18
+ minY = Math.min(minY, y);
19
+ maxX = Math.max(maxX, x);
20
+ maxY = Math.max(maxY, y);
21
+ };
22
+ for (const segment of parsed.segments) {
23
+ if (segment.kind === "move" || segment.kind === "line") {
24
+ consider(segment.x, segment.y);
25
+ }
26
+ else if (segment.kind === "quad") {
27
+ consider(segment.x1, segment.y1);
28
+ consider(segment.x, segment.y);
29
+ }
30
+ else if (segment.kind === "cubic") {
31
+ consider(segment.x1, segment.y1);
32
+ consider(segment.x2, segment.y2);
33
+ consider(segment.x, segment.y);
34
+ }
35
+ }
36
+ if (!Number.isFinite(minX) || !Number.isFinite(minY)) {
37
+ return undefined;
38
+ }
39
+ return {
40
+ x: minX * canvas.width,
41
+ y: minY * canvas.height,
42
+ width: (maxX - minX) * canvas.width,
43
+ height: (maxY - minY) * canvas.height
44
+ };
45
+ }
46
+ /** Pre-transform box in frame pixels. `undefined` for a kind this proxy does
47
+ * not measure (audio, group, adjustment). A media clip's box is the whole
48
+ * frame — its contain-fit base scale is applied in `frameBoxFor`.
49
+ *
50
+ * `sizeOverride` is the box a flex container resized this leaf to
51
+ * (`resolveClipLayoutsWithDiagnostics`'s `sizes` map) — the same override
52
+ * `sceneModel.ts`'s `emitMedia` applies to the clip it hands the renderer, so
53
+ * a flex-resized plate or a rewrapped text block measures at the size it
54
+ * actually draws at, not its pre-layout authored one. */
55
+ export function localBox(clip, canvas, sizeOverride) {
56
+ if (clip.mediaType === "text" && clip.textStyle) {
57
+ const style = sizeOverride
58
+ ? { ...clip.textStyle, maxWidthFrac: Math.min(1, Math.max(0.05, sizeOverride.width / canvas.width)) }
59
+ : clip.textStyle;
60
+ const measure = (text) => text.length * style.fontSizePx * 0.6;
61
+ return layoutTextBlock(measure, style, canvas.width, canvas.height).box;
62
+ }
63
+ if (clip.mediaType === "shape" && clip.shapeStyle) {
64
+ const shape = clip.shapeStyle;
65
+ // A resized shape is pinned to the top-left, not `shapeBox`'s centered
66
+ // (0.25/0.25) default for an unset origin — the same convention
67
+ // `sceneModel.ts`'s own size override uses, because the box being
68
+ // measured is from the frame's top-left.
69
+ if (sizeOverride) {
70
+ return { x: 0, y: 0, width: sizeOverride.width, height: sizeOverride.height };
71
+ }
72
+ // A `path` shape has no `x`/`y`/`width`/`height` of its own — those
73
+ // fields default a `rect`/`ellipse`/`polygon` to the full frame, which is
74
+ // exactly wrong for a small hand-drawn mark and reads as a giant
75
+ // background bed that then collides with everything on screen.
76
+ if (shape.kind === "path" && shape.d) {
77
+ return svgPathLocalBox(shape.d, canvas) ?? { x: 0, y: 0, width: 0, height: 0 };
78
+ }
79
+ return {
80
+ x: (shape.x ?? 0) * canvas.width,
81
+ y: (shape.y ?? 0) * canvas.height,
82
+ width: (shape.width ?? 1) * canvas.width,
83
+ height: (shape.height ?? 1) * canvas.height
84
+ };
85
+ }
86
+ if (["image", "video", "overlay", "model3d"].includes(clip.mediaType)) {
87
+ return { x: 0, y: 0, width: canvas.width, height: canvas.height };
88
+ }
89
+ return undefined;
90
+ }
91
+ function mediaBase(clip, canvas) {
92
+ if (!["image", "video", "overlay", "model3d"].includes(clip.mediaType)) {
93
+ return { x: 1, y: 1 };
94
+ }
95
+ return containBaseScale(clip.width ?? canvas.width, clip.height ?? canvas.height, canvas.width, canvas.height);
96
+ }
97
+ export function projectPoint(x, y, matrix, canvas) {
98
+ const nx = (2 * x) / canvas.width - 1;
99
+ const ny = 1 - (2 * y) / canvas.height;
100
+ const w = matrix[3] * nx + matrix[7] * ny + matrix[15];
101
+ const px = (matrix[0] * nx + matrix[4] * ny + matrix[12]) / w;
102
+ const py = (matrix[1] * nx + matrix[5] * ny + matrix[13]) / w;
103
+ return { x: ((px + 1) * canvas.width) / 2, y: ((1 - py) * canvas.height) / 2 };
104
+ }
105
+ export function projectBox(box, matrix, canvas) {
106
+ const points = [
107
+ [box.x, box.y],
108
+ [box.x + box.width, box.y],
109
+ [box.x, box.y + box.height],
110
+ [box.x + box.width, box.y + box.height]
111
+ ].map(([x, y]) => projectPoint(x, y, matrix, canvas));
112
+ const left = Math.min(...points.map((p) => p.x));
113
+ const top = Math.min(...points.map((p) => p.y));
114
+ return {
115
+ x: left,
116
+ y: top,
117
+ width: Math.max(...points.map((p) => p.x)) - left,
118
+ height: Math.max(...points.map((p) => p.y)) - top
119
+ };
120
+ }
121
+ /** Root-first chain of the clip and every ancestor group it is parented to.
122
+ * Stops at the first non-group parent, same as the scene model. */
123
+ export function ancestorChain(clip, byId) {
124
+ const chain = [clip];
125
+ let parent = clip.parentId ? byId.get(clip.parentId) : undefined;
126
+ while (parent?.mediaType === "group") {
127
+ chain.push(parent);
128
+ parent = parent.parentId ? byId.get(parent.parentId) : undefined;
129
+ }
130
+ return chain.reverse();
131
+ }
132
+ /** Whether `clip` or an ancestor carries a 3D tilt (`rotationX`/`rotationY`)
133
+ * or `perspective`. An axis-aligned box is not a sound proxy for a layer
134
+ * under a projective transform: the true screen footprint is a distorted
135
+ * quadrilateral, and its AABB can be several times taller or narrower than
136
+ * the source box even for ordinary content — a tilted phone-mockup card is
137
+ * the shipped example that shows it. Checks relying on the frame box skip
138
+ * these clips rather than report a geometry the transform makes up. */
139
+ export function hasPerspectiveAncestor(clip, byId) {
140
+ return ancestorChain(clip, byId).some((ancestor) => {
141
+ const t = ancestor.transform;
142
+ return Boolean(t && (t.rotationX || t.rotationY || t.perspective));
143
+ });
144
+ }
145
+ /** `clip`'s transform, or the position/scale a `row`/`stack`/`relative`
146
+ * container resolved for it — the same override the renderer places a
147
+ * layout-managed child with. A clip's own `transform` is stale once it sits
148
+ * in a container: the container decides its box, and measuring the authored
149
+ * field instead reads two stack siblings as stacked at the same spot no
150
+ * matter how far the container's `gapPx` actually holds them apart. */
151
+ export function resolvedTransform(clip, resolved) {
152
+ return resolved.get(clip.id) ?? clip.transform ?? IDENTITY_TRANSFORM;
153
+ }
154
+ /** `transform` with any 3D tilt zeroed — same position/scale/z-rotation, no
155
+ * `rotationX`/`rotationY`/`perspective`. Used only for frame coverage (see
156
+ * `showcase.ts`'s `checkFrameUnderfilled`), where an untilted footprint is a
157
+ * closer approximation of "how much of the frame this covers" than a
158
+ * projective AABB, which can be inflated or skewed under a tilt in a way
159
+ * area alone should not be. */
160
+ export function untiltedTransform(transform) {
161
+ if (!transform.rotationX && !transform.rotationY && !transform.perspective) {
162
+ return transform;
163
+ }
164
+ return { ...transform, rotationX: undefined, rotationY: undefined, perspective: undefined };
165
+ }
166
+ /** `clip`'s (or an overridden local box's) axis-aligned box in frame pixels,
167
+ * composing every ancestor group's transform into one matrix before
168
+ * projecting — a rotated ancestor does not inflate the box the way
169
+ * re-projecting an AABB at each level would. Static: the authored transform,
170
+ * not an animated sample. `flattenPerspective` strips 3D tilt from every
171
+ * ancestor first (see `untiltedTransform`) — an approximation a caller opts
172
+ * into explicitly, never the default.
173
+ *
174
+ * `resolved` (`resolveClipLayoutsWithDiagnostics`'s `transforms` map) is
175
+ * PARENT-LOCAL (packages/timeline/AGENTS.md, "PARENT-LOCAL"): a flex-managed
176
+ * clip's resolved `position` is relative to its flex root's own untranslated
177
+ * frame, with every intermediate flex container's own translation already
178
+ * folded in — never the root's own placement, and never doubled. The
179
+ * renderer (`sceneModel.ts`'s `groupPatchedClips`) adds each ancestor's real
180
+ * translation back exactly once by zeroing a flex-managed *ancestor's* own
181
+ * `position` before composing it (keeping any rotation/scale the author put
182
+ * on it — flex only ever touches `position`), while the target clip itself
183
+ * keeps its full resolved position. This mirrors that: only an ancestor
184
+ * (never the clip whose box this is) gets its flex-resolved position
185
+ * stripped.
186
+ */
187
+ export function composedMatrix(clip, canvas, byId, resolved, flattenPerspective = false) {
188
+ let matrix;
189
+ for (const ancestor of ancestorChain(clip, byId)) {
190
+ const isTarget = ancestor === clip;
191
+ const base = isTarget ? mediaBase(clip, canvas) : { x: 1, y: 1 };
192
+ const flexEntry = resolved.get(ancestor.id);
193
+ const t = isTarget
194
+ ? (flexEntry ?? ancestor.transform ?? IDENTITY_TRANSFORM)
195
+ : flexEntry
196
+ ? { ...flexEntry, position: { x: 0, y: 0 } }
197
+ : (ancestor.transform ?? IDENTITY_TRANSFORM);
198
+ matrix = buildTransformMatrix(flattenPerspective ? untiltedTransform(t) : t, base, canvas.width, canvas.height, matrix);
199
+ }
200
+ return matrix;
201
+ }
202
+ export function frameBoxFor(clip, canvas, byId, resolved, overrideLocal, flattenPerspective = false, sizes) {
203
+ // A flex container can resize a leaf far past its authored `shapeStyle`/
204
+ // `textStyle` box (a plate stretched to `inset: 0` behind a title, a text
205
+ // block rewrapped to a narrower column) — `sizes` is the box that resized
206
+ // it to, the same map `sceneModel.ts`'s `emitMedia` reads to build the
207
+ // clip the renderer actually draws. The clip's resolved *position* already
208
+ // comes from `resolved` the ordinary way (`resolvedTransform`, below); only
209
+ // the pre-transform local box's own width/height need the override, so the
210
+ // position/rotation/scale composition every other clip goes through here
211
+ // stays the one path, flex-resized or not.
212
+ const own = overrideLocal ?? localBox(clip, canvas, sizes?.get(clip.id));
213
+ if (!own) {
214
+ return undefined;
215
+ }
216
+ return projectBox(own, composedMatrix(clip, canvas, byId, resolved, flattenPerspective), canvas);
217
+ }
218
+ /** A box covering this much of the frame is a bed, not content — see
219
+ * `showcase.ts`. Not used by `legibility.ts`, which wants the opposite: a
220
+ * full-frame shape is still a valid backdrop to read a colour off. */
221
+ export const BACKGROUND_COVERAGE = 0.9;
222
+ export function isBackgroundBed(box, canvas) {
223
+ return box.width * box.height >= BACKGROUND_COVERAGE * canvas.width * canvas.height;
224
+ }
225
+ export function containsBox(outer, inner, eps = 0.5) {
226
+ return (inner.x >= outer.x - eps &&
227
+ inner.y >= outer.y - eps &&
228
+ inner.x + inner.width <= outer.x + outer.width + eps &&
229
+ inner.y + inner.height <= outer.y + outer.height + eps);
230
+ }
231
+ //# sourceMappingURL=frame-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-geometry.js","sourceRoot":"","sources":["../../src/timeline-debug/frame-geometry.ts"],"names":[],"mappings":"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"}
@@ -8,4 +8,5 @@ export type { TimelineDebugIssue, TimelineValidation, TimelineInteractionRecord,
8
8
  export { validateTimelineSequence, collectStrippedPaths } from "./validate.js";
9
9
  export { buildTimelineDebugReport } from "./report.js";
10
10
  export { renderTimelineReportMarkdown } from "./markdown.js";
11
+ export { scoreTimelineCraft, computeTimelineCraftMetrics, summarizeTimelineCraftReferenceBand, loadTimelineCraftReferenceEntries, TIMELINE_CRAFT_METRIC_KEYS, type TimelineCraftMetricKey, type TimelineCraftMetrics, type TimelineCraftMetricScore, type TimelineCraftReferenceEntry, type TimelineCraftReferenceBand, type TimelineCraftScoreResult, type ScoreTimelineCraftOptions } from "./score.js";
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,mCAAmC,EACnC,iCAAiC,EACjC,0BAA0B,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC/B,MAAM,YAAY,CAAC"}
@@ -7,4 +7,5 @@
7
7
  export { validateTimelineSequence, collectStrippedPaths } from "./validate.js";
8
8
  export { buildTimelineDebugReport } from "./report.js";
9
9
  export { renderTimelineReportMarkdown } from "./markdown.js";
10
+ export { scoreTimelineCraft, computeTimelineCraftMetrics, summarizeTimelineCraftReferenceBand, loadTimelineCraftReferenceEntries, TIMELINE_CRAFT_METRIC_KEYS } from "./score.js";
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/timeline-debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/timeline-debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,mCAAmC,EACnC,iCAAiC,EACjC,0BAA0B,EAQ3B,MAAM,YAAY,CAAC"}
@@ -15,9 +15,13 @@
15
15
  import type { TimelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
16
16
  import type { TimelineDebugIssue } from "./types.js";
17
17
  /**
18
- * Legibility findings for every text clip in the document. `frameHeight` is the
19
- * sequence's pixel height — a font size is authored in sequence pixels, so the
20
- * floor is a fraction of that and not of anything on the author's screen.
18
+ * Legibility findings for every text clip in the document. `canvas` is the
19
+ * sequence's pixel size — a font size is authored in sequence pixels, so the
20
+ * floor is a fraction of the height and not of anything on the author's
21
+ * screen, and the backdrop check below resolves every clip's box against it.
21
22
  */
22
- export declare function checkLegibility(doc: TimelineDocument, frameHeight: number): TimelineDebugIssue[];
23
+ export declare function checkLegibility(doc: TimelineDocument, canvas: {
24
+ width: number;
25
+ height: number;
26
+ }): TimelineDebugIssue[];
23
27
  //# sourceMappingURL=legibility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"legibility.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/legibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoMrD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,MAAM,GAClB,kBAAkB,EAAE,CAuDtB"}
1
+ {"version":3,"file":"legibility.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/legibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA4NrD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,kBAAkB,EAAE,CA+DtB"}
@@ -1,3 +1,5 @@
1
+ import { resolveClipLayoutsWithDiagnostics } from "@nodetool-ai/timeline/scene";
2
+ import { containsBox, frameBoxFor } from "./frame-geometry.js";
1
3
  /**
2
4
  * Cap height a viewer can read on a phone. 2.5% of frame height is 27px at
3
5
  * 1080p — the floor broadcast lower-third practice lands on, and the one the
@@ -98,13 +100,31 @@ function textColor(clip) {
98
100
  * on screen, and provably covers it.
99
101
  *
100
102
  * "Provably" is doing the work. Track z is `1000 - index` (I9), so a higher
101
- * index draws underneath; the shape must cover the whole frame, because the
102
- * text's own block box needs a font measurement this check does not have; it
103
- * must be opaque and solid-filled; and its window must contain the text's. A
104
- * shape that only mostly qualifies is not reported — the check would then be
105
- * naming a plate the title may not actually sit on.
103
+ * index draws underneath; the shape must be opaque and solid-filled; its
104
+ * window must contain the text's; and its *resolved* frame-space box — the
105
+ * layout-managed position a `row`/`stack`/`relative` container placed it at,
106
+ * composed through every ancestor transform, the same geometry
107
+ * `showcase.ts`'s collision check reads — must contain the text's box. A
108
+ * literal full-frame rect always qualifies this way (its box contains
109
+ * anything), so this subsumes the old "must be exactly x=0,y=0,w=1,h=1"
110
+ * rule; it additionally recognizes the small pill or plate a flex container
111
+ * places directly behind a title (an `inset: 0` child of the text's own
112
+ * container), which the old rule missed and measured contrast against
113
+ * whatever unrelated full-frame shape happened to sit elsewhere in the
114
+ * scene instead. A shape that only mostly contains the text is not reported
115
+ * — the check would then be naming a plate the title does not actually sit
116
+ * fully on.
106
117
  */
107
- function backdropShapeColor(doc, text) {
118
+ // Wider than `containsBox`'s own 0.5px default: a text box is a *character-
119
+ // count* estimate (`text.length * fontSizePx * 0.6`, this package has no
120
+ // canvas dependency to measure real glyph widths), not a rendered one, and a
121
+ // tight pill sized to the real glyph width can end up a couple of px
122
+ // narrower than the estimate — see prism's "4 COLOURWAYS" plate, sized to
123
+ // 300px against an estimated 302.4px title. A few px of slack absorbs that
124
+ // estimation error without accepting a shape that is actually a different
125
+ // size from the text's.
126
+ const BACKDROP_CONTAINMENT_SLACK_PX = 4;
127
+ function backdropShapeColor(doc, text, canvas, byId, resolved, sizes) {
108
128
  const trackIndex = new Map(doc.tracks
109
129
  .filter((track) => track.type !== "audio" && track.visible)
110
130
  .map((track) => [track.id, track.index]));
@@ -112,6 +132,9 @@ function backdropShapeColor(doc, text) {
112
132
  if (textIndex === undefined)
113
133
  return undefined;
114
134
  const textEndMs = text.startMs + text.durationMs;
135
+ const textBox = frameBoxFor(text, canvas, byId, resolved, undefined, false, sizes);
136
+ if (!textBox)
137
+ return undefined;
115
138
  let bestIndex = Number.POSITIVE_INFINITY;
116
139
  let bestColor;
117
140
  for (const clip of doc.clips) {
@@ -130,12 +153,6 @@ function backdropShapeColor(doc, text) {
130
153
  const style = clip.shapeStyle;
131
154
  if (!style || style.kind !== "rect")
132
155
  continue;
133
- // `shapeBox` defaults: a rect with no geometry covers the middle half of
134
- // the frame, so an absent field is not "full frame".
135
- if ((style.x ?? 0.25) > 0 || (style.y ?? 0.25) > 0)
136
- continue;
137
- if ((style.width ?? 0.5) < 1 || (style.height ?? 0.5) < 1)
138
- continue;
139
156
  const authoredFill = style.fillStyle ?? style.fill;
140
157
  const fill = typeof authoredFill === "string"
141
158
  ? authoredFill
@@ -144,6 +161,9 @@ function backdropShapeColor(doc, text) {
144
161
  : undefined;
145
162
  if (fill === undefined)
146
163
  continue;
164
+ const shapeBox = frameBoxFor(clip, canvas, byId, resolved, undefined, false, sizes);
165
+ if (!shapeBox || !containsBox(shapeBox, textBox, BACKDROP_CONTAINMENT_SLACK_PX))
166
+ continue;
147
167
  bestIndex = index;
148
168
  bestColor = fill;
149
169
  }
@@ -177,12 +197,21 @@ function pictureUnder(doc, text) {
177
197
  });
178
198
  }
179
199
  /**
180
- * Legibility findings for every text clip in the document. `frameHeight` is the
181
- * sequence's pixel height — a font size is authored in sequence pixels, so the
182
- * floor is a fraction of that and not of anything on the author's screen.
200
+ * Legibility findings for every text clip in the document. `canvas` is the
201
+ * sequence's pixel size — a font size is authored in sequence pixels, so the
202
+ * floor is a fraction of the height and not of anything on the author's
203
+ * screen, and the backdrop check below resolves every clip's box against it.
183
204
  */
184
- export function checkLegibility(doc, frameHeight) {
205
+ export function checkLegibility(doc, canvas) {
185
206
  const issues = [];
207
+ const byId = new Map(doc.clips.map((clip) => [clip.id, clip]));
208
+ // No `measureText`: this package has no canvas dependency, so text boxes
209
+ // fall back to the same `text.length * fontSizePx * 0.6` estimate
210
+ // `frame-geometry.ts` and the render layout resolver itself use headless.
211
+ const layoutResolved = resolveClipLayoutsWithDiagnostics(doc.clips, canvas);
212
+ const resolved = layoutResolved.transforms;
213
+ const sizes = layoutResolved.sizes;
214
+ const frameHeight = canvas.height;
186
215
  for (const clip of doc.clips) {
187
216
  const style = clip.textStyle;
188
217
  if (clip.mediaType !== "text" || !style || clip.hidden === true)
@@ -206,7 +235,7 @@ export function checkLegibility(doc, frameHeight) {
206
235
  // the tool that answers it.
207
236
  const backed = style.background !== undefined ||
208
237
  style.stroke !== undefined ||
209
- backdropShapeColor(doc, clip) !== undefined;
238
+ backdropShapeColor(doc, clip, canvas, byId, resolved, sizes) !== undefined;
210
239
  if (!backed && pictureUnder(doc, clip)) {
211
240
  issues.push({
212
241
  severity: "warning",
@@ -220,7 +249,7 @@ export function checkLegibility(doc, frameHeight) {
220
249
  if (!foreground)
221
250
  continue;
222
251
  const plate = style.background?.color;
223
- const behind = plate ?? backdropShapeColor(doc, clip);
252
+ const behind = plate ?? backdropShapeColor(doc, clip, canvas, byId, resolved, sizes);
224
253
  const background = parseOpaqueColor(behind);
225
254
  if (!background)
226
255
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"legibility.js","sourceRoot":"","sources":["../../src/timeline-debug/legibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"legibility.js","sourceRoot":"","sources":["../../src/timeline-debug/legibility.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG/D;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,+EAA+E;AAC/E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAC1C,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAC,CAAC,CAAC;AAQJ;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC;IAEjE,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/D,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CACzB,CAAC;YACF,OAAO,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBACnC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBACnC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;aACpC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GACP,2FAA2F,CAAC,IAAI,CAC9F,KAAK,CACN,CAAC;IACJ,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC;AAC/D,CAAC;AAED,iDAAiD;AACjD,SAAS,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAO;IACzC,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC;QACxB,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;AACzE,CAAC;AAED,iEAAiE;AACjE,SAAS,aAAa,CAAC,CAAM,EAAE,CAAM;IACnC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACrE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAChB,CAAC;IACF,OAAO,CAAC,KAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAK,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,IAAkB;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,qEAAqE;AACrE,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,wBAAwB;AACxB,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,SAAS,kBAAkB,CACzB,GAAqB,EACrB,IAAkB,EAClB,MAAyC,EACzC,IAAuC,EACvC,QAA4C,EAC5C,KAA6D;IAE7D,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,GAAG,CAAC,MAAM;SACP,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;SAC1D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAC3C,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;IACjD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACnF,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,IAAI,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACzC,IAAI,SAA6B,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,SAAS;QACjE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QACjE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;YAAE,SAAS;QAC1C,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS;YAAE,SAAS;QAEzD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC;QACnD,MAAM,IAAI,GACR,OAAO,YAAY,KAAK,QAAQ;YAC9B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,YAAY,EAAE,IAAI,KAAK,OAAO;gBAC9B,CAAC,CAAC,YAAY,CAAC,KAAK;gBACpB,CAAC,CAAC,SAAS,CAAC;QAClB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACpF,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,6BAA6B,CAAC;YAAE,SAAS;QAE1F,SAAS,GAAG,KAAK,CAAC;QAClB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,GAAqB,EAAE,IAAkB;IAC7D,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,GAAG,CAAC,MAAM;SACP,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;SAC1D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAC3C,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;IACjD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAqB,EACrB,MAAyC;IAEzC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,yEAAyE;IACzE,kEAAkE;IAClE,0EAA0E;IAC1E,MAAM,cAAc,GAAG,iCAAiC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,SAAS;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAEtD,MAAM,KAAK,GAAG,WAAW,GAAG,oBAAoB,CAAC;QACjD,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,SAAS,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,WAAW,oBAAoB,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC;gBAChO,IAAI,EAAE,sBAAsB;gBAC5B,GAAG,EAAE;aACN,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,wEAAwE;QACxE,wEAAwE;QACxE,4BAA4B;QAC5B,MAAM,MAAM,GACV,KAAK,CAAC,UAAU,KAAK,SAAS;YAC9B,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC;QAC7E,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,SAAS,KAAK,oNAAoN;gBAC3O,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE;aACN,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,kBAAkB;YAAE,SAAS;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,SAAS,KAAK,WAAW,SAAS,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B,0BAA0B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,kBAAkB,sBAAsB;YACzO,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,iBAAiB;YAC9D,GAAG,EAAE;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Deterministic craft scorecard for a timeline document.
3
+ *
4
+ * `timeline validate` answers "is this document sound." This answers a
5
+ * different question — "does this document approach the density and polish
6
+ * of the shipped showcase examples" — without an LLM judge, so an agent
7
+ * harness change can be measured against a fixed baseline run after run.
8
+ *
9
+ * The metric set mirrors what a human reviewer counted by hand: motion
10
+ * density (animations/keyframes per visible second), the breadth of what is
11
+ * animated (distinct properties, effect types, showcase-only feature flags),
12
+ * and structural craft (style tracks, text animators, authored transitions,
13
+ * scene count — the number of distinct cut points on the timeline). Each
14
+ * metric is compared against the **reference band**: the same metrics
15
+ * computed for the shipped showcase examples
16
+ * (`packages/base-nodes/nodetool/examples/timelines/*.timeline.json`,
17
+ * excluding `t-minus-30`, which is footage-based rather than motion
18
+ * graphics) via `@nodetool-ai/timeline/examples/node` — the same loader the
19
+ * product uses to install and preview them, so the band tracks the shipped
20
+ * set without a second copy of it.
21
+ *
22
+ * Score formula, kept simple and explainable rather than clever: each metric
23
+ * earns 0.4 credit outright, plus up to 0.6 more for reaching the reference
24
+ * median (capped at 1.0 credit — exceeding the median earns nothing further).
25
+ * The score is the mean credit across metrics, as a percentage, minus 5
26
+ * points per *distinct* showcase-tier warning code the document carries
27
+ * (`checkShowcase` in `showcase.ts`, run through
28
+ * `validateTimelineSequence(doc, { tier: "showcase" })` — new codes land here
29
+ * automatically). Distinct, not per instance: four `showcase_text_collision`
30
+ * findings on four different clip pairs are one craft gap, not four, and
31
+ * penalizing by instance count lets one noisy, high-cardinality check
32
+ * dominate the score. `showcaseWarnings` still lists every instance (with
33
+ * its clip and message) and `showcaseWarningCodeCounts` breaks that list down
34
+ * by code, so nothing about volume is hidden — only the penalty is capped to
35
+ * "how many distinct things are wrong," not "how many places." The floor
36
+ * keeps one missing technique from cratering an otherwise dense, polished
37
+ * document; the median cap keeps a pathologically bloated document from
38
+ * buying an unbounded score by piling on one metric.
39
+ */
40
+ import { type TimelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
41
+ import type { TimelineDebugIssue, TimelineValidation } from "./types.js";
42
+ /** The metrics scored, in the order they are reported. */
43
+ export declare const TIMELINE_CRAFT_METRIC_KEYS: readonly ["animationsPerSecond", "keyframesPerSecond", "distinctAnimatedProperties", "distinctEffectTypes", "featureFlagsUsed", "styleTracks", "textAnimators", "authoredTransitions", "sceneCount"];
44
+ export type TimelineCraftMetricKey = (typeof TIMELINE_CRAFT_METRIC_KEYS)[number];
45
+ export interface TimelineCraftMetrics extends Record<TimelineCraftMetricKey, number> {
46
+ /** Context, not scored: raw clip count. */
47
+ clipCount: number;
48
+ /** Context, not scored: seconds from 0 to the latest clip's end, floored at 1s. */
49
+ visibleSeconds: number;
50
+ }
51
+ /** Compute the craft metric set for a parsed timeline document. */
52
+ export declare function computeTimelineCraftMetrics(document: TimelineDocument): TimelineCraftMetrics;
53
+ export interface TimelineCraftReferenceEntry {
54
+ slug: string;
55
+ metrics: TimelineCraftMetrics;
56
+ }
57
+ export interface TimelineCraftReferenceBand {
58
+ entries: TimelineCraftReferenceEntry[];
59
+ /** Median of each metric across `entries`. 0 when there are no entries. */
60
+ median: Record<TimelineCraftMetricKey, number>;
61
+ }
62
+ /** Reduce a set of reference entries to the per-metric median a score compares against. */
63
+ export declare function summarizeTimelineCraftReferenceBand(entries: readonly TimelineCraftReferenceEntry[]): TimelineCraftReferenceBand;
64
+ /**
65
+ * The reference band, computed at runtime from the shipped examples — the
66
+ * same files and the same loader (`@nodetool-ai/timeline/examples/node`) the
67
+ * product installs and previews them from, so this never drifts from a second
68
+ * copy of the set.
69
+ */
70
+ export declare function loadTimelineCraftReferenceEntries(): Promise<TimelineCraftReferenceEntry[]>;
71
+ /** Each metric's reported value against the reference band, plus its credit. */
72
+ export interface TimelineCraftMetricScore {
73
+ metric: TimelineCraftMetricKey;
74
+ value: number;
75
+ referenceMedian: number;
76
+ /** `value / referenceMedian`, uncapped — for display, not part of the score math. */
77
+ ratio: number;
78
+ /** 0..1 contribution to the score: the floor, plus a ramp to the median, capped at 1. */
79
+ credit: number;
80
+ }
81
+ export interface TimelineCraftScoreResult {
82
+ /** 0-100, clamped: `rawScore` minus the showcase-warning penalty. */
83
+ score: number;
84
+ /** 0-100 before the penalty: the mean metric credit. */
85
+ rawScore: number;
86
+ /** `PENALTY_PER_SHOWCASE_WARNING_CODE` × the number of distinct codes in `showcaseWarnings`. */
87
+ penalty: number;
88
+ metrics: TimelineCraftMetrics;
89
+ metricScores: TimelineCraftMetricScore[];
90
+ reference: TimelineCraftReferenceBand;
91
+ /** Every showcase-tier warning instance — one row per finding, not deduplicated. */
92
+ showcaseWarnings: TimelineDebugIssue[];
93
+ /** `showcaseWarnings` grouped by code, e.g. `{ showcase_text_collision: 4 }` — instance volume, kept visible even though the penalty is per code. */
94
+ showcaseWarningCodeCounts: Record<string, number>;
95
+ validation: TimelineValidation;
96
+ }
97
+ export interface ScoreTimelineCraftOptions {
98
+ fps?: number;
99
+ width?: number;
100
+ height?: number;
101
+ /** Defaults to `loadTimelineCraftReferenceEntries`. Tests inject a fixed band. */
102
+ referenceEntries?: readonly TimelineCraftReferenceEntry[];
103
+ }
104
+ /**
105
+ * Score a timeline document's craft against the shipped showcase examples.
106
+ * Never throws on a malformed document — an unparseable document scores 0 on
107
+ * every metric, and `validation.ok` says why.
108
+ */
109
+ export declare function scoreTimelineCraft(raw: unknown, options?: ScoreTimelineCraftOptions): Promise<TimelineCraftScoreResult>;
110
+ //# sourceMappingURL=score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAazE,0DAA0D;AAC1D,eAAO,MAAM,0BAA0B,YACrC,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,YAAY,CACJ,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,oBACf,SAAQ,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,mEAAmE;AACnE,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,gBAAgB,GACzB,oBAAoB,CA0DtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACvC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;CAChD;AAWD,2FAA2F;AAC3F,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,SAAS,2BAA2B,EAAE,GAC9C,0BAA0B,CAQ5B;AAOD;;;;;GAKG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAChE,2BAA2B,EAAE,CAC9B,CAqBA;AAED,gFAAgF;AAChF,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,EAAE,CAAC;IACzC,SAAS,EAAE,0BAA0B,CAAC;IACtC,oFAAoF;IACpF,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,qJAAqJ;IACrJ,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAOD,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC3D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA0DnC"}