@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/scenario.js CHANGED
@@ -1,16 +1,43 @@
1
1
  import { CliError } from "./types.js";
2
- const COMMANDS = new Set(["set", "fire", "press", "tap", "drag", "play", "pause", "seek", "reset"]);
2
+ const COMMANDS = new Set([
3
+ "set", "fire", "press", "tap", "drag", "play", "pause", "seek", "step", "reset",
4
+ "restart", "previewState", "select",
5
+ ]);
3
6
  const OPERATIONS = new Set([...COMMANDS, "wait", "assert", "capture"]);
7
+ /**
8
+ * Domains of the shared `kheleshikhi.studio-observation.v2` contract. The
9
+ * human Observatory renders the same map, so a path here names exactly what
10
+ * the Maker sees.
11
+ */
12
+ export const SHARED_OBSERVATION_ROOTS = ["runtime", "scene", "timeline", "probe", "selection", "diagnostics"];
4
13
  const PATH_ROOTS = new Set([
5
- "active_states", "host_variables", "motion_outputs", "learner_controls",
14
+ "active_states", "preview_override_states", "host_variables", "motion_outputs", "learner_controls",
6
15
  "recent_scene_event", "scene_event_sequence", "scene_clock_seconds",
7
16
  "scene_clock_playing", "machine_dispatches", "math_graph", "runtime_ready",
17
+ "learner_camera",
8
18
  "geometry_instance_ids", "error_summary",
9
19
  "recent_audio_event", "audio_failed_count",
10
- "captions", "visual_ready",
20
+ "captions", "visual_ready", "active_visual_band",
11
21
  "gestures",
22
+ ...SHARED_OBSERVATION_ROOTS,
12
23
  ]);
13
24
  const IDENTIFIER = /^[A-Za-z][A-Za-z0-9_-]*$/;
25
+ /** A Scene machine State is always `machine/state`: one id alone is ambiguous across machines. */
26
+ const MACHINE_STATE = /^[A-Za-z][A-Za-z0-9_-]{0,79}\/[A-Za-z][A-Za-z0-9_-]{0,79}$/;
27
+ const SCENE_SELECTION = /^(scene|instance|variable|control|binding|behavior|event|gesture|mathPath|connection|machine|state|transition|graph|series|marker|intersection):[^\u0000-\u001f]{1,150}$/;
28
+ const EXPERIENCE_SELECTION = /^(state|transition|cue|scene|variable|audio):[A-Za-z0-9_.-]{1,80}$/;
29
+ const MAX_SETUP_VARIABLES = 16;
30
+ /** Operations that steer the runtime off its natural learner path. */
31
+ const SCENE_PROBE_OPERATIONS = new Set(["previewState", "fire", "seek", "step"]);
32
+ const EXPERIENCE_PROBE_OPERATIONS = new Set(["previewState", "fire", "fireSceneEvent", "fireCue", "seek"]);
33
+ function validSetup(value) {
34
+ if (!value || typeof value !== "object" || Array.isArray(value))
35
+ return false;
36
+ const entries = Object.entries(value);
37
+ return entries.length >= 1 && entries.length <= MAX_SETUP_VARIABLES && entries.every(([key, item]) => IDENTIFIER.test(key) && key.length <= 80 &&
38
+ (typeof item === "boolean" || typeof item === "number" && Number.isFinite(item) ||
39
+ typeof item === "string" && item.length <= 160));
40
+ }
14
41
  function invalid(message) {
15
42
  throw new CliError(message, "STUDIO_SCENARIO_INVALID", 2);
16
43
  }
@@ -27,14 +54,23 @@ export function parseScenario(value) {
27
54
  const step = raw;
28
55
  if (typeof step.op !== "string" || !OPERATIONS.has(step.op))
29
56
  invalid(`Step ${index} has an unsupported operation.`);
30
- const allowed = new Set(["op", "target", "value", "path", "equals", "between", "timeoutMs", "name"]);
57
+ const allowed = new Set(["op", "target", "value", "path", "equals", "between", "timeoutMs", "name", "setup"]);
31
58
  if (Object.keys(step).some((key) => !allowed.has(key)))
32
59
  invalid(`Step ${index} has an unknown field.`);
60
+ if (step.op === "previewState" && (typeof step.target !== "string" || !MACHINE_STATE.test(step.target))) {
61
+ invalid(`Step ${index} previewState needs an unambiguous machine/state target, for example "measurement/ready".`);
62
+ }
63
+ if (step.op === "select" && (typeof step.target !== "string" || !SCENE_SELECTION.test(step.target))) {
64
+ invalid(`Step ${index} select needs a kind:id target, for example "instance:calipers" or "state:measurement/ready".`);
65
+ }
66
+ if (step.setup !== undefined && (step.op !== "previewState" || !validSetup(step.setup))) {
67
+ invalid(`Step ${index} setup is allowed only on previewState, with 1–${MAX_SETUP_VARIABLES} declared variable values.`);
68
+ }
33
69
  if (["set", "fire", "press", "tap", "drag"].includes(step.op) &&
34
70
  (typeof step.target !== "string" || !IDENTIFIER.test(step.target) || step.target.length > 80)) {
35
71
  invalid(`Step ${index} needs a semantic target id.`);
36
72
  }
37
- if (["set", "drag", "seek"].includes(step.op) &&
73
+ if (["set", "drag", "seek", "step"].includes(step.op) &&
38
74
  (typeof step.value !== "number" && typeof step.value !== "boolean" && typeof step.value !== "string" ||
39
75
  typeof step.value === "number" && !Number.isFinite(step.value))) {
40
76
  invalid(`Step ${index} needs a finite value.`);
@@ -87,4 +123,106 @@ export function matchesObservation(observation, step) {
87
123
  return value === step.equals;
88
124
  }
89
125
  export function isDriveCommand(step) { return COMMANDS.has(step.op); }
126
+ const EXPERIENCE_COMMANDS = new Set(["fire", "fireSceneEvent", "fireCue", "press", "previewState", "select", "play", "pause", "seek", "restart"]);
127
+ const EXPERIENCE_ROOTS = new Set([
128
+ "mounted", "active_state", "active_scene", "active_band", "warm_bands",
129
+ "scene_active_states", "master_variables", "timeline_ms",
130
+ "timeline_duration_ms", "timeline_playing", "recent_master_event",
131
+ "recent_transition", "last_cue", "audio_state", "audio_error",
132
+ "preview_override", "error_summary",
133
+ "completed", "source_hash", "source_origin",
134
+ "experience", ...SHARED_OBSERVATION_ROOTS,
135
+ ]);
136
+ export function parseExperienceScenario(value) {
137
+ if (!value || typeof value !== "object" || Array.isArray(value))
138
+ invalid("Scenario must be an object.");
139
+ const raw = value;
140
+ if (raw.version !== 1 || !Array.isArray(raw.steps) || raw.steps.length < 1 || raw.steps.length > 64)
141
+ invalid("Experience scenario requires version 1 and 1–64 steps.");
142
+ const steps = raw.steps.map((item, index) => {
143
+ if (!item || typeof item !== "object" || Array.isArray(item))
144
+ invalid(`Step ${index} must be an object.`);
145
+ const step = item;
146
+ if (typeof step.op !== "string" || !EXPERIENCE_COMMANDS.has(step.op) && !["wait", "assert", "capture"].includes(step.op))
147
+ invalid(`Step ${index} has an unsupported operation.`);
148
+ if (Object.keys(step).some((key) => !["op", "target", "value", "path", "equals", "between", "timeoutMs", "name", "setup"].includes(key)))
149
+ invalid(`Step ${index} has an unknown field.`);
150
+ if (["fire", "fireSceneEvent", "fireCue", "press"].includes(step.op) &&
151
+ (typeof step.target !== "string" || !IDENTIFIER.test(step.target) || step.target.length > 80))
152
+ invalid(`Step ${index} needs a semantic target.`);
153
+ // A bare id is a master State; `machine/state` is a machine State of the
154
+ // active Scene. The two forms never collide.
155
+ if (step.op === "previewState" && (typeof step.target !== "string" ||
156
+ !(IDENTIFIER.test(step.target) && step.target.length <= 80 || MACHINE_STATE.test(step.target))))
157
+ invalid(`Step ${index} previewState needs a master State id or a Scene machine/state target.`);
158
+ if (step.op === "select" && (typeof step.target !== "string" || !EXPERIENCE_SELECTION.test(step.target)))
159
+ invalid(`Step ${index} select needs a kind:id target, for example "state:measure".`);
160
+ // Setup scope follows the target: a master State takes master Experience
161
+ // variables, a `machine/state` takes variables the active Scene declares.
162
+ // The page validates each name, type and declared range.
163
+ if (step.setup !== undefined && (step.op !== "previewState" || typeof step.target !== "string" ||
164
+ !validSetup(step.setup)))
165
+ invalid(`Step ${index} setup is allowed only on previewState, with 1–${MAX_SETUP_VARIABLES} declared variable values (master variables for a master State, Scene variables for machine/state).`);
166
+ if (step.op === "seek" && (typeof step.value !== "number" || !Number.isFinite(step.value) || step.value < 0))
167
+ invalid(`Step ${index} needs a nonnegative Timeline millisecond value.`);
168
+ if (["wait", "assert"].includes(step.op)) {
169
+ if (typeof step.path !== "string" || !validExperiencePath(step.path))
170
+ invalid(`Step ${index} needs an allowed observation path.`);
171
+ if (Object.hasOwn(step, "equals") === (step.between !== undefined))
172
+ invalid(`Step ${index} needs exactly one comparison.`);
173
+ if (step.between !== undefined && (!Array.isArray(step.between) || step.between.length !== 2 ||
174
+ step.between.some((n) => typeof n !== "number" || !Number.isFinite(n)) || step.between[0] > step.between[1]))
175
+ invalid(`Step ${index} has invalid bounds.`);
176
+ }
177
+ if (step.timeoutMs !== undefined && (typeof step.timeoutMs !== "number" || !Number.isInteger(step.timeoutMs) || step.timeoutMs < 1 || step.timeoutMs > 30_000))
178
+ invalid(`Step ${index} timeout must be 1–30000 ms.`);
179
+ if (step.name !== undefined && (typeof step.name !== "string" || !/^[A-Za-z0-9_-]{1,60}$/.test(step.name)))
180
+ invalid(`Step ${index} has invalid capture name.`);
181
+ return step;
182
+ });
183
+ return { version: 1, steps };
184
+ }
185
+ export function validExperiencePath(path) {
186
+ const parts = path.split(".");
187
+ return parts.length <= 4 && EXPERIENCE_ROOTS.has(parts[0]) &&
188
+ parts.slice(1).every((part) => /^[A-Za-z0-9_-]{1,80}$/.test(part));
189
+ }
190
+ export function matchesExperienceObservation(observation, step) {
191
+ if (!validExperiencePath(step.path || ""))
192
+ invalid("Observation path is not allowed.");
193
+ const value = (step.path || "").split(".").reduce((current, key) => current && typeof current === "object" && Object.hasOwn(current, key)
194
+ ? current[key] : undefined, observation);
195
+ if (step.between)
196
+ return typeof value === "number" && value >= step.between[0] && value <= step.between[1];
197
+ return value === step.equals;
198
+ }
199
+ export function isExperienceCommand(step) { return EXPERIENCE_COMMANDS.has(step.op); }
200
+ /**
201
+ * Probe or journey. A journey starts from the real initial condition and uses
202
+ * only learner-reachable actions; anything that jumped, fired a hidden event,
203
+ * seeked, or applied synthetic setup is a probe, and so is any run whose
204
+ * shared observation reported `probe.active` at any point. Probe evidence is
205
+ * development evidence; it never proves a learner can reach the result.
206
+ */
207
+ export function evidenceMode(kind, steps, observations) {
208
+ const synthetic = kind === "scene" ? SCENE_PROBE_OPERATIONS : EXPERIENCE_PROBE_OPERATIONS;
209
+ if (steps.some((step) => synthetic.has(step.op)))
210
+ return "probe";
211
+ return observations.some((observation) => observation?.probe?.active === true) ? "probe" : "journey";
212
+ }
213
+ /** A bounded, secret-free summary of one drive step for the activity feed. */
214
+ export function stepSummary(step, ok, actual) {
215
+ const scalar = (value) => typeof value === "string" ? value.slice(0, 80) :
216
+ typeof value === "number" || typeof value === "boolean" || value === null ? value : undefined;
217
+ return {
218
+ op: step.op,
219
+ ...(step.target ? { target: step.target.slice(0, 160) } : {}),
220
+ ...(step.value !== undefined ? { value: scalar(step.value) } : {}),
221
+ ...(step.setup ? { setup_keys: Object.keys(step.setup).slice(0, 16) } : {}),
222
+ ...(step.path ? { path: step.path.slice(0, 160) } : {}),
223
+ ...(actual !== undefined && scalar(actual) !== undefined ? { observed: scalar(actual) } : {}),
224
+ ...(step.name ? { name: step.name } : {}),
225
+ ok,
226
+ };
227
+ }
90
228
  //# sourceMappingURL=scenario.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoBtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC/E,SAAS,EAAE,cAAc,EAAE,QAAQ;CACpC,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACvE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAC9G,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,eAAe,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB;IAClG,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB;IACnE,qBAAqB,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe;IAC1E,gBAAgB;IAChB,uBAAuB,EAAE,eAAe;IACxC,oBAAoB,EAAE,oBAAoB;IAC1C,UAAU,EAAE,cAAc,EAAE,oBAAoB;IAChD,UAAU;IACV,GAAG,wBAAwB;CAC5B,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,kGAAkG;AAClG,MAAM,aAAa,GAAG,4DAA4D,CAAC;AACnF,MAAM,eAAe,GAAG,0KAA0K,CAAC;AACnM,MAAM,oBAAoB,GAAG,oEAAoE,CAAC;AAClG,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,sEAAsE;AACtE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACjF,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3G,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,mBAAmB,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CACnG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QACxC,CAAC,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC7E,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACxG,MAAM,QAAQ,GAAG,KAAgC,CAAC;IAClD,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrH,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAI,QAAQ,CAAC,KAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC7D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,QAAQ,KAAK,qBAAqB,CAAC,CAAC;QACvG,MAAM,IAAI,GAAG,GAA8B,CAAC;QAC5C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,QAAQ,KAAK,gCAAgC,CAAC,CAAC;QACpH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9G,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,QAAQ,KAAK,wBAAwB,CAAC,CAAC;QACvG,IAAI,IAAI,CAAC,EAAE,KAAK,cAAc,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACxG,OAAO,CAAC,QAAQ,KAAK,2FAA2F,CAAC,CAAC;QACpH,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpG,OAAO,CAAC,QAAQ,KAAK,+FAA+F,CAAC,CAAC;QACxH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,QAAQ,KAAK,kDAAkD,mBAAmB,4BAA4B,CAAC,CAAC;QAC1H,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC;YAClG,OAAO,CAAC,QAAQ,KAAK,8BAA8B,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAClG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACtE,OAAO,CAAC,QAAQ,KAAK,wBAAwB,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,CAAC,QAAQ,KAAK,qBAAqB,CAAC,CAAC;QAC3G,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,QAAQ,KAAK,qCAAqC,CAAC,CAAC;YACnI,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,IAAI,SAAS,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;gBAAE,OAAO,CAAC,QAAQ,KAAK,gCAAgC,CAAC,CAAC;YAClG,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClG,OAAO,CAAC,QAAQ,KAAK,sBAAsB,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;YAC/J,OAAO,CAAC,QAAQ,KAAK,8BAA8B,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,QAAQ,KAAK,4BAA4B,CAAC,CAAC;QAC/J,OAAO,IAAiB,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAoC,EAAE,IAAY;IAC9E,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC;QAC3C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/F,OAAQ,OAAmC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAU,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAC1C,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;QAC7D,CAAC,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAoC,EAAE,IAAe;IACtF,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3G,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAe,IAAa,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAO1F,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAClJ,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY;IACtE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa;IACxD,sBAAsB,EAAE,kBAAkB,EAAE,qBAAqB;IACjE,mBAAmB,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;IAC7D,kBAAkB,EAAE,eAAe;IACnC,WAAW,EAAE,aAAa,EAAE,eAAe;IAC3C,YAAY,EAAE,GAAG,wBAAwB;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACxG,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;QACjG,OAAO,CAAC,wDAAwD,CAAC,CAAC;IACpE,MAAM,KAAK,GAAI,GAAG,CAAC,KAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,QAAQ,KAAK,qBAAqB,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,IAA+B,CAAC;QAC7C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtH,OAAO,CAAC,QAAQ,KAAK,gCAAgC,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtI,OAAO,CAAC,QAAQ,KAAK,wBAAwB,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;YAC7F,OAAO,CAAC,QAAQ,KAAK,2BAA2B,CAAC,CAAC;QACpD,yEAAyE;QACzE,6CAA6C;QAC7C,IAAI,IAAI,CAAC,EAAE,KAAK,cAAc,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAChE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,QAAQ,KAAK,wEAAwE,CAAC,CAAC;QACjG,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtG,OAAO,CAAC,QAAQ,KAAK,8DAA8D,CAAC,CAAC;QACvF,yEAAyE;QACzE,0EAA0E;QAC1E,yDAAyD;QACzD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC5F,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,CAAC,QAAQ,KAAK,kDAAkD,mBAAmB,qGAAqG,CAAC,CAAC;QACnM,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC1G,OAAO,CAAC,QAAQ,KAAK,kDAAkD,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,QAAQ,KAAK,qCAAqC,CAAC,CAAC;YAClI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;gBAAE,OAAO,CAAC,QAAQ,KAAK,gCAAgC,CAAC,CAAC;YAC3H,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC5G,OAAO,CAAC,QAAQ,KAAK,sBAAsB,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YAC5J,OAAO,CAAC,QAAQ,KAAK,8BAA8B,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxG,OAAO,CAAC,QAAQ,KAAK,4BAA4B,CAAC,CAAC;QACrD,OAAO,IAAsB,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,WAAoC,EAAE,IAAoB;IACrG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAC1E,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;QACnE,CAAC,CAAE,OAAmC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3G,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAoB,IAAa,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE/G;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA4B,EAC5B,KAA4B,EAC5B,YAAwD;IAExD,MAAM,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,2BAA2B,CAAC;IAC1F,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACjE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACtC,WAAW,EAAE,KAA6C,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACxG,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,IAAgC,EAAE,EAAW,EAAE,MAAgB;IACzF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAW,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,EAAE;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,164 @@
1
+ export declare const RECIPE_KIND = "kheleshikhi.video-render-recipe.v1";
2
+ export declare const RENDER_KIND = "kheleshikhi.video-render.v1";
3
+ export type RenderSubject = "scene" | "experience";
4
+ /** Learner actions a recipe may schedule, per subject. */
5
+ export declare const RENDER_OPS: Record<RenderSubject, readonly string[]>;
6
+ export type RenderAction = {
7
+ /** Video second at which the action happens. */
8
+ at: number;
9
+ op: string;
10
+ target?: string;
11
+ value?: string | number | boolean;
12
+ };
13
+ /** The native output sizes: the presentation host renders at exactly these. */
14
+ export declare const RENDER_PROFILES: {
15
+ readonly "landscape-720p": {
16
+ readonly width: 1280;
17
+ readonly height: 720;
18
+ };
19
+ readonly "landscape-1080p": {
20
+ readonly width: 1920;
21
+ readonly height: 1080;
22
+ };
23
+ readonly "portrait-720p": {
24
+ readonly width: 720;
25
+ readonly height: 1280;
26
+ };
27
+ readonly "portrait-1080p": {
28
+ readonly width: 1080;
29
+ readonly height: 1920;
30
+ };
31
+ };
32
+ export type RenderProfile = keyof typeof RENDER_PROFILES;
33
+ export type RenderRecipe = {
34
+ kind: typeof RECIPE_KIND;
35
+ /** Output frames per second. */
36
+ fps: number;
37
+ /** SceneClock seconds rendered: [start, end); frame k at start + k / fps. */
38
+ start: number;
39
+ end: number;
40
+ /** One of [RENDER_PROFILES]; its size is the output size. */
41
+ profile: RenderProfile;
42
+ /** Output size: the presentation viewport, every PNG and the MP4. */
43
+ width: number;
44
+ height: number;
45
+ /** `scene` mixes the runtime's own sounds from canonical assets; `silent` writes a silent AAC track. */
46
+ audio: "silent" | "scene";
47
+ /** Learner actions at exact logical times. */
48
+ actions: RenderAction[];
49
+ crf: number;
50
+ };
51
+ export declare const RECIPE_LIMITS: {
52
+ maxSeconds: number;
53
+ maxFps: number;
54
+ maxFrames: number;
55
+ maxActions: number;
56
+ };
57
+ /** Parse and bound a render recipe. Unknown fields are refused, never ignored. */
58
+ export declare function parseRecipe(value: unknown, subject?: RenderSubject): RenderRecipe;
59
+ /** Width and height of a PNG, from its IHDR chunk; refuses anything else. */
60
+ export declare function pngSize(data: Uint8Array): {
61
+ width: number;
62
+ height: number;
63
+ };
64
+ /** The exact logical second of frame `index`: computed, never accumulated. */
65
+ export declare function frameTime(recipe: RenderRecipe, index: number): number;
66
+ /**
67
+ * The frame grid. Frame k exists exactly when `start + k / fps < end`: the
68
+ * span is half open, so a frame at `end` is not rendered and every frame
69
+ * before it is. The count is the smallest n with `start + n / fps >= end`,
70
+ * i.e. `ceil((end - start) * fps)`, with a tolerance of a billionth of a
71
+ * frame so a decimal end that is exactly on the grid (16 s at 30 fps is
72
+ * 480.00000000000006 in binary) is not rounded up a frame.
73
+ */
74
+ export declare function frameCountFor(start: number, end: number, fps: number): number;
75
+ export declare function frameCount(recipe: RenderRecipe): number;
76
+ /** Learner actions due after `previous` and at or before `time`. */
77
+ export declare function actionsBetween(recipe: RenderRecipe, previous: number, time: number): RenderAction[];
78
+ export declare function sha256(data: string | Uint8Array): string;
79
+ export type Encoder = {
80
+ ffmpeg: string;
81
+ ffprobe: string;
82
+ version: string;
83
+ libx264: boolean;
84
+ };
85
+ /**
86
+ * FFmpeg is an explicit, local dependency: `NERDBRO_FFMPEG` (and
87
+ * `NERDBRO_FFPROBE`) or `ffmpeg`/`ffprobe` on PATH. It is never downloaded.
88
+ */
89
+ export declare function findEncoder(environment?: NodeJS.ProcessEnv): Promise<Encoder>;
90
+ /**
91
+ * The FFmpeg arguments for one recipe: H.264 High, yuv420p, CFR, AAC audio,
92
+ * faststart. Frames are already the output size (proved per PNG), so the
93
+ * picture is never scaled. `audio` is the mixed track, or none for silence.
94
+ */
95
+ export declare function encodeArguments(recipe: RenderRecipe, frames: string, output: string, audio?: string): string[];
96
+ export declare function encode(encoder: Encoder, recipe: RenderRecipe, frames: string, output: string, audio?: string): Promise<void>;
97
+ export type Probe = {
98
+ duration: number;
99
+ frames: number;
100
+ width: number;
101
+ height: number;
102
+ video_codec: string;
103
+ audio_codec: string | null;
104
+ pix_fmt: string;
105
+ fps: string;
106
+ };
107
+ export declare function probe(encoder: Encoder, file: string): Promise<Probe>;
108
+ /** Refuse an encode that does not match its recipe: frame count, size, codecs and duration. */
109
+ export declare function verifyProbe(recipe: RenderRecipe, result: Probe): void;
110
+ /** One play or stop the runtime logged during a render (never sounded). */
111
+ export type RenderAudioEvent = {
112
+ at_ms: number;
113
+ action: "play" | "stop" | string;
114
+ id: string;
115
+ /** Experience Scene key for a Scene's own sound; absent for an Experience sound. */
116
+ scene?: string;
117
+ /** Where in the asset playback starts (an audio clock resuming mid-file). */
118
+ offset_ms?: number;
119
+ loop?: boolean;
120
+ volume?: number;
121
+ role?: string;
122
+ sha256?: string | null;
123
+ };
124
+ /** One stretch of one sound in the mix. */
125
+ export type AudioSegment = {
126
+ key: string;
127
+ at_ms: number;
128
+ offset_ms: number;
129
+ length_ms: number;
130
+ loop: boolean;
131
+ volume: number;
132
+ };
133
+ export declare const MIX_LIMITS: {
134
+ maxSegments: number;
135
+ maxSources: number;
136
+ };
137
+ export declare function audioKey(event: {
138
+ id: string;
139
+ scene?: string;
140
+ }): string;
141
+ /**
142
+ * The logged plays and stops as segments of a video that shows video time
143
+ * [startMs, endMs): a play opens one; the next stop or play of the same
144
+ * sound (a restart) closes it, and so does the end. A sound already playing
145
+ * at `startMs` enters the video that far into its asset. Times in the
146
+ * result are relative to the video's first frame. Events are in log order,
147
+ * which is time order.
148
+ */
149
+ export declare function audioSegments(events: RenderAudioEvent[], endMs: number, startMs?: number): AudioSegment[];
150
+ /**
151
+ * FFmpeg arguments that mix [segments] from their canonical files into one
152
+ * 48 kHz stereo PCM track exactly `durationMs` long. Each segment is its own
153
+ * input (a looping sound is an endlessly looped input), trimmed from its
154
+ * offset to its length, scaled by its volume and delayed to its start;
155
+ * the segments are summed without normalisation, so a sound is as loud as
156
+ * the runtime would play it. Returns null when nothing sounded.
157
+ */
158
+ export declare function mixArguments(segments: AudioSegment[], files: Map<string, string>, durationMs: number, output: string): string[] | null;
159
+ export declare function mix(encoder: Encoder, segments: AudioSegment[], files: Map<string, string>, durationMs: number, output: string): Promise<string[] | null>;
160
+ /** Peak and mean level of a file's audio, in dBFS: proof the track is not silence. */
161
+ export declare function audioLevel(encoder: Encoder, file: string): Promise<{
162
+ mean_db: number | null;
163
+ max_db: number | null;
164
+ }>;