@nodetool-ai/execution 0.8.1 → 0.8.3
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.
- package/README.md +23 -127
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/app-debug/app-spec.d.ts.map +1 -1
- package/dist/app-debug/app-spec.js +3 -0
- package/dist/app-debug/app-spec.js.map +1 -1
- package/dist/app-debug/application-target.d.ts +1 -1
- package/dist/app-debug/application-target.d.ts.map +1 -1
- package/dist/app-debug/application-target.js +5 -3
- package/dist/app-debug/application-target.js.map +1 -1
- package/dist/app-debug/index.d.ts +4 -2
- package/dist/app-debug/index.d.ts.map +1 -1
- package/dist/app-debug/index.js +3 -2
- package/dist/app-debug/index.js.map +1 -1
- package/dist/app-debug/run-recording.d.ts +20 -0
- package/dist/app-debug/run-recording.d.ts.map +1 -0
- package/dist/app-debug/run-recording.js +105 -0
- package/dist/app-debug/run-recording.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +2 -0
- package/dist/app-debug/runtime.d.ts.map +1 -1
- package/dist/app-debug/runtime.js +19 -4
- package/dist/app-debug/runtime.js.map +1 -1
- package/dist/app-debug/simulate.d.ts +10 -1
- package/dist/app-debug/simulate.d.ts.map +1 -1
- package/dist/app-debug/simulate.js +67 -27
- package/dist/app-debug/simulate.js.map +1 -1
- package/dist/app-debug/summarize.d.ts +1 -0
- package/dist/app-debug/summarize.d.ts.map +1 -1
- package/dist/app-debug/summarize.js +1 -0
- package/dist/app-debug/summarize.js.map +1 -1
- package/dist/app-debug/types.d.ts +6 -4
- package/dist/app-debug/types.d.ts.map +1 -1
- package/dist/app-run-generation.d.ts +8 -0
- package/dist/app-run-generation.d.ts.map +1 -0
- package/dist/app-run-generation.js +61 -0
- package/dist/app-run-generation.js.map +1 -0
- package/dist/browser-app-run.d.ts +10 -0
- package/dist/browser-app-run.d.ts.map +1 -0
- package/dist/browser-app-run.js +108 -0
- package/dist/browser-app-run.js.map +1 -0
- package/dist/browser-run-spans.d.ts +4 -0
- package/dist/browser-run-spans.d.ts.map +1 -0
- package/dist/browser-run-spans.js +115 -0
- package/dist/browser-run-spans.js.map +1 -0
- package/dist/browser-trace-policy.d.ts +12 -0
- package/dist/browser-trace-policy.d.ts.map +1 -0
- package/dist/browser-trace-policy.js +40 -0
- package/dist/browser-trace-policy.js.map +1 -0
- package/dist/cost-ledger.d.ts +3 -0
- package/dist/cost-ledger.d.ts.map +1 -1
- package/dist/cost-ledger.js +23 -2
- package/dist/cost-ledger.js.map +1 -1
- package/dist/debug/types.d.ts +1 -0
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/verdict.d.ts +26 -1
- package/dist/debug/verdict.d.ts.map +1 -1
- package/dist/debug/verdict.js +36 -0
- package/dist/debug/verdict.js.map +1 -1
- package/dist/generation-lifecycle.d.ts +5 -4
- package/dist/generation-lifecycle.d.ts.map +1 -1
- package/dist/generation-lifecycle.js +71 -10
- package/dist/generation-lifecycle.js.map +1 -1
- package/dist/generation-recovery-worker.d.ts.map +1 -1
- package/dist/generation-recovery-worker.js +2 -0
- package/dist/generation-recovery-worker.js.map +1 -1
- package/dist/generation-tracker.d.ts +2 -15
- package/dist/generation-tracker.d.ts.map +1 -1
- package/dist/generation-tracker.js +92 -6
- package/dist/generation-tracker.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/js-script-debug/index.d.ts +1 -0
- package/dist/js-script-debug/index.d.ts.map +1 -1
- package/dist/js-script-debug/index.js +1 -0
- package/dist/js-script-debug/index.js.map +1 -1
- package/dist/js-script-debug/report.d.ts.map +1 -1
- package/dist/js-script-debug/report.js +9 -24
- package/dist/js-script-debug/report.js.map +1 -1
- package/dist/js-script-debug/type-check.d.ts +16 -0
- package/dist/js-script-debug/type-check.d.ts.map +1 -0
- package/dist/js-script-debug/type-check.js +150 -0
- package/dist/js-script-debug/type-check.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +8 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -1
- package/dist/js-script-debug/validate.js +4 -0
- package/dist/js-script-debug/validate.js.map +1 -1
- package/dist/message-stream.d.ts +1 -32
- package/dist/message-stream.d.ts.map +1 -1
- package/dist/message-stream.js +1 -57
- package/dist/message-stream.js.map +1 -1
- package/dist/partial-run.d.ts +65 -0
- package/dist/partial-run.d.ts.map +1 -0
- package/dist/partial-run.js +300 -0
- package/dist/partial-run.js.map +1 -0
- package/dist/preflight.d.ts +43 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +78 -4
- package/dist/preflight.js.map +1 -1
- package/dist/run-trace-store.d.ts +9 -0
- package/dist/run-trace-store.d.ts.map +1 -0
- package/dist/run-trace-store.js +57 -0
- package/dist/run-trace-store.js.map +1 -0
- package/dist/runs.d.ts +16 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +431 -0
- package/dist/runs.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +4 -2
- package/dist/service/app-debug-service.d.ts.map +1 -1
- package/dist/service/app-debug-service.js +73 -31
- package/dist/service/app-debug-service.js.map +1 -1
- package/dist/service/app-operation.d.ts +39 -0
- package/dist/service/app-operation.d.ts.map +1 -0
- package/dist/service/app-operation.js +271 -0
- package/dist/service/app-operation.js.map +1 -0
- package/dist/service/app-run-server.d.ts +3 -1
- package/dist/service/app-run-server.d.ts.map +1 -1
- package/dist/service/app-run-server.js +22 -14
- package/dist/service/app-run-server.js.map +1 -1
- package/dist/service/index.d.ts +5 -1
- package/dist/service/index.d.ts.map +1 -1
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -1
- package/dist/service/run-trace-lifecycle.d.ts +34 -0
- package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
- package/dist/service/run-trace-lifecycle.js +135 -0
- package/dist/service/run-trace-lifecycle.js.map +1 -0
- package/dist/service/workflow-run.d.ts +47 -16
- package/dist/service/workflow-run.d.ts.map +1 -1
- package/dist/service/workflow-run.js +210 -78
- package/dist/service/workflow-run.js.map +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +109 -100
- package/dist/session.js.map +1 -1
- package/dist/sketch-debug/markdown.d.ts.map +1 -1
- package/dist/sketch-debug/markdown.js +1 -0
- package/dist/sketch-debug/markdown.js.map +1 -1
- package/dist/sketch-debug/report.d.ts.map +1 -1
- package/dist/sketch-debug/report.js +19 -28
- package/dist/sketch-debug/report.js.map +1 -1
- package/dist/sketch-debug/types.d.ts +2 -0
- package/dist/sketch-debug/types.d.ts.map +1 -1
- package/dist/timeline-debug/frame-geometry.d.ts +120 -0
- package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
- package/dist/timeline-debug/frame-geometry.js +238 -0
- package/dist/timeline-debug/frame-geometry.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +1 -0
- package/dist/timeline-debug/index.d.ts.map +1 -1
- package/dist/timeline-debug/index.js +1 -0
- package/dist/timeline-debug/index.js.map +1 -1
- package/dist/timeline-debug/legibility.d.ts +8 -4
- package/dist/timeline-debug/legibility.d.ts.map +1 -1
- package/dist/timeline-debug/legibility.js +47 -18
- package/dist/timeline-debug/legibility.js.map +1 -1
- package/dist/timeline-debug/report.d.ts.map +1 -1
- package/dist/timeline-debug/report.js +16 -25
- package/dist/timeline-debug/report.js.map +1 -1
- package/dist/timeline-debug/score.d.ts +110 -0
- package/dist/timeline-debug/score.d.ts.map +1 -0
- package/dist/timeline-debug/score.js +231 -0
- package/dist/timeline-debug/score.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +12 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -1
- package/dist/timeline-debug/showcase.js +669 -13
- package/dist/timeline-debug/showcase.js.map +1 -1
- package/dist/timeline-debug/validate.d.ts.map +1 -1
- package/dist/timeline-debug/validate.js +121 -2
- package/dist/timeline-debug/validate.js.map +1 -1
- package/dist/types.d.ts +18 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,238 @@
|
|
|
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. A chain that
|
|
123
|
+
* loops back on itself is refused (`parent_cycle` in `validate.ts`), so the
|
|
124
|
+
* clip is treated as unparented. */
|
|
125
|
+
export function ancestorChain(clip, byId) {
|
|
126
|
+
const chain = [clip];
|
|
127
|
+
const seen = new Set([clip.id]);
|
|
128
|
+
let parent = clip.parentId ? byId.get(clip.parentId) : undefined;
|
|
129
|
+
while (parent?.mediaType === "group") {
|
|
130
|
+
if (seen.has(parent.id)) {
|
|
131
|
+
return [clip];
|
|
132
|
+
}
|
|
133
|
+
seen.add(parent.id);
|
|
134
|
+
chain.push(parent);
|
|
135
|
+
parent = parent.parentId ? byId.get(parent.parentId) : undefined;
|
|
136
|
+
}
|
|
137
|
+
return chain.reverse();
|
|
138
|
+
}
|
|
139
|
+
/** Whether `clip` or an ancestor carries a 3D tilt (`rotationX`/`rotationY`)
|
|
140
|
+
* or `perspective`. An axis-aligned box is not a sound proxy for a layer
|
|
141
|
+
* under a projective transform: the true screen footprint is a distorted
|
|
142
|
+
* quadrilateral, and its AABB can be several times taller or narrower than
|
|
143
|
+
* the source box even for ordinary content — a tilted phone-mockup card is
|
|
144
|
+
* the shipped example that shows it. Checks relying on the frame box skip
|
|
145
|
+
* these clips rather than report a geometry the transform makes up. */
|
|
146
|
+
export function hasPerspectiveAncestor(clip, byId) {
|
|
147
|
+
return ancestorChain(clip, byId).some((ancestor) => {
|
|
148
|
+
const t = ancestor.transform;
|
|
149
|
+
return Boolean(t && (t.rotationX || t.rotationY || t.perspective));
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** `clip`'s transform, or the position/scale a `row`/`stack`/`relative`
|
|
153
|
+
* container resolved for it — the same override the renderer places a
|
|
154
|
+
* layout-managed child with. A clip's own `transform` is stale once it sits
|
|
155
|
+
* in a container: the container decides its box, and measuring the authored
|
|
156
|
+
* field instead reads two stack siblings as stacked at the same spot no
|
|
157
|
+
* matter how far the container's `gapPx` actually holds them apart. */
|
|
158
|
+
export function resolvedTransform(clip, resolved) {
|
|
159
|
+
return resolved.get(clip.id) ?? clip.transform ?? IDENTITY_TRANSFORM;
|
|
160
|
+
}
|
|
161
|
+
/** `transform` with any 3D tilt zeroed — same position/scale/z-rotation, no
|
|
162
|
+
* `rotationX`/`rotationY`/`perspective`. Used only for frame coverage (see
|
|
163
|
+
* `showcase.ts`'s `checkFrameUnderfilled`), where an untilted footprint is a
|
|
164
|
+
* closer approximation of "how much of the frame this covers" than a
|
|
165
|
+
* projective AABB, which can be inflated or skewed under a tilt in a way
|
|
166
|
+
* area alone should not be. */
|
|
167
|
+
export function untiltedTransform(transform) {
|
|
168
|
+
if (!transform.rotationX && !transform.rotationY && !transform.perspective) {
|
|
169
|
+
return transform;
|
|
170
|
+
}
|
|
171
|
+
return { ...transform, rotationX: undefined, rotationY: undefined, perspective: undefined };
|
|
172
|
+
}
|
|
173
|
+
/** `clip`'s (or an overridden local box's) axis-aligned box in frame pixels,
|
|
174
|
+
* composing every ancestor group's transform into one matrix before
|
|
175
|
+
* projecting — a rotated ancestor does not inflate the box the way
|
|
176
|
+
* re-projecting an AABB at each level would. Static: the authored transform,
|
|
177
|
+
* not an animated sample. `flattenPerspective` strips 3D tilt from every
|
|
178
|
+
* ancestor first (see `untiltedTransform`) — an approximation a caller opts
|
|
179
|
+
* into explicitly, never the default.
|
|
180
|
+
*
|
|
181
|
+
* `resolved` (`resolveClipLayoutsWithDiagnostics`'s `transforms` map) is
|
|
182
|
+
* PARENT-LOCAL (packages/timeline/AGENTS.md, "PARENT-LOCAL"): a flex-managed
|
|
183
|
+
* clip's resolved `position` is relative to its flex root's own untranslated
|
|
184
|
+
* frame, with every intermediate flex container's own translation already
|
|
185
|
+
* folded in — never the root's own placement, and never doubled. The
|
|
186
|
+
* renderer (`sceneModel.ts`'s `groupPatchedClips`) adds each ancestor's real
|
|
187
|
+
* translation back exactly once by zeroing a flex-managed *ancestor's* own
|
|
188
|
+
* `position` before composing it (keeping any rotation/scale the author put
|
|
189
|
+
* on it — flex only ever touches `position`), while the target clip itself
|
|
190
|
+
* keeps its full resolved position. This mirrors that: only an ancestor
|
|
191
|
+
* (never the clip whose box this is) gets its flex-resolved position
|
|
192
|
+
* stripped.
|
|
193
|
+
*/
|
|
194
|
+
export function composedMatrix(clip, canvas, byId, resolved, flattenPerspective = false) {
|
|
195
|
+
let matrix;
|
|
196
|
+
for (const ancestor of ancestorChain(clip, byId)) {
|
|
197
|
+
const isTarget = ancestor === clip;
|
|
198
|
+
const base = isTarget ? mediaBase(clip, canvas) : { x: 1, y: 1 };
|
|
199
|
+
const flexEntry = resolved.get(ancestor.id);
|
|
200
|
+
const t = isTarget
|
|
201
|
+
? (flexEntry ?? ancestor.transform ?? IDENTITY_TRANSFORM)
|
|
202
|
+
: flexEntry
|
|
203
|
+
? { ...flexEntry, position: { x: 0, y: 0 } }
|
|
204
|
+
: (ancestor.transform ?? IDENTITY_TRANSFORM);
|
|
205
|
+
matrix = buildTransformMatrix(flattenPerspective ? untiltedTransform(t) : t, base, canvas.width, canvas.height, matrix);
|
|
206
|
+
}
|
|
207
|
+
return matrix;
|
|
208
|
+
}
|
|
209
|
+
export function frameBoxFor(clip, canvas, byId, resolved, overrideLocal, flattenPerspective = false, sizes) {
|
|
210
|
+
// A flex container can resize a leaf far past its authored `shapeStyle`/
|
|
211
|
+
// `textStyle` box (a plate stretched to `inset: 0` behind a title, a text
|
|
212
|
+
// block rewrapped to a narrower column) — `sizes` is the box that resized
|
|
213
|
+
// it to, the same map `sceneModel.ts`'s `emitMedia` reads to build the
|
|
214
|
+
// clip the renderer actually draws. The clip's resolved *position* already
|
|
215
|
+
// comes from `resolved` the ordinary way (`resolvedTransform`, below); only
|
|
216
|
+
// the pre-transform local box's own width/height need the override, so the
|
|
217
|
+
// position/rotation/scale composition every other clip goes through here
|
|
218
|
+
// stays the one path, flex-resized or not.
|
|
219
|
+
const own = overrideLocal ?? localBox(clip, canvas, sizes?.get(clip.id));
|
|
220
|
+
if (!own) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
return projectBox(own, composedMatrix(clip, canvas, byId, resolved, flattenPerspective), canvas);
|
|
224
|
+
}
|
|
225
|
+
/** A box covering this much of the frame is a bed, not content — see
|
|
226
|
+
* `showcase.ts`. Not used by `legibility.ts`, which wants the opposite: a
|
|
227
|
+
* full-frame shape is still a valid backdrop to read a colour off. */
|
|
228
|
+
export const BACKGROUND_COVERAGE = 0.9;
|
|
229
|
+
export function isBackgroundBed(box, canvas) {
|
|
230
|
+
return box.width * box.height >= BACKGROUND_COVERAGE * canvas.width * canvas.height;
|
|
231
|
+
}
|
|
232
|
+
export function containsBox(outer, inner, eps = 0.5) {
|
|
233
|
+
return (inner.x >= outer.x - eps &&
|
|
234
|
+
inner.y >= outer.y - eps &&
|
|
235
|
+
inner.x + inner.width <= outer.x + outer.width + eps &&
|
|
236
|
+
inner.y + inner.height <= outer.y + outer.height + eps);
|
|
237
|
+
}
|
|
238
|
+
//# 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. `
|
|
19
|
-
* sequence's pixel
|
|
20
|
-
* floor is a fraction of
|
|
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,
|
|
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,
|
|
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
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
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
|
-
|
|
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. `
|
|
181
|
-
* sequence's pixel
|
|
182
|
-
* floor is a fraction of
|
|
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,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"legibility.js","sourceRoot":"","sources":["../../src/timeline-debug/legibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAG1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AA6DvB,UAAU,wBAAwB;IAChC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,YAAY,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC3C,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,wBAAwB,GAC9B,mBAAmB,CAwCrB"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assembles a `TimelineDebugReport` from a document, an optional scripted edit
|
|
3
|
+
* session, and the document that session left behind.
|
|
4
|
+
*
|
|
5
|
+
* Pure: the host resolves the target (file, id) and writes the bundle; this
|
|
6
|
+
* decides what the run means.
|
|
7
|
+
*/
|
|
8
|
+
import { buildDocumentVerdict } from "../debug/verdict.js";
|
|
1
9
|
import { validateTimelineSequence } from "./validate.js";
|
|
2
10
|
import { isNumber } from "../predicates.js";
|
|
3
11
|
const DEFAULTS = { fps: 30, width: 1920, height: 1080 };
|
|
@@ -36,31 +44,14 @@ const describe = (issue) => {
|
|
|
36
44
|
: `[${issue.code}] ${issue.message}`;
|
|
37
45
|
};
|
|
38
46
|
function buildTimelineVerdict(validation, interactions, finalValidation) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
...(finalValidation?.warnings ?? []).map((issue) => `After edits — ${describe(issue)}`)
|
|
48
|
-
];
|
|
49
|
-
const ok = issues.length === 0;
|
|
50
|
-
const warningCount = warnings.length;
|
|
51
|
-
const headline = ok
|
|
52
|
-
? `Timeline is sound — ${interactions.length} interaction(s) ran clean` +
|
|
53
|
-
(warningCount > 0 ? `, ${warningCount} warning(s)` : "") +
|
|
54
|
-
"."
|
|
55
|
-
: `Timeline has ${issues.length} problem(s)` +
|
|
56
|
-
(failedSteps.length > 0
|
|
57
|
-
? `, ${failedSteps.length} failed interaction(s)`
|
|
58
|
-
: "") +
|
|
59
|
-
(warningCount > 0 ? `, ${warningCount} warning(s)` : "") +
|
|
60
|
-
` — ${issues[0]}`;
|
|
61
|
-
return warningCount > 0
|
|
62
|
-
? { ok, headline, issues, warnings }
|
|
63
|
-
: { ok, headline, issues };
|
|
47
|
+
return buildDocumentVerdict({
|
|
48
|
+
subject: "Timeline",
|
|
49
|
+
soundLabel: "Timeline is sound",
|
|
50
|
+
describe,
|
|
51
|
+
validation,
|
|
52
|
+
finalValidation,
|
|
53
|
+
interactions
|
|
54
|
+
});
|
|
64
55
|
}
|
|
65
56
|
export function buildTimelineDebugReport(input) {
|
|
66
57
|
const validation = validateTimelineSequence(input.document, input.meta);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"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"}
|