@kheleshikhi/studio-agent 0.6.1 → 0.9.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.
@@ -0,0 +1,381 @@
1
+ /**
2
+ * The episode runner: validate -> resolve each shot's identity -> key ->
3
+ * reuse or render -> verify -> assemble -> QC. See episode.ts for the
4
+ * contract. Rendering and identity resolution are injected, so the runner is
5
+ * the same for the CLI (daemon render jobs, real Chrome) and for tests
6
+ * (synthetic shots), and resume-after-failure is a property of the cache,
7
+ * not of a separate code path.
8
+ */
9
+ import { spawn } from "node:child_process";
10
+ import { createHash, randomBytes } from "node:crypto";
11
+ import { access, copyFile, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
12
+ import path from "node:path";
13
+ import { CliError } from "./types.js";
14
+ import { anchoredSeconds, assemblyKey, checkCachedShot, concatArguments, concatList, copyVideoArguments, crossfadeArguments, encoderSettings, EPISODE_MANIFEST_KIND, episodeCues, episodeMixArguments, episodeTimeline, loudnessApplyArguments, loudnessMeasureArguments, loudnessCorrectionArguments, loudnormRange, muxArguments, nearestOnset, onsets, parseEbur128, parseLoudnorm, qcChecks, SHOT_CACHE_KIND, shotCacheKey, shotRecipe, toSrt, videoSegments, } from "./episode.js";
15
+ import { MIX_SAMPLE_RATE } from "./video.js";
16
+ function execute(command, args) {
17
+ return new Promise((resolve, reject) => {
18
+ const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
19
+ let stdout = "";
20
+ let stderr = "";
21
+ child.stdout.on("data", (chunk) => { stdout += chunk; if (stdout.length > 4_000_000)
22
+ stdout = stdout.slice(-2_000_000); });
23
+ child.stderr.on("data", (chunk) => { stderr += chunk; if (stderr.length > 4_000_000)
24
+ stderr = stderr.slice(-2_000_000); });
25
+ child.on("error", reject);
26
+ child.on("close", (code) => resolve({ code: code ?? 1, stdout, stderr }));
27
+ });
28
+ }
29
+ async function ffmpeg(encoder, args, stage) {
30
+ const result = await execute(encoder.ffmpeg, args);
31
+ if (result.code !== 0)
32
+ throw new CliError(`FFmpeg failed at ${stage}.`, "EPISODE_ASSEMBLY_FAILED", 1, { stage, stderr: result.stderr.slice(-1500) });
33
+ return result;
34
+ }
35
+ export async function sha256File(file) {
36
+ try {
37
+ return createHash("sha256").update(await readFile(file)).digest("hex");
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ /** Count frames and read both streams' start and duration. */
44
+ export async function probeEpisodeFile(encoder, file) {
45
+ const result = await execute(encoder.ffprobe, ["-v", "error", "-count_frames", "-show_streams", "-show_format", "-of", "json", file]);
46
+ if (result.code !== 0)
47
+ return null;
48
+ try {
49
+ const document = JSON.parse(result.stdout);
50
+ const video = document.streams.find((stream) => stream.codec_type === "video");
51
+ const audio = document.streams.find((stream) => stream.codec_type === "audio");
52
+ if (!video)
53
+ return null;
54
+ const num = (value) => value === undefined || value === null || value === "N/A" ? null : Number(value);
55
+ return {
56
+ frames: Number(video.nb_read_frames ?? video.nb_frames), width: Number(video.width), height: Number(video.height),
57
+ video_codec: String(video.codec_name), audio_codec: audio ? String(audio.codec_name) : null, duration: Number(document.format.duration),
58
+ video_duration: num(video.duration), audio_duration: audio ? num(audio.duration) : null,
59
+ video_start: num(video.start_time), audio_start: audio ? num(audio.start_time) : null, pix_fmt: String(video.pix_fmt),
60
+ };
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ async function readJson(file) {
67
+ try {
68
+ return JSON.parse(await readFile(file, "utf8"));
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ async function exists(file) {
75
+ return access(file).then(() => true, () => false);
76
+ }
77
+ /** Resolve, key and check every shot against the cache. No rendering. */
78
+ export async function planEpisode(options) {
79
+ const { episode, deps } = options;
80
+ const timeline = episodeTimeline(episode);
81
+ const encoder = encoderSettings(episode, deps.encoder.version);
82
+ const shots = [];
83
+ for (const [index, shot] of episode.shots.entries()) {
84
+ const resolved = await deps.resolveShot(shot);
85
+ const recipe = shotRecipe(episode, shot);
86
+ const inputs = {
87
+ subject: shot.subject, recipe,
88
+ sources: resolved.sources, dependency_digests: resolved.dependency_digests,
89
+ runtime_fingerprint: deps.runtimeFingerprint, audio_sha256: resolved.audio_sha256,
90
+ profile: { profile: episode.output.profile, width: episode.output.width, height: episode.output.height, fps: episode.output.fps },
91
+ encoder,
92
+ };
93
+ const key = shotCacheKey(inputs);
94
+ const timing = timeline.shots[index];
95
+ const directory = path.join(options.cache, key);
96
+ const record = await readJson(path.join(directory, "shot.json"));
97
+ let cache = "missing";
98
+ let reason;
99
+ if (record) {
100
+ const video = path.join(directory, "video.mp4");
101
+ const digest = await sha256File(video);
102
+ const probed = digest ? await probeEpisodeFile(deps.encoder, video) : null;
103
+ const check = checkCachedShot(record, key, timing.frames, digest, probed?.frames ?? null);
104
+ cache = check.valid ? "valid" : "invalid";
105
+ if (!check.valid)
106
+ reason = check.reason;
107
+ }
108
+ shots.push({ id: shot.id, index, subject: shot.subject, key, frames: timing.frames, offset_seconds: timing.offset_seconds,
109
+ duration_seconds: timing.duration_seconds, cache, ...(reason ? { cache_reason: reason } : {}), inputs, identity: { ...resolved.identity } });
110
+ // Keep the renderer's data for this run only (never written out).
111
+ resolvedForRender.set(`${options.out}\0${shot.id}`, resolved);
112
+ }
113
+ return { shots, timeline };
114
+ }
115
+ const resolvedForRender = new Map();
116
+ async function renderOne(options, plan, shot) {
117
+ const { deps } = options;
118
+ const resolved = resolvedForRender.get(`${options.out}\0${shot.id}`);
119
+ if (!resolved)
120
+ throw new CliError(`Shot ${shot.id} was not planned.`, "EPISODE_INTERNAL", 1);
121
+ const destination = path.join(options.cache, `.partial-${plan.key.slice(0, 16)}-${randomBytes(4).toString("hex")}`);
122
+ await mkdir(destination, { recursive: true });
123
+ const started = Date.now();
124
+ try {
125
+ deps.log?.(`shot ${shot.id}: rendering ${plan.frames} frames (key ${plan.key.slice(0, 12)})`);
126
+ const rendered = await deps.renderShot(shot, plan.inputs.recipe, resolved, destination);
127
+ // Verify before the shot enters the cache: frames, size, codecs, audio.
128
+ const probed = await probeEpisodeFile(deps.encoder, rendered.output);
129
+ if (!probed || probed.frames !== plan.frames || probed.width !== plan.inputs.profile.width || probed.height !== plan.inputs.profile.height ||
130
+ probed.video_codec !== "h264" || probed.audio_codec !== "aac") {
131
+ throw new CliError(`Shot ${shot.id} did not verify: ${JSON.stringify(probed)}`, "EPISODE_SHOT_VERIFY_FAILED", 1, { stage: "verify", probe: probed });
132
+ }
133
+ const final = path.join(options.cache, plan.key);
134
+ const video = path.join(destination, "video.mp4");
135
+ if (path.resolve(rendered.output) !== path.resolve(video))
136
+ await copyFile(rendered.output, video);
137
+ if (path.resolve(rendered.manifest) !== path.resolve(path.join(destination, "render.json")))
138
+ await copyFile(rendered.manifest, path.join(destination, "render.json"));
139
+ const digest = await sha256File(video);
140
+ const record = {
141
+ kind: SHOT_CACHE_KIND, key: plan.key, shot: shot.id, inputs: plan.inputs, video_sha256: digest, frames: probed.frames,
142
+ bytes: (await stat(video)).size, created_at: new Date().toISOString(), canonical: false,
143
+ };
144
+ await writeFile(path.join(destination, "shot.json"), `${JSON.stringify(record, null, 2)}\n`);
145
+ for (const leftover of ["frames", "audio", "audio-mix.wav", "mounted.png"])
146
+ await rm(path.join(destination, leftover), { recursive: true, force: true });
147
+ await rm(final, { recursive: true, force: true });
148
+ await rename(destination, final);
149
+ return { ...plan, state: "rendered", video: path.join(final, "video.mp4"), render_json: path.join(final, "render.json"),
150
+ video_sha256: digest, render_seconds: (Date.now() - started) / 1000 };
151
+ }
152
+ catch (error) {
153
+ await rm(destination, { recursive: true, force: true }).catch(() => undefined);
154
+ const failure = error instanceof CliError ? error : new CliError(String(error), "EPISODE_SHOT_FAILED");
155
+ const details = failure.details && typeof failure.details === "object" ? failure.details : {};
156
+ return { ...plan, state: "failed", render_seconds: (Date.now() - started) / 1000,
157
+ error: { code: failure.code, message: failure.message, stage: typeof details.stage === "string" ? details.stage : "render" } };
158
+ }
159
+ }
160
+ async function writeState(options, shots, assembly) {
161
+ const file = path.join(options.out, "episode-state.json");
162
+ await mkdir(options.out, { recursive: true });
163
+ await writeFile(file, `${JSON.stringify({
164
+ kind: "kheleshikhi.episode-state.v1", episode: options.episode.id, updated_at: new Date().toISOString(), cache: options.cache,
165
+ shots: shots.map((shot) => ({ id: shot.id, key: shot.key, state: shot.state, ...(shot.error ? { error: shot.error } : {}) })),
166
+ assembly,
167
+ }, null, 2)}\n`);
168
+ return file;
169
+ }
170
+ /**
171
+ * Render (or reuse) every shot, then assemble. A failed shot stops new
172
+ * renders; shots already rendered stay in the cache, so a retry reuses them
173
+ * and starts at the failed shot.
174
+ */
175
+ export async function renderEpisode(options) {
176
+ const { episode, deps } = options;
177
+ const started = Date.now();
178
+ await mkdir(options.cache, { recursive: true });
179
+ await mkdir(options.out, { recursive: true });
180
+ const audioFiles = await episodeAudioFiles(options);
181
+ const planned = await planEpisode(options);
182
+ const planSeconds = (Date.now() - started) / 1000;
183
+ const outcomes = planned.shots.map((plan) => plan.cache === "valid"
184
+ ? { ...plan, state: "reused", video: path.join(options.cache, plan.key, "video.mp4"), render_json: path.join(options.cache, plan.key, "render.json") }
185
+ : { ...plan, state: "not_started" });
186
+ for (const outcome of outcomes)
187
+ if (outcome.state === "reused")
188
+ deps.log?.(`shot ${outcome.id}: reused ${outcome.key.slice(0, 12)}`);
189
+ const pending = outcomes.filter((outcome) => outcome.state === "not_started").map((outcome) => outcome.index);
190
+ const renderStarted = Date.now();
191
+ let failed = false;
192
+ let cursor = 0;
193
+ const worker = async () => {
194
+ while (!failed && cursor < pending.length) {
195
+ const index = pending[cursor++];
196
+ const outcome = await renderOne(options, outcomes[index], episode.shots[index]);
197
+ outcomes[index] = outcome;
198
+ if (outcome.state === "failed")
199
+ failed = true;
200
+ await writeState(options, outcomes, { state: "waiting" });
201
+ }
202
+ };
203
+ await Promise.all(Array.from({ length: Math.max(1, Math.min(options.workers, pending.length || 1)) }, worker));
204
+ const renderSeconds = (Date.now() - renderStarted) / 1000;
205
+ const manifestPath = path.join(options.out, "episode.json");
206
+ const failures = outcomes.filter((outcome) => outcome.state === "failed");
207
+ if (failures.length) {
208
+ const state = await writeState(options, outcomes, { state: "not_started", reason: "a shot failed" });
209
+ const first = failures[0];
210
+ throw new CliError(`Shot ${first.id} failed at ${first.error.stage}: ${first.error.message}`, "EPISODE_SHOT_FAILED", 1, {
211
+ shot: first.id, stage: first.error.stage, code: first.error.code, state,
212
+ reusable: outcomes.filter((outcome) => outcome.state === "reused" || outcome.state === "rendered").map((outcome) => outcome.id),
213
+ not_started: outcomes.filter((outcome) => outcome.state === "not_started").map((outcome) => outcome.id),
214
+ retry: "Run the same command again: valid shots are reused and rendering resumes at the failed shot.",
215
+ });
216
+ }
217
+ const assemblyStarted = Date.now();
218
+ const assembled = await assemble(options, outcomes, planned.timeline, audioFiles);
219
+ const assemblySeconds = (Date.now() - assemblyStarted) / 1000;
220
+ const timings = { plan_seconds: planSeconds, render_seconds: renderSeconds, assembly_seconds: assemblySeconds, total_seconds: (Date.now() - started) / 1000 };
221
+ const manifest = {
222
+ kind: EPISODE_MANIFEST_KIND, canonical: false, certification_evidence: false,
223
+ note: "A presentation derivative assembled from shot renders. Scenes, Experiences and Components stay the authority; nothing here changes or certifies them.",
224
+ episode: { id: episode.id, title: episode.title, context: episode.context, output: episode.output },
225
+ total_frames: planned.timeline.total_frames, total_seconds: planned.timeline.total_seconds,
226
+ shots: outcomes.map((outcome) => ({
227
+ id: outcome.id, subject: outcome.subject, key: outcome.key, cache: outcome.state, frames: outcome.frames,
228
+ offset_seconds: outcome.offset_seconds, duration_seconds: outcome.duration_seconds, video_sha256: outcome.video_sha256 ?? null,
229
+ render_json: outcome.render_json, render_seconds: outcome.render_seconds ?? null, inputs: outcome.inputs, identity: outcome.identity,
230
+ })),
231
+ audio: Object.fromEntries([...audioFiles].map(([id, file]) => [id, { file: path.relative(options.out, file.path), sha256: file.sha256 }])),
232
+ ...assembled.manifest,
233
+ timings,
234
+ rendered_at: new Date().toISOString(),
235
+ };
236
+ await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
237
+ await writeFile(path.join(options.out, "qc.json"), `${JSON.stringify({ kind: "kheleshikhi.episode-qc.v1", episode: episode.id, output_sha256: assembled.sha256, checks: assembled.qc }, null, 2)}\n`);
238
+ const state = await writeState(options, outcomes, { state: assembled.qc.every((check) => check.pass) ? "completed" : "qc_failed", output: assembled.output, sha256: assembled.sha256 });
239
+ return {
240
+ ok: assembled.qc.every((check) => check.pass), output: assembled.output, srt: assembled.srt, manifest: manifestPath, state,
241
+ shots: outcomes, reused: outcomes.filter((item) => item.state === "reused").length,
242
+ rendered: outcomes.filter((item) => item.state === "rendered").length, failed: 0, qc: assembled.qc, timings,
243
+ };
244
+ }
245
+ /** Every episode audio file, resolved and hashed (narration, music, effects). */
246
+ export async function episodeAudioFiles(options) {
247
+ const files = new Map();
248
+ for (const item of [...options.episode.audio.narration, ...options.episode.audio.music, ...options.episode.audio.sfx]) {
249
+ const file = path.resolve(options.baseDirectory, item.file);
250
+ const digest = await sha256File(file);
251
+ if (!digest)
252
+ throw new CliError(`Audio ${item.id} is missing: ${file}`, "EPISODE_AUDIO_MISSING", 2, { id: item.id, file });
253
+ files.set(item.id, { path: file, sha256: digest });
254
+ }
255
+ return files;
256
+ }
257
+ async function assemble(options, shots, timeline, audioFiles) {
258
+ const { episode, deps } = options;
259
+ const { encoder } = deps;
260
+ const work = path.join(options.out, "work");
261
+ await rm(work, { recursive: true, force: true });
262
+ await mkdir(work, { recursive: true });
263
+ const total = timeline.total_frames;
264
+ const totalSamples = Math.round((total * MIX_SAMPLE_RATE) / episode.output.fps);
265
+ const key = assemblyKey(episode, shots.map((shot) => shot.key), Object.fromEntries([...audioFiles].map(([id, file]) => [id, file.sha256])));
266
+ const output = path.join(options.out, `${episode.id}.mp4`);
267
+ const srtPath = path.join(options.out, `${episode.id}.srt`);
268
+ const steps = {};
269
+ const stepTimes = {};
270
+ const timed = async (name, args) => {
271
+ const begin = Date.now();
272
+ steps[name] = args.map((value) => value.startsWith(options.out) ? path.relative(options.out, value) : value);
273
+ const result = await ffmpeg(encoder, args, name);
274
+ stepTimes[name] = (stepTimes[name] ?? 0) + (Date.now() - begin) / 1000;
275
+ return result;
276
+ };
277
+ // 1. Picture: copy every shot outside a crossfade run; re-encode only the runs.
278
+ const segments = videoSegments(episode);
279
+ const segmentFiles = [];
280
+ for (const [position, segment] of segments.entries()) {
281
+ if (segment.kind === "copy") {
282
+ for (const index of segment.shots) {
283
+ const file = path.join(work, `shot-${String(index).padStart(3, "0")}.mp4`);
284
+ await timed(`copy_${shots[index].id}`, copyVideoArguments(shots[index].video, file));
285
+ segmentFiles.push(file);
286
+ }
287
+ }
288
+ else {
289
+ const file = path.join(work, `crossfade-${String(position).padStart(3, "0")}.mp4`);
290
+ await timed(`crossfade_${segment.shots.map((index) => shots[index].id).join("_")}`, crossfadeArguments(episode, timeline, segment.shots, segment.shots.map((index) => shots[index].video), file));
291
+ segmentFiles.push(file);
292
+ }
293
+ }
294
+ const list = path.join(work, "concat.txt");
295
+ await writeFile(list, concatList(segmentFiles));
296
+ const picture = path.join(work, "picture.mp4");
297
+ await timed("concat", concatArguments(list, picture, total));
298
+ // 2. One episode audio mix: shot sounds + effects, narration, ducked music.
299
+ const shotInputs = [];
300
+ episode.shots.forEach((shot, index) => {
301
+ if (shot.audio !== "scene" || shot.sound_volume === 0)
302
+ return;
303
+ const timing = timeline.shots[index];
304
+ const next = timeline.shots[index + 1];
305
+ shotInputs.push({ file: shots[index].video, at_seconds: timing.offset_seconds, volume: shot.sound_volume, length_seconds: timing.duration_seconds,
306
+ ...(timing.overlap_frames ? { fade_in: timing.overlap_frames / episode.output.fps } : {}),
307
+ ...(next?.overlap_frames ? { fade_out: next.overlap_frames / episode.output.fps } : {}) });
308
+ });
309
+ for (const item of episode.audio.sfx) {
310
+ shotInputs.push({ file: audioFiles.get(item.id).path, at_seconds: anchoredSeconds(timeline, item.at, item.shot), volume: item.volume, length_seconds: null });
311
+ }
312
+ const narration = episode.audio.narration.map((item) => ({
313
+ file: audioFiles.get(item.id).path, at_seconds: anchoredSeconds(timeline, item.at, item.shot), volume: item.volume, length_seconds: null,
314
+ }));
315
+ const music = episode.audio.music.map((item) => {
316
+ const at = anchoredSeconds(timeline, item.at, item.shot);
317
+ const end = Math.min(item.end ?? timeline.total_seconds, timeline.total_seconds);
318
+ return { file: audioFiles.get(item.id).path, at_seconds: at, volume: item.volume, loop: item.loop, length_seconds: Math.max(0, end - at), duck: item.duck };
319
+ });
320
+ const mixFile = path.join(work, "mix.wav");
321
+ const narrationFile = path.join(work, "narration.wav");
322
+ await timed("mix", episodeMixArguments({ shots: shotInputs, narration, music, total_samples: totalSamples, output: mixFile,
323
+ ...(narration.length ? { narrationOutput: narrationFile } : {}) }));
324
+ // 3. Two-pass loudness normalisation to the target, exact sample count.
325
+ const target = episode.output.loudness;
326
+ const measuredRun = await execute(encoder.ffmpeg, loudnessMeasureArguments(mixFile, target));
327
+ const measured = parseLoudnorm(measuredRun.stderr);
328
+ let normalised = path.join(work, "episode-audio.wav");
329
+ await timed("loudnorm", loudnessApplyArguments(mixFile, target, measured, totalSamples, normalised));
330
+ const afterNormalisation = parseEbur128((await execute(encoder.ffmpeg, ["-hide_banner", "-nostats", "-i", normalised, "-af", "ebur128=peak=true", "-f", "null", "-"])).stderr);
331
+ const correctionArgs = loudnessCorrectionArguments(normalised, target, afterNormalisation.integrated, totalSamples, path.join(work, "episode-audio-corrected.wav"));
332
+ if (correctionArgs) {
333
+ await timed("loudness_correction", correctionArgs);
334
+ normalised = path.join(work, "episode-audio-corrected.wav");
335
+ }
336
+ // 4. Mux: picture copied, audio encoded once.
337
+ const partial = path.join(options.out, `${episode.id}.partial.mp4`);
338
+ await timed("mux", muxArguments(picture, normalised, episode, total, partial));
339
+ // 5. Subtitles from the manifest.
340
+ const cues = episodeCues(episode, timeline);
341
+ await writeFile(srtPath, toSrt(cues));
342
+ // 6. QC on the final file.
343
+ const probed = await probeEpisodeFile(encoder, partial);
344
+ if (!probed)
345
+ throw new CliError("The assembled episode does not probe.", "EPISODE_ASSEMBLY_FAILED", 1, { stage: "qc" });
346
+ const ebur = await execute(encoder.ffmpeg, ["-hide_banner", "-nostats", "-i", partial, "-map", "0:a:0", "-af", "ebur128=peak=true", "-f", "null", "-"]);
347
+ const loudness = parseEbur128(ebur.stderr);
348
+ let narrationOnsets = [];
349
+ if (narration.length) {
350
+ const silence = await execute(encoder.ffmpeg, ["-hide_banner", "-nostats", "-i", narrationFile, "-af", "silencedetect=noise=-45dB:d=0.05", "-f", "null", "-"]);
351
+ const found = onsets(silence.stderr);
352
+ narrationOnsets = episode.audio.narration.map((item) => {
353
+ const expected = anchoredSeconds(timeline, item.at, item.shot);
354
+ return { id: item.id, expected, observed: nearestOnset(found, expected) };
355
+ });
356
+ }
357
+ const qc = qcChecks({ expected_frames: total, fps: episode.output.fps, width: episode.output.width, height: episode.output.height,
358
+ probe: probed, loudness, target, narration_onsets: narrationOnsets });
359
+ await rename(partial, output);
360
+ const sha256 = await sha256File(output);
361
+ const bytes = (await stat(output)).size;
362
+ if (!(await exists(output)))
363
+ throw new CliError("The assembled episode vanished.", "EPISODE_ASSEMBLY_FAILED", 1);
364
+ await rm(work, { recursive: true, force: true });
365
+ return {
366
+ output, srt: srtPath, sha256: sha256, qc,
367
+ manifest: {
368
+ assembly_key: key,
369
+ output: { file: path.basename(output), sha256, bytes, probe: probed },
370
+ subtitles: { file: path.basename(srtPath), cues },
371
+ segments: segments.map((segment) => ({ kind: segment.kind, shots: segment.shots.map((index) => shots[index].id) })),
372
+ loudness: { target, measured_before: measured, lra_used: loudnormRange(target, measured), after_loudnorm: afterNormalisation,
373
+ corrected: correctionArgs !== null, final: loudness,
374
+ method: "two-pass loudnorm (measure, then linear normalisation with the measured values; LRA widened to the mix's own range so it stays linear), then a gain-plus-limiter correction only if still > 0.5 LU off" },
375
+ narration_onsets: narrationOnsets,
376
+ ffmpeg: { version: encoder.version, steps, step_seconds: stepTimes },
377
+ qc,
378
+ },
379
+ };
380
+ }
381
+ //# sourceMappingURL=episode-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-runner.js","sourceRoot":"","sources":["../src/episode-runner.ts"],"names":[],"mappings":"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"}