@nodetool-ai/execution 0.8.1
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 +129 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/app-debug/app-spec.d.ts +94 -0
- package/dist/app-debug/app-spec.d.ts.map +1 -0
- package/dist/app-debug/app-spec.js +710 -0
- package/dist/app-debug/app-spec.js.map +1 -0
- package/dist/app-debug/application-target.d.ts +53 -0
- package/dist/app-debug/application-target.d.ts.map +1 -0
- package/dist/app-debug/application-target.js +126 -0
- package/dist/app-debug/application-target.js.map +1 -0
- package/dist/app-debug/bundle-target.d.ts +21 -0
- package/dist/app-debug/bundle-target.d.ts.map +1 -0
- package/dist/app-debug/bundle-target.js +51 -0
- package/dist/app-debug/bundle-target.js.map +1 -0
- package/dist/app-debug/graph-shape.d.ts +14 -0
- package/dist/app-debug/graph-shape.d.ts.map +1 -0
- package/dist/app-debug/graph-shape.js +23 -0
- package/dist/app-debug/graph-shape.js.map +1 -0
- package/dist/app-debug/index.d.ts +26 -0
- package/dist/app-debug/index.d.ts.map +1 -0
- package/dist/app-debug/index.js +19 -0
- package/dist/app-debug/index.js.map +1 -0
- package/dist/app-debug/markdown.d.ts +6 -0
- package/dist/app-debug/markdown.d.ts.map +1 -0
- package/dist/app-debug/markdown.js +133 -0
- package/dist/app-debug/markdown.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +267 -0
- package/dist/app-debug/runtime.d.ts.map +1 -0
- package/dist/app-debug/runtime.js +633 -0
- package/dist/app-debug/runtime.js.map +1 -0
- package/dist/app-debug/script-operation.d.ts +58 -0
- package/dist/app-debug/script-operation.d.ts.map +1 -0
- package/dist/app-debug/script-operation.js +44 -0
- package/dist/app-debug/script-operation.js.map +1 -0
- package/dist/app-debug/simulate.d.ts +85 -0
- package/dist/app-debug/simulate.d.ts.map +1 -0
- package/dist/app-debug/simulate.js +991 -0
- package/dist/app-debug/simulate.js.map +1 -0
- package/dist/app-debug/summarize.d.ts +64 -0
- package/dist/app-debug/summarize.d.ts.map +1 -0
- package/dist/app-debug/summarize.js +65 -0
- package/dist/app-debug/summarize.js.map +1 -0
- package/dist/app-debug/types.d.ts +343 -0
- package/dist/app-debug/types.d.ts.map +1 -0
- package/dist/app-debug/types.js +2 -0
- package/dist/app-debug/types.js.map +1 -0
- package/dist/cost-ledger.d.ts +147 -0
- package/dist/cost-ledger.d.ts.map +1 -0
- package/dist/cost-ledger.js +288 -0
- package/dist/cost-ledger.js.map +1 -0
- package/dist/debug/collector.d.ts +28 -0
- package/dist/debug/collector.d.ts.map +1 -0
- package/dist/debug/collector.js +284 -0
- package/dist/debug/collector.js.map +1 -0
- package/dist/debug/index.d.ts +15 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +16 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/debug/types.d.ts +179 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/types.js +11 -0
- package/dist/debug/types.js.map +1 -0
- package/dist/debug/verdict.d.ts +27 -0
- package/dist/debug/verdict.d.ts.map +1 -0
- package/dist/debug/verdict.js +51 -0
- package/dist/debug/verdict.js.map +1 -0
- package/dist/executor-resolver.d.ts +13 -0
- package/dist/executor-resolver.d.ts.map +1 -0
- package/dist/executor-resolver.js +13 -0
- package/dist/executor-resolver.js.map +1 -0
- package/dist/fal-output-decoder.d.ts +36 -0
- package/dist/fal-output-decoder.d.ts.map +1 -0
- package/dist/fal-output-decoder.js +129 -0
- package/dist/fal-output-decoder.js.map +1 -0
- package/dist/generation-lifecycle.d.ts +54 -0
- package/dist/generation-lifecycle.d.ts.map +1 -0
- package/dist/generation-lifecycle.js +431 -0
- package/dist/generation-lifecycle.js.map +1 -0
- package/dist/generation-recovery-worker.d.ts +100 -0
- package/dist/generation-recovery-worker.d.ts.map +1 -0
- package/dist/generation-recovery-worker.js +995 -0
- package/dist/generation-recovery-worker.js.map +1 -0
- package/dist/generation-tracker.d.ts +83 -0
- package/dist/generation-tracker.d.ts.map +1 -0
- package/dist/generation-tracker.js +436 -0
- package/dist/generation-tracker.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/js-script-debug/index.d.ts +13 -0
- package/dist/js-script-debug/index.d.ts.map +1 -0
- package/dist/js-script-debug/index.js +12 -0
- package/dist/js-script-debug/index.js.map +1 -0
- package/dist/js-script-debug/markdown.d.ts +6 -0
- package/dist/js-script-debug/markdown.d.ts.map +1 -0
- package/dist/js-script-debug/markdown.js +62 -0
- package/dist/js-script-debug/markdown.js.map +1 -0
- package/dist/js-script-debug/outputs.d.ts +20 -0
- package/dist/js-script-debug/outputs.d.ts.map +1 -0
- package/dist/js-script-debug/outputs.js +30 -0
- package/dist/js-script-debug/outputs.js.map +1 -0
- package/dist/js-script-debug/report.d.ts +15 -0
- package/dist/js-script-debug/report.d.ts.map +1 -0
- package/dist/js-script-debug/report.js +90 -0
- package/dist/js-script-debug/report.js.map +1 -0
- package/dist/js-script-debug/types.d.ts +63 -0
- package/dist/js-script-debug/types.d.ts.map +1 -0
- package/dist/js-script-debug/types.js +10 -0
- package/dist/js-script-debug/types.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +38 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -0
- package/dist/js-script-debug/validate.js +137 -0
- package/dist/js-script-debug/validate.js.map +1 -0
- package/dist/message-stream.d.ts +33 -0
- package/dist/message-stream.d.ts.map +1 -0
- package/dist/message-stream.js +58 -0
- package/dist/message-stream.js.map +1 -0
- package/dist/normalize-graph.d.ts +13 -0
- package/dist/normalize-graph.d.ts.map +1 -0
- package/dist/normalize-graph.js +63 -0
- package/dist/normalize-graph.js.map +1 -0
- package/dist/output-names.d.ts +13 -0
- package/dist/output-names.d.ts.map +1 -0
- package/dist/output-names.js +13 -0
- package/dist/output-names.js.map +1 -0
- package/dist/predicates.d.ts +6 -0
- package/dist/predicates.d.ts.map +1 -0
- package/dist/predicates.js +6 -0
- package/dist/predicates.js.map +1 -0
- package/dist/preflight.d.ts +87 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +139 -0
- package/dist/preflight.js.map +1 -0
- package/dist/provider-secret-key.d.ts +3 -0
- package/dist/provider-secret-key.d.ts.map +1 -0
- package/dist/provider-secret-key.js +7 -0
- package/dist/provider-secret-key.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +78 -0
- package/dist/service/app-debug-service.d.ts.map +1 -0
- package/dist/service/app-debug-service.js +201 -0
- package/dist/service/app-debug-service.js.map +1 -0
- package/dist/service/app-run-server.d.ts +28 -0
- package/dist/service/app-run-server.d.ts.map +1 -0
- package/dist/service/app-run-server.js +104 -0
- package/dist/service/app-run-server.js.map +1 -0
- package/dist/service/debug-sessions.d.ts +158 -0
- package/dist/service/debug-sessions.d.ts.map +1 -0
- package/dist/service/debug-sessions.js +358 -0
- package/dist/service/debug-sessions.js.map +1 -0
- package/dist/service/index.d.ts +22 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +17 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/job-progress.d.ts +40 -0
- package/dist/service/job-progress.d.ts.map +1 -0
- package/dist/service/job-progress.js +53 -0
- package/dist/service/job-progress.js.map +1 -0
- package/dist/service/workflow-run.d.ts +279 -0
- package/dist/service/workflow-run.d.ts.map +1 -0
- package/dist/service/workflow-run.js +598 -0
- package/dist/service/workflow-run.js.map +1 -0
- package/dist/service/workflow-workspace.d.ts +89 -0
- package/dist/service/workflow-workspace.d.ts.map +1 -0
- package/dist/service/workflow-workspace.js +160 -0
- package/dist/service/workflow-workspace.js.map +1 -0
- package/dist/session.d.ts +62 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +353 -0
- package/dist/session.js.map +1 -0
- package/dist/sketch-debug/index.d.ts +11 -0
- package/dist/sketch-debug/index.d.ts.map +1 -0
- package/dist/sketch-debug/index.js +10 -0
- package/dist/sketch-debug/index.js.map +1 -0
- package/dist/sketch-debug/markdown.d.ts +6 -0
- package/dist/sketch-debug/markdown.d.ts.map +1 -0
- package/dist/sketch-debug/markdown.js +93 -0
- package/dist/sketch-debug/markdown.js.map +1 -0
- package/dist/sketch-debug/report.d.ts +15 -0
- package/dist/sketch-debug/report.d.ts.map +1 -0
- package/dist/sketch-debug/report.js +98 -0
- package/dist/sketch-debug/report.js.map +1 -0
- package/dist/sketch-debug/types.d.ts +62 -0
- package/dist/sketch-debug/types.d.ts.map +1 -0
- package/dist/sketch-debug/types.js +10 -0
- package/dist/sketch-debug/types.js.map +1 -0
- package/dist/sketch-debug/validate.d.ts +14 -0
- package/dist/sketch-debug/validate.d.ts.map +1 -0
- package/dist/sketch-debug/validate.js +478 -0
- package/dist/sketch-debug/validate.js.map +1 -0
- package/dist/supervisor.d.ts +45 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +97 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +11 -0
- package/dist/timeline-debug/index.d.ts.map +1 -0
- package/dist/timeline-debug/index.js +10 -0
- package/dist/timeline-debug/index.js.map +1 -0
- package/dist/timeline-debug/legibility.d.ts +23 -0
- package/dist/timeline-debug/legibility.d.ts.map +1 -0
- package/dist/timeline-debug/legibility.js +240 -0
- package/dist/timeline-debug/legibility.js.map +1 -0
- package/dist/timeline-debug/markdown.d.ts +6 -0
- package/dist/timeline-debug/markdown.d.ts.map +1 -0
- package/dist/timeline-debug/markdown.js +103 -0
- package/dist/timeline-debug/markdown.js.map +1 -0
- package/dist/timeline-debug/motion.d.ts +20 -0
- package/dist/timeline-debug/motion.d.ts.map +1 -0
- package/dist/timeline-debug/motion.js +362 -0
- package/dist/timeline-debug/motion.js.map +1 -0
- package/dist/timeline-debug/report.d.ts +16 -0
- package/dist/timeline-debug/report.d.ts.map +1 -0
- package/dist/timeline-debug/report.js +100 -0
- package/dist/timeline-debug/report.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +7 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -0
- package/dist/timeline-debug/showcase.js +347 -0
- package/dist/timeline-debug/showcase.js.map +1 -0
- package/dist/timeline-debug/types.d.ts +64 -0
- package/dist/timeline-debug/types.d.ts.map +1 -0
- package/dist/timeline-debug/types.js +10 -0
- package/dist/timeline-debug/types.js.map +1 -0
- package/dist/timeline-debug/validate.d.ts +24 -0
- package/dist/timeline-debug/validate.d.ts.map +1 -0
- package/dist/timeline-debug/validate.js +1432 -0
- package/dist/timeline-debug/validate.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { ANIMATED_PROPERTY_FOLD, CUSTOM_ANIMATION_PRESET_ID, IDENTITY_SAMPLE, compileClipAnimations, getAnimationPreset, normalizeCustomCurves, resolveCustomMask } from "@nodetool-ai/timeline";
|
|
2
|
+
import { clipStaggerCount } from "@nodetool-ai/timeline/scene";
|
|
3
|
+
/** Sub-millisecond slack, so float window math is not reported as a clamp. */
|
|
4
|
+
const EPSILON_MS = 0.5;
|
|
5
|
+
const clipLabel = (clip) => `${clip.name || clip.id}`;
|
|
6
|
+
/**
|
|
7
|
+
* The animations the compiler would actually compile.
|
|
8
|
+
*
|
|
9
|
+
* An unknown preset, a role the preset does not offer and unusable baked curves
|
|
10
|
+
* are all reported by their own codes (`unknown_animation_preset`,
|
|
11
|
+
* `custom_animation_invalid`), and compiling them would additionally print a
|
|
12
|
+
* console warning from inside the engine — noise on a CLI run that has already
|
|
13
|
+
* named the problem. Filtering here keeps one finding per defect.
|
|
14
|
+
*/
|
|
15
|
+
function compilableAnimations(clip) {
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const animation of clip.animations ?? []) {
|
|
18
|
+
if (animation.enabled === false)
|
|
19
|
+
continue;
|
|
20
|
+
if (animation.preset === CUSTOM_ANIMATION_PRESET_ID) {
|
|
21
|
+
if (!animation.custom?.curves?.length &&
|
|
22
|
+
(animation.styleTracks?.length || animation.textAnimator)) {
|
|
23
|
+
out.push(animation);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const baked = normalizeCustomCurves(animation.custom?.curves, animation.custom?.timeBase);
|
|
27
|
+
if (!baked.ok)
|
|
28
|
+
continue;
|
|
29
|
+
if (!resolveCustomMask(baked.curves, animation.custom?.mask).ok)
|
|
30
|
+
continue;
|
|
31
|
+
out.push(animation);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const preset = getAnimationPreset(animation.preset);
|
|
35
|
+
if (!preset || !preset.roles.includes(animation.role))
|
|
36
|
+
continue;
|
|
37
|
+
out.push(animation);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function heldInterval(compiled, clipDurationMs) {
|
|
42
|
+
return {
|
|
43
|
+
fromMs: compiled.holdBefore ? 0 : compiled.windowStartMs,
|
|
44
|
+
toMs: compiled.holdAfter ? clipDurationMs : compiled.windowEndMs
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Two animations driving one `replace` channel over the same instants (I3).
|
|
49
|
+
*
|
|
50
|
+
* `positionX/Y`, `anchorX/Y` and `trimStart/End` set an absolute value instead
|
|
51
|
+
* of composing, so the last enabled animation in document order wins and the
|
|
52
|
+
* other's curve is discarded — silently, and only where they overlap, which is
|
|
53
|
+
* why this is a warning rather than something a preview would reveal.
|
|
54
|
+
*/
|
|
55
|
+
function replaceOverlapIssues(clip, compiled) {
|
|
56
|
+
const byChannel = new Map();
|
|
57
|
+
for (const animation of compiled) {
|
|
58
|
+
const interval = heldInterval(animation, clip.durationMs);
|
|
59
|
+
const claimed = new Set();
|
|
60
|
+
for (const curve of animation.curves) {
|
|
61
|
+
if (ANIMATED_PROPERTY_FOLD[curve.property] !== "replace")
|
|
62
|
+
continue;
|
|
63
|
+
if (claimed.has(curve.property))
|
|
64
|
+
continue;
|
|
65
|
+
claimed.add(curve.property);
|
|
66
|
+
const list = byChannel.get(curve.property);
|
|
67
|
+
const entry = { id: animation.id, ...interval };
|
|
68
|
+
if (list)
|
|
69
|
+
list.push(entry);
|
|
70
|
+
else
|
|
71
|
+
byChannel.set(curve.property, [entry]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const issues = [];
|
|
75
|
+
for (const [channel, entries] of byChannel) {
|
|
76
|
+
for (let i = 0; i < entries.length - 1; i += 1) {
|
|
77
|
+
for (let j = i + 1; j < entries.length; j += 1) {
|
|
78
|
+
const a = entries[i];
|
|
79
|
+
const b = entries[j];
|
|
80
|
+
const fromMs = Math.max(a.fromMs, b.fromMs);
|
|
81
|
+
const toMs = Math.min(a.toMs, b.toMs);
|
|
82
|
+
if (toMs - fromMs <= EPSILON_MS)
|
|
83
|
+
continue;
|
|
84
|
+
issues.push({
|
|
85
|
+
severity: "warning",
|
|
86
|
+
code: "replace_curves_overlap",
|
|
87
|
+
message: `Clip "${clipLabel(clip)}" animations "${a.id}" and "${b.id}" both drive ${channel} between ${Math.round(fromMs)}ms and ${Math.round(toMs)}ms — ${channel} replaces rather than composes, so the last enabled animation in document order wins and the other's curve is discarded over that span.`,
|
|
88
|
+
path: "animations[*]",
|
|
89
|
+
clipId: clip.id,
|
|
90
|
+
trackId: clip.trackId
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return issues;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Motion the clip cannot hold.
|
|
99
|
+
*
|
|
100
|
+
* The compiler clamps a window to the clip and drops one that starts at or
|
|
101
|
+
* after clip end, so an entrance authored longer than its clip plays truncated
|
|
102
|
+
* — or never — with nothing said. Both are warnings: the clip still renders,
|
|
103
|
+
* it just does not perform the motion that was written.
|
|
104
|
+
*
|
|
105
|
+
* A `fullClip` preset (`kenBurns`) ignores duration and delay by design and is
|
|
106
|
+
* skipped. A `"loop"` runs to clip end by construction, so only a delay past
|
|
107
|
+
* the clip's end can drop it, which the dropped branch covers.
|
|
108
|
+
*/
|
|
109
|
+
function windowIssues(clip, animations, compiled) {
|
|
110
|
+
const byId = new Map(compiled.map((entry) => [entry.id, entry]));
|
|
111
|
+
const issues = [];
|
|
112
|
+
const at = { clipId: clip.id, trackId: clip.trackId, path: "animations[*]" };
|
|
113
|
+
for (const animation of animations) {
|
|
114
|
+
if (getAnimationPreset(animation.preset)?.fullClip === true)
|
|
115
|
+
continue;
|
|
116
|
+
const delayMs = Math.max(0, animation.delayMs ?? 0);
|
|
117
|
+
const durationMs = Math.max(1, animation.durationMs);
|
|
118
|
+
const entry = byId.get(animation.id);
|
|
119
|
+
if (!entry) {
|
|
120
|
+
issues.push({
|
|
121
|
+
severity: "warning",
|
|
122
|
+
code: "animation_exceeds_clip",
|
|
123
|
+
message: `Clip "${clipLabel(clip)}" animation "${animation.id}" (${animation.preset}, ${animation.role}) asks for ${durationMs}ms after a ${delayMs}ms delay on a ${clip.durationMs}ms clip — the window falls outside the clip, so the animation never runs.`,
|
|
124
|
+
...at
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (animation.role === "loop")
|
|
129
|
+
continue;
|
|
130
|
+
const requestedMs = durationMs + (entry.stagger?.maxDelayMs ?? 0);
|
|
131
|
+
const actualMs = entry.windowEndMs - entry.windowStartMs;
|
|
132
|
+
if (actualMs + EPSILON_MS >= requestedMs)
|
|
133
|
+
continue;
|
|
134
|
+
issues.push({
|
|
135
|
+
severity: "warning",
|
|
136
|
+
code: "animation_exceeds_clip",
|
|
137
|
+
message: `Clip "${clipLabel(clip)}" animation "${animation.id}" (${animation.preset}, ${animation.role}) needs ${Math.round(requestedMs)}ms after a ${delayMs}ms delay but the ${clip.durationMs}ms clip leaves ${Math.round(actualMs)}ms — the window is clamped, so the motion is cut short.`,
|
|
138
|
+
...at
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return issues;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* A stagger whose span did not fit the clip.
|
|
145
|
+
*
|
|
146
|
+
* When the units cannot all animate at the authored `offsetMs` the compiler
|
|
147
|
+
* shrinks the offset rather than the per-unit duration, so every unit still
|
|
148
|
+
* completes and the effect reads faster and flatter than it was written —
|
|
149
|
+
* `compressed` on the compiled stagger is the compiler saying so (T8).
|
|
150
|
+
*/
|
|
151
|
+
function staggerIssues(clip, compiled) {
|
|
152
|
+
const issues = [];
|
|
153
|
+
for (const entry of compiled) {
|
|
154
|
+
const stagger = entry.stagger;
|
|
155
|
+
if (!stagger?.compressed)
|
|
156
|
+
continue;
|
|
157
|
+
issues.push({
|
|
158
|
+
severity: "warning",
|
|
159
|
+
code: "stagger_compressed",
|
|
160
|
+
message: `Clip "${clipLabel(clip)}" animation "${entry.id}" staggers ${stagger.count} ${stagger.unit}(s) over a ${clip.durationMs}ms clip — the per-unit offset was shrunk to ${Math.round(stagger.offsetMs)}ms to make them fit, so the units overlap more than authored. Lengthen the clip or shorten the animation.`,
|
|
161
|
+
path: "animations[*].stagger.offsetMs",
|
|
162
|
+
clipId: clip.id,
|
|
163
|
+
trackId: clip.trackId
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return issues;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* A typewriter stored with a plain duration.
|
|
170
|
+
*
|
|
171
|
+
* `animate_clip` stores the preset as `durationMs: 1` plus a per-character
|
|
172
|
+
* `stagger` (`typewriterTiming`). Without the stagger the preset is one held
|
|
173
|
+
* opacity step over the whole block, and the caret draws only on a staggered
|
|
174
|
+
* reveal, so nothing types.
|
|
175
|
+
*/
|
|
176
|
+
function typewriterIssues(clip, animations) {
|
|
177
|
+
const issues = [];
|
|
178
|
+
for (const animation of animations) {
|
|
179
|
+
if (animation.preset !== "typewriter" || animation.stagger)
|
|
180
|
+
continue;
|
|
181
|
+
issues.push({
|
|
182
|
+
severity: "warning",
|
|
183
|
+
code: "typewriter_not_staggered",
|
|
184
|
+
message: `Clip "${clipLabel(clip)}" animation "${animation.id}" stores a typewriter as a ${animation.durationMs}ms duration with no stagger — nothing draws for ${animation.durationMs}ms, then the whole text appears at once with no caret. Store the per-character form \`animate_clip\` writes: \`durationMs: 1\` with \`stagger: {unit: "character", offsetMs}\`, or re-apply the preset through \`animate_clip\`.`,
|
|
185
|
+
path: "animations[*].stagger",
|
|
186
|
+
clipId: clip.id,
|
|
187
|
+
trackId: clip.trackId
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return issues;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The value a channel shows when no animation drives it: the sampler's
|
|
194
|
+
* identity for a composing channel, the clip's own value (and the field that
|
|
195
|
+
* stores it) for a replace channel. `undefined` when that value comes from
|
|
196
|
+
* layout this check does not resolve (a clip with no stored transform).
|
|
197
|
+
*/
|
|
198
|
+
function restValue(clip, property) {
|
|
199
|
+
const own = (value, field) => value === undefined ? undefined : { value, field };
|
|
200
|
+
switch (property) {
|
|
201
|
+
case "wipeProgress":
|
|
202
|
+
return { value: 1 };
|
|
203
|
+
case "trimStart":
|
|
204
|
+
return own(clip.shapeStyle?.trimStart ?? 0, "shapeStyle.trimStart");
|
|
205
|
+
case "trimEnd":
|
|
206
|
+
return own(clip.shapeStyle?.trimEnd ?? 1, "shapeStyle.trimEnd");
|
|
207
|
+
case "positionX":
|
|
208
|
+
return own(clip.transform?.position.x, "transform.position.x");
|
|
209
|
+
case "positionY":
|
|
210
|
+
return own(clip.transform?.position.y, "transform.position.y");
|
|
211
|
+
case "anchorX":
|
|
212
|
+
return own(clip.transform?.anchor.x, "transform.anchor.x");
|
|
213
|
+
case "anchorY":
|
|
214
|
+
return own(clip.transform?.anchor.y, "transform.anchor.y");
|
|
215
|
+
default:
|
|
216
|
+
return { value: IDENTITY_SAMPLE[property] };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* A custom `"out"` whose curve starts away from rest after clip start.
|
|
221
|
+
*
|
|
222
|
+
* An `"out"` holds its t=1 value to clip end but contributes nothing before its
|
|
223
|
+
* window, so the channel shows its rest value there and jumps to the first
|
|
224
|
+
* keyframe when the window opens. Builders turn an `"in"` that ends away from
|
|
225
|
+
* rest into an `"out"` to keep the end value, which is how a gauge arc drawn
|
|
226
|
+
* from `trimEnd: 0` shows a full ring first. A preset `"out"` is reversed to
|
|
227
|
+
* start at rest, and a source-anchored curve has no clip-time first value, so
|
|
228
|
+
* only clip-based custom curves are checked.
|
|
229
|
+
*/
|
|
230
|
+
function restBeforeWindowIssues(clip, animations, compiled) {
|
|
231
|
+
const custom = new Set(animations
|
|
232
|
+
.filter((animation) => animation.preset === CUSTOM_ANIMATION_PRESET_ID)
|
|
233
|
+
.map((animation) => animation.id));
|
|
234
|
+
const issues = [];
|
|
235
|
+
for (const entry of compiled) {
|
|
236
|
+
if (entry.role !== "out" || !custom.has(entry.id))
|
|
237
|
+
continue;
|
|
238
|
+
if (entry.timeBase === "source" || entry.windowStartMs <= EPSILON_MS)
|
|
239
|
+
continue;
|
|
240
|
+
for (const curve of entry.curves) {
|
|
241
|
+
const first = curve.keyframes[0]?.value;
|
|
242
|
+
const rest = restValue(clip, curve.property);
|
|
243
|
+
if (first === undefined || rest === undefined)
|
|
244
|
+
continue;
|
|
245
|
+
if (Math.abs(first - rest.value) <= 1e-3)
|
|
246
|
+
continue;
|
|
247
|
+
// A replace channel takes the clip's own value only while undriven, so
|
|
248
|
+
// storing the first keyframe there fixes the frames before the window
|
|
249
|
+
// alone. A composing channel's rest is fixed, so only the window can move.
|
|
250
|
+
const fix = rest.field
|
|
251
|
+
? `Set the clip's \`${rest.field}\` to ${first}, or lengthen the animation so its window starts at clip start.`
|
|
252
|
+
: "Lengthen the animation so its window starts at clip start.";
|
|
253
|
+
issues.push({
|
|
254
|
+
severity: "warning",
|
|
255
|
+
code: "animation_holds_rest_before_window",
|
|
256
|
+
message: `Clip "${clipLabel(clip)}" animation "${entry.id}" (custom, out) starts its ${curve.property} curve at ${first}, but an "out" does not apply before its window — ${curve.property} renders at the rest value ${rest.value} until ${Math.round(entry.windowStartMs)}ms, then jumps to ${first}. ${fix}`,
|
|
257
|
+
path: "animations[*].custom.curves",
|
|
258
|
+
clipId: clip.id,
|
|
259
|
+
trackId: clip.trackId
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return issues;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* `timeRemap.keyframes` must ascend in `t` (D13). `sourceMs` may descend —
|
|
267
|
+
* that is reverse playback — but a `t` that repeats or goes backwards makes the
|
|
268
|
+
* piecewise evaluation ambiguous: the source time for an instant depends on
|
|
269
|
+
* which segment is asked, so the clip decodes from somewhere nobody chose. An
|
|
270
|
+
* error, because unlike a mask or a transition there is no sane thing to draw
|
|
271
|
+
* instead.
|
|
272
|
+
*/
|
|
273
|
+
function timeRemapIssues(clip) {
|
|
274
|
+
const keyframes = clip.timeRemap?.keyframes;
|
|
275
|
+
if (!keyframes || keyframes.length < 2)
|
|
276
|
+
return [];
|
|
277
|
+
const issues = [];
|
|
278
|
+
for (let i = 1; i < keyframes.length; i += 1) {
|
|
279
|
+
const previous = keyframes[i - 1];
|
|
280
|
+
const current = keyframes[i];
|
|
281
|
+
if (current.t > previous.t)
|
|
282
|
+
continue;
|
|
283
|
+
issues.push({
|
|
284
|
+
severity: "error",
|
|
285
|
+
code: "time_remap_not_monotonic",
|
|
286
|
+
message: `Clip "${clipLabel(clip)}" remaps time with keyframe ${i} at t=${current.t}, at or before keyframe ${i - 1} at t=${previous.t} — \`t\` must ascend. \`sourceMs\` may descend, which is how a reverse is written.`,
|
|
287
|
+
path: `timeRemap.keyframes[${i}].t`,
|
|
288
|
+
clipId: clip.id,
|
|
289
|
+
trackId: clip.trackId
|
|
290
|
+
});
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
return issues;
|
|
294
|
+
}
|
|
295
|
+
/** The animated properties a link on each channel replaces (`resolveAnimatedLayerProps`). */
|
|
296
|
+
const LINK_REPLACES = {
|
|
297
|
+
positionX: ["positionX", "offsetX"],
|
|
298
|
+
positionY: ["positionY", "offsetY"],
|
|
299
|
+
scale: ["scale", "scaleX", "scaleY"],
|
|
300
|
+
rotation: ["rotation"],
|
|
301
|
+
opacity: ["opacity"]
|
|
302
|
+
};
|
|
303
|
+
/** The clip's own value on a link channel, and the value a wiggle centres on. */
|
|
304
|
+
function staticChannel(clip, channel) {
|
|
305
|
+
const t = clip.transform;
|
|
306
|
+
switch (channel) {
|
|
307
|
+
case "positionX": return { value: t?.position.x ?? 0, wiggleBase: 0 };
|
|
308
|
+
case "positionY": return { value: t?.position.y ?? 0, wiggleBase: 0 };
|
|
309
|
+
case "scale": return { value: ((t?.scale.x ?? 1) + (t?.scale.y ?? 1)) / 2, wiggleBase: 1 };
|
|
310
|
+
case "rotation": return { value: t?.rotation ?? 0, wiggleBase: 0 };
|
|
311
|
+
default: return { value: clip.opacity ?? 1, wiggleBase: 1 };
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* A link that silently discards other motion on its channel.
|
|
316
|
+
*
|
|
317
|
+
* A link sets its channel's value outright: the clip's animations on that
|
|
318
|
+
* channel are ignored while it is set, and a wiggle centres on the channel's
|
|
319
|
+
* identity, not on the clip's own placement.
|
|
320
|
+
*/
|
|
321
|
+
function linkOverrideIssues(clip, compiled) {
|
|
322
|
+
const issues = [];
|
|
323
|
+
for (const [index, link] of (clip.animationLinks ?? []).entries()) {
|
|
324
|
+
const replaced = new Set(LINK_REPLACES[link.target]);
|
|
325
|
+
const animated = [...new Set(compiled.flatMap((entry) => entry.curves.map((curve) => curve.property).filter((property) => replaced.has(property))))];
|
|
326
|
+
const reasons = [];
|
|
327
|
+
if (animated.length)
|
|
328
|
+
reasons.push(`the clip's own ${animated.join(", ")} animation`);
|
|
329
|
+
if ("kind" in link) {
|
|
330
|
+
const { value, wiggleBase } = staticChannel(clip, link.target);
|
|
331
|
+
if (Math.abs(value - wiggleBase) > 1e-6)
|
|
332
|
+
reasons.push(`its authored ${link.target} of ${Math.round(value * 1000) / 1000} (the wiggle centres on ${wiggleBase})`);
|
|
333
|
+
}
|
|
334
|
+
if (!reasons.length)
|
|
335
|
+
continue;
|
|
336
|
+
issues.push({
|
|
337
|
+
severity: "warning",
|
|
338
|
+
code: "animation_link_overrides",
|
|
339
|
+
message: `Clip "${clipLabel(clip)}" links ${link.target}, which sets that channel outright and discards ${reasons.join(" and ")}. Put the link on a child clip and the other motion on its parent group.`,
|
|
340
|
+
path: `animationLinks[${index}]`,
|
|
341
|
+
clipId: clip.id,
|
|
342
|
+
trackId: clip.trackId
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return issues;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Every motion finding for one clip. `canvas` is the sequence's pixel size,
|
|
349
|
+
* which the compiler needs to resolve a preset's normalized distances and to
|
|
350
|
+
* count the wrapped lines of a `"line"` stagger.
|
|
351
|
+
*/
|
|
352
|
+
export function checkClipMotion(clip, canvas) {
|
|
353
|
+
const issues = timeRemapIssues(clip);
|
|
354
|
+
const animations = compilableAnimations(clip);
|
|
355
|
+
if (animations.length === 0)
|
|
356
|
+
return [...issues, ...linkOverrideIssues(clip, [])];
|
|
357
|
+
const { unit: staggerUnit, count: staggerCount } = clipStaggerCount(clip, canvas);
|
|
358
|
+
const compiled = compileClipAnimations(animations, clip.durationMs, canvas, { staggerCount, staggerUnit });
|
|
359
|
+
issues.push(...windowIssues(clip, animations, compiled), ...staggerIssues(clip, compiled), ...typewriterIssues(clip, animations), ...restBeforeWindowIssues(clip, animations, compiled), ...replaceOverlapIssues(clip, compiled), ...linkOverrideIssues(clip, compiled));
|
|
360
|
+
return issues;
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../src/timeline-debug/motion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TimelineDebugReport, TimelineDebugTarget, TimelineInteractionRecord } from "./types.js";
|
|
2
|
+
import { type TimelineValidationMeta } from "./validate.js";
|
|
3
|
+
interface TimelineDebugReportInput {
|
|
4
|
+
target: TimelineDebugTarget;
|
|
5
|
+
/** The document as loaded — untrusted, validated here. */
|
|
6
|
+
document: unknown;
|
|
7
|
+
meta?: TimelineValidationMeta;
|
|
8
|
+
interactions?: TimelineInteractionRecord[];
|
|
9
|
+
/** Bridge snapshot after the scripted session (`TimelineBridgeFinalState`). */
|
|
10
|
+
finalState?: unknown;
|
|
11
|
+
/** Document reconstructed from the final state, validated as a second pass. */
|
|
12
|
+
finalDocument?: unknown;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildTimelineDebugReport(input: TimelineDebugReportInput): TimelineDebugReport;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAG1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAyFvB,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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { validateTimelineSequence } from "./validate.js";
|
|
2
|
+
import { isNumber } from "../predicates.js";
|
|
3
|
+
const DEFAULTS = { fps: 30, width: 1920, height: 1080 };
|
|
4
|
+
/**
|
|
5
|
+
* What a headless timeline run cannot answer. Fixed, because the boundary is a
|
|
6
|
+
* property of the harness, not of the document it was pointed at.
|
|
7
|
+
*/
|
|
8
|
+
const NOT_SIMULATED = [
|
|
9
|
+
"Rendering and compositing — no pixels are produced, so nothing here sees a frame.",
|
|
10
|
+
"Playback timing — transport, scrubbing, and audio/video sync are untested.",
|
|
11
|
+
"Video and audio decode — asset durations, real frame rates, and codec support are unknown.",
|
|
12
|
+
"Generation providers — no clip media is produced; `generated` clips are checked structurally only.",
|
|
13
|
+
"Asset I/O — asset ids are never resolved or fetched.",
|
|
14
|
+
"`get_clip_frames` and any other frame-sampling tool."
|
|
15
|
+
];
|
|
16
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
const countAndDuration = (document) => {
|
|
18
|
+
if (!isRecord(document))
|
|
19
|
+
return { trackCount: 0, clipCount: 0, durationMs: 0 };
|
|
20
|
+
const tracks = Array.isArray(document.tracks) ? document.tracks : [];
|
|
21
|
+
const clips = Array.isArray(document.clips) ? document.clips : [];
|
|
22
|
+
let durationMs = 0;
|
|
23
|
+
for (const clip of clips) {
|
|
24
|
+
if (!isRecord(clip))
|
|
25
|
+
continue;
|
|
26
|
+
const start = isNumber(clip.startMs) ? clip.startMs : 0;
|
|
27
|
+
const length = isNumber(clip.durationMs) ? clip.durationMs : 0;
|
|
28
|
+
durationMs = Math.max(durationMs, start + Math.max(0, length));
|
|
29
|
+
}
|
|
30
|
+
return { trackCount: tracks.length, clipCount: clips.length, durationMs };
|
|
31
|
+
};
|
|
32
|
+
const describe = (issue) => {
|
|
33
|
+
const where = issue.clipId ?? issue.trackId ?? issue.path;
|
|
34
|
+
return where
|
|
35
|
+
? `[${issue.code}] ${where}: ${issue.message}`
|
|
36
|
+
: `[${issue.code}] ${issue.message}`;
|
|
37
|
+
};
|
|
38
|
+
function buildTimelineVerdict(validation, interactions, finalValidation) {
|
|
39
|
+
const failedSteps = interactions.filter((step) => !step.ok);
|
|
40
|
+
const issues = [
|
|
41
|
+
...validation.errors.map(describe),
|
|
42
|
+
...failedSteps.map((step) => `Interaction \`${step.tool}\` failed${step.error ? `: ${step.error}` : ""}`),
|
|
43
|
+
...(finalValidation?.errors ?? []).map((issue) => `After edits — ${describe(issue)}`)
|
|
44
|
+
];
|
|
45
|
+
const warnings = [
|
|
46
|
+
...validation.warnings.map(describe),
|
|
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 };
|
|
64
|
+
}
|
|
65
|
+
export function buildTimelineDebugReport(input) {
|
|
66
|
+
const validation = validateTimelineSequence(input.document, input.meta);
|
|
67
|
+
const finalValidation = input.finalDocument === undefined
|
|
68
|
+
? undefined
|
|
69
|
+
: validateTimelineSequence(input.finalDocument, input.meta);
|
|
70
|
+
const interactions = input.interactions ?? [];
|
|
71
|
+
// The final document is what the session left behind, so it — not the input
|
|
72
|
+
// — describes the sequence the report is about.
|
|
73
|
+
const counted = countAndDuration(input.finalDocument ?? input.document);
|
|
74
|
+
const meta = {
|
|
75
|
+
fps: input.meta?.fps && input.meta.fps > 0 ? input.meta.fps : DEFAULTS.fps,
|
|
76
|
+
width: input.meta?.width && input.meta.width > 0
|
|
77
|
+
? input.meta.width
|
|
78
|
+
: DEFAULTS.width,
|
|
79
|
+
height: input.meta?.height && input.meta.height > 0
|
|
80
|
+
? input.meta.height
|
|
81
|
+
: DEFAULTS.height,
|
|
82
|
+
...counted
|
|
83
|
+
};
|
|
84
|
+
const report = {
|
|
85
|
+
target: input.target,
|
|
86
|
+
meta,
|
|
87
|
+
validation,
|
|
88
|
+
interactions,
|
|
89
|
+
notSimulated: [...NOT_SIMULATED],
|
|
90
|
+
verdict: buildTimelineVerdict(validation, interactions, finalValidation)
|
|
91
|
+
};
|
|
92
|
+
if (input.finalState !== undefined) {
|
|
93
|
+
report.finalState = input.finalState;
|
|
94
|
+
}
|
|
95
|
+
if (finalValidation) {
|
|
96
|
+
report.finalValidation = finalValidation;
|
|
97
|
+
}
|
|
98
|
+
return report;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/timeline-debug/report.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,wBAAwB,EAEzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK5C,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAW,CAAC;AAEjE;;;GAGG;AACH,MAAM,aAAa,GAA0B;IAC3C,mFAAmF;IACnF,4EAA4E;IAC5E,4FAA4F;IAC5F,oGAAoG;IACpG,sDAAsD;IACtD,sDAAsD;CACvD,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,CACvB,QAAiB,EACjB,EAAE;IACF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAyB,EAAU,EAAE;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;IAC1D,OAAO,KAAK;QACV,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE;QAC9C,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,SAAS,oBAAoB,CAC3B,UAA8B,EAC9B,YAAsD,EACtD,eAA+C;IAE/C,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAa;QACvB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClC,GAAG,WAAW,CAAC,GAAG,CAChB,CAAC,IAAI,EAAE,EAAE,CACP,iBAAiB,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9E;QACD,GAAG,CAAC,eAAe,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAC9C;KACF,CAAC;IACF,MAAM,QAAQ,GAAa;QACzB,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC,GAAG,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAC9C;KACF,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;IACrC,MAAM,QAAQ,GAAG,EAAE;QACjB,CAAC,CAAC,uBAAuB,YAAY,CAAC,MAAM,2BAA2B;YACrE,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG;QACL,CAAC,CAAC,gBAAgB,MAAM,CAAC,MAAM,aAAa;YAC1C,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,KAAK,WAAW,CAAC,MAAM,wBAAwB;gBACjD,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtB,OAAO,YAAY,GAAG,CAAC;QACrB,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;QACpC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAcD,MAAM,UAAU,wBAAwB,CACtC,KAA+B;IAE/B,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,eAAe,GACnB,KAAK,CAAC,aAAa,KAAK,SAAS;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IAE9C,4EAA4E;IAC5E,gDAAgD;IAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,MAAM,IAAI,GAAyB;QACjC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG;QAC1E,KAAK,EACH,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;YACvC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;YAClB,CAAC,CAAC,QAAQ,CAAC,KAAK;QACpB,MAAM,EACJ,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;YACnB,CAAC,CAAC,QAAQ,CAAC,MAAM;QACrB,GAAG,OAAO;KACX,CAAC;IAGF,MAAM,MAAM,GAAiB;QAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI;QACJ,UAAU;QACV,YAAY;QACZ,YAAY,EAAE,CAAC,GAAG,aAAa,CAAC;QAChC,OAAO,EAAE,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC;KACzE,CAAC;IACF,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TimelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
|
|
2
|
+
import type { TimelineDebugIssue } from "./types.js";
|
|
3
|
+
export declare function checkShowcase(doc: TimelineDocument, canvas: {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}): TimelineDebugIssue[];
|
|
7
|
+
//# sourceMappingURL=showcase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/showcase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AAOvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8LrD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,kBAAkB,EAAE,CA2PtB"}
|