@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,21 @@
|
|
|
1
|
+
import type { PathApi } from "../../platform/filesystem.js";
|
|
2
|
+
import type { WorkerPaths } from "./paths.js";
|
|
3
|
+
import type { FrozenExecutionConfiguration } from "./types.js";
|
|
4
|
+
export type WorkerRepositoryConfiguration = FrozenExecutionConfiguration & {
|
|
5
|
+
remote: string;
|
|
6
|
+
path: string;
|
|
7
|
+
projectId?: string;
|
|
8
|
+
};
|
|
9
|
+
export type WorkerConfiguration = FrozenExecutionConfiguration & {
|
|
10
|
+
maxConcurrent: number;
|
|
11
|
+
pollIntervalMs: number;
|
|
12
|
+
repositories: readonly WorkerRepositoryConfiguration[];
|
|
13
|
+
};
|
|
14
|
+
export declare const workerConfigurationDefaults: Readonly<{
|
|
15
|
+
maxConcurrent: 1;
|
|
16
|
+
pollIntervalMs: 5000;
|
|
17
|
+
recoveryLimit: 3;
|
|
18
|
+
agent: "copilot";
|
|
19
|
+
}>;
|
|
20
|
+
export declare const parseWorkerConfiguration: (source: string, paths: WorkerPaths, pathApi?: PathApi) => WorkerConfiguration;
|
|
21
|
+
export declare const readWorkerConfiguration: (paths: WorkerPaths, signal?: AbortSignal) => Promise<WorkerConfiguration>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { canonicalId } from "../../api/parse.js";
|
|
3
|
+
import { parseConfigurationDocument } from "../../config/document.js";
|
|
4
|
+
import { readConfigurationSource } from "../../config/files.js";
|
|
5
|
+
import { ancestorIdentities, missingPathsReferToSameDirectory, pathsOverlap, resolvePhysicalDirectory } from "../../platform/filesystem.js";
|
|
6
|
+
import { repositoryIdentity } from "../../repository/identity.js";
|
|
7
|
+
import { validateHerdrAgentArguments } from "./herdr/arguments.js";
|
|
8
|
+
export const workerConfigurationDefaults = Object.freeze({
|
|
9
|
+
maxConcurrent: 1,
|
|
10
|
+
pollIntervalMs: 5_000,
|
|
11
|
+
recoveryLimit: 3,
|
|
12
|
+
agent: "copilot",
|
|
13
|
+
});
|
|
14
|
+
const mapping = (value, field) => {
|
|
15
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
16
|
+
throw new TypeError(`${field} must be a mapping.`);
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
const keys = (value, accepted, field) => {
|
|
20
|
+
if (Object.keys(value).some((key) => !accepted.includes(key)))
|
|
21
|
+
throw new TypeError(`${field} contains an unsupported field.`);
|
|
22
|
+
};
|
|
23
|
+
const text = (value, field) => {
|
|
24
|
+
if (typeof value !== "string" || value.trim() === "" || !value.isWellFormed() || /\p{Cc}/u.test(value))
|
|
25
|
+
throw new TypeError(`${field} must be nonempty text without control characters.`);
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
const number = (value, field) => {
|
|
29
|
+
if (!Object.hasOwn(value, field))
|
|
30
|
+
return workerConfigurationDefaults[field];
|
|
31
|
+
const result = value[field];
|
|
32
|
+
const minimum = field === "recoveryLimit" ? 0 : 1;
|
|
33
|
+
if (typeof result !== "number" || !Number.isSafeInteger(result) || result < minimum || (field === "pollIntervalMs" && result > 2_147_483_647)) {
|
|
34
|
+
throw new TypeError(`worker.${field} must be a ${minimum === 0 ? "nonnegative" : "positive"} safe integer${field === "pollIntervalMs" ? " no greater than 2147483647" : ""}.`);
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
const agentConfiguration = (value, field, inherited) => {
|
|
39
|
+
const agent = Object.hasOwn(value, "agent") ? value.agent : inherited.agent;
|
|
40
|
+
if (agent !== "codex" && agent !== "copilot")
|
|
41
|
+
throw new TypeError(`${field}.agent must be codex or copilot.`);
|
|
42
|
+
const sameKind = agent === inherited.agent;
|
|
43
|
+
const model = Object.hasOwn(value, "model") ? value.model === null ? null : text(value.model, `${field}.model`) : sameKind ? inherited.model : null;
|
|
44
|
+
let args;
|
|
45
|
+
if (Object.hasOwn(value, "args")) {
|
|
46
|
+
if (!Array.isArray(value.args))
|
|
47
|
+
throw new TypeError(`${field}.args must be a sequence of native arguments.`);
|
|
48
|
+
args = value.args.map((argument) => text(argument, `${field}.args`));
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
args = sameKind ? [...inherited.args] : [];
|
|
52
|
+
validateHerdrAgentArguments(agent, args);
|
|
53
|
+
return { agent, model, args, recoveryLimit: inherited.recoveryLimit };
|
|
54
|
+
};
|
|
55
|
+
const repositoryPath = (value, field, paths, pathApi) => {
|
|
56
|
+
const configured = text(value, field);
|
|
57
|
+
if (configured.startsWith("~"))
|
|
58
|
+
throw new TypeError(`${field} must be absolute or relative to the configuration directory; tilde expansion is not supported.`);
|
|
59
|
+
if (pathApi.sep === "\\" && /^[a-z]:(?![\\/])/i.test(configured))
|
|
60
|
+
throw new TypeError(`${field} must not be a drive-relative Windows path.`);
|
|
61
|
+
return pathApi.resolve(pathApi.dirname(paths.configFile), configured);
|
|
62
|
+
};
|
|
63
|
+
export const parseWorkerConfiguration = (source, paths, pathApi = path) => {
|
|
64
|
+
const { mapping: root } = parseConfigurationDocument(source, paths);
|
|
65
|
+
if (!Object.hasOwn(root, "worker"))
|
|
66
|
+
throw new Error("Worker configuration is missing; configure worker.repositories in ~/.daynight/config.yml.");
|
|
67
|
+
const worker = mapping(root.worker, "worker");
|
|
68
|
+
keys(worker, ["maxConcurrent", "pollIntervalMs", "recoveryLimit", "agent", "model", "args", "repositories"], "worker");
|
|
69
|
+
const effective = agentConfiguration(worker, "worker", {
|
|
70
|
+
agent: workerConfigurationDefaults.agent, model: null, args: [], recoveryLimit: number(worker, "recoveryLimit"),
|
|
71
|
+
});
|
|
72
|
+
if (!Array.isArray(worker.repositories))
|
|
73
|
+
throw new TypeError("worker.repositories must be a sequence.");
|
|
74
|
+
const identities = new Set();
|
|
75
|
+
const projects = new Set();
|
|
76
|
+
const locations = [];
|
|
77
|
+
const repositories = worker.repositories.map((entry, index) => {
|
|
78
|
+
const field = `worker.repositories[${index}]`;
|
|
79
|
+
const repository = mapping(entry, field);
|
|
80
|
+
keys(repository, ["remote", "path", "projectId", "agent", "model", "args"], field);
|
|
81
|
+
const remote = text(repository.remote, `${field}.remote`);
|
|
82
|
+
const identity = repositoryIdentity(remote);
|
|
83
|
+
if (identities.has(identity))
|
|
84
|
+
throw new TypeError(`${field}.remote duplicates a repository identity.`);
|
|
85
|
+
identities.add(identity);
|
|
86
|
+
const localPath = repositoryPath(repository.path, `${field}.path`, paths, pathApi);
|
|
87
|
+
if (pathsOverlap(localPath, paths.stateDirectory, pathApi))
|
|
88
|
+
throw new TypeError(`${field}.path overlaps the Daynight state directory.`);
|
|
89
|
+
if (locations.some((location) => pathsOverlap(location, localPath, pathApi)))
|
|
90
|
+
throw new TypeError(`${field}.path overlaps another worker repository.`);
|
|
91
|
+
locations.push(localPath);
|
|
92
|
+
let projectId;
|
|
93
|
+
if (Object.hasOwn(repository, "projectId")) {
|
|
94
|
+
projectId = typeof repository.projectId === "string" ? canonicalId(repository.projectId) ?? undefined : undefined;
|
|
95
|
+
if (projectId === undefined)
|
|
96
|
+
throw new TypeError(`${field}.projectId must be a hyphenated UUID.`);
|
|
97
|
+
if (projects.has(projectId))
|
|
98
|
+
throw new TypeError(`${field}.projectId duplicates another worker repository.`);
|
|
99
|
+
projects.add(projectId);
|
|
100
|
+
}
|
|
101
|
+
return { ...agentConfiguration(repository, field, effective), remote, path: localPath, ...(projectId === undefined ? {} : { projectId }) };
|
|
102
|
+
});
|
|
103
|
+
return { ...effective, maxConcurrent: number(worker, "maxConcurrent"), pollIntervalMs: number(worker, "pollIntervalMs"), repositories };
|
|
104
|
+
};
|
|
105
|
+
export const readWorkerConfiguration = async (paths, signal) => {
|
|
106
|
+
const configuration = parseWorkerConfiguration(await readConfigurationSource(paths, signal), paths);
|
|
107
|
+
const physicalPaths = [];
|
|
108
|
+
const physicalState = await resolvePhysicalDirectory(paths.stateDirectory);
|
|
109
|
+
const ancestors = new Map();
|
|
110
|
+
const ancestry = (directory) => {
|
|
111
|
+
const existing = ancestors.get(directory.ancestorIdentity);
|
|
112
|
+
if (existing !== undefined)
|
|
113
|
+
return existing;
|
|
114
|
+
const result = ancestorIdentities(directory.ancestorPath);
|
|
115
|
+
ancestors.set(directory.ancestorIdentity, result);
|
|
116
|
+
return result;
|
|
117
|
+
};
|
|
118
|
+
const overlaps = async (first, second) => {
|
|
119
|
+
if (first.missingComponents.length === 0 && (await ancestry(second)).has(first.ancestorIdentity))
|
|
120
|
+
return true;
|
|
121
|
+
if (second.missingComponents.length === 0 && (await ancestry(first)).has(second.ancestorIdentity))
|
|
122
|
+
return true;
|
|
123
|
+
if (first.ancestorIdentity !== second.ancestorIdentity)
|
|
124
|
+
return false;
|
|
125
|
+
const length = Math.min(first.missingComponents.length, second.missingComponents.length);
|
|
126
|
+
const left = first.missingComponents.slice(0, length);
|
|
127
|
+
const right = second.missingComponents.slice(0, length);
|
|
128
|
+
return left.every((component, index) => component === right[index]) || await missingPathsReferToSameDirectory(first.ancestorPath, left, right);
|
|
129
|
+
};
|
|
130
|
+
for (const [index, repository] of configuration.repositories.entries()) {
|
|
131
|
+
signal?.throwIfAborted();
|
|
132
|
+
const physical = await resolvePhysicalDirectory(repository.path);
|
|
133
|
+
if (await overlaps(physical, physicalState))
|
|
134
|
+
throw new TypeError(`worker.repositories[${index}].path physically overlaps the Daynight state directory.`);
|
|
135
|
+
for (const previous of physicalPaths) {
|
|
136
|
+
if (await overlaps(previous, physical))
|
|
137
|
+
throw new TypeError(`worker.repositories[${index}].path physically overlaps another worker repository.`);
|
|
138
|
+
}
|
|
139
|
+
physicalPaths.push(physical);
|
|
140
|
+
}
|
|
141
|
+
signal?.throwIfAborted();
|
|
142
|
+
return configuration;
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/worker/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { TaskPlatform, WorkerMachine } from "../../api/types.js";
|
|
2
|
+
import type { WorkerRepositoryAssignment } from "./coordinator.js";
|
|
3
|
+
import type { WorkerRemote } from "./remote.js";
|
|
4
|
+
import type { WorkerStore } from "./store.js";
|
|
5
|
+
import type { LocalTask, TransferTarget } from "./types.js";
|
|
6
|
+
export type WorkerControlRequest = {
|
|
7
|
+
kind: "retry";
|
|
8
|
+
taskId: string;
|
|
9
|
+
projectId?: string;
|
|
10
|
+
claimId: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: "release";
|
|
13
|
+
taskId: string;
|
|
14
|
+
projectId?: string;
|
|
15
|
+
claimId: string;
|
|
16
|
+
version: bigint;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "resume";
|
|
19
|
+
taskId: string;
|
|
20
|
+
projectId?: string;
|
|
21
|
+
claimId: string;
|
|
22
|
+
version: bigint;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "transfer";
|
|
25
|
+
taskId: string;
|
|
26
|
+
projectId?: string;
|
|
27
|
+
claimId: string;
|
|
28
|
+
version: bigint;
|
|
29
|
+
target: Omit<TransferTarget, "worktreeId">;
|
|
30
|
+
};
|
|
31
|
+
export declare const createWorkerControlDriver: (options: {
|
|
32
|
+
store: WorkerStore;
|
|
33
|
+
remote: WorkerRemote;
|
|
34
|
+
serverOrigin: string;
|
|
35
|
+
now: () => number;
|
|
36
|
+
}) => {
|
|
37
|
+
advance: (input: LocalTask, signal: AbortSignal, mode?: {
|
|
38
|
+
submit: boolean;
|
|
39
|
+
}) => Promise<LocalTask>;
|
|
40
|
+
};
|
|
41
|
+
export declare const submitWorkerControl: (options: {
|
|
42
|
+
store: WorkerStore;
|
|
43
|
+
remote: WorkerRemote;
|
|
44
|
+
serverOrigin: string;
|
|
45
|
+
workerId: string;
|
|
46
|
+
platform: TaskPlatform;
|
|
47
|
+
machine: WorkerMachine;
|
|
48
|
+
repositories: readonly WorkerRepositoryAssignment[];
|
|
49
|
+
request: WorkerControlRequest;
|
|
50
|
+
signal: AbortSignal;
|
|
51
|
+
now?: () => number;
|
|
52
|
+
}) => Promise<{
|
|
53
|
+
task: LocalTask | null;
|
|
54
|
+
message: string;
|
|
55
|
+
}>;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { ApiError } from "../../api/client.js";
|
|
3
|
+
const cleaned = (task) => task.cleanup?.kind === "terminal" && task.cleanup.result !== null && task.cleanup.agentStopped && task.cleanup.workspaceClosed && task.cleanup.worktreeDeleted;
|
|
4
|
+
const message = (error) => error instanceof Error ? error.message : String(error);
|
|
5
|
+
const sourceActive = (task, claimId) => task.properties.worker?.claimId === claimId && task.properties.worker.state === "active";
|
|
6
|
+
const applied = (task, intent) => intent.kind === "release"
|
|
7
|
+
? task.properties.worker?.claimId === intent.sourceClaimId && task.properties.worker.state === "released"
|
|
8
|
+
: task.properties.worker?.claimId === intent.targetClaimId && task.properties.worker.state === "active" && task.properties.worker.userId === intent.target.userId && task.properties.worker.workerId === intent.target.workerId && task.properties.worker.worktreeId === intent.target.worktreeId && task.properties.worker.agent === intent.target.agent;
|
|
9
|
+
export const createWorkerControlDriver = (options) => ({
|
|
10
|
+
advance: async (input, signal, mode = { submit: true }) => {
|
|
11
|
+
let task = options.store.getTask(input);
|
|
12
|
+
if (task === null)
|
|
13
|
+
throw new Error("The source control execution disappeared.");
|
|
14
|
+
if (task.status === "done" || task.control === null || !cleaned(task))
|
|
15
|
+
return task;
|
|
16
|
+
if (task.serverOrigin !== options.serverOrigin)
|
|
17
|
+
return task;
|
|
18
|
+
if (task.userId === null)
|
|
19
|
+
throw new Error("Source control requires the original authenticated claim owner.");
|
|
20
|
+
if (task.control.submission === "confirmed")
|
|
21
|
+
return task.control.outcome === "applied"
|
|
22
|
+
? options.store.completeAppliedControl(task, task.control.intent, BigInt(task.control.resultVersion), options.now())
|
|
23
|
+
: options.store.completeEndedControl(task, task.control.intent, { observedClaimId: null, observedState: null }, options.now());
|
|
24
|
+
const intent = task.control.intent;
|
|
25
|
+
const observed = await options.remote.readTask(task.projectId, task.taskId, signal);
|
|
26
|
+
await options.remote.authorizeControl(task.projectId, task.userId, undefined, signal);
|
|
27
|
+
const latest = options.store.getTask(task);
|
|
28
|
+
if (latest === null)
|
|
29
|
+
throw new Error("The source control execution disappeared.");
|
|
30
|
+
if (latest.status === "done")
|
|
31
|
+
return latest;
|
|
32
|
+
if (latest.control === null || JSON.stringify(latest.control.intent) !== JSON.stringify(intent))
|
|
33
|
+
throw new Error("The concrete source management decision changed during remote observation.");
|
|
34
|
+
task = latest;
|
|
35
|
+
if (!sourceActive(observed, task.claimId)) {
|
|
36
|
+
if (applied(observed, intent) && task.control.submission === "unknown")
|
|
37
|
+
return options.store.completeAppliedControl(task, intent, observed.version, options.now());
|
|
38
|
+
return options.store.completeEndedControl(task, intent, { observedClaimId: observed.properties.worker?.claimId ?? null, observedState: observed.properties.worker?.state ?? null }, options.now());
|
|
39
|
+
}
|
|
40
|
+
if (!mode.submit || task.control.submission !== "not-submitted")
|
|
41
|
+
return task;
|
|
42
|
+
try {
|
|
43
|
+
task = options.store.markControlSubmitting(task, BigInt(intent.version), options.now());
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const winner = options.store.getTask(task);
|
|
47
|
+
if (winner?.control !== null && winner?.control !== undefined && JSON.stringify(winner.control.intent) === JSON.stringify(intent) && (winner.control.submission === "unknown" || winner.control.submission === "confirmed"))
|
|
48
|
+
return winner;
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const result = intent.kind === "release"
|
|
53
|
+
? await options.remote.release(task.projectId, task.taskId, { claimId: task.claimId, version: BigInt(intent.version), stoppedConfirmed: true }, signal)
|
|
54
|
+
: await options.remote.transfer(task.projectId, task.taskId, { claimId: task.claimId, version: BigInt(intent.version), newClaimId: intent.targetClaimId, target: { userId: intent.target.userId, workerId: intent.target.workerId, machine: intent.target.machine, platform: intent.target.platform, agent: intent.target.agent }, worktreeId: intent.target.worktreeId, stoppedConfirmed: true }, signal);
|
|
55
|
+
return options.store.completeAppliedControl(task, intent, result.version, options.now());
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const current = options.store.getTask(task);
|
|
59
|
+
if (current?.status === "done" && current.control?.submission === "confirmed")
|
|
60
|
+
return current;
|
|
61
|
+
if (error instanceof ApiError && !error.outcomeUnconfirmed)
|
|
62
|
+
options.store.rejectControlSubmission(task, message(error), options.now());
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
export const submitWorkerControl = async (options) => {
|
|
68
|
+
const now = options.now ?? Date.now;
|
|
69
|
+
const request = options.request;
|
|
70
|
+
const local = options.store.listTasks().filter((task) => task.taskId === request.taskId && task.claimId === request.claimId && (request.projectId === undefined || task.projectId === request.projectId));
|
|
71
|
+
if (local.some((task) => task.serverOrigin !== options.serverOrigin))
|
|
72
|
+
throw new Error("The original claim belongs to a different configured service origin; restore that service before managing it.");
|
|
73
|
+
const matches = local.filter((task) => task.serverOrigin === options.serverOrigin);
|
|
74
|
+
if (matches.length > 1)
|
|
75
|
+
throw new Error("The source claim is ambiguous; supply --project.");
|
|
76
|
+
let source = matches[0];
|
|
77
|
+
if (source !== undefined && source.workerId !== options.workerId)
|
|
78
|
+
throw new Error("The source execution belongs to another worker identity.");
|
|
79
|
+
const projectId = source?.projectId ?? request.projectId ?? (options.repositories.length === 1 ? options.repositories[0].project.projectId : undefined);
|
|
80
|
+
if (projectId === undefined)
|
|
81
|
+
throw new Error("This claim has no local execution; supply --project to resume it explicitly.");
|
|
82
|
+
const principal = await options.remote.currentUserId(options.signal);
|
|
83
|
+
const observed = await options.remote.readTask(projectId, request.taskId, options.signal);
|
|
84
|
+
const worker = observed.properties.worker;
|
|
85
|
+
if (request.kind === "resume") {
|
|
86
|
+
const project = options.store.getProject({ serverOrigin: options.serverOrigin, projectId });
|
|
87
|
+
const repository = options.repositories.find((entry) => entry.project.serverOrigin === options.serverOrigin && entry.project.projectId === projectId);
|
|
88
|
+
if (project === null || repository === undefined)
|
|
89
|
+
throw new Error("Resume requires a configured repository and its current agent settings.");
|
|
90
|
+
const pending = options.store.getClaimAttempt(project);
|
|
91
|
+
if (pending !== null) {
|
|
92
|
+
if (pending.taskId !== request.taskId || pending.expectedVersion !== request.version.toString() || pending.userId !== principal)
|
|
93
|
+
throw new Error("An unresolved original claim request cannot be replaced.");
|
|
94
|
+
if (worker?.state === "active" && worker.claimId === pending.claimId && worker.userId === pending.userId && worker.workerId === pending.workerId && worker.worktreeId === pending.worktreeId && worker.agent === pending.configuration.agent) {
|
|
95
|
+
const task = options.store.registerPending({ ...project, taskId: observed.id, claimId: pending.claimId, workerId: pending.workerId, worktreeId: pending.worktreeId }, { kind: "new", configuration: pending.configuration }, now(), principal);
|
|
96
|
+
return { task, message: `Resume grant ${pending.claimId} recovered and committed as pending.` };
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`Resume claim ${pending.claimId} has an unknown outcome; its original request will not be replayed.`);
|
|
99
|
+
}
|
|
100
|
+
if (observed.version !== request.version)
|
|
101
|
+
throw new Error("The explicit task version no longer matches; make a new decision with the observed version.");
|
|
102
|
+
if (worker?.state !== "released" || worker.claimId !== request.claimId)
|
|
103
|
+
throw new Error("Resume requires the exact released previous claim.");
|
|
104
|
+
await options.remote.authorizeControl(projectId, worker.userId, undefined, options.signal);
|
|
105
|
+
const descriptor = { claimId: randomUUID(), workerId: options.workerId, worktreeId: randomUUID(), machine: options.machine, platform: options.platform, agent: repository.configuration.agent };
|
|
106
|
+
options.store.beginClaimAttempt(project, { taskId: request.taskId, claimId: descriptor.claimId, worktreeId: descriptor.worktreeId, workerId: options.workerId, userId: principal, expectedVersion: request.version.toString(), configuration: repository.configuration });
|
|
107
|
+
let grant;
|
|
108
|
+
try {
|
|
109
|
+
grant = await options.remote.resume(projectId, request.taskId, { ...descriptor, version: request.version, previousClaimId: request.claimId }, options.signal);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error instanceof ApiError && !error.outcomeUnconfirmed)
|
|
113
|
+
options.store.rejectClaimAttempt(project, descriptor.claimId, error.confirmedRefusal ? { definiteRejection: true } : { notSubmitted: true });
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
if (grant.properties.worker?.userId !== principal)
|
|
117
|
+
throw new Error("The resume grant belongs to a different authenticated user; the original request remains unresolved.");
|
|
118
|
+
const task = options.store.registerPending({ ...project, taskId: request.taskId, claimId: descriptor.claimId, workerId: descriptor.workerId, worktreeId: descriptor.worktreeId }, { kind: "new", configuration: repository.configuration }, now(), principal);
|
|
119
|
+
return { task, message: `New resume claim ${task.claimId} committed as pending; worker run will prepare its new execution.` };
|
|
120
|
+
}
|
|
121
|
+
if (source === undefined || source.userId === null)
|
|
122
|
+
throw new Error("Management requires the original local execution and its authenticated owner.");
|
|
123
|
+
await options.remote.authorizeControl(projectId, source.userId, undefined, options.signal);
|
|
124
|
+
const existing = source.control;
|
|
125
|
+
if (request.kind !== "retry" && existing !== null && existing.submission !== "rejected") {
|
|
126
|
+
const intent = existing.intent;
|
|
127
|
+
const sameDecision = intent.kind === request.kind && intent.version === request.version.toString() && (request.kind !== "transfer" || (intent.kind === "transfer" && intent.target.userId === request.target.userId && intent.target.workerId === request.target.workerId && intent.target.agent === request.target.agent && intent.target.platform === request.target.platform && JSON.stringify(intent.target.machine) === JSON.stringify(request.target.machine)));
|
|
128
|
+
if (!sameDecision)
|
|
129
|
+
throw new Error("A different source management decision is already persisted; an unknown write cannot be replaced.");
|
|
130
|
+
return { task: source, message: `Existing ${intent.kind} intent retained for claim ${source.claimId}; submission=${existing.submission}.` };
|
|
131
|
+
}
|
|
132
|
+
if (source.status === "done")
|
|
133
|
+
throw new Error("The original local execution is already complete.");
|
|
134
|
+
if (!sourceActive(observed, request.claimId) || worker.userId !== source.userId || worker.workerId !== source.workerId || worker.worktreeId !== source.worktreeId)
|
|
135
|
+
throw new Error("The source claim is no longer the exact active execution; reconcile its existing management outcome first.");
|
|
136
|
+
if (request.kind === "retry") {
|
|
137
|
+
if (principal !== source.userId)
|
|
138
|
+
throw new Error("Retry must retain the original authenticated execution owner.");
|
|
139
|
+
const task = options.store.authorizeRecoveryRetryAtCount(source, source.recovery.count, now());
|
|
140
|
+
return { task, message: `One additional recovery attempt authorized for claim ${task.claimId}; persisted count=${task.recovery.count}.` };
|
|
141
|
+
}
|
|
142
|
+
if (observed.version !== request.version)
|
|
143
|
+
throw new Error("The explicit task version no longer matches; make a new decision with the observed version.");
|
|
144
|
+
if (request.kind === "transfer")
|
|
145
|
+
await options.remote.authorizeControl(projectId, source.userId, request.target.userId, options.signal);
|
|
146
|
+
const intent = request.kind === "release" ? { kind: "release", sourceClaimId: source.claimId, version: request.version.toString() }
|
|
147
|
+
: { kind: "transfer", sourceClaimId: source.claimId, version: request.version.toString(), targetClaimId: randomUUID(), target: { ...request.target, worktreeId: randomUUID() } };
|
|
148
|
+
source = existing?.submission === "rejected" ? options.store.replaceRejectedControlIntent(source, intent, { observedVersion: observed.version }, now()) : options.store.recordControlIntent(source, intent, now());
|
|
149
|
+
return { task: source, message: `${intent.kind} intent persisted for claim ${source.claimId}; source cleanup must finish before the remote write.` };
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../src/commands/worker/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TaskPlatform, WorkerMachine } from "../../api/types.js";
|
|
2
|
+
import type { WorkerEvent, WorkerGitManager } from "./execution.js";
|
|
3
|
+
import type { WorkerHerdrAdapter } from "./herdr.js";
|
|
4
|
+
import type { WorkerRemote } from "./remote.js";
|
|
5
|
+
import type { WorkerStore } from "./store.js";
|
|
6
|
+
import type { ClaimIdentity, CleanupState, FrozenExecutionConfiguration, LocalTask, WorkerProject } from "./types.js";
|
|
7
|
+
export type WorkerRepositoryAssignment = {
|
|
8
|
+
project: WorkerProject;
|
|
9
|
+
configuration: FrozenExecutionConfiguration;
|
|
10
|
+
};
|
|
11
|
+
export type WorkerCoordinatorOptions = {
|
|
12
|
+
store: WorkerStore;
|
|
13
|
+
git: WorkerGitManager;
|
|
14
|
+
herdr: WorkerHerdrAdapter;
|
|
15
|
+
remote: WorkerRemote;
|
|
16
|
+
serverOrigin: string;
|
|
17
|
+
workerId: string;
|
|
18
|
+
platform: TaskPlatform;
|
|
19
|
+
machine: WorkerMachine;
|
|
20
|
+
repositories: readonly WorkerRepositoryAssignment[];
|
|
21
|
+
maxConcurrent: number;
|
|
22
|
+
buildPrompt: (task: LocalTask, platform: TaskPlatform) => string;
|
|
23
|
+
emit: (event: WorkerEvent) => void;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
now?: () => number;
|
|
26
|
+
};
|
|
27
|
+
export declare const createWorkerCoordinator: (options: WorkerCoordinatorOptions) => {
|
|
28
|
+
serializeTask: <T>(identity: Pick<ClaimIdentity, "serverOrigin" | "projectId" | "taskId">, action: () => Promise<T>) => Promise<T>;
|
|
29
|
+
advanceCommittedCleanups: (identity?: ClaimIdentity) => Promise<void>;
|
|
30
|
+
cleanupTask: (identity: ClaimIdentity, kind?: CleanupState["kind"]) => Promise<LocalTask>;
|
|
31
|
+
advanceRetry: (identity: ClaimIdentity) => Promise<LocalTask>;
|
|
32
|
+
tick: () => Promise<void>;
|
|
33
|
+
shutdown: () => Promise<boolean>;
|
|
34
|
+
};
|
|
35
|
+
export type WorkerCoordinator = ReturnType<typeof createWorkerCoordinator>;
|