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 @@
1
+ {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/renderer/ffmpeg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { CompositionMetadata } from "../contracts.js";
2
+ import type { Project } from "../project.js";
3
+ import { type AudioInspection } from "./audio.js";
4
+ import { type TranscriptInspection } from "./transcripts.js";
5
+ export interface ProgressEvent {
6
+ frame: number;
7
+ total: number;
8
+ elapsedMs: number;
9
+ }
10
+ interface SessionOptions {
11
+ project: Project;
12
+ compositionId: string;
13
+ props?: unknown;
14
+ signal?: AbortSignal;
15
+ onProgress?: (event: ProgressEvent) => void;
16
+ }
17
+ export interface CheckResult {
18
+ composition: string;
19
+ metadata: CompositionMetadata;
20
+ framesChecked: number;
21
+ audio: {
22
+ clips: number;
23
+ warnings: string[];
24
+ details: AudioInspection["clips"];
25
+ };
26
+ transcripts: {
27
+ clips: number;
28
+ warnings: string[];
29
+ details: TranscriptInspection["clips"];
30
+ };
31
+ elapsedMs: number;
32
+ }
33
+ export interface StillResult {
34
+ composition: string;
35
+ frame: number;
36
+ path: string;
37
+ width: number;
38
+ height: number;
39
+ elapsedMs: number;
40
+ }
41
+ export interface RenderResult {
42
+ composition: string;
43
+ path: string;
44
+ width: number;
45
+ height: number;
46
+ fps: number;
47
+ durationInFrames: number;
48
+ durationSeconds: number;
49
+ framesRendered: number;
50
+ bytes: number;
51
+ audio: {
52
+ clips: number;
53
+ warnings: string[];
54
+ };
55
+ transcripts: {
56
+ clips: number;
57
+ warnings: string[];
58
+ };
59
+ elapsedMs: number;
60
+ }
61
+ export declare function checkComposition(options: SessionOptions): Promise<CheckResult>;
62
+ export declare function captureStill(options: SessionOptions & {
63
+ frame: number;
64
+ outPath: string;
65
+ overwrite?: boolean;
66
+ }): Promise<StillResult>;
67
+ export declare function renderComposition(options: SessionOptions & {
68
+ outPath: string;
69
+ overwrite?: boolean;
70
+ }): Promise<RenderResult>;
71
+ export {};
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;KACnC,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAsGD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAoCpF;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,CAAC,WAAW,CAAC,CAuDtB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,CAAC,YAAY,CAAC,CAsHvB"}
@@ -0,0 +1,281 @@
1
+ import { link, mkdir, mkdtemp, rename, rm, stat, writeFile } from "node:fs/promises";
2
+ import { randomUUID } from "node:crypto";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { FrameyardError, isFrameyardError } from "../errors.js";
6
+ import { startPreviewServer } from "../server/server.js";
7
+ import { inspectTimelineAudio } from "./audio.js";
8
+ import { openCompositionSession } from "./browser.js";
9
+ import { assertFfmpegCapabilities, mixAudioTimeline, startVideoEncoder } from "./ffmpeg.js";
10
+ import { inspectTranscriptClips } from "./transcripts.js";
11
+ function compositionEntry(project, id) {
12
+ const composition = project.compositions.get(id);
13
+ if (!composition) {
14
+ const available = [...project.compositions.keys()].join(", ") || "(none)";
15
+ throw new FrameyardError("COMPOSITION_NOT_FOUND", `Composition "${id}" is not listed in video.config.js. Available: ${available}.`);
16
+ }
17
+ return composition.entry;
18
+ }
19
+ function throwIfAborted(signal) {
20
+ if (signal?.aborted) {
21
+ throw new FrameyardError("RENDER_FAILED", "Operation cancelled.");
22
+ }
23
+ }
24
+ async function pathExists(filePath) {
25
+ try {
26
+ await stat(filePath);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ async function ensureOutputAvailable(outPath, overwrite) {
34
+ if (!overwrite && (await pathExists(outPath))) {
35
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${outPath}. Pass --overwrite to replace it.`);
36
+ }
37
+ await mkdir(path.dirname(outPath), { recursive: true });
38
+ }
39
+ async function publishFile(tempPath, outPath, overwrite) {
40
+ if (overwrite) {
41
+ await rename(tempPath, outPath);
42
+ return;
43
+ }
44
+ try {
45
+ await link(tempPath, outPath);
46
+ }
47
+ catch (error) {
48
+ const code = error.code;
49
+ if (code === "EEXIST") {
50
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${outPath}. Pass --overwrite to replace it.`);
51
+ }
52
+ throw new FrameyardError("RENDER_FAILED", `Could not publish output ${outPath}: ${error.message}`, {
53
+ cause: error,
54
+ });
55
+ }
56
+ finally {
57
+ await rm(tempPath, { force: true });
58
+ }
59
+ }
60
+ async function withSession(options, callback) {
61
+ throwIfAborted(options.signal);
62
+ const entry = compositionEntry(options.project, options.compositionId);
63
+ const server = await startPreviewServer({ projectRoot: options.project.root, port: 0 });
64
+ let session;
65
+ try {
66
+ try {
67
+ session = await openCompositionSession({
68
+ serverUrl: server.url,
69
+ entry,
70
+ props: options.props,
71
+ });
72
+ return await callback(session);
73
+ }
74
+ catch (error) {
75
+ if (isFrameyardError(error)) {
76
+ throw new FrameyardError(error.code, `Composition "${options.compositionId}": ${error.message}`, {
77
+ cause: error,
78
+ });
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+ finally {
84
+ if (session) {
85
+ try {
86
+ await session.close();
87
+ }
88
+ catch {
89
+ // Preserve the command's original error.
90
+ }
91
+ }
92
+ try {
93
+ await server.close();
94
+ }
95
+ catch {
96
+ // Preserve the command's original error.
97
+ }
98
+ }
99
+ }
100
+ function reportProgress(options, frame, total, startedAt) {
101
+ options.onProgress?.({ frame, total, elapsedMs: performance.now() - startedAt });
102
+ }
103
+ export async function checkComposition(options) {
104
+ const startedAt = performance.now();
105
+ return withSession(options, async (session) => {
106
+ const total = session.metadata.durationInFrames;
107
+ const audio = await inspectTimelineAudio({
108
+ projectRoot: options.project.root,
109
+ clips: session.audioClips,
110
+ fps: session.metadata.fps,
111
+ durationInFrames: total,
112
+ signal: options.signal,
113
+ });
114
+ const transcripts = await inspectTranscriptClips({
115
+ projectRoot: options.project.root,
116
+ clips: session.transcriptClips,
117
+ signal: options.signal,
118
+ });
119
+ for (let frame = 0; frame < total; frame += 1) {
120
+ throwIfAborted(options.signal);
121
+ await session.seek(frame);
122
+ reportProgress(options, frame + 1, total, startedAt);
123
+ }
124
+ return {
125
+ composition: options.compositionId,
126
+ metadata: session.metadata,
127
+ framesChecked: total,
128
+ audio: { clips: audio.clips.length, warnings: audio.warnings, details: audio.clips },
129
+ transcripts: {
130
+ clips: transcripts.clips.length,
131
+ warnings: transcripts.warnings,
132
+ details: transcripts.clips,
133
+ },
134
+ elapsedMs: performance.now() - startedAt,
135
+ };
136
+ });
137
+ }
138
+ export async function captureStill(options) {
139
+ if (!Number.isInteger(options.frame) || options.frame < 0) {
140
+ throw new FrameyardError("FRAME_OUT_OF_RANGE", `--frame must be a non-negative integer; received ${options.frame}.`);
141
+ }
142
+ if (path.extname(options.outPath).toLowerCase() !== ".png") {
143
+ throw new FrameyardError("USAGE", `Still output must use a .png extension: ${options.outPath}`);
144
+ }
145
+ const overwrite = options.overwrite ?? false;
146
+ await ensureOutputAvailable(options.outPath, overwrite);
147
+ const startedAt = performance.now();
148
+ return withSession(options, async (session) => {
149
+ const total = session.metadata.durationInFrames;
150
+ if (options.frame >= total) {
151
+ throw new FrameyardError("FRAME_OUT_OF_RANGE", `Frame ${options.frame} is outside the valid range 0..${total - 1}.`);
152
+ }
153
+ await inspectTranscriptClips({
154
+ projectRoot: options.project.root,
155
+ clips: session.transcriptClips,
156
+ signal: options.signal,
157
+ });
158
+ throwIfAborted(options.signal);
159
+ await session.seek(options.frame);
160
+ const png = await session.capture();
161
+ const tempPath = path.join(path.dirname(options.outPath), `.${path.basename(options.outPath)}.frameyard-${process.pid}-${randomUUID()}.tmp`);
162
+ try {
163
+ await writeFile(tempPath, png);
164
+ await ensureOutputAvailable(options.outPath, overwrite);
165
+ await publishFile(tempPath, options.outPath, overwrite);
166
+ }
167
+ finally {
168
+ await rm(tempPath, { force: true });
169
+ }
170
+ return {
171
+ composition: options.compositionId,
172
+ frame: options.frame,
173
+ path: options.outPath,
174
+ width: session.metadata.width,
175
+ height: session.metadata.height,
176
+ elapsedMs: performance.now() - startedAt,
177
+ };
178
+ });
179
+ }
180
+ export async function renderComposition(options) {
181
+ if (path.extname(options.outPath).toLowerCase() !== ".mp4") {
182
+ throw new FrameyardError("USAGE", `Render output must use an .mp4 extension: ${options.outPath}`);
183
+ }
184
+ const overwrite = options.overwrite ?? false;
185
+ await ensureOutputAvailable(options.outPath, overwrite);
186
+ await assertFfmpegCapabilities(options.signal);
187
+ const startedAt = performance.now();
188
+ return withSession(options, async (session) => {
189
+ const { width, height, fps, durationInFrames } = session.metadata;
190
+ if (width % 2 !== 0 || height % 2 !== 0) {
191
+ throw new FrameyardError("RENDER_FAILED", `H.264 output requires even dimensions; the composition is ${width}×${height}.`);
192
+ }
193
+ const durationSeconds = durationInFrames / fps;
194
+ const total = durationInFrames;
195
+ const audio = await inspectTimelineAudio({
196
+ projectRoot: options.project.root,
197
+ clips: session.audioClips,
198
+ fps,
199
+ durationInFrames,
200
+ signal: options.signal,
201
+ });
202
+ const transcripts = await inspectTranscriptClips({
203
+ projectRoot: options.project.root,
204
+ clips: session.transcriptClips,
205
+ signal: options.signal,
206
+ });
207
+ const scratchDir = await mkdtemp(path.join(tmpdir(), "frameyard-render-"));
208
+ const tempOut = path.join(path.dirname(options.outPath), `.${path.basename(options.outPath)}.frameyard-${process.pid}-${randomUUID()}.mp4`);
209
+ let encoder;
210
+ let completed = false;
211
+ try {
212
+ let audioPath;
213
+ if (audio.assets.length > 0) {
214
+ audioPath = path.join(scratchDir, "audio.wav");
215
+ await mixAudioTimeline({
216
+ clips: audio.assets.map((asset) => ({
217
+ path: asset.path,
218
+ startFrame: asset.clip.startFrame,
219
+ trimStart: asset.clip.trimStart,
220
+ ...(asset.clip.trimDuration !== undefined ? { trimDuration: asset.clip.trimDuration } : {}),
221
+ volume: asset.clip.volume,
222
+ })),
223
+ fps,
224
+ durationSeconds,
225
+ outputPath: audioPath,
226
+ signal: options.signal,
227
+ });
228
+ }
229
+ encoder = await startVideoEncoder({
230
+ outputPath: tempOut,
231
+ fps,
232
+ frames: total,
233
+ durationSeconds,
234
+ ...(audioPath !== undefined ? { audioPath } : {}),
235
+ signal: options.signal,
236
+ });
237
+ for (let frame = 0; frame < total; frame += 1) {
238
+ throwIfAborted(options.signal);
239
+ await session.seek(frame);
240
+ const png = await session.capture();
241
+ await encoder.writeFrame(png);
242
+ reportProgress(options, frame + 1, total, startedAt);
243
+ }
244
+ await encoder.finish();
245
+ encoder = undefined;
246
+ if (!overwrite && (await pathExists(options.outPath))) {
247
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${options.outPath}. Pass --overwrite to replace it.`);
248
+ }
249
+ await publishFile(tempOut, options.outPath, overwrite);
250
+ completed = true;
251
+ return {
252
+ composition: options.compositionId,
253
+ path: options.outPath,
254
+ width,
255
+ height,
256
+ fps,
257
+ durationInFrames,
258
+ durationSeconds,
259
+ framesRendered: total,
260
+ bytes: (await stat(options.outPath)).size,
261
+ audio: { clips: audio.clips.length, warnings: audio.warnings },
262
+ transcripts: {
263
+ clips: transcripts.clips.length,
264
+ warnings: transcripts.warnings,
265
+ },
266
+ elapsedMs: performance.now() - startedAt,
267
+ };
268
+ }
269
+ catch (error) {
270
+ await encoder?.abort();
271
+ throw error;
272
+ }
273
+ finally {
274
+ if (!completed) {
275
+ await rm(tempOut, { force: true });
276
+ }
277
+ await rm(scratchDir, { recursive: true, force: true });
278
+ }
279
+ });
280
+ }
281
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ResolvedTranscriptClip } from "../contracts.js";
2
+ import { type Transcript } from "../transcript.js";
3
+ export interface TranscriptAsset {
4
+ clip: ResolvedTranscriptClip;
5
+ path: string;
6
+ bytes: number;
7
+ transcript: Transcript;
8
+ }
9
+ export interface TranscriptInspection {
10
+ assets: TranscriptAsset[];
11
+ clips: Array<{
12
+ src: string;
13
+ language?: string;
14
+ segments: number;
15
+ words?: number;
16
+ durationMs: number;
17
+ bytes: number;
18
+ }>;
19
+ warnings: string[];
20
+ }
21
+ /**
22
+ * Resolves transcript requirements declared by a composition, validates their
23
+ * canonical JSON, and reports missing measured word timings when required.
24
+ */
25
+ export declare function inspectTranscriptClips(options: {
26
+ projectRoot: string;
27
+ clips: readonly ResolvedTranscriptClip[];
28
+ signal?: AbortSignal;
29
+ }): Promise<TranscriptInspection>;
30
+ //# sourceMappingURL=transcripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcripts.d.ts","sourceRoot":"","sources":["../../src/renderer/transcripts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAiBD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwEhC"}
@@ -0,0 +1,86 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { FrameyardError, isFrameyardError } from "../errors.js";
4
+ import { parseTranscript } from "../transcript.js";
5
+ function contains(root, candidate) {
6
+ return candidate === root || candidate.startsWith(root + path.sep);
7
+ }
8
+ function transcriptError(src, error) {
9
+ if (isFrameyardError(error)) {
10
+ return new FrameyardError(error.code, `Transcript "${src}": ${error.message}`, { cause: error });
11
+ }
12
+ return new FrameyardError("TRANSCRIPT_INVALID", `Transcript "${src}" could not be read: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
13
+ }
14
+ /**
15
+ * Resolves transcript requirements declared by a composition, validates their
16
+ * canonical JSON, and reports missing measured word timings when required.
17
+ */
18
+ export async function inspectTranscriptClips(options) {
19
+ const assets = [];
20
+ const warnings = [];
21
+ for (const clip of options.clips) {
22
+ if (options.signal?.aborted) {
23
+ throw new FrameyardError("CANCELLED", "Operation cancelled.");
24
+ }
25
+ const absolutePath = path.resolve(options.projectRoot, clip.src);
26
+ if (!contains(options.projectRoot, absolutePath)) {
27
+ throw new FrameyardError("TRANSCRIPT_INVALID", `Transcript source escapes the project root: ${clip.src}`);
28
+ }
29
+ let fileStat;
30
+ try {
31
+ fileStat = await stat(absolutePath);
32
+ }
33
+ catch {
34
+ throw new FrameyardError("ASSET_NOT_FOUND", `Transcript source does not exist: ${clip.src}`);
35
+ }
36
+ if (!fileStat.isFile()) {
37
+ throw new FrameyardError("ASSET_NOT_FOUND", `Transcript source is not a file: ${clip.src}`);
38
+ }
39
+ let parsed;
40
+ try {
41
+ parsed = JSON.parse(await readFile(absolutePath, "utf8"));
42
+ }
43
+ catch (error) {
44
+ throw transcriptError(clip.src, error);
45
+ }
46
+ let transcript;
47
+ try {
48
+ transcript = parseTranscript(parsed, { requireWords: clip.words });
49
+ }
50
+ catch (error) {
51
+ throw transcriptError(clip.src, error);
52
+ }
53
+ if (transcript.text.trim().length === 0) {
54
+ warnings.push(`Transcript "${clip.src}" has no text.`);
55
+ }
56
+ if (transcript.segments.length === 0) {
57
+ warnings.push(`Transcript "${clip.src}" has no timed segments.`);
58
+ }
59
+ assets.push({
60
+ clip,
61
+ path: absolutePath,
62
+ bytes: fileStat.size,
63
+ transcript,
64
+ });
65
+ }
66
+ return {
67
+ assets,
68
+ clips: assets.map((asset) => {
69
+ const clip = {
70
+ src: asset.clip.src,
71
+ segments: asset.transcript.segments.length,
72
+ durationMs: asset.transcript.segments.at(-1)?.endMs ?? asset.transcript.words?.at(-1)?.endMs ?? 0,
73
+ bytes: asset.bytes,
74
+ };
75
+ if (asset.transcript.language !== undefined) {
76
+ clip.language = asset.transcript.language;
77
+ }
78
+ if (asset.transcript.words !== undefined) {
79
+ clip.words = asset.transcript.words.length;
80
+ }
81
+ return clip;
82
+ }),
83
+ warnings,
84
+ };
85
+ }
86
+ //# sourceMappingURL=transcripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcripts.js","sourceRoot":"","sources":["../../src/renderer/transcripts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Converts an integer frame number to milliseconds from the start of the composition. */
2
+ export declare function frameToMilliseconds(frame: number, fps: number): number;
3
+ /** Converts an integer frame number to seconds from the start of the composition. */
4
+ export declare function frameToSeconds(frame: number, fps: number): number;
5
+ //# sourceMappingURL=clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/runtime/clock.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQtE;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,16 @@
1
+ import { FrameyardError } from "../errors.js";
2
+ /** Converts an integer frame number to milliseconds from the start of the composition. */
3
+ export function frameToMilliseconds(frame, fps) {
4
+ if (!Number.isInteger(frame) || frame < 0) {
5
+ throw new FrameyardError("FRAME_OUT_OF_RANGE", `Frame must be a non-negative integer; received ${frame}.`);
6
+ }
7
+ if (!Number.isFinite(fps) || fps <= 0) {
8
+ throw new FrameyardError("COMPOSITION_INVALID", `Frame rate must be a positive finite number; received ${fps}.`);
9
+ }
10
+ return (frame * 1000) / fps;
11
+ }
12
+ /** Converts an integer frame number to seconds from the start of the composition. */
13
+ export function frameToSeconds(frame, fps) {
14
+ return frameToMilliseconds(frame, fps) / 1000;
15
+ }
16
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/runtime/clock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,GAAW;IAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,kDAAkD,KAAK,GAAG,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CAAC,qBAAqB,EAAE,yDAAyD,GAAG,GAAG,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AAC9B,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW;IACvD,OAAO,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type Composition, type Props, type ResolvedAudioClip, type ResolvedTranscriptClip } from "../contracts.js";
2
+ export { frameToMilliseconds, frameToSeconds } from "./clock.js";
3
+ export { random } from "./random.js";
4
+ export interface CreateRuntimeOptions<P extends Props = Props> {
5
+ composition: Composition<P> | unknown;
6
+ container: HTMLElement;
7
+ /** JSON prop overrides merged over the composition's defaultProps. */
8
+ props?: unknown;
9
+ /** Development-only callback for best-effort diagnostics about forbidden clocks and randomness. */
10
+ diagnostics?: (warning: string) => void;
11
+ }
12
+ export interface CompositionRuntime<P extends Props = Props> {
13
+ readonly composition: Composition<P>;
14
+ readonly props: Readonly<P>;
15
+ readonly audioClips: readonly ResolvedAudioClip[];
16
+ readonly transcriptClips: readonly ResolvedTranscriptClip[];
17
+ readonly frame: number;
18
+ seek(frame: number): void;
19
+ dispose(): Promise<void>;
20
+ }
21
+ /** Imports a composition module through the preview server and normalizes its default export. */
22
+ export declare function loadCompositionModule(url: string): Promise<Composition>;
23
+ /**
24
+ * Mounts a composition and returns a seekable runtime. Mounting and asset
25
+ * loading complete before this promise resolves; every subsequent seek is
26
+ * synchronous and independent of previously visited frames.
27
+ */
28
+ export declare function createCompositionRuntime<P extends Props = Props>(options: CreateRuntimeOptions<P>): Promise<CompositionRuntime<P>>;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC3D,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACtC,SAAS,EAAE,WAAW,CAAC;IACvB,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mGAAmG;IACnG,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAkND,iGAAiG;AACjG,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB7E;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EACpE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CA2GhC"}