@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.
Files changed (109) hide show
  1. package/README.md +159 -0
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/aq-askpass.d.ts +2 -0
  4. package/dist/bin/aq-askpass.js +5 -0
  5. package/dist/bin/aq-askpass.js.map +1 -0
  6. package/dist/bin/aq.d.ts +2 -0
  7. package/dist/bin/aq.js +9 -0
  8. package/dist/bin/aq.js.map +1 -0
  9. package/dist/release.json +16 -0
  10. package/dist/src/app-server/checkpoint-codec.d.ts +4 -0
  11. package/dist/src/app-server/checkpoint-codec.js +31 -0
  12. package/dist/src/app-server/checkpoint-codec.js.map +1 -0
  13. package/dist/src/app-server/codex-token-snapshot.d.ts +11 -0
  14. package/dist/src/app-server/codex-token-snapshot.js +45 -0
  15. package/dist/src/app-server/codex-token-snapshot.js.map +1 -0
  16. package/dist/src/app-server/index.d.ts +70 -0
  17. package/dist/src/app-server/index.js +319 -0
  18. package/dist/src/app-server/index.js.map +1 -0
  19. package/dist/src/app-server/native-checkpoint.d.ts +12 -0
  20. package/dist/src/app-server/native-checkpoint.js +179 -0
  21. package/dist/src/app-server/native-checkpoint.js.map +1 -0
  22. package/dist/src/app-server/process-group.d.ts +6 -0
  23. package/dist/src/app-server/process-group.js +122 -0
  24. package/dist/src/app-server/process-group.js.map +1 -0
  25. package/dist/src/app-server/transports.d.ts +68 -0
  26. package/dist/src/app-server/transports.js +228 -0
  27. package/dist/src/app-server/transports.js.map +1 -0
  28. package/dist/src/app-server/worker-checkpoint.d.ts +15 -0
  29. package/dist/src/app-server/worker-checkpoint.js +76 -0
  30. package/dist/src/app-server/worker-checkpoint.js.map +1 -0
  31. package/dist/src/broker.d.ts +4 -0
  32. package/dist/src/broker.js +104 -0
  33. package/dist/src/broker.js.map +1 -0
  34. package/dist/src/cli.d.ts +14 -0
  35. package/dist/src/cli.js +212 -0
  36. package/dist/src/cli.js.map +1 -0
  37. package/dist/src/client.d.ts +19 -0
  38. package/dist/src/client.js +116 -0
  39. package/dist/src/client.js.map +1 -0
  40. package/dist/src/codex-owner-auth.d.ts +14 -0
  41. package/dist/src/codex-owner-auth.js +155 -0
  42. package/dist/src/codex-owner-auth.js.map +1 -0
  43. package/dist/src/codex-runtime.d.ts +32 -0
  44. package/dist/src/codex-runtime.js +383 -0
  45. package/dist/src/codex-runtime.js.map +1 -0
  46. package/dist/src/completion-outbox.d.ts +38 -0
  47. package/dist/src/completion-outbox.js +90 -0
  48. package/dist/src/completion-outbox.js.map +1 -0
  49. package/dist/src/config.d.ts +16 -0
  50. package/dist/src/config.js +57 -0
  51. package/dist/src/config.js.map +1 -0
  52. package/dist/src/diagnostics.d.ts +3 -0
  53. package/dist/src/diagnostics.js +40 -0
  54. package/dist/src/diagnostics.js.map +1 -0
  55. package/dist/src/isolation.d.ts +34 -0
  56. package/dist/src/isolation.js +690 -0
  57. package/dist/src/isolation.js.map +1 -0
  58. package/dist/src/planning-dev/analysis-runtime.d.ts +6 -0
  59. package/dist/src/planning-dev/analysis-runtime.js +65 -0
  60. package/dist/src/planning-dev/analysis-runtime.js.map +1 -0
  61. package/dist/src/planning-dev/index.d.ts +35 -0
  62. package/dist/src/planning-dev/index.js +244 -0
  63. package/dist/src/planning-dev/index.js.map +1 -0
  64. package/dist/src/planning-dev/native-binary.d.ts +1 -0
  65. package/dist/src/planning-dev/native-binary.js +67 -0
  66. package/dist/src/planning-dev/native-binary.js.map +1 -0
  67. package/dist/src/planning-dev/protocol.d.ts +30 -0
  68. package/dist/src/planning-dev/protocol.js +43 -0
  69. package/dist/src/planning-dev/protocol.js.map +1 -0
  70. package/dist/src/planning-dev/runtime.d.ts +11 -0
  71. package/dist/src/planning-dev/runtime.js +437 -0
  72. package/dist/src/planning-dev/runtime.js.map +1 -0
  73. package/dist/src/process-lock.d.ts +4 -0
  74. package/dist/src/process-lock.js +44 -0
  75. package/dist/src/process-lock.js.map +1 -0
  76. package/dist/src/provider-status.d.ts +21 -0
  77. package/dist/src/provider-status.js +73 -0
  78. package/dist/src/provider-status.js.map +1 -0
  79. package/dist/src/readiness.d.ts +15 -0
  80. package/dist/src/readiness.js +145 -0
  81. package/dist/src/readiness.js.map +1 -0
  82. package/dist/src/register.d.ts +5 -0
  83. package/dist/src/register.js +178 -0
  84. package/dist/src/register.js.map +1 -0
  85. package/dist/src/runtime.d.ts +100 -0
  86. package/dist/src/runtime.js +2288 -0
  87. package/dist/src/runtime.js.map +1 -0
  88. package/dist/src/service.d.ts +11 -0
  89. package/dist/src/service.js +119 -0
  90. package/dist/src/service.js.map +1 -0
  91. package/dist/src/supervisor.d.ts +9 -0
  92. package/dist/src/supervisor.js +157 -0
  93. package/dist/src/supervisor.js.map +1 -0
  94. package/dist/src/turn-checkpoint.d.ts +58 -0
  95. package/dist/src/turn-checkpoint.js +314 -0
  96. package/dist/src/turn-checkpoint.js.map +1 -0
  97. package/dist/src/types.d.ts +168 -0
  98. package/dist/src/types.js +2 -0
  99. package/dist/src/types.js.map +1 -0
  100. package/dist/src/usage-limit.d.ts +13 -0
  101. package/dist/src/usage-limit.js +75 -0
  102. package/dist/src/usage-limit.js.map +1 -0
  103. package/dist/src/version.d.ts +6 -0
  104. package/dist/src/version.js +49 -0
  105. package/dist/src/version.js.map +1 -0
  106. package/dist/src/worker-types.d.ts +12 -0
  107. package/dist/src/worker-types.js +2 -0
  108. package/dist/src/worker-types.js.map +1 -0
  109. package/package.json +56 -4
@@ -0,0 +1,437 @@
1
+ import { createHash, createHmac, randomBytes, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { CodexAppServer, CodexRpcError } from "../app-server/index.js";
5
+ import { WORKER_CODEX_STATE, WORKER_CODEX_VERSION } from "../app-server/worker-checkpoint.js";
6
+ import { workerCodexAuth } from "../codex-owner-auth.js";
7
+ import { checkpointArchive, restoreCheckpoint } from "../runtime.js";
8
+ import { isolate, childEnvironment, recoverIsolatedUnits } from "../isolation.js";
9
+ import { planningAnalysisRuntime, planningAnalysisThreadParams } from "./analysis-runtime.js";
10
+ import { DEVELOPMENT_ARCHIVE_CHUNK, DEVELOPMENT_MAX_ARCHIVE, developmentInstance, developmentObject, developmentString, developmentRpcTimeout, } from "./protocol.js";
11
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
12
+ export async function createDevelopmentRunner(options) {
13
+ const analysis = options.analysisPython
14
+ ? await planningAnalysisRuntime(options.analysisPython, [options.stateRoot, options.ownerCodexHome])
15
+ : undefined;
16
+ const workspaceRoot = join(options.stateRoot, "workspaces");
17
+ await mkdir(workspaceRoot, { recursive: true, mode: 0o700 });
18
+ const units = join(options.stateRoot, "units");
19
+ const receiptPath = join(options.stateRoot, "cessation.json");
20
+ const ceased = new Set(JSON.parse(await readFile(receiptPath, "utf8").catch((e) => {
21
+ if (e.code === "ENOENT")
22
+ return "[]";
23
+ throw e;
24
+ })));
25
+ let saving = Promise.resolve();
26
+ const cessation = (unit) => {
27
+ ceased.add(unit);
28
+ saving = saving.then(async () => {
29
+ const temporary = `${receiptPath}.tmp`;
30
+ await writeFile(temporary, JSON.stringify([...ceased]), { mode: 0o600 });
31
+ await rename(temporary, receiptPath);
32
+ });
33
+ return saving;
34
+ };
35
+ await recoverIsolatedUnits({ directory: units, workspaceRoot, onCessation: cessation });
36
+ await rm(workspaceRoot, { recursive: true, force: true });
37
+ await mkdir(workspaceRoot, { mode: 0o700 });
38
+ const instances = new Map();
39
+ const released = new Map();
40
+ let closing = false;
41
+ const get = (input) => {
42
+ const identity = developmentInstance(input.instance);
43
+ const instance = instances.get(identity.instanceId);
44
+ if (!instance || JSON.stringify(instance.identity) !== JSON.stringify(identity))
45
+ throw new Error("Development instance fenced");
46
+ return instance;
47
+ };
48
+ const stop = (instance) => (instance.stopping ??= (async () => {
49
+ let nativeError;
50
+ try {
51
+ await instance.native?.close();
52
+ }
53
+ catch (error) {
54
+ nativeError = error;
55
+ }
56
+ await instance.invocation?.cleanup();
57
+ instance.stopped = true;
58
+ for (const answer of instance.answers.values())
59
+ answer.reject(new Error("Development process stopped"));
60
+ instance.answers.clear();
61
+ if (nativeError)
62
+ throw nativeError;
63
+ })());
64
+ const release = async (instance) => {
65
+ let nativeCloseFailed = false;
66
+ try {
67
+ await stop(instance);
68
+ }
69
+ catch (error) {
70
+ if (!instance.stopped)
71
+ throw error;
72
+ nativeCloseFailed = true;
73
+ }
74
+ await rm(instance.workspace, { recursive: true, force: true });
75
+ const receipt = { isolationId: instance.invocation?.unit ?? null, identity: instance.identity, nativeCloseFailed };
76
+ released.set(instance.identity.instanceId, receipt);
77
+ if (released.size > 1024)
78
+ released.delete(released.keys().next().value);
79
+ instances.delete(instance.identity.instanceId);
80
+ return receipt;
81
+ };
82
+ const origin = new URL(options.ontraOrigin);
83
+ if (origin.protocol !== "http:" ||
84
+ !["localhost", "127.0.0.1", "[::1]"].includes(origin.hostname) ||
85
+ origin.username ||
86
+ origin.password ||
87
+ origin.pathname !== "/" ||
88
+ origin.search ||
89
+ origin.hash)
90
+ throw new Error("Development broker requires a literal loopback HTTP origin");
91
+ const lifecycle = new Map();
92
+ const execute = async (operation, value, authorityDeadline = Date.now() + 15000) => {
93
+ if (closing)
94
+ throw new Error("Development runner stopping");
95
+ const input = developmentObject(value);
96
+ if (operation === "http") {
97
+ const kind = developmentString(input.operation);
98
+ if (!["authority", "manifest", "tool", "transfer"].includes(kind))
99
+ throw new Error("Development callback forbidden");
100
+ const nonce = randomBytes(18).toString("hex");
101
+ const path = `/api/internal/planning-qm/${kind}?_sourceAuthNonce=${nonce}`;
102
+ const body = JSON.stringify(input.input);
103
+ const timestamp = Math.floor(Date.now() / 1000);
104
+ const signature = `v0=${createHmac("sha256", options.authoritySecret).update(`v0:${timestamp}:POST\n${path}\n${body}`).digest("hex")}`;
105
+ const response = await fetch(new URL(path, origin), {
106
+ method: "POST",
107
+ redirect: "error",
108
+ body,
109
+ signal: AbortSignal.timeout(kind === "authority" ? 4000 : 28000),
110
+ headers: { "content-type": "application/json", "x-timestamp": String(timestamp), "x-signature": signature },
111
+ });
112
+ const chunks = [];
113
+ let size = 0;
114
+ if (!response.body)
115
+ throw new Error("Development callback response missing");
116
+ const reader = response.body.getReader();
117
+ try {
118
+ for (;;) {
119
+ const item = await reader.read();
120
+ if (item.done)
121
+ break;
122
+ size += item.value.length;
123
+ if (size > 16 * 1024 * 1024)
124
+ throw new Error("Development callback too large");
125
+ chunks.push(item.value);
126
+ }
127
+ }
128
+ finally {
129
+ await reader.cancel();
130
+ }
131
+ return { status: response.status, body: Buffer.concat(chunks).toString("utf8") };
132
+ }
133
+ if (operation === "recover") {
134
+ if (!Array.isArray(input.bindings) || input.bindings.length > 32)
135
+ throw new Error("Invalid development recovery");
136
+ for (const raw of input.bindings) {
137
+ const binding = developmentObject(raw);
138
+ const retained = instances.get(String(binding.instance_id));
139
+ if (retained) {
140
+ const identity = retained.identity;
141
+ if (identity.fence.tenantId !== binding.tenant_id ||
142
+ identity.fence.conversationId !== binding.conversation_id ||
143
+ identity.fence.runId !== binding.run_id ||
144
+ identity.fence.ownerId !== binding.owner_id ||
145
+ identity.fence.attempt !== binding.attempt ||
146
+ identity.fence.runEpoch !== String(binding.run_epoch) ||
147
+ identity.generation !== String(binding.generation))
148
+ throw new Error("Development recovery identity differs");
149
+ retained.revoked = true;
150
+ await retained.native?.close().catch(() => { });
151
+ await lifecycle.get(identity.instanceId)?.catch(() => { });
152
+ await release(retained);
153
+ }
154
+ if (binding.isolation_id !== null && !ceased.has(developmentString(binding.isolation_id)))
155
+ throw new Error("Development cessation is unconfirmed");
156
+ }
157
+ return { stopped: input.bindings };
158
+ }
159
+ if (operation === "open") {
160
+ const identity = developmentInstance(input.instance);
161
+ if (instances.has(identity.instanceId) || released.has(identity.instanceId) || instances.size >= 2)
162
+ throw new Error("Development instance already exists or capacity reached");
163
+ const workspace = join(workspaceRoot, hash(JSON.stringify([identity.fence.tenantId, identity.fence.conversationId])));
164
+ if ([...instances.values()].some((item) => item.workspace === workspace))
165
+ throw new Error("Development workspace is reserved");
166
+ const instance = {
167
+ identity,
168
+ workspace,
169
+ secrets: new Set(),
170
+ stopped: false,
171
+ archive: "",
172
+ events: [],
173
+ eventBytes: 0,
174
+ answers: new Map(),
175
+ authorityUntil: Math.min(authorityDeadline, Date.now() + 15000),
176
+ revoked: false,
177
+ };
178
+ instances.set(identity.instanceId, instance);
179
+ try {
180
+ await rm(workspace, { recursive: true, force: true });
181
+ if (closing)
182
+ throw new Error("Development runner stopping");
183
+ await mkdir(workspace, { mode: 0o700 });
184
+ if (closing)
185
+ throw new Error("Development runner stopping");
186
+ }
187
+ catch (error) {
188
+ instances.delete(identity.instanceId);
189
+ throw error;
190
+ }
191
+ return { workspace, nativeVersion: WORKER_CODEX_VERSION };
192
+ }
193
+ if (operation === "close") {
194
+ const identity = developmentInstance(input.instance);
195
+ const receipt = released.get(identity.instanceId);
196
+ if (receipt) {
197
+ if (JSON.stringify(receipt.identity) !== JSON.stringify(identity))
198
+ throw new Error("Development release receipt fenced");
199
+ return receipt;
200
+ }
201
+ if (!instances.has(identity.instanceId)) {
202
+ const absent = { identity, isolationId: null, nativeCloseFailed: false };
203
+ released.set(identity.instanceId, absent);
204
+ return absent;
205
+ }
206
+ }
207
+ const instance = get(input);
208
+ if (!["close", "quiesce", "archive-read", "release"].includes(operation)) {
209
+ if (instance.revoked || authorityDeadline <= Date.now())
210
+ throw new Error("Development execution authority expired");
211
+ instance.authorityUntil = Math.min(authorityDeadline, Date.now() + 15000);
212
+ }
213
+ if (operation === "heartbeat")
214
+ return true;
215
+ if (operation === "archive-write") {
216
+ const chunk = developmentString(input.chunk, DEVELOPMENT_ARCHIVE_CHUNK);
217
+ if (instance.native ||
218
+ instance.stopped ||
219
+ input.offset !== instance.archive.length ||
220
+ Buffer.byteLength(instance.archive) + Buffer.byteLength(chunk) > DEVELOPMENT_MAX_ARCHIVE)
221
+ throw new Error("Development restore fenced");
222
+ instance.archive += chunk;
223
+ return { offset: instance.archive.length };
224
+ }
225
+ if (operation === "start") {
226
+ if (instance.native || instance.stopped)
227
+ throw new Error("Development process already started");
228
+ if (instance.archive) {
229
+ if (hash(instance.archive) !== input.sha256)
230
+ throw new Error("Development checkpoint integrity differs");
231
+ await restoreCheckpoint(instance.workspace, {
232
+ archive: instance.archive,
233
+ contentHash: hash(instance.archive),
234
+ generation: 0,
235
+ });
236
+ instance.archive = "";
237
+ }
238
+ if (closing || instance.revoked)
239
+ throw new Error("Development execution authority expired");
240
+ const auth = await workerCodexAuth((values) => {
241
+ for (const item of values)
242
+ instance.secrets.add(item);
243
+ instance.native?.addRedactions(values);
244
+ }, { home: options.ownerCodexHome, binary: options.binary, environment: { OPENAI_API_KEY: "" } });
245
+ if (!auth)
246
+ throw new Error("Development requires a Codex subscription login");
247
+ const codexHome = join(instance.workspace, WORKER_CODEX_STATE);
248
+ await mkdir(codexHome, { recursive: true, mode: 0o700 });
249
+ if (closing || instance.revoked || instance.authorityUntil <= Date.now())
250
+ throw new Error("Development execution authority expired");
251
+ instance.invocation = await isolate(options.binary, [
252
+ "app-server",
253
+ "--config",
254
+ 'cli_auth_credentials_store="ephemeral"',
255
+ "--config",
256
+ "analytics.enabled=false",
257
+ "--config",
258
+ "check_for_update_on_startup=false",
259
+ "--disable",
260
+ "plugins",
261
+ "--disable",
262
+ "apps",
263
+ ], instance.workspace, instance.workspace, childEnvironment(instance.workspace, undefined, {
264
+ CODEX_HOME: codexHome,
265
+ ...(analysis ? { PATH: `${analysis.bin}:/usr/local/bin:/usr/bin:/bin` } : {}),
266
+ }), "codex", false, [], false, {
267
+ journalDirectory: units,
268
+ protectedPaths: [options.ownerCodexHome],
269
+ maskedDirectories: [options.stateRoot],
270
+ ...(analysis ? { readOnlyPaths: analysis.paths } : {}),
271
+ onCessation: cessation,
272
+ });
273
+ const enqueue = (event) => {
274
+ const size = Buffer.byteLength(JSON.stringify(event));
275
+ if (instance.eventBytes + size > 32 * 1024 * 1024 || instance.events.length >= 512)
276
+ throw new Error("Development native event queue exceeded");
277
+ instance.events.push(event);
278
+ instance.eventBytes += size;
279
+ };
280
+ const invocation = instance.invocation;
281
+ instance.native = new CodexAppServer({
282
+ binaryPath: invocation.executablePath,
283
+ expectedVersion: WORKER_CODEX_VERSION,
284
+ cwd: instance.workspace,
285
+ env: invocation.env,
286
+ launch: { command: invocation.command, args: invocation.args },
287
+ redactValues: [...instance.secrets],
288
+ onNotification: (method, params) => {
289
+ if (!method.startsWith("account/"))
290
+ enqueue({ method, params });
291
+ },
292
+ onRequest: async (method, params) => {
293
+ if (method === "account/chatgptAuthTokens/refresh")
294
+ return auth.refresh(params?.previousAccountId ?? null);
295
+ const id = randomUUID();
296
+ const answer = Promise.withResolvers();
297
+ instance.answers.set(id, answer);
298
+ enqueue({ id, method, params });
299
+ return answer.promise;
300
+ },
301
+ });
302
+ if (closing || instance.revoked || instance.authorityUntil <= Date.now()) {
303
+ await invocation.cleanup();
304
+ throw new Error("Development runner stopping");
305
+ }
306
+ await instance.native.initialize();
307
+ await instance.native.request("account/login/start", { type: "chatgptAuthTokens", ...auth.initial });
308
+ if (!invocation.unit)
309
+ throw new Error("Development requires durable process isolation");
310
+ return { isolationId: invocation.unit };
311
+ }
312
+ if (operation === "events") {
313
+ const events = [];
314
+ let bytes = 0;
315
+ while (instance.events.length && events.length < 64) {
316
+ const size = Buffer.byteLength(JSON.stringify(instance.events[0]));
317
+ if (size > 16 * 1024 * 1024)
318
+ throw new Error("Development event frame exceeds limit");
319
+ if (events.length && bytes + size > 16 * 1024 * 1024)
320
+ break;
321
+ events.push(instance.events.shift());
322
+ bytes += size;
323
+ }
324
+ instance.eventBytes -= bytes;
325
+ return events;
326
+ }
327
+ if (operation === "rpc" || operation === "notify") {
328
+ const method = developmentString(input.method);
329
+ if ((!/^(?:thread|turn|fs|process)\//.test(method) &&
330
+ !["command/exec", "command/exec/write", "command/exec/terminate"].includes(method)) ||
331
+ !instance.native ||
332
+ instance.stopped)
333
+ throw new Error("Development native method forbidden");
334
+ if (operation === "notify") {
335
+ await instance.native.notify(method, input.params);
336
+ return null;
337
+ }
338
+ try {
339
+ let params = analysis ? planningAnalysisThreadParams(method, input.params, analysis.bin) : input.params;
340
+ if (analysis && method === "command/exec") {
341
+ const command = developmentObject(params);
342
+ if (Array.isArray(command.command) && command.command[0] === "/opt/ontra/venv/bin/python")
343
+ params = { ...command, command: [analysis.python, ...command.command.slice(1)] };
344
+ }
345
+ return {
346
+ result: await instance.native.request(method, params, { timeoutMs: developmentRpcTimeout(method, params) }),
347
+ };
348
+ }
349
+ catch (error) {
350
+ if (error instanceof CodexRpcError)
351
+ return { error: { code: error.code, message: error.message.slice(0, 1000) } };
352
+ throw error;
353
+ }
354
+ }
355
+ if (operation === "reply") {
356
+ const id = developmentString(input.id);
357
+ const answer = instance.answers.get(id);
358
+ if (!answer)
359
+ throw new Error("Development native reply fenced");
360
+ instance.answers.delete(id);
361
+ if (input.error)
362
+ answer.reject(new Error("Hosted development request refused"));
363
+ else
364
+ answer.resolve(input.result);
365
+ return null;
366
+ }
367
+ if (operation === "quiesce") {
368
+ await stop(instance);
369
+ return { isolationId: instance.invocation?.unit ?? null, identity: instance.identity };
370
+ }
371
+ if (operation === "archive-read") {
372
+ if (!instance.stopped)
373
+ throw new Error("Development process cessation required");
374
+ if (!instance.archive) {
375
+ instance.archive = (await checkpointArchive(instance.workspace, [...instance.secrets])).archive;
376
+ instance.archiveHash = hash(instance.archive);
377
+ instance.archiveBytes = Buffer.byteLength(instance.archive);
378
+ }
379
+ if ((instance.archiveBytes ?? 0) > DEVELOPMENT_MAX_ARCHIVE ||
380
+ !Number.isSafeInteger(input.offset) ||
381
+ Number(input.offset) < 0 ||
382
+ Number(input.offset) > instance.archive.length)
383
+ throw new Error("Invalid development archive offset");
384
+ const offset = Number(input.offset);
385
+ const chunk = instance.archive.slice(offset, offset + DEVELOPMENT_ARCHIVE_CHUNK);
386
+ return { chunk, next: offset + chunk.length, total: instance.archive.length, sha256: instance.archiveHash };
387
+ }
388
+ if (operation === "release" || operation === "close")
389
+ return release(instance);
390
+ throw new Error("Unsupported development operation");
391
+ };
392
+ const watchdog = setInterval(() => {
393
+ for (const instance of instances.values())
394
+ if (!instance.stopped && !instance.revoked && instance.authorityUntil <= Date.now()) {
395
+ instance.revoked = true;
396
+ void instance.native?.close().catch(() => { });
397
+ void (async () => {
398
+ await lifecycle.get(instance.identity.instanceId)?.catch(() => { });
399
+ await stop(instance);
400
+ })().catch(() => { });
401
+ }
402
+ }, 500);
403
+ watchdog.unref();
404
+ let closed;
405
+ return {
406
+ dispatch(operation, value, authorityDeadline) {
407
+ if (["http", "rpc", "notify", "reply", "events", "recover", "heartbeat"].includes(operation))
408
+ return execute(operation, value, authorityDeadline);
409
+ const key = developmentInstance(developmentObject(value).instance).instanceId;
410
+ const prior = lifecycle.get(key) ?? Promise.resolve();
411
+ const task = prior.catch(() => { }).then(() => execute(operation, value, authorityDeadline));
412
+ lifecycle.set(key, task);
413
+ void task.then(() => {
414
+ if (lifecycle.get(key) === task)
415
+ lifecycle.delete(key);
416
+ }, () => {
417
+ if (lifecycle.get(key) === task)
418
+ lifecycle.delete(key);
419
+ });
420
+ return task;
421
+ },
422
+ close() {
423
+ return (closed ??= (async () => {
424
+ closing = true;
425
+ clearInterval(watchdog);
426
+ await Promise.allSettled([...instances.values()].map((instance) => instance.native?.close()));
427
+ await Promise.allSettled(lifecycle.values());
428
+ const results = await Promise.allSettled([...instances.values()].map(release));
429
+ await saving;
430
+ const errors = results.filter((r) => r.status === "rejected");
431
+ if (errors.length)
432
+ throw new AggregateError(errors.map((e) => e.reason), "Development process cessation is unconfirmed");
433
+ })());
434
+ },
435
+ };
436
+ }
437
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/planning-dev/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function acquireProcessLock(path: string): Promise<{
2
+ signal: AbortSignal;
3
+ release(): Promise<void>;
4
+ }>;
@@ -0,0 +1,44 @@
1
+ import { spawn } from "node:child_process";
2
+ export async function acquireProcessLock(path) {
3
+ const abort = new AbortController();
4
+ const child = spawn("flock", [
5
+ "--nonblock",
6
+ path,
7
+ process.execPath,
8
+ "-e",
9
+ "process.stdout.write('ready\\n');process.stdin.resume();process.stdin.once('end',()=>process.exit(0))",
10
+ ], {
11
+ detached: process.platform !== "win32",
12
+ env: { PATH: "/usr/local/bin:/usr/bin:/bin" },
13
+ stdio: ["pipe", "pipe", "ignore"],
14
+ });
15
+ let releasing = false;
16
+ const exited = new Promise((done) => child.once("exit", () => {
17
+ if (!releasing)
18
+ abort.abort(new Error("Exclusive local process lock was lost"));
19
+ done();
20
+ }));
21
+ try {
22
+ await new Promise((done, reject) => {
23
+ child.once("error", reject);
24
+ child.once("exit", () => reject(new Error("Another process owns the private runtime directory")));
25
+ child.stdout.once("data", () => done());
26
+ });
27
+ }
28
+ catch (error) {
29
+ child.stdin.end();
30
+ throw error;
31
+ }
32
+ let released;
33
+ return {
34
+ signal: abort.signal,
35
+ release() {
36
+ return (released ??= (async () => {
37
+ releasing = true;
38
+ child.stdin.end();
39
+ await exited;
40
+ })());
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=process-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-lock.js","sourceRoot":"","sources":["../../src/process-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,EACP;QACE,YAAY;QACZ,IAAI;QACJ,OAAO,CAAC,QAAQ;QAChB,IAAI;QACJ,uGAAuG;KACxG,EACD;QACE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACtC,GAAG,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE;QAC7C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAClC,CACF,CAAC;IACF,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE,CACxC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAChF,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CACH,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACvC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC,CAAC;YAClG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,QAAmC,CAAC;IACxC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;YACL,OAAO,CAAC,QAAQ,KAAK,CAAC,KAAK,IAAI,EAAE;gBAC/B,SAAS,GAAG,IAAI,CAAC;gBACjB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC;YACf,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ interface RateLimitWindow {
2
+ usedPercent: number;
3
+ resetsAt?: number;
4
+ windowDurationMins?: number;
5
+ }
6
+ export interface CodexProviderStatus {
7
+ planType?: string;
8
+ primary?: RateLimitWindow;
9
+ secondary?: RateLimitWindow;
10
+ credits?: {
11
+ hasCredits: boolean;
12
+ unlimited: boolean;
13
+ balance?: string;
14
+ };
15
+ checkedAt: number;
16
+ }
17
+ export interface ProviderStatuses {
18
+ codex?: CodexProviderStatus;
19
+ }
20
+ export declare function readCodexProviderStatus(timeoutMs?: number): Promise<CodexProviderStatus | undefined>;
21
+ export {};
@@ -0,0 +1,73 @@
1
+ import { CodexAppServer } from "./app-server/index.js";
2
+ import { CODEX_FILE_AUTH_CONFIG, codexFileAuthAvailable } from "./readiness.js";
3
+ function rateLimitWindow(value) {
4
+ if (!value || typeof value !== "object")
5
+ return undefined;
6
+ const row = value;
7
+ if (typeof row.usedPercent !== "number" || !Number.isFinite(row.usedPercent))
8
+ return undefined;
9
+ return {
10
+ usedPercent: Math.max(0, Math.min(100, Math.round(row.usedPercent))),
11
+ ...(typeof row.resetsAt === "number" && Number.isFinite(row.resetsAt) ? { resetsAt: row.resetsAt } : {}),
12
+ ...(typeof row.windowDurationMins === "number" && Number.isFinite(row.windowDurationMins)
13
+ ? { windowDurationMins: row.windowDurationMins }
14
+ : {}),
15
+ };
16
+ }
17
+ function codexStatus(value) {
18
+ if (!value || typeof value !== "object")
19
+ return undefined;
20
+ const response = value;
21
+ const snapshot = response.rateLimits;
22
+ if (!snapshot || typeof snapshot !== "object")
23
+ return undefined;
24
+ const row = snapshot;
25
+ const credits = row.credits && typeof row.credits === "object" ? row.credits : null;
26
+ const primary = rateLimitWindow(row.primary);
27
+ const secondary = rateLimitWindow(row.secondary);
28
+ return {
29
+ ...(typeof row.planType === "string" ? { planType: row.planType } : {}),
30
+ ...(primary ? { primary } : {}),
31
+ ...(secondary ? { secondary } : {}),
32
+ ...(credits && typeof credits.hasCredits === "boolean" && typeof credits.unlimited === "boolean"
33
+ ? {
34
+ credits: {
35
+ hasCredits: credits.hasCredits,
36
+ unlimited: credits.unlimited,
37
+ ...(typeof credits.balance === "string" ? { balance: credits.balance } : {}),
38
+ },
39
+ }
40
+ : {}),
41
+ checkedAt: Date.now(),
42
+ };
43
+ }
44
+ export async function readCodexProviderStatus(timeoutMs = 8_000) {
45
+ if (!codexFileAuthAvailable())
46
+ return undefined;
47
+ let client;
48
+ try {
49
+ client = new CodexAppServer({
50
+ binaryPath: "codex",
51
+ cwd: process.cwd(),
52
+ args: ["--config", CODEX_FILE_AUTH_CONFIG],
53
+ requestTimeoutMs: timeoutMs,
54
+ });
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ const timeout = setTimeout(() => void client.close().catch(() => undefined), timeoutMs);
60
+ timeout.unref();
61
+ try {
62
+ await client.initialize();
63
+ return codexStatus(await client.request("account/rateLimits/read"));
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ finally {
69
+ clearTimeout(timeout);
70
+ await client.close().catch(() => undefined);
71
+ }
72
+ }
73
+ //# sourceMappingURL=provider-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-status.js","sourceRoot":"","sources":["../../src/provider-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { WorkerCapabilities } from "./worker-types.ts";
2
+ export declare const CODEX_FILE_AUTH_CONFIG = "cli_auth_credentials_store=\"file\"";
3
+ export declare const WORKER_CLAUDE_MINIMUM_VERSION = "2.1.303";
4
+ export declare function validModelPattern(value: string): boolean;
5
+ export declare function codexFileAuthAvailable(home?: string, environment?: NodeJS.ProcessEnv): boolean;
6
+ export declare function claudeWorkerAuthAvailable(path?: string): boolean;
7
+ export declare function claudeVersionSupported(output: string | null): boolean;
8
+ export declare function harnessVersion(command: string): string | null;
9
+ export declare function installedHarnesses(): string[];
10
+ export declare function readiness(version: string, persistedModels?: Record<string, string[]>): WorkerCapabilities;
11
+ export declare function authStatus(): Array<{
12
+ harness: string;
13
+ ready: boolean;
14
+ guidance: string;
15
+ }>;