@vosjs/cli 0.79.0 → 0.80.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/README.md +71 -25
- package/dist/{assetManifest-U25FJER6.js → assetManifest-ETT3C7ZA.js} +2 -2
- package/dist/{chunk-Z6TLHRFQ.js → chunk-B373NVJE.js} +6 -2
- package/dist/chunk-B373NVJE.js.map +1 -0
- package/dist/{chunk-4ZUHEXUX.js → chunk-PJ6MEJZV.js} +205 -25
- package/dist/chunk-PJ6MEJZV.js.map +1 -0
- package/dist/{chunk-TWAP4BKR.js → chunk-SP5OHTVB.js} +2441 -603
- package/dist/chunk-SP5OHTVB.js.map +1 -0
- package/dist/cli.js +13 -7
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/{run-UKWKAGDK.js → run-2ELHMPTB.js} +4 -4
- package/dist/{shotList-EE3S5LVF.js → shotList-MSNWLVDN.js} +30 -3
- package/dist/shotList-MSNWLVDN.js.map +1 -0
- package/package.json +3 -3
- package/schema/actions.schema.json +200 -4
- package/schema/doc.schema.json +9 -4
- package/skills/VERSION +1 -1
- package/skills/launch-kit/SKILL.md +6 -2
- package/skills/product-video/SKILL.md +27 -0
- package/skills/product-video/references/taste.md +7 -3
- package/skills/vos-cut/SKILL.md +17 -2
- package/dist/chunk-4ZUHEXUX.js.map +0 -1
- package/dist/chunk-TWAP4BKR.js.map +0 -1
- package/dist/chunk-Z6TLHRFQ.js.map +0 -1
- package/dist/shotList-EE3S5LVF.js.map +0 -1
- /package/dist/{assetManifest-U25FJER6.js.map → assetManifest-ETT3C7ZA.js.map} +0 -0
- /package/dist/{run-UKWKAGDK.js.map → run-2ELHMPTB.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
stillOutFor,
|
|
20
20
|
stillWarnings,
|
|
21
21
|
videoFormat
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-B373NVJE.js";
|
|
23
23
|
import {
|
|
24
24
|
ASSET_ROUTE,
|
|
25
25
|
MEDIA_HEAD_BYTES,
|
|
@@ -455,7 +455,9 @@ Engine verbs (local, no account, no network beyond the render page's CDN deps)
|
|
|
455
455
|
--width/--height keeps the program's aspect, both set the frame
|
|
456
456
|
vos still <config.json|url> [out.webp|out.png|out.jpg] [--time 0 | --times 0,1.5,50%]
|
|
457
457
|
[--width] [--height] [--set data.<key>=<value>]... [--json]
|
|
458
|
-
vos info <config.json|url> [--json]
|
|
458
|
+
vos info <config.json|url|take> [--json]
|
|
459
|
+
a take: its steps per media in source seconds, and every segment, span,
|
|
460
|
+
layer and sound in output seconds after trims and speed
|
|
459
461
|
vos check <config.json|url> [--json]
|
|
460
462
|
migrate \u2192 schema \u2192 syntax \u2192 compile \u2192 determinism/dialect lints, all local
|
|
461
463
|
vos preview <config.json|url> [--port 0]
|
|
@@ -645,9 +647,13 @@ async function cmdStill(argv) {
|
|
|
645
647
|
}
|
|
646
648
|
}
|
|
647
649
|
async function cmdInfo(argv) {
|
|
650
|
+
const first = argv.find((a) => !a.startsWith("-"));
|
|
651
|
+
if (first && directoryKind(first) === "take") {
|
|
652
|
+
return delegate(["info", ...argv]);
|
|
653
|
+
}
|
|
648
654
|
const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS);
|
|
649
655
|
const source = positionals[0];
|
|
650
|
-
if (!source) throw new UsageError("vos info <config.json|url>");
|
|
656
|
+
if (!source) throw new UsageError("vos info <config.json|url|take>");
|
|
651
657
|
const r = createReporter(flags.json === true);
|
|
652
658
|
const { config, warnings } = await loadVosConfig(source);
|
|
653
659
|
const elements = Array.isArray(config.elements) ? config.elements.length : 0;
|
|
@@ -833,7 +839,7 @@ async function cmdCheck(argv) {
|
|
|
833
839
|
const result = runCheck(parsed);
|
|
834
840
|
if (result.config) {
|
|
835
841
|
const baseDir = baseDirOf(source);
|
|
836
|
-
const { hostedLiteralWarnings } = await import("./assetManifest-
|
|
842
|
+
const { hostedLiteralWarnings } = await import("./assetManifest-ETT3C7ZA.js");
|
|
837
843
|
const extra = [
|
|
838
844
|
...baseDir ? missingManifestFiles(result.config, baseDir) : [],
|
|
839
845
|
...hostedLiteralWarnings(result.config)
|
|
@@ -867,7 +873,7 @@ async function cmdCheck(argv) {
|
|
|
867
873
|
return result.ok ? EXIT_OK : EXIT_ERROR;
|
|
868
874
|
}
|
|
869
875
|
async function delegate(argv) {
|
|
870
|
-
const { run } = await import("./run-
|
|
876
|
+
const { run } = await import("./run-2ELHMPTB.js");
|
|
871
877
|
return await run(argv);
|
|
872
878
|
}
|
|
873
879
|
async function printHelp() {
|
|
@@ -901,7 +907,7 @@ async function main() {
|
|
|
901
907
|
const engine = HELP_ENGINE.split("\n").filter(
|
|
902
908
|
(l) => l.startsWith(` vos ${cmd} `)
|
|
903
909
|
);
|
|
904
|
-
const { verbHelp } = await import("./run-
|
|
910
|
+
const { verbHelp } = await import("./run-2ELHMPTB.js");
|
|
905
911
|
const take = verbHelp(cmd);
|
|
906
912
|
process.stdout.write(
|
|
907
913
|
`${engine.join("\n")}
|
|
@@ -929,7 +935,7 @@ ${take.includes("no such verb") ? "" : take}`
|
|
|
929
935
|
main().then(async (code) => {
|
|
930
936
|
if (code === EXIT_OK) {
|
|
931
937
|
const verb = process.argv[2] ?? "";
|
|
932
|
-
const { HELP } = await import("./run-
|
|
938
|
+
const { HELP } = await import("./run-2ELHMPTB.js");
|
|
933
939
|
const documented = [
|
|
934
940
|
...helpFlagsFor(HELP_ENGINE, verb),
|
|
935
941
|
...helpFlagsFor(HELP, verb)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/output.ts","../src/check.ts","../src/plugin/knobs.ts","../src/outputSize.ts","../src/programAudio.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport { existsSync, readFileSync, statSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport { createServer } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { parseArgs, numFlag, UsageError } from './args'\nimport { helpFlagsFor, unusedFlagsMessage } from './flagUse'\nimport {\n createReporter,\n EXIT_ERROR,\n EXIT_NO_BROWSER,\n EXIT_OK,\n EXIT_USAGE,\n} from './output'\nimport {\n loadVosConfig,\n configDuration,\n directoryKind,\n loadProgramDirectory,\n readSourceText,\n} from './loadConfig'\nimport { launchBrowser, BrowserUnavailableError } from './browser'\nimport {\n inspectStill,\n previewPages,\n reencodeStill,\n renderStill,\n renderVideo,\n stillWarnings,\n} from './render'\nimport { runCheck } from './check'\nimport { outputSizeFor, RENDER_FALLBACK, STILL_FALLBACK } from './outputSize'\nimport { aspectLabel, programSize } from '@vosjs/core'\nimport { programAudio } from './programAudio'\nimport {\n ASSET_ROUTE,\n missingManifestFiles,\n programAssets,\n serveFile,\n} from './programAssets'\nimport type { ProgramAssets } from './programAssets'\nimport {\n applyDataSets,\n parseTimes,\n setFlags,\n stillFormat,\n stillOutFor,\n videoFormat,\n} from './outputs'\nimport { platformOrigin, resolveCredential } from './plugin/platform'\n\nconst BOOLEAN_FLAGS = new Set(['json', 'help', 'version'])\n\nconst HELP_ENGINE = `vos — command line for the vos programmatic video engine (https://vos.so/engine)\n\nEngine verbs (local, no account, no network beyond the render page's CDN deps)\n vos render <config.json|url|take> [out.mp4|out.webm] [--width] [--height] [--fps 30]\n [--duration <s>] [--format webm|mp4] [--set data.<key>=<value>]... [--json]\n the output's name picks the container; a program document's sound is mixed in\n size: the program's own \"size\" (else 1920x1080; a still, 1280x720); one of\n --width/--height keeps the program's aspect, both set the frame\n vos still <config.json|url> [out.webp|out.png|out.jpg] [--time 0 | --times 0,1.5,50%]\n [--width] [--height] [--set data.<key>=<value>]... [--json]\n vos info <config.json|url> [--json]\n vos check <config.json|url> [--json]\n migrate → schema → syntax → compile → determinism/dialect lints, all local\n vos preview <config.json|url> [--port 0]\n vos versions [--json]\n`\n\nconst HELP_CONVENTIONS = `\nConventions\n Results go to stdout; logs go to stderr. --json switches stdout to NDJSON\n events ending with {\"event\":\"done\",…}. Exit codes: 0 ok, 1 error, 2 usage,\n 3 no browser available, 4 the recorder met a sign-in instead of the page\n it was asked for (nothing was recorded; it needs a session, not a new\n script). vos <verb> --help prints that verb's flags.\n`\n\n/** An `audio` element in the config: something a render never mixes. */\nfunction hasAudioElements(config: unknown): boolean {\n const elements = (config as { elements?: unknown }).elements\n return (\n Array.isArray(elements) &&\n elements.some(\n (e) =>\n !!e &&\n typeof e === 'object' &&\n (e as { type?: unknown }).type === 'audio',\n )\n )\n}\n\nfunction outName(source: string, ext: string): string {\n const base = basename(source).replace(/\\.[a-z0-9]+$/i, '') || 'vos'\n return `${base}.${ext}`\n}\n\n/** Where a source's relative files are read against; null for a URL. */\nfunction baseDirOf(source: string): string | null {\n if (/^https?:\\/\\//.test(source)) return null\n return existsSync(source) && statSync(source).isDirectory()\n ? source\n : dirname(source)\n}\n\n/** The program's declared files (`config.assets`), reachable for a page. */\nfunction assetsFor(\n source: string,\n config: Record<string, unknown>,\n log: (line: string) => void,\n): Promise<ProgramAssets | null> {\n return programAssets(config, {\n // A config loaded from a URL has no directory: it reads no local file.\n baseDir: baseDirOf(source),\n origin: platformOrigin({}),\n key: resolveCredential(),\n log: (line) => log(line),\n })\n}\n\nasync function cmdRender(argv: string[]): Promise<number> {\n // Polymorphic render: a take DIRECTORY (its doc.json is a recording\n // document) renders through the plugin; a program directory (config.json,\n // composed with a program document when one sits beside it) and every\n // other source are engine config renders. A deterministic sniff, never a\n // flag — and the sniff reads the document, because a program directory\n // carries a doc.json too.\n const first = argv.find((a) => !a.startsWith('-'))\n if (first && directoryKind(first) === 'take') {\n return delegate(['render', ...argv])\n }\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos render <config.json|url|take> [out]')\n const r = createReporter(flags.json === true)\n const format = videoFormat(\n flags.format === undefined ? undefined : String(flags.format),\n positionals[1],\n )\n\n const loaded = await loadVosConfig(source)\n for (const w of loaded.warnings) r.log(`note: ${w}`)\n void flags.set\n const config = applyDataSets(\n loaded.config as Record<string, unknown>,\n setFlags(argv),\n )\n const duration = numFlag(flags, 'duration', configDuration(config) ?? 5)\n const size = outputSizeFor(config, flags, RENDER_FALLBACK)\n if (size.note) r.log(`note: ${size.note}`)\n const { width, height } = size\n const fps = numFlag(flags, 'fps', 30)\n const out = positionals[1] ?? outName(source, format)\n\n // A program document's sound rides its studio entry; mix it like a take's.\n const audio = await programAudio(config as Record<string, unknown>, {\n baseDir:\n existsSync(source) && statSync(source).isDirectory()\n ? source\n : dirname(source),\n duration,\n origin: platformOrigin({}),\n key: resolveCredential(),\n log: (line) => r.log(line),\n })\n if (audio) r.log(`mixing ${audio.clips} sound${audio.clips === 1 ? '' : 's'}`)\n if (hasAudioElements(config)) {\n r.log(\n 'note: an audio ELEMENT is not mixed by a render; put the sound on the program document instead (doc.json audio: [{ key, start, in, out, duration, gain }])',\n )\n }\n\n const assets = await assetsFor(source, config, (line) => r.log(line))\n\n const browser = await launchBrowser()\n try {\n const result = await renderVideo(browser, {\n config,\n assets,\n width,\n height,\n fps,\n duration,\n format,\n audioProducerCode: audio?.producerCode,\n onPhase: (phase) => {\n r.log(`${phase}…`)\n r.event({ event: 'phase', phase })\n },\n })\n await writeFile(out, result.bytes)\n const warnings = stillWarnings(\n { transparent: false, flat: false },\n result.pageErrors,\n result.engineNotes,\n )\n for (const w of warnings) r.log(`warn: ${w}`)\n r.done(\n {\n out,\n bytes: result.bytes.length,\n width,\n height,\n fps,\n duration,\n format,\n audio: audio?.clips ?? 0,\n ...(warnings.length ? { warnings } : {}),\n },\n `Wrote ${out} (${(result.bytes.length / 1024).toFixed(0)} KB, ${width}x${height}@${fps}, ${duration}s)`,\n )\n return EXIT_OK\n } finally {\n await browser.close()\n }\n}\n\nasync function cmdStill(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source)\n throw new UsageError(\n 'vos still <config.json|url> [out.webp|out.png|out.jpg] [--time t | --times a,b,50%]',\n )\n const r = createReporter(flags.json === true)\n\n const loaded = await loadVosConfig(source)\n for (const w of loaded.warnings) r.log(`note: ${w}`)\n void flags.set\n const config = applyDataSets(\n loaded.config as Record<string, unknown>,\n setFlags(argv),\n )\n const size = outputSizeFor(config, flags, STILL_FALLBACK)\n if (size.note) r.log(`note: ${size.note}`)\n const { width, height } = size\n const out = positionals[1] ?? outName(source, 'webp')\n const encoding = stillFormat(out)\n const timesRaw = flags.times === undefined ? undefined : String(flags.times)\n if (timesRaw !== undefined && flags.time !== undefined)\n throw new UsageError('--time and --times: pass one')\n const times =\n timesRaw !== undefined\n ? parseTimes(timesRaw, configDuration(config) ?? 5)\n : [numFlag(flags, 'time', 0)]\n const many = times.length > 1\n const assets = await assetsFor(source, config, (line) => r.log(line))\n\n // One browser for every time: each still is its own capture page.\n const browser = await launchBrowser()\n try {\n const written: {\n out: string\n bytes: number\n time: number\n warnings?: string[]\n }[] = []\n for (const time of times) {\n const target = stillOutFor(out, time, many)\n const result = await renderStill(browser, {\n config,\n assets,\n width,\n height,\n time,\n onPhase: (phase) => {\n r.event({ event: 'phase', phase, time })\n },\n })\n // The engine captures WebP; a .png or .jpg name is re-encoded in the\n // page, so the bytes always match the name.\n const bytes =\n encoding === 'webp'\n ? result.bytes\n : await reencodeStill(browser, result.bytes, encoding)\n await writeFile(target, bytes)\n // A still is checked before anyone looks at it: a fully transparent\n // or flat frame is written, and said, never passed off as a picture.\n const warnings = stillWarnings(\n await inspectStill(browser, result.bytes),\n result.pageErrors,\n result.engineNotes,\n )\n written.push({\n out: target,\n bytes: bytes.length,\n time,\n ...(warnings.length ? { warnings } : {}),\n })\n r.log(\n `Wrote ${target} (${(bytes.length / 1024).toFixed(0)} KB @ t=${Number(time.toFixed(2))}s)`,\n )\n for (const w of warnings)\n r.log(`warn: t=${Number(time.toFixed(2))}s ${w}`)\n }\n const first = written[0]\n r.done(\n many\n ? { stills: written, width, height, format: encoding }\n : { ...first, width, height, format: encoding },\n many\n ? `Wrote ${written.length} stills (${width}x${height})`\n : `Wrote ${first.out} (${(first.bytes / 1024).toFixed(0)} KB, ${width}x${height} @ t=${first.time}s)`,\n )\n return EXIT_OK\n } finally {\n await browser.close()\n }\n}\n\nasync function cmdInfo(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos info <config.json|url>')\n const r = createReporter(flags.json === true)\n\n const { config, warnings } = await loadVosConfig(source)\n const elements = Array.isArray(config.elements) ? config.elements.length : 0\n const data =\n typeof config.data === 'object' && config.data !== null\n ? Object.keys(config.data)\n : []\n const fns = ['setup', 'createContent', 'createTimeline', 'onFrame'].filter(\n (k) => typeof config[k] === 'string',\n )\n const declared = programSize(config)\n const info = {\n version: config.version,\n duration: configDuration(config) ?? null,\n size: declared ?? null,\n camera:\n (config.camera as Record<string, unknown> | undefined)?.preset ?? null,\n elements,\n dataKeys: data,\n functions: fns,\n warnings,\n }\n if (r.json) r.done(info, '')\n else {\n for (const w of warnings) r.log(`note: ${w}`)\n process.stdout.write(\n `version: v${String(info.version)}\\n` +\n `duration: ${info.duration === null ? '(none)' : `${info.duration}s`}\\n` +\n `size: ${declared ? `${declared.width}x${declared.height} (${aspectLabel(declared)})` : '(none declared; render 1920x1080, still 1280x720)'}\\n` +\n `camera: ${String(info.camera ?? '(default)')}\\n` +\n `elements: ${elements}\\n` +\n `data keys: ${data.length ? data.join(', ') : '(none)'}\\n` +\n `functions: ${fns.join(', ')}\\n`,\n )\n }\n return EXIT_OK\n}\n\nfunction packageVersion(name: string): string | null {\n const require = createRequire(import.meta.url)\n // Fast path — packages that export ./package.json (e.g. playwright).\n try {\n return (require(`${name}/package.json`) as { version: string }).version\n } catch {\n // Strict `exports` maps (the @vosjs packages) hide package.json — resolve\n // the entry module instead and walk up to the owning package.json.\n }\n let entry: string | null = null\n try {\n entry = fileURLToPath(import.meta.resolve(name))\n } catch {\n try {\n entry = require.resolve(name)\n } catch {\n return null\n }\n }\n let dir = dirname(entry)\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, 'package.json'), 'utf8'),\n ) as {\n name?: string\n version?: string\n }\n if (pkg.name === name && pkg.version) return pkg.version\n } catch {\n // keep walking\n }\n const parent = dirname(dir)\n if (parent === dir) return null\n dir = parent\n }\n return null\n}\n\nfunction ownVersion(): string {\n try {\n const own = JSON.parse(\n readFileSync(\n fileURLToPath(new URL('../package.json', import.meta.url)),\n 'utf8',\n ),\n ) as { version: string }\n return own.version\n } catch {\n return '(unknown)'\n }\n}\n\nasync function cmdVersions(argv: string[]): Promise<number> {\n const { flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const r = createReporter(flags.json === true)\n const versions: Record<string, string> = {}\n versions['@vosjs/cli'] = ownVersion()\n for (const name of [\n '@vosjs/core',\n '@vosjs/elements',\n '@vosjs/tween',\n '@vosjs/editor',\n '@vosjs/timeline',\n '@vosjs/studio-core',\n '@vosjs/render-core',\n '@vosjs/shared',\n 'mediabunny',\n 'playwright',\n ]) {\n versions[name] = packageVersion(name) ?? '(not found)'\n }\n if (r.json) r.done({ versions }, '')\n else\n for (const [k, v] of Object.entries(versions))\n process.stdout.write(`${k} ${v}\\n`)\n return EXIT_OK\n}\n\nasync function cmdPreview(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos preview <config.json|url> [--port 0]')\n const r = createReporter(false)\n const { config, warnings } = await loadVosConfig(source)\n for (const w of warnings) r.log(`note: ${w}`)\n const assets = await assetsFor(source, config, (line) => r.log(line))\n const { hostHtml, playerHtml } = previewPages(config, assets)\n const server = createServer((req, res) => {\n const path = new URL(req.url ?? '/', 'http://x').pathname\n // The program's declared files, served from disk under their route.\n if (path.startsWith(ASSET_ROUTE)) {\n const file = assets?.files[path]\n if (!file) {\n res.writeHead(404).end('no such declared file')\n return\n }\n const answer = serveFile(file, req.headers.range)\n res.writeHead(answer.status, answer.headers).end(answer.body)\n return\n }\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(path === '/player' ? playerHtml : hostHtml)\n })\n const port = numFlag(flags, 'port', 0)\n // Loopback only: this server hands out the program's files.\n await new Promise<void>((resolve) =>\n server.listen(port, '127.0.0.1', resolve),\n )\n const addr = server.address()\n const url = `http://127.0.0.1:${typeof addr === 'object' && addr ? addr.port : port}/`\n process.stdout.write(`${url}\\n`)\n r.log('Serving playback preview — Ctrl-C to stop.')\n await new Promise(() => {}) // keep alive until interrupted\n return EXIT_OK\n}\n\nasync function cmdCheck(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos check <config.json>')\n const r = createReporter(flags.json === true)\n\n // A directory is a take (refused here: its document is `vos validate`'s\n // job) or a program directory (config.json, composed with the program\n // document beside it so the ladder reads the layers' strings too).\n const kind = /^https?:\\/\\//.test(source) ? 'none' : directoryKind(source)\n if (kind === 'take') {\n throw new UsageError(\n `${source} is a take (its doc.json is a recording document). vos validate ${source} lints it; vos render ${source} renders it.`,\n )\n }\n let raw: string\n let parsed: unknown\n try {\n if (kind === 'program') {\n const notes: string[] = []\n parsed = await loadProgramDirectory(source, notes)\n for (const n of notes) r.log(`note: ${n}`)\n raw = ''\n } else {\n raw = await readSourceText(source)\n parsed = JSON.parse(raw)\n }\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e\n parsed = undefined\n if (!r.json) process.stdout.write(`error [json] ${(e as Error).message}\\n`)\n r.done(\n {\n ok: false,\n errors: 1,\n warnings: 0,\n issues: [\n { level: 'error', source: 'json', message: (e as Error).message },\n ],\n },\n `${source}: 1 error`,\n )\n return EXIT_ERROR\n }\n\n const result = runCheck(parsed)\n // What only a check that knows where the config lives can say: a declared\n // file that is not there, and a hosted file named in code.\n if (result.config) {\n const baseDir = baseDirOf(source)\n const { hostedLiteralWarnings } = await import('./plugin/assetManifest')\n const extra = [\n ...(baseDir ? missingManifestFiles(result.config, baseDir) : []),\n ...hostedLiteralWarnings(result.config),\n ]\n for (const message of extra) {\n result.issues.push({ level: 'warn', source: 'assets', message })\n result.warnings++\n }\n }\n if (r.json) {\n r.done(\n {\n ok: result.ok,\n errors: result.errors,\n warnings: result.warnings,\n issues: result.issues,\n },\n '',\n )\n } else {\n for (const i of result.issues) {\n process.stdout.write(`${i.level} [${i.source}] ${i.message}\\n`)\n }\n process.stdout.write(\n result.ok\n ? `${source}: ok (${result.warnings} warning${result.warnings === 1 ? '' : 's'})\\n`\n : `${source}: ${result.errors} error${result.errors === 1 ? '' : 's'}, ${result.warnings} warning${result.warnings === 1 ? '' : 's'}\\n`,\n )\n }\n return result.ok ? EXIT_OK : EXIT_ERROR\n}\n\n// ---------------------------------------------------------------------------\n// Every verb this file does not own is a take-pipeline or vos.so verb from\n// `./plugin` (what used to ship separately as @vosso/vos-plugin). It loads on\n// demand, so the engine verbs never pay for the recorder's imports.\n// ---------------------------------------------------------------------------\n\nasync function delegate(argv: string[]): Promise<number> {\n const { run } = await import('./plugin/run')\n return await run(argv)\n}\n\nasync function printHelp(): Promise<void> {\n process.stdout.write(HELP_ENGINE)\n const { manifest } = await import('./plugin/manifest')\n process.stdout.write('\\nTake pipeline + vos.so verbs\\n')\n for (const v of manifest.verbs) {\n if (v.name === 'render') continue // polymorphic — already listed above\n process.stdout.write(` vos ${v.name.padEnd(8)} ${v.summary}\\n`)\n }\n process.stdout.write(HELP_CONVENTIONS)\n}\n\nconst ENGINE_VERBS = new Set([\n 'render',\n 'still',\n 'info',\n 'versions',\n 'preview',\n 'check',\n])\n\nasync function main(): Promise<number> {\n const [cmd, ...rest] = process.argv.slice(2)\n if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {\n await printHelp()\n return cmd ? EXIT_OK : EXIT_USAGE\n }\n if (cmd === '--version') return cmdVersions(['--json'])\n if (!ENGINE_VERBS.has(cmd)) return delegate([cmd, ...rest])\n // An engine verb asked for its flags: the engine's usage lines, plus the\n // take pipeline's where the verb is shared (render takes a config OR a take).\n if (rest.includes('--help') || rest.includes('-h')) {\n const engine = HELP_ENGINE.split('\\n').filter((l) =>\n l.startsWith(` vos ${cmd} `),\n )\n const { verbHelp } = await import('./plugin/run')\n const take = verbHelp(cmd)\n process.stdout.write(\n `${engine.join('\\n')}\\n${take.includes('no such verb') ? '' : take}`,\n )\n return EXIT_OK\n }\n switch (cmd) {\n case 'render':\n return cmdRender(rest)\n case 'still':\n return cmdStill(rest)\n case 'info':\n return cmdInfo(rest)\n case 'versions':\n return cmdVersions(rest)\n case 'preview':\n return cmdPreview(rest)\n case 'check':\n return cmdCheck(rest)\n default:\n throw new UsageError(`unknown command \"${cmd}\" — run vos help`)\n }\n}\n\nmain()\n .then(async (code) => {\n // A run that succeeded while ignoring a flag it was given did not do\n // what was asked (flagUse.ts): say so, and do not exit 0.\n if (code === EXIT_OK) {\n const verb = process.argv[2] ?? ''\n const { HELP } = await import('./plugin/run')\n const documented = [\n ...helpFlagsFor(HELP_ENGINE, verb),\n ...helpFlagsFor(HELP, verb),\n ]\n const message = unusedFlagsMessage(verb, [...new Set(documented)])\n if (message) {\n process.stderr.write(`usage error: ${message}\\n`)\n process.exit(EXIT_USAGE)\n }\n }\n process.exit(code)\n })\n .catch((e) => {\n if (e instanceof UsageError) {\n process.stderr.write(`usage error: ${e.message}\\n`)\n process.exit(EXIT_USAGE)\n }\n if (e instanceof BrowserUnavailableError) {\n process.stderr.write(`${e.message}\\n`)\n process.exit(EXIT_NO_BROWSER)\n }\n process.stderr.write(\n `error: ${e instanceof Error ? e.message : String(e)}\\n`,\n )\n process.exit(EXIT_ERROR)\n })\n","/**\n * Output conventions (agent-safe by construction):\n * - logs/progress → stderr (human readable)\n * - results → stdout; with --json, NDJSON events (`{\"event\":\"phase\"...}` then\n * `{\"event\":\"done\"...}`) so scripts and agents never parse prose\n * - exit codes: 0 ok · 1 failure · 2 usage · 3 browser unavailable ·\n * 4 the recorder met a sign-in (the take pipeline's wall check)\n */\nexport const EXIT_OK = 0\nexport const EXIT_ERROR = 1\nexport const EXIT_USAGE = 2\nexport const EXIT_NO_BROWSER = 3\n\nexport interface Reporter {\n json: boolean\n /** Human log line (stderr; suppressed in --json mode). */\n log: (msg: string) => void\n /** Machine event (stdout NDJSON in --json mode; no-op otherwise). */\n event: (obj: Record<string, unknown>) => void\n /** Final result: NDJSON `done` event in --json mode, plain line otherwise. */\n done: (obj: Record<string, unknown>, humanLine: string) => void\n}\n\nexport function createReporter(json: boolean): Reporter {\n return {\n json,\n log: (msg) => {\n if (!json) process.stderr.write(`${msg}\\n`)\n },\n event: (obj) => {\n if (json) process.stdout.write(`${JSON.stringify(obj)}\\n`)\n },\n done: (obj, humanLine) => {\n if (json)\n process.stdout.write(`${JSON.stringify({ event: 'done', ...obj })}\\n`)\n else process.stdout.write(`${humanLine}\\n`)\n },\n }\n}\n","/**\n * `vos check` — the local validation pipeline, pure so it can be unit-tested:\n * envelope unwrap → migrate → schema → compile → determinism + dialect lints.\n * Everything runs locally (no network, no browser). The platform runs the\n * same compiler server-side, so a clean check is a push that will compile.\n */\nimport {\n CURRENT_CONFIG_VERSION,\n compileVosConfig,\n migrateConfig,\n programSize,\n vosConfigJsonSchema,\n} from '@vosjs/core'\nimport {\n lintVosConfig,\n lintVosDialect,\n lintVosAssets,\n lintVosFonts,\n lintVosPostprocessing,\n lintVosText,\n} from '@vosjs/core/lint'\nimport { STUDIO_ENTRY_ID, isLoweredRecording } from '@vosjs/studio-core'\nimport { assetParamIssues } from '@vosjs/shared/params'\nimport { knobWarnings } from './plugin/knobs'\n\nexport interface CheckIssue {\n level: 'error' | 'warn'\n source:\n | 'schema'\n | 'syntax'\n | 'compile'\n | 'determinism'\n | 'dialect'\n | 'shape'\n | 'fonts'\n | 'text'\n | 'assets'\n | 'postprocessing'\n message: string\n}\n\nexport interface CheckResult {\n ok: boolean\n errors: number\n warnings: number\n issues: CheckIssue[]\n /** The migrated config (params/presets untouched) — what a push should send. */\n config: Record<string, unknown> | null\n}\n\n// Top-level keys the schema does not know but the platform preserves on push.\nconst PLATFORM_EXTRA_KEYS = new Set(['params', 'presets'])\n\nexport function runCheck(parsed: unknown): CheckResult {\n const issues: CheckIssue[] = []\n const finish = (config: Record<string, unknown> | null): CheckResult => {\n const errors = issues.filter((i) => i.level === 'error').length\n return {\n ok: errors === 0,\n errors,\n warnings: issues.length - errors,\n issues,\n config,\n }\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n issues.push({\n level: 'error',\n source: 'shape',\n message: 'not a JSON object',\n })\n return finish(null)\n }\n\n // API endpoints wrap the config: { config: {...} } — accept both shapes.\n let obj = parsed as Record<string, unknown>\n if (\n typeof obj.config === 'object' &&\n obj.config !== null &&\n !('createTimeline' in obj)\n ) {\n obj = obj.config as Record<string, unknown>\n }\n\n const version = obj.version\n let migrated: Record<string, unknown>\n try {\n migrated = migrateConfig(obj) as Record<string, unknown>\n } catch (e) {\n issues.push({\n level: 'error',\n source: 'shape',\n message: `migration failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n return finish(null)\n }\n if (version === undefined) {\n // It compiles (the engine reads an absent version as the current one),\n // but a push is refused: a stored config must say which schema era it was\n // written against, and nobody can tell that from the file later.\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `config declares no \"version\". It plays here, but a push is refused without one. Add \"version\": ${CURRENT_CONFIG_VERSION}.`,\n })\n } else if (version !== CURRENT_CONFIG_VERSION) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `config is v${String(version)}, migrated to v${CURRENT_CONFIG_VERSION}. Save the migrated form.`,\n })\n }\n\n const schema = vosConfigJsonSchema.safeParse(migrated)\n if (!schema.success) {\n for (const i of schema.error.issues.slice(0, 10)) {\n issues.push({\n level: 'error',\n source: 'schema',\n message: `${i.path.join('.') || '(root)'}: ${i.message}`,\n })\n }\n return finish(null)\n }\n\n // Keys the platform's schema will silently drop on push (params/presets\n // excepted — those are re-attached by contract).\n const known = new Set([\n ...Object.keys(vosConfigJsonSchema.shape),\n ...PLATFORM_EXTRA_KEYS,\n ])\n for (const key of Object.keys(migrated)) {\n if (!known.has(key)) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `unknown top-level key \"${key}\" — the platform drops it on push`,\n })\n }\n }\n\n // A declared size with an odd edge renders, but an MP4 (H.264) cannot\n // carry it: say so before an export does.\n const size = programSize(migrated)\n if (size && (size.width % 2 || size.height % 2)) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `size ${size.width}x${size.height} has an odd edge; an MP4 needs even edges, so pick ${size.width + (size.width % 2)}x${size.height + (size.height % 2)}`,\n })\n }\n\n // Knobs and Looks vos.so would drop (the push still saves, without them).\n for (const message of knobWarnings(migrated as Record<string, unknown>)) {\n issues.push({ level: 'warn', source: 'shape', message })\n }\n // A file knob that names no declared file, or one nothing reads, is a\n // knob that does nothing: said here, because nothing later will say it.\n for (const message of assetParamIssues(migrated as Record<string, unknown>)) {\n issues.push({ level: 'warn', source: 'shape', message })\n }\n\n // Sound as an ELEMENT is not a track: no timeline row, no gain or fades,\n // nothing a render mixes, and a `data:` source inflates the config past\n // what a claimable push can carry. The document is where sound goes.\n const elements = Array.isArray(migrated.elements) ? migrated.elements : []\n for (const el of elements) {\n if (!el || typeof el !== 'object') continue\n const e = el as { type?: unknown; id?: unknown; src?: unknown }\n if (e.type !== 'audio') continue\n const inline =\n typeof e.src === 'string' && e.src.startsWith('data:')\n ? ` (embedded, ${Math.round(e.src.length / 1024)} KB of config)`\n : ''\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `audio element \"${String(e.id ?? '?')}\"${inline} is not a track: renders do not mix it and the studio cannot edit it. Put the file beside the config and name it in doc.json (audio: [{ key: \"score.ogg\", start, in, out, duration, gain }]); vos push uploads it`,\n })\n }\n\n // Function strings are pasted into the template as text, so the compiler\n // cannot see a syntax error — parse each one here (construction only,\n // nothing executes).\n let syntaxErrors = 0\n for (const key of [\n 'setup',\n 'createContent',\n 'createTimeline',\n 'onFrame',\n ] as const) {\n const src = migrated[key]\n if (typeof src !== 'string' || !src.length) continue\n try {\n new Function(`\"use strict\"; return (${src}\\n)`)\n } catch (e) {\n syntaxErrors++\n issues.push({\n level: 'error',\n source: 'syntax',\n message: `${key}: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n if (syntaxErrors) return finish(migrated)\n\n try {\n // Same options as `vos render` — a clean check is a config the CLI's own\n // render path will accept.\n compileVosConfig(migrated as never, { tweenEngine: 'vos' })\n } catch (e) {\n issues.push({\n level: 'error',\n source: 'compile',\n message: e instanceof Error ? e.message : String(e),\n })\n return finish(migrated)\n }\n\n // The studio's own layers ride a program document's composed config as a\n // stack entry, and a RECORDING's whole program is studio-core's: machinery\n // the author did not write, tested where it lives. Its lines are not the\n // author's, so they never reach the author's check; a finding in another\n // stack entry names the entry, since `setup:38` alone reads as the author's.\n const generated = isLoweredRecording(migrated)\n for (const i of lintVosConfig(migrated as never)) {\n if (i.entry === STUDIO_ENTRY_ID) continue\n if (!i.entry && generated) continue\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'determinism',\n message: `${i.entry ? `${i.entry} ` : ''}${i.fn}:${i.line} [${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosDialect(migrated as never)) {\n if (generated) break\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'dialect',\n message: `${i.fn}:${i.line} [${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosFonts(migrated as never)) {\n issues.push({\n level: 'warn',\n source: 'fonts',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosText(migrated as never)) {\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'text',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosAssets(migrated as never)) {\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'assets',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosPostprocessing(migrated as never)) {\n issues.push({\n level: 'warn',\n source: 'postprocessing',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n\n return finish(migrated)\n}\n","/**\n * What vos.so keeps of a config's knobs (`params`) and Looks (`presets`).\n *\n * A vos.so fact, so it lives in the platform client: the platform keeps at\n * most 12 knobs and 8 Looks, each within its field limits, and drops the\n * rest ONE BY ONE with a warning (it used to drop them all, silently). This\n * mirrors that rule so `vos check` says the same thing before a push does.\n */\nexport const MAX_PARAMS = 12\nexport const MAX_LOOKS = 8\n\nconst KINDS = new Set([\n 'number',\n 'color',\n 'select',\n 'toggle',\n 'text',\n 'font',\n 'asset',\n])\n\n/** The kinds of file a file knob may take: the manifest's own kinds. */\nconst FILE_KINDS = new Set(['image', 'video', 'audio', 'model', 'font', 'hdr'])\n\nconst str = (v: unknown, max: number, min = 0) =>\n typeof v === 'string' && v.length >= min && v.length <= max\n\n/** Why one knob would be dropped, or null when vos.so keeps it. */\nexport function knobProblem(p: unknown): string | null {\n if (!p || typeof p !== 'object') return 'not an object'\n const k = p as Record<string, unknown>\n if (!str(k.key, 40, 1)) return 'key must be 1 to 40 characters'\n if (typeof k.kind !== 'string' || !KINDS.has(k.kind))\n return `kind must be one of ${[...KINDS].join(', ')}`\n if (k.label !== undefined && !str(k.label, 60))\n return 'label: at most 60 characters'\n if (k.hint !== undefined && !str(k.hint, 140))\n return 'hint: at most 140 characters'\n if (k.unit !== undefined && !str(k.unit, 8))\n return 'unit: at most 8 characters'\n if (k.group !== undefined && !str(k.group, 24))\n return 'group: at most 24 characters'\n if (k.options !== undefined) {\n if (!Array.isArray(k.options) || k.options.length > 12)\n return 'options: at most 12'\n if (k.options.some((o) => !str(o, 40, 1)))\n return 'options: each 1 to 40 characters'\n }\n if (k.accept !== undefined) {\n const accept = Array.isArray(k.accept) ? k.accept : [k.accept]\n if (\n accept.length < 1 ||\n accept.length > FILE_KINDS.size ||\n accept.some((a) => typeof a !== 'string' || !FILE_KINDS.has(a))\n )\n return `accept: one or more of ${[...FILE_KINDS].join(', ')}`\n }\n // A file knob's value is the declared file's ref in \"assets\": it carries\n // no default of its own.\n if (k.kind === 'asset' && k.default === undefined) return null\n const d = k.default\n if (\n !(\n typeof d === 'number' ||\n typeof d === 'boolean' ||\n (typeof d === 'string' && d.length <= 280)\n )\n )\n return 'default must be a number, a boolean or at most 280 characters'\n return null\n}\n\n/** Why one Look would be dropped, or null when vos.so keeps it. */\nexport function lookProblem(l: unknown): string | null {\n if (!l || typeof l !== 'object') return 'not an object'\n const look = l as Record<string, unknown>\n if (!str(look.name, 24, 1)) return 'name must be 1 to 24 characters'\n if (!look.values || typeof look.values !== 'object') return 'values missing'\n return null\n}\n\n/** Every knob and Look vos.so would drop, in words, in order. */\nexport function knobWarnings(config: Record<string, unknown>): string[] {\n const out: string[] = []\n const sort = (\n raw: unknown,\n noun: 'knob' | 'look',\n field: string,\n max: number,\n problem: (e: unknown) => string | null,\n ) => {\n if (raw === undefined) return\n if (!Array.isArray(raw)) {\n out.push(`${noun === 'knob' ? 'params' : 'presets'} is not a list`)\n return\n }\n let kept = 0\n raw.forEach((entry, i) => {\n const id =\n entry && typeof (entry as Record<string, unknown>)[field] === 'string'\n ? `${noun} \"${String((entry as Record<string, unknown>)[field])}\"`\n : `${noun} #${i + 1}`\n const why = problem(entry)\n if (why) out.push(`${id} would be dropped on vos.so (${why})`)\n else if (kept >= max)\n out.push(\n `${id} would be dropped on vos.so: a vos keeps at most ${max} ${noun}s${noun === 'knob' ? ' (the rest can stay bound data)' : ''}`,\n )\n else kept += 1\n })\n }\n sort(config.params, 'knob', 'key', MAX_PARAMS, knobProblem)\n sort(config.presets, 'look', 'name', MAX_LOOKS, lookProblem)\n return out\n}\n","import {\n aspectLabel,\n programSize,\n resolveOutputSize,\n type ProgramSize,\n type ResolvedOutputSize,\n} from '@vosjs/core'\nimport { numFlag, UsageError, type ParsedArgs } from './args'\n\n/** The landscape size a verb uses for a program that declares none. */\nexport const RENDER_FALLBACK: ProgramSize = { width: 1920, height: 1080 }\nexport const STILL_FALLBACK: ProgramSize = { width: 1280, height: 720 }\n\nconst optNum = (\n flags: ParsedArgs['flags'],\n name: string,\n): number | undefined =>\n flags[name] === undefined ? undefined : numFlag(flags, name, 0)\n\n/**\n * Output pixels for a render or a still: `--width`/`--height` win, one of\n * them alone keeps the program's aspect, and neither means the program's own\n * `size` (else the verb's landscape fallback).\n *\n * Returns a note when the flags render a declared program at another aspect:\n * the program lays itself out in whatever frame it gets, so that is a\n * different picture, not a scaled one.\n */\nexport function outputSizeFor(\n config: Record<string, unknown>,\n flags: ParsedArgs['flags'],\n fallback: ProgramSize,\n): ResolvedOutputSize & { note?: string } {\n const declared = programSize(config)\n const width = optNum(flags, 'width')\n const height = optNum(flags, 'height')\n for (const [name, v] of [\n ['width', width],\n ['height', height],\n ] as const) {\n if (v !== undefined && !(v >= 1))\n throw new UsageError(`--${name} expects a positive number, got ${v}`)\n }\n const resolved = resolveOutputSize({ declared, width, height, fallback })\n if (\n declared &&\n resolved.source === 'flags' &&\n Math.abs(\n resolved.width / resolved.height - declared.width / declared.height,\n ) > 0.005\n ) {\n return {\n ...resolved,\n note: `rendering at ${resolved.width}x${resolved.height} (${aspectLabel(resolved)}); the program declares ${declared.width}x${declared.height} (${aspectLabel(declared)}) and lays itself out in the frame it gets`,\n }\n }\n return resolved\n}\n","/**\n * The sound a program document adds, for a LOCAL render of the program.\n *\n * A composed program carries its `doc.audio` clips on the studio stack entry,\n * exactly as a take does, and the capture page mixes them through the same\n * producer a take render uses. The one difference is WHERE the bytes are: a\n * capture page has no origin of its own, so a clip keyed by a file beside the\n * document (`score.ogg`) or by a hosted asset path (`/api/assets/…`) cannot be\n * fetched from inside it. Each is inlined as a `data:` URI here: a local file\n * read from disk, a hosted asset downloaded with the caller's credential.\n * A clip that cannot be reached is left out and said, never a silent track.\n */\nimport { readFile } from 'node:fs/promises'\nimport { audioProducerCode, studioEntryData } from '@vosjs/render-core'\nimport { studioAudioPlan } from '@vosjs/studio-core'\nimport { MEDIA_HEAD_BYTES, resolveMediaType } from './plugin/container'\nimport { bearerFor } from './plugin/platform'\nimport { localFile } from './programAssets'\nimport type { EnvelopePoint, LoweredAudioClip } from '@vosjs/studio-core'\n\nexport interface ProgramAudioOptions {\n /** The directory the document's relative keys are read against. */\n baseDir: string\n /** The output length the mix is cut to, seconds. */\n duration: number\n /** For a clip keyed by a hosted asset: where it lives and who may read it. */\n origin?: string\n key?: string | null\n log: (line: string) => void\n}\n\nexport interface ProgramAudio {\n producerCode: string\n clips: number\n}\n\nfunction dataUri(bytes: Uint8Array, filename: string): string {\n const { type } = resolveMediaType({\n head: bytes.subarray(0, MEDIA_HEAD_BYTES),\n filename,\n })\n return `data:${type};base64,${Buffer.from(bytes).toString('base64')}`\n}\n\nasync function reach(\n clipKey: string,\n opts: ProgramAudioOptions,\n): Promise<string | null> {\n if (/^(data:|https?:)/.test(clipKey)) return clipKey\n if (clipKey.startsWith('/api/')) {\n if (!opts.origin || !opts.key) {\n opts.log(\n `note: sound ${clipKey} is a hosted asset and no credential is set, so the render leaves it out (vos login, or keep the file beside the document)`,\n )\n return null\n }\n const res = await fetch(`${opts.origin}${clipKey}`, {\n headers: bearerFor(opts.key, opts.origin),\n })\n if (!res.ok) {\n opts.log(\n `note: sound ${clipKey} could not be read (${res.status}), so the render leaves it out`,\n )\n return null\n }\n return dataUri(new Uint8Array(await res.arrayBuffer()), clipKey)\n }\n // In the document's directory or below, never outside it: the bytes land\n // in a page the program's own code runs in.\n const local = localFile(clipKey.replace(/^\\/+/, ''), opts.baseDir)\n if ('refused' in local) {\n opts.log(\n `note: sound ${clipKey} is not beside the document, so the render leaves it out`,\n )\n return null\n }\n return dataUri(new Uint8Array(await readFile(local.file)), local.file)\n}\n\n/** The producer for a composed program's sound, or null when it adds none. */\nexport async function programAudio(\n config: Record<string, unknown>,\n opts: ProgramAudioOptions,\n): Promise<ProgramAudio | null> {\n const entry = studioEntryData(config.stack)\n const clips = Array.isArray(entry?.audio)\n ? (entry.audio as LoweredAudioClip[])\n : []\n if (!clips.length) return null\n const reached: LoweredAudioClip[] = []\n for (const clip of clips) {\n const key = await reach(clip.key, opts)\n if (key) reached.push({ ...clip, key })\n }\n if (!reached.length) return null\n const duckEnv = Array.isArray(entry?.duckEnv)\n ? (entry.duckEnv as EnvelopePoint[])\n : []\n const plan = studioAudioPlan(reached, duckEnv, opts.duration)\n return {\n producerCode: audioProducerCode({ plan }),\n clips: reached.length,\n }\n}\n"],"mappings":"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","names":["programSize","programSize","aspectLabel","programSize","programSize","aspectLabel","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/output.ts","../src/check.ts","../src/plugin/knobs.ts","../src/outputSize.ts","../src/programAudio.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport { existsSync, readFileSync, statSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport { createServer } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { parseArgs, numFlag, UsageError } from './args'\nimport { helpFlagsFor, unusedFlagsMessage } from './flagUse'\nimport {\n createReporter,\n EXIT_ERROR,\n EXIT_NO_BROWSER,\n EXIT_OK,\n EXIT_USAGE,\n} from './output'\nimport {\n loadVosConfig,\n configDuration,\n directoryKind,\n loadProgramDirectory,\n readSourceText,\n} from './loadConfig'\nimport { launchBrowser, BrowserUnavailableError } from './browser'\nimport {\n inspectStill,\n previewPages,\n reencodeStill,\n renderStill,\n renderVideo,\n stillWarnings,\n} from './render'\nimport { runCheck } from './check'\nimport { outputSizeFor, RENDER_FALLBACK, STILL_FALLBACK } from './outputSize'\nimport { aspectLabel, programSize } from '@vosjs/core'\nimport { programAudio } from './programAudio'\nimport {\n ASSET_ROUTE,\n missingManifestFiles,\n programAssets,\n serveFile,\n} from './programAssets'\nimport type { ProgramAssets } from './programAssets'\nimport {\n applyDataSets,\n parseTimes,\n setFlags,\n stillFormat,\n stillOutFor,\n videoFormat,\n} from './outputs'\nimport { platformOrigin, resolveCredential } from './plugin/platform'\n\nconst BOOLEAN_FLAGS = new Set(['json', 'help', 'version'])\n\nconst HELP_ENGINE = `vos — command line for the vos programmatic video engine (https://vos.so/engine)\n\nEngine verbs (local, no account, no network beyond the render page's CDN deps)\n vos render <config.json|url|take> [out.mp4|out.webm] [--width] [--height] [--fps 30]\n [--duration <s>] [--format webm|mp4] [--set data.<key>=<value>]... [--json]\n the output's name picks the container; a program document's sound is mixed in\n size: the program's own \"size\" (else 1920x1080; a still, 1280x720); one of\n --width/--height keeps the program's aspect, both set the frame\n vos still <config.json|url> [out.webp|out.png|out.jpg] [--time 0 | --times 0,1.5,50%]\n [--width] [--height] [--set data.<key>=<value>]... [--json]\n vos info <config.json|url|take> [--json]\n a take: its steps per media in source seconds, and every segment, span,\n layer and sound in output seconds after trims and speed\n vos check <config.json|url> [--json]\n migrate → schema → syntax → compile → determinism/dialect lints, all local\n vos preview <config.json|url> [--port 0]\n vos versions [--json]\n`\n\nconst HELP_CONVENTIONS = `\nConventions\n Results go to stdout; logs go to stderr. --json switches stdout to NDJSON\n events ending with {\"event\":\"done\",…}. Exit codes: 0 ok, 1 error, 2 usage,\n 3 no browser available, 4 the recorder met a sign-in instead of the page\n it was asked for (nothing was recorded; it needs a session, not a new\n script). vos <verb> --help prints that verb's flags.\n`\n\n/** An `audio` element in the config: something a render never mixes. */\nfunction hasAudioElements(config: unknown): boolean {\n const elements = (config as { elements?: unknown }).elements\n return (\n Array.isArray(elements) &&\n elements.some(\n (e) =>\n !!e &&\n typeof e === 'object' &&\n (e as { type?: unknown }).type === 'audio',\n )\n )\n}\n\nfunction outName(source: string, ext: string): string {\n const base = basename(source).replace(/\\.[a-z0-9]+$/i, '') || 'vos'\n return `${base}.${ext}`\n}\n\n/** Where a source's relative files are read against; null for a URL. */\nfunction baseDirOf(source: string): string | null {\n if (/^https?:\\/\\//.test(source)) return null\n return existsSync(source) && statSync(source).isDirectory()\n ? source\n : dirname(source)\n}\n\n/** The program's declared files (`config.assets`), reachable for a page. */\nfunction assetsFor(\n source: string,\n config: Record<string, unknown>,\n log: (line: string) => void,\n): Promise<ProgramAssets | null> {\n return programAssets(config, {\n // A config loaded from a URL has no directory: it reads no local file.\n baseDir: baseDirOf(source),\n origin: platformOrigin({}),\n key: resolveCredential(),\n log: (line) => log(line),\n })\n}\n\nasync function cmdRender(argv: string[]): Promise<number> {\n // Polymorphic render: a take DIRECTORY (its doc.json is a recording\n // document) renders through the plugin; a program directory (config.json,\n // composed with a program document when one sits beside it) and every\n // other source are engine config renders. A deterministic sniff, never a\n // flag — and the sniff reads the document, because a program directory\n // carries a doc.json too.\n const first = argv.find((a) => !a.startsWith('-'))\n if (first && directoryKind(first) === 'take') {\n return delegate(['render', ...argv])\n }\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos render <config.json|url|take> [out]')\n const r = createReporter(flags.json === true)\n const format = videoFormat(\n flags.format === undefined ? undefined : String(flags.format),\n positionals[1],\n )\n\n const loaded = await loadVosConfig(source)\n for (const w of loaded.warnings) r.log(`note: ${w}`)\n void flags.set\n const config = applyDataSets(\n loaded.config as Record<string, unknown>,\n setFlags(argv),\n )\n const duration = numFlag(flags, 'duration', configDuration(config) ?? 5)\n const size = outputSizeFor(config, flags, RENDER_FALLBACK)\n if (size.note) r.log(`note: ${size.note}`)\n const { width, height } = size\n const fps = numFlag(flags, 'fps', 30)\n const out = positionals[1] ?? outName(source, format)\n\n // A program document's sound rides its studio entry; mix it like a take's.\n const audio = await programAudio(config as Record<string, unknown>, {\n baseDir:\n existsSync(source) && statSync(source).isDirectory()\n ? source\n : dirname(source),\n duration,\n origin: platformOrigin({}),\n key: resolveCredential(),\n log: (line) => r.log(line),\n })\n if (audio) r.log(`mixing ${audio.clips} sound${audio.clips === 1 ? '' : 's'}`)\n if (hasAudioElements(config)) {\n r.log(\n 'note: an audio ELEMENT is not mixed by a render; put the sound on the program document instead (doc.json audio: [{ key, start, in, out, duration, gain }])',\n )\n }\n\n const assets = await assetsFor(source, config, (line) => r.log(line))\n\n const browser = await launchBrowser()\n try {\n const result = await renderVideo(browser, {\n config,\n assets,\n width,\n height,\n fps,\n duration,\n format,\n audioProducerCode: audio?.producerCode,\n onPhase: (phase) => {\n r.log(`${phase}…`)\n r.event({ event: 'phase', phase })\n },\n })\n await writeFile(out, result.bytes)\n const warnings = stillWarnings(\n { transparent: false, flat: false },\n result.pageErrors,\n result.engineNotes,\n )\n for (const w of warnings) r.log(`warn: ${w}`)\n r.done(\n {\n out,\n bytes: result.bytes.length,\n width,\n height,\n fps,\n duration,\n format,\n audio: audio?.clips ?? 0,\n ...(warnings.length ? { warnings } : {}),\n },\n `Wrote ${out} (${(result.bytes.length / 1024).toFixed(0)} KB, ${width}x${height}@${fps}, ${duration}s)`,\n )\n return EXIT_OK\n } finally {\n await browser.close()\n }\n}\n\nasync function cmdStill(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source)\n throw new UsageError(\n 'vos still <config.json|url> [out.webp|out.png|out.jpg] [--time t | --times a,b,50%]',\n )\n const r = createReporter(flags.json === true)\n\n const loaded = await loadVosConfig(source)\n for (const w of loaded.warnings) r.log(`note: ${w}`)\n void flags.set\n const config = applyDataSets(\n loaded.config as Record<string, unknown>,\n setFlags(argv),\n )\n const size = outputSizeFor(config, flags, STILL_FALLBACK)\n if (size.note) r.log(`note: ${size.note}`)\n const { width, height } = size\n const out = positionals[1] ?? outName(source, 'webp')\n const encoding = stillFormat(out)\n const timesRaw = flags.times === undefined ? undefined : String(flags.times)\n if (timesRaw !== undefined && flags.time !== undefined)\n throw new UsageError('--time and --times: pass one')\n const times =\n timesRaw !== undefined\n ? parseTimes(timesRaw, configDuration(config) ?? 5)\n : [numFlag(flags, 'time', 0)]\n const many = times.length > 1\n const assets = await assetsFor(source, config, (line) => r.log(line))\n\n // One browser for every time: each still is its own capture page.\n const browser = await launchBrowser()\n try {\n const written: {\n out: string\n bytes: number\n time: number\n warnings?: string[]\n }[] = []\n for (const time of times) {\n const target = stillOutFor(out, time, many)\n const result = await renderStill(browser, {\n config,\n assets,\n width,\n height,\n time,\n onPhase: (phase) => {\n r.event({ event: 'phase', phase, time })\n },\n })\n // The engine captures WebP; a .png or .jpg name is re-encoded in the\n // page, so the bytes always match the name.\n const bytes =\n encoding === 'webp'\n ? result.bytes\n : await reencodeStill(browser, result.bytes, encoding)\n await writeFile(target, bytes)\n // A still is checked before anyone looks at it: a fully transparent\n // or flat frame is written, and said, never passed off as a picture.\n const warnings = stillWarnings(\n await inspectStill(browser, result.bytes),\n result.pageErrors,\n result.engineNotes,\n )\n written.push({\n out: target,\n bytes: bytes.length,\n time,\n ...(warnings.length ? { warnings } : {}),\n })\n r.log(\n `Wrote ${target} (${(bytes.length / 1024).toFixed(0)} KB @ t=${Number(time.toFixed(2))}s)`,\n )\n for (const w of warnings)\n r.log(`warn: t=${Number(time.toFixed(2))}s ${w}`)\n }\n const first = written[0]\n r.done(\n many\n ? { stills: written, width, height, format: encoding }\n : { ...first, width, height, format: encoding },\n many\n ? `Wrote ${written.length} stills (${width}x${height})`\n : `Wrote ${first.out} (${(first.bytes / 1024).toFixed(0)} KB, ${width}x${height} @ t=${first.time}s)`,\n )\n return EXIT_OK\n } finally {\n await browser.close()\n }\n}\n\nasync function cmdInfo(argv: string[]): Promise<number> {\n // A take DIRECTORY reads as the take's two clocks (its steps in source\n // seconds, its cut in output seconds), through the take pipeline; every\n // other source is a program config. The same sniff as render.\n const first = argv.find((a) => !a.startsWith('-'))\n if (first && directoryKind(first) === 'take') {\n return delegate(['info', ...argv])\n }\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos info <config.json|url|take>')\n const r = createReporter(flags.json === true)\n\n const { config, warnings } = await loadVosConfig(source)\n const elements = Array.isArray(config.elements) ? config.elements.length : 0\n const data =\n typeof config.data === 'object' && config.data !== null\n ? Object.keys(config.data)\n : []\n const fns = ['setup', 'createContent', 'createTimeline', 'onFrame'].filter(\n (k) => typeof config[k] === 'string',\n )\n const declared = programSize(config)\n const info = {\n version: config.version,\n duration: configDuration(config) ?? null,\n size: declared ?? null,\n camera:\n (config.camera as Record<string, unknown> | undefined)?.preset ?? null,\n elements,\n dataKeys: data,\n functions: fns,\n warnings,\n }\n if (r.json) r.done(info, '')\n else {\n for (const w of warnings) r.log(`note: ${w}`)\n process.stdout.write(\n `version: v${String(info.version)}\\n` +\n `duration: ${info.duration === null ? '(none)' : `${info.duration}s`}\\n` +\n `size: ${declared ? `${declared.width}x${declared.height} (${aspectLabel(declared)})` : '(none declared; render 1920x1080, still 1280x720)'}\\n` +\n `camera: ${String(info.camera ?? '(default)')}\\n` +\n `elements: ${elements}\\n` +\n `data keys: ${data.length ? data.join(', ') : '(none)'}\\n` +\n `functions: ${fns.join(', ')}\\n`,\n )\n }\n return EXIT_OK\n}\n\nfunction packageVersion(name: string): string | null {\n const require = createRequire(import.meta.url)\n // Fast path — packages that export ./package.json (e.g. playwright).\n try {\n return (require(`${name}/package.json`) as { version: string }).version\n } catch {\n // Strict `exports` maps (the @vosjs packages) hide package.json — resolve\n // the entry module instead and walk up to the owning package.json.\n }\n let entry: string | null = null\n try {\n entry = fileURLToPath(import.meta.resolve(name))\n } catch {\n try {\n entry = require.resolve(name)\n } catch {\n return null\n }\n }\n let dir = dirname(entry)\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, 'package.json'), 'utf8'),\n ) as {\n name?: string\n version?: string\n }\n if (pkg.name === name && pkg.version) return pkg.version\n } catch {\n // keep walking\n }\n const parent = dirname(dir)\n if (parent === dir) return null\n dir = parent\n }\n return null\n}\n\nfunction ownVersion(): string {\n try {\n const own = JSON.parse(\n readFileSync(\n fileURLToPath(new URL('../package.json', import.meta.url)),\n 'utf8',\n ),\n ) as { version: string }\n return own.version\n } catch {\n return '(unknown)'\n }\n}\n\nasync function cmdVersions(argv: string[]): Promise<number> {\n const { flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const r = createReporter(flags.json === true)\n const versions: Record<string, string> = {}\n versions['@vosjs/cli'] = ownVersion()\n for (const name of [\n '@vosjs/core',\n '@vosjs/elements',\n '@vosjs/tween',\n '@vosjs/editor',\n '@vosjs/timeline',\n '@vosjs/studio-core',\n '@vosjs/render-core',\n '@vosjs/shared',\n 'mediabunny',\n 'playwright',\n ]) {\n versions[name] = packageVersion(name) ?? '(not found)'\n }\n if (r.json) r.done({ versions }, '')\n else\n for (const [k, v] of Object.entries(versions))\n process.stdout.write(`${k} ${v}\\n`)\n return EXIT_OK\n}\n\nasync function cmdPreview(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos preview <config.json|url> [--port 0]')\n const r = createReporter(false)\n const { config, warnings } = await loadVosConfig(source)\n for (const w of warnings) r.log(`note: ${w}`)\n const assets = await assetsFor(source, config, (line) => r.log(line))\n const { hostHtml, playerHtml } = previewPages(config, assets)\n const server = createServer((req, res) => {\n const path = new URL(req.url ?? '/', 'http://x').pathname\n // The program's declared files, served from disk under their route.\n if (path.startsWith(ASSET_ROUTE)) {\n const file = assets?.files[path]\n if (!file) {\n res.writeHead(404).end('no such declared file')\n return\n }\n const answer = serveFile(file, req.headers.range)\n res.writeHead(answer.status, answer.headers).end(answer.body)\n return\n }\n res.writeHead(200, { 'content-type': 'text/html' })\n res.end(path === '/player' ? playerHtml : hostHtml)\n })\n const port = numFlag(flags, 'port', 0)\n // Loopback only: this server hands out the program's files.\n await new Promise<void>((resolve) =>\n server.listen(port, '127.0.0.1', resolve),\n )\n const addr = server.address()\n const url = `http://127.0.0.1:${typeof addr === 'object' && addr ? addr.port : port}/`\n process.stdout.write(`${url}\\n`)\n r.log('Serving playback preview — Ctrl-C to stop.')\n await new Promise(() => {}) // keep alive until interrupted\n return EXIT_OK\n}\n\nasync function cmdCheck(argv: string[]): Promise<number> {\n const { positionals, flags } = parseArgs(argv, BOOLEAN_FLAGS)\n const source = positionals[0]\n if (!source) throw new UsageError('vos check <config.json>')\n const r = createReporter(flags.json === true)\n\n // A directory is a take (refused here: its document is `vos validate`'s\n // job) or a program directory (config.json, composed with the program\n // document beside it so the ladder reads the layers' strings too).\n const kind = /^https?:\\/\\//.test(source) ? 'none' : directoryKind(source)\n if (kind === 'take') {\n throw new UsageError(\n `${source} is a take (its doc.json is a recording document). vos validate ${source} lints it; vos render ${source} renders it.`,\n )\n }\n let raw: string\n let parsed: unknown\n try {\n if (kind === 'program') {\n const notes: string[] = []\n parsed = await loadProgramDirectory(source, notes)\n for (const n of notes) r.log(`note: ${n}`)\n raw = ''\n } else {\n raw = await readSourceText(source)\n parsed = JSON.parse(raw)\n }\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e\n parsed = undefined\n if (!r.json) process.stdout.write(`error [json] ${(e as Error).message}\\n`)\n r.done(\n {\n ok: false,\n errors: 1,\n warnings: 0,\n issues: [\n { level: 'error', source: 'json', message: (e as Error).message },\n ],\n },\n `${source}: 1 error`,\n )\n return EXIT_ERROR\n }\n\n const result = runCheck(parsed)\n // What only a check that knows where the config lives can say: a declared\n // file that is not there, and a hosted file named in code.\n if (result.config) {\n const baseDir = baseDirOf(source)\n const { hostedLiteralWarnings } = await import('./plugin/assetManifest')\n const extra = [\n ...(baseDir ? missingManifestFiles(result.config, baseDir) : []),\n ...hostedLiteralWarnings(result.config),\n ]\n for (const message of extra) {\n result.issues.push({ level: 'warn', source: 'assets', message })\n result.warnings++\n }\n }\n if (r.json) {\n r.done(\n {\n ok: result.ok,\n errors: result.errors,\n warnings: result.warnings,\n issues: result.issues,\n },\n '',\n )\n } else {\n for (const i of result.issues) {\n process.stdout.write(`${i.level} [${i.source}] ${i.message}\\n`)\n }\n process.stdout.write(\n result.ok\n ? `${source}: ok (${result.warnings} warning${result.warnings === 1 ? '' : 's'})\\n`\n : `${source}: ${result.errors} error${result.errors === 1 ? '' : 's'}, ${result.warnings} warning${result.warnings === 1 ? '' : 's'}\\n`,\n )\n }\n return result.ok ? EXIT_OK : EXIT_ERROR\n}\n\n// ---------------------------------------------------------------------------\n// Every verb this file does not own is a take-pipeline or vos.so verb from\n// `./plugin` (what used to ship separately as @vosso/vos-plugin). It loads on\n// demand, so the engine verbs never pay for the recorder's imports.\n// ---------------------------------------------------------------------------\n\nasync function delegate(argv: string[]): Promise<number> {\n const { run } = await import('./plugin/run')\n return await run(argv)\n}\n\nasync function printHelp(): Promise<void> {\n process.stdout.write(HELP_ENGINE)\n const { manifest } = await import('./plugin/manifest')\n process.stdout.write('\\nTake pipeline + vos.so verbs\\n')\n for (const v of manifest.verbs) {\n if (v.name === 'render') continue // polymorphic — already listed above\n process.stdout.write(` vos ${v.name.padEnd(8)} ${v.summary}\\n`)\n }\n process.stdout.write(HELP_CONVENTIONS)\n}\n\nconst ENGINE_VERBS = new Set([\n 'render',\n 'still',\n 'info',\n 'versions',\n 'preview',\n 'check',\n])\n\nasync function main(): Promise<number> {\n const [cmd, ...rest] = process.argv.slice(2)\n if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {\n await printHelp()\n return cmd ? EXIT_OK : EXIT_USAGE\n }\n if (cmd === '--version') return cmdVersions(['--json'])\n if (!ENGINE_VERBS.has(cmd)) return delegate([cmd, ...rest])\n // An engine verb asked for its flags: the engine's usage lines, plus the\n // take pipeline's where the verb is shared (render takes a config OR a take).\n if (rest.includes('--help') || rest.includes('-h')) {\n const engine = HELP_ENGINE.split('\\n').filter((l) =>\n l.startsWith(` vos ${cmd} `),\n )\n const { verbHelp } = await import('./plugin/run')\n const take = verbHelp(cmd)\n process.stdout.write(\n `${engine.join('\\n')}\\n${take.includes('no such verb') ? '' : take}`,\n )\n return EXIT_OK\n }\n switch (cmd) {\n case 'render':\n return cmdRender(rest)\n case 'still':\n return cmdStill(rest)\n case 'info':\n return cmdInfo(rest)\n case 'versions':\n return cmdVersions(rest)\n case 'preview':\n return cmdPreview(rest)\n case 'check':\n return cmdCheck(rest)\n default:\n throw new UsageError(`unknown command \"${cmd}\" — run vos help`)\n }\n}\n\nmain()\n .then(async (code) => {\n // A run that succeeded while ignoring a flag it was given did not do\n // what was asked (flagUse.ts): say so, and do not exit 0.\n if (code === EXIT_OK) {\n const verb = process.argv[2] ?? ''\n const { HELP } = await import('./plugin/run')\n const documented = [\n ...helpFlagsFor(HELP_ENGINE, verb),\n ...helpFlagsFor(HELP, verb),\n ]\n const message = unusedFlagsMessage(verb, [...new Set(documented)])\n if (message) {\n process.stderr.write(`usage error: ${message}\\n`)\n process.exit(EXIT_USAGE)\n }\n }\n process.exit(code)\n })\n .catch((e) => {\n if (e instanceof UsageError) {\n process.stderr.write(`usage error: ${e.message}\\n`)\n process.exit(EXIT_USAGE)\n }\n if (e instanceof BrowserUnavailableError) {\n process.stderr.write(`${e.message}\\n`)\n process.exit(EXIT_NO_BROWSER)\n }\n process.stderr.write(\n `error: ${e instanceof Error ? e.message : String(e)}\\n`,\n )\n process.exit(EXIT_ERROR)\n })\n","/**\n * Output conventions (agent-safe by construction):\n * - logs/progress → stderr (human readable)\n * - results → stdout; with --json, NDJSON events (`{\"event\":\"phase\"...}` then\n * `{\"event\":\"done\"...}`) so scripts and agents never parse prose\n * - exit codes: 0 ok · 1 failure · 2 usage · 3 browser unavailable ·\n * 4 the recorder met a sign-in (the take pipeline's wall check)\n */\nexport const EXIT_OK = 0\nexport const EXIT_ERROR = 1\nexport const EXIT_USAGE = 2\nexport const EXIT_NO_BROWSER = 3\n\nexport interface Reporter {\n json: boolean\n /** Human log line (stderr; suppressed in --json mode). */\n log: (msg: string) => void\n /** Machine event (stdout NDJSON in --json mode; no-op otherwise). */\n event: (obj: Record<string, unknown>) => void\n /** Final result: NDJSON `done` event in --json mode, plain line otherwise. */\n done: (obj: Record<string, unknown>, humanLine: string) => void\n}\n\nexport function createReporter(json: boolean): Reporter {\n return {\n json,\n log: (msg) => {\n if (!json) process.stderr.write(`${msg}\\n`)\n },\n event: (obj) => {\n if (json) process.stdout.write(`${JSON.stringify(obj)}\\n`)\n },\n done: (obj, humanLine) => {\n if (json)\n process.stdout.write(`${JSON.stringify({ event: 'done', ...obj })}\\n`)\n else process.stdout.write(`${humanLine}\\n`)\n },\n }\n}\n","/**\n * `vos check` — the local validation pipeline, pure so it can be unit-tested:\n * envelope unwrap → migrate → schema → compile → determinism + dialect lints.\n * Everything runs locally (no network, no browser). The platform runs the\n * same compiler server-side, so a clean check is a push that will compile.\n */\nimport {\n CURRENT_CONFIG_VERSION,\n compileVosConfig,\n migrateConfig,\n programSize,\n vosConfigJsonSchema,\n} from '@vosjs/core'\nimport {\n lintVosConfig,\n lintVosDialect,\n lintVosAssets,\n lintVosFonts,\n lintVosPostprocessing,\n lintVosText,\n} from '@vosjs/core/lint'\nimport { STUDIO_ENTRY_ID, isLoweredRecording } from '@vosjs/studio-core'\nimport { assetParamIssues } from '@vosjs/shared/params'\nimport { knobWarnings } from './plugin/knobs'\n\nexport interface CheckIssue {\n level: 'error' | 'warn'\n source:\n | 'schema'\n | 'syntax'\n | 'compile'\n | 'determinism'\n | 'dialect'\n | 'shape'\n | 'fonts'\n | 'text'\n | 'assets'\n | 'postprocessing'\n message: string\n}\n\nexport interface CheckResult {\n ok: boolean\n errors: number\n warnings: number\n issues: CheckIssue[]\n /** The migrated config (params/presets untouched) — what a push should send. */\n config: Record<string, unknown> | null\n}\n\n// Top-level keys the schema does not know but the platform preserves on push.\nconst PLATFORM_EXTRA_KEYS = new Set(['params', 'presets'])\n\nexport function runCheck(parsed: unknown): CheckResult {\n const issues: CheckIssue[] = []\n const finish = (config: Record<string, unknown> | null): CheckResult => {\n const errors = issues.filter((i) => i.level === 'error').length\n return {\n ok: errors === 0,\n errors,\n warnings: issues.length - errors,\n issues,\n config,\n }\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n issues.push({\n level: 'error',\n source: 'shape',\n message: 'not a JSON object',\n })\n return finish(null)\n }\n\n // API endpoints wrap the config: { config: {...} } — accept both shapes.\n let obj = parsed as Record<string, unknown>\n if (\n typeof obj.config === 'object' &&\n obj.config !== null &&\n !('createTimeline' in obj)\n ) {\n obj = obj.config as Record<string, unknown>\n }\n\n const version = obj.version\n let migrated: Record<string, unknown>\n try {\n migrated = migrateConfig(obj) as Record<string, unknown>\n } catch (e) {\n issues.push({\n level: 'error',\n source: 'shape',\n message: `migration failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n return finish(null)\n }\n if (version === undefined) {\n // It compiles (the engine reads an absent version as the current one),\n // but a push is refused: a stored config must say which schema era it was\n // written against, and nobody can tell that from the file later.\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `config declares no \"version\". It plays here, but a push is refused without one. Add \"version\": ${CURRENT_CONFIG_VERSION}.`,\n })\n } else if (version !== CURRENT_CONFIG_VERSION) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `config is v${String(version)}, migrated to v${CURRENT_CONFIG_VERSION}. Save the migrated form.`,\n })\n }\n\n const schema = vosConfigJsonSchema.safeParse(migrated)\n if (!schema.success) {\n for (const i of schema.error.issues.slice(0, 10)) {\n issues.push({\n level: 'error',\n source: 'schema',\n message: `${i.path.join('.') || '(root)'}: ${i.message}`,\n })\n }\n return finish(null)\n }\n\n // Keys the platform's schema will silently drop on push (params/presets\n // excepted — those are re-attached by contract).\n const known = new Set([\n ...Object.keys(vosConfigJsonSchema.shape),\n ...PLATFORM_EXTRA_KEYS,\n ])\n for (const key of Object.keys(migrated)) {\n if (!known.has(key)) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `unknown top-level key \"${key}\" — the platform drops it on push`,\n })\n }\n }\n\n // A declared size with an odd edge renders, but an MP4 (H.264) cannot\n // carry it: say so before an export does.\n const size = programSize(migrated)\n if (size && (size.width % 2 || size.height % 2)) {\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `size ${size.width}x${size.height} has an odd edge; an MP4 needs even edges, so pick ${size.width + (size.width % 2)}x${size.height + (size.height % 2)}`,\n })\n }\n\n // Knobs and Looks vos.so would drop (the push still saves, without them).\n for (const message of knobWarnings(migrated as Record<string, unknown>)) {\n issues.push({ level: 'warn', source: 'shape', message })\n }\n // A file knob that names no declared file, or one nothing reads, is a\n // knob that does nothing: said here, because nothing later will say it.\n for (const message of assetParamIssues(migrated as Record<string, unknown>)) {\n issues.push({ level: 'warn', source: 'shape', message })\n }\n\n // Sound as an ELEMENT is not a track: no timeline row, no gain or fades,\n // nothing a render mixes, and a `data:` source inflates the config past\n // what a claimable push can carry. The document is where sound goes.\n const elements = Array.isArray(migrated.elements) ? migrated.elements : []\n for (const el of elements) {\n if (!el || typeof el !== 'object') continue\n const e = el as { type?: unknown; id?: unknown; src?: unknown }\n if (e.type !== 'audio') continue\n const inline =\n typeof e.src === 'string' && e.src.startsWith('data:')\n ? ` (embedded, ${Math.round(e.src.length / 1024)} KB of config)`\n : ''\n issues.push({\n level: 'warn',\n source: 'shape',\n message: `audio element \"${String(e.id ?? '?')}\"${inline} is not a track: renders do not mix it and the studio cannot edit it. Put the file beside the config and name it in doc.json (audio: [{ key: \"score.ogg\", start, in, out, duration, gain }]); vos push uploads it`,\n })\n }\n\n // Function strings are pasted into the template as text, so the compiler\n // cannot see a syntax error — parse each one here (construction only,\n // nothing executes).\n let syntaxErrors = 0\n for (const key of [\n 'setup',\n 'createContent',\n 'createTimeline',\n 'onFrame',\n ] as const) {\n const src = migrated[key]\n if (typeof src !== 'string' || !src.length) continue\n try {\n new Function(`\"use strict\"; return (${src}\\n)`)\n } catch (e) {\n syntaxErrors++\n issues.push({\n level: 'error',\n source: 'syntax',\n message: `${key}: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n if (syntaxErrors) return finish(migrated)\n\n try {\n // Same options as `vos render` — a clean check is a config the CLI's own\n // render path will accept.\n compileVosConfig(migrated as never, { tweenEngine: 'vos' })\n } catch (e) {\n issues.push({\n level: 'error',\n source: 'compile',\n message: e instanceof Error ? e.message : String(e),\n })\n return finish(migrated)\n }\n\n // The studio's own layers ride a program document's composed config as a\n // stack entry, and a RECORDING's whole program is studio-core's: machinery\n // the author did not write, tested where it lives. Its lines are not the\n // author's, so they never reach the author's check; a finding in another\n // stack entry names the entry, since `setup:38` alone reads as the author's.\n const generated = isLoweredRecording(migrated)\n for (const i of lintVosConfig(migrated as never)) {\n if (i.entry === STUDIO_ENTRY_ID) continue\n if (!i.entry && generated) continue\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'determinism',\n message: `${i.entry ? `${i.entry} ` : ''}${i.fn}:${i.line} [${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosDialect(migrated as never)) {\n if (generated) break\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'dialect',\n message: `${i.fn}:${i.line} [${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosFonts(migrated as never)) {\n issues.push({\n level: 'warn',\n source: 'fonts',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosText(migrated as never)) {\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'text',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosAssets(migrated as never)) {\n issues.push({\n level: i.severity === 'error' ? 'error' : 'warn',\n source: 'assets',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n for (const i of lintVosPostprocessing(migrated as never)) {\n issues.push({\n level: 'warn',\n source: 'postprocessing',\n message: `[${i.rule}] ${i.message}`,\n })\n }\n\n return finish(migrated)\n}\n","/**\n * What vos.so keeps of a config's knobs (`params`) and Looks (`presets`).\n *\n * A vos.so fact, so it lives in the platform client: the platform keeps at\n * most 12 knobs and 8 Looks, each within its field limits, and drops the\n * rest ONE BY ONE with a warning (it used to drop them all, silently). This\n * mirrors that rule so `vos check` says the same thing before a push does.\n */\nexport const MAX_PARAMS = 12\nexport const MAX_LOOKS = 8\n\nconst KINDS = new Set([\n 'number',\n 'color',\n 'select',\n 'toggle',\n 'text',\n 'font',\n 'asset',\n])\n\n/** The kinds of file a file knob may take: the manifest's own kinds. */\nconst FILE_KINDS = new Set(['image', 'video', 'audio', 'model', 'font', 'hdr'])\n\nconst str = (v: unknown, max: number, min = 0) =>\n typeof v === 'string' && v.length >= min && v.length <= max\n\n/** Why one knob would be dropped, or null when vos.so keeps it. */\nexport function knobProblem(p: unknown): string | null {\n if (!p || typeof p !== 'object') return 'not an object'\n const k = p as Record<string, unknown>\n if (!str(k.key, 40, 1)) return 'key must be 1 to 40 characters'\n if (typeof k.kind !== 'string' || !KINDS.has(k.kind))\n return `kind must be one of ${[...KINDS].join(', ')}`\n if (k.label !== undefined && !str(k.label, 60))\n return 'label: at most 60 characters'\n if (k.hint !== undefined && !str(k.hint, 140))\n return 'hint: at most 140 characters'\n if (k.unit !== undefined && !str(k.unit, 8))\n return 'unit: at most 8 characters'\n if (k.group !== undefined && !str(k.group, 24))\n return 'group: at most 24 characters'\n if (k.options !== undefined) {\n if (!Array.isArray(k.options) || k.options.length > 12)\n return 'options: at most 12'\n if (k.options.some((o) => !str(o, 40, 1)))\n return 'options: each 1 to 40 characters'\n }\n if (k.accept !== undefined) {\n const accept = Array.isArray(k.accept) ? k.accept : [k.accept]\n if (\n accept.length < 1 ||\n accept.length > FILE_KINDS.size ||\n accept.some((a) => typeof a !== 'string' || !FILE_KINDS.has(a))\n )\n return `accept: one or more of ${[...FILE_KINDS].join(', ')}`\n }\n // A file knob's value is the declared file's ref in \"assets\": it carries\n // no default of its own.\n if (k.kind === 'asset' && k.default === undefined) return null\n const d = k.default\n if (\n !(\n typeof d === 'number' ||\n typeof d === 'boolean' ||\n (typeof d === 'string' && d.length <= 280)\n )\n )\n return 'default must be a number, a boolean or at most 280 characters'\n return null\n}\n\n/** Why one Look would be dropped, or null when vos.so keeps it. */\nexport function lookProblem(l: unknown): string | null {\n if (!l || typeof l !== 'object') return 'not an object'\n const look = l as Record<string, unknown>\n if (!str(look.name, 24, 1)) return 'name must be 1 to 24 characters'\n if (!look.values || typeof look.values !== 'object') return 'values missing'\n return null\n}\n\n/** Every knob and Look vos.so would drop, in words, in order. */\nexport function knobWarnings(config: Record<string, unknown>): string[] {\n const out: string[] = []\n const sort = (\n raw: unknown,\n noun: 'knob' | 'look',\n field: string,\n max: number,\n problem: (e: unknown) => string | null,\n ) => {\n if (raw === undefined) return\n if (!Array.isArray(raw)) {\n out.push(`${noun === 'knob' ? 'params' : 'presets'} is not a list`)\n return\n }\n let kept = 0\n raw.forEach((entry, i) => {\n const id =\n entry && typeof (entry as Record<string, unknown>)[field] === 'string'\n ? `${noun} \"${String((entry as Record<string, unknown>)[field])}\"`\n : `${noun} #${i + 1}`\n const why = problem(entry)\n if (why) out.push(`${id} would be dropped on vos.so (${why})`)\n else if (kept >= max)\n out.push(\n `${id} would be dropped on vos.so: a vos keeps at most ${max} ${noun}s${noun === 'knob' ? ' (the rest can stay bound data)' : ''}`,\n )\n else kept += 1\n })\n }\n sort(config.params, 'knob', 'key', MAX_PARAMS, knobProblem)\n sort(config.presets, 'look', 'name', MAX_LOOKS, lookProblem)\n return out\n}\n","import {\n aspectLabel,\n programSize,\n resolveOutputSize,\n type ProgramSize,\n type ResolvedOutputSize,\n} from '@vosjs/core'\nimport { numFlag, UsageError, type ParsedArgs } from './args'\n\n/** The landscape size a verb uses for a program that declares none. */\nexport const RENDER_FALLBACK: ProgramSize = { width: 1920, height: 1080 }\nexport const STILL_FALLBACK: ProgramSize = { width: 1280, height: 720 }\n\nconst optNum = (\n flags: ParsedArgs['flags'],\n name: string,\n): number | undefined =>\n flags[name] === undefined ? undefined : numFlag(flags, name, 0)\n\n/**\n * Output pixels for a render or a still: `--width`/`--height` win, one of\n * them alone keeps the program's aspect, and neither means the program's own\n * `size` (else the verb's landscape fallback).\n *\n * Returns a note when the flags render a declared program at another aspect:\n * the program lays itself out in whatever frame it gets, so that is a\n * different picture, not a scaled one.\n */\nexport function outputSizeFor(\n config: Record<string, unknown>,\n flags: ParsedArgs['flags'],\n fallback: ProgramSize,\n): ResolvedOutputSize & { note?: string } {\n const declared = programSize(config)\n const width = optNum(flags, 'width')\n const height = optNum(flags, 'height')\n for (const [name, v] of [\n ['width', width],\n ['height', height],\n ] as const) {\n if (v !== undefined && !(v >= 1))\n throw new UsageError(`--${name} expects a positive number, got ${v}`)\n }\n const resolved = resolveOutputSize({ declared, width, height, fallback })\n if (\n declared &&\n resolved.source === 'flags' &&\n Math.abs(\n resolved.width / resolved.height - declared.width / declared.height,\n ) > 0.005\n ) {\n return {\n ...resolved,\n note: `rendering at ${resolved.width}x${resolved.height} (${aspectLabel(resolved)}); the program declares ${declared.width}x${declared.height} (${aspectLabel(declared)}) and lays itself out in the frame it gets`,\n }\n }\n return resolved\n}\n","/**\n * The sound a program document adds, for a LOCAL render of the program.\n *\n * A composed program carries its `doc.audio` clips on the studio stack entry,\n * exactly as a take does, and the capture page mixes them through the same\n * producer a take render uses. The one difference is WHERE the bytes are: a\n * capture page has no origin of its own, so a clip keyed by a file beside the\n * document (`score.ogg`) or by a hosted asset path (`/api/assets/…`) cannot be\n * fetched from inside it. Each is inlined as a `data:` URI here: a local file\n * read from disk, a hosted asset downloaded with the caller's credential.\n * A clip that cannot be reached is left out and said, never a silent track.\n */\nimport { readFile } from 'node:fs/promises'\nimport { audioProducerCode, studioEntryData } from '@vosjs/render-core'\nimport { studioAudioPlan } from '@vosjs/studio-core'\nimport { MEDIA_HEAD_BYTES, resolveMediaType } from './plugin/container'\nimport { bearerFor } from './plugin/platform'\nimport { localFile } from './programAssets'\nimport type { EnvelopePoint, LoweredAudioClip } from '@vosjs/studio-core'\n\nexport interface ProgramAudioOptions {\n /** The directory the document's relative keys are read against. */\n baseDir: string\n /** The output length the mix is cut to, seconds. */\n duration: number\n /** For a clip keyed by a hosted asset: where it lives and who may read it. */\n origin?: string\n key?: string | null\n log: (line: string) => void\n}\n\nexport interface ProgramAudio {\n producerCode: string\n clips: number\n}\n\nfunction dataUri(bytes: Uint8Array, filename: string): string {\n const { type } = resolveMediaType({\n head: bytes.subarray(0, MEDIA_HEAD_BYTES),\n filename,\n })\n return `data:${type};base64,${Buffer.from(bytes).toString('base64')}`\n}\n\nasync function reach(\n clipKey: string,\n opts: ProgramAudioOptions,\n): Promise<string | null> {\n if (/^(data:|https?:)/.test(clipKey)) return clipKey\n if (clipKey.startsWith('/api/')) {\n if (!opts.origin || !opts.key) {\n opts.log(\n `note: sound ${clipKey} is a hosted asset and no credential is set, so the render leaves it out (vos login, or keep the file beside the document)`,\n )\n return null\n }\n const res = await fetch(`${opts.origin}${clipKey}`, {\n headers: bearerFor(opts.key, opts.origin),\n })\n if (!res.ok) {\n opts.log(\n `note: sound ${clipKey} could not be read (${res.status}), so the render leaves it out`,\n )\n return null\n }\n return dataUri(new Uint8Array(await res.arrayBuffer()), clipKey)\n }\n // In the document's directory or below, never outside it: the bytes land\n // in a page the program's own code runs in.\n const local = localFile(clipKey.replace(/^\\/+/, ''), opts.baseDir)\n if ('refused' in local) {\n opts.log(\n `note: sound ${clipKey} is not beside the document, so the render leaves it out`,\n )\n return null\n }\n return dataUri(new Uint8Array(await readFile(local.file)), local.file)\n}\n\n/** The producer for a composed program's sound, or null when it adds none. */\nexport async function programAudio(\n config: Record<string, unknown>,\n opts: ProgramAudioOptions,\n): Promise<ProgramAudio | null> {\n const entry = studioEntryData(config.stack)\n const clips = Array.isArray(entry?.audio)\n ? (entry.audio as LoweredAudioClip[])\n : []\n if (!clips.length) return null\n const reached: LoweredAudioClip[] = []\n for (const clip of clips) {\n const key = await reach(clip.key, opts)\n if (key) reached.push({ ...clip, key })\n }\n if (!reached.length) return null\n const duckEnv = Array.isArray(entry?.duckEnv)\n ? (entry.duckEnv as EnvelopePoint[])\n : []\n const plan = studioAudioPlan(reached, duckEnv, opts.duration)\n return {\n producerCode: audioProducerCode({ plan }),\n clips: reached.length,\n }\n}\n"],"mappings":"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","names":["programSize","programSize","aspectLabel","programSize","programSize","aspectLabel","require"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -91,8 +91,8 @@ declare class BrowserUnavailableError extends Error {
|
|
|
91
91
|
* `args` are extra Chromium switches (`--browser-arg` on the verbs that
|
|
92
92
|
* record). Some product surfaces cannot be reached without one: a recorder
|
|
93
93
|
* needs a fake capture device to get past a permission prompt, an extension
|
|
94
|
-
* page needs the extension loaded. Passed through verbatim
|
|
95
|
-
* false` opens a window (`vos look --headed`).
|
|
94
|
+
* page needs the extension loaded. Passed through verbatim, after
|
|
95
|
+
* `BROWSER_SWITCHES`. `headless: false` opens a window (`vos look --headed`).
|
|
96
96
|
*/
|
|
97
97
|
declare function launchBrowser(args?: string[], launch?: {
|
|
98
98
|
headless?: boolean;
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
startTakeServer,
|
|
15
15
|
validateActions,
|
|
16
16
|
waitForPageDone
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-SP5OHTVB.js";
|
|
18
18
|
import {
|
|
19
19
|
BrowserUnavailableError,
|
|
20
20
|
configDuration,
|
|
@@ -23,13 +23,13 @@ import {
|
|
|
23
23
|
previewPages,
|
|
24
24
|
renderStill,
|
|
25
25
|
renderVideo
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-B373NVJE.js";
|
|
27
27
|
import {
|
|
28
28
|
RECORDING_NAME,
|
|
29
29
|
loadTake,
|
|
30
30
|
pullMedia,
|
|
31
31
|
takePaths
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-PJ6MEJZV.js";
|
|
33
33
|
import {
|
|
34
34
|
apiError,
|
|
35
35
|
apiJson,
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
takeBackdrop,
|
|
8
8
|
takeBrowserArgs,
|
|
9
9
|
verbHelp
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-SP5OHTVB.js";
|
|
11
|
+
import "./chunk-B373NVJE.js";
|
|
12
|
+
import "./chunk-PJ6MEJZV.js";
|
|
13
13
|
import "./chunk-J3KHIZCH.js";
|
|
14
14
|
import "./chunk-6XPFWQKP.js";
|
|
15
15
|
export {
|
|
@@ -21,4 +21,4 @@ export {
|
|
|
21
21
|
takeBrowserArgs,
|
|
22
22
|
verbHelp
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=run-
|
|
24
|
+
//# sourceMappingURL=run-2ELHMPTB.js.map
|
|
@@ -44,6 +44,8 @@ function sayStepTarget(step) {
|
|
|
44
44
|
return byId ? `${byId} (${bySelector})` : bySelector;
|
|
45
45
|
}
|
|
46
46
|
function sayCondition(c) {
|
|
47
|
+
if (c.js !== void 0)
|
|
48
|
+
return c.equals !== void 0 ? `the console's \`${c.js}\` gives ${JSON.stringify(c.equals)}` : `the console's \`${c.js}\` is true`;
|
|
47
49
|
if (c.text !== void 0) return `"${c.text}" shows on the page`;
|
|
48
50
|
if (c.gone !== void 0) return `${sayTarget(c.gone)} is gone`;
|
|
49
51
|
const target = sayStepTarget({ selector: c.selector ?? "", id: c.id });
|
|
@@ -53,7 +55,9 @@ function sayCondition(c) {
|
|
|
53
55
|
}
|
|
54
56
|
function beatOf(step) {
|
|
55
57
|
const line = gestureBeat(step);
|
|
56
|
-
|
|
58
|
+
if (!line) return line;
|
|
59
|
+
const camera = step.zoom === true ? " (zoomed in on in the cut)" : step.zoom === false ? " (the cut stays wide here)" : "";
|
|
60
|
+
return step.guard ? `${line}${camera} (this spends something real: do it only if you mean to)` : `${line}${camera}`;
|
|
57
61
|
}
|
|
58
62
|
function gestureBeat(step) {
|
|
59
63
|
const cap = step.caption;
|
|
@@ -101,7 +105,13 @@ function shotList(actions) {
|
|
|
101
105
|
const beats = [];
|
|
102
106
|
let pendingHold = 0;
|
|
103
107
|
let total = 0;
|
|
108
|
+
const beatOfId = /* @__PURE__ */ new Map();
|
|
104
109
|
for (const step of actions.steps) {
|
|
110
|
+
if (step.id)
|
|
111
|
+
beatOfId.set(
|
|
112
|
+
step.id,
|
|
113
|
+
Math.max(1, beats.length + (step.do === "wait" ? 0 : 1))
|
|
114
|
+
);
|
|
105
115
|
total += askedMs(step);
|
|
106
116
|
if (step.do === "wait") {
|
|
107
117
|
if (beats.length) {
|
|
@@ -117,13 +127,23 @@ function shotList(actions) {
|
|
|
117
127
|
beats.push(beat);
|
|
118
128
|
}
|
|
119
129
|
void pendingHold;
|
|
130
|
+
const peers = (actions.peers ?? []).map((peer) => ({
|
|
131
|
+
id: peer.id,
|
|
132
|
+
lines: peer.steps.map((step) => {
|
|
133
|
+
const line = step.do === "wait" ? `Wait ${s1(step.ms)} s` : beatOf(step);
|
|
134
|
+
if (!line) return null;
|
|
135
|
+
const when = step.with ? `As beat ${beatOfId.get(step.with) ?? "?"} starts: ` : step.after ? `Once beat ${beatOfId.get(step.after) ?? "?"} is done: ` : "";
|
|
136
|
+
return `${when}${line}`;
|
|
137
|
+
}).filter((l) => l !== null)
|
|
138
|
+
}));
|
|
120
139
|
return {
|
|
121
140
|
url: actions.url,
|
|
122
141
|
viewport: actions.viewport,
|
|
123
142
|
beats,
|
|
124
143
|
// gestures the recorder adds around each ask: about a second a beat
|
|
125
144
|
aboutS: Math.round((total + beats.length * 1e3) / 1e3),
|
|
126
|
-
setup: actions.setup?.length ?? 0
|
|
145
|
+
setup: actions.setup?.length ?? 0,
|
|
146
|
+
...peers.length ? { peers } : {}
|
|
127
147
|
};
|
|
128
148
|
}
|
|
129
149
|
function formatShotList(list) {
|
|
@@ -142,6 +162,13 @@ function formatShotList(list) {
|
|
|
142
162
|
const hold = b.holdS && b.holdS >= 0.4 ? ` Hold ${s1(b.holdS * 1e3)} s.` : "";
|
|
143
163
|
out.push(`${b.n}. ${b.line}.${hold}`);
|
|
144
164
|
}
|
|
165
|
+
for (const peer of list.peers ?? []) {
|
|
166
|
+
out.push("");
|
|
167
|
+
out.push(
|
|
168
|
+
`A second person (${peer.id}) does this at the same time, in their own browser on the same page; their screen is not recorded, the app shows what they do:`
|
|
169
|
+
);
|
|
170
|
+
peer.lines.forEach((l, i) => out.push(` ${peer.id}${i + 1}. ${l}.`));
|
|
171
|
+
}
|
|
145
172
|
out.push("");
|
|
146
173
|
out.push(
|
|
147
174
|
"Move at a talking pace, let each screen settle before the next beat, and end on the finished state. Press the icon again to stop; the take opens in the studio and saves to your shelf."
|
|
@@ -155,4 +182,4 @@ export {
|
|
|
155
182
|
sayTarget,
|
|
156
183
|
shotList
|
|
157
184
|
};
|
|
158
|
-
//# sourceMappingURL=shotList-
|
|
185
|
+
//# sourceMappingURL=shotList-MSNWLVDN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugin/shotList.ts"],"sourcesContent":["/**\n * The shot list: an `actions.json` said in words, for a person who will\n * record it by hand. The last rung of the session ladder is \"the human\n * records, the agent cuts\", and an agent that falls to it should hand over\n * more than an apology: the flow it worked out, as numbered beats with the\n * pace it wanted, so its knowledge survives the hop to a human. The take\n * comes back through the ordinary handoff and the agent cuts it.\n *\n * Pure: an ActionsFile in, lines out. Selectors are said as what they name\n * where the script says (an id, a caption, a text= locator), and as the\n * selector itself where it does not: a person reading `#filter-late` can\n * find it; a person reading nothing cannot.\n */\nimport type { ActionStep, ActionsFile } from './actions'\nimport { askedMs } from './pace'\nimport { pressSequence, splitChord } from '@vosjs/render-core/record'\n\n/** A key or a chord as a person reads it: `Mod` is ⌘ on a Mac, Ctrl elsewhere. */\nexport function sayChord(chord: string): string {\n const { mods, key } = splitChord(chord)\n const word = (k: string) =>\n k === 'Mod' || k === 'ControlOrMeta'\n ? '⌘/Ctrl'\n : k === 'Control'\n ? 'Ctrl'\n : k === 'Meta'\n ? '⌘'\n : k === 'Alt'\n ? 'Alt/Option'\n : k === ' '\n ? 'Space'\n : k\n return [...mods, key].map(word).join('+')\n}\n\n/** A viewport point as a person finds it: where it is, and the script's numbers. */\nfunction sayPoint(p: { x?: number; y?: number }): string {\n const x = p.x ?? 0\n const y = p.y ?? 0\n return `the spot at ${Math.round(x)}, ${Math.round(y)} (${y < 360 ? 'upper' : 'lower'} ${x < 640 ? 'left' : 'right'})`\n}\n\n/** A list in words: `a`, `a then b`, `a, b then c`. */\nconst thenList = (xs: string[]): string =>\n xs.length <= 1\n ? (xs[0] ?? '')\n : `${xs.slice(0, -1).join(', ')} then ${xs[xs.length - 1]}`\n\nexport interface ShotBeat {\n n: number\n /** what to do, in words */\n line: string\n /** how long to hold after, in seconds, when the script asks for a hold */\n holdS?: number\n}\n\nexport interface ShotList {\n url?: string\n viewport?: { width: number; height: number }\n beats: ShotBeat[]\n /** the take's asked length, from the script's own pacing */\n aboutS: number\n setup: number\n /**\n * What each other person does (the script's `peers`), as beats tied to\n * the take's own: a second pair of hands, in their own browser, on the\n * same page.\n */\n peers?: { id: string; lines: string[] }[]\n}\n\n/** A selector as a person reads it: the text it names, or the selector itself. */\nexport function sayTarget(selector: string): string {\n const text = /^text=(['\"]?)(.+?)\\1$/.exec(selector)\n if (text) return `\"${text[2]}\"`\n const has = /:has-text\\((['\"])(.+?)\\1\\)/.exec(selector)\n if (has) return `\"${has[2]}\"`\n const role = /getByRole\\(['\"](\\w+)['\"],\\s*\\{\\s*name:\\s*(['\"])(.+?)\\2/.exec(\n selector,\n )\n if (role) return `the ${role[1]} \"${role[3]}\"`\n const label = /\\[aria-label=(['\"])(.+?)\\1\\]/.exec(selector)\n if (label) return `\"${label[2]}\"`\n const ph = /\\[placeholder=(['\"])(.+?)\\1\\]/.exec(selector)\n if (ph) return `the \"${ph[2]}\" field`\n return `\\`${selector}\\``\n}\n\nconst s1 = (ms: number) => `${Math.round(ms / 100) / 10}`.replace(/\\.0$/, '')\n\n/** A step's id, said as a name when it reads as one (`late`, `new-order`, `openBilling`). */\nexport function sayId(id: string | undefined): string | null {\n if (!id || /^\\d+$/.test(id) || id.length < 3) return null\n const words = id\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[-_]+/g, ' ')\n .toLowerCase()\n .trim()\n return words.length >= 3 ? words : null\n}\n\n/** What a step points at, for a person: the words the selector names, else the id's, else the selector. */\nfunction sayStepTarget(step: { selector: string; id?: string }): string {\n const bySelector = sayTarget(step.selector)\n if (!bySelector.startsWith('`')) return bySelector\n const byId = sayId(step.id)\n return byId ? `${byId} (${bySelector})` : bySelector\n}\n\n/** A page condition, for a person: what they should see before going on. */\nfunction sayCondition(c: {\n selector?: string\n text?: string\n gone?: string\n enabled?: boolean\n js?: string\n equals?: unknown\n id?: string\n}): string {\n // A state the app keeps in script: a person reads it in the browser's\n // console, so the beat names the expression to run there.\n if (c.js !== undefined)\n return c.equals !== undefined\n ? `the console's \\`${c.js}\\` gives ${JSON.stringify(c.equals)}`\n : `the console's \\`${c.js}\\` is true`\n if (c.text !== undefined) return `\"${c.text}\" shows on the page`\n if (c.gone !== undefined) return `${sayTarget(c.gone)} is gone`\n const target = sayStepTarget({ selector: c.selector ?? '', id: c.id })\n if (c.enabled === true) return `${target} is enabled`\n if (c.enabled === false) return `${target} is disabled`\n return `${target} is showing`\n}\n\nfunction beatOf(step: ActionStep): string | null {\n const line = gestureBeat(step)\n if (!line) return line\n // What the cut's camera does here, said where a person reads it: a step\n // marked as the beat's payoff is zoomed in on, one marked against it is not.\n const camera =\n step.zoom === true\n ? ' (zoomed in on in the cut)'\n : step.zoom === false\n ? ' (the cut stays wide here)'\n : ''\n // A step that spends something real is marked where a person reads it.\n return step.guard\n ? `${line}${camera} (this spends something real: do it only if you mean to)`\n : `${line}${camera}`\n}\n\nfunction gestureBeat(step: ActionStep): string | null {\n const cap = step.caption\n const named = cap ? `${cap}: ` : ''\n switch (step.do) {\n case 'expect':\n return `${named}Check that ${sayCondition(step)}`\n case 'await':\n return `${named}Wait until ${sayCondition({ ...step.until, id: step.id })} (off camera: pause the recording meanwhile)`\n case 'download':\n return step.selector !== undefined\n ? `${named}Download the file ${sayStepTarget({ selector: step.selector, id: step.id })} gives${step.as ? `, as ${step.as}` : ''}`\n : `${named}Download what ${sayTarget(step.src ?? '')} plays${step.as ? `, as ${step.as}` : ''}`\n case 'wait':\n return null\n case 'hover':\n return `${named}Rest the pointer on ${step.selector !== undefined ? sayStepTarget({ selector: step.selector, id: step.id }) : sayPoint(step)}`\n case 'click': {\n const verb =\n step.count === 3\n ? 'Triple-click'\n : step.count === 2\n ? 'Double-click'\n : 'Click'\n const button =\n step.button === 'right'\n ? ' with the right button'\n : step.button === 'middle'\n ? ' with the middle button'\n : ''\n const target =\n step.selector !== undefined\n ? sayStepTarget({ selector: step.selector, id: step.id })\n : sayPoint(step)\n const holding = step.modifiers?.length\n ? `Hold ${step.modifiers.map(sayChord).join('+')} and ${verb.toLowerCase()}`\n : verb\n return `${named}${holding} ${target}${button}`\n }\n case 'type':\n return `${named}${step.replace ? 'Replace what is in' : 'Type'}${step.replace ? ` ${sayStepTarget(step)} with \"${step.text}\"` : ` \"${step.text}\" into ${sayStepTarget(step)}`}${step.at === 'end' ? ', at the end' : step.at === 'start' ? ', at the start' : ''}`\n case 'press':\n return `${named}Press ${thenList(pressSequence(step).map(sayChord))}${step.selector ? ` in ${sayStepTarget(step as { selector: string; id?: string })}` : ''}`\n case 'paste': {\n const what =\n step.text !== undefined\n ? `\"${step.text.length > 60 ? `${step.text.slice(0, 57)}...` : step.text}\"`\n : `the file ${step.file}`\n return `${named}Copy ${what}, then paste it${step.selector ? ` into ${sayStepTarget({ selector: step.selector, id: step.id })}` : ''} (⌘/Ctrl+V)`\n }\n case 'scroll':\n return `${named}Scroll ${step.dy < 0 ? 'up' : 'down'} ${step.dy < 0 ? 'a little' : 'a little'}`\n case 'move':\n return `${named}Move the pointer to the ${step.y < 360 ? 'upper' : 'lower'} ${step.x < 640 ? 'left' : 'right'}`\n case 'drag': {\n const holding = step.modifiers?.length\n ? `Hold ${step.modifiers.map(sayChord).join('+')} and `\n : ''\n const verb = holding ? 'drag' : 'Drag'\n if (step.path !== undefined)\n return `${named}${holding}${holding ? 'draw' : 'Draw'} the stroke ${typeof step.path === 'string' ? `in ${step.path}` : `of ${step.path.length} points`}, in one press`\n return `${named}${holding}${verb} ${step.selector ? sayStepTarget(step as { selector: string; id?: string }) : 'from the start point'} across`\n }\n }\n}\n\nexport function shotList(actions: ActionsFile): ShotList {\n const beats: ShotBeat[] = []\n let pendingHold = 0\n let total = 0\n // Which beat a take step is (or, for a wait, the beat it holds), so a\n // peer's step can say when it happens.\n const beatOfId = new Map<string, number>()\n for (const step of actions.steps) {\n if (step.id)\n beatOfId.set(\n step.id,\n Math.max(1, beats.length + (step.do === 'wait' ? 0 : 1)),\n )\n total += askedMs(step)\n if (step.do === 'wait') {\n // A wait after a beat is that beat's hold; a leading wait is the\n // settle before the first, which a person does without being told.\n if (beats.length) {\n const last = beats[beats.length - 1]\n last.holdS = (last.holdS ?? 0) + step.ms / 1000\n } else pendingHold += step.ms\n continue\n }\n const line = beatOf(step)\n if (!line) continue\n const beat: ShotBeat = { n: beats.length + 1, line }\n if (step.do === 'hover') beat.holdS = askedMs(step) / 1000\n beats.push(beat)\n }\n void pendingHold\n const peers = (actions.peers ?? []).map((peer) => ({\n id: peer.id,\n lines: peer.steps\n .map((step) => {\n const line = step.do === 'wait' ? `Wait ${s1(step.ms)} s` : beatOf(step)\n if (!line) return null\n const when = step.with\n ? `As beat ${beatOfId.get(step.with) ?? '?'} starts: `\n : step.after\n ? `Once beat ${beatOfId.get(step.after) ?? '?'} is done: `\n : ''\n return `${when}${line}`\n })\n .filter((l): l is string => l !== null),\n }))\n return {\n url: actions.url,\n viewport: actions.viewport,\n beats,\n // gestures the recorder adds around each ask: about a second a beat\n aboutS: Math.round((total + beats.length * 1000) / 1000),\n setup: actions.setup?.length ?? 0,\n ...(peers.length ? { peers } : {}),\n }\n}\n\n/** The list as the person reads it. */\nexport function formatShotList(list: ShotList): string {\n const out: string[] = []\n out.push(\n `Record this with the vosso extension in your own signed-in browser, about ${list.aboutS} seconds${list.viewport ? `, window about ${list.viewport.width}×${list.viewport.height}` : ''}.`,\n )\n if (list.url)\n out.push(`Start on ${list.url}, signed in, with the page settled.`)\n if (list.setup)\n out.push(\n `Before you press record: the script's ${list.setup} setup step${list.setup === 1 ? '' : 's'} (sign in, dismiss banners) are yours to do first; they are not part of the take.`,\n )\n out.push('')\n for (const b of list.beats) {\n const hold =\n b.holdS && b.holdS >= 0.4 ? ` Hold ${s1(b.holdS * 1000)} s.` : ''\n out.push(`${b.n}. ${b.line}.${hold}`)\n }\n for (const peer of list.peers ?? []) {\n out.push('')\n out.push(\n `A second person (${peer.id}) does this at the same time, in their own browser on the same page; their screen is not recorded, the app shows what they do:`,\n )\n peer.lines.forEach((l, i) => out.push(` ${peer.id}${i + 1}. ${l}.`))\n }\n out.push('')\n out.push(\n 'Move at a talking pace, let each screen settle before the next beat, and end on the finished state. Press the icon again to stop; the take opens in the studio and saves to your shelf.',\n )\n return out.join('\\n')\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vosjs/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.80.0",
|
|
4
4
|
"description": "The vos CLI: record the real product from a scripted browser flow, auto-zoom from the cursor track, cut as data in doc.json, render deterministic video, deliver a release's video cuts per destination spec, and sync with vos.so. One binary, every verb, MIT.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,10 +53,10 @@
|
|
|
53
53
|
"playwright": "^1.49.0",
|
|
54
54
|
"@vosjs/core": "^0.31.0",
|
|
55
55
|
"@vosjs/editor": "^1.6.0",
|
|
56
|
-
"@vosjs/render-core": "^0.8.0",
|
|
57
|
-
"@vosjs/studio-core": "^0.44.0",
|
|
58
56
|
"@vosjs/elements": "^0.12.1",
|
|
57
|
+
"@vosjs/render-core": "^0.9.0",
|
|
59
58
|
"@vosjs/shared": "^0.7.0",
|
|
59
|
+
"@vosjs/studio-core": "^0.45.0",
|
|
60
60
|
"@vosjs/timeline": "^0.5.0",
|
|
61
61
|
"@vosjs/tween": "^0.8.3"
|
|
62
62
|
},
|