@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.
Files changed (231) hide show
  1. package/README.md +129 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/app-debug/app-spec.d.ts +94 -0
  4. package/dist/app-debug/app-spec.d.ts.map +1 -0
  5. package/dist/app-debug/app-spec.js +710 -0
  6. package/dist/app-debug/app-spec.js.map +1 -0
  7. package/dist/app-debug/application-target.d.ts +53 -0
  8. package/dist/app-debug/application-target.d.ts.map +1 -0
  9. package/dist/app-debug/application-target.js +126 -0
  10. package/dist/app-debug/application-target.js.map +1 -0
  11. package/dist/app-debug/bundle-target.d.ts +21 -0
  12. package/dist/app-debug/bundle-target.d.ts.map +1 -0
  13. package/dist/app-debug/bundle-target.js +51 -0
  14. package/dist/app-debug/bundle-target.js.map +1 -0
  15. package/dist/app-debug/graph-shape.d.ts +14 -0
  16. package/dist/app-debug/graph-shape.d.ts.map +1 -0
  17. package/dist/app-debug/graph-shape.js +23 -0
  18. package/dist/app-debug/graph-shape.js.map +1 -0
  19. package/dist/app-debug/index.d.ts +26 -0
  20. package/dist/app-debug/index.d.ts.map +1 -0
  21. package/dist/app-debug/index.js +19 -0
  22. package/dist/app-debug/index.js.map +1 -0
  23. package/dist/app-debug/markdown.d.ts +6 -0
  24. package/dist/app-debug/markdown.d.ts.map +1 -0
  25. package/dist/app-debug/markdown.js +133 -0
  26. package/dist/app-debug/markdown.js.map +1 -0
  27. package/dist/app-debug/runtime.d.ts +267 -0
  28. package/dist/app-debug/runtime.d.ts.map +1 -0
  29. package/dist/app-debug/runtime.js +633 -0
  30. package/dist/app-debug/runtime.js.map +1 -0
  31. package/dist/app-debug/script-operation.d.ts +58 -0
  32. package/dist/app-debug/script-operation.d.ts.map +1 -0
  33. package/dist/app-debug/script-operation.js +44 -0
  34. package/dist/app-debug/script-operation.js.map +1 -0
  35. package/dist/app-debug/simulate.d.ts +85 -0
  36. package/dist/app-debug/simulate.d.ts.map +1 -0
  37. package/dist/app-debug/simulate.js +991 -0
  38. package/dist/app-debug/simulate.js.map +1 -0
  39. package/dist/app-debug/summarize.d.ts +64 -0
  40. package/dist/app-debug/summarize.d.ts.map +1 -0
  41. package/dist/app-debug/summarize.js +65 -0
  42. package/dist/app-debug/summarize.js.map +1 -0
  43. package/dist/app-debug/types.d.ts +343 -0
  44. package/dist/app-debug/types.d.ts.map +1 -0
  45. package/dist/app-debug/types.js +2 -0
  46. package/dist/app-debug/types.js.map +1 -0
  47. package/dist/cost-ledger.d.ts +147 -0
  48. package/dist/cost-ledger.d.ts.map +1 -0
  49. package/dist/cost-ledger.js +288 -0
  50. package/dist/cost-ledger.js.map +1 -0
  51. package/dist/debug/collector.d.ts +28 -0
  52. package/dist/debug/collector.d.ts.map +1 -0
  53. package/dist/debug/collector.js +284 -0
  54. package/dist/debug/collector.js.map +1 -0
  55. package/dist/debug/index.d.ts +15 -0
  56. package/dist/debug/index.d.ts.map +1 -0
  57. package/dist/debug/index.js +16 -0
  58. package/dist/debug/index.js.map +1 -0
  59. package/dist/debug/types.d.ts +179 -0
  60. package/dist/debug/types.d.ts.map +1 -0
  61. package/dist/debug/types.js +11 -0
  62. package/dist/debug/types.js.map +1 -0
  63. package/dist/debug/verdict.d.ts +27 -0
  64. package/dist/debug/verdict.d.ts.map +1 -0
  65. package/dist/debug/verdict.js +51 -0
  66. package/dist/debug/verdict.js.map +1 -0
  67. package/dist/executor-resolver.d.ts +13 -0
  68. package/dist/executor-resolver.d.ts.map +1 -0
  69. package/dist/executor-resolver.js +13 -0
  70. package/dist/executor-resolver.js.map +1 -0
  71. package/dist/fal-output-decoder.d.ts +36 -0
  72. package/dist/fal-output-decoder.d.ts.map +1 -0
  73. package/dist/fal-output-decoder.js +129 -0
  74. package/dist/fal-output-decoder.js.map +1 -0
  75. package/dist/generation-lifecycle.d.ts +54 -0
  76. package/dist/generation-lifecycle.d.ts.map +1 -0
  77. package/dist/generation-lifecycle.js +431 -0
  78. package/dist/generation-lifecycle.js.map +1 -0
  79. package/dist/generation-recovery-worker.d.ts +100 -0
  80. package/dist/generation-recovery-worker.d.ts.map +1 -0
  81. package/dist/generation-recovery-worker.js +995 -0
  82. package/dist/generation-recovery-worker.js.map +1 -0
  83. package/dist/generation-tracker.d.ts +83 -0
  84. package/dist/generation-tracker.d.ts.map +1 -0
  85. package/dist/generation-tracker.js +436 -0
  86. package/dist/generation-tracker.js.map +1 -0
  87. package/dist/index.d.ts +28 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +21 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/js-script-debug/index.d.ts +13 -0
  92. package/dist/js-script-debug/index.d.ts.map +1 -0
  93. package/dist/js-script-debug/index.js +12 -0
  94. package/dist/js-script-debug/index.js.map +1 -0
  95. package/dist/js-script-debug/markdown.d.ts +6 -0
  96. package/dist/js-script-debug/markdown.d.ts.map +1 -0
  97. package/dist/js-script-debug/markdown.js +62 -0
  98. package/dist/js-script-debug/markdown.js.map +1 -0
  99. package/dist/js-script-debug/outputs.d.ts +20 -0
  100. package/dist/js-script-debug/outputs.d.ts.map +1 -0
  101. package/dist/js-script-debug/outputs.js +30 -0
  102. package/dist/js-script-debug/outputs.js.map +1 -0
  103. package/dist/js-script-debug/report.d.ts +15 -0
  104. package/dist/js-script-debug/report.d.ts.map +1 -0
  105. package/dist/js-script-debug/report.js +90 -0
  106. package/dist/js-script-debug/report.js.map +1 -0
  107. package/dist/js-script-debug/types.d.ts +63 -0
  108. package/dist/js-script-debug/types.d.ts.map +1 -0
  109. package/dist/js-script-debug/types.js +10 -0
  110. package/dist/js-script-debug/types.js.map +1 -0
  111. package/dist/js-script-debug/validate.d.ts +38 -0
  112. package/dist/js-script-debug/validate.d.ts.map +1 -0
  113. package/dist/js-script-debug/validate.js +137 -0
  114. package/dist/js-script-debug/validate.js.map +1 -0
  115. package/dist/message-stream.d.ts +33 -0
  116. package/dist/message-stream.d.ts.map +1 -0
  117. package/dist/message-stream.js +58 -0
  118. package/dist/message-stream.js.map +1 -0
  119. package/dist/normalize-graph.d.ts +13 -0
  120. package/dist/normalize-graph.d.ts.map +1 -0
  121. package/dist/normalize-graph.js +63 -0
  122. package/dist/normalize-graph.js.map +1 -0
  123. package/dist/output-names.d.ts +13 -0
  124. package/dist/output-names.d.ts.map +1 -0
  125. package/dist/output-names.js +13 -0
  126. package/dist/output-names.js.map +1 -0
  127. package/dist/predicates.d.ts +6 -0
  128. package/dist/predicates.d.ts.map +1 -0
  129. package/dist/predicates.js +6 -0
  130. package/dist/predicates.js.map +1 -0
  131. package/dist/preflight.d.ts +87 -0
  132. package/dist/preflight.d.ts.map +1 -0
  133. package/dist/preflight.js +139 -0
  134. package/dist/preflight.js.map +1 -0
  135. package/dist/provider-secret-key.d.ts +3 -0
  136. package/dist/provider-secret-key.d.ts.map +1 -0
  137. package/dist/provider-secret-key.js +7 -0
  138. package/dist/provider-secret-key.js.map +1 -0
  139. package/dist/service/app-debug-service.d.ts +78 -0
  140. package/dist/service/app-debug-service.d.ts.map +1 -0
  141. package/dist/service/app-debug-service.js +201 -0
  142. package/dist/service/app-debug-service.js.map +1 -0
  143. package/dist/service/app-run-server.d.ts +28 -0
  144. package/dist/service/app-run-server.d.ts.map +1 -0
  145. package/dist/service/app-run-server.js +104 -0
  146. package/dist/service/app-run-server.js.map +1 -0
  147. package/dist/service/debug-sessions.d.ts +158 -0
  148. package/dist/service/debug-sessions.d.ts.map +1 -0
  149. package/dist/service/debug-sessions.js +358 -0
  150. package/dist/service/debug-sessions.js.map +1 -0
  151. package/dist/service/index.d.ts +22 -0
  152. package/dist/service/index.d.ts.map +1 -0
  153. package/dist/service/index.js +17 -0
  154. package/dist/service/index.js.map +1 -0
  155. package/dist/service/job-progress.d.ts +40 -0
  156. package/dist/service/job-progress.d.ts.map +1 -0
  157. package/dist/service/job-progress.js +53 -0
  158. package/dist/service/job-progress.js.map +1 -0
  159. package/dist/service/workflow-run.d.ts +279 -0
  160. package/dist/service/workflow-run.d.ts.map +1 -0
  161. package/dist/service/workflow-run.js +598 -0
  162. package/dist/service/workflow-run.js.map +1 -0
  163. package/dist/service/workflow-workspace.d.ts +89 -0
  164. package/dist/service/workflow-workspace.d.ts.map +1 -0
  165. package/dist/service/workflow-workspace.js +160 -0
  166. package/dist/service/workflow-workspace.js.map +1 -0
  167. package/dist/session.d.ts +62 -0
  168. package/dist/session.d.ts.map +1 -0
  169. package/dist/session.js +353 -0
  170. package/dist/session.js.map +1 -0
  171. package/dist/sketch-debug/index.d.ts +11 -0
  172. package/dist/sketch-debug/index.d.ts.map +1 -0
  173. package/dist/sketch-debug/index.js +10 -0
  174. package/dist/sketch-debug/index.js.map +1 -0
  175. package/dist/sketch-debug/markdown.d.ts +6 -0
  176. package/dist/sketch-debug/markdown.d.ts.map +1 -0
  177. package/dist/sketch-debug/markdown.js +93 -0
  178. package/dist/sketch-debug/markdown.js.map +1 -0
  179. package/dist/sketch-debug/report.d.ts +15 -0
  180. package/dist/sketch-debug/report.d.ts.map +1 -0
  181. package/dist/sketch-debug/report.js +98 -0
  182. package/dist/sketch-debug/report.js.map +1 -0
  183. package/dist/sketch-debug/types.d.ts +62 -0
  184. package/dist/sketch-debug/types.d.ts.map +1 -0
  185. package/dist/sketch-debug/types.js +10 -0
  186. package/dist/sketch-debug/types.js.map +1 -0
  187. package/dist/sketch-debug/validate.d.ts +14 -0
  188. package/dist/sketch-debug/validate.d.ts.map +1 -0
  189. package/dist/sketch-debug/validate.js +478 -0
  190. package/dist/sketch-debug/validate.js.map +1 -0
  191. package/dist/supervisor.d.ts +45 -0
  192. package/dist/supervisor.d.ts.map +1 -0
  193. package/dist/supervisor.js +97 -0
  194. package/dist/supervisor.js.map +1 -0
  195. package/dist/timeline-debug/index.d.ts +11 -0
  196. package/dist/timeline-debug/index.d.ts.map +1 -0
  197. package/dist/timeline-debug/index.js +10 -0
  198. package/dist/timeline-debug/index.js.map +1 -0
  199. package/dist/timeline-debug/legibility.d.ts +23 -0
  200. package/dist/timeline-debug/legibility.d.ts.map +1 -0
  201. package/dist/timeline-debug/legibility.js +240 -0
  202. package/dist/timeline-debug/legibility.js.map +1 -0
  203. package/dist/timeline-debug/markdown.d.ts +6 -0
  204. package/dist/timeline-debug/markdown.d.ts.map +1 -0
  205. package/dist/timeline-debug/markdown.js +103 -0
  206. package/dist/timeline-debug/markdown.js.map +1 -0
  207. package/dist/timeline-debug/motion.d.ts +20 -0
  208. package/dist/timeline-debug/motion.d.ts.map +1 -0
  209. package/dist/timeline-debug/motion.js +362 -0
  210. package/dist/timeline-debug/motion.js.map +1 -0
  211. package/dist/timeline-debug/report.d.ts +16 -0
  212. package/dist/timeline-debug/report.d.ts.map +1 -0
  213. package/dist/timeline-debug/report.js +100 -0
  214. package/dist/timeline-debug/report.js.map +1 -0
  215. package/dist/timeline-debug/showcase.d.ts +7 -0
  216. package/dist/timeline-debug/showcase.d.ts.map +1 -0
  217. package/dist/timeline-debug/showcase.js +347 -0
  218. package/dist/timeline-debug/showcase.js.map +1 -0
  219. package/dist/timeline-debug/types.d.ts +64 -0
  220. package/dist/timeline-debug/types.d.ts.map +1 -0
  221. package/dist/timeline-debug/types.js +10 -0
  222. package/dist/timeline-debug/types.js.map +1 -0
  223. package/dist/timeline-debug/validate.d.ts +24 -0
  224. package/dist/timeline-debug/validate.d.ts.map +1 -0
  225. package/dist/timeline-debug/validate.js +1432 -0
  226. package/dist/timeline-debug/validate.js.map +1 -0
  227. package/dist/types.d.ts +211 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +2 -0
  230. package/dist/types.js.map +1 -0
  231. package/package.json +103 -0
@@ -0,0 +1,347 @@
1
+ import { compileClipAnimations, isKnownShapeKind, parseClipEffectType, resolveBeatAnimations } from "@nodetool-ai/timeline";
2
+ const MIN_LAYERS = 3;
3
+ const MIN_COVERAGE = 0.8;
4
+ // Shipped showcases (excluding t-minus-30), measured from their visible spans:
5
+ // kite: 23 groups, 100/15 custom/s, 6 effect types, 140/15 clips/s
6
+ // prism: 16, 55/18, 10, 87/18; serein: 60, 173/26, 7, 678/26
7
+ // tidewater: 22, 39/16, 6, 180/16; voltra: 12, 103/23, 13, 124/23.
8
+ // Medians: 22 groups, 103/23 custom/s, 7 effects, 140/15 clips/s.
9
+ // A median floor would reject shipped examples. Use their lower envelope for
10
+ // warnings, report the median target, and require rendered example comparison.
11
+ const SHOWCASE_FLOOR = {
12
+ groups: 12,
13
+ customPerSecond: 39 / 16,
14
+ effects: 6,
15
+ clipsPerSecond: 87 / 18
16
+ };
17
+ const SHOWCASE_TARGET = {
18
+ groups: 22,
19
+ customPerSecond: 103 / 23,
20
+ effects: 7,
21
+ clipsPerSecond: 140 / 15
22
+ };
23
+ // Segment-average speed, normalized to canvas dimensions. Sharp cuts can
24
+ // intentionally exceed this proxy, so the skill requires a visual justification.
25
+ const FAST_POSITION_PER_SECOND = 20;
26
+ const FAST_SCALE_PER_SECOND = 20;
27
+ const FINISH_EFFECT_TYPES = [
28
+ "grain",
29
+ "vignette",
30
+ "color",
31
+ "curves",
32
+ "levels",
33
+ "liftGammaGain",
34
+ "lut"
35
+ ];
36
+ /** Static eligibility only. Assets, occlusion, sampled opacity and aesthetics need rendered review. */
37
+ function hasVisualContent(clip) {
38
+ if (clip.mediaType === "text") {
39
+ return Boolean(clip.textStyle?.text.trim());
40
+ }
41
+ if (clip.mediaType === "shape") {
42
+ return Boolean(clip.shapeStyle && isKnownShapeKind(clip.shapeStyle.kind));
43
+ }
44
+ return (["image", "video", "overlay", "model3d"].includes(clip.mediaType) &&
45
+ Boolean(clip.currentAssetId));
46
+ }
47
+ /** Memoized parent windows: iterative, linear even for deeply nested scenes. */
48
+ function activeWindows(doc) {
49
+ const clips = new Map(doc.clips.map((clip) => [clip.id, clip]));
50
+ const tracks = new Map(doc.tracks.map((track) => [track.id, track]));
51
+ const windows = new Map();
52
+ for (const clip of doc.clips) {
53
+ if (windows.has(clip.id)) {
54
+ continue;
55
+ }
56
+ const chain = [];
57
+ const seen = new Set();
58
+ let current = clip;
59
+ let parentWindow;
60
+ while (current && !windows.has(current.id)) {
61
+ if (seen.has(current.id)) {
62
+ parentWindow = null;
63
+ break;
64
+ }
65
+ seen.add(current.id);
66
+ chain.push(current);
67
+ const parent = current.parentId
68
+ ? clips.get(current.parentId)
69
+ : undefined;
70
+ current = parent?.mediaType === "group" ? parent : undefined;
71
+ }
72
+ if (current && windows.has(current.id)) {
73
+ parentWindow = windows.get(current.id);
74
+ }
75
+ for (let i = chain.length - 1; i >= 0; i -= 1) {
76
+ const entry = chain[i];
77
+ if (!entry) {
78
+ continue;
79
+ }
80
+ const track = tracks.get(entry.trackId);
81
+ const scale = entry.transform?.scale;
82
+ const active = parentWindow !== null &&
83
+ track?.visible &&
84
+ (track.type === "video" || track.type === "overlay") &&
85
+ !entry.hidden &&
86
+ (entry.opacity ?? 1) > 0 &&
87
+ scale?.x !== 0 &&
88
+ scale?.y !== 0;
89
+ const start = Math.max(0, entry.startMs, parentWindow?.start ?? 0);
90
+ const end = Math.min(entry.startMs + entry.durationMs, parentWindow?.end ?? Infinity);
91
+ parentWindow = active && end > start ? { start, end } : null;
92
+ windows.set(entry.id, parentWindow);
93
+ }
94
+ }
95
+ return windows;
96
+ }
97
+ function hasFinish(effect) {
98
+ if (!effect.enabled) {
99
+ return false;
100
+ }
101
+ if (effect.type === "grain" || effect.type === "vignette") {
102
+ return typeof effect.amount === "number" && effect.amount > 0;
103
+ }
104
+ if (effect.type === "lut") {
105
+ return (effect.intensity !== 0 &&
106
+ typeof effect.cube === "string" &&
107
+ effect.cube.length > 0);
108
+ }
109
+ if (effect.type === "color") {
110
+ return Object.entries(effect).some(([key, value]) => !["id", "type", "enabled"].includes(key) &&
111
+ typeof value === "number" &&
112
+ value !== (["contrast", "saturation"].includes(key) ? 1 : 0));
113
+ }
114
+ if (effect.type === "curves") {
115
+ return [effect.master, effect.r, effect.g, effect.b].some((points) => Array.isArray(points) &&
116
+ points.some((point) => typeof point === "object" &&
117
+ point !== null &&
118
+ "x" in point &&
119
+ "y" in point &&
120
+ point.x !== point.y));
121
+ }
122
+ if (effect.type === "levels") {
123
+ return (effect.inBlack !== 0 ||
124
+ effect.inWhite !== 1 ||
125
+ effect.gamma !== 1 ||
126
+ effect.outBlack !== 0 ||
127
+ effect.outWhite !== 1);
128
+ }
129
+ if (effect.type === "liftGammaGain") {
130
+ return [effect.lift, effect.gamma, effect.gain].some((values, i) => Array.isArray(values) &&
131
+ values.some((value) => value !== (i === 0 ? 0 : 1)));
132
+ }
133
+ return false;
134
+ }
135
+ /** Three independent visual clips for 80% of the first-to-last visible span, including gaps. O(n log n). */
136
+ function layerCoverage(windows) {
137
+ if (windows.length === 0) {
138
+ return 0;
139
+ }
140
+ const events = windows.flatMap((window) => [
141
+ { time: window.start, delta: 1 },
142
+ { time: window.end, delta: -1 }
143
+ ]);
144
+ events.sort((a, b) => a.time - b.time);
145
+ const first = events[0];
146
+ const last = events[events.length - 1];
147
+ if (!first || !last || last.time <= first.time) {
148
+ return 0;
149
+ }
150
+ let count = 0;
151
+ let covered = 0;
152
+ let previous = first.time;
153
+ for (const event of events) {
154
+ if (count >= MIN_LAYERS) {
155
+ covered += event.time - previous;
156
+ }
157
+ count += event.delta;
158
+ previous = event.time;
159
+ }
160
+ return covered / (last.time - first.time);
161
+ }
162
+ export function checkShowcase(doc, canvas) {
163
+ const windows = activeWindows(doc);
164
+ const visual = doc.clips.filter((clip) => windows.get(clip.id) && hasVisualContent(clip));
165
+ const usedGroups = new Set();
166
+ const byId = new Map(doc.clips.map((clip) => [clip.id, clip]));
167
+ // Stop at a previously visited ancestor, so shared or deep chains remain linear.
168
+ for (const clip of visual) {
169
+ let parent = clip.parentId ? byId.get(clip.parentId) : undefined;
170
+ while (parent?.mediaType === "group" && !usedGroups.has(parent.id)) {
171
+ usedGroups.add(parent.id);
172
+ parent = parent.parentId ? byId.get(parent.parentId) : undefined;
173
+ }
174
+ }
175
+ const visualIds = new Set(visual.map((clip) => clip.id));
176
+ const structural = doc.clips.filter((clip) => usedGroups.has(clip.id) || visualIds.has(clip.id));
177
+ const visibleWindows = visual.flatMap((clip) => {
178
+ const window = windows.get(clip.id);
179
+ return window ? [window] : [];
180
+ });
181
+ const support = [...visibleWindows].sort((a, b) => a.start - b.start);
182
+ const merged = [];
183
+ for (const window of support) {
184
+ const last = merged[merged.length - 1];
185
+ if (last && window.start <= last.end) {
186
+ last.end = Math.max(last.end, window.end);
187
+ }
188
+ else {
189
+ merged.push({ ...window });
190
+ }
191
+ }
192
+ const overlapsVisible = (window) => {
193
+ let low = 0;
194
+ let high = merged.length;
195
+ while (low < high) {
196
+ const mid = Math.floor((low + high) / 2);
197
+ const candidate = merged[mid];
198
+ if (candidate && candidate.end <= window.start) {
199
+ low = mid + 1;
200
+ }
201
+ else {
202
+ high = mid;
203
+ }
204
+ }
205
+ const candidate = merged[low];
206
+ return Boolean(candidate && candidate.start < window.end);
207
+ };
208
+ const active = doc.clips.filter((clip) => {
209
+ const window = windows.get(clip.id);
210
+ return (window &&
211
+ (usedGroups.has(clip.id) ||
212
+ visualIds.has(clip.id) ||
213
+ (clip.mediaType === "adjustment" &&
214
+ (!clip.parentId || usedGroups.has(clip.parentId)) &&
215
+ overlapsVisible(window))));
216
+ });
217
+ let customCount = 0;
218
+ const fastWithoutBlur = [];
219
+ for (const clip of active) {
220
+ const window = windows.get(clip.id);
221
+ if (!window) {
222
+ continue;
223
+ }
224
+ const animations = resolveBeatAnimations(clip, doc.tempo);
225
+ const compiled = compileClipAnimations(animations, clip.durationMs, canvas);
226
+ let fast = false;
227
+ for (const animation of compiled) {
228
+ if (clip.startMs + animation.windowStartMs >= window.end ||
229
+ clip.startMs + animation.windowEndMs <= window.start) {
230
+ continue;
231
+ }
232
+ for (const curve of animation.curves) {
233
+ const dimension = ["positionX", "offsetX"].includes(curve.property)
234
+ ? canvas.width
235
+ : ["positionY", "offsetY"].includes(curve.property)
236
+ ? canvas.height
237
+ : ["scale", "scaleX", "scaleY"].includes(curve.property)
238
+ ? 1
239
+ : 0;
240
+ if (!dimension) {
241
+ continue;
242
+ }
243
+ for (let i = 1; i < curve.keyframes.length; i += 1) {
244
+ const a = curve.keyframes[i - 1];
245
+ const b = curve.keyframes[i];
246
+ if (!a || !b) {
247
+ continue;
248
+ }
249
+ const seconds = ((b.t - a.t) *
250
+ (animation.stagger?.unitDurationMs ??
251
+ animation.periodMs ??
252
+ animation.windowEndMs - animation.windowStartMs)) /
253
+ 1000;
254
+ if (seconds <= 0) {
255
+ continue;
256
+ }
257
+ const speed = Math.abs(b.value - a.value) / dimension / seconds;
258
+ fast ||=
259
+ speed >
260
+ (dimension === 1
261
+ ? FAST_SCALE_PER_SECOND
262
+ : FAST_POSITION_PER_SECOND);
263
+ }
264
+ }
265
+ }
266
+ const customAnimations = animations?.filter((a) => a.preset === "custom");
267
+ const customById = new Map(customAnimations?.map((a) => [a.id, a]));
268
+ customCount += compileClipAnimations(customAnimations, clip.durationMs, canvas).filter((animation) => clip.startMs + animation.windowStartMs < window.end &&
269
+ clip.startMs + animation.windowEndMs > window.start &&
270
+ (animation.curves.some((curve) => curve.keyframes.some((k) => k.value !== curve.keyframes[0]?.value)) ||
271
+ customById
272
+ .get(animation.id)
273
+ ?.styleTracks?.some((track) => track.keyframes.some((k) => k.value !== track.keyframes[0]?.value)) ||
274
+ customById.get(animation.id)?.textAnimator)).length;
275
+ if (fast &&
276
+ !(clip.motionBlur &&
277
+ clip.motionBlur.shutterAngle > 0 &&
278
+ clip.motionBlur.samplesPerFrame >= 2)) {
279
+ fastWithoutBlur.push(clip.name || clip.id);
280
+ }
281
+ }
282
+ const custom = customCount > 0;
283
+ const seconds = visibleWindows.length
284
+ ? (visibleWindows.reduce((end, w) => Math.max(end, w.end), 0) -
285
+ visibleWindows.reduce((start, w) => Math.min(start, w.start), Infinity)) /
286
+ 1000
287
+ : 0;
288
+ const activeTrackIds = new Set(active.map((clip) => clip.trackId));
289
+ const effectTypes = new Set([
290
+ ...active.flatMap((clip) => clip.effects ?? []),
291
+ ...doc.tracks
292
+ .filter((track) => activeTrackIds.has(track.id))
293
+ .flatMap((track) => track.effects ?? [])
294
+ ]
295
+ .filter((effect) => effect.enabled && parseClipEffectType(effect.type) !== null)
296
+ .map((effect) => effect.type));
297
+ const customDensity = seconds > 0 ? customCount / seconds : 0;
298
+ const clipDensity = seconds > 0 ? active.length / seconds : 0;
299
+ const finish = active.some((clip) => clip.effects?.some(hasFinish));
300
+ const camera = Boolean(doc.camera2d &&
301
+ (structural.some((clip) => clip.transform?.depthPx !== undefined) ||
302
+ doc.camera2d.keyframes?.some((k) => k.depthPx !== doc.camera2d?.depthPx ||
303
+ k.position.x !== doc.camera2d?.position.x ||
304
+ k.position.y !== doc.camera2d?.position.y)));
305
+ const coverage = layerCoverage(visibleWindows);
306
+ const issues = [];
307
+ const warn = (code, message) => {
308
+ issues.push({ severity: "warning", code, message });
309
+ };
310
+ if (usedGroups.size === 0) {
311
+ warn("showcase_scene_groups_missing", "Showcase structure: no active scene group contains visible content. See voltra: grouped beats and hero rigs. Parent each scene's visual clips to a group so its timing and motion can be directed together.");
312
+ }
313
+ if (!custom) {
314
+ warn("showcase_custom_motion_missing", "Showcase structure: no active custom animation has changing keyframes in its visible window. See tidewater: secondary curves. Add a custom curve to a visible clip or scene group and check its timing.");
315
+ }
316
+ if (!finish) {
317
+ warn("showcase_finish_missing", "Showcase structure: no active grain, vignette or non-neutral color grade is enabled on visible content or an adjustment. See serein: grain and vignette on the finish. Add a restrained finish and inspect a rendered frame.");
318
+ }
319
+ // Prism and tidewater establish dense planar motion without a camera.
320
+ const densePlanar = usedGroups.size >= SHOWCASE_FLOOR.groups &&
321
+ customDensity >= SHOWCASE_FLOOR.customPerSecond &&
322
+ effectTypes.size >= SHOWCASE_FLOOR.effects;
323
+ if (!camera && !densePlanar) {
324
+ warn("showcase_camera_missing", "Showcase structure: no camera2d affects a visible clip or scene group with transform.depthPx. See serein: camera push across depth planes. Set the camera and layer depth, then preview the framing.");
325
+ }
326
+ if (coverage < MIN_COVERAGE) {
327
+ warn("showcase_layer_density_low", `Showcase structure: at least ${MIN_LAYERS} concurrent visual clips cover ${Math.round(coverage * 100)}% of the first-to-last visible span (target ${MIN_COVERAGE * 100}%). See prism: layered plates and light. Build bed, midground and foreground across the scene. Groups, adjustments, audio, hidden or empty clips do not count. This static proxy does not judge occlusion, rendered depth or aesthetic quality.`);
328
+ }
329
+ if (usedGroups.size < SHOWCASE_FLOOR.groups) {
330
+ warn("showcase_scene_group_density_low", `Scene-group gap: ${usedGroups.size} active groups, floor ${SHOWCASE_FLOOR.groups}, example median ${SHOWCASE_TARGET.groups}. See voltra: scene groups direct each beat and nested hero rig.`);
331
+ }
332
+ if (customDensity < SHOWCASE_FLOOR.customPerSecond) {
333
+ warn("showcase_custom_animation_density_low", `Custom-motion gap: ${customCount} active changing animations over ${seconds.toFixed(2)} visible seconds (${customDensity.toFixed(2)}/s), floor ${SHOWCASE_FLOOR.customPerSecond.toFixed(2)}/s, example median ${SHOWCASE_TARGET.customPerSecond.toFixed(2)}/s. See tidewater: secondary curves and textured scene motion.`);
334
+ }
335
+ if (effectTypes.size < SHOWCASE_FLOOR.effects ||
336
+ ![...effectTypes].some((type) => !FINISH_EFFECT_TYPES.includes(type))) {
337
+ warn("showcase_effect_variety_low", `Effect-variety gap: ${effectTypes.size} enabled types, floor ${SHOWCASE_FLOOR.effects}, example median ${SHOWCASE_TARGET.effects}. A finish alone is insufficient. Add a non-finishing type such as glow or generator. See kite: repeater + glow on the logo, generator beds and stylize accents.`);
338
+ }
339
+ if (clipDensity < SHOWCASE_FLOOR.clipsPerSecond) {
340
+ warn("showcase_clip_density_low", `Clip-density gap: ${active.length} active clips over ${seconds.toFixed(2)} visible seconds (${clipDensity.toFixed(2)}/s), floor ${SHOWCASE_FLOOR.clipsPerSecond.toFixed(2)}/s, example median ${SHOWCASE_TARGET.clipsPerSecond.toFixed(2)}/s. See prism: overlapping plates, light and supporting geometry.`);
341
+ }
342
+ if (fastWithoutBlur.length) {
343
+ warn("showcase_motion_blur_missing", `Motion-blur gap: ${fastWithoutBlur.join(", ")} exceed ${FAST_POSITION_PER_SECOND} canvas widths/heights per second or ${FAST_SCALE_PER_SECOND} scale units per second without a positive shutter and at least two samples. See kite: blur on the fast logo move.`);
344
+ }
345
+ return issues;
346
+ }
347
+ //# sourceMappingURL=showcase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase.js","sourceRoot":"","sources":["../../src/timeline-debug/showcase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Timeline debug vocabulary.
3
+ *
4
+ * One report shape for "is this timeline document sound, and what did a
5
+ * scripted edit session leave behind" — shared by the CLI `timeline validate`
6
+ * / `timeline debug` commands and any future server surface, the same way
7
+ * `../debug/types.ts` is shared by every workflow-debug surface.
8
+ */
9
+ import type { DebugVerdict } from "../debug/types.js";
10
+ /** One finding against a timeline document. */
11
+ export interface TimelineDebugIssue {
12
+ severity: "error" | "warning";
13
+ /** Stable machine code, e.g. `field_stripped`, `clip_track_missing`. */
14
+ code: string;
15
+ message: string;
16
+ trackId?: string;
17
+ clipId?: string;
18
+ /** JSON path of the offending field, for schema/round-trip findings. */
19
+ path?: string;
20
+ }
21
+ export interface TimelineValidation {
22
+ /** True when there are no errors. Warnings do not clear `ok`. */
23
+ ok: boolean;
24
+ errors: TimelineDebugIssue[];
25
+ warnings: TimelineDebugIssue[];
26
+ }
27
+ /** One executed step of a `--interact` script. */
28
+ export interface TimelineInteractionRecord {
29
+ /** Tool name as invoked (canonical `ui_timeline_*` form). */
30
+ tool: string;
31
+ input: unknown;
32
+ ok: boolean;
33
+ result?: unknown;
34
+ error?: string;
35
+ }
36
+ export interface TimelineDebugTarget {
37
+ kind: "file" | "id";
38
+ ref: string;
39
+ name?: string;
40
+ }
41
+ export interface TimelineSequenceMeta {
42
+ fps: number;
43
+ width: number;
44
+ height: number;
45
+ durationMs: number;
46
+ trackCount: number;
47
+ clipCount: number;
48
+ }
49
+ export interface TimelineDebugReport {
50
+ target: TimelineDebugTarget;
51
+ meta: TimelineSequenceMeta;
52
+ /** Static validation of the input document. */
53
+ validation: TimelineValidation;
54
+ /** Scripted edit session, when one ran. */
55
+ interactions: TimelineInteractionRecord[];
56
+ /** Bridge snapshot after the script (TimelineBridgeFinalState shape). */
57
+ finalState?: unknown;
58
+ /** Validation of the document reconstructed from the final state. */
59
+ finalValidation?: TimelineValidation;
60
+ /** What a headless run cannot answer (rendering, playback, generation …). */
61
+ notSimulated: string[];
62
+ verdict: DebugVerdict;
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,kDAAkD;AAClD,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,EAAE,kBAAkB,CAAC;IAC/B,2CAA2C;IAC3C,YAAY,EAAE,yBAAyB,EAAE,CAAC;IAC1C,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,6EAA6E;IAC7E,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;CACvB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Timeline debug vocabulary.
3
+ *
4
+ * One report shape for "is this timeline document sound, and what did a
5
+ * scripted edit session leave behind" — shared by the CLI `timeline validate`
6
+ * / `timeline debug` commands and any future server surface, the same way
7
+ * `../debug/types.ts` is shared by every workflow-debug surface.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/timeline-debug/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,24 @@
1
+ import type { TimelineValidation } from "./types.js";
2
+ export interface TimelineValidationMeta {
3
+ /** Opt-in structural guidance. Warnings never change correctness (`ok`). */
4
+ tier?: "standard" | "showcase";
5
+ fps?: number;
6
+ width?: number;
7
+ height?: number;
8
+ }
9
+ /**
10
+ * Collect every leaf/branch path the parse output dropped from the input.
11
+ *
12
+ * Exported because the save path needs the same answer the debug report gives:
13
+ * `timeline.update` in `packages/websocket` parses the incoming document with
14
+ * the same stripping schema and reports what it dropped, so a field lost on
15
+ * autosave is named at the moment it is lost rather than at the next debug run.
16
+ */
17
+ export declare function collectStrippedPaths(input: unknown, output: unknown, path: string, found: Set<string>): void;
18
+ /**
19
+ * Validate a parsed-JSON timeline document. `raw` is untrusted: anything that
20
+ * fails the schema is reported as `schema_invalid` and the structural checks
21
+ * are skipped, since they read fields the parse could not establish.
22
+ */
23
+ export declare function validateTimelineSequence(raw: unknown, meta?: TimelineValidationMeta): TimelineValidation;
24
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/validate.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0JD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GACjB,IAAI,CAoBN;AAkwCD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,OAAO,EACZ,IAAI,CAAC,EAAE,sBAAsB,GAC5B,kBAAkB,CA2DpB"}