@codetreker/daynight 0.25.4 → 0.27.2
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 +160 -11
- package/config.example.yml +3 -0
- package/dist/api/client.d.ts +3 -2
- package/dist/api/client.js +10 -6
- package/dist/api/client.js.map +1 -1
- package/dist/api/parse.d.ts +3 -2
- package/dist/api/parse.js +59 -10
- package/dist/api/parse.js.map +1 -1
- package/dist/api/types.d.ts +75 -1
- package/dist/api/worker-mode.d.ts +6 -0
- package/dist/api/worker-mode.js +14 -0
- package/dist/api/worker-mode.js.map +1 -0
- package/dist/cli/commands.js +2 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/commands/controller/command-controls.d.ts +4 -0
- package/dist/commands/controller/command-controls.js +33 -0
- package/dist/commands/controller/command-controls.js.map +1 -0
- package/dist/commands/controller/definition.d.ts +3 -0
- package/dist/commands/controller/definition.js +22 -0
- package/dist/commands/controller/definition.js.map +1 -0
- package/dist/commands/controller/independent.d.ts +3 -0
- package/dist/commands/controller/independent.js +344 -0
- package/dist/commands/controller/independent.js.map +1 -0
- package/dist/commands/controller/index.d.ts +12 -0
- package/dist/commands/controller/index.js +73 -0
- package/dist/commands/controller/index.js.map +1 -0
- package/dist/commands/controller/launch-ticket.d.ts +49 -0
- package/dist/commands/controller/launch-ticket.js +99 -0
- package/dist/commands/controller/launch-ticket.js.map +1 -0
- package/dist/commands/controller/lifecycle-store.d.ts +84 -0
- package/dist/commands/controller/lifecycle-store.js +278 -0
- package/dist/commands/controller/lifecycle-store.js.map +1 -0
- package/dist/commands/controller/local-client.d.ts +44 -0
- package/dist/commands/controller/local-client.js +75 -0
- package/dist/commands/controller/local-client.js.map +1 -0
- package/dist/commands/controller/local-content.d.ts +23 -0
- package/dist/commands/controller/local-content.js +103 -0
- package/dist/commands/controller/local-content.js.map +1 -0
- package/dist/commands/controller/process-proof.d.ts +13 -0
- package/dist/commands/controller/process-proof.js +121 -0
- package/dist/commands/controller/process-proof.js.map +1 -0
- package/dist/commands/controller/providers/claude.d.ts +2 -0
- package/dist/commands/controller/providers/claude.js +470 -0
- package/dist/commands/controller/providers/claude.js.map +1 -0
- package/dist/commands/controller/providers/codex.d.ts +2 -0
- package/dist/commands/controller/providers/codex.js +254 -0
- package/dist/commands/controller/providers/codex.js.map +1 -0
- package/dist/commands/controller/providers/controls-claude.d.ts +26 -0
- package/dist/commands/controller/providers/controls-claude.js +138 -0
- package/dist/commands/controller/providers/controls-claude.js.map +1 -0
- package/dist/commands/controller/providers/controls-codex.d.ts +38 -0
- package/dist/commands/controller/providers/controls-codex.js +199 -0
- package/dist/commands/controller/providers/controls-codex.js.map +1 -0
- package/dist/commands/controller/providers/controls-copilot.d.ts +20 -0
- package/dist/commands/controller/providers/controls-copilot.js +143 -0
- package/dist/commands/controller/providers/controls-copilot.js.map +1 -0
- package/dist/commands/controller/providers/controls.d.ts +21 -0
- package/dist/commands/controller/providers/controls.js +53 -0
- package/dist/commands/controller/providers/controls.js.map +1 -0
- package/dist/commands/controller/providers/copilot-interactions.d.ts +47 -0
- package/dist/commands/controller/providers/copilot-interactions.js +295 -0
- package/dist/commands/controller/providers/copilot-interactions.js.map +1 -0
- package/dist/commands/controller/providers/copilot-projection.d.ts +11 -0
- package/dist/commands/controller/providers/copilot-projection.js +93 -0
- package/dist/commands/controller/providers/copilot-projection.js.map +1 -0
- package/dist/commands/controller/providers/copilot-runtime.d.ts +9 -0
- package/dist/commands/controller/providers/copilot-runtime.js +127 -0
- package/dist/commands/controller/providers/copilot-runtime.js.map +1 -0
- package/dist/commands/controller/providers/copilot.d.ts +2 -0
- package/dist/commands/controller/providers/copilot.js +309 -0
- package/dist/commands/controller/providers/copilot.js.map +1 -0
- package/dist/commands/controller/providers/interactions.d.ts +3 -0
- package/dist/commands/controller/providers/interactions.js +79 -0
- package/dist/commands/controller/providers/interactions.js.map +1 -0
- package/dist/commands/controller/providers/native-rpc.d.ts +28 -0
- package/dist/commands/controller/providers/native-rpc.js +85 -0
- package/dist/commands/controller/providers/native-rpc.js.map +1 -0
- package/dist/commands/controller/providers/projection.d.ts +23 -0
- package/dist/commands/controller/providers/projection.js +99 -0
- package/dist/commands/controller/providers/projection.js.map +1 -0
- package/dist/commands/controller/providers/turns.d.ts +7 -0
- package/dist/commands/controller/providers/turns.js +21 -0
- package/dist/commands/controller/providers/turns.js.map +1 -0
- package/dist/commands/controller/providers/types.d.ts +44 -0
- package/dist/commands/controller/providers/types.js +2 -0
- package/dist/commands/controller/providers/types.js.map +1 -0
- package/dist/commands/controller/recovery.d.ts +6 -0
- package/dist/commands/controller/recovery.js +22 -0
- package/dist/commands/controller/recovery.js.map +1 -0
- package/dist/commands/controller/relay.d.ts +18 -0
- package/dist/commands/controller/relay.js +299 -0
- package/dist/commands/controller/relay.js.map +1 -0
- package/dist/commands/controller/resume.d.ts +18 -0
- package/dist/commands/controller/resume.js +193 -0
- package/dist/commands/controller/resume.js.map +1 -0
- package/dist/commands/controller/runtime.d.ts +5 -0
- package/dist/commands/controller/runtime.js +455 -0
- package/dist/commands/controller/runtime.js.map +1 -0
- package/dist/commands/controller/windows-job.d.ts +3 -0
- package/dist/commands/controller/windows-job.js +59 -0
- package/dist/commands/controller/windows-job.js.map +1 -0
- package/dist/commands/controller/wire-display.d.ts +5 -0
- package/dist/commands/controller/wire-display.js +11 -0
- package/dist/commands/controller/wire-display.js.map +1 -0
- package/dist/commands/skill/skills/using-daynight/SKILL.md +52 -162
- package/dist/commands/skill/skills/using-daynight/references/authorization.md +36 -0
- package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +77 -193
- package/dist/commands/skill/skills/using-daynight/references/create-task.md +31 -186
- package/dist/commands/skill/skills/using-daynight/references/final-acceptance.md +25 -0
- package/dist/commands/skill/skills/using-daynight/references/goal.md +46 -243
- package/dist/commands/skill/skills/using-daynight/references/handbook.md +37 -294
- package/dist/commands/skill/skills/using-daynight/references/handoff.md +33 -91
- package/dist/commands/skill/skills/using-daynight/references/project-management.md +24 -0
- package/dist/commands/skill/skills/using-daynight/references/run-task.md +18 -59
- package/dist/commands/skill/skills/using-daynight/references/setup.md +16 -0
- package/dist/commands/skill/skills/using-daynight/references/task-content.md +80 -177
- package/dist/commands/skill/skills/using-daynight/references/task-execution.md +34 -126
- package/dist/commands/skill/skills/using-daynight/references/task-management.md +135 -0
- package/dist/commands/skill/skills/using-daynight/references/write-safety.md +34 -0
- package/dist/commands/task/command.js +5 -3
- package/dist/commands/task/command.js.map +1 -1
- package/dist/commands/task/definition.js +4 -2
- package/dist/commands/task/definition.js.map +1 -1
- package/dist/commands/task/rendering.d.ts +1 -0
- package/dist/commands/task/rendering.js +10 -1
- package/dist/commands/task/rendering.js.map +1 -1
- package/dist/commands/worker/backend.d.ts +7 -0
- package/dist/commands/worker/backend.js +7 -0
- package/dist/commands/worker/backend.js.map +1 -0
- package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
- package/dist/commands/worker/backends/grant-renewal.js +42 -0
- package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
- package/dist/commands/worker/backends/session-api.d.ts +66 -0
- package/dist/commands/worker/backends/session-api.js +84 -0
- package/dist/commands/worker/backends/session-api.js.map +1 -0
- package/dist/commands/worker/backends/web-process.d.ts +79 -0
- package/dist/commands/worker/backends/web-process.js +156 -0
- package/dist/commands/worker/backends/web-process.js.map +1 -0
- package/dist/commands/worker/backends/web-store.d.ts +49 -0
- package/dist/commands/worker/backends/web-store.js +323 -0
- package/dist/commands/worker/backends/web-store.js.map +1 -0
- package/dist/commands/worker/backends/web-types.d.ts +83 -0
- package/dist/commands/worker/backends/web-types.js +3 -0
- package/dist/commands/worker/backends/web-types.js.map +1 -0
- package/dist/commands/worker/backends/web.d.ts +26 -0
- package/dist/commands/worker/backends/web.js +178 -0
- package/dist/commands/worker/backends/web.js.map +1 -0
- package/dist/commands/worker/config.js +12 -5
- package/dist/commands/worker/config.js.map +1 -1
- package/dist/commands/worker/control.d.ts +2 -0
- package/dist/commands/worker/control.js +11 -4
- package/dist/commands/worker/control.js.map +1 -1
- package/dist/commands/worker/coordinator.d.ts +10 -1
- package/dist/commands/worker/coordinator.js +153 -24
- package/dist/commands/worker/coordinator.js.map +1 -1
- package/dist/commands/worker/herdr/agents.js +5 -4
- package/dist/commands/worker/herdr/agents.js.map +1 -1
- package/dist/commands/worker/herdr/arguments.js +9 -4
- package/dist/commands/worker/herdr/arguments.js.map +1 -1
- package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
- package/dist/commands/worker/herdr/claude-input.js +20 -0
- package/dist/commands/worker/herdr/claude-input.js.map +1 -0
- package/dist/commands/worker/herdr/command.d.ts +11 -2
- package/dist/commands/worker/herdr/command.js +23 -8
- package/dist/commands/worker/herdr/command.js.map +1 -1
- package/dist/commands/worker/herdr/instance.d.ts +5 -1
- package/dist/commands/worker/herdr/instance.js +31 -1
- package/dist/commands/worker/herdr/instance.js.map +1 -1
- package/dist/commands/worker/herdr/preflight.d.ts +1 -1
- package/dist/commands/worker/herdr/preflight.js +34 -15
- package/dist/commands/worker/herdr/preflight.js.map +1 -1
- package/dist/commands/worker/herdr/version-probe.d.ts +13 -0
- package/dist/commands/worker/herdr/version-probe.js +21 -0
- package/dist/commands/worker/herdr/version-probe.js.map +1 -0
- package/dist/commands/worker/herdr.js +7 -7
- package/dist/commands/worker/herdr.js.map +1 -1
- package/dist/commands/worker/index.d.ts +2 -0
- package/dist/commands/worker/index.js +1 -1
- package/dist/commands/worker/index.js.map +1 -1
- package/dist/commands/worker/prompts.js +5 -1
- package/dist/commands/worker/prompts.js.map +1 -1
- package/dist/commands/worker/remote.d.ts +3 -1
- package/dist/commands/worker/remote.js +4 -0
- package/dist/commands/worker/remote.js.map +1 -1
- package/dist/commands/worker/reporter.d.ts +14 -0
- package/dist/commands/worker/reporter.js +174 -0
- package/dist/commands/worker/reporter.js.map +1 -0
- package/dist/commands/worker/repositories.js +2 -2
- package/dist/commands/worker/repositories.js.map +1 -1
- package/dist/commands/worker/runtime.d.ts +2 -0
- package/dist/commands/worker/runtime.js +76 -11
- package/dist/commands/worker/runtime.js.map +1 -1
- package/dist/commands/worker/setup-environment.d.ts +2 -1
- package/dist/commands/worker/setup-environment.js +10 -4
- package/dist/commands/worker/setup-environment.js.map +1 -1
- package/dist/commands/worker/setup.js +5 -5
- package/dist/commands/worker/setup.js.map +1 -1
- package/dist/commands/worker/store.d.ts +2 -1
- package/dist/commands/worker/store.js +19 -9
- package/dist/commands/worker/store.js.map +1 -1
- package/dist/commands/worker/telemetry.d.ts +22 -0
- package/dist/commands/worker/telemetry.js +265 -0
- package/dist/commands/worker/telemetry.js.map +1 -0
- package/dist/commands/worker/types.d.ts +4 -1
- package/dist/session/controller-protocol.d.ts +245 -0
- package/dist/session/controller-protocol.js +218 -0
- package/dist/session/controller-protocol.js.map +1 -0
- package/dist/session/controls.d.ts +28 -0
- package/dist/session/controls.js +37 -0
- package/dist/session/controls.js.map +1 -0
- package/dist/session/protocol.d.ts +290 -0
- package/dist/session/protocol.js +307 -0
- package/dist/session/protocol.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { open, mkdir, readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
5
|
+
import { controllerExecutionDirectory, controllerTicketPath, readLaunchTicket, writeLaunchTicket } from "../../controller/launch-ticket.js";
|
|
6
|
+
import { readControllerSnapshot } from "../../controller/lifecycle-store.js";
|
|
7
|
+
import { requestController } from "../../controller/local-client.js";
|
|
8
|
+
import { captureProcessProof } from "../../controller/process-proof.js";
|
|
9
|
+
import { writeControllerCredential } from "./session-api.js";
|
|
10
|
+
export const createWebControllerLauncher = (options) => {
|
|
11
|
+
const current = (task) => { const latest = options.store.getTask(task); if (latest?.webExecution == null)
|
|
12
|
+
throw new Error("The web execution identity disappeared."); return latest; };
|
|
13
|
+
const tails = new Map();
|
|
14
|
+
const serialize = async (task, action) => {
|
|
15
|
+
const key = task.webExecution?.executionId ?? task.claimId;
|
|
16
|
+
const previous = tails.get(key) ?? Promise.resolve();
|
|
17
|
+
let release;
|
|
18
|
+
const gate = new Promise(resolve => { release = resolve; });
|
|
19
|
+
const tail = previous.then(() => gate);
|
|
20
|
+
tails.set(key, tail);
|
|
21
|
+
await previous;
|
|
22
|
+
try {
|
|
23
|
+
return await action();
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
release();
|
|
27
|
+
if (tails.get(key) === tail)
|
|
28
|
+
tails.delete(key);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const methods = {
|
|
32
|
+
prepare: async (input, prompt, signal) => {
|
|
33
|
+
let task = current(input);
|
|
34
|
+
let execution = task.webExecution;
|
|
35
|
+
if (execution.ticketPath !== null) {
|
|
36
|
+
const ticket = await readLaunchTicket(options.homeDirectory, execution.launchId);
|
|
37
|
+
if (execution.nativeHome === null)
|
|
38
|
+
options.store.updateWebExecution(task, { nativeHome: ticket.nativeHome }, options.now());
|
|
39
|
+
return ticket;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const existing = await readLaunchTicket(options.homeDirectory, execution.launchId);
|
|
43
|
+
if (existing.executionId !== execution.executionId || existing.claimId !== task.claimId || existing.executionGeneration !== execution.executionGeneration || existing.controllerInstanceId !== execution.controllerInstanceId || existing.initialOperationId !== execution.initialOperationId || existing.sessionId !== execution.sessionId || existing.initialPrompt !== execution.initialPrompt)
|
|
44
|
+
throw new Error("An existing launch ticket does not match the durable execution intent.");
|
|
45
|
+
options.store.updateWebExecution(task, { ticketPath: controllerTicketPath(options.homeDirectory, execution.launchId), nativeHome: existing.nativeHome }, options.now());
|
|
46
|
+
return existing;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
if (execution.initialPrompt === null) {
|
|
53
|
+
task = options.store.updateWebExecution(task, { initialPrompt: prompt }, options.now());
|
|
54
|
+
execution = task.webExecution;
|
|
55
|
+
}
|
|
56
|
+
if (task.resources.worktree === null || task.configuration === null || task.userId === null)
|
|
57
|
+
throw new Error("Controller launch requires its original worktree, provider and owner.");
|
|
58
|
+
if (execution.sessionId === null) {
|
|
59
|
+
const registered = await options.sessionApi.register(task, execution, signal);
|
|
60
|
+
task = options.store.updateWebExecution(task, { sessionId: registered.sessionId }, options.now());
|
|
61
|
+
execution = task.webExecution;
|
|
62
|
+
}
|
|
63
|
+
const directory = controllerExecutionDirectory(options.homeDirectory, execution.executionId);
|
|
64
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
65
|
+
const credentialFile = path.join(directory, "credential.json");
|
|
66
|
+
const previous = readControllerSnapshot(path.join(directory, "journal.sqlite"));
|
|
67
|
+
const stop = previous !== null && previous.executionGeneration !== execution.executionGeneration && previous.nativeStopped && previous.stoppedAt !== null ? { generation: previous.executionGeneration, instanceId: previous.controllerInstanceId, recordId: execution.launchId, stoppedAt: previous.stoppedAt } : undefined;
|
|
68
|
+
const grant = await options.sessionApi.grant(task, execution, signal, stop);
|
|
69
|
+
await writeControllerCredential(credentialFile, grant);
|
|
70
|
+
const endpointKey = createHash("sha256").update(`${options.homeDirectory}:${execution.launchId}`).digest("hex").slice(0, 20);
|
|
71
|
+
const ipcEndpoint = process.platform === "win32" ? `\\\\.\\pipe\\daynight-${endpointKey}` : path.join(options.homeDirectory, ".daynight", "c", `${endpointKey}.sock`);
|
|
72
|
+
if (process.platform !== "win32" && Buffer.byteLength(ipcEndpoint) > (process.platform === "darwin" ? 103 : 107))
|
|
73
|
+
throw new Error("The controller IPC endpoint exceeds this platform's socket path limit.");
|
|
74
|
+
if (process.platform !== "win32")
|
|
75
|
+
await mkdir(path.dirname(ipcEndpoint), { recursive: true, mode: 0o700 });
|
|
76
|
+
if (task.resources.worktree === null || task.configuration === null || task.userId === null)
|
|
77
|
+
throw new Error("The frozen launch binding disappeared.");
|
|
78
|
+
const nativeHome = execution.nativeHome ?? (task.configuration.agent === "codex" ? process.env.CODEX_HOME ?? path.join(options.homeDirectory, ".codex")
|
|
79
|
+
: task.configuration.agent === "claude" ? process.env.CLAUDE_CONFIG_DIR ?? path.join(options.homeDirectory, ".claude")
|
|
80
|
+
: process.env.COPILOT_HOME ?? path.join(options.homeDirectory, ".copilot"));
|
|
81
|
+
if (execution.nativeHome === null)
|
|
82
|
+
execution = options.store.updateWebExecution(task, { nativeHome }, options.now()).webExecution;
|
|
83
|
+
const initialPrompt = execution.initialPrompt ?? prompt;
|
|
84
|
+
const ticket = { schemaVersion: 1, launchId: execution.launchId, executionId: execution.executionId, controllerId: execution.controllerId, controllerInstanceId: execution.controllerInstanceId, sessionId: execution.sessionId, executionGeneration: execution.executionGeneration, serverOrigin: task.serverOrigin, projectId: task.projectId, taskId: task.taskId, claimId: task.claimId, workerId: task.workerId, worktreeId: task.worktreeId, userId: task.userId, provider: task.configuration.agent, cwd: task.resources.worktree.worktreePath, nativeHome, configuration: task.configuration, initialOperationId: execution.initialOperationId, initialPrompt, resumeNativeSessionId: task.resources.nativeSession?.sessionId ?? null, credentialFile, ipcEndpoint, ipcSecret: randomBytes(32).toString("hex"), createdAt: new Date(options.now()).toISOString() };
|
|
85
|
+
const ticketPath = await writeLaunchTicket(options.homeDirectory, ticket);
|
|
86
|
+
options.store.updateWebExecution(task, { ticketPath, initialPrompt }, options.now());
|
|
87
|
+
return ticket;
|
|
88
|
+
},
|
|
89
|
+
launch: async (input, ticket, signal) => {
|
|
90
|
+
let task = current(input);
|
|
91
|
+
if (task.webExecution.launchSubmission !== "not-submitted")
|
|
92
|
+
return;
|
|
93
|
+
// A reusable grant also supports the first hello, including a lost bootstrap handshake.
|
|
94
|
+
await writeControllerCredential(ticket.credentialFile, await options.sessionApi.grant(task, { ...task.webExecution, launchSubmission: "unknown" }, signal));
|
|
95
|
+
const directory = controllerExecutionDirectory(options.homeDirectory, ticket.executionId);
|
|
96
|
+
const log = await open(path.join(directory, "controller.log"), "a", 0o600);
|
|
97
|
+
try {
|
|
98
|
+
signal.throwIfAborted();
|
|
99
|
+
task = options.store.updateWebExecution(task, { launchSubmission: "unknown" }, options.now());
|
|
100
|
+
const child = spawn(process.execPath, [path.join(options.packageDirectory, "dist", "main.js"), "controller", ticket.provider, "--launch-id", ticket.launchId], { cwd: ticket.cwd, env: { ...process.env, HOME: options.homeDirectory, USERPROFILE: options.homeDirectory }, detached: process.platform !== "win32", stdio: ["ignore", log.fd, log.fd], windowsHide: true });
|
|
101
|
+
await new Promise((resolve, reject) => { child.once("spawn", resolve); child.once("error", reject); });
|
|
102
|
+
child.unref();
|
|
103
|
+
if (child.pid === undefined)
|
|
104
|
+
throw new Error("Controller spawn did not establish its process identity.");
|
|
105
|
+
const proof = await captureProcessProof(child.pid);
|
|
106
|
+
task = options.store.updateWebExecution(task, { controllerProcess: proof }, options.now());
|
|
107
|
+
const deadline = Date.now() + 30000;
|
|
108
|
+
while (Date.now() < deadline) {
|
|
109
|
+
signal.throwIfAborted();
|
|
110
|
+
try {
|
|
111
|
+
const response = await requestController(ticket, { kind: "observe" }, { signal, timeoutMs: 1000 });
|
|
112
|
+
options.store.updateWebExecution(task, { launchSubmission: "acknowledged", nativeProcesses: response.snapshot.nativeProcesses }, options.now());
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
117
|
+
throw new Error("Controller exited before its authenticated initialization; inspect its private log.");
|
|
118
|
+
}
|
|
119
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
120
|
+
}
|
|
121
|
+
throw new Error("Controller startup outcome is unknown; the original process and launch intent are retained.");
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
await log.close();
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
refreshGrant: async (input, ticket, signal) => {
|
|
128
|
+
const task = current(input);
|
|
129
|
+
if (task.webExecution.launchId !== ticket.launchId || task.cleanup?.agentStopped)
|
|
130
|
+
return;
|
|
131
|
+
let expiresAt;
|
|
132
|
+
try {
|
|
133
|
+
expiresAt = JSON.parse(await readFile(ticket.credentialFile, "utf8")).expiresAt;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
throw new Error("Controller credential state is unavailable; it cannot be silently replaced.");
|
|
137
|
+
}
|
|
138
|
+
if (typeof expiresAt !== "string" || !Number.isFinite(Date.parse(expiresAt)))
|
|
139
|
+
throw new Error("Controller credential expiry is invalid.");
|
|
140
|
+
if (Date.parse(expiresAt) - options.now() > 120_000)
|
|
141
|
+
return;
|
|
142
|
+
const grant = await options.sessionApi.grant(task, task.webExecution, signal);
|
|
143
|
+
const latest = current(task);
|
|
144
|
+
if (latest.webExecution.launchId !== ticket.launchId || latest.cleanup?.agentStopped)
|
|
145
|
+
return;
|
|
146
|
+
signal.throwIfAborted();
|
|
147
|
+
await writeControllerCredential(ticket.credentialFile, grant);
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
prepare: (...args) => serialize(args[0], () => methods.prepare(...args)),
|
|
152
|
+
launch: (...args) => serialize(args[0], () => methods.launch(...args)),
|
|
153
|
+
refreshGrant: (...args) => serialize(args[0], () => methods.refreshGrant(...args)),
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=web-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-process.js","sourceRoot":"","sources":["../../../../src/commands/worker/backends/web-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ExecutionConfiguration as FrozenExecutionConfiguration, WorkerProject, ResourceOwner } from "../types.js";
|
|
2
|
+
import type { LocalTask, ClaimIdentity, CleanupState, WorktreeBinding, WebExecutionState } from "./web-types.js";
|
|
3
|
+
export declare const openWebExecutionStore: (filename: string) => {
|
|
4
|
+
close: () => void;
|
|
5
|
+
getTask: (identity: ClaimIdentity) => LocalTask | null;
|
|
6
|
+
listUnfinishedTasks: () => LocalTask[];
|
|
7
|
+
register: (input: ResourceOwner & {
|
|
8
|
+
project: WorkerProject;
|
|
9
|
+
serverOrigin: string;
|
|
10
|
+
workerId: string;
|
|
11
|
+
userId: string;
|
|
12
|
+
configuration: FrozenExecutionConfiguration;
|
|
13
|
+
}, now: number) => LocalTask;
|
|
14
|
+
clearShutdown: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
15
|
+
beginRecovery: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
16
|
+
authorizeRecoveryRetry: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
17
|
+
bindNativeSession: (identity: ClaimIdentity, reference: {
|
|
18
|
+
source: "controller";
|
|
19
|
+
sessionId: string;
|
|
20
|
+
}, now: number) => LocalTask;
|
|
21
|
+
completeTask: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
22
|
+
initializeWebExecution: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
23
|
+
updateWebExecution: (identity: ClaimIdentity, patch: Partial<WebExecutionState>, now: number) => LocalTask;
|
|
24
|
+
beginWebGeneration: (identity: ClaimIdentity, previous: {
|
|
25
|
+
executionGeneration: string;
|
|
26
|
+
controllerInstanceId: string;
|
|
27
|
+
nativeSessionId: string | null;
|
|
28
|
+
nativeStopped: boolean;
|
|
29
|
+
}, now: number) => LocalTask;
|
|
30
|
+
confirmBackendResourcesClosed: (identity: ClaimIdentity, proof: {
|
|
31
|
+
controllerStopped: true;
|
|
32
|
+
endpointClosed: true;
|
|
33
|
+
}, now: number) => LocalTask;
|
|
34
|
+
bindWorktree: (identity: ClaimIdentity, binding: WorktreeBinding, now: number) => LocalTask;
|
|
35
|
+
beginCleanup: (identity: ClaimIdentity, input: {
|
|
36
|
+
kind: CleanupState["kind"];
|
|
37
|
+
deadline: number;
|
|
38
|
+
}, now: number) => LocalTask;
|
|
39
|
+
markCleanupInputSubmitting: (identity: ClaimIdentity, now: number) => LocalTask;
|
|
40
|
+
recordCleanupInputOutcome: (identity: ClaimIdentity, input: "submitted" | "rejected" | "unavailable", now: number) => LocalTask;
|
|
41
|
+
recordCleanupResult: (identity: ClaimIdentity, result: NonNullable<CleanupState["result"]>, error: string | null, now: number) => LocalTask;
|
|
42
|
+
confirmAgentStopped: (identity: ClaimIdentity, proof: {
|
|
43
|
+
agentStopped: true;
|
|
44
|
+
}, now: number) => LocalTask;
|
|
45
|
+
confirmWorktreeDeleted: (identity: ClaimIdentity, proof: {
|
|
46
|
+
worktreeDeleted: true;
|
|
47
|
+
}, now: number) => LocalTask;
|
|
48
|
+
};
|
|
49
|
+
export type WebExecutionStore = ReturnType<typeof openWebExecutionStore>;
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import Database from "better-sqlite3";
|
|
4
|
+
import { canonicalId } from "../../../api/parse.js";
|
|
5
|
+
import { normalizeServerUrl } from "../../../config/server.js";
|
|
6
|
+
import { validateWorkerAgentMode, workerAgentControlMode } from "../../../api/worker-mode.js";
|
|
7
|
+
import { backendResourcesClosed, taskAgentControlMode } from "./web-types.js";
|
|
8
|
+
const integer = (value, name, minimum = 0) => {
|
|
9
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < minimum)
|
|
10
|
+
throw new Error(`${name} must be a safe integer of at least ${minimum}.`);
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
const text = (value, name, empty = false) => {
|
|
14
|
+
if (typeof value !== "string" || (!empty && value.trim().length === 0))
|
|
15
|
+
throw new Error(`${name} must be ${empty ? "a" : "a nonempty"} string.`);
|
|
16
|
+
return value;
|
|
17
|
+
};
|
|
18
|
+
const id = (value, name) => {
|
|
19
|
+
const normalized = canonicalId(text(value, name));
|
|
20
|
+
if (normalized === null)
|
|
21
|
+
throw new Error(`${name} must be a UUID.`);
|
|
22
|
+
return normalized;
|
|
23
|
+
};
|
|
24
|
+
const absolutePath = (value, name) => {
|
|
25
|
+
const result = text(value, name);
|
|
26
|
+
if (!path.isAbsolute(result))
|
|
27
|
+
throw new Error(`${name} must be absolute.`);
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
30
|
+
const bool = (value, name) => {
|
|
31
|
+
if (typeof value !== "boolean")
|
|
32
|
+
throw new Error(`${name} must be boolean.`);
|
|
33
|
+
return value;
|
|
34
|
+
};
|
|
35
|
+
const oneOf = (value, choices, name) => {
|
|
36
|
+
if (typeof value !== "string" || !choices.includes(value))
|
|
37
|
+
throw new Error(`${name} is invalid.`);
|
|
38
|
+
return value;
|
|
39
|
+
};
|
|
40
|
+
const record = (value, fields, name) => {
|
|
41
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
42
|
+
throw new Error(`${name} must be an object.`);
|
|
43
|
+
if (Object.keys(value).length !== fields.length || fields.some((field) => !Object.hasOwn(value, field)))
|
|
44
|
+
throw new Error(`${name} has invalid fields.`);
|
|
45
|
+
return value;
|
|
46
|
+
};
|
|
47
|
+
const nullable = (value, parse) => value === null ? null : parse(value);
|
|
48
|
+
const version = (value) => {
|
|
49
|
+
if (typeof value !== "string" || !/^[1-9][0-9]*$/.test(value) || BigInt(value) > 9223372036854775807n)
|
|
50
|
+
throw new Error("Remote version must be a positive int64 decimal string.");
|
|
51
|
+
return value;
|
|
52
|
+
};
|
|
53
|
+
const parseConfiguration = (value) => {
|
|
54
|
+
const data = record(value, ["agent", "agentControlMode", "model", "args", "recoveryLimit"], "Frozen execution configuration");
|
|
55
|
+
if (!Array.isArray(data.args))
|
|
56
|
+
throw new Error("Agent arguments must be an array.");
|
|
57
|
+
const agentControlMode = workerAgentControlMode(data);
|
|
58
|
+
return { agent: validateWorkerAgentMode(data.agent, agentControlMode), agentControlMode, model: nullable(data.model, (entry) => text(entry, "Model")),
|
|
59
|
+
args: data.args.map((entry) => text(entry, "Agent argument", true)), recoveryLimit: integer(data.recoveryLimit, "Recovery limit") };
|
|
60
|
+
};
|
|
61
|
+
const parseWorktree = (value) => {
|
|
62
|
+
const data = record(value, ["repositoryPath", "commonDirectory", "worktreePath", "branch"], "Worktree binding");
|
|
63
|
+
return { repositoryPath: absolutePath(data.repositoryPath, "Repository path"), commonDirectory: absolutePath(data.commonDirectory, "Git common directory"), worktreePath: absolutePath(data.worktreePath, "Worktree path"), branch: text(data.branch, "Worktree branch") };
|
|
64
|
+
};
|
|
65
|
+
const parseCleanupBaseline = (value) => {
|
|
66
|
+
const data = record(value, ["stateChangeSeq", "completionSeq"], "Cleanup completion baseline");
|
|
67
|
+
return { stateChangeSeq: integer(data.stateChangeSeq, "Cleanup state-change sequence"), completionSeq: integer(data.completionSeq, "Cleanup completion sequence") };
|
|
68
|
+
};
|
|
69
|
+
const parseExecutionSummary = (value) => { if (value !== null)
|
|
70
|
+
throw new Error("Web execution summaries are derived from fresh remote inventory."); return value; };
|
|
71
|
+
const parseWebExecution = (value) => {
|
|
72
|
+
const data = record(value, ["executionId", "registrationId", "controllerId", "controllerInstanceId", "launchId", "sessionId", "executionGeneration", "initialOperationId", "initialPrompt", "launchSubmission", "controllerProcess", "nativeProcesses", "cleanupOperationId", "ticketPath", ...["summary", "initialInputState", "activity", "nativeHome", "restartAfterShutdown"].filter(key => typeof value === "object" && value !== null && Object.hasOwn(value, key))], "Web execution");
|
|
73
|
+
for (const key of ["executionId", "registrationId", "controllerId", "controllerInstanceId", "launchId", "initialOperationId"])
|
|
74
|
+
id(data[key], key);
|
|
75
|
+
for (const key of ["sessionId", "cleanupOperationId"])
|
|
76
|
+
nullable(data[key], entry => id(entry, key));
|
|
77
|
+
version(data.executionGeneration);
|
|
78
|
+
oneOf(data.launchSubmission, ["not-submitted", "unknown", "acknowledged"], "Controller launch submission");
|
|
79
|
+
nullable(data.initialPrompt, entry => text(entry, "Initial prompt"));
|
|
80
|
+
nullable(data.ticketPath, entry => absolutePath(entry, "Controller ticket"));
|
|
81
|
+
const proof = (value) => { const hasJob = typeof value === "object" && value !== null && "jobObjectName" in value; const p = record(value, ["pid", "parentPid", "processGroupId", "startedAt", "commandHash", ...(hasJob ? ["jobObjectName"] : [])], "Process proof"); if (hasJob && (typeof p.jobObjectName !== "string" || !/^Local\\Daynight-[0-9a-f-]{36}$/.test(p.jobObjectName)))
|
|
82
|
+
throw new Error("Invalid Windows job identity."); integer(p.pid, "Process ID", 1); integer(p.parentPid, "Parent ID"); nullable(p.processGroupId, entry => integer(entry, "Process group", 1)); text(p.startedAt, "Process creation"); if (typeof p.commandHash !== "string" || !/^[a-f0-9]{64}$/.test(p.commandHash))
|
|
83
|
+
throw new Error("Invalid process command proof."); };
|
|
84
|
+
if (data.controllerProcess !== null)
|
|
85
|
+
proof(data.controllerProcess);
|
|
86
|
+
if (!Array.isArray(data.nativeProcesses))
|
|
87
|
+
throw new Error("Native process evidence must be an array.");
|
|
88
|
+
data.nativeProcesses.forEach(proof);
|
|
89
|
+
data.restartAfterShutdown ??= false;
|
|
90
|
+
bool(data.restartAfterShutdown, "Orderly controller restart");
|
|
91
|
+
data.nativeHome ??= null;
|
|
92
|
+
nullable(data.nativeHome, entry => absolutePath(entry, "Native profile home"));
|
|
93
|
+
data.summary ??= null;
|
|
94
|
+
data.initialInputState ??= "unknown";
|
|
95
|
+
data.activity ??= "unknown";
|
|
96
|
+
nullable(data.summary, parseExecutionSummary);
|
|
97
|
+
oneOf(data.initialInputState, ["not_submitted", "dispatching", "provider_accepted", "confirmed", "failed", "unknown"], "Initial input state");
|
|
98
|
+
oneOf(data.activity, ["initializing", "idle", "working", "waiting_input", "stopped", "unknown"], "Controller activity");
|
|
99
|
+
return data;
|
|
100
|
+
};
|
|
101
|
+
const parseCleanup = (value) => {
|
|
102
|
+
const web = typeof value === "object" && value !== null && "mode" in value && value.mode === "web";
|
|
103
|
+
const data = record(value, ["kind", "startedAt", "deadline", "input", "baseline", "result", "error", "agentStopped", "workspaceClosed", "worktreeDeleted", ...(web ? ["mode", "backendResourcesClosed"] : [])], "Cleanup state");
|
|
104
|
+
if (web && data.workspaceClosed !== null)
|
|
105
|
+
throw new Error("Web cleanup cannot carry a Herdr workspace closure.");
|
|
106
|
+
const result = { kind: oneOf(data.kind, ["terminal", "shutdown"], "Cleanup kind"), startedAt: integer(data.startedAt, "Cleanup start"), deadline: integer(data.deadline, "Cleanup deadline"),
|
|
107
|
+
input: oneOf(data.input, ["not-submitted", "unknown", "submitted", "rejected", "unavailable"], "Cleanup input state"),
|
|
108
|
+
baseline: nullable(data.baseline, parseCleanupBaseline),
|
|
109
|
+
result: nullable(data.result, (entry) => oneOf(entry, ["completed", "timed-out", "failed", "unavailable"], "Cleanup result")), error: nullable(data.error, (entry) => text(entry, "Cleanup error")),
|
|
110
|
+
agentStopped: bool(data.agentStopped, "Agent stopped"), workspaceClosed: web && data.workspaceClosed === null ? null : bool(data.workspaceClosed, "Workspace closed"), ...(web ? { mode: "web", backendResourcesClosed: bool(data.backendResourcesClosed, "Backend resources closed") } : {}), worktreeDeleted: bool(data.worktreeDeleted, "Worktree deleted") };
|
|
111
|
+
if (result.deadline < result.startedAt || result.deadline - result.startedAt > 600_000)
|
|
112
|
+
throw new Error("Cleanup deadline must be within ten minutes of its original start.");
|
|
113
|
+
if ((backendResourcesClosed(result) && !result.agentStopped) || (result.worktreeDeleted && !backendResourcesClosed(result)))
|
|
114
|
+
throw new Error("Cleanup progress is out of order.");
|
|
115
|
+
if (result.baseline !== null && result.input !== "submitted")
|
|
116
|
+
throw new Error("A cleanup completion baseline requires confirmed input submission.");
|
|
117
|
+
return result;
|
|
118
|
+
};
|
|
119
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
120
|
+
const key = (identity) => [identity.projectId, identity.taskId, identity.claimId].map(value => id(value, "Execution identity")).join("/");
|
|
121
|
+
const validate = (task) => {
|
|
122
|
+
record(task, ["projectId", "taskId", "claimId", "worktreeId", "serverOrigin", "workerId", "userId", "status", "repoUrl", "repositoryPath", "configuration", "resources", "nativeExecution", "webExecution", "recovery", "cleanup", "control", "createdAt", "updatedAt"], "Web execution record");
|
|
123
|
+
key(task);
|
|
124
|
+
normalizeServerUrl(task.serverOrigin);
|
|
125
|
+
id(task.workerId, "Worker ID");
|
|
126
|
+
id(task.worktreeId, "Worktree ID");
|
|
127
|
+
nullable(task.userId, value => id(value, "Execution owner"));
|
|
128
|
+
if (task.configuration === null || task.configuration.agentControlMode !== "web")
|
|
129
|
+
throw new Error("Web execution requires its frozen configuration.");
|
|
130
|
+
parseConfiguration(task.configuration);
|
|
131
|
+
text(task.repoUrl, "Repository URL");
|
|
132
|
+
absolutePath(task.repositoryPath, "Repository path");
|
|
133
|
+
integer(task.createdAt, "Execution creation time");
|
|
134
|
+
integer(task.updatedAt, "Execution update time");
|
|
135
|
+
record(task.resources, ["mode", "worktree", "herdr", "nativeSession"], "Web resources");
|
|
136
|
+
if (task.resources.mode !== "web" || task.resources.herdr !== null || task.nativeExecution !== null || task.control !== null)
|
|
137
|
+
throw new Error("Web execution contains incompatible backend resources.");
|
|
138
|
+
if (task.resources.nativeSession !== null) {
|
|
139
|
+
const native = record(task.resources.nativeSession, ["source", "sessionId"], "Native session");
|
|
140
|
+
if (native.source !== "controller")
|
|
141
|
+
throw new Error("The native session does not belong to the Controller.");
|
|
142
|
+
id(native.sessionId, "Native session ID");
|
|
143
|
+
}
|
|
144
|
+
record(task.recovery, ["count", "pauseReason", "retryAuthorized"], "Recovery state");
|
|
145
|
+
integer(task.recovery.count, "Recovery count");
|
|
146
|
+
nullable(task.recovery.pauseReason, value => text(value, "Recovery pause"));
|
|
147
|
+
bool(task.recovery.retryAuthorized, "Recovery authorization");
|
|
148
|
+
oneOf(task.status, ["pending", "active", "done"], "Web execution state");
|
|
149
|
+
nullable(task.resources.worktree, parseWorktree);
|
|
150
|
+
nullable(task.cleanup, parseCleanup);
|
|
151
|
+
nullable(task.webExecution, parseWebExecution);
|
|
152
|
+
return task;
|
|
153
|
+
};
|
|
154
|
+
// This store contains Controller delivery and stop evidence only. Claim scheduling remains in the minimal Worker store.
|
|
155
|
+
export const openWebExecutionStore = (filename) => {
|
|
156
|
+
const db = new Database(filename);
|
|
157
|
+
try {
|
|
158
|
+
db.pragma("journal_mode = WAL");
|
|
159
|
+
db.pragma("synchronous = FULL");
|
|
160
|
+
db.exec("CREATE TABLE IF NOT EXISTS executions (identity TEXT PRIMARY KEY NOT NULL, data TEXT NOT NULL CHECK(json_valid(data))) STRICT;");
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
db.close();
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
const getTask = (identity) => {
|
|
167
|
+
const row = db.prepare("SELECT data FROM executions WHERE identity = ?").get(key(identity));
|
|
168
|
+
return row === undefined ? null : validate(JSON.parse(row.data));
|
|
169
|
+
};
|
|
170
|
+
const write = (task) => { validate(task); db.prepare("INSERT INTO executions(identity,data) VALUES (?,?) ON CONFLICT(identity) DO UPDATE SET data=excluded.data").run(key(task), JSON.stringify(task)); return getTask(task); };
|
|
171
|
+
const change = (identity, now, operation) => db.transaction(() => {
|
|
172
|
+
const task = getTask(identity);
|
|
173
|
+
if (task === null || task.status === "done")
|
|
174
|
+
throw new Error("The original Web execution is missing or done.");
|
|
175
|
+
return write({ ...operation(task), updatedAt: integer(now, "Execution time") });
|
|
176
|
+
}).immediate();
|
|
177
|
+
const requireOrdinary = (task) => { if (task.cleanup !== null || task.configuration === null)
|
|
178
|
+
throw new Error("Cleanup fences ordinary execution."); };
|
|
179
|
+
const needCleanup = (task) => { if (task.cleanup === null)
|
|
180
|
+
throw new Error("Cleanup has not started."); return task.cleanup; };
|
|
181
|
+
return {
|
|
182
|
+
close: () => { db.close(); }, getTask,
|
|
183
|
+
listUnfinishedTasks: () => db.prepare("SELECT data FROM executions").all().map(row => validate(JSON.parse(row.data))).filter(task => task.status !== "done"),
|
|
184
|
+
register: (input, now) => db.transaction(() => {
|
|
185
|
+
const existing = getTask(input);
|
|
186
|
+
if (existing !== null) {
|
|
187
|
+
if (existing.worktreeId !== input.worktreeId || existing.serverOrigin !== input.serverOrigin || existing.workerId !== input.workerId || existing.userId !== input.userId || existing.configuration?.agent !== input.configuration.agent || existing.repositoryPath !== input.project.localPath || existing.repoUrl !== input.project.repoUrl)
|
|
188
|
+
throw new Error("The frozen Web execution does not match the original claim.");
|
|
189
|
+
return existing;
|
|
190
|
+
}
|
|
191
|
+
return write({ projectId: input.projectId, taskId: input.taskId, claimId: input.claimId, worktreeId: input.worktreeId, serverOrigin: input.serverOrigin, workerId: input.workerId, userId: input.userId, status: "active", repoUrl: input.project.repoUrl, repositoryPath: input.project.localPath, configuration: { ...input.configuration, agentControlMode: "web" }, resources: { mode: "web", worktree: null, herdr: null, nativeSession: null }, nativeExecution: null, webExecution: null, recovery: { count: 0, pauseReason: null, retryAuthorized: false }, cleanup: null, control: null, createdAt: now, updatedAt: now });
|
|
192
|
+
}).immediate(),
|
|
193
|
+
clearShutdown: (identity, now) => change(identity, now, task => {
|
|
194
|
+
const cleanup = task.cleanup;
|
|
195
|
+
if (cleanup === null)
|
|
196
|
+
return task;
|
|
197
|
+
if (cleanup.kind !== "shutdown" || !cleanup.agentStopped || !backendResourcesClosed(cleanup))
|
|
198
|
+
throw new Error("The original cleanup has not completed.");
|
|
199
|
+
return { ...task, cleanup: null, webExecution: task.webExecution === null ? null : { ...task.webExecution, restartAfterShutdown: true } };
|
|
200
|
+
}),
|
|
201
|
+
beginRecovery: (identity, now) => change(identity, now, (task) => {
|
|
202
|
+
requireOrdinary(task);
|
|
203
|
+
if (task.status !== "active")
|
|
204
|
+
throw new Error("Only an active execution can recover.");
|
|
205
|
+
const recovery = task.recovery;
|
|
206
|
+
if (recovery.pauseReason !== null && !recovery.retryAuthorized)
|
|
207
|
+
throw new Error("The paused execution requires an explicit recovery retry.");
|
|
208
|
+
if (task.configuration === null)
|
|
209
|
+
throw new Error("The original frozen execution configuration is missing.");
|
|
210
|
+
if (recovery.count >= task.configuration.recoveryLimit && !recovery.retryAuthorized)
|
|
211
|
+
throw new Error("The execution recovery budget is exhausted.");
|
|
212
|
+
return { ...task, recovery: { count: integer(recovery.count + 1, "Recovery count"), pauseReason: null, retryAuthorized: false } };
|
|
213
|
+
}),
|
|
214
|
+
authorizeRecoveryRetry: (identity, now) => change(identity, now, task => { requireOrdinary(task); return { ...task, recovery: { ...task.recovery, retryAuthorized: true } }; }),
|
|
215
|
+
bindNativeSession: (identity, reference, now) => change(identity, now, task => {
|
|
216
|
+
id(reference.sessionId, "Native session");
|
|
217
|
+
if (task.resources.nativeSession !== null && task.resources.nativeSession.sessionId !== reference.sessionId)
|
|
218
|
+
throw new Error("The original native session cannot be replaced.");
|
|
219
|
+
return { ...task, resources: { ...task.resources, nativeSession: reference } };
|
|
220
|
+
}),
|
|
221
|
+
completeTask: (identity, now) => change(identity, now, task => {
|
|
222
|
+
const cleanup = needCleanup(task);
|
|
223
|
+
if (cleanup.kind !== "terminal" || !cleanup.agentStopped || !backendResourcesClosed(cleanup) || !cleanup.worktreeDeleted)
|
|
224
|
+
throw new Error("Web completion requires original resources to be stopped and removed.");
|
|
225
|
+
return { ...task, status: "done" };
|
|
226
|
+
}),
|
|
227
|
+
initializeWebExecution: (identity, now) => change(identity, now, task => {
|
|
228
|
+
if (task.configuration?.agentControlMode !== "web" || task.status !== "active")
|
|
229
|
+
throw new Error("Web execution requires its active frozen claim.");
|
|
230
|
+
if (task.webExecution != null)
|
|
231
|
+
return task;
|
|
232
|
+
return { ...task, nativeExecution: null, webExecution: { executionId: randomUUID(), registrationId: randomUUID(), controllerId: randomUUID(), controllerInstanceId: randomUUID(), launchId: randomUUID(), sessionId: null, executionGeneration: "1", initialOperationId: randomUUID(), initialPrompt: null, launchSubmission: "not-submitted", controllerProcess: null, nativeProcesses: [], restartAfterShutdown: false, cleanupOperationId: null, ticketPath: null, nativeHome: null, summary: null, initialInputState: "not_submitted", activity: "initializing" } };
|
|
233
|
+
}),
|
|
234
|
+
updateWebExecution: (identity, patch, now) => change(identity, now, task => {
|
|
235
|
+
if (task.configuration?.agentControlMode !== "web" || task.webExecution == null)
|
|
236
|
+
throw new Error("The web execution identity is missing.");
|
|
237
|
+
const previous = task.webExecution;
|
|
238
|
+
if (patch.restartAfterShutdown !== undefined && patch.restartAfterShutdown !== previous.restartAfterShutdown)
|
|
239
|
+
throw new Error("Orderly restart provenance requires confirmed shutdown.");
|
|
240
|
+
for (const key of ["executionGeneration", "controllerInstanceId", "launchId"])
|
|
241
|
+
if (patch[key] !== undefined && patch[key] !== previous[key])
|
|
242
|
+
throw new Error("A new web generation requires verified original process stop.");
|
|
243
|
+
for (const key of ["executionId", "registrationId", "controllerId", "initialOperationId"])
|
|
244
|
+
if (patch[key] !== undefined && patch[key] !== previous[key])
|
|
245
|
+
throw new Error("The web execution identity cannot be replaced.");
|
|
246
|
+
if (previous.nativeHome !== null && patch.nativeHome !== undefined && patch.nativeHome !== previous.nativeHome)
|
|
247
|
+
throw new Error("The original native profile cannot change.");
|
|
248
|
+
if (previous.initialPrompt !== null && patch.initialPrompt !== undefined && patch.initialPrompt !== previous.initialPrompt)
|
|
249
|
+
throw new Error("The original managed prompt cannot change.");
|
|
250
|
+
if (previous.sessionId !== null && patch.sessionId !== undefined && patch.sessionId !== previous.sessionId)
|
|
251
|
+
throw new Error("The registered session cannot change.");
|
|
252
|
+
return { ...task, webExecution: parseWebExecution({ ...previous, ...patch }) };
|
|
253
|
+
}),
|
|
254
|
+
beginWebGeneration: (identity, previous, now) => change(identity, now, task => {
|
|
255
|
+
requireOrdinary(task);
|
|
256
|
+
const execution = task.webExecution;
|
|
257
|
+
if (execution == null || task.configuration?.agentControlMode !== "web" || previous.executionGeneration !== execution.executionGeneration || previous.controllerInstanceId !== execution.controllerInstanceId || !previous.nativeStopped || previous.nativeSessionId === null || previous.nativeSessionId !== task.resources.nativeSession?.sessionId)
|
|
258
|
+
throw new Error("Web recovery requires the exact stopped generation and native identity.");
|
|
259
|
+
return { ...task, webExecution: { ...execution, executionGeneration: String(BigInt(execution.executionGeneration) + 1n), controllerInstanceId: randomUUID(), launchId: randomUUID(), launchSubmission: "not-submitted", controllerProcess: null, nativeProcesses: [], restartAfterShutdown: false, cleanupOperationId: null, ticketPath: null, activity: "initializing" } };
|
|
260
|
+
}),
|
|
261
|
+
confirmBackendResourcesClosed: (identity, proof, now) => change(identity, now, task => {
|
|
262
|
+
const cleanup = needCleanup(task);
|
|
263
|
+
if (cleanup.mode !== "web" || !cleanup.agentStopped || proof.controllerStopped !== true || proof.endpointClosed !== true)
|
|
264
|
+
throw new Error("Web resource closure requires stopped original controller and endpoint.");
|
|
265
|
+
return { ...task, cleanup: { ...cleanup, backendResourcesClosed: true } };
|
|
266
|
+
}),
|
|
267
|
+
bindWorktree: (identity, binding, now) => change(identity, now, (task) => {
|
|
268
|
+
if (task.status !== "active")
|
|
269
|
+
throw new Error("Resource creation requires an active execution.");
|
|
270
|
+
const value = parseWorktree(binding);
|
|
271
|
+
if (value.repositoryPath !== task.repositoryPath)
|
|
272
|
+
throw new Error("The worktree repository does not match the original project binding.");
|
|
273
|
+
if (task.resources.worktree !== null && !same(task.resources.worktree, value))
|
|
274
|
+
throw new Error("The execution already has a different worktree binding.");
|
|
275
|
+
return { ...task, resources: { ...task.resources, worktree: value } };
|
|
276
|
+
}),
|
|
277
|
+
beginCleanup: (identity, input, now) => change(identity, now, (task) => {
|
|
278
|
+
oneOf(input.kind, ["terminal", "shutdown"], "Cleanup kind");
|
|
279
|
+
const existing = task.cleanup;
|
|
280
|
+
if (existing !== null)
|
|
281
|
+
return { ...task, cleanup: { ...existing, kind: existing.kind === "terminal" ? "terminal" : input.kind } };
|
|
282
|
+
if (task.control !== null && input.kind !== "terminal")
|
|
283
|
+
throw new Error("A source control intent requires terminal cleanup.");
|
|
284
|
+
return { ...task, status: "active", cleanup: parseCleanup({ kind: input.kind, startedAt: now, deadline: input.deadline, input: "not-submitted", baseline: null, result: null, error: null, agentStopped: false, workspaceClosed: taskAgentControlMode(task) === "web" ? null : false, ...(taskAgentControlMode(task) === "web" ? { mode: "web", backendResourcesClosed: false } : {}), worktreeDeleted: false }) };
|
|
285
|
+
}),
|
|
286
|
+
markCleanupInputSubmitting: (identity, now) => change(identity, now, (task) => {
|
|
287
|
+
const cleanup = needCleanup(task);
|
|
288
|
+
if (cleanup.input !== "not-submitted" || cleanup.agentStopped || cleanup.result !== null)
|
|
289
|
+
throw new Error("Cleanup input cannot be submitted again or after cleanup completion or agent stop.");
|
|
290
|
+
if (now >= cleanup.deadline)
|
|
291
|
+
throw new Error("The original cleanup deadline has elapsed; no new input may be submitted.");
|
|
292
|
+
return { ...task, cleanup: { ...cleanup, input: "unknown" } };
|
|
293
|
+
}),
|
|
294
|
+
recordCleanupInputOutcome: (identity, input, now) => change(identity, now, (task) => {
|
|
295
|
+
const cleanup = needCleanup(task);
|
|
296
|
+
oneOf(input, ["submitted", "rejected", "unavailable"], "Cleanup input outcome");
|
|
297
|
+
if (cleanup.input !== "unknown" && !(cleanup.input === "not-submitted" && input === "unavailable") && cleanup.input !== input)
|
|
298
|
+
throw new Error("The cleanup input outcome conflicts with the original submission.");
|
|
299
|
+
return { ...task, cleanup: { ...cleanup, input } };
|
|
300
|
+
}),
|
|
301
|
+
recordCleanupResult: (identity, result, error, now) => change(identity, now, (task) => {
|
|
302
|
+
const cleanup = needCleanup(task);
|
|
303
|
+
oneOf(result, ["completed", "timed-out", "failed", "unavailable"], "Cleanup result");
|
|
304
|
+
if (cleanup.result !== null && cleanup.result !== result)
|
|
305
|
+
throw new Error("The original cleanup result cannot be replaced.");
|
|
306
|
+
if (result === "timed-out" && now < cleanup.deadline)
|
|
307
|
+
throw new Error("The original cleanup deadline has not elapsed.");
|
|
308
|
+
return { ...task, cleanup: { ...cleanup, result, error: error === null ? null : text(error, "Cleanup error") } };
|
|
309
|
+
}),
|
|
310
|
+
confirmAgentStopped: (identity, proof, now) => change(identity, now, (task) => {
|
|
311
|
+
if (proof.agentStopped !== true)
|
|
312
|
+
throw new Error("The caller must confirm the original agent has stopped.");
|
|
313
|
+
return { ...task, cleanup: { ...needCleanup(task), agentStopped: true } };
|
|
314
|
+
}),
|
|
315
|
+
confirmWorktreeDeleted: (identity, proof, now) => change(identity, now, (task) => {
|
|
316
|
+
const cleanup = needCleanup(task);
|
|
317
|
+
if (cleanup.kind !== "terminal" || !backendResourcesClosed(cleanup) || proof.worktreeDeleted !== true)
|
|
318
|
+
throw new Error("Worktree deletion requires confirmed workspace closure and terminal cleanup.");
|
|
319
|
+
return { ...task, cleanup: { ...cleanup, worktreeDeleted: true } };
|
|
320
|
+
}),
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
//# sourceMappingURL=web-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-store.js","sourceRoot":"","sources":["../../../../src/commands/worker/backends/web-store.ts"],"names":[],"mappings":"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"}
|