@agentqueue/worker 0.0.0 → 0.3.1-ci.g02c90ca5cd192c5a75a7d1d19329683cefb22d6e
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 +159 -0
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/aq-askpass.d.ts +2 -0
- package/dist/bin/aq-askpass.js +5 -0
- package/dist/bin/aq-askpass.js.map +1 -0
- package/dist/bin/aq.d.ts +2 -0
- package/dist/bin/aq.js +9 -0
- package/dist/bin/aq.js.map +1 -0
- package/dist/release.json +16 -0
- package/dist/src/app-server/checkpoint-codec.d.ts +4 -0
- package/dist/src/app-server/checkpoint-codec.js +31 -0
- package/dist/src/app-server/checkpoint-codec.js.map +1 -0
- package/dist/src/app-server/codex-token-snapshot.d.ts +11 -0
- package/dist/src/app-server/codex-token-snapshot.js +45 -0
- package/dist/src/app-server/codex-token-snapshot.js.map +1 -0
- package/dist/src/app-server/index.d.ts +70 -0
- package/dist/src/app-server/index.js +319 -0
- package/dist/src/app-server/index.js.map +1 -0
- package/dist/src/app-server/native-checkpoint.d.ts +12 -0
- package/dist/src/app-server/native-checkpoint.js +179 -0
- package/dist/src/app-server/native-checkpoint.js.map +1 -0
- package/dist/src/app-server/process-group.d.ts +6 -0
- package/dist/src/app-server/process-group.js +122 -0
- package/dist/src/app-server/process-group.js.map +1 -0
- package/dist/src/app-server/transports.d.ts +68 -0
- package/dist/src/app-server/transports.js +228 -0
- package/dist/src/app-server/transports.js.map +1 -0
- package/dist/src/app-server/worker-checkpoint.d.ts +15 -0
- package/dist/src/app-server/worker-checkpoint.js +76 -0
- package/dist/src/app-server/worker-checkpoint.js.map +1 -0
- package/dist/src/broker.d.ts +4 -0
- package/dist/src/broker.js +104 -0
- package/dist/src/broker.js.map +1 -0
- package/dist/src/cli.d.ts +14 -0
- package/dist/src/cli.js +212 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/client.d.ts +19 -0
- package/dist/src/client.js +116 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/codex-owner-auth.d.ts +14 -0
- package/dist/src/codex-owner-auth.js +155 -0
- package/dist/src/codex-owner-auth.js.map +1 -0
- package/dist/src/codex-runtime.d.ts +32 -0
- package/dist/src/codex-runtime.js +383 -0
- package/dist/src/codex-runtime.js.map +1 -0
- package/dist/src/completion-outbox.d.ts +38 -0
- package/dist/src/completion-outbox.js +90 -0
- package/dist/src/completion-outbox.js.map +1 -0
- package/dist/src/config.d.ts +16 -0
- package/dist/src/config.js +57 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/diagnostics.d.ts +3 -0
- package/dist/src/diagnostics.js +40 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/isolation.d.ts +34 -0
- package/dist/src/isolation.js +690 -0
- package/dist/src/isolation.js.map +1 -0
- package/dist/src/planning-dev/analysis-runtime.d.ts +6 -0
- package/dist/src/planning-dev/analysis-runtime.js +65 -0
- package/dist/src/planning-dev/analysis-runtime.js.map +1 -0
- package/dist/src/planning-dev/index.d.ts +35 -0
- package/dist/src/planning-dev/index.js +244 -0
- package/dist/src/planning-dev/index.js.map +1 -0
- package/dist/src/planning-dev/native-binary.d.ts +1 -0
- package/dist/src/planning-dev/native-binary.js +67 -0
- package/dist/src/planning-dev/native-binary.js.map +1 -0
- package/dist/src/planning-dev/protocol.d.ts +30 -0
- package/dist/src/planning-dev/protocol.js +43 -0
- package/dist/src/planning-dev/protocol.js.map +1 -0
- package/dist/src/planning-dev/runtime.d.ts +11 -0
- package/dist/src/planning-dev/runtime.js +437 -0
- package/dist/src/planning-dev/runtime.js.map +1 -0
- package/dist/src/process-lock.d.ts +4 -0
- package/dist/src/process-lock.js +44 -0
- package/dist/src/process-lock.js.map +1 -0
- package/dist/src/provider-status.d.ts +21 -0
- package/dist/src/provider-status.js +73 -0
- package/dist/src/provider-status.js.map +1 -0
- package/dist/src/readiness.d.ts +15 -0
- package/dist/src/readiness.js +145 -0
- package/dist/src/readiness.js.map +1 -0
- package/dist/src/register.d.ts +5 -0
- package/dist/src/register.js +178 -0
- package/dist/src/register.js.map +1 -0
- package/dist/src/runtime.d.ts +100 -0
- package/dist/src/runtime.js +2288 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/service.d.ts +11 -0
- package/dist/src/service.js +119 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/supervisor.d.ts +9 -0
- package/dist/src/supervisor.js +157 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/turn-checkpoint.d.ts +58 -0
- package/dist/src/turn-checkpoint.js +314 -0
- package/dist/src/turn-checkpoint.js.map +1 -0
- package/dist/src/types.d.ts +168 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/usage-limit.d.ts +13 -0
- package/dist/src/usage-limit.js +75 -0
- package/dist/src/usage-limit.js.map +1 -0
- package/dist/src/version.d.ts +6 -0
- package/dist/src/version.js +49 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/worker-types.d.ts +12 -0
- package/dist/src/worker-types.js +2 -0
- package/dist/src/worker-types.js.map +1 -0
- package/package.json +56 -4
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
4
|
+
import { mkdir, readFile, rename, lstat, writeFile } from "node:fs/promises";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { codexUsageLimitResetAt, UsageLimitError } from "./usage-limit.js";
|
|
7
|
+
import { CodexAppServer, CodexRpcError, codexServiceTier } from "./app-server/index.js";
|
|
8
|
+
import { NativeCheckpointPending, quiesceNativeCheckpoint, verifyNativeCheckpoint, } from "./app-server/native-checkpoint.js";
|
|
9
|
+
import { WORKER_CODEX_VERSION, WORKER_CODEX_NATIVE_FORMAT, codexResumes, codexWorkspaceRootFeature, } from "./app-server/worker-checkpoint.js";
|
|
10
|
+
export { WORKER_CODEX_VERSION, WORKER_CODEX_STATE } from "./app-server/worker-checkpoint.js";
|
|
11
|
+
function object(value) {
|
|
12
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
13
|
+
throw new Error("Invalid native Codex response");
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function codexConfiguration(assignment, toolFree) {
|
|
17
|
+
const args = [
|
|
18
|
+
"--config",
|
|
19
|
+
'cli_auth_credentials_store="file"',
|
|
20
|
+
"--config",
|
|
21
|
+
"analytics.enabled=false",
|
|
22
|
+
"--config",
|
|
23
|
+
"check_for_update_on_startup=false",
|
|
24
|
+
];
|
|
25
|
+
if (toolFree) {
|
|
26
|
+
args.push("--config", 'shell_environment_policy.inherit="none"', "--config", 'web_search="disabled"', "--config", "tools.update_plan.enabled=false", "--config", "tools.experimental_request_user_input.enabled=false");
|
|
27
|
+
for (const feature of [
|
|
28
|
+
"shell_tool",
|
|
29
|
+
"unified_exec",
|
|
30
|
+
"code_mode_host",
|
|
31
|
+
"code_mode",
|
|
32
|
+
"code_mode_only",
|
|
33
|
+
"browser_use",
|
|
34
|
+
"computer_use",
|
|
35
|
+
"view_image",
|
|
36
|
+
"image_generation",
|
|
37
|
+
"apps",
|
|
38
|
+
"plugins",
|
|
39
|
+
"multi_agent",
|
|
40
|
+
"multi_agent_v2",
|
|
41
|
+
"goals",
|
|
42
|
+
])
|
|
43
|
+
args.push("--disable", feature);
|
|
44
|
+
}
|
|
45
|
+
const harness = assignment.workflow.profile.harness;
|
|
46
|
+
if (harness.thinkingLevel && harness.thinkingLevel !== "auto")
|
|
47
|
+
args.push("--config", `model_reasoning_effort=${JSON.stringify(harness.thinkingLevel)}`);
|
|
48
|
+
return args;
|
|
49
|
+
}
|
|
50
|
+
export async function auxiliaryCodexCatalog(path) {
|
|
51
|
+
const { stdout } = await promisify(execFile)("codex", ["debug", "models", "--bundled"], {
|
|
52
|
+
timeout: 10000,
|
|
53
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
54
|
+
});
|
|
55
|
+
const catalog = object(JSON.parse(stdout));
|
|
56
|
+
if (!Array.isArray(catalog.models) || !catalog.models.length)
|
|
57
|
+
throw new Error("Official Codex model catalog is invalid");
|
|
58
|
+
for (const raw of catalog.models) {
|
|
59
|
+
const model = object(raw);
|
|
60
|
+
Object.assign(model, {
|
|
61
|
+
tool_mode: "direct",
|
|
62
|
+
shell_type: "disabled",
|
|
63
|
+
apply_patch_tool_type: null,
|
|
64
|
+
experimental_supported_tools: [],
|
|
65
|
+
multi_agent_version: "disabled",
|
|
66
|
+
supports_search_tool: false,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
await writeFile(path, JSON.stringify(catalog), { mode: 0o600 });
|
|
70
|
+
return ["--config", `model_catalog_json=${JSON.stringify(resolve(path))}`];
|
|
71
|
+
}
|
|
72
|
+
export function codexBindingIdentity(server, assignment) {
|
|
73
|
+
const digest = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
74
|
+
return {
|
|
75
|
+
identity: digest([
|
|
76
|
+
server,
|
|
77
|
+
assignment.snapshot.workspaceKey,
|
|
78
|
+
assignment.run.sessionId,
|
|
79
|
+
assignment.snapshot.scopeId,
|
|
80
|
+
assignment.snapshot.authorizationContext,
|
|
81
|
+
]),
|
|
82
|
+
manifest: digest([
|
|
83
|
+
assignment.snapshot.toolManifestHash,
|
|
84
|
+
assignment.skills.map(({ id, version, contentHash }) => [id, version, contentHash]),
|
|
85
|
+
]),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function readCodexBinding(root, expected) {
|
|
89
|
+
const path = join(root, "qm-thread.json");
|
|
90
|
+
let raw;
|
|
91
|
+
try {
|
|
92
|
+
const info = await lstat(path);
|
|
93
|
+
if (!info.isFile() || info.isSymbolicLink() || info.size > 16384)
|
|
94
|
+
throw new Error("Invalid native Codex binding");
|
|
95
|
+
raw = await readFile(path, "utf8");
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error.code === "ENOENT")
|
|
99
|
+
return null;
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
const binding = object(JSON.parse(raw));
|
|
103
|
+
if (binding.format !== WORKER_CODEX_NATIVE_FORMAT ||
|
|
104
|
+
typeof binding.codexVersion !== "string" ||
|
|
105
|
+
!codexResumes(WORKER_CODEX_VERSION, binding.codexVersion) ||
|
|
106
|
+
binding.identity !== expected.identity ||
|
|
107
|
+
binding.nativeHome !== resolve(root) ||
|
|
108
|
+
binding.platform !== process.platform ||
|
|
109
|
+
typeof binding.threadId !== "string" ||
|
|
110
|
+
!/^[0-9a-f-]{36}$/.test(binding.threadId))
|
|
111
|
+
throw new Error("Native Codex state is incompatible with this conversation or manifest");
|
|
112
|
+
return binding;
|
|
113
|
+
}
|
|
114
|
+
async function writeCodexBinding(root, binding) {
|
|
115
|
+
const temporary = join(root, `.qm-thread-${randomBytes(8).toString("hex")}`);
|
|
116
|
+
await writeFile(temporary, JSON.stringify(binding), { mode: 0o600 });
|
|
117
|
+
await rename(temporary, join(root, "qm-thread.json"));
|
|
118
|
+
}
|
|
119
|
+
export async function executeCodexTurn(options) {
|
|
120
|
+
const finished = Promise.withResolvers();
|
|
121
|
+
void finished.promise.catch(() => undefined);
|
|
122
|
+
let threadId;
|
|
123
|
+
let finalText = "";
|
|
124
|
+
let settled = false;
|
|
125
|
+
let threads = [];
|
|
126
|
+
let turnId;
|
|
127
|
+
let steering = Promise.resolve();
|
|
128
|
+
let steeringPending = false;
|
|
129
|
+
let steeringError;
|
|
130
|
+
const usageNotifications = new Map();
|
|
131
|
+
const activeTurns = new Map();
|
|
132
|
+
let turnRequested = false;
|
|
133
|
+
let resetAt;
|
|
134
|
+
const fail = (error) => {
|
|
135
|
+
if (settled)
|
|
136
|
+
return;
|
|
137
|
+
settled = true;
|
|
138
|
+
finished.reject(error);
|
|
139
|
+
};
|
|
140
|
+
const root = options.stateRoot;
|
|
141
|
+
const expected = options.identity;
|
|
142
|
+
if ((root === undefined) !== (expected === undefined))
|
|
143
|
+
throw new Error("Native Codex state requires a bound identity");
|
|
144
|
+
if (root) {
|
|
145
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
146
|
+
const info = await lstat(root);
|
|
147
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
148
|
+
throw new Error("Native Codex state must be a private directory");
|
|
149
|
+
}
|
|
150
|
+
const binding = root && expected ? await readCodexBinding(root, expected) : null;
|
|
151
|
+
if (root && binding && binding.codexVersion !== WORKER_CODEX_VERSION)
|
|
152
|
+
await writeCodexBinding(root, { ...binding, codexVersion: WORKER_CODEX_VERSION });
|
|
153
|
+
if (binding && expected && binding.manifest !== expected.manifest)
|
|
154
|
+
await options.event({ type: "manifest.transition", previous: binding.manifest, current: expected.manifest });
|
|
155
|
+
const client = new CodexAppServer({
|
|
156
|
+
...options.client,
|
|
157
|
+
cwd: options.cwd,
|
|
158
|
+
onRequest: async (method, raw) => {
|
|
159
|
+
if (method === "account/chatgptAuthTokens/refresh") {
|
|
160
|
+
const revoked = options.cancelled();
|
|
161
|
+
if (revoked)
|
|
162
|
+
throw revoked;
|
|
163
|
+
if (!options.auth)
|
|
164
|
+
throw new Error("External owner authentication is unavailable");
|
|
165
|
+
const params = object(raw);
|
|
166
|
+
const auth = await options.auth.refresh(typeof params.previousAccountId === "string" ? params.previousAccountId : null);
|
|
167
|
+
const denied = options.cancelled();
|
|
168
|
+
if (denied)
|
|
169
|
+
throw denied;
|
|
170
|
+
return auth;
|
|
171
|
+
}
|
|
172
|
+
if (method === "item/commandExecution/requestApproval" || method === "item/fileChange/requestApproval")
|
|
173
|
+
return { decision: "decline" };
|
|
174
|
+
throw new Error("Unsupported worker native interaction");
|
|
175
|
+
},
|
|
176
|
+
onNotification: async (method, raw) => {
|
|
177
|
+
try {
|
|
178
|
+
const params = object(raw);
|
|
179
|
+
const ownsRoot = params.threadId === threadId;
|
|
180
|
+
if (method === "account/rateLimits/updated")
|
|
181
|
+
resetAt = codexUsageLimitResetAt(params.rateLimits) ?? resetAt;
|
|
182
|
+
if (method === "turn/started" && turnRequested)
|
|
183
|
+
activeTurns.set(String(params.threadId), String(object(params.turn).id));
|
|
184
|
+
if (method === "thread/tokenUsage/updated") {
|
|
185
|
+
const usage = object(params.tokenUsage);
|
|
186
|
+
const key = String(params.threadId);
|
|
187
|
+
const signature = JSON.stringify(usage.total);
|
|
188
|
+
const duplicate = usageNotifications.get(key) === signature;
|
|
189
|
+
usageNotifications.set(key, signature);
|
|
190
|
+
if (!duplicate && activeTurns.get(key) === params.turnId) {
|
|
191
|
+
const last = object(usage.last);
|
|
192
|
+
await options.event({
|
|
193
|
+
type: "usage",
|
|
194
|
+
threadId: params.threadId,
|
|
195
|
+
usage: {
|
|
196
|
+
...last,
|
|
197
|
+
...(last.cacheWriteInputTokens === undefined
|
|
198
|
+
? {}
|
|
199
|
+
: { cacheCreationInputTokens: last.cacheWriteInputTokens }),
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (method === "item/started" || method === "item/completed") {
|
|
205
|
+
const item = object(params.item);
|
|
206
|
+
if (["commandExecution", "fileChange"].includes(String(item.type))) {
|
|
207
|
+
await options.event({
|
|
208
|
+
...params,
|
|
209
|
+
type: method.replace("/", "."),
|
|
210
|
+
item: {
|
|
211
|
+
...item,
|
|
212
|
+
type: item.type === "commandExecution" ? "command_execution" : "file_change",
|
|
213
|
+
...(item.aggregatedOutput === undefined ? {} : { aggregated_output: item.aggregatedOutput }),
|
|
214
|
+
...(item.exitCode === undefined ? {} : { exit_code: item.exitCode }),
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
else if (item.type === "agentMessage" &&
|
|
219
|
+
ownsRoot &&
|
|
220
|
+
method === "item/completed" &&
|
|
221
|
+
typeof item.text === "string") {
|
|
222
|
+
finalText = item.text;
|
|
223
|
+
await options.event({ type: "item.completed", threadId, item: { ...item, type: "agent_message" } });
|
|
224
|
+
}
|
|
225
|
+
else
|
|
226
|
+
await options.event({ type: method, ...params });
|
|
227
|
+
}
|
|
228
|
+
else
|
|
229
|
+
await options.event({ type: method, ...params });
|
|
230
|
+
if (method === "turn/completed" && ownsRoot) {
|
|
231
|
+
const turn = object(params.turn);
|
|
232
|
+
if (turn.status !== "completed") {
|
|
233
|
+
const error = object(turn.error);
|
|
234
|
+
const message = typeof error.message === "string" && error.message.trim()
|
|
235
|
+
? error.message
|
|
236
|
+
: `Codex turn ended with ${String(turn.status)}`;
|
|
237
|
+
return fail(error.codexErrorInfo === "usageLimitExceeded"
|
|
238
|
+
? new UsageLimitError(message, resetAt)
|
|
239
|
+
: new Error(message));
|
|
240
|
+
}
|
|
241
|
+
if (!finalText.trim())
|
|
242
|
+
return fail(new Error("Codex produced no assistant result"));
|
|
243
|
+
settled = true;
|
|
244
|
+
finished.resolve();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
fail(error);
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
options.started(client);
|
|
254
|
+
const monitor = setInterval(() => {
|
|
255
|
+
const error = options.cancelled() ?? client.error();
|
|
256
|
+
if (error) {
|
|
257
|
+
fail(error);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (options.steer && threadId && turnId && !settled && !steeringPending) {
|
|
261
|
+
steeringPending = true;
|
|
262
|
+
steering = (async () => {
|
|
263
|
+
const input = await options.steer();
|
|
264
|
+
if (!input)
|
|
265
|
+
return;
|
|
266
|
+
if (settled) {
|
|
267
|
+
input.restore();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
await client.request("turn/steer", {
|
|
272
|
+
threadId,
|
|
273
|
+
expectedTurnId: turnId,
|
|
274
|
+
input: [{ type: "text", text: input.text }],
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error instanceof CodexRpcError && error.code === -32600 && /no active turn/i.test(error.message))
|
|
279
|
+
input.restore();
|
|
280
|
+
else
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
})()
|
|
284
|
+
.catch((error) => {
|
|
285
|
+
steeringError = error;
|
|
286
|
+
fail(error);
|
|
287
|
+
})
|
|
288
|
+
.finally(() => {
|
|
289
|
+
steeringPending = false;
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}, 100);
|
|
293
|
+
monitor.unref();
|
|
294
|
+
try {
|
|
295
|
+
const cancelled = options.cancelled();
|
|
296
|
+
if (cancelled)
|
|
297
|
+
throw cancelled;
|
|
298
|
+
await client.initialize();
|
|
299
|
+
if (options.auth)
|
|
300
|
+
await client.request("account/login/start", { type: "chatgptAuthTokens", ...options.auth.initial });
|
|
301
|
+
const harness = options.assignment.workflow.profile.harness;
|
|
302
|
+
const context = {
|
|
303
|
+
cwd: resolve(options.cwd),
|
|
304
|
+
...(options.developerInstructions ? { developerInstructions: options.developerInstructions } : {}),
|
|
305
|
+
approvalPolicy: "never",
|
|
306
|
+
sandbox: harness.agentMode === "plan" ? "read-only" : "danger-full-access",
|
|
307
|
+
...(harness.model ? { model: harness.model.replace(/^openai\//, "") } : {}),
|
|
308
|
+
};
|
|
309
|
+
if (binding) {
|
|
310
|
+
await verifyNativeCheckpoint(client, binding.threadId, binding.threads);
|
|
311
|
+
await client.request("thread/unarchive", { threadId: binding.threadId });
|
|
312
|
+
}
|
|
313
|
+
const response = await client.request(binding ? "thread/resume" : "thread/start", {
|
|
314
|
+
...context,
|
|
315
|
+
...(binding ? { threadId: binding.threadId, excludeTurns: true } : { ephemeral: !root }),
|
|
316
|
+
});
|
|
317
|
+
threadId = response.thread.id;
|
|
318
|
+
if (!/^[0-9a-f-]{36}$/.test(threadId) || (binding && binding.threadId !== threadId))
|
|
319
|
+
throw new Error("Native Codex thread identity changed");
|
|
320
|
+
const denied = options.cancelled();
|
|
321
|
+
if (denied)
|
|
322
|
+
throw denied;
|
|
323
|
+
turnRequested = true;
|
|
324
|
+
const startedTurn = await client.request("turn/start", {
|
|
325
|
+
threadId,
|
|
326
|
+
input: [{ type: "text", text: binding ? (options.resumedInput ?? options.input) : options.input }],
|
|
327
|
+
...(harness.fastMode === undefined ? {} : codexServiceTier(harness.fastMode)),
|
|
328
|
+
});
|
|
329
|
+
turnId = startedTurn.turn.id;
|
|
330
|
+
await finished.promise;
|
|
331
|
+
await steering;
|
|
332
|
+
if (steeringError)
|
|
333
|
+
throw steeringError;
|
|
334
|
+
await client.drainNotifications();
|
|
335
|
+
if (root) {
|
|
336
|
+
const deadline = Date.now() + 30000;
|
|
337
|
+
for (;;) {
|
|
338
|
+
const revoked = options.cancelled();
|
|
339
|
+
if (revoked)
|
|
340
|
+
throw revoked;
|
|
341
|
+
try {
|
|
342
|
+
threads = await quiesceNativeCheckpoint(client, threadId);
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
if (!(error instanceof NativeCheckpointPending) || Date.now() >= deadline)
|
|
347
|
+
throw error;
|
|
348
|
+
await new Promise((done) => setTimeout(done, 100));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const revoked = options.cancelled();
|
|
353
|
+
if (revoked)
|
|
354
|
+
throw revoked;
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
clearInterval(monitor);
|
|
358
|
+
try {
|
|
359
|
+
await client.close();
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
try {
|
|
363
|
+
await steering;
|
|
364
|
+
}
|
|
365
|
+
finally {
|
|
366
|
+
await options.stopped();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (root && expected)
|
|
371
|
+
await writeCodexBinding(root, {
|
|
372
|
+
format: WORKER_CODEX_NATIVE_FORMAT,
|
|
373
|
+
codexVersion: WORKER_CODEX_VERSION,
|
|
374
|
+
...expected,
|
|
375
|
+
nativeHome: resolve(root),
|
|
376
|
+
platform: process.platform,
|
|
377
|
+
workspaceRootFeature: codexWorkspaceRootFeature(resolve(root, "../..")),
|
|
378
|
+
threadId: threadId,
|
|
379
|
+
threads,
|
|
380
|
+
});
|
|
381
|
+
return finalText;
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=codex-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-runtime.js","sourceRoot":"","sources":["../../src/codex-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface CompletionBody {
|
|
2
|
+
leaseToken: string;
|
|
3
|
+
result: unknown;
|
|
4
|
+
auxiliary: unknown;
|
|
5
|
+
checkpoint?: unknown;
|
|
6
|
+
turnCheckpoint?: unknown;
|
|
7
|
+
}
|
|
8
|
+
interface EnvelopeIdentity {
|
|
9
|
+
server: string;
|
|
10
|
+
workerId: string;
|
|
11
|
+
runId: string;
|
|
12
|
+
attempt: number;
|
|
13
|
+
leaseToken: string;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
}
|
|
16
|
+
export type CompletionEnvelope = EnvelopeIdentity & ({
|
|
17
|
+
version: 2;
|
|
18
|
+
body: CompletionBody;
|
|
19
|
+
} | {
|
|
20
|
+
version: 3;
|
|
21
|
+
body: {
|
|
22
|
+
leaseToken: string;
|
|
23
|
+
error: string;
|
|
24
|
+
retry: boolean;
|
|
25
|
+
failure?: {
|
|
26
|
+
kind: "usage_limit";
|
|
27
|
+
resetAt?: number;
|
|
28
|
+
};
|
|
29
|
+
unstarted?: boolean;
|
|
30
|
+
};
|
|
31
|
+
completion?: CompletionBody;
|
|
32
|
+
});
|
|
33
|
+
export declare class CompletionOutboxPersistenceError extends Error {
|
|
34
|
+
}
|
|
35
|
+
export declare function saveCompletionEnvelope(envelope: CompletionEnvelope): Promise<void>;
|
|
36
|
+
export declare function listCompletionEnvelopes(): Promise<CompletionEnvelope[]>;
|
|
37
|
+
export declare function removeCompletionEnvelope(envelope: Pick<CompletionEnvelope, "runId" | "attempt" | "server" | "workerId">): Promise<void>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { workerHome } from "./config.js";
|
|
5
|
+
class CompletionRecoveryRequired extends Error {
|
|
6
|
+
}
|
|
7
|
+
export class CompletionOutboxPersistenceError extends Error {
|
|
8
|
+
}
|
|
9
|
+
const outboxPath = () => join(workerHome(), "completion-outbox");
|
|
10
|
+
function envelopePath(value) {
|
|
11
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(value.runId) || !Number.isSafeInteger(value.attempt) || value.attempt < 1) {
|
|
12
|
+
throw new Error("invalid completion envelope identity");
|
|
13
|
+
}
|
|
14
|
+
const owner = createHash("sha256")
|
|
15
|
+
.update(JSON.stringify([value.server, value.workerId]))
|
|
16
|
+
.digest("hex");
|
|
17
|
+
return join(outboxPath(), `${owner}.${value.runId}.${value.attempt}.json`);
|
|
18
|
+
}
|
|
19
|
+
export async function saveCompletionEnvelope(envelope) {
|
|
20
|
+
try {
|
|
21
|
+
const path = envelopePath(envelope);
|
|
22
|
+
await mkdir(outboxPath(), { recursive: true, mode: 0o700 });
|
|
23
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
24
|
+
await writeFile(temporary, `${JSON.stringify(envelope)}\n`, { mode: 0o600 });
|
|
25
|
+
await chmod(temporary, 0o600);
|
|
26
|
+
await rename(temporary, path);
|
|
27
|
+
}
|
|
28
|
+
catch (cause) {
|
|
29
|
+
throw new CompletionOutboxPersistenceError("Failed to persist worker outcome", { cause });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function listCompletionEnvelopes() {
|
|
33
|
+
const names = await readdir(outboxPath()).catch((error) => {
|
|
34
|
+
if (error.code === "ENOENT")
|
|
35
|
+
return [];
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
38
|
+
const values = [];
|
|
39
|
+
for (const name of names.filter((value) => /^(?:[a-f0-9]{64}\.)?[a-zA-Z0-9_-]+\.[1-9][0-9]*\.json$/.test(value))) {
|
|
40
|
+
const path = join(outboxPath(), name);
|
|
41
|
+
try {
|
|
42
|
+
const value = JSON.parse(await readFile(path, "utf8"));
|
|
43
|
+
if (value && typeof value === "object" && "version" in value && ![1, 2, 3].includes(Number(value.version)))
|
|
44
|
+
throw new CompletionRecoveryRequired(`Unsupported durable worker outcome requires recovery: ${path}. The original file is preserved.`);
|
|
45
|
+
if (value &&
|
|
46
|
+
typeof value === "object" &&
|
|
47
|
+
value.version === 1 &&
|
|
48
|
+
typeof value.runId === "string" &&
|
|
49
|
+
Number.isSafeInteger(value.attempt) &&
|
|
50
|
+
value.attempt > 0 &&
|
|
51
|
+
typeof value.leaseToken === "string" &&
|
|
52
|
+
value.body &&
|
|
53
|
+
typeof value.body === "object" &&
|
|
54
|
+
typeof value.createdAt === "number")
|
|
55
|
+
throw new CompletionRecoveryRequired(`Legacy completion requires recovery: ${path}. The original file is preserved. Verify its original server, worker, Run, attempt and lease before migrating to v2; do not re-register or delete it.`);
|
|
56
|
+
if (typeof value !== "object" ||
|
|
57
|
+
value === null ||
|
|
58
|
+
![2, 3].includes(value.version) ||
|
|
59
|
+
typeof value.server !== "string" ||
|
|
60
|
+
typeof value.workerId !== "string" ||
|
|
61
|
+
typeof value.runId !== "string" ||
|
|
62
|
+
!Number.isSafeInteger(value.attempt) ||
|
|
63
|
+
value.attempt < 1 ||
|
|
64
|
+
typeof value.leaseToken !== "string" ||
|
|
65
|
+
typeof value.body !== "object" ||
|
|
66
|
+
value.body === null ||
|
|
67
|
+
typeof value.createdAt !== "number") {
|
|
68
|
+
throw new Error("invalid completion envelope");
|
|
69
|
+
}
|
|
70
|
+
const envelope = value;
|
|
71
|
+
if (envelope.version === 3 &&
|
|
72
|
+
(typeof envelope.body.error !== "string" ||
|
|
73
|
+
!envelope.body.error.trim() ||
|
|
74
|
+
typeof envelope.body.retry !== "boolean" ||
|
|
75
|
+
envelope.body.leaseToken !== envelope.leaseToken))
|
|
76
|
+
throw new CompletionRecoveryRequired(`Invalid durable worker failure requires recovery: ${path}. The original file is preserved.`);
|
|
77
|
+
values.push(envelope);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof CompletionRecoveryRequired)
|
|
81
|
+
throw error;
|
|
82
|
+
await rename(path, `${path}.corrupt-${Date.now()}-${randomUUID()}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return values.sort((left, right) => left.createdAt - right.createdAt);
|
|
86
|
+
}
|
|
87
|
+
export async function removeCompletionEnvelope(envelope) {
|
|
88
|
+
await rm(envelopePath(envelope), { force: true });
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=completion-outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-outbox.js","sourceRoot":"","sources":["../../src/completion-outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorkerConfig } from "./types.ts";
|
|
2
|
+
export declare const workerHome: () => string;
|
|
3
|
+
export declare const claudeAuthPath: (root?: string) => string;
|
|
4
|
+
declare const CLAUDE_AUTH_NAMES: readonly ["CLAUDE_CODE_OAUTH_TOKEN", "ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
|
|
5
|
+
type ClaudeAuthName = (typeof CLAUDE_AUTH_NAMES)[number];
|
|
6
|
+
export interface ClaudeAuth {
|
|
7
|
+
name: ClaudeAuthName;
|
|
8
|
+
value: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const workspacesPath: () => string;
|
|
11
|
+
export declare const saveConfig: (config: WorkerConfig, root?: string) => Promise<void>;
|
|
12
|
+
export declare const loadConfig: (root?: string) => Promise<WorkerConfig>;
|
|
13
|
+
export declare function loadClaudeAuth(environment?: NodeJS.ProcessEnv, path?: string): ClaudeAuth | null;
|
|
14
|
+
export declare function saveClaudeAuth(environment?: NodeJS.ProcessEnv, path?: string): Promise<boolean>;
|
|
15
|
+
export declare const clearConfig: () => Promise<void>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
export const workerHome = () => process.env.AQ_HOME?.trim() || join(homedir(), ".agentqueue");
|
|
6
|
+
const configPath = (root = workerHome()) => join(root, "worker.json");
|
|
7
|
+
export const claudeAuthPath = (root = workerHome()) => join(root, "credentials", "claude.json");
|
|
8
|
+
const CLAUDE_AUTH_NAMES = ["CLAUDE_CODE_OAUTH_TOKEN", "ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
|
|
9
|
+
export const workspacesPath = () => process.env.AQ_WORKSPACES?.trim() || `${workerHome()}-workspaces`;
|
|
10
|
+
async function secureWrite(path, value) {
|
|
11
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
12
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
13
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
|
|
14
|
+
await chmod(temporary, 0o600);
|
|
15
|
+
await rename(temporary, path);
|
|
16
|
+
}
|
|
17
|
+
async function readJson(path) {
|
|
18
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
19
|
+
}
|
|
20
|
+
export const saveConfig = (config, root) => secureWrite(configPath(root), config);
|
|
21
|
+
export const loadConfig = (root) => readJson(configPath(root));
|
|
22
|
+
function claudeAuthFromEnvironment(environment) {
|
|
23
|
+
for (const name of CLAUDE_AUTH_NAMES) {
|
|
24
|
+
const value = environment[name]?.trim();
|
|
25
|
+
if (value && value.length >= 8)
|
|
26
|
+
return { name, value };
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
export function loadClaudeAuth(environment = process.env, path = claudeAuthPath()) {
|
|
31
|
+
const current = claudeAuthFromEnvironment(environment);
|
|
32
|
+
if (current)
|
|
33
|
+
return current;
|
|
34
|
+
try {
|
|
35
|
+
const saved = JSON.parse(readFileSync(path, "utf8"));
|
|
36
|
+
if (CLAUDE_AUTH_NAMES.includes(saved.name) &&
|
|
37
|
+
typeof saved.value === "string" &&
|
|
38
|
+
saved.value.length >= 8) {
|
|
39
|
+
return saved;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
export async function saveClaudeAuth(environment = process.env, path = claudeAuthPath()) {
|
|
48
|
+
const auth = claudeAuthFromEnvironment(environment);
|
|
49
|
+
if (!auth)
|
|
50
|
+
return false;
|
|
51
|
+
await secureWrite(path, auth);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
export const clearConfig = async () => {
|
|
55
|
+
await Promise.all([rm(configPath(), { force: true }), rm(claudeAuthPath(), { force: true })]);
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type DiagnosticFields = Record<string, string | number | boolean | null | undefined>;
|
|
2
|
+
export declare function workerDiagnostic(event: string, fields?: DiagnosticFields, root?: string): void;
|
|
3
|
+
export declare function workerDiagnosticError(error: unknown): DiagnosticFields;
|