@kheleshikhi/studio-agent 0.6.1 → 0.8.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.
package/dist/video.js ADDED
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Presentation video: one render recipe, one local deterministic renderer.
3
+ *
4
+ * A video is a derivative of a Scene or an Experience, never its content.
5
+ * The renderer opens the Studio's presentation host (`studio_present=1`: the
6
+ * real learner runtime, camera and clocks, with no Studio chrome, filling a
7
+ * browser viewport of exactly the output size at device scale 1), steps
8
+ * video time to each frame's exact second, captures the whole viewport, and
9
+ * proves every PNG is the output size before encoding. Sound is never
10
+ * recorded from a speaker: the runtime logs every play and stop at its video
11
+ * time without sounding it, and FFmpeg mixes the canonical encoded assets
12
+ * (trimmed to their offsets, looped, delayed and scaled exactly as logged)
13
+ * into the AAC track. Nothing here is canonical: the MP4 is never
14
+ * certification evidence and never part of a KSPKG.
15
+ *
16
+ * Determinism boundary: frame k is captured at exactly `start + k / fps`
17
+ * seconds of video time, scheduled learner actions happen at their declared
18
+ * seconds, and every sound is placed at its logged millisecond, so two
19
+ * renders of one source and recipe show and sound the same instants. Pixels
20
+ * still depend on the browser and GPU that painted them; `render.json`
21
+ * records each frame's SHA-256 so two renders can be compared.
22
+ */
23
+ import { spawn } from "node:child_process";
24
+ import { createHash } from "node:crypto";
25
+ import { CliError } from "./types.js";
26
+ export const RECIPE_KIND = "kheleshikhi.video-render-recipe.v1";
27
+ export const RENDER_KIND = "kheleshikhi.video-render.v1";
28
+ /** Learner actions a recipe may schedule, per subject. */
29
+ export const RENDER_OPS = {
30
+ scene: ["press", "fire", "set", "pause", "play"],
31
+ experience: ["press", "fire", "fireSceneEvent", "fireCue", "pause", "play"],
32
+ };
33
+ const UNTARGETED = new Set(["pause", "play"]);
34
+ /** The native output sizes: the presentation host renders at exactly these. */
35
+ export const RENDER_PROFILES = {
36
+ "landscape-720p": { width: 1280, height: 720 },
37
+ "landscape-1080p": { width: 1920, height: 1080 },
38
+ "portrait-720p": { width: 720, height: 1280 },
39
+ "portrait-1080p": { width: 1080, height: 1920 },
40
+ };
41
+ export const RECIPE_LIMITS = { maxSeconds: 120, maxFps: 60, maxFrames: 3600, maxActions: 64 };
42
+ const IDENTIFIER = /^[A-Za-z][A-Za-z0-9_-]{0,79}$/;
43
+ function invalid(message) {
44
+ throw new CliError(message, "VIDEO_RECIPE_INVALID", 2);
45
+ }
46
+ function finite(value, name, minimum, maximum) {
47
+ if (typeof value !== "number" || !Number.isFinite(value) || value < minimum || value > maximum) {
48
+ invalid(`${name} must be a number from ${minimum} to ${maximum}.`);
49
+ }
50
+ return value;
51
+ }
52
+ /** Parse and bound a render recipe. Unknown fields are refused, never ignored. */
53
+ export function parseRecipe(value, subject = "scene") {
54
+ if (!value || typeof value !== "object" || Array.isArray(value))
55
+ invalid("Recipe must be an object.");
56
+ const document = value;
57
+ const allowed = new Set(["kind", "fps", "start", "end", "profile", "width", "height", "audio", "actions", "crf"]);
58
+ const unknown = Object.keys(document).filter((key) => !allowed.has(key));
59
+ if (unknown.length)
60
+ invalid(`Recipe has unknown fields: ${unknown.sort().join(", ")}.`);
61
+ if (document.kind !== RECIPE_KIND)
62
+ invalid(`Recipe kind must be ${RECIPE_KIND}.`);
63
+ const fps = finite(document.fps ?? 30, "fps", 1, RECIPE_LIMITS.maxFps);
64
+ if (!Number.isInteger(fps))
65
+ invalid("fps must be a whole number.");
66
+ const start = finite(document.start ?? 0, "start", 0, 3600);
67
+ const end = finite(document.end, "end", start + 1e-6, start + RECIPE_LIMITS.maxSeconds);
68
+ const frames = frameCountFor(start, end, fps);
69
+ if (frames > RECIPE_LIMITS.maxFrames)
70
+ invalid(`A render is at most ${RECIPE_LIMITS.maxFrames} frames.`);
71
+ // A size is a profile: the host renders natively at it, so there is no
72
+ // free-form size that would need scaling after capture.
73
+ const profiles = Object.entries(RENDER_PROFILES);
74
+ let profile;
75
+ if (document.profile !== undefined) {
76
+ if (typeof document.profile !== "string" || !Object.hasOwn(RENDER_PROFILES, document.profile)) {
77
+ invalid(`profile must be one of ${Object.keys(RENDER_PROFILES).join(", ")}.`);
78
+ }
79
+ profile = document.profile;
80
+ const size = RENDER_PROFILES[profile];
81
+ if ((document.width !== undefined && document.width !== size.width) ||
82
+ (document.height !== undefined && document.height !== size.height)) {
83
+ invalid(`width and height must match the ${profile} profile (${size.width}x${size.height}).`);
84
+ }
85
+ }
86
+ else if (document.width === undefined && document.height === undefined) {
87
+ profile = "landscape-720p";
88
+ }
89
+ else {
90
+ const match = profiles.find(([, size]) => size.width === document.width && size.height === document.height);
91
+ if (!match)
92
+ invalid(`width x height must be a profile size: ${profiles.map(([, size]) => `${size.width}x${size.height}`).join(", ")}.`);
93
+ profile = match[0];
94
+ }
95
+ const { width, height } = RENDER_PROFILES[profile];
96
+ const audio = document.audio ?? "scene";
97
+ if (audio !== "silent" && audio !== "scene")
98
+ invalid("audio must be scene or silent.");
99
+ const crf = finite(document.crf ?? 18, "crf", 0, 51);
100
+ const rawActions = document.actions ?? [];
101
+ if (!Array.isArray(rawActions) || rawActions.length > RECIPE_LIMITS.maxActions) {
102
+ invalid(`actions must be a list of at most ${RECIPE_LIMITS.maxActions}.`);
103
+ }
104
+ const ops = RENDER_OPS[subject];
105
+ let previous = -1;
106
+ const actions = rawActions.map((raw, index) => {
107
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
108
+ invalid(`actions[${index}] must be an object.`);
109
+ const item = raw;
110
+ const extra = Object.keys(item).filter((key) => !["at", "op", "target", "value"].includes(key));
111
+ if (extra.length)
112
+ invalid(`actions[${index}] has unknown fields: ${extra.sort().join(", ")}.`);
113
+ const at = finite(item.at, `actions[${index}].at`, start, end);
114
+ if (at < previous)
115
+ invalid("actions must be in time order.");
116
+ previous = at;
117
+ if (typeof item.op !== "string" || !ops.includes(item.op))
118
+ invalid(`actions[${index}].op must be ${ops.join(", ")}.`);
119
+ if (UNTARGETED.has(item.op)) {
120
+ if (item.target !== undefined || item.value !== undefined)
121
+ invalid(`actions[${index}] ${item.op} takes no target.`);
122
+ return { at, op: item.op };
123
+ }
124
+ if (typeof item.target !== "string" || !IDENTIFIER.test(item.target))
125
+ invalid(`actions[${index}].target must be a semantic id.`);
126
+ if (item.op === "set" && !["number", "boolean", "string"].includes(typeof item.value))
127
+ invalid(`actions[${index}] set needs a value.`);
128
+ if (item.op !== "set" && item.value !== undefined)
129
+ invalid(`actions[${index}] ${item.op} takes no value.`);
130
+ return { at, op: item.op, target: item.target, ...(item.value !== undefined ? { value: item.value } : {}) };
131
+ });
132
+ return { kind: RECIPE_KIND, fps, start, end, profile, width, height, audio, actions, crf };
133
+ }
134
+ /** Width and height of a PNG, from its IHDR chunk; refuses anything else. */
135
+ export function pngSize(data) {
136
+ const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
137
+ if (data.length < 24 || signature.some((byte, index) => data[index] !== byte) ||
138
+ String.fromCharCode(...data.subarray(12, 16)) !== "IHDR") {
139
+ throw new CliError("A captured frame is not a PNG.", "VIDEO_FRAME_INVALID", 1);
140
+ }
141
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
142
+ return { width: view.getUint32(16), height: view.getUint32(20) };
143
+ }
144
+ /** The exact logical second of frame `index`: computed, never accumulated. */
145
+ export function frameTime(recipe, index) {
146
+ return recipe.start + index / recipe.fps;
147
+ }
148
+ /**
149
+ * The frame grid. Frame k exists exactly when `start + k / fps < end`: the
150
+ * span is half open, so a frame at `end` is not rendered and every frame
151
+ * before it is. The count is the smallest n with `start + n / fps >= end`,
152
+ * i.e. `ceil((end - start) * fps)`, with a tolerance of a billionth of a
153
+ * frame so a decimal end that is exactly on the grid (16 s at 30 fps is
154
+ * 480.00000000000006 in binary) is not rounded up a frame.
155
+ */
156
+ export function frameCountFor(start, end, fps) {
157
+ const frames = (end - start) * fps;
158
+ const count = Math.max(0, Math.ceil(frames - 1e-9));
159
+ return count;
160
+ }
161
+ export function frameCount(recipe) {
162
+ return frameCountFor(recipe.start, recipe.end, recipe.fps);
163
+ }
164
+ /** Learner actions due after `previous` and at or before `time`. */
165
+ export function actionsBetween(recipe, previous, time) {
166
+ return recipe.actions.filter((action) => action.at > previous && action.at <= time);
167
+ }
168
+ export function sha256(data) {
169
+ return createHash("sha256").update(data).digest("hex");
170
+ }
171
+ function run(command, args) {
172
+ return new Promise((resolve, reject) => {
173
+ const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
174
+ let stdout = "";
175
+ let stderr = "";
176
+ child.stdout.on("data", (chunk) => { stdout += chunk; if (stdout.length > 1_000_000)
177
+ stdout = stdout.slice(-500_000); });
178
+ child.stderr.on("data", (chunk) => { stderr += chunk; if (stderr.length > 1_000_000)
179
+ stderr = stderr.slice(-500_000); });
180
+ child.on("error", reject);
181
+ child.on("close", (code) => resolve({ code: code ?? 1, stdout, stderr }));
182
+ });
183
+ }
184
+ /**
185
+ * FFmpeg is an explicit, local dependency: `NERDBRO_FFMPEG` (and
186
+ * `NERDBRO_FFPROBE`) or `ffmpeg`/`ffprobe` on PATH. It is never downloaded.
187
+ */
188
+ export async function findEncoder(environment = process.env) {
189
+ const ffmpeg = environment.NERDBRO_FFMPEG || "ffmpeg";
190
+ const ffprobe = environment.NERDBRO_FFPROBE || "ffprobe";
191
+ let version;
192
+ try {
193
+ version = await run(ffmpeg, ["-hide_banner", "-version"]);
194
+ }
195
+ catch {
196
+ throw new CliError("FFmpeg was not found. Install it (for example `brew install ffmpeg` or `apt install ffmpeg`) or set NERDBRO_FFMPEG to its path.", "VIDEO_FFMPEG_MISSING", 3, { ffmpeg });
197
+ }
198
+ if (version.code !== 0)
199
+ throw new CliError("FFmpeg did not run.", "VIDEO_FFMPEG_MISSING", 3, { ffmpeg, stderr: version.stderr.slice(-400) });
200
+ try {
201
+ await run(ffprobe, ["-hide_banner", "-version"]);
202
+ }
203
+ catch {
204
+ throw new CliError("ffprobe was not found next to FFmpeg; set NERDBRO_FFPROBE.", "VIDEO_FFMPEG_MISSING", 3, { ffprobe });
205
+ }
206
+ const encoders = await run(ffmpeg, ["-hide_banner", "-encoders"]);
207
+ const libx264 = /\blibx264\b/.test(encoders.stdout);
208
+ if (!libx264)
209
+ throw new CliError("This FFmpeg has no libx264 H.264 encoder.", "VIDEO_ENCODER_UNAVAILABLE", 3, { ffmpeg });
210
+ return { ffmpeg, ffprobe, version: version.stdout.split("\n")[0]?.trim() || "unknown", libx264 };
211
+ }
212
+ /**
213
+ * The FFmpeg arguments for one recipe: H.264 High, yuv420p, CFR, AAC audio,
214
+ * faststart. Frames are already the output size (proved per PNG), so the
215
+ * picture is never scaled. `audio` is the mixed track, or none for silence.
216
+ */
217
+ export function encodeArguments(recipe, frames, output, audio) {
218
+ return [
219
+ "-hide_banner", "-loglevel", "error", "-y",
220
+ "-framerate", String(recipe.fps), "-i", frames,
221
+ ...(audio ? ["-i", audio] : ["-f", "lavfi", "-i", "anullsrc=channel_layout=stereo:sample_rate=48000"]),
222
+ "-map", "0:v:0", "-map", "1:a:0", "-shortest",
223
+ "-vf", "setsar=1,format=yuv420p",
224
+ "-c:v", "libx264", "-preset", "medium", "-crf", String(recipe.crf), "-profile:v", "high",
225
+ "-pix_fmt", "yuv420p", "-r", String(recipe.fps), "-fps_mode", "cfr",
226
+ "-c:a", "aac", "-b:a", "128k",
227
+ "-movflags", "+faststart",
228
+ "-metadata", "comment=KheleShikhi presentation derivative; not canonical content",
229
+ output,
230
+ ];
231
+ }
232
+ export async function encode(encoder, recipe, frames, output, audio) {
233
+ const result = await run(encoder.ffmpeg, encodeArguments(recipe, frames, output, audio));
234
+ if (result.code !== 0)
235
+ throw new CliError("FFmpeg failed to encode the frames.", "VIDEO_ENCODE_FAILED", 1, { stderr: result.stderr.slice(-1200) });
236
+ }
237
+ export async function probe(encoder, file) {
238
+ const result = await run(encoder.ffprobe, ["-v", "error", "-count_frames", "-show_streams", "-show_format", "-of", "json", file]);
239
+ if (result.code !== 0)
240
+ throw new CliError("ffprobe could not read the video.", "VIDEO_PROBE_FAILED", 1, { stderr: result.stderr.slice(-800) });
241
+ const document = JSON.parse(result.stdout);
242
+ const video = document.streams.find((stream) => stream.codec_type === "video");
243
+ const audio = document.streams.find((stream) => stream.codec_type === "audio");
244
+ if (!video)
245
+ throw new CliError("The encoded file has no video stream.", "VIDEO_PROBE_FAILED", 1);
246
+ return {
247
+ duration: Number(document.format.duration),
248
+ frames: Number(video.nb_read_frames ?? video.nb_frames),
249
+ width: Number(video.width), height: Number(video.height),
250
+ video_codec: String(video.codec_name), audio_codec: audio ? String(audio.codec_name) : null,
251
+ pix_fmt: String(video.pix_fmt), fps: String(video.r_frame_rate),
252
+ };
253
+ }
254
+ /** Refuse an encode that does not match its recipe: frame count, size, codecs and duration. */
255
+ export function verifyProbe(recipe, result) {
256
+ const expected = frameCount(recipe);
257
+ const problems = [];
258
+ if (result.frames !== expected)
259
+ problems.push(`frames ${result.frames} ≠ ${expected}`);
260
+ if (result.width !== recipe.width || result.height !== recipe.height)
261
+ problems.push(`size ${result.width}x${result.height}`);
262
+ if (result.video_codec !== "h264")
263
+ problems.push(`video codec ${result.video_codec}`);
264
+ if (result.audio_codec !== "aac")
265
+ problems.push(`audio codec ${result.audio_codec}`);
266
+ if (Math.abs(result.duration - expected / recipe.fps) > 2 / recipe.fps + 0.05)
267
+ problems.push(`duration ${result.duration}s`);
268
+ if (problems.length)
269
+ throw new CliError(`The encoded video does not match its recipe: ${problems.join("; ")}.`, "VIDEO_VERIFY_FAILED", 1, { probe: result });
270
+ }
271
+ export const MIX_LIMITS = { maxSegments: 96, maxSources: 32 };
272
+ export function audioKey(event) {
273
+ return event.scene ? `${event.scene}/${event.id}` : event.id;
274
+ }
275
+ /**
276
+ * The logged plays and stops as segments of a video that shows video time
277
+ * [startMs, endMs): a play opens one; the next stop or play of the same
278
+ * sound (a restart) closes it, and so does the end. A sound already playing
279
+ * at `startMs` enters the video that far into its asset. Times in the
280
+ * result are relative to the video's first frame. Events are in log order,
281
+ * which is time order.
282
+ */
283
+ export function audioSegments(events, endMs, startMs = 0) {
284
+ return absoluteSegments(events, endMs).flatMap((segment) => {
285
+ const end = segment.at_ms + segment.length_ms;
286
+ if (end <= startMs)
287
+ return [];
288
+ const skipped = Math.max(0, startMs - segment.at_ms);
289
+ return [{ ...segment, at_ms: segment.at_ms + skipped - startMs, offset_ms: segment.offset_ms + skipped, length_ms: segment.length_ms - skipped }];
290
+ });
291
+ }
292
+ function absoluteSegments(events, durationMs) {
293
+ const open = new Map();
294
+ const segments = [];
295
+ const close = (key, at) => {
296
+ const segment = open.get(key);
297
+ if (!segment)
298
+ return;
299
+ open.delete(key);
300
+ segment.length_ms = Math.min(at, durationMs) - segment.at_ms;
301
+ if (segment.length_ms > 0)
302
+ segments.push(segment);
303
+ };
304
+ let previous = 0;
305
+ for (const event of events) {
306
+ if (!Number.isFinite(event.at_ms) || event.at_ms < previous) {
307
+ throw new CliError("The render audio log is out of time order.", "VIDEO_AUDIO_LOG_INVALID", 1, { event });
308
+ }
309
+ previous = event.at_ms;
310
+ const key = audioKey(event);
311
+ if (event.action === "stop") {
312
+ close(key, event.at_ms);
313
+ continue;
314
+ }
315
+ if (event.action !== "play")
316
+ continue;
317
+ close(key, event.at_ms);
318
+ if (event.at_ms >= durationMs)
319
+ continue;
320
+ const volume = event.volume ?? 1;
321
+ if (!Number.isFinite(volume) || volume < 0 || volume > 4) {
322
+ throw new CliError("A logged sound has an impossible volume.", "VIDEO_AUDIO_LOG_INVALID", 1, { event });
323
+ }
324
+ open.set(key, { key, at_ms: event.at_ms, offset_ms: Math.max(0, event.offset_ms ?? 0), length_ms: 0, loop: event.loop === true, volume });
325
+ }
326
+ for (const key of [...open.keys()])
327
+ close(key, durationMs);
328
+ if (segments.length > MIX_LIMITS.maxSegments) {
329
+ throw new CliError(`A render mixes at most ${MIX_LIMITS.maxSegments} sound segments.`, "VIDEO_AUDIO_TOO_MANY", 2, { segments: segments.length });
330
+ }
331
+ return segments.sort((a, b) => a.at_ms - b.at_ms || a.key.localeCompare(b.key));
332
+ }
333
+ const seconds = (milliseconds) => (milliseconds / 1000).toFixed(3);
334
+ /**
335
+ * FFmpeg arguments that mix [segments] from their canonical files into one
336
+ * 48 kHz stereo PCM track exactly `durationMs` long. Each segment is its own
337
+ * input (a looping sound is an endlessly looped input), trimmed from its
338
+ * offset to its length, scaled by its volume and delayed to its start;
339
+ * the segments are summed without normalisation, so a sound is as loud as
340
+ * the runtime would play it. Returns null when nothing sounded.
341
+ */
342
+ export function mixArguments(segments, files, durationMs, output) {
343
+ if (!segments.length)
344
+ return null;
345
+ const inputs = [];
346
+ const chains = [];
347
+ segments.forEach((segment, index) => {
348
+ const file = files.get(segment.key);
349
+ if (!file)
350
+ throw new CliError(`No canonical bytes for sound ${segment.key}.`, "VIDEO_AUDIO_SOURCE_MISSING", 1);
351
+ if (segment.loop)
352
+ inputs.push("-stream_loop", "-1");
353
+ inputs.push("-i", file);
354
+ chains.push(`[${index}:a]aresample=48000,aformat=sample_fmts=fltp:channel_layouts=stereo,` +
355
+ `atrim=start=${seconds(segment.offset_ms)}:duration=${seconds(segment.length_ms)},asetpts=PTS-STARTPTS,` +
356
+ `volume=${segment.volume.toFixed(4)},adelay=${Math.round(segment.at_ms)}:all=1[s${index}]`);
357
+ });
358
+ const mixed = `${segments.map((_, index) => `[s${index}]`).join("")}amix=inputs=${segments.length}:normalize=0:dropout_transition=0,` +
359
+ `apad,atrim=duration=${seconds(durationMs)}[mix]`;
360
+ return [
361
+ "-hide_banner", "-loglevel", "error", "-y",
362
+ ...inputs,
363
+ "-filter_complex", [...chains, mixed].join(";"),
364
+ "-map", "[mix]", "-ar", "48000", "-ac", "2", "-c:a", "pcm_s16le", output,
365
+ ];
366
+ }
367
+ export async function mix(encoder, segments, files, durationMs, output) {
368
+ const args = mixArguments(segments, files, durationMs, output);
369
+ if (!args)
370
+ return null;
371
+ const result = await run(encoder.ffmpeg, args);
372
+ if (result.code !== 0)
373
+ throw new CliError("FFmpeg failed to mix the sounds.", "VIDEO_AUDIO_MIX_FAILED", 1, { stderr: result.stderr.slice(-1200) });
374
+ return args;
375
+ }
376
+ /** Peak and mean level of a file's audio, in dBFS: proof the track is not silence. */
377
+ export async function audioLevel(encoder, file) {
378
+ const result = await run(encoder.ffmpeg, ["-hide_banner", "-nostats", "-i", file, "-map", "0:a:0", "-af", "volumedetect", "-f", "null", "-"]);
379
+ const read = (name) => {
380
+ const match = new RegExp(`${name}:\\s*(-?[0-9.]+|-inf) dB`).exec(result.stderr);
381
+ return match && match[1] !== "-inf" ? Number(match[1]) : null;
382
+ };
383
+ return { mean_db: read("mean_volume"), max_db: read("max_volume") };
384
+ }
385
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kheleshikhi/studio-agent",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "Provider-neutral external agent workflow for KheleShikhi Interactive Studio",
5
5
  "type": "module",
6
6
  "bin": {