@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,319 @@
|
|
|
1
|
+
import { StdioTransport, WebSocketTransport, frameLimit, stdioRedactions, } from "./transports.js";
|
|
2
|
+
export function codexServiceTier(fastMode) {
|
|
3
|
+
return { serviceTier: fastMode ? "priority" : "default" };
|
|
4
|
+
}
|
|
5
|
+
export class CodexRpcError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
constructor(message, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "CodexRpcError";
|
|
10
|
+
this.code = code;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class CodexTransportError extends Error {
|
|
14
|
+
kind;
|
|
15
|
+
constructor(kind, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "CodexTransportError";
|
|
18
|
+
this.kind = kind;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function validateOptions(options) {
|
|
22
|
+
frameLimit(options.maxFrameBytes);
|
|
23
|
+
for (const [name, value] of Object.entries({
|
|
24
|
+
maxPendingRequests: options.maxPendingRequests ?? 1024,
|
|
25
|
+
maxQueuedBytes: options.maxQueuedBytes ?? 32 * 1024 * 1024,
|
|
26
|
+
requestTimeoutMs: options.requestTimeoutMs ?? 120000,
|
|
27
|
+
})) {
|
|
28
|
+
if (!Number.isSafeInteger(value) || value < (name === "requestTimeoutMs" ? 0 : 1))
|
|
29
|
+
throw new Error(`Invalid ${name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class CodexAppServerClient {
|
|
33
|
+
pending = new Map();
|
|
34
|
+
serverRequests = new Set();
|
|
35
|
+
threadTails = new Map();
|
|
36
|
+
secrets = new Set();
|
|
37
|
+
maxFrameBytes;
|
|
38
|
+
maxPending;
|
|
39
|
+
maxQueuedBytes;
|
|
40
|
+
timeoutMs;
|
|
41
|
+
nextId = 1;
|
|
42
|
+
queuedBytes = 0;
|
|
43
|
+
inboundBytes = 0;
|
|
44
|
+
callbacks = 0;
|
|
45
|
+
writeTail = Promise.resolve();
|
|
46
|
+
eventTail = Promise.resolve();
|
|
47
|
+
closed = false;
|
|
48
|
+
closeError = null;
|
|
49
|
+
closing;
|
|
50
|
+
transport;
|
|
51
|
+
options;
|
|
52
|
+
constructor(transport, options = {}) {
|
|
53
|
+
this.transport = transport;
|
|
54
|
+
this.options = options;
|
|
55
|
+
this.maxFrameBytes = frameLimit(options.maxFrameBytes);
|
|
56
|
+
this.maxPending = options.maxPendingRequests ?? 1024;
|
|
57
|
+
this.maxQueuedBytes = options.maxQueuedBytes ?? 32 * 1024 * 1024;
|
|
58
|
+
this.timeoutMs = options.requestTimeoutMs ?? 120000;
|
|
59
|
+
validateOptions(options);
|
|
60
|
+
this.addRedactions(options.redactValues ?? []);
|
|
61
|
+
transport.listen((frame) => this.receiveFrame(frame), (error) => this.fail("transport", error.message));
|
|
62
|
+
}
|
|
63
|
+
addRedactions(values) {
|
|
64
|
+
for (const value of values)
|
|
65
|
+
if (value)
|
|
66
|
+
this.secrets.add(value);
|
|
67
|
+
}
|
|
68
|
+
error() {
|
|
69
|
+
return this.closeError;
|
|
70
|
+
}
|
|
71
|
+
async drainNotifications() {
|
|
72
|
+
for (;;) {
|
|
73
|
+
const pending = this.eventTail;
|
|
74
|
+
await pending;
|
|
75
|
+
if (pending === this.eventTail)
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (this.closeError)
|
|
79
|
+
throw this.closeError;
|
|
80
|
+
}
|
|
81
|
+
async initialize() {
|
|
82
|
+
await this.request("initialize", {
|
|
83
|
+
clientInfo: { name: "qm", title: "Agent Queue", version: "1" },
|
|
84
|
+
capabilities: { experimentalApi: true },
|
|
85
|
+
});
|
|
86
|
+
await this.notify("initialized");
|
|
87
|
+
}
|
|
88
|
+
request(method, params, options = {}) {
|
|
89
|
+
if (this.closed)
|
|
90
|
+
return Promise.reject(this.closeError ?? new CodexTransportError("closed", "Codex app-server is closed"));
|
|
91
|
+
if (options.signal?.aborted)
|
|
92
|
+
return Promise.reject(new CodexTransportError("closed", "Codex request was aborted"));
|
|
93
|
+
if (this.pending.size >= this.maxPending)
|
|
94
|
+
return Promise.reject(new CodexTransportError("limit", "Too many pending Codex requests"));
|
|
95
|
+
const timeoutMs = options.timeoutMs ?? this.timeoutMs;
|
|
96
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 0)
|
|
97
|
+
return Promise.reject(new Error("Invalid request timeout"));
|
|
98
|
+
const id = this.nextId++;
|
|
99
|
+
const promise = new Promise((resolve, reject) => {
|
|
100
|
+
let timer;
|
|
101
|
+
const abort = () => this.fail("closed", "Codex request was aborted; its remote outcome may be unknown");
|
|
102
|
+
const cleanup = () => {
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
options.signal?.removeEventListener("abort", abort);
|
|
105
|
+
};
|
|
106
|
+
this.pending.set(id, { resolve: (value) => resolve(value), reject, cleanup });
|
|
107
|
+
if (timeoutMs) {
|
|
108
|
+
timer = setTimeout(() => this.fail("timeout", "Codex request timed out; its remote outcome may be unknown"), timeoutMs);
|
|
109
|
+
timer.unref();
|
|
110
|
+
}
|
|
111
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
112
|
+
});
|
|
113
|
+
void this.send({ id, method, ...(params === undefined ? {} : { params }) }).catch((error) => this.fail("transport", error instanceof Error ? error.message : "Codex request write failed"));
|
|
114
|
+
return promise;
|
|
115
|
+
}
|
|
116
|
+
notify(method, params) {
|
|
117
|
+
return this.send({ method, ...(params === undefined ? {} : { params }) });
|
|
118
|
+
}
|
|
119
|
+
close() {
|
|
120
|
+
if (!this.closing) {
|
|
121
|
+
this.closed = true;
|
|
122
|
+
this.rejectPending(new CodexTransportError("closed", "Codex app-server is closed"));
|
|
123
|
+
this.serverRequests.clear();
|
|
124
|
+
this.threadTails.clear();
|
|
125
|
+
this.inboundBytes = 0;
|
|
126
|
+
this.closing = this.transport.close();
|
|
127
|
+
}
|
|
128
|
+
return this.closing;
|
|
129
|
+
}
|
|
130
|
+
receiveFrame(frame) {
|
|
131
|
+
if (this.closed || !frame.trim())
|
|
132
|
+
return;
|
|
133
|
+
const bytes = Buffer.byteLength(frame);
|
|
134
|
+
if (bytes > this.maxFrameBytes)
|
|
135
|
+
return this.fail("limit", "Codex app-server frame exceeds the byte limit");
|
|
136
|
+
let message;
|
|
137
|
+
try {
|
|
138
|
+
const parsed = JSON.parse(frame);
|
|
139
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
140
|
+
throw new Error();
|
|
141
|
+
message = parsed;
|
|
142
|
+
if (message.id !== undefined &&
|
|
143
|
+
!(typeof message.id === "string" || (typeof message.id === "number" && Number.isSafeInteger(message.id))))
|
|
144
|
+
throw new Error();
|
|
145
|
+
if (message.method !== undefined) {
|
|
146
|
+
if (typeof message.method !== "string" ||
|
|
147
|
+
!message.method ||
|
|
148
|
+
Object.hasOwn(message, "result") ||
|
|
149
|
+
Object.hasOwn(message, "error"))
|
|
150
|
+
throw new Error();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (message.id === undefined || Object.hasOwn(message, "result") === Object.hasOwn(message, "error"))
|
|
154
|
+
throw new Error();
|
|
155
|
+
if (Object.hasOwn(message, "error") &&
|
|
156
|
+
(!message.error ||
|
|
157
|
+
typeof message.error !== "object" ||
|
|
158
|
+
!Number.isInteger(message.error.code) ||
|
|
159
|
+
typeof message.error.message !== "string"))
|
|
160
|
+
throw new Error();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return this.fail("protocol", "Codex app-server emitted invalid JSON-RPC");
|
|
165
|
+
}
|
|
166
|
+
if (message.method === undefined) {
|
|
167
|
+
const waiter = this.pending.get(message.id);
|
|
168
|
+
if (!waiter)
|
|
169
|
+
return;
|
|
170
|
+
this.pending.delete(message.id);
|
|
171
|
+
waiter.cleanup();
|
|
172
|
+
if (message.error)
|
|
173
|
+
waiter.reject(new CodexRpcError(this.redact(`Codex ${message.error.code}: ${message.error.message}`), message.error.code));
|
|
174
|
+
else
|
|
175
|
+
waiter.resolve(message.result);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (message.id !== undefined) {
|
|
179
|
+
if (this.serverRequests.has(message.id))
|
|
180
|
+
return this.fail("protocol", "Codex reused an outstanding server request ID");
|
|
181
|
+
if (this.serverRequests.size >= this.maxPending)
|
|
182
|
+
return this.fail("limit", "Too many pending Codex server requests");
|
|
183
|
+
this.serverRequests.add(message.id);
|
|
184
|
+
}
|
|
185
|
+
if (this.inboundBytes + bytes > this.maxQueuedBytes)
|
|
186
|
+
return this.fail("limit", "Codex inbound callback queue exceeds its byte limit");
|
|
187
|
+
this.inboundBytes += bytes;
|
|
188
|
+
let released = false;
|
|
189
|
+
const release = () => {
|
|
190
|
+
if (released)
|
|
191
|
+
return;
|
|
192
|
+
released = true;
|
|
193
|
+
this.inboundBytes = Math.max(0, this.inboundBytes - bytes);
|
|
194
|
+
};
|
|
195
|
+
if (++this.callbacks > this.maxPending)
|
|
196
|
+
return this.fail("limit", "Codex notification queue exceeded its limit");
|
|
197
|
+
this.eventTail = this.eventTail
|
|
198
|
+
.then(async () => {
|
|
199
|
+
if (this.closed)
|
|
200
|
+
return;
|
|
201
|
+
if (message.id === undefined)
|
|
202
|
+
await this.options.onNotification?.(message.method, message.params);
|
|
203
|
+
else
|
|
204
|
+
this.queueRequest(message, release);
|
|
205
|
+
})
|
|
206
|
+
.catch((error) => this.fail("protocol", error instanceof Error ? error.message : "Codex callback failed"))
|
|
207
|
+
.finally(() => {
|
|
208
|
+
this.callbacks--;
|
|
209
|
+
if (message.id === undefined || this.closed)
|
|
210
|
+
release();
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
queueRequest(message, release) {
|
|
214
|
+
const threadId = message.params?.threadId;
|
|
215
|
+
const key = typeof threadId === "string" ? threadId : "";
|
|
216
|
+
const prior = this.threadTails.get(key) ?? Promise.resolve();
|
|
217
|
+
const run = prior
|
|
218
|
+
.then(async () => {
|
|
219
|
+
if (this.closed)
|
|
220
|
+
return;
|
|
221
|
+
if (!this.options.onRequest) {
|
|
222
|
+
await this.send({ id: message.id, error: { code: -32601, message: "Unsupported Codex server request" } });
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
const result = await this.options.onRequest(message.method, message.params);
|
|
227
|
+
await this.send({ id: message.id, result: result ?? null });
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
if (!this.closed)
|
|
231
|
+
await this.send({
|
|
232
|
+
id: message.id,
|
|
233
|
+
error: {
|
|
234
|
+
code: -32000,
|
|
235
|
+
message: this.redact(error instanceof Error ? error.message : "Codex request handler failed"),
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
.catch((error) => this.fail("transport", error instanceof Error ? error.message : "Codex answer write failed"))
|
|
241
|
+
.finally(() => {
|
|
242
|
+
release();
|
|
243
|
+
this.serverRequests.delete(message.id);
|
|
244
|
+
if (this.threadTails.get(key) === run)
|
|
245
|
+
this.threadTails.delete(key);
|
|
246
|
+
});
|
|
247
|
+
this.threadTails.set(key, run);
|
|
248
|
+
}
|
|
249
|
+
send(message) {
|
|
250
|
+
if (this.closed)
|
|
251
|
+
return Promise.reject(this.closeError ?? new CodexTransportError("closed", "Codex app-server is closed"));
|
|
252
|
+
let frame;
|
|
253
|
+
try {
|
|
254
|
+
frame = JSON.stringify(message);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return Promise.reject(new CodexTransportError("protocol", "Codex request is not JSON serializable"));
|
|
258
|
+
}
|
|
259
|
+
const bytes = Buffer.byteLength(frame);
|
|
260
|
+
if (bytes > this.maxFrameBytes || this.queuedBytes + bytes > this.maxQueuedBytes)
|
|
261
|
+
return Promise.reject(new CodexTransportError("limit", "Codex outgoing frame or write queue exceeds its byte limit"));
|
|
262
|
+
this.queuedBytes += bytes;
|
|
263
|
+
const operation = this.writeTail
|
|
264
|
+
.then(async () => {
|
|
265
|
+
if (this.closed)
|
|
266
|
+
throw this.closeError ?? new CodexTransportError("closed", "Codex app-server is closed");
|
|
267
|
+
await this.transport.write(frame);
|
|
268
|
+
})
|
|
269
|
+
.finally(() => {
|
|
270
|
+
this.queuedBytes -= bytes;
|
|
271
|
+
});
|
|
272
|
+
this.writeTail = operation.catch(() => { });
|
|
273
|
+
return operation;
|
|
274
|
+
}
|
|
275
|
+
redact(text) {
|
|
276
|
+
for (const secret of this.secrets)
|
|
277
|
+
text = text.replaceAll(secret, "[redacted]");
|
|
278
|
+
return text;
|
|
279
|
+
}
|
|
280
|
+
rejectPending(error) {
|
|
281
|
+
for (const waiter of this.pending.values()) {
|
|
282
|
+
waiter.cleanup();
|
|
283
|
+
waiter.reject(error);
|
|
284
|
+
}
|
|
285
|
+
this.pending.clear();
|
|
286
|
+
}
|
|
287
|
+
fail(kind, message) {
|
|
288
|
+
if (this.closed)
|
|
289
|
+
return;
|
|
290
|
+
this.closeError = new CodexTransportError(kind, this.redact(message));
|
|
291
|
+
this.rejectPending(this.closeError);
|
|
292
|
+
void this.close().catch(() => { });
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
export class CodexAppServer extends CodexAppServerClient {
|
|
296
|
+
process;
|
|
297
|
+
constructor(options) {
|
|
298
|
+
validateOptions(options);
|
|
299
|
+
const transport = new StdioTransport(options);
|
|
300
|
+
super(transport, options);
|
|
301
|
+
this.process = transport.process;
|
|
302
|
+
this.addRedactions(stdioRedactions(options));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export async function connectCodexAppServer(options) {
|
|
306
|
+
validateOptions(options);
|
|
307
|
+
const transport = new WebSocketTransport(options);
|
|
308
|
+
const client = new CodexAppServerClient(transport, options);
|
|
309
|
+
client.addRedactions(Object.values(options.headers ?? {}).flatMap((value) => [value, value.replace(/^Bearer\s+/i, "")]));
|
|
310
|
+
try {
|
|
311
|
+
await transport.ready;
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
await client.close();
|
|
315
|
+
throw new CodexTransportError("transport", "Codex App Server WebSocket connection failed");
|
|
316
|
+
}
|
|
317
|
+
return client;
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app-server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CodexAppServerClient } from "./index.ts";
|
|
2
|
+
export interface NativeThreadLink {
|
|
3
|
+
threadId: string;
|
|
4
|
+
parentThreadId: string | null;
|
|
5
|
+
}
|
|
6
|
+
type NativeClient = Pick<CodexAppServerClient, "request">;
|
|
7
|
+
export declare class NativeCheckpointPending extends Error {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
export declare function quiesceNativeCheckpoint(client: NativeClient, rootThreadId: string): Promise<NativeThreadLink[]>;
|
|
11
|
+
export declare function verifyNativeCheckpoint(client: NativeClient, rootThreadId: string, expected: readonly NativeThreadLink[]): Promise<void>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
const sourceKinds = [
|
|
2
|
+
"cli",
|
|
3
|
+
"vscode",
|
|
4
|
+
"exec",
|
|
5
|
+
"appServer",
|
|
6
|
+
"subAgent",
|
|
7
|
+
"subAgentReview",
|
|
8
|
+
"subAgentCompact",
|
|
9
|
+
"subAgentThreadSpawn",
|
|
10
|
+
"subAgentOther",
|
|
11
|
+
"unknown",
|
|
12
|
+
];
|
|
13
|
+
async function nativeThreads(client, archived) {
|
|
14
|
+
const threads = [];
|
|
15
|
+
const cursors = new Set();
|
|
16
|
+
let cursor = null;
|
|
17
|
+
do {
|
|
18
|
+
const page = await client.request("thread/list", {
|
|
19
|
+
archived,
|
|
20
|
+
modelProviders: [],
|
|
21
|
+
sourceKinds,
|
|
22
|
+
limit: 100,
|
|
23
|
+
cursor,
|
|
24
|
+
});
|
|
25
|
+
if (!Array.isArray(page.data) || threads.length + page.data.length > 4096)
|
|
26
|
+
throw new Error("native thread inventory exceeds qualified boundary");
|
|
27
|
+
threads.push(...page.data);
|
|
28
|
+
cursor = page.nextCursor ?? null;
|
|
29
|
+
if (cursor !== null && (typeof cursor !== "string" || cursors.has(cursor)))
|
|
30
|
+
throw new Error("native thread cursor repeated");
|
|
31
|
+
if (cursor !== null)
|
|
32
|
+
cursors.add(cursor);
|
|
33
|
+
} while (cursor !== null);
|
|
34
|
+
return threads;
|
|
35
|
+
}
|
|
36
|
+
function nativeGraph(threads, rootId) {
|
|
37
|
+
const ids = new Set(threads.map((thread) => thread.id));
|
|
38
|
+
if (ids.size !== threads.length || !ids.has(rootId))
|
|
39
|
+
throw new Error("native thread inventory is incomplete");
|
|
40
|
+
const links = threads.map((thread) => ({
|
|
41
|
+
threadId: thread.id,
|
|
42
|
+
parentThreadId: thread.parentThreadId ?? thread.forkedFromId ?? null,
|
|
43
|
+
}));
|
|
44
|
+
if (links.filter((link) => link.parentThreadId === null).length !== 1 ||
|
|
45
|
+
!links.some((link) => link.threadId === rootId && link.parentThreadId === null))
|
|
46
|
+
throw new Error("native conversation has foreign roots");
|
|
47
|
+
const reached = new Set([rootId]);
|
|
48
|
+
for (let index = 0; index < links.length; index++) {
|
|
49
|
+
const before = reached.size;
|
|
50
|
+
for (const link of links)
|
|
51
|
+
if (link.parentThreadId !== null && reached.has(link.parentThreadId))
|
|
52
|
+
reached.add(link.threadId);
|
|
53
|
+
if (before === reached.size)
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
if (reached.size !== links.length)
|
|
57
|
+
throw new Error("native conversation graph is disconnected");
|
|
58
|
+
return links.sort((a, b) => a.threadId.localeCompare(b.threadId));
|
|
59
|
+
}
|
|
60
|
+
async function loadedNativeIds(client) {
|
|
61
|
+
const result = [], cursors = new Set();
|
|
62
|
+
let cursor = null;
|
|
63
|
+
do {
|
|
64
|
+
const page = await client.request("thread/loaded/list", {
|
|
65
|
+
cursor,
|
|
66
|
+
limit: 100,
|
|
67
|
+
});
|
|
68
|
+
if (!Array.isArray(page.data) ||
|
|
69
|
+
page.data.some((id) => typeof id !== "string" || result.includes(id)) ||
|
|
70
|
+
result.length + page.data.length > 4096)
|
|
71
|
+
throw new Error("invalid loaded native inventory");
|
|
72
|
+
result.push(...page.data);
|
|
73
|
+
cursor = page.nextCursor ?? null;
|
|
74
|
+
if (cursor !== null && (typeof cursor !== "string" || cursors.has(cursor)))
|
|
75
|
+
throw new Error("native loaded cursor repeated");
|
|
76
|
+
if (cursor !== null)
|
|
77
|
+
cursors.add(cursor);
|
|
78
|
+
} while (cursor !== null);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
async function nativeInventory(client) {
|
|
82
|
+
const active = await nativeThreads(client, false), archived = await nativeThreads(client, true);
|
|
83
|
+
const threads = [...active, ...archived];
|
|
84
|
+
for (const id of await loadedNativeIds(client))
|
|
85
|
+
if (!threads.some((thread) => thread.id === id)) {
|
|
86
|
+
const { thread } = await client.request("thread/read", {
|
|
87
|
+
threadId: id,
|
|
88
|
+
includeTurns: false,
|
|
89
|
+
});
|
|
90
|
+
if (!thread || thread.id !== id)
|
|
91
|
+
throw new Error("unexpected native threads remain loaded");
|
|
92
|
+
active.push(thread);
|
|
93
|
+
threads.push(thread);
|
|
94
|
+
}
|
|
95
|
+
for (const item of threads) {
|
|
96
|
+
const { thread } = await client.request("thread/read", {
|
|
97
|
+
threadId: item.id,
|
|
98
|
+
includeTurns: false,
|
|
99
|
+
});
|
|
100
|
+
if (!thread || thread.id !== item.id)
|
|
101
|
+
throw new Error("native thread identity changed");
|
|
102
|
+
const listedParent = item.parentThreadId ?? item.forkedFromId ?? null;
|
|
103
|
+
const readParent = thread.parentThreadId ?? thread.forkedFromId ?? null;
|
|
104
|
+
if (listedParent !== null && readParent !== null && listedParent !== readParent)
|
|
105
|
+
throw new Error("native thread identity changed");
|
|
106
|
+
Object.assign(item, thread, { parentThreadId: readParent ?? listedParent, forkedFromId: null });
|
|
107
|
+
}
|
|
108
|
+
return { active, archived, threads };
|
|
109
|
+
}
|
|
110
|
+
export class NativeCheckpointPending extends Error {
|
|
111
|
+
constructor() {
|
|
112
|
+
super("native conversation tree is not quiescent");
|
|
113
|
+
this.name = "NativeCheckpointPending";
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export async function quiesceNativeCheckpoint(client, rootThreadId) {
|
|
117
|
+
const { active, threads: inventory } = await nativeInventory(client);
|
|
118
|
+
for (const thread of inventory)
|
|
119
|
+
if (thread.ephemeral)
|
|
120
|
+
throw new Error("ephemeral native state cannot be checkpointed");
|
|
121
|
+
else if (!["idle", "notLoaded"].includes(thread.status.type))
|
|
122
|
+
throw new NativeCheckpointPending();
|
|
123
|
+
const graph = nativeGraph(inventory, rootThreadId);
|
|
124
|
+
const parents = new Map(graph.map((link) => [link.threadId, link.parentThreadId]));
|
|
125
|
+
const depth = (id) => {
|
|
126
|
+
let count = 0, parent = parents.get(id);
|
|
127
|
+
while (parent) {
|
|
128
|
+
count++;
|
|
129
|
+
parent = parents.get(parent);
|
|
130
|
+
}
|
|
131
|
+
return count;
|
|
132
|
+
};
|
|
133
|
+
const leavesFirst = [...graph].sort((a, b) => depth(b.threadId) - depth(a.threadId));
|
|
134
|
+
for (const link of leavesFirst)
|
|
135
|
+
if (active.some((thread) => thread.id === link.threadId))
|
|
136
|
+
await client.request("thread/archive", { threadId: link.threadId });
|
|
137
|
+
const { active: remaining, threads: retained } = await nativeInventory(client);
|
|
138
|
+
if (remaining.length || JSON.stringify(nativeGraph(retained, rootThreadId)) !== JSON.stringify(graph))
|
|
139
|
+
throw new Error("native archive boundary changed");
|
|
140
|
+
let cursor = null;
|
|
141
|
+
const cursors = new Set();
|
|
142
|
+
do {
|
|
143
|
+
const loaded = await client.request("thread/loaded/list", {
|
|
144
|
+
cursor,
|
|
145
|
+
limit: 100,
|
|
146
|
+
});
|
|
147
|
+
if (!Array.isArray(loaded.data) || loaded.data.some((id) => !parents.has(id)))
|
|
148
|
+
throw new Error("unexpected native threads remain loaded");
|
|
149
|
+
for (const id of loaded.data) {
|
|
150
|
+
const { thread } = await client.request("thread/read", {
|
|
151
|
+
threadId: id,
|
|
152
|
+
includeTurns: false,
|
|
153
|
+
});
|
|
154
|
+
if (thread.id !== id || !["idle", "notLoaded"].includes(thread.status.type))
|
|
155
|
+
throw new Error("native thread resumed during quiescence");
|
|
156
|
+
}
|
|
157
|
+
cursor = loaded.nextCursor ?? null;
|
|
158
|
+
if (cursor !== null && (typeof cursor !== "string" || cursors.has(cursor)))
|
|
159
|
+
throw new Error("native loaded cursor repeated");
|
|
160
|
+
if (cursor !== null)
|
|
161
|
+
cursors.add(cursor);
|
|
162
|
+
} while (cursor !== null);
|
|
163
|
+
return graph;
|
|
164
|
+
}
|
|
165
|
+
export async function verifyNativeCheckpoint(client, rootThreadId, expected) {
|
|
166
|
+
const { threads } = await nativeInventory(client);
|
|
167
|
+
const graph = nativeGraph(threads, rootThreadId);
|
|
168
|
+
if (JSON.stringify(graph) !== JSON.stringify([...expected].sort((a, b) => a.threadId.localeCompare(b.threadId))))
|
|
169
|
+
throw new Error("restored native tree differs from committed checkpoint");
|
|
170
|
+
for (const link of graph) {
|
|
171
|
+
const { thread } = await client.request("thread/read", {
|
|
172
|
+
threadId: link.threadId,
|
|
173
|
+
includeTurns: false,
|
|
174
|
+
});
|
|
175
|
+
if (thread.id !== link.threadId || thread.ephemeral || !["idle", "notLoaded"].includes(thread.status.type))
|
|
176
|
+
throw new Error("restored native identity unavailable");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=native-checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-checkpoint.js","sourceRoot":"","sources":["../../../src/app-server/native-checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ChildProcess, type SpawnOptions } from "node:child_process";
|
|
2
|
+
export declare function spawnProcessGroup(command: string, args: string[], options: SpawnOptions, termination?: {
|
|
3
|
+
graceMs?: number;
|
|
4
|
+
killMs?: number;
|
|
5
|
+
}): ChildProcess;
|
|
6
|
+
export declare function closeProcessGroup(child: ChildProcess, graceMs?: number, killMs?: number): Promise<void>;
|