frameyard 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/GLOSSARY.md +145 -0
  3. package/LICENSE +21 -0
  4. package/README.md +311 -2
  5. package/dist/assets/executable.d.ts +16 -0
  6. package/dist/assets/executable.d.ts.map +1 -0
  7. package/dist/assets/executable.js +59 -0
  8. package/dist/assets/executable.js.map +1 -0
  9. package/dist/assets/files.d.ts +4 -0
  10. package/dist/assets/files.d.ts.map +1 -0
  11. package/dist/assets/files.js +30 -0
  12. package/dist/assets/files.js.map +1 -0
  13. package/dist/assets/integrations.d.ts +15 -0
  14. package/dist/assets/integrations.d.ts.map +1 -0
  15. package/dist/assets/integrations.js +15 -0
  16. package/dist/assets/integrations.js.map +1 -0
  17. package/dist/assets/process.d.ts +29 -0
  18. package/dist/assets/process.d.ts.map +1 -0
  19. package/dist/assets/process.js +97 -0
  20. package/dist/assets/process.js.map +1 -0
  21. package/dist/assets/provenance.d.ts +77 -0
  22. package/dist/assets/provenance.d.ts.map +1 -0
  23. package/dist/assets/provenance.js +302 -0
  24. package/dist/assets/provenance.js.map +1 -0
  25. package/dist/assets/transcribe.d.ts +38 -0
  26. package/dist/assets/transcribe.d.ts.map +1 -0
  27. package/dist/assets/transcribe.js +357 -0
  28. package/dist/assets/transcribe.js.map +1 -0
  29. package/dist/assets/tts.d.ts +29 -0
  30. package/dist/assets/tts.d.ts.map +1 -0
  31. package/dist/assets/tts.js +180 -0
  32. package/dist/assets/tts.js.map +1 -0
  33. package/dist/cli.d.ts +3 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +795 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/contracts.d.ts +106 -0
  38. package/dist/contracts.d.ts.map +1 -0
  39. package/dist/contracts.js +297 -0
  40. package/dist/contracts.js.map +1 -0
  41. package/dist/doctor.d.ts +56 -0
  42. package/dist/doctor.d.ts.map +1 -0
  43. package/dist/doctor.js +476 -0
  44. package/dist/doctor.js.map +1 -0
  45. package/dist/errors.d.ts +10 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +18 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/index.d.ts +8 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +5 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/preview/main.d.ts +19 -0
  54. package/dist/preview/main.d.ts.map +1 -0
  55. package/dist/preview/main.js +480 -0
  56. package/dist/preview/main.js.map +1 -0
  57. package/dist/project.d.ts +16 -0
  58. package/dist/project.d.ts.map +1 -0
  59. package/dist/project.js +88 -0
  60. package/dist/project.js.map +1 -0
  61. package/dist/renderer/audio.d.ts +31 -0
  62. package/dist/renderer/audio.d.ts.map +1 -0
  63. package/dist/renderer/audio.js +88 -0
  64. package/dist/renderer/audio.js.map +1 -0
  65. package/dist/renderer/browser.d.ts +22 -0
  66. package/dist/renderer/browser.d.ts.map +1 -0
  67. package/dist/renderer/browser.js +175 -0
  68. package/dist/renderer/browser.js.map +1 -0
  69. package/dist/renderer/ffmpeg.d.ts +58 -0
  70. package/dist/renderer/ffmpeg.d.ts.map +1 -0
  71. package/dist/renderer/ffmpeg.js +268 -0
  72. package/dist/renderer/ffmpeg.js.map +1 -0
  73. package/dist/renderer/index.d.ts +72 -0
  74. package/dist/renderer/index.d.ts.map +1 -0
  75. package/dist/renderer/index.js +281 -0
  76. package/dist/renderer/index.js.map +1 -0
  77. package/dist/renderer/transcripts.d.ts +30 -0
  78. package/dist/renderer/transcripts.d.ts.map +1 -0
  79. package/dist/renderer/transcripts.js +86 -0
  80. package/dist/renderer/transcripts.js.map +1 -0
  81. package/dist/runtime/clock.d.ts +5 -0
  82. package/dist/runtime/clock.d.ts.map +1 -0
  83. package/dist/runtime/clock.js +16 -0
  84. package/dist/runtime/clock.js.map +1 -0
  85. package/dist/runtime/index.d.ts +29 -0
  86. package/dist/runtime/index.d.ts.map +1 -0
  87. package/dist/runtime/index.js +289 -0
  88. package/dist/runtime/index.js.map +1 -0
  89. package/dist/runtime/random.d.ts +8 -0
  90. package/dist/runtime/random.d.ts.map +1 -0
  91. package/dist/runtime/random.js +21 -0
  92. package/dist/runtime/random.js.map +1 -0
  93. package/dist/scaffold.d.ts +3 -0
  94. package/dist/scaffold.d.ts.map +1 -0
  95. package/dist/scaffold.js +176 -0
  96. package/dist/scaffold.js.map +1 -0
  97. package/dist/server/preview-html.d.ts +2 -0
  98. package/dist/server/preview-html.d.ts.map +1 -0
  99. package/dist/server/preview-html.js +229 -0
  100. package/dist/server/preview-html.js.map +1 -0
  101. package/dist/server/server.d.ts +17 -0
  102. package/dist/server/server.d.ts.map +1 -0
  103. package/dist/server/server.js +237 -0
  104. package/dist/server/server.js.map +1 -0
  105. package/dist/transcript.d.ts +44 -0
  106. package/dist/transcript.d.ts.map +1 -0
  107. package/dist/transcript.js +130 -0
  108. package/dist/transcript.js.map +1 -0
  109. package/dist/version.d.ts +2 -0
  110. package/dist/version.d.ts.map +1 -0
  111. package/dist/version.js +2 -0
  112. package/dist/version.js.map +1 -0
  113. package/docs/adr/0001-keep-composition-authoring-web-native.md +3 -0
  114. package/docs/adr/0002-make-frame-and-props-the-only-animation-state.md +3 -0
  115. package/docs/adr/0003-render-browser-frames-offline.md +3 -0
  116. package/docs/adr/0004-produce-local-ai-assets-outside-rendering.md +3 -0
  117. package/docs/v0.1-design.md +238 -0
  118. package/examples/demo/README.md +24 -0
  119. package/examples/demo/assets/chime.wav +0 -0
  120. package/examples/demo/compositions/demo.js +206 -0
  121. package/examples/demo/props/demo.json +5 -0
  122. package/examples/demo/video.config.js +5 -0
  123. package/package.json +73 -3
  124. package/skills/frameyard/README.md +35 -0
  125. package/skills/frameyard/SKILL.md +60 -0
  126. package/skills/frameyard/references/audio-assets.md +86 -0
  127. package/skills/frameyard/references/deterministic-authoring.md +107 -0
  128. package/skills/frameyard/references/failure-recovery.md +57 -0
  129. package/skills/frameyard/references/json-results.md +203 -0
  130. package/skills/frameyard/references/subtitles-karaoke.md +95 -0
  131. package/skills/frameyard/scripts/frameyard.mjs +60 -0
@@ -0,0 +1,480 @@
1
+ import { createCompositionRuntime, frameToMilliseconds, loadCompositionModule, } from "../runtime/index.js";
2
+ import { FrameyardError, errorMessage, isFrameyardError } from "../errors.js";
3
+ const isRender = new URLSearchParams(window.location.search).get("render") === "1";
4
+ function byId(id) {
5
+ const element = document.getElementById(id);
6
+ if (!element) {
7
+ throw new Error(`Preview markup is missing #${id}.`);
8
+ }
9
+ return element;
10
+ }
11
+ const stage = byId("stage");
12
+ const stageWrap = byId("stage-wrap");
13
+ const viewport = byId("viewport");
14
+ const errorBox = byId("error");
15
+ const propsEditor = byId("props");
16
+ const applyButton = byId("apply");
17
+ const formatButton = byId("format");
18
+ const compositionSelect = byId("composition");
19
+ const metaLabel = byId("meta");
20
+ const playButton = byId("play");
21
+ const scrubber = byId("scrub");
22
+ const frameLabel = byId("frame");
23
+ const durationLabel = byId("duration");
24
+ const clockLabel = byId("clock");
25
+ const muteCheckbox = byId("mute");
26
+ const volumeSlider = byId("volume");
27
+ let runtime = null;
28
+ let metadata = null;
29
+ let audioClips = [];
30
+ let audioEntries = [];
31
+ let currentFrame = 0;
32
+ let playing = false;
33
+ let animationFrame = 0;
34
+ let playStartFrame = 0;
35
+ let playStartClock = 0;
36
+ let masterVolume = Number(volumeSlider.value) || 0.8;
37
+ let muted = false;
38
+ let lastError = null;
39
+ let selectedEntry = null;
40
+ let loadQueue = Promise.resolve();
41
+ const entries = new Map();
42
+ function showError(error) {
43
+ lastError = errorMessage(error);
44
+ errorBox.hidden = false;
45
+ errorBox.textContent = lastError;
46
+ console.error(error);
47
+ }
48
+ function clearError() {
49
+ lastError = null;
50
+ errorBox.hidden = true;
51
+ errorBox.textContent = "";
52
+ }
53
+ function updateMeta() {
54
+ if (!metadata) {
55
+ metaLabel.textContent = "";
56
+ return;
57
+ }
58
+ const seconds = metadata.durationInFrames / metadata.fps;
59
+ metaLabel.textContent = `${metadata.width}×${metadata.height} · ${metadata.fps} fps · ${metadata.durationInFrames} frames · ${seconds.toFixed(2)}s`;
60
+ }
61
+ function updateTransport() {
62
+ if (!metadata) {
63
+ frameLabel.textContent = "0";
64
+ durationLabel.textContent = "0";
65
+ clockLabel.textContent = "0.00s";
66
+ scrubber.max = "0";
67
+ scrubber.value = "0";
68
+ return;
69
+ }
70
+ frameLabel.textContent = String(currentFrame);
71
+ durationLabel.textContent = String(metadata.durationInFrames - 1);
72
+ clockLabel.textContent = `${(currentFrame / metadata.fps).toFixed(2)}s`;
73
+ scrubber.max = String(metadata.durationInFrames - 1);
74
+ scrubber.value = String(currentFrame);
75
+ }
76
+ function fitStage() {
77
+ if (!metadata) {
78
+ return;
79
+ }
80
+ if (isRender) {
81
+ stage.style.transform = "none";
82
+ stageWrap.style.width = "";
83
+ stageWrap.style.height = "";
84
+ return;
85
+ }
86
+ const padding = 48;
87
+ const availableWidth = Math.max(1, viewport.clientWidth - padding);
88
+ const availableHeight = Math.max(1, viewport.clientHeight - padding);
89
+ const scale = Math.min(availableWidth / metadata.width, availableHeight / metadata.height, 1);
90
+ stage.style.transform = `scale(${scale})`;
91
+ stageWrap.style.width = `${metadata.width * scale}px`;
92
+ stageWrap.style.height = `${metadata.height * scale}px`;
93
+ }
94
+ function assetUrl(src) {
95
+ return new URL(src.replace(/^\.\//, ""), `${window.location.origin}/`).href;
96
+ }
97
+ function updateAudioVolumes() {
98
+ const level = muted ? 0 : masterVolume;
99
+ for (const entry of audioEntries) {
100
+ entry.element.volume = Math.max(0, Math.min(1, entry.clip.volume * level));
101
+ }
102
+ }
103
+ function stopAudio() {
104
+ for (const entry of audioEntries) {
105
+ entry.element.pause();
106
+ }
107
+ }
108
+ function releaseAudio() {
109
+ for (const entry of audioEntries) {
110
+ entry.element.pause();
111
+ entry.element.removeAttribute("src");
112
+ entry.element.load();
113
+ }
114
+ audioEntries = [];
115
+ }
116
+ function buildAudio() {
117
+ releaseAudio();
118
+ if (isRender || !metadata) {
119
+ return;
120
+ }
121
+ for (const clip of audioClips) {
122
+ const element = new Audio();
123
+ element.preload = "auto";
124
+ element.src = assetUrl(clip.src);
125
+ element.load();
126
+ audioEntries.push({ clip, element });
127
+ }
128
+ updateAudioVolumes();
129
+ }
130
+ function syncAudio() {
131
+ if (!metadata || audioEntries.length === 0) {
132
+ return;
133
+ }
134
+ const compositionTime = frameToMilliseconds(currentFrame, metadata.fps);
135
+ for (const { clip, element } of audioEntries) {
136
+ const clipStart = frameToMilliseconds(clip.startFrame, metadata.fps);
137
+ const localTime = compositionTime - clipStart;
138
+ const sourceDuration = Number.isFinite(element.duration)
139
+ ? Math.max(0, element.duration - clip.trimStart)
140
+ : Number.POSITIVE_INFINITY;
141
+ const clipDuration = clip.trimDuration ?? sourceDuration;
142
+ if (localTime < 0 || localTime >= clipDuration * 1000) {
143
+ element.pause();
144
+ const edge = localTime < 0 ? clip.trimStart : clip.trimStart + clipDuration;
145
+ try {
146
+ element.currentTime = edge;
147
+ }
148
+ catch {
149
+ // Metadata may not be available yet; the next sync will retry.
150
+ }
151
+ continue;
152
+ }
153
+ const desiredTime = clip.trimStart + localTime / 1000;
154
+ if (Math.abs(element.currentTime - desiredTime) > 0.12) {
155
+ try {
156
+ element.currentTime = desiredTime;
157
+ }
158
+ catch {
159
+ // Ignore an unseekable element until metadata loads.
160
+ }
161
+ }
162
+ if (playing) {
163
+ if (element.paused) {
164
+ void element.play().catch(() => {
165
+ // Preview audio is best-effort until the user interacts with the page.
166
+ });
167
+ }
168
+ }
169
+ else if (!element.paused) {
170
+ element.pause();
171
+ }
172
+ }
173
+ }
174
+ function stopPlayback() {
175
+ playing = false;
176
+ cancelAnimationFrame(animationFrame);
177
+ animationFrame = 0;
178
+ playButton.textContent = "\u25b6";
179
+ playButton.setAttribute("aria-label", "Play");
180
+ stopAudio();
181
+ }
182
+ function renderFrame(frame) {
183
+ if (!runtime || !metadata) {
184
+ throw new FrameyardError("COMPOSITION_ERROR", "No composition is loaded.");
185
+ }
186
+ try {
187
+ runtime.seek(frame);
188
+ }
189
+ catch (error) {
190
+ stopPlayback();
191
+ showError(error);
192
+ throw error;
193
+ }
194
+ currentFrame = frame;
195
+ clearError();
196
+ updateTransport();
197
+ syncAudio();
198
+ }
199
+ function playbackLoop() {
200
+ if (!playing || !runtime || !metadata) {
201
+ return;
202
+ }
203
+ const elapsed = (performance.now() - playStartClock) / 1000;
204
+ let target = Math.floor(playStartFrame + elapsed * metadata.fps);
205
+ if (target >= metadata.durationInFrames) {
206
+ target = metadata.durationInFrames - 1;
207
+ }
208
+ if (target !== currentFrame) {
209
+ try {
210
+ renderFrame(target);
211
+ }
212
+ catch {
213
+ stopPlayback();
214
+ return;
215
+ }
216
+ }
217
+ if (target >= metadata.durationInFrames - 1) {
218
+ stopPlayback();
219
+ return;
220
+ }
221
+ animationFrame = requestAnimationFrame(playbackLoop);
222
+ }
223
+ function setPlaying(value) {
224
+ if (!runtime || !metadata || playing === value) {
225
+ return;
226
+ }
227
+ if (value) {
228
+ if (currentFrame >= metadata.durationInFrames - 1) {
229
+ renderFrame(0);
230
+ }
231
+ playing = true;
232
+ playStartFrame = currentFrame;
233
+ playStartClock = performance.now();
234
+ playButton.textContent = "\u275a\u275a";
235
+ playButton.setAttribute("aria-label", "Pause");
236
+ syncAudio();
237
+ animationFrame = requestAnimationFrame(playbackLoop);
238
+ }
239
+ else {
240
+ stopPlayback();
241
+ syncAudio();
242
+ }
243
+ }
244
+ async function teardown() {
245
+ stopPlayback();
246
+ releaseAudio();
247
+ playButton.disabled = true;
248
+ scrubber.disabled = true;
249
+ if (runtime) {
250
+ const active = runtime;
251
+ runtime = null;
252
+ await active.dispose();
253
+ }
254
+ else {
255
+ stage.replaceChildren();
256
+ }
257
+ metadata = null;
258
+ audioClips = [];
259
+ currentFrame = 0;
260
+ updateMeta();
261
+ updateTransport();
262
+ stage.style.width = "0px";
263
+ stage.style.height = "0px";
264
+ }
265
+ function enqueue(task) {
266
+ const run = loadQueue.then(task, task);
267
+ loadQueue = run.then(() => undefined, () => undefined);
268
+ return run;
269
+ }
270
+ async function loadNow(entry, propOverrides) {
271
+ if (typeof entry !== "string" || entry.length === 0) {
272
+ throw new FrameyardError("COMPOSITION_INVALID", "A composition entry path is required.");
273
+ }
274
+ await teardown();
275
+ clearError();
276
+ const moduleUrl = new URL(entry, `${window.location.origin}/`);
277
+ if (moduleUrl.origin !== window.location.origin) {
278
+ throw new FrameyardError("COMPOSITION_INVALID", "Composition entry must be served from this project.");
279
+ }
280
+ const loadedComposition = await loadCompositionModule(moduleUrl.href);
281
+ const loadedMetadata = {
282
+ width: loadedComposition.width,
283
+ height: loadedComposition.height,
284
+ fps: loadedComposition.fps,
285
+ durationInFrames: loadedComposition.durationInFrames,
286
+ };
287
+ metadata = loadedMetadata;
288
+ stage.style.width = `${loadedMetadata.width}px`;
289
+ stage.style.height = `${loadedMetadata.height}px`;
290
+ stage.style.transform = isRender ? "none" : "";
291
+ fitStage();
292
+ updateMeta();
293
+ const active = await createCompositionRuntime({
294
+ composition: loadedComposition,
295
+ container: stage,
296
+ props: propOverrides,
297
+ ...(isRender
298
+ ? {}
299
+ : {
300
+ diagnostics: (warning) => {
301
+ console.warn(`[frameyard] ${warning}`);
302
+ },
303
+ }),
304
+ });
305
+ runtime = active;
306
+ audioClips = active.audioClips;
307
+ currentFrame = 0;
308
+ buildAudio();
309
+ updateTransport();
310
+ propsEditor.value = JSON.stringify(active.props, null, 2);
311
+ selectedEntry = entry;
312
+ const idForEntry = [...entries].find(([, value]) => value === entry)?.[0];
313
+ if (idForEntry) {
314
+ compositionSelect.value = idForEntry;
315
+ }
316
+ updateAudioVolumes();
317
+ syncAudio();
318
+ fitStage();
319
+ return {
320
+ metadata: loadedMetadata,
321
+ props: active.props,
322
+ audioClips: [...audioClips],
323
+ transcriptClips: [...active.transcriptClips],
324
+ };
325
+ }
326
+ function browserCommandError(error) {
327
+ if (isFrameyardError(error)) {
328
+ return new Error(`[${error.code}] ${error.message}`);
329
+ }
330
+ return error instanceof Error ? error : new Error(String(error));
331
+ }
332
+ const api = {
333
+ load(entry, propOverrides) {
334
+ return enqueue(async () => {
335
+ playButton.disabled = true;
336
+ scrubber.disabled = true;
337
+ try {
338
+ return await loadNow(entry, propOverrides);
339
+ }
340
+ catch (error) {
341
+ throw browserCommandError(error);
342
+ }
343
+ finally {
344
+ playButton.disabled = runtime === null;
345
+ scrubber.disabled = runtime === null;
346
+ }
347
+ });
348
+ },
349
+ seek(frame) {
350
+ try {
351
+ renderFrame(frame);
352
+ if (playing) {
353
+ playStartFrame = frame;
354
+ playStartClock = performance.now();
355
+ }
356
+ }
357
+ catch (error) {
358
+ throw browserCommandError(error);
359
+ }
360
+ },
361
+ dispose() {
362
+ return enqueue(async () => {
363
+ try {
364
+ await teardown();
365
+ propsEditor.value = "";
366
+ selectedEntry = null;
367
+ }
368
+ catch (error) {
369
+ throw browserCommandError(error);
370
+ }
371
+ });
372
+ },
373
+ };
374
+ window.__frameyardPreview = api;
375
+ async function initPreview() {
376
+ playButton.disabled = true;
377
+ const response = await fetch("/__frameyard/project.json", { cache: "no-store" });
378
+ if (!response.ok) {
379
+ throw new FrameyardError("CONFIG_INVALID", `Could not load project.json (${response.status}).`);
380
+ }
381
+ const data = (await response.json());
382
+ if (!Array.isArray(data.compositions) || data.compositions.length === 0) {
383
+ throw new FrameyardError("CONFIG_INVALID", "The project has no compositions.");
384
+ }
385
+ compositionSelect.replaceChildren();
386
+ for (const item of data.compositions) {
387
+ if (typeof item.id !== "string" || typeof item.entry !== "string") {
388
+ continue;
389
+ }
390
+ entries.set(item.id, item.entry);
391
+ const option = document.createElement("option");
392
+ option.value = item.id;
393
+ option.textContent = item.id;
394
+ compositionSelect.append(option);
395
+ }
396
+ const requested = new URLSearchParams(window.location.search).get("composition");
397
+ const firstId = entries.has(requested ?? "") ? requested : [...entries.keys()][0];
398
+ if (!firstId) {
399
+ throw new FrameyardError("CONFIG_INVALID", "The project has no usable compositions.");
400
+ }
401
+ const firstEntry = entries.get(firstId);
402
+ selectedEntry = firstEntry;
403
+ compositionSelect.value = firstId;
404
+ document.title = `${firstId} — Frameyard Preview`;
405
+ scrubber.disabled = true;
406
+ playButton.addEventListener("click", () => setPlaying(!playing));
407
+ scrubber.addEventListener("input", () => {
408
+ stopPlayback();
409
+ try {
410
+ renderFrame(Number(scrubber.value));
411
+ }
412
+ catch (error) {
413
+ showError(error);
414
+ }
415
+ });
416
+ muteCheckbox.addEventListener("change", () => {
417
+ muted = muteCheckbox.checked;
418
+ updateAudioVolumes();
419
+ });
420
+ volumeSlider.addEventListener("input", () => {
421
+ masterVolume = Number(volumeSlider.value);
422
+ updateAudioVolumes();
423
+ });
424
+ window.addEventListener("resize", fitStage);
425
+ compositionSelect.addEventListener("change", () => {
426
+ const id = compositionSelect.value;
427
+ const entry = entries.get(id);
428
+ if (!entry) {
429
+ return;
430
+ }
431
+ selectedEntry = entry;
432
+ document.title = `${id} — Frameyard Preview`;
433
+ void api.load(entry).catch(showError);
434
+ });
435
+ applyButton.addEventListener("click", () => {
436
+ if (!selectedEntry) {
437
+ return;
438
+ }
439
+ let parsed;
440
+ try {
441
+ parsed = JSON.parse(propsEditor.value.trim() || "{}");
442
+ }
443
+ catch (error) {
444
+ showError(new FrameyardError("PROPS_INVALID", `Props are not valid JSON: ${errorMessage(error)}`));
445
+ return;
446
+ }
447
+ void api.load(selectedEntry, parsed).catch(showError);
448
+ });
449
+ formatButton.addEventListener("click", () => {
450
+ try {
451
+ propsEditor.value = JSON.stringify(JSON.parse(propsEditor.value.trim() || "{}"), null, 2);
452
+ clearError();
453
+ }
454
+ catch (error) {
455
+ showError(new FrameyardError("PROPS_INVALID", `Props are not valid JSON: ${errorMessage(error)}`));
456
+ }
457
+ });
458
+ try {
459
+ await api.load(firstEntry);
460
+ }
461
+ catch (error) {
462
+ showError(error);
463
+ }
464
+ }
465
+ window.addEventListener("error", (event) => {
466
+ if (event.error) {
467
+ showError(event.error);
468
+ }
469
+ });
470
+ window.addEventListener("unhandledrejection", (event) => {
471
+ showError(event.reason);
472
+ });
473
+ if (isRender) {
474
+ document.body.classList.add("render");
475
+ updateTransport();
476
+ }
477
+ else {
478
+ void initPreview();
479
+ }
480
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/preview/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface ProjectComposition {
2
+ id: string;
3
+ /** Forward-slash relative path from the project root, without a leading "./". */
4
+ entry: string;
5
+ absoluteEntry: string;
6
+ }
7
+ export interface Project {
8
+ root: string;
9
+ configPath: string;
10
+ compositions: Map<string, ProjectComposition>;
11
+ }
12
+ /** Walks up from a directory until it finds video.config.js. */
13
+ export declare function resolveProjectRoot(start?: string): Promise<string>;
14
+ /** Loads video.config.js and validates its explicitly listed composition entries. */
15
+ export declare function loadProject(projectRoot: string): Promise<Project>;
16
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAYD,gEAAgE;AAChE,wBAAsB,kBAAkB,CAAC,KAAK,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AAED,qFAAqF;AACrF,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEvE"}
@@ -0,0 +1,88 @@
1
+ import { stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { FrameyardError } from "./errors.js";
5
+ import { isPlainObject } from "./contracts.js";
6
+ const COMPOSITION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
7
+ async function isFile(filePath) {
8
+ try {
9
+ return (await stat(filePath)).isFile();
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /** Walks up from a directory until it finds video.config.js. */
16
+ export async function resolveProjectRoot(start = process.cwd()) {
17
+ let current = path.resolve(start);
18
+ try {
19
+ if (!(await stat(current)).isDirectory()) {
20
+ current = path.dirname(current);
21
+ }
22
+ }
23
+ catch {
24
+ throw new FrameyardError("CONFIG_NOT_FOUND", `Project directory does not exist: ${current}`);
25
+ }
26
+ while (true) {
27
+ if (await isFile(path.join(current, "video.config.js"))) {
28
+ return current;
29
+ }
30
+ const parent = path.dirname(current);
31
+ if (parent === current) {
32
+ throw new FrameyardError("CONFIG_NOT_FOUND", `No video.config.js found from ${path.resolve(start)} upward. Run inside a Frameyard project or pass --project.`);
33
+ }
34
+ current = parent;
35
+ }
36
+ }
37
+ /** Loads video.config.js and validates its explicitly listed composition entries. */
38
+ export async function loadProject(projectRoot) {
39
+ const root = path.resolve(projectRoot);
40
+ const configPath = path.join(root, "video.config.js");
41
+ if (!(await isFile(configPath))) {
42
+ throw new FrameyardError("CONFIG_NOT_FOUND", `No video.config.js found in ${root}.`);
43
+ }
44
+ let configModule;
45
+ try {
46
+ const url = pathToFileURL(configPath);
47
+ url.searchParams.set("mtime", String((await stat(configPath)).mtimeMs));
48
+ configModule = (await import(url.href));
49
+ }
50
+ catch (error) {
51
+ throw new FrameyardError("CONFIG_INVALID", `Could not load ${configPath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
52
+ }
53
+ const config = configModule.default;
54
+ if (!isPlainObject(config)) {
55
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js must default-export a configuration object.");
56
+ }
57
+ const entries = config.compositions;
58
+ if (!isPlainObject(entries)) {
59
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js must contain a compositions object.");
60
+ }
61
+ const compositions = new Map();
62
+ for (const [id, rawEntry] of Object.entries(entries)) {
63
+ if (!COMPOSITION_ID.test(id)) {
64
+ throw new FrameyardError("CONFIG_INVALID", `Invalid composition id "${id}". Use letters, digits, dots, underscores, or hyphens, starting with a letter or digit.`);
65
+ }
66
+ if (typeof rawEntry !== "string" || rawEntry.length === 0) {
67
+ throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry must be a non-empty string.`);
68
+ }
69
+ const entry = rawEntry.replaceAll("\\", "/");
70
+ if (entry.startsWith("/") || /^[A-Za-z]:/.test(entry)) {
71
+ throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry must be relative to the project root.`);
72
+ }
73
+ const absoluteEntry = path.resolve(root, entry);
74
+ if (absoluteEntry !== root && !absoluteEntry.startsWith(root + path.sep)) {
75
+ throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry escapes the project root: ${rawEntry}`);
76
+ }
77
+ if (!(await isFile(absoluteEntry))) {
78
+ throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry does not exist: ${rawEntry}`);
79
+ }
80
+ compositions.set(id, {
81
+ id,
82
+ entry: path.relative(root, absoluteEntry).split(path.sep).join("/"),
83
+ absoluteEntry,
84
+ });
85
+ }
86
+ return { root, configPath, compositions };
87
+ }
88
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ResolvedAudioClip } from "../contracts.js";
2
+ export interface AudioAsset {
3
+ clip: ResolvedAudioClip;
4
+ path: string;
5
+ sourceDurationSeconds: number;
6
+ timelineStartSeconds: number;
7
+ timelineEndSeconds: number;
8
+ }
9
+ export interface AudioInspection {
10
+ assets: AudioAsset[];
11
+ clips: Array<{
12
+ src: string;
13
+ startFrame: number;
14
+ startSeconds: number;
15
+ endSeconds: number;
16
+ sourceDurationSeconds: number;
17
+ trimStart: number;
18
+ trimDuration?: number;
19
+ volume: number;
20
+ }>;
21
+ warnings: string[];
22
+ }
23
+ /** Resolves local audio files, probes durations, and reports timeline overruns. */
24
+ export declare function inspectTimelineAudio(options: {
25
+ projectRoot: string;
26
+ clips: readonly ResolvedAudioClip[];
27
+ fps: number;
28
+ durationInFrames: number;
29
+ signal?: AbortSignal;
30
+ }): Promise<AudioInspection>;
31
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/renderer/audio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD,mFAAmF;AACnF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwG3B"}