@kheleshikhi/studio-agent 0.6.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +269 -13
- package/dist/attempt.d.ts +4 -0
- package/dist/attempt.js +11 -1
- package/dist/attempt.js.map +1 -1
- package/dist/browser.d.ts +89 -3
- package/dist/browser.js +536 -14
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +20 -0
- package/dist/cli.js +851 -73
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts +66 -0
- package/dist/context.js +207 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon.js +109 -7
- package/dist/daemon.js.map +1 -1
- package/dist/episode-runner.d.ts +109 -0
- package/dist/episode-runner.js +381 -0
- package/dist/episode-runner.js.map +1 -0
- package/dist/episode.d.ts +332 -0
- package/dist/episode.js +648 -0
- package/dist/episode.js.map +1 -0
- package/dist/presence.d.ts +49 -0
- package/dist/presence.js +141 -0
- package/dist/presence.js.map +1 -0
- package/dist/project.d.ts +30 -0
- package/dist/project.js +204 -0
- package/dist/project.js.map +1 -0
- package/dist/render-jobs.d.ts +101 -0
- package/dist/render-jobs.js +241 -0
- package/dist/render-jobs.js.map +1 -0
- package/dist/scenario.d.ts +33 -1
- package/dist/scenario.js +143 -5
- package/dist/scenario.js.map +1 -1
- package/dist/shot-provenance.d.ts +66 -0
- package/dist/shot-provenance.js +114 -0
- package/dist/shot-provenance.js.map +1 -0
- package/dist/state.js +10 -6
- package/dist/state.js.map +1 -1
- package/dist/video.d.ts +197 -0
- package/dist/video.js +446 -0
- package/dist/video.js.map +1 -0
- package/package.json +1 -1
package/dist/context.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Pure readers of the live `/v1/agent/context` projection.
|
|
2
|
+
//
|
|
3
|
+
// The CLI is a thin client of server authority: every list below (offered and
|
|
4
|
+
// frozen targets, deprecations, the Experience schema, the universal capability
|
|
5
|
+
// list, tools) is read from the server's context. Nothing here hard-codes a
|
|
6
|
+
// live contract. When the server does not project a field, the helpers answer
|
|
7
|
+
// "unknown" and the CLI defers to the server's own validation errors.
|
|
8
|
+
import { CliError } from "./types.js";
|
|
9
|
+
function stringList(value) {
|
|
10
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : null;
|
|
11
|
+
}
|
|
12
|
+
function text(value) {
|
|
13
|
+
return typeof value === "string" && value ? value : null;
|
|
14
|
+
}
|
|
15
|
+
export function parseContext(raw) {
|
|
16
|
+
const deprecations = {};
|
|
17
|
+
if (raw.deprecations && typeof raw.deprecations === "object" && !Array.isArray(raw.deprecations)) {
|
|
18
|
+
for (const [key, value] of Object.entries(raw.deprecations))
|
|
19
|
+
if (typeof value === "string")
|
|
20
|
+
deprecations[key] = value;
|
|
21
|
+
}
|
|
22
|
+
const capabilities = Array.isArray(raw.experience_capabilities)
|
|
23
|
+
? raw.experience_capabilities
|
|
24
|
+
.filter((item) => Boolean(item) && typeof item === "object" && typeof item.id === "string")
|
|
25
|
+
.map((item) => ({ id: String(item.id), versions: Array.isArray(item.versions) ? item.versions.map(Number).filter(Number.isFinite) : [] }))
|
|
26
|
+
: null;
|
|
27
|
+
const tools = raw.experience_tools && typeof raw.experience_tools === "object" && !Array.isArray(raw.experience_tools)
|
|
28
|
+
? raw.experience_tools
|
|
29
|
+
: null;
|
|
30
|
+
const protocol = Number(raw.agent_protocol);
|
|
31
|
+
return {
|
|
32
|
+
agentProtocol: Number.isFinite(protocol) ? protocol : null,
|
|
33
|
+
minimumCliVersion: String(raw.minimum_cli_version || ""),
|
|
34
|
+
recommendedCliVersion: String(raw.recommended_cli_version || raw.minimum_cli_version || ""),
|
|
35
|
+
authoringTargets: stringList(raw.authoring_targets),
|
|
36
|
+
frozenAuthoringTargets: stringList(raw.frozen_authoring_targets),
|
|
37
|
+
deprecations,
|
|
38
|
+
sceneSchema: text(raw.scene_schema),
|
|
39
|
+
sceneManifestSchema: text(raw.scene_manifest_schema),
|
|
40
|
+
experienceSchema: text(raw.experience_schema),
|
|
41
|
+
experienceCapabilities: capabilities,
|
|
42
|
+
experienceTools: tools,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------- versions
|
|
46
|
+
function versionParts(value) {
|
|
47
|
+
const match = /^(\d+)\.(\d+)\.(\d+)/.exec(value);
|
|
48
|
+
if (!match)
|
|
49
|
+
throw new CliError(`Server returned an invalid CLI version: ${value}`, "AGENT_VERSION_INVALID", 5);
|
|
50
|
+
return match.slice(1).map(Number);
|
|
51
|
+
}
|
|
52
|
+
export function compareVersions(left, right) {
|
|
53
|
+
const a = versionParts(left);
|
|
54
|
+
const b = versionParts(right);
|
|
55
|
+
for (let index = 0; index < 3; index += 1) {
|
|
56
|
+
if (a[index] !== b[index])
|
|
57
|
+
return a[index] - b[index];
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
export const PACKAGE_NAME = "@kheleshikhi/studio-agent";
|
|
62
|
+
/** Negotiate this CLI against the server's protocol and min/recommended versions. */
|
|
63
|
+
export function compatibilityReport(raw, cliVersion, cliProtocol) {
|
|
64
|
+
const context = parseContext(raw);
|
|
65
|
+
const base = {
|
|
66
|
+
cli_version: cliVersion,
|
|
67
|
+
agent_protocol: context.agentProtocol,
|
|
68
|
+
minimum_cli_version: context.minimumCliVersion,
|
|
69
|
+
recommended_cli_version: context.recommendedCliVersion,
|
|
70
|
+
};
|
|
71
|
+
if (context.agentProtocol !== cliProtocol) {
|
|
72
|
+
return { ...base, status: "protocol_incompatible", message: `NerdBro speaks Agent protocol ${raw.agent_protocol}; this CLI ${cliVersion} speaks protocol ${cliProtocol}. Install the current CLI: npm install -g ${PACKAGE_NAME}@latest.` };
|
|
73
|
+
}
|
|
74
|
+
if (compareVersions(cliVersion, context.minimumCliVersion) < 0) {
|
|
75
|
+
return { ...base, status: "upgrade_required", message: `CLI ${cliVersion} is too old; NerdBro requires ${context.minimumCliVersion} or newer (recommended ${context.recommendedCliVersion}). Run: npm install -g ${PACKAGE_NAME}@${context.recommendedCliVersion}.` };
|
|
76
|
+
}
|
|
77
|
+
if (compareVersions(cliVersion, context.recommendedCliVersion) < 0) {
|
|
78
|
+
return { ...base, status: "upgrade_recommended", message: `CLI ${context.recommendedCliVersion} is recommended (current ${cliVersion}); older CLIs may not offer the server's current Scene and Experience workflow. Run: npm install -g ${PACKAGE_NAME}@${context.recommendedCliVersion}.` };
|
|
79
|
+
}
|
|
80
|
+
return { ...base, status: "compatible", message: null };
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------- targets
|
|
83
|
+
/** The Scene target ADR-0003 names for all new visual work. */
|
|
84
|
+
export const SCENE_TARGET = "sceneComposition";
|
|
85
|
+
/**
|
|
86
|
+
* Choose the `studio create` target. Without `--target` the Scene target is
|
|
87
|
+
* used (or the server's first offered target if it stops offering it). A target
|
|
88
|
+
* the server's context lists as frozen is refused here with the server's own
|
|
89
|
+
* deprecation text; any other value is sent unchanged for the server to judge.
|
|
90
|
+
*/
|
|
91
|
+
export function resolveCreateTarget(requested, raw) {
|
|
92
|
+
const context = parseContext(raw);
|
|
93
|
+
if (requested === undefined) {
|
|
94
|
+
const offered = context.authoringTargets;
|
|
95
|
+
return !offered || offered.length === 0 || offered.includes(SCENE_TARGET) ? SCENE_TARGET : offered[0];
|
|
96
|
+
}
|
|
97
|
+
if (context.frozenAuthoringTargets?.includes(requested)) {
|
|
98
|
+
const reason = context.deprecations[requested] || "Frozen: kept only so existing assets keep reading.";
|
|
99
|
+
const offered = context.authoringTargets?.length ? context.authoringTargets.join(", ") : SCENE_TARGET;
|
|
100
|
+
throw new CliError(`Target ${requested} is frozen for new work. ${reason} Use --target ${offered.split(", ")[0]} (offered: ${offered}); a graph is a Scene math plane (see \`nerdbro docs open mathgraph\`).`, "STUDIO_TARGET_FROZEN", 2, { target: requested, offered_targets: context.authoringTargets, frozen_targets: context.frozenAuthoringTargets, deprecation: reason });
|
|
101
|
+
}
|
|
102
|
+
return requested;
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------- brief
|
|
105
|
+
const GRAPH_FLAGS = ["graph-purpose", "graph-x", "graph-y", "graph-sync"];
|
|
106
|
+
/**
|
|
107
|
+
* Whether the brief asks for a Scene math plane. A graph is no longer a target
|
|
108
|
+
* (combined/mathGraph) but a plane inside the Scene, so the requirement follows
|
|
109
|
+
* only from the Maker's graph intent: `--math-plane` or any `--graph-*` meaning.
|
|
110
|
+
* Returns undefined when nothing was said, so the server keeps its default.
|
|
111
|
+
*/
|
|
112
|
+
export function mathPlaneRequirement(flags) {
|
|
113
|
+
if (flags.has("no-math-plane"))
|
|
114
|
+
return false;
|
|
115
|
+
if (flags.has("math-plane"))
|
|
116
|
+
return true;
|
|
117
|
+
return GRAPH_FLAGS.some((name) => typeof flags.get(name) === "string") ? true : undefined;
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------- views
|
|
120
|
+
export function deprecationFor(raw, key) {
|
|
121
|
+
return parseContext(raw).deprecations[key] ?? null;
|
|
122
|
+
}
|
|
123
|
+
/** The authoring summary `nerdbro context` prints beside the raw projection. */
|
|
124
|
+
export function contextSummary(raw, cliVersion, cliProtocol) {
|
|
125
|
+
const context = parseContext(raw);
|
|
126
|
+
return {
|
|
127
|
+
compatibility: compatibilityReport(raw, cliVersion, cliProtocol),
|
|
128
|
+
model: "Everything visual is a Scene (graphs are Scene math planes); interaction is an Experience.",
|
|
129
|
+
scene_schema: context.sceneSchema,
|
|
130
|
+
scene_manifest_schema: context.sceneManifestSchema,
|
|
131
|
+
experience_schema: context.experienceSchema,
|
|
132
|
+
authoring_targets: context.authoringTargets,
|
|
133
|
+
frozen_authoring_targets: context.frozenAuthoringTargets,
|
|
134
|
+
deprecations: context.deprecations,
|
|
135
|
+
universal_capabilities: context.experienceCapabilities?.map((item) => item.id) ?? null,
|
|
136
|
+
fields_missing: [
|
|
137
|
+
["authoring_targets", context.authoringTargets],
|
|
138
|
+
["frozen_authoring_targets", context.frozenAuthoringTargets],
|
|
139
|
+
["experience_schema", context.experienceSchema],
|
|
140
|
+
["experience_capabilities", context.experienceCapabilities],
|
|
141
|
+
].filter(([, value]) => value === null).map(([name]) => name),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Decorate a `/v1/agent/schema/<topic>` answer: surface its deprecation, and for
|
|
146
|
+
* the `experience` topic attach the universal capability list from context.
|
|
147
|
+
*/
|
|
148
|
+
export function schemaTopicView(topic, payload, raw) {
|
|
149
|
+
const contract = payload.contract && typeof payload.contract === "object" ? payload.contract : {};
|
|
150
|
+
const view = { ...payload };
|
|
151
|
+
if (typeof contract.deprecated === "string")
|
|
152
|
+
view.deprecated = contract.deprecated;
|
|
153
|
+
if (topic === "experience" && raw) {
|
|
154
|
+
const context = parseContext(raw);
|
|
155
|
+
view.universal_capabilities = context.experienceCapabilities;
|
|
156
|
+
view.capabilities_note = "Every canonical capability is available in every host; requiredCapabilities are derived by the server, never authored.";
|
|
157
|
+
if (context.experienceSchema)
|
|
158
|
+
view.authoring_schema = context.experienceSchema;
|
|
159
|
+
}
|
|
160
|
+
return view;
|
|
161
|
+
}
|
|
162
|
+
/** `nerdbro capabilities`: the Studio capability registry plus the universal Experience list. */
|
|
163
|
+
export function capabilitiesView(registry, raw) {
|
|
164
|
+
const context = raw ? parseContext(raw) : null;
|
|
165
|
+
return {
|
|
166
|
+
universal_capabilities: context?.experienceCapabilities ?? null,
|
|
167
|
+
experience_tools: context?.experienceTools ?? null,
|
|
168
|
+
registry,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A notice when a local Experience is not the server's authoring schema (e.g. a
|
|
173
|
+
* V2 document still read through the normalizer). The text is the server's.
|
|
174
|
+
*/
|
|
175
|
+
export function experienceSchemaNotice(document, raw) {
|
|
176
|
+
if (!raw || !document || typeof document !== "object")
|
|
177
|
+
return null;
|
|
178
|
+
const context = parseContext(raw);
|
|
179
|
+
const schema = document.schema;
|
|
180
|
+
if (!context.experienceSchema || schema === context.experienceSchema)
|
|
181
|
+
return null;
|
|
182
|
+
const version = typeof schema === "string" ? /\.(v\d+)$/.exec(schema)?.[1] : undefined;
|
|
183
|
+
const deprecation = version ? context.deprecations[`experience.${version}`] : undefined;
|
|
184
|
+
return `source.json declares ${typeof schema === "string" ? schema : "no schema"}; new work is authored as ${context.experienceSchema}.${deprecation ? ` ${deprecation}` : ""}`;
|
|
185
|
+
}
|
|
186
|
+
function count(value) {
|
|
187
|
+
return Array.isArray(value) ? value.length : value !== null && typeof value === "object" ? Object.keys(value).length : null;
|
|
188
|
+
}
|
|
189
|
+
/** Summarise a server Experience draft preview, V3 blocks included. */
|
|
190
|
+
export function experiencePreviewSummary(preview) {
|
|
191
|
+
const entry = preview.entry && typeof preview.entry === "object" ? preview.entry : {};
|
|
192
|
+
const interaction = entry.interaction && typeof entry.interaction === "object" ? entry.interaction : null;
|
|
193
|
+
return {
|
|
194
|
+
mode: preview.mode ?? null,
|
|
195
|
+
source_hash: preview.sourceHash ?? null,
|
|
196
|
+
schema: entry.schema ?? null,
|
|
197
|
+
scenes: count(preview.scenes),
|
|
198
|
+
audio: count(preview.audio),
|
|
199
|
+
interaction: interaction
|
|
200
|
+
? Object.fromEntries(["inputs", "requests", "handlers", "readouts", "exports", "tools"].map((key) => [key, count(interaction[key])]))
|
|
201
|
+
: null,
|
|
202
|
+
rounds: entry.rounds ? count(entry.rounds.pool) : null,
|
|
203
|
+
outcomes: count(entry.assessment?.outcomes),
|
|
204
|
+
required_capabilities: Array.isArray(entry.requiredCapabilities) ? entry.requiredCapabilities : null,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.js
CHANGED
|
@@ -3,6 +3,10 @@ import http from "node:http";
|
|
|
3
3
|
import { removeDaemonMetadata, writeDaemonMetadata } from "./state.js";
|
|
4
4
|
import { AgentApi, traceStorage } from "./protocol.js";
|
|
5
5
|
import { StudioBrowser } from "./browser.js";
|
|
6
|
+
import { PresenceThrottle, stepPresence } from "./presence.js";
|
|
7
|
+
import { RenderJobs, renderJobRoute } from "./render-jobs.js";
|
|
8
|
+
import { rm } from "node:fs/promises";
|
|
9
|
+
const PRESENCE_SUBJECT = /^(asset|experience):[A-Za-z0-9_.-]{1,80}$/;
|
|
6
10
|
import { CliError } from "./types.js";
|
|
7
11
|
/** Context changes are bounded by a short TTL and reset on session changes. */
|
|
8
12
|
export class BoundedContextCache {
|
|
@@ -50,6 +54,71 @@ export async function runDaemon(options) {
|
|
|
50
54
|
const browser = new StudioBrowser(api);
|
|
51
55
|
if (!options.noBrowser)
|
|
52
56
|
await browser.start(options.headless);
|
|
57
|
+
/**
|
|
58
|
+
* Per-step Agent Presence for a drive. The daemon already holds the scoped
|
|
59
|
+
* Agent credential, so the CLI never needs a second channel; a failed
|
|
60
|
+
* presence update never fails the drive.
|
|
61
|
+
*/
|
|
62
|
+
const presenceListener = (subject) => {
|
|
63
|
+
if (typeof subject !== "string" || !PRESENCE_SUBJECT.test(subject) || !agentToken)
|
|
64
|
+
return undefined;
|
|
65
|
+
const throttle = new PresenceThrottle();
|
|
66
|
+
return async (report) => {
|
|
67
|
+
if (!throttle.admit(String(report.summary.op), report.summary.ok !== true))
|
|
68
|
+
return;
|
|
69
|
+
await api.request("PUT", "/v1/agent/presence", stepPresence(subject, report)).catch(() => undefined);
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Presentation renders run as jobs (see render-jobs.ts): the CLI polls
|
|
74
|
+
* short requests instead of holding one request open for minutes.
|
|
75
|
+
*/
|
|
76
|
+
// Render workers: the main browser plus NERDBRO_RENDER_WORKERS - 1 more,
|
|
77
|
+
// each its own Chrome with its own profile, started on first use. One job
|
|
78
|
+
// runs per browser; memory per worker is the limit (see
|
|
79
|
+
// docs/guides/episode-video.md).
|
|
80
|
+
const renderWorkers = Math.max(1, Math.min(4, Math.floor(Number(process.env.NERDBRO_RENDER_WORKERS ?? "1")) || 1));
|
|
81
|
+
const pool = [browser, ...Array.from({ length: renderWorkers - 1 }, (_, index) => new StudioBrowser(api, `browser-profile-render-${index + 1}`))];
|
|
82
|
+
const leased = new Set();
|
|
83
|
+
const withRenderBrowser = async (work) => {
|
|
84
|
+
const worker = pool.find((candidate) => !leased.has(candidate));
|
|
85
|
+
if (!worker)
|
|
86
|
+
throw new CliError("Every render browser is busy.", "VIDEO_RENDER_BUSY", 3);
|
|
87
|
+
leased.add(worker);
|
|
88
|
+
try {
|
|
89
|
+
if (worker !== browser)
|
|
90
|
+
await worker.start(options.headless);
|
|
91
|
+
return await work(worker);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
leased.delete(worker);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const renderJobs = new RenderJobs({ maxConcurrent: renderWorkers });
|
|
98
|
+
const sweeper = setInterval(() => renderJobs.sweep(), 5_000);
|
|
99
|
+
sweeper.unref();
|
|
100
|
+
const renderRunners = {
|
|
101
|
+
scene: (input, { signal, progress }) => withRenderBrowser((worker) => worker.renderFrames({ ...input, signal, onProgress: progress })),
|
|
102
|
+
experience: (input, { signal, progress }) => withRenderBrowser((worker) => worker.renderExperienceFrames({ ...input, signal, onProgress: progress })),
|
|
103
|
+
};
|
|
104
|
+
// A failed or cancelled job removes the frames and sound copies it wrote,
|
|
105
|
+
// unless the caller asked to keep frames for diagnosis.
|
|
106
|
+
const renderCleanup = async (input) => {
|
|
107
|
+
if (input.keepFramesOnFailure === true)
|
|
108
|
+
return;
|
|
109
|
+
for (const directory of [input.framesDirectory, input.audioDirectory]) {
|
|
110
|
+
if (typeof directory === "string" && directory)
|
|
111
|
+
await rm(directory, { recursive: true, force: true });
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const renderCleanups = { scene: renderCleanup, experience: renderCleanup };
|
|
115
|
+
/** The legacy single-request render routes stop when their client disconnects. */
|
|
116
|
+
const clientSignal = (response) => {
|
|
117
|
+
const controller = new AbortController();
|
|
118
|
+
response.once("close", () => { if (!response.writableEnded)
|
|
119
|
+
controller.abort("client disconnected"); });
|
|
120
|
+
return controller.signal;
|
|
121
|
+
};
|
|
53
122
|
let stopping = false;
|
|
54
123
|
const server = http.createServer((request, response) => {
|
|
55
124
|
const attemptId = request.headers["x-nerdbro-attempt-id"];
|
|
@@ -64,10 +133,15 @@ export async function runDaemon(options) {
|
|
|
64
133
|
}
|
|
65
134
|
try {
|
|
66
135
|
const url = new URL(request.url || "/", "http://127.0.0.1");
|
|
136
|
+
const routed = await renderJobRoute(renderJobs, renderRunners, renderCleanups, request.method || "GET", url.pathname, () => body(request));
|
|
137
|
+
if (routed) {
|
|
138
|
+
send(response, routed.status, routed.value);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
67
141
|
if (request.method === "GET" && url.pathname === "/status") {
|
|
68
142
|
send(response, 200, {
|
|
69
143
|
ok: true,
|
|
70
|
-
daemon_version: options.version || "0.
|
|
144
|
+
daemon_version: options.version || "0.9.0",
|
|
71
145
|
protocol_version: 1,
|
|
72
146
|
browser_protocol_version: 1,
|
|
73
147
|
pid: process.pid,
|
|
@@ -77,18 +151,20 @@ export async function runDaemon(options) {
|
|
|
77
151
|
origin: options.apiOrigin,
|
|
78
152
|
browser: options.noBrowser ? "disabled-for-test" : "running",
|
|
79
153
|
headless: options.headless,
|
|
154
|
+
render_workers: renderWorkers,
|
|
80
155
|
...browser.authenticationDiagnostics(),
|
|
81
156
|
});
|
|
82
157
|
return;
|
|
83
158
|
}
|
|
84
159
|
if (request.method === "POST" && url.pathname === "/connect") {
|
|
85
160
|
contextCache.clear();
|
|
86
|
-
|
|
161
|
+
for (const worker of pool)
|
|
162
|
+
worker.clearAuthentication();
|
|
87
163
|
const input = await body(request);
|
|
88
164
|
const pairing = await api.request("POST", "/v1/agent/pairings", {
|
|
89
165
|
agent_protocol: 1,
|
|
90
166
|
client_label: input.clientLabel || `${process.platform} ${process.arch}`,
|
|
91
|
-
client_version: input.clientVersion || options.version || "0.
|
|
167
|
+
client_version: input.clientVersion || options.version || "0.9.0",
|
|
92
168
|
}, false);
|
|
93
169
|
send(response, 202, { ok: true, phase: "pairing", pairing });
|
|
94
170
|
return;
|
|
@@ -104,7 +180,8 @@ export async function runDaemon(options) {
|
|
|
104
180
|
const value = envelope.data || {};
|
|
105
181
|
if (typeof value.agent_token === "string") {
|
|
106
182
|
contextCache.clear();
|
|
107
|
-
|
|
183
|
+
for (const worker of pool)
|
|
184
|
+
worker.clearAuthentication();
|
|
108
185
|
agentToken = value.agent_token;
|
|
109
186
|
agentSessionId = String(value.session_id);
|
|
110
187
|
sessionExpiresAt = String(value.session_expires_at);
|
|
@@ -122,7 +199,8 @@ export async function runDaemon(options) {
|
|
|
122
199
|
agentSessionId = undefined;
|
|
123
200
|
sessionExpiresAt = undefined;
|
|
124
201
|
api.setToken(undefined);
|
|
125
|
-
|
|
202
|
+
for (const worker of pool)
|
|
203
|
+
worker.clearAuthentication();
|
|
126
204
|
send(response, 200, { ok: true, disconnected: true });
|
|
127
205
|
return;
|
|
128
206
|
}
|
|
@@ -158,7 +236,28 @@ export async function runDaemon(options) {
|
|
|
158
236
|
}
|
|
159
237
|
if (request.method === "POST" && url.pathname === "/browser/drive") {
|
|
160
238
|
const input = await body(request);
|
|
161
|
-
send(response, 200, { ok: true, result: await browser.drive(
|
|
239
|
+
send(response, 200, { ok: true, result: await browser.drive({
|
|
240
|
+
...input,
|
|
241
|
+
onStep: presenceListener(input.presenceSubject),
|
|
242
|
+
}) });
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (request.method === "POST" && url.pathname === "/browser/experience-drive") {
|
|
246
|
+
const input = await body(request);
|
|
247
|
+
send(response, 200, { ok: true, result: await browser.driveExperience({
|
|
248
|
+
...input,
|
|
249
|
+
onStep: presenceListener(input.presenceSubject),
|
|
250
|
+
}) });
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (request.method === "POST" && url.pathname === "/browser/render-frames") {
|
|
254
|
+
const input = await body(request);
|
|
255
|
+
send(response, 200, { ok: true, result: await browser.renderFrames({ ...input, signal: clientSignal(response) }) });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (request.method === "POST" && url.pathname === "/browser/render-experience-frames") {
|
|
259
|
+
const input = await body(request);
|
|
260
|
+
send(response, 200, { ok: true, result: await browser.renderExperienceFrames({ ...input, signal: clientSignal(response) }) });
|
|
162
261
|
return;
|
|
163
262
|
}
|
|
164
263
|
if (request.method === "POST" && url.pathname === "/browser/preview-observation") {
|
|
@@ -199,7 +298,10 @@ export async function runDaemon(options) {
|
|
|
199
298
|
process.once("SIGINT", shutdown);
|
|
200
299
|
process.once("SIGTERM", shutdown);
|
|
201
300
|
await new Promise((resolve) => server.once("close", resolve));
|
|
202
|
-
|
|
301
|
+
clearInterval(sweeper);
|
|
302
|
+
await renderJobs.stopAll();
|
|
303
|
+
for (const worker of pool)
|
|
304
|
+
await worker.stop();
|
|
203
305
|
await removeDaemonMetadata();
|
|
204
306
|
if (!stopping)
|
|
205
307
|
process.exitCode = 1;
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { episodeTimeline, type Episode, type EpisodeShot, type ShotKeyInputs } from "./episode.js";
|
|
2
|
+
import { type Encoder, type RenderRecipe } from "./video.js";
|
|
3
|
+
/** What identity resolution found for one shot (everything but recipe, profile and encoder). */
|
|
4
|
+
export type ResolvedShot = {
|
|
5
|
+
sources: ShotKeyInputs["sources"];
|
|
6
|
+
dependency_digests: ShotKeyInputs["dependency_digests"];
|
|
7
|
+
audio_sha256: ShotKeyInputs["audio_sha256"];
|
|
8
|
+
/** Free-form identity detail for the manifest (revisions, manifests, notes). */
|
|
9
|
+
identity: Record<string, unknown>;
|
|
10
|
+
/** Opaque data the renderer needs (the candidate source, for instance). */
|
|
11
|
+
render?: unknown;
|
|
12
|
+
};
|
|
13
|
+
export type RenderedShot = {
|
|
14
|
+
output: string;
|
|
15
|
+
manifest: string;
|
|
16
|
+
};
|
|
17
|
+
export type EpisodeDeps = {
|
|
18
|
+
encoder: Encoder;
|
|
19
|
+
runtimeFingerprint: string | null;
|
|
20
|
+
resolveShot: (shot: EpisodeShot) => Promise<ResolvedShot>;
|
|
21
|
+
/** Render one shot into `destination` (a fresh directory); return its video.mp4 and render.json. */
|
|
22
|
+
renderShot: (shot: EpisodeShot, recipe: RenderRecipe, resolved: ResolvedShot, destination: string) => Promise<RenderedShot>;
|
|
23
|
+
log?: (message: string) => void;
|
|
24
|
+
};
|
|
25
|
+
export type EpisodeOptions = {
|
|
26
|
+
episode: Episode;
|
|
27
|
+
/** Relative audio paths resolve against this directory (the episode.json's). */
|
|
28
|
+
baseDirectory: string;
|
|
29
|
+
out: string;
|
|
30
|
+
cache: string;
|
|
31
|
+
workers: number;
|
|
32
|
+
deps: EpisodeDeps;
|
|
33
|
+
};
|
|
34
|
+
export declare function sha256File(file: string): Promise<string | null>;
|
|
35
|
+
export type EpisodeProbe = {
|
|
36
|
+
frames: number;
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
video_codec: string;
|
|
40
|
+
audio_codec: string | null;
|
|
41
|
+
duration: number;
|
|
42
|
+
video_duration: number | null;
|
|
43
|
+
audio_duration: number | null;
|
|
44
|
+
video_start: number | null;
|
|
45
|
+
audio_start: number | null;
|
|
46
|
+
pix_fmt: string;
|
|
47
|
+
};
|
|
48
|
+
/** Count frames and read both streams' start and duration. */
|
|
49
|
+
export declare function probeEpisodeFile(encoder: Encoder, file: string): Promise<EpisodeProbe | null>;
|
|
50
|
+
export type ShotPlan = {
|
|
51
|
+
id: string;
|
|
52
|
+
index: number;
|
|
53
|
+
subject: string;
|
|
54
|
+
key: string;
|
|
55
|
+
frames: number;
|
|
56
|
+
offset_seconds: number;
|
|
57
|
+
duration_seconds: number;
|
|
58
|
+
cache: "valid" | "missing" | "invalid";
|
|
59
|
+
cache_reason?: string;
|
|
60
|
+
inputs: ShotKeyInputs;
|
|
61
|
+
identity: Record<string, unknown>;
|
|
62
|
+
};
|
|
63
|
+
export type ShotOutcome = ShotPlan & {
|
|
64
|
+
state: "reused" | "rendered" | "failed" | "not_started";
|
|
65
|
+
video?: string;
|
|
66
|
+
render_json?: string;
|
|
67
|
+
video_sha256?: string;
|
|
68
|
+
render_seconds?: number;
|
|
69
|
+
error?: {
|
|
70
|
+
code: string;
|
|
71
|
+
message: string;
|
|
72
|
+
stage: string;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/** Resolve, key and check every shot against the cache. No rendering. */
|
|
76
|
+
export declare function planEpisode(options: EpisodeOptions): Promise<{
|
|
77
|
+
shots: ShotPlan[];
|
|
78
|
+
timeline: ReturnType<typeof episodeTimeline>;
|
|
79
|
+
}>;
|
|
80
|
+
export type EpisodeResult = {
|
|
81
|
+
ok: boolean;
|
|
82
|
+
output?: string;
|
|
83
|
+
srt?: string;
|
|
84
|
+
manifest: string;
|
|
85
|
+
state: string;
|
|
86
|
+
shots: ShotOutcome[];
|
|
87
|
+
reused: number;
|
|
88
|
+
rendered: number;
|
|
89
|
+
failed: number;
|
|
90
|
+
qc?: Array<{
|
|
91
|
+
check: string;
|
|
92
|
+
pass: boolean;
|
|
93
|
+
detail: string;
|
|
94
|
+
}>;
|
|
95
|
+
timings: Record<string, number>;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Render (or reuse) every shot, then assemble. A failed shot stops new
|
|
99
|
+
* renders; shots already rendered stay in the cache, so a retry reuses them
|
|
100
|
+
* and starts at the failed shot.
|
|
101
|
+
*/
|
|
102
|
+
export declare function renderEpisode(options: EpisodeOptions): Promise<EpisodeResult>;
|
|
103
|
+
type AudioFile = {
|
|
104
|
+
path: string;
|
|
105
|
+
sha256: string;
|
|
106
|
+
};
|
|
107
|
+
/** Every episode audio file, resolved and hashed (narration, music, effects). */
|
|
108
|
+
export declare function episodeAudioFiles(options: EpisodeOptions): Promise<Map<string, AudioFile>>;
|
|
109
|
+
export {};
|