@codetreker/daynight 0.21.9 → 0.21.13
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 +359 -27
- package/dist/api/client.d.ts +4 -1
- package/dist/api/client.js +18 -1
- package/dist/api/client.js.map +1 -1
- package/dist/api/parse.d.ts +3 -1
- package/dist/api/parse.js +27 -0
- package/dist/api/parse.js.map +1 -1
- package/dist/api/types.d.ts +18 -3
- package/dist/cli/commands.js +2 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/commands/skill/skills/using-daynight/references/handoff.md +3 -3
- package/dist/commands/worker/cleanup.d.ts +6 -0
- package/dist/commands/worker/cleanup.js +173 -0
- package/dist/commands/worker/cleanup.js.map +1 -0
- package/dist/commands/worker/config.d.ts +21 -0
- package/dist/commands/worker/config.js +144 -0
- package/dist/commands/worker/config.js.map +1 -0
- package/dist/commands/worker/control.d.ts +55 -0
- package/dist/commands/worker/control.js +151 -0
- package/dist/commands/worker/control.js.map +1 -0
- package/dist/commands/worker/coordinator.d.ts +35 -0
- package/dist/commands/worker/coordinator.js +548 -0
- package/dist/commands/worker/coordinator.js.map +1 -0
- package/dist/commands/worker/definition.d.ts +2 -0
- package/dist/commands/worker/definition.js +50 -0
- package/dist/commands/worker/definition.js.map +1 -0
- package/dist/commands/worker/diagnostics.d.ts +20 -0
- package/dist/commands/worker/diagnostics.js +56 -0
- package/dist/commands/worker/diagnostics.js.map +1 -0
- package/dist/commands/worker/execution.d.ts +41 -0
- package/dist/commands/worker/execution.js +318 -0
- package/dist/commands/worker/execution.js.map +1 -0
- package/dist/commands/worker/herdr/agents.d.ts +186 -0
- package/dist/commands/worker/herdr/agents.js +726 -0
- package/dist/commands/worker/herdr/agents.js.map +1 -0
- package/dist/commands/worker/herdr/arguments.d.ts +8 -0
- package/dist/commands/worker/herdr/arguments.js +58 -0
- package/dist/commands/worker/herdr/arguments.js.map +1 -0
- package/dist/commands/worker/herdr/codex-input.d.ts +2 -0
- package/dist/commands/worker/herdr/codex-input.js +35 -0
- package/dist/commands/worker/herdr/codex-input.js.map +1 -0
- package/dist/commands/worker/herdr/command.d.ts +22 -0
- package/dist/commands/worker/herdr/command.js +115 -0
- package/dist/commands/worker/herdr/command.js.map +1 -0
- package/dist/commands/worker/herdr/instance.d.ts +56 -0
- package/dist/commands/worker/herdr/instance.js +322 -0
- package/dist/commands/worker/herdr/instance.js.map +1 -0
- package/dist/commands/worker/herdr/preflight.d.ts +40 -0
- package/dist/commands/worker/herdr/preflight.js +251 -0
- package/dist/commands/worker/herdr/preflight.js.map +1 -0
- package/dist/commands/worker/herdr/rpc.d.ts +29 -0
- package/dist/commands/worker/herdr/rpc.js +186 -0
- package/dist/commands/worker/herdr/rpc.js.map +1 -0
- package/dist/commands/worker/herdr.d.ts +95 -0
- package/dist/commands/worker/herdr.js +35 -0
- package/dist/commands/worker/herdr.js.map +1 -0
- package/dist/commands/worker/index.d.ts +18 -0
- package/dist/commands/worker/index.js +58 -0
- package/dist/commands/worker/index.js.map +1 -0
- package/dist/commands/worker/instance-lock.d.ts +5 -0
- package/dist/commands/worker/instance-lock.js +11 -1
- package/dist/commands/worker/instance-lock.js.map +1 -1
- package/dist/commands/worker/prompts.d.ts +4 -0
- package/dist/commands/worker/prompts.js +64 -0
- package/dist/commands/worker/prompts.js.map +1 -0
- package/dist/commands/worker/remote.d.ts +23 -0
- package/dist/commands/worker/remote.js +146 -0
- package/dist/commands/worker/remote.js.map +1 -0
- package/dist/commands/worker/runtime.d.ts +16 -0
- package/dist/commands/worker/runtime.js +384 -0
- package/dist/commands/worker/runtime.js.map +1 -0
- package/dist/commands/worker/store.d.ts +73 -5
- package/dist/commands/worker/store.js +475 -36
- package/dist/commands/worker/store.js.map +1 -1
- package/dist/commands/worker/types.d.ts +37 -1
- package/dist/commands/worker/worktrees.d.ts +1 -0
- package/dist/commands/worker/worktrees.js +9 -0
- package/dist/commands/worker/worktrees.js.map +1 -1
- package/dist/config/document.d.ts +1 -1
- package/dist/config/document.js +1 -0
- package/dist/config/document.js.map +1 -1
- package/dist/platform/instance-lock.d.ts +4 -0
- package/dist/platform/instance-lock.js +9 -1
- package/dist/platform/instance-lock.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Project, Task, TaskPlatform, UpdateWorkerClaimInput, WorkerClaimDescriptor, ReleaseWorkerClaimInput, TransferWorkerClaimInput, ResumeWorkerTaskInput } from "../../api/types.js";
|
|
2
|
+
import type { ProjectIdentity } from "./types.js";
|
|
3
|
+
export type WorkerRemote = {
|
|
4
|
+
readonly serverOrigin: string;
|
|
5
|
+
currentUserId(signal: AbortSignal): Promise<string>;
|
|
6
|
+
readTask(projectId: string, taskId: string, signal: AbortSignal): Promise<Task>;
|
|
7
|
+
authorizeControl(projectId: string, originalUserId: string, targetUserId: string | undefined, signal: AbortSignal): Promise<void>;
|
|
8
|
+
release(projectId: string, taskId: string, input: ReleaseWorkerClaimInput, signal: AbortSignal): Promise<Task>;
|
|
9
|
+
transfer(projectId: string, taskId: string, input: TransferWorkerClaimInput, signal: AbortSignal): Promise<Task>;
|
|
10
|
+
resume(projectId: string, taskId: string, input: ResumeWorkerTaskInput, signal: AbortSignal): Promise<Task>;
|
|
11
|
+
resolveProject(repository: {
|
|
12
|
+
readonly repoUrl: string;
|
|
13
|
+
readonly projectId?: string;
|
|
14
|
+
}, signal: AbortSignal): Promise<Project>;
|
|
15
|
+
ownInventory(projects: readonly ProjectIdentity[], workerId: string, signal: AbortSignal): Promise<readonly Task[]>;
|
|
16
|
+
candidates(projectId: string, platform: TaskPlatform, signal: AbortSignal): AsyncGenerator<Task>;
|
|
17
|
+
claim(candidate: Task, descriptor: WorkerClaimDescriptor, signal: AbortSignal): Promise<Task>;
|
|
18
|
+
update(task: Task, input: Omit<UpdateWorkerClaimInput, "version" | "claimId">, signal: AbortSignal): Promise<Task>;
|
|
19
|
+
};
|
|
20
|
+
export declare const createWorkerRemote: (options: {
|
|
21
|
+
readonly serverUrl: string;
|
|
22
|
+
readonly serverToken?: string;
|
|
23
|
+
}) => WorkerRemote;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { ApiError, createApiClient } from "../../api/client.js";
|
|
2
|
+
import { createOperation } from "../../api/operation.js";
|
|
3
|
+
import { canonicalId, ProtocolError } from "../../api/parse.js";
|
|
4
|
+
import { normalizeServerUrl } from "../../config/server.js";
|
|
5
|
+
import { validateServerToken, validateTokenTransport } from "../../config/server-token.js";
|
|
6
|
+
import { repositoryIdentity } from "../../repository/identity.js";
|
|
7
|
+
export const createWorkerRemote = (options) => {
|
|
8
|
+
const serverOrigin = normalizeServerUrl(options.serverUrl);
|
|
9
|
+
const serverToken = options.serverToken === undefined ? undefined : validateServerToken(options.serverToken);
|
|
10
|
+
if (serverToken !== undefined)
|
|
11
|
+
validateTokenTransport(serverOrigin);
|
|
12
|
+
let principal = null;
|
|
13
|
+
const query = async (signal, action, expectedUserId) => {
|
|
14
|
+
const operation = createOperation({ signal });
|
|
15
|
+
try {
|
|
16
|
+
return await action(createApiClient({ serverUrl: serverOrigin, ...(serverToken === undefined ? {} : { serverToken }), ...(expectedUserId === undefined ? {} : { expectedUserId }), operation }));
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
operation.dispose();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const verifiedUserId = () => {
|
|
23
|
+
if (principal === null)
|
|
24
|
+
throw new Error("The worker must verify its authenticated user before accessing project ownership.");
|
|
25
|
+
return principal;
|
|
26
|
+
};
|
|
27
|
+
const request = (signal, action) => query(signal, action, verifiedUserId());
|
|
28
|
+
const pages = async function* (signal, read) {
|
|
29
|
+
const identities = new Set();
|
|
30
|
+
const cursors = new Set();
|
|
31
|
+
let cursor;
|
|
32
|
+
do {
|
|
33
|
+
signal.throwIfAborted();
|
|
34
|
+
const page = await request(signal, (api) => read(api, cursor));
|
|
35
|
+
for (const item of page.items) {
|
|
36
|
+
if (identities.has(item.id))
|
|
37
|
+
throw new ProtocolError("Duplicate resource identity across worker list pages.");
|
|
38
|
+
identities.add(item.id);
|
|
39
|
+
}
|
|
40
|
+
if (page.nextCursor !== null) {
|
|
41
|
+
if (cursors.has(page.nextCursor))
|
|
42
|
+
throw new ProtocolError("Repeated worker pagination cursor.");
|
|
43
|
+
cursors.add(page.nextCursor);
|
|
44
|
+
}
|
|
45
|
+
for (const item of page.items) {
|
|
46
|
+
signal.throwIfAborted();
|
|
47
|
+
yield item;
|
|
48
|
+
}
|
|
49
|
+
cursor = page.nextCursor === null ? undefined : page.nextCursor;
|
|
50
|
+
} while (cursor !== undefined);
|
|
51
|
+
signal.throwIfAborted();
|
|
52
|
+
};
|
|
53
|
+
const taskPages = (projectId, filters, signal) => pages(signal, (api, cursor) => api.listTaskPage(projectId, { ...filters, limit: 100, ...(cursor === undefined ? {} : { cursor }) }));
|
|
54
|
+
return {
|
|
55
|
+
serverOrigin,
|
|
56
|
+
currentUserId: async (signal) => {
|
|
57
|
+
signal.throwIfAborted();
|
|
58
|
+
if (principal !== null)
|
|
59
|
+
return principal;
|
|
60
|
+
const user = await query(signal, (api) => api.getCurrentUser());
|
|
61
|
+
if (principal !== null && principal !== user.id)
|
|
62
|
+
throw new ProtocolError("The worker's authenticated user changed during identity verification.");
|
|
63
|
+
principal = user.id;
|
|
64
|
+
return principal;
|
|
65
|
+
},
|
|
66
|
+
readTask: (projectId, taskId, signal) => request(signal, (api) => api.getTask(projectId, taskId)),
|
|
67
|
+
authorizeControl: async (projectId, originalUserId, targetUserId, signal) => {
|
|
68
|
+
const members = await request(signal, (api) => api.listProjectMembers(projectId));
|
|
69
|
+
const current = members.find((member) => member.userId === verifiedUserId());
|
|
70
|
+
if (current === undefined || (current.userId !== originalUserId && current.role !== "admin"))
|
|
71
|
+
throw new Error("Source management requires its original owner or a current project administrator.");
|
|
72
|
+
if (targetUserId !== undefined && !members.some((member) => member.userId === targetUserId))
|
|
73
|
+
throw new Error("The transfer target must be a current project member.");
|
|
74
|
+
},
|
|
75
|
+
release: (projectId, taskId, input, signal) => request(signal, (api) => api.releaseWorkerClaim(projectId, taskId, input)),
|
|
76
|
+
transfer: (projectId, taskId, input, signal) => request(signal, (api) => api.transferWorkerClaim(projectId, taskId, input)),
|
|
77
|
+
resume: (projectId, taskId, input, signal) => request(signal, (api) => api.resumeWorkerTask(projectId, taskId, input)),
|
|
78
|
+
resolveProject: async (repository, signal) => {
|
|
79
|
+
const expected = repositoryIdentity(repository.repoUrl);
|
|
80
|
+
let project;
|
|
81
|
+
if (repository.projectId !== undefined) {
|
|
82
|
+
project = await request(signal, (api) => api.getProject(repository.projectId));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Project discovery is finite; its own API operation cannot become the daemon's lifetime budget.
|
|
86
|
+
const projects = await request(signal, (api) => api.listProjects());
|
|
87
|
+
const matches = projects.filter((value) => repositoryIdentity(value.repoUrl) === expected);
|
|
88
|
+
if (matches.length === 0)
|
|
89
|
+
throw new Error("Project does not exist for the configured worker repository.");
|
|
90
|
+
if (matches.length !== 1)
|
|
91
|
+
throw new Error(`Multiple projects match the configured worker repository (${matches.map(({ id }) => id).join(", ")}); configure projectId.`);
|
|
92
|
+
project = await request(signal, (api) => api.getProject(matches[0].id));
|
|
93
|
+
}
|
|
94
|
+
if (repositoryIdentity(project.repoUrl) !== expected)
|
|
95
|
+
throw new Error(`Project ${project.id} does not match the configured worker repository.`);
|
|
96
|
+
signal.throwIfAborted();
|
|
97
|
+
return project;
|
|
98
|
+
},
|
|
99
|
+
ownInventory: async (projects, workerId, signal) => {
|
|
100
|
+
const owner = verifiedUserId();
|
|
101
|
+
const selected = new Map();
|
|
102
|
+
for (const project of projects) {
|
|
103
|
+
if (normalizeServerUrl(project.serverOrigin) !== serverOrigin)
|
|
104
|
+
throw new Error(`Worker project ${project.projectId} belongs to a different service origin.`);
|
|
105
|
+
const projectId = canonicalId(project.projectId);
|
|
106
|
+
if (projectId === null)
|
|
107
|
+
throw new Error("Worker project ID must be a hyphenated UUID.");
|
|
108
|
+
selected.set(projectId, project);
|
|
109
|
+
}
|
|
110
|
+
const result = [];
|
|
111
|
+
for (const projectId of selected.keys()) {
|
|
112
|
+
for await (const task of taskPages(projectId, { workerId }, signal)) {
|
|
113
|
+
if (task.properties.worker?.userId !== owner)
|
|
114
|
+
throw new ProtocolError("Worker inventory claim belongs to a different authenticated user.");
|
|
115
|
+
result.push(task);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
signal.throwIfAborted();
|
|
119
|
+
return result;
|
|
120
|
+
},
|
|
121
|
+
candidates: async function* (projectId, platform, signal) {
|
|
122
|
+
for await (const task of taskPages(projectId, { ready: true, allowAgents: true, compatiblePlatform: platform }, signal)) {
|
|
123
|
+
if (task.properties.worker?.state === "released")
|
|
124
|
+
continue;
|
|
125
|
+
if (task.properties.worker?.state === "active")
|
|
126
|
+
throw new ProtocolError("Worker candidate has an active claim.");
|
|
127
|
+
yield task;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
claim: async (candidate, descriptor, signal) => {
|
|
131
|
+
const claimed = await request(signal, (api) => api.claimWorkerTask(candidate.projectId, candidate.id, { ...descriptor, version: candidate.version }));
|
|
132
|
+
if (claimed.properties.worker?.userId !== verifiedUserId())
|
|
133
|
+
throw new ApiError({ operation: "worker.claim", projectId: candidate.projectId, taskId: candidate.id }, "protocol", {
|
|
134
|
+
cause: new ProtocolError("The granted worker claim belongs to a different authenticated user."), outcomeUnconfirmed: true,
|
|
135
|
+
});
|
|
136
|
+
return claimed;
|
|
137
|
+
},
|
|
138
|
+
update: (task, input, signal) => {
|
|
139
|
+
const worker = task.properties.worker;
|
|
140
|
+
if (worker === null || worker.state !== "active" || worker.userId !== verifiedUserId())
|
|
141
|
+
throw new Error("Worker summary update requires the original active claim and authenticated user.");
|
|
142
|
+
return request(signal, (api) => api.updateWorkerClaim(task.projectId, task.id, { ...input, version: task.version, claimId: worker.claimId }));
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/commands/worker/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TaskPlatform } from "../../api/types.js";
|
|
2
|
+
import type { WorkerControlRequest } from "./control.js";
|
|
3
|
+
export declare const currentWorkerPlatform: (platform?: NodeJS.Platform) => TaskPlatform;
|
|
4
|
+
export declare const runWorker: (options: {
|
|
5
|
+
homeDirectory: string;
|
|
6
|
+
packageDirectory: string;
|
|
7
|
+
log?: (message: string) => void;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}) => Promise<void>;
|
|
10
|
+
export declare const runWorkerControl: (options: {
|
|
11
|
+
homeDirectory: string;
|
|
12
|
+
packageDirectory: string;
|
|
13
|
+
request: WorkerControlRequest;
|
|
14
|
+
log?: (message: string) => void;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { hostname } from "node:os";
|
|
4
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
5
|
+
import { createOperation } from "../../api/operation.js";
|
|
6
|
+
import { loadServerConfiguration } from "../../config/server.js";
|
|
7
|
+
import { readWorkerConfiguration } from "./config.js";
|
|
8
|
+
import { createWorkerCoordinator } from "./coordinator.js";
|
|
9
|
+
import { createWorkerControlDriver, submitWorkerControl } from "./control.js";
|
|
10
|
+
import { createWorkerDiagnostics } from "./diagnostics.js";
|
|
11
|
+
import { isWorkerCancellation } from "./execution.js";
|
|
12
|
+
import { createWorkerHerdr } from "./herdr.js";
|
|
13
|
+
import { ensureWorkerIdentity } from "./identity.js";
|
|
14
|
+
import { acquireWorkerInstanceLock, tryAcquireWorkerInstanceLock } from "./instance-lock.js";
|
|
15
|
+
import { resolveWorkerPaths } from "./paths.js";
|
|
16
|
+
import { createWorkerPromptBuilder } from "./prompts.js";
|
|
17
|
+
import { createWorkerRemote } from "./remote.js";
|
|
18
|
+
import { openWorkerStore } from "./store.js";
|
|
19
|
+
import { createWorkerGitManager } from "./worktrees.js";
|
|
20
|
+
export const currentWorkerPlatform = (platform = process.platform) => {
|
|
21
|
+
switch (platform) {
|
|
22
|
+
case "linux": return "linux";
|
|
23
|
+
case "darwin": return "macos";
|
|
24
|
+
case "win32": return "windows";
|
|
25
|
+
default: throw new Error(`Worker execution is unsupported on platform ${platform}.`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const machineDescription = (platform) => {
|
|
29
|
+
const name = hostname();
|
|
30
|
+
// This is a reported host label, independent of worker identity, not machine authentication.
|
|
31
|
+
const bytes = createHash("sha1").update(`daynight:machine:${platform}:${name}`).digest().subarray(0, 16);
|
|
32
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
33
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
34
|
+
const value = bytes.toString("hex");
|
|
35
|
+
return { id: `${value.slice(0, 8)}-${value.slice(8, 12)}-${value.slice(12, 16)}-${value.slice(16, 20)}-${value.slice(20)}`, name };
|
|
36
|
+
};
|
|
37
|
+
export const runWorker = async (options) => {
|
|
38
|
+
const platform = currentWorkerPlatform();
|
|
39
|
+
const paths = resolveWorkerPaths(options.homeDirectory);
|
|
40
|
+
const cancellation = new AbortController();
|
|
41
|
+
const cancel = () => { cancellation.abort(options.signal?.reason); };
|
|
42
|
+
const signals = process.platform === "win32" ? ["SIGINT", "SIGTERM", "SIGBREAK"] : ["SIGINT", "SIGTERM"];
|
|
43
|
+
const interrupt = () => { cancellation.abort(new Error("Worker shutdown requested.")); };
|
|
44
|
+
options.signal?.addEventListener("abort", cancel, { once: true });
|
|
45
|
+
if (options.signal?.aborted)
|
|
46
|
+
cancel();
|
|
47
|
+
for (const signal of signals)
|
|
48
|
+
process.on(signal, interrupt);
|
|
49
|
+
let lock;
|
|
50
|
+
let store;
|
|
51
|
+
let git;
|
|
52
|
+
let coordinator;
|
|
53
|
+
let herdr;
|
|
54
|
+
let diagnostics;
|
|
55
|
+
let cleanupLoop;
|
|
56
|
+
let cleanupFailure;
|
|
57
|
+
const cleanupJobs = new Map();
|
|
58
|
+
const failures = [];
|
|
59
|
+
try {
|
|
60
|
+
cancellation.signal.throwIfAborted();
|
|
61
|
+
const configuration = await readWorkerConfiguration(paths, cancellation.signal);
|
|
62
|
+
const { serverUrl, serverToken } = await loadServerConfiguration(paths, cancellation.signal);
|
|
63
|
+
if (serverToken === undefined)
|
|
64
|
+
throw new Error("You are not logged in. Run daynight login to authenticate.");
|
|
65
|
+
lock = await acquireWorkerInstanceLock(paths);
|
|
66
|
+
cancellation.signal.throwIfAborted();
|
|
67
|
+
const workerId = await ensureWorkerIdentity(paths, cancellation.signal);
|
|
68
|
+
for (const directory of [paths.temporaryDirectory, paths.logsDirectory])
|
|
69
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
70
|
+
store = openWorkerStore(paths.databaseFile);
|
|
71
|
+
diagnostics = await createWorkerDiagnostics({ paths, workerId, platform, ...(options.log === undefined ? {} : { log: options.log }), secrets: [serverToken] });
|
|
72
|
+
const emit = diagnostics.emit;
|
|
73
|
+
const buildPrompt = await createWorkerPromptBuilder(options.packageDirectory);
|
|
74
|
+
const remote = createWorkerRemote({ serverUrl, serverToken });
|
|
75
|
+
git = createWorkerGitManager({ temporaryDirectory: paths.temporaryDirectory });
|
|
76
|
+
herdr = createWorkerHerdr({ paths, homeDirectory: options.homeDirectory });
|
|
77
|
+
const repositories = [];
|
|
78
|
+
coordinator = createWorkerCoordinator({
|
|
79
|
+
store, git, herdr, remote, serverOrigin: serverUrl, workerId, platform,
|
|
80
|
+
machine: machineDescription(platform), repositories, maxConcurrent: configuration.maxConcurrent,
|
|
81
|
+
buildPrompt, emit, signal: cancellation.signal,
|
|
82
|
+
});
|
|
83
|
+
const cleanupCoordinator = coordinator;
|
|
84
|
+
const cleanupDiagnostics = diagnostics;
|
|
85
|
+
const cleanupStore = store;
|
|
86
|
+
cleanupLoop = (async () => {
|
|
87
|
+
while (!cancellation.signal.aborted) {
|
|
88
|
+
for (const task of cleanupStore.listUnfinishedTasks()) {
|
|
89
|
+
if (task.workerId !== workerId || (task.cleanup === null && task.control === null))
|
|
90
|
+
continue;
|
|
91
|
+
const identity = { serverOrigin: task.serverOrigin, projectId: task.projectId, taskId: task.taskId, claimId: task.claimId };
|
|
92
|
+
const key = JSON.stringify(identity);
|
|
93
|
+
if (cleanupJobs.has(key))
|
|
94
|
+
continue;
|
|
95
|
+
const job = (async () => {
|
|
96
|
+
while (!cancellation.signal.aborted) {
|
|
97
|
+
try {
|
|
98
|
+
await cleanupCoordinator.advanceCommittedCleanups(identity);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (isWorkerCancellation(error, cancellation.signal))
|
|
102
|
+
return;
|
|
103
|
+
emit({ kind: "cleanup-error", message: "Committed cleanup could not advance; its original deadline and responsibility are retained.", error });
|
|
104
|
+
}
|
|
105
|
+
await cleanupDiagnostics.flush();
|
|
106
|
+
const current = cleanupStore.getTask(identity);
|
|
107
|
+
if (current === null)
|
|
108
|
+
throw new Error("The committed cleanup record disappeared.");
|
|
109
|
+
if (current.status === "done" || (current.cleanup === null && current.control === null))
|
|
110
|
+
return;
|
|
111
|
+
const state = current.cleanup;
|
|
112
|
+
if (current.control === null && state !== null && state.result !== null && state.agentStopped && state.workspaceClosed && (state.kind === "shutdown" || state.worktreeDeleted))
|
|
113
|
+
return;
|
|
114
|
+
const remaining = state === null ? 0 : state.deadline - Date.now();
|
|
115
|
+
try {
|
|
116
|
+
await delay(remaining > 0 ? Math.max(1, Math.min(1_000, remaining)) : 1_000, undefined, { signal: cancellation.signal });
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (!isWorkerCancellation(error, cancellation.signal))
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
})().catch((error) => { if (cleanupFailure === undefined)
|
|
124
|
+
cleanupFailure = error; cancellation.abort(error); });
|
|
125
|
+
cleanupJobs.set(key, job);
|
|
126
|
+
void job.then(() => { if (cleanupJobs.get(key) === job)
|
|
127
|
+
cleanupJobs.delete(key); });
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await delay(1_000, undefined, { signal: cancellation.signal });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (!isWorkerCancellation(error, cancellation.signal))
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
})().catch((error) => { if (cleanupFailure === undefined)
|
|
138
|
+
cleanupFailure = error; cancellation.abort(error); });
|
|
139
|
+
emit({ kind: "started", message: `Foreground worker ${workerId} on ${platform}; maxConcurrent=${configuration.maxConcurrent}; pollIntervalMs=${configuration.pollIntervalMs}; logs=${diagnostics.filename}.` });
|
|
140
|
+
await remote.currentUserId(cancellation.signal);
|
|
141
|
+
for (const repository of configuration.repositories) {
|
|
142
|
+
cancellation.signal.throwIfAborted();
|
|
143
|
+
const project = await remote.resolveProject({ repoUrl: repository.remote, ...(repository.projectId === undefined ? {} : { projectId: repository.projectId }) }, cancellation.signal);
|
|
144
|
+
const binding = { serverOrigin: serverUrl, projectId: project.id, repoUrl: repository.remote, localPath: repository.path };
|
|
145
|
+
const operation = createOperation({ signal: cancellation.signal });
|
|
146
|
+
try {
|
|
147
|
+
await git.prepareRepository(binding, operation);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
operation.dispose();
|
|
151
|
+
}
|
|
152
|
+
const registered = store.registerProject(binding);
|
|
153
|
+
const frozen = { agent: repository.agent, model: repository.model, args: repository.args, recoveryLimit: repository.recoveryLimit };
|
|
154
|
+
repositories.push({ project: registered, configuration: frozen });
|
|
155
|
+
}
|
|
156
|
+
let attachmentShown = false;
|
|
157
|
+
while (!cancellation.signal.aborted) {
|
|
158
|
+
try {
|
|
159
|
+
await coordinator.tick();
|
|
160
|
+
if (!attachmentShown) {
|
|
161
|
+
emit({ kind: "attach", message: `Original ready private Herdr session: ${JSON.stringify(herdr.attachment)}. Apply its environment and unsetEnvironment only to the attach process.` });
|
|
162
|
+
attachmentShown = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (isWorkerCancellation(error, cancellation.signal))
|
|
167
|
+
break;
|
|
168
|
+
if (cancellation.signal.aborted)
|
|
169
|
+
throw error;
|
|
170
|
+
emit({ kind: "reconciliation-error", message: "The reconciliation round failed; retained execution resources and unresolved writes require observation.", error });
|
|
171
|
+
}
|
|
172
|
+
await diagnostics.flush();
|
|
173
|
+
if (cancellation.signal.aborted)
|
|
174
|
+
break;
|
|
175
|
+
try {
|
|
176
|
+
await delay(configuration.pollIntervalMs, undefined, { signal: cancellation.signal });
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (!isWorkerCancellation(error, cancellation.signal))
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (!isWorkerCancellation(error, cancellation.signal))
|
|
186
|
+
failures.push(error);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
if (!cancellation.signal.aborted)
|
|
190
|
+
cancellation.abort(new Error("Worker runtime is closing."));
|
|
191
|
+
await cleanupLoop;
|
|
192
|
+
await Promise.all(cleanupJobs.values());
|
|
193
|
+
if (cleanupFailure !== undefined && !failures.includes(cleanupFailure))
|
|
194
|
+
failures.push(cleanupFailure);
|
|
195
|
+
if (coordinator !== undefined && herdr !== undefined) {
|
|
196
|
+
try {
|
|
197
|
+
diagnostics?.emit({ kind: "shutdown", message: "Stopping acquisitions and ordinary input; cleaning original executions with their persisted deadlines." });
|
|
198
|
+
const stopped = await coordinator.shutdown();
|
|
199
|
+
if (!stopped)
|
|
200
|
+
throw new Error("Original task agents are not all confirmed stopped; their private Herdr instance was retained.");
|
|
201
|
+
const operation = createOperation({ limits: { totalMs: 30_000 } });
|
|
202
|
+
try {
|
|
203
|
+
const proof = await herdr.stopInstance(operation);
|
|
204
|
+
diagnostics?.emit({ kind: "stopped", message: `Private Herdr stop confirmed: ${JSON.stringify(proof)}. Unfinished claims, worktrees and native history are retained.` });
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
operation.dispose();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
failures.push(error);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
await git?.dispose();
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
failures.push(error);
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
store?.close();
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
failures.push(error);
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
await lock?.release();
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
failures.push(error);
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
await diagnostics?.flush();
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
failures.push(error);
|
|
237
|
+
}
|
|
238
|
+
for (const signal of signals)
|
|
239
|
+
process.off(signal, interrupt);
|
|
240
|
+
options.signal?.removeEventListener("abort", cancel);
|
|
241
|
+
}
|
|
242
|
+
if (failures.length === 1)
|
|
243
|
+
throw failures[0];
|
|
244
|
+
if (failures.length > 1)
|
|
245
|
+
throw new AggregateError(failures, "Worker execution or shutdown failed.");
|
|
246
|
+
};
|
|
247
|
+
export const runWorkerControl = async (options) => {
|
|
248
|
+
const platform = currentWorkerPlatform();
|
|
249
|
+
const paths = resolveWorkerPaths(options.homeDirectory);
|
|
250
|
+
const cancellation = new AbortController();
|
|
251
|
+
const cancel = () => cancellation.abort(options.signal?.reason);
|
|
252
|
+
const interrupt = () => cancellation.abort(new Error("Worker management interrupted; the persisted intent is retained."));
|
|
253
|
+
const signals = process.platform === "win32" ? ["SIGINT", "SIGTERM", "SIGBREAK"] : ["SIGINT", "SIGTERM"];
|
|
254
|
+
options.signal?.addEventListener("abort", cancel, { once: true });
|
|
255
|
+
if (options.signal?.aborted)
|
|
256
|
+
cancel();
|
|
257
|
+
for (const signal of signals)
|
|
258
|
+
process.on(signal, interrupt);
|
|
259
|
+
let lock;
|
|
260
|
+
let store;
|
|
261
|
+
let git;
|
|
262
|
+
let coordinator;
|
|
263
|
+
let diagnostics;
|
|
264
|
+
const failures = [];
|
|
265
|
+
try {
|
|
266
|
+
cancellation.signal.throwIfAborted();
|
|
267
|
+
const configuration = await readWorkerConfiguration(paths, cancellation.signal);
|
|
268
|
+
const { serverUrl, serverToken } = await loadServerConfiguration(paths, cancellation.signal);
|
|
269
|
+
if (serverToken === undefined)
|
|
270
|
+
throw new Error("You are not logged in. Run daynight login to authenticate.");
|
|
271
|
+
lock = await tryAcquireWorkerInstanceLock(paths);
|
|
272
|
+
const workerId = await ensureWorkerIdentity(paths, cancellation.signal);
|
|
273
|
+
store = openWorkerStore(paths.databaseFile);
|
|
274
|
+
const remote = createWorkerRemote({ serverUrl, serverToken });
|
|
275
|
+
await remote.currentUserId(cancellation.signal);
|
|
276
|
+
diagnostics = await createWorkerDiagnostics({ paths, workerId, platform, ...(options.log === undefined ? {} : { log: options.log }), secrets: [serverToken] });
|
|
277
|
+
const repositories = [];
|
|
278
|
+
if (options.request.kind === "resume") {
|
|
279
|
+
for (const repository of configuration.repositories) {
|
|
280
|
+
if (options.request.projectId !== undefined && repository.projectId !== undefined && repository.projectId !== options.request.projectId)
|
|
281
|
+
continue;
|
|
282
|
+
const project = await remote.resolveProject({ repoUrl: repository.remote, ...(repository.projectId === undefined ? {} : { projectId: repository.projectId }) }, cancellation.signal);
|
|
283
|
+
if (options.request.projectId !== undefined && project.id !== options.request.projectId)
|
|
284
|
+
continue;
|
|
285
|
+
const binding = store.registerProject({ serverOrigin: serverUrl, projectId: project.id, repoUrl: repository.remote, localPath: repository.path });
|
|
286
|
+
repositories.push({ project: binding, configuration: { agent: repository.agent, model: repository.model, args: repository.args, recoveryLimit: repository.recoveryLimit } });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const result = await submitWorkerControl({ store, remote, serverOrigin: serverUrl, workerId, platform, machine: machineDescription(platform), repositories, request: options.request, signal: cancellation.signal });
|
|
290
|
+
diagnostics.emit({ kind: "management", ...(result.task === null ? {} : { task: result.task }), message: result.message });
|
|
291
|
+
await diagnostics.flush();
|
|
292
|
+
if (result.task !== null && options.request.kind !== "resume") {
|
|
293
|
+
const identity = result.task;
|
|
294
|
+
let lastWaitingState = null;
|
|
295
|
+
while (true) {
|
|
296
|
+
cancellation.signal.throwIfAborted();
|
|
297
|
+
let task = store.getTask(identity);
|
|
298
|
+
if (task === null)
|
|
299
|
+
throw new Error("The managed execution record disappeared.");
|
|
300
|
+
if (task.control?.submission === "unknown")
|
|
301
|
+
task = await createWorkerControlDriver({ store, remote, serverOrigin: serverUrl, now: Date.now }).advance(task, cancellation.signal, { submit: false });
|
|
302
|
+
if (task.status === "done") {
|
|
303
|
+
diagnostics.emit({ kind: "management-complete", task, message: `Management finished for claim ${task.claimId}; outcome=${task.control?.outcome ?? "ownership-ended"}.` });
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
if (task.control?.submission === "rejected")
|
|
307
|
+
throw new Error(`Management refused for claim ${task.claimId}: ${task.control.error}. A new explicit decision and version are required.`);
|
|
308
|
+
if (task.control?.submission === "unknown")
|
|
309
|
+
throw new Error(`Management result is unknown for claim ${task.claimId}; the original intent and claim identities are retained for reconciliation.`);
|
|
310
|
+
if (lock === null)
|
|
311
|
+
lock = await tryAcquireWorkerInstanceLock(paths);
|
|
312
|
+
if (lock !== null) {
|
|
313
|
+
if (coordinator === undefined) {
|
|
314
|
+
await mkdir(paths.temporaryDirectory, { recursive: true, mode: 0o700 });
|
|
315
|
+
git = createWorkerGitManager({ temporaryDirectory: paths.temporaryDirectory });
|
|
316
|
+
const herdr = createWorkerHerdr({ paths, homeDirectory: options.homeDirectory });
|
|
317
|
+
const buildPrompt = await createWorkerPromptBuilder(options.packageDirectory);
|
|
318
|
+
coordinator = createWorkerCoordinator({ store, git, herdr, remote, serverOrigin: serverUrl, workerId, platform, machine: machineDescription(platform), repositories, maxConcurrent: configuration.maxConcurrent, buildPrompt, emit: diagnostics.emit, signal: cancellation.signal });
|
|
319
|
+
}
|
|
320
|
+
if (options.request.kind === "retry") {
|
|
321
|
+
await coordinator.advanceRetry(identity);
|
|
322
|
+
const retried = store.getTask(identity);
|
|
323
|
+
if (retried === null)
|
|
324
|
+
throw new Error("The retried execution record disappeared.");
|
|
325
|
+
diagnostics.emit({ kind: "retry", task: retried, message: `Explicit recovery processed for claim ${retried.claimId}; count=${retried.recovery.count}; pause=${retried.recovery.pauseReason ?? "none"}.` });
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
await coordinator.advanceCommittedCleanups(identity);
|
|
329
|
+
}
|
|
330
|
+
else if (options.request.kind === "retry") {
|
|
331
|
+
diagnostics.emit({ kind: "retry-authorized", task, message: `Claim ${task.claimId} has one persisted extra recovery authorization; the foreground worker remains its sole controller.` });
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
await diagnostics.flush();
|
|
335
|
+
const latest = store.getTask(identity);
|
|
336
|
+
if (latest?.status === "done" || latest?.control?.submission === "unknown" || latest?.control?.submission === "rejected")
|
|
337
|
+
continue;
|
|
338
|
+
const waitingState = JSON.stringify({ cleanup: latest?.cleanup, control: latest?.control });
|
|
339
|
+
if (waitingState !== lastWaitingState) {
|
|
340
|
+
diagnostics.emit({ kind: "management-waiting", ...(latest === null ? {} : { task: latest }), message: `Waiting for the sole worker controller to finish management of claim ${task.claimId}.` });
|
|
341
|
+
lastWaitingState = waitingState;
|
|
342
|
+
}
|
|
343
|
+
await delay(1_000, undefined, { signal: cancellation.signal });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
failures.push(error);
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
try {
|
|
352
|
+
await git?.dispose();
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
failures.push(error);
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
store?.close();
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
failures.push(error);
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
await lock?.release();
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
failures.push(error);
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
await diagnostics?.flush();
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
failures.push(error);
|
|
374
|
+
}
|
|
375
|
+
for (const signal of signals)
|
|
376
|
+
process.off(signal, interrupt);
|
|
377
|
+
options.signal?.removeEventListener("abort", cancel);
|
|
378
|
+
}
|
|
379
|
+
if (failures.length === 1)
|
|
380
|
+
throw failures[0];
|
|
381
|
+
if (failures.length > 1)
|
|
382
|
+
throw new AggregateError(failures, "Worker management or resource disposal failed.");
|
|
383
|
+
};
|
|
384
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/worker/runtime.ts"],"names":[],"mappings":"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"}
|