@dhrxv29/autocodex 0.1.0
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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/app.d.ts +47 -0
- package/dist/app.js +174 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +308 -0
- package/dist/cli.js.map +1 -0
- package/dist/clock.d.ts +14 -0
- package/dist/clock.js +21 -0
- package/dist/clock.js.map +1 -0
- package/dist/defaults.d.ts +10 -0
- package/dist/defaults.js +11 -0
- package/dist/defaults.js.map +1 -0
- package/dist/facing.d.ts +31 -0
- package/dist/facing.js +115 -0
- package/dist/facing.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/launchd.d.ts +57 -0
- package/dist/launchd.js +333 -0
- package/dist/launchd.js.map +1 -0
- package/dist/machine.d.ts +21 -0
- package/dist/machine.js +277 -0
- package/dist/machine.js.map +1 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +58 -0
- package/dist/paths.js.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/app-server.d.ts +102 -0
- package/dist/providers/app-server.js +474 -0
- package/dist/providers/app-server.js.map +1 -0
- package/dist/providers/codex.d.ts +44 -0
- package/dist/providers/codex.js +260 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/scheduler.d.ts +25 -0
- package/dist/scheduler.js +59 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/schema.d.ts +5 -0
- package/dist/schema.js +41 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +15 -0
- package/dist/store.js +146 -0
- package/dist/store.js.map +1 -0
- package/dist/tracker.d.ts +33 -0
- package/dist/tracker.js +98 -0
- package/dist/tracker.js.map +1 -0
- package/dist/tui.d.ts +25 -0
- package/dist/tui.js +89 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/dist/view.d.ts +68 -0
- package/dist/view.js +139 -0
- package/dist/view.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { AutocodexError } from "../types.js";
|
|
4
|
+
/** Methods autocodex must never send. */
|
|
5
|
+
export const FORBIDDEN_APP_SERVER_METHODS = [
|
|
6
|
+
"thread/fork",
|
|
7
|
+
"thread/start",
|
|
8
|
+
"account/rateLimitResetCredit/consume",
|
|
9
|
+
"account/login/start",
|
|
10
|
+
"account/logout",
|
|
11
|
+
];
|
|
12
|
+
const FORBIDDEN = new Set(FORBIDDEN_APP_SERVER_METHODS);
|
|
13
|
+
/**
|
|
14
|
+
* In-thread approval RPCs Codex may send during `turn/start`.
|
|
15
|
+
* Autocodex is unattended: it answers `accept` so the continuation can finish.
|
|
16
|
+
* It does **not** send `approvalPolicy` / `sandboxPolicy` on resume or turn/start —
|
|
17
|
+
* those stay the thread's Codex-owned settings (omit = reuse). Not a policy engine.
|
|
18
|
+
*/
|
|
19
|
+
export const APPROVAL_METHODS = new Set([
|
|
20
|
+
"item/commandExecution/requestApproval",
|
|
21
|
+
"item/fileChange/requestApproval",
|
|
22
|
+
"item/permissions/requestApproval",
|
|
23
|
+
]);
|
|
24
|
+
/** Official decision payload for the three requestApproval methods above. */
|
|
25
|
+
export const UNATTENDED_APPROVAL_DECISION = "accept";
|
|
26
|
+
export function resolveCodexCommand() {
|
|
27
|
+
const fromEnv = process.env.AUTOCODEX_CODEX_BIN?.trim() || process.env.CODEX_BIN?.trim();
|
|
28
|
+
return fromEnv || "codex";
|
|
29
|
+
}
|
|
30
|
+
export function defaultAppServerSpawn() {
|
|
31
|
+
return { command: resolveCodexCommand(), args: ["app-server"] };
|
|
32
|
+
}
|
|
33
|
+
function isRecord(value) {
|
|
34
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
35
|
+
}
|
|
36
|
+
function firstString(...values) {
|
|
37
|
+
for (const value of values) {
|
|
38
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
39
|
+
return value.trim();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
export class AppServerError extends AutocodexError {
|
|
45
|
+
code;
|
|
46
|
+
constructor(code, message) {
|
|
47
|
+
super(code === -32600
|
|
48
|
+
? `${message} (JSON-RPC -32600). The stored thread.id is unchanged; retry later. Autocodex will not fork or use resume --last.`
|
|
49
|
+
: `Codex app-server error ${code}: ${message}`);
|
|
50
|
+
this.name = "AppServerError";
|
|
51
|
+
this.code = code;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export class ForbiddenAppServerMethodError extends AutocodexError {
|
|
55
|
+
constructor(method) {
|
|
56
|
+
super(`Refusing to call ${method}. Autocodex never forks, starts a new thread, logs in, or consumes rate-limit reset credits.`);
|
|
57
|
+
this.name = "ForbiddenAppServerMethodError";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* In-memory bidirectional JSON-RPC transport for tests.
|
|
62
|
+
* Writes are delivered on a microtask so request handlers can register waiters.
|
|
63
|
+
*/
|
|
64
|
+
export function linkMemoryTransports() {
|
|
65
|
+
const clientHandlers = [];
|
|
66
|
+
const serverHandlers = [];
|
|
67
|
+
const deliver = (handlers, message) => {
|
|
68
|
+
queueMicrotask(() => {
|
|
69
|
+
for (const handler of handlers) {
|
|
70
|
+
handler(message);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
const make = (writeTo, readFrom) => ({
|
|
75
|
+
send(message) {
|
|
76
|
+
deliver(writeTo, message);
|
|
77
|
+
},
|
|
78
|
+
onMessage(handler) {
|
|
79
|
+
readFrom.push(handler);
|
|
80
|
+
return () => {
|
|
81
|
+
const index = readFrom.indexOf(handler);
|
|
82
|
+
if (index >= 0) {
|
|
83
|
+
readFrom.splice(index, 1);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
close() { },
|
|
88
|
+
});
|
|
89
|
+
const client = make(serverHandlers, clientHandlers);
|
|
90
|
+
const server = make(clientHandlers, serverHandlers);
|
|
91
|
+
return { client, server };
|
|
92
|
+
}
|
|
93
|
+
/** Spawn `codex app-server` (stdio JSONL). Does not read $CODEX_HOME auth files. */
|
|
94
|
+
export class StdioAppServerTransport {
|
|
95
|
+
child;
|
|
96
|
+
handlers = [];
|
|
97
|
+
closeHandlers = [];
|
|
98
|
+
closed = false;
|
|
99
|
+
spawnError;
|
|
100
|
+
constructor(child, command) {
|
|
101
|
+
this.child = child;
|
|
102
|
+
const rl = createInterface({ input: child.stdout });
|
|
103
|
+
rl.on("line", (line) => {
|
|
104
|
+
const trimmed = line.trim();
|
|
105
|
+
if (!trimmed) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const parsed = JSON.parse(trimmed);
|
|
110
|
+
for (const handler of this.handlers) {
|
|
111
|
+
handler(parsed);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Ignore non-JSON stdout (never scrape banners / display text).
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
child.stderr.on("data", () => {
|
|
119
|
+
// Logs only. Autocodex does not parse TUI/UI text from stderr.
|
|
120
|
+
});
|
|
121
|
+
child.on("error", (error) => {
|
|
122
|
+
this.fail(wrapSpawnError(command, error));
|
|
123
|
+
});
|
|
124
|
+
child.on("exit", (code, signal) => {
|
|
125
|
+
if (this.closed) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.fail(new AutocodexError(`codex app-server exited (${code ?? signal ?? "unknown"})`));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
static spawn(options = defaultAppServerSpawn()) {
|
|
132
|
+
const command = options.command;
|
|
133
|
+
const args = options.args ?? ["app-server"];
|
|
134
|
+
let child;
|
|
135
|
+
try {
|
|
136
|
+
child = spawn(command, args, {
|
|
137
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
138
|
+
env: options.env ?? process.env,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
throw wrapSpawnError(command, error);
|
|
143
|
+
}
|
|
144
|
+
return new StdioAppServerTransport(child, command);
|
|
145
|
+
}
|
|
146
|
+
send(message) {
|
|
147
|
+
if (this.spawnError) {
|
|
148
|
+
throw this.spawnError;
|
|
149
|
+
}
|
|
150
|
+
if (this.closed || !this.child.stdin.writable) {
|
|
151
|
+
throw new AutocodexError("Codex app-server stdio transport is closed");
|
|
152
|
+
}
|
|
153
|
+
this.child.stdin.write(`${JSON.stringify(message)}\n`);
|
|
154
|
+
}
|
|
155
|
+
onMessage(handler) {
|
|
156
|
+
this.handlers.push(handler);
|
|
157
|
+
return () => {
|
|
158
|
+
const index = this.handlers.indexOf(handler);
|
|
159
|
+
if (index >= 0) {
|
|
160
|
+
this.handlers.splice(index, 1);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
onClose(handler) {
|
|
165
|
+
this.closeHandlers.push(handler);
|
|
166
|
+
return () => {
|
|
167
|
+
const index = this.closeHandlers.indexOf(handler);
|
|
168
|
+
if (index >= 0) {
|
|
169
|
+
this.closeHandlers.splice(index, 1);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
close() {
|
|
174
|
+
if (this.closed) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this.closed = true;
|
|
178
|
+
this.child.stdin.end();
|
|
179
|
+
this.child.kill();
|
|
180
|
+
}
|
|
181
|
+
fail(error) {
|
|
182
|
+
if (this.closed) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this.spawnError = error;
|
|
186
|
+
this.closed = true;
|
|
187
|
+
for (const handler of this.closeHandlers) {
|
|
188
|
+
handler(error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function wrapSpawnError(command, error) {
|
|
193
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
194
|
+
return new AutocodexError(`Cannot start Codex app-server (${command}): ${detail}. Install Codex and keep it on PATH, or set AUTOCODEX_CODEX_BIN.`);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Official `codex app-server` JSON-RPC client.
|
|
198
|
+
* Wire format is JSONL without a `"jsonrpc":"2.0"` envelope field.
|
|
199
|
+
*/
|
|
200
|
+
export class CodexAppServerClient {
|
|
201
|
+
transport;
|
|
202
|
+
clientInfo;
|
|
203
|
+
pending = new Map();
|
|
204
|
+
turnWaiters = new Map();
|
|
205
|
+
completedTurns = new Map();
|
|
206
|
+
loadedThreads = new Set();
|
|
207
|
+
nextId = 1;
|
|
208
|
+
initialized = false;
|
|
209
|
+
closed = false;
|
|
210
|
+
unsubscribe;
|
|
211
|
+
unsubscribeClose;
|
|
212
|
+
constructor(transport, options = {}) {
|
|
213
|
+
this.transport = transport;
|
|
214
|
+
this.clientInfo = options.clientInfo ?? {
|
|
215
|
+
name: "autocodex",
|
|
216
|
+
title: "autocodex",
|
|
217
|
+
version: "0.1.0",
|
|
218
|
+
};
|
|
219
|
+
this.unsubscribe = transport.onMessage((message) => {
|
|
220
|
+
this.dispatch(message);
|
|
221
|
+
});
|
|
222
|
+
this.unsubscribeClose = transport.onClose?.((error) => {
|
|
223
|
+
this.failOpen(error ?? new AutocodexError("Codex app-server connection closed"));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
get isInitialized() {
|
|
227
|
+
return this.initialized;
|
|
228
|
+
}
|
|
229
|
+
isThreadLoaded(threadId) {
|
|
230
|
+
return this.loadedThreads.has(threadId);
|
|
231
|
+
}
|
|
232
|
+
async handshake() {
|
|
233
|
+
if (this.initialized) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
const result = await this.request("initialize", {
|
|
237
|
+
clientInfo: this.clientInfo,
|
|
238
|
+
capabilities: {
|
|
239
|
+
experimentalApi: true,
|
|
240
|
+
optOutNotificationMethods: [
|
|
241
|
+
"item/agentMessage/delta",
|
|
242
|
+
"item/reasoning/textDelta",
|
|
243
|
+
"item/reasoning/summaryTextDelta",
|
|
244
|
+
"item/commandExecution/outputDelta",
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
this.notify("initialized", {});
|
|
249
|
+
this.initialized = true;
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
async threadResume(threadId) {
|
|
253
|
+
const id = requireThreadId(threadId);
|
|
254
|
+
const result = await this.request("thread/resume", {
|
|
255
|
+
threadId: id,
|
|
256
|
+
excludeTurns: true,
|
|
257
|
+
});
|
|
258
|
+
const thread = extractThread(result);
|
|
259
|
+
const resumedId = firstString(thread?.id);
|
|
260
|
+
if (!resumedId) {
|
|
261
|
+
throw new AutocodexError("thread/resume did not return thread.id. Refusing to use thread.sessionId (fork-root) as the resume target.");
|
|
262
|
+
}
|
|
263
|
+
if (thread?.ephemeral === true) {
|
|
264
|
+
throw new AutocodexError(`Refusing ephemeral Codex thread ${resumedId}; it is not persistable.`);
|
|
265
|
+
}
|
|
266
|
+
this.loadedThreads.add(resumedId);
|
|
267
|
+
return { threadId: resumedId, ephemeral: false };
|
|
268
|
+
}
|
|
269
|
+
async turnStart(threadId, prompt) {
|
|
270
|
+
const id = requireThreadId(threadId);
|
|
271
|
+
const completed = this.expectTurnCompletion();
|
|
272
|
+
const result = await this.request("turn/start", {
|
|
273
|
+
threadId: id,
|
|
274
|
+
input: [{ type: "text", text: prompt }],
|
|
275
|
+
});
|
|
276
|
+
const turn = extractTurn(result);
|
|
277
|
+
const turnId = firstString(turn?.id);
|
|
278
|
+
const status = firstString(turn?.status);
|
|
279
|
+
if (status === "failed") {
|
|
280
|
+
throw turnFailure(turn);
|
|
281
|
+
}
|
|
282
|
+
if (status === "completed" || status === "interrupted") {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (!turnId) {
|
|
286
|
+
throw new AutocodexError("turn/start did not return turn.id");
|
|
287
|
+
}
|
|
288
|
+
const finished = await completed(turnId);
|
|
289
|
+
const finishedStatus = firstString(finished.status);
|
|
290
|
+
if (finishedStatus === "failed") {
|
|
291
|
+
throw turnFailure(finished);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async rateLimitsRead() {
|
|
295
|
+
return this.request("account/rateLimits/read", {});
|
|
296
|
+
}
|
|
297
|
+
async request(method, params) {
|
|
298
|
+
this.assertOpen();
|
|
299
|
+
if (FORBIDDEN.has(method)) {
|
|
300
|
+
throw new ForbiddenAppServerMethodError(method);
|
|
301
|
+
}
|
|
302
|
+
if (looksLikeLastResume(method, params)) {
|
|
303
|
+
throw new AutocodexError("Refusing resume --last. Autocodex only resumes an explicit thread.id.");
|
|
304
|
+
}
|
|
305
|
+
const id = this.nextId++;
|
|
306
|
+
const payload = { method, id };
|
|
307
|
+
if (params !== undefined) {
|
|
308
|
+
payload.params = params;
|
|
309
|
+
}
|
|
310
|
+
const response = new Promise((resolve, reject) => {
|
|
311
|
+
this.pending.set(id, { resolve, reject });
|
|
312
|
+
});
|
|
313
|
+
this.transport.send(payload);
|
|
314
|
+
return response;
|
|
315
|
+
}
|
|
316
|
+
close() {
|
|
317
|
+
this.failOpen(new AutocodexError("Codex app-server connection closed"));
|
|
318
|
+
this.transport.close();
|
|
319
|
+
}
|
|
320
|
+
failOpen(error) {
|
|
321
|
+
if (this.closed) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.closed = true;
|
|
325
|
+
this.unsubscribe();
|
|
326
|
+
this.unsubscribeClose?.();
|
|
327
|
+
for (const pending of this.pending.values()) {
|
|
328
|
+
pending.reject(error);
|
|
329
|
+
}
|
|
330
|
+
this.pending.clear();
|
|
331
|
+
for (const waiter of this.turnWaiters.values()) {
|
|
332
|
+
waiter.reject(error);
|
|
333
|
+
}
|
|
334
|
+
this.turnWaiters.clear();
|
|
335
|
+
}
|
|
336
|
+
notify(method, params) {
|
|
337
|
+
this.assertOpen();
|
|
338
|
+
this.transport.send({ method, params });
|
|
339
|
+
}
|
|
340
|
+
assertOpen() {
|
|
341
|
+
if (this.closed) {
|
|
342
|
+
throw new AutocodexError("Codex app-server connection is closed");
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
expectTurnCompletion() {
|
|
346
|
+
return (turnId) => {
|
|
347
|
+
const buffered = this.completedTurns.get(turnId);
|
|
348
|
+
if (buffered) {
|
|
349
|
+
this.completedTurns.delete(turnId);
|
|
350
|
+
return Promise.resolve(buffered);
|
|
351
|
+
}
|
|
352
|
+
return new Promise((resolve, reject) => {
|
|
353
|
+
this.turnWaiters.set(turnId, { resolve, reject });
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
dispatch(message) {
|
|
358
|
+
if (!isRecord(message)) {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (typeof message.method === "string" && message.id !== undefined && !("result" in message) && !("error" in message)) {
|
|
362
|
+
this.respondToServerRequest(message);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (message.id !== undefined && this.pending.has(Number(message.id))) {
|
|
366
|
+
const pending = this.pending.get(Number(message.id));
|
|
367
|
+
this.pending.delete(Number(message.id));
|
|
368
|
+
if (!pending) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (isRecord(message.error)) {
|
|
372
|
+
const code = typeof message.error.code === "number" ? message.error.code : -32000;
|
|
373
|
+
const errorMessage = typeof message.error.message === "string" ? message.error.message : "app-server request failed";
|
|
374
|
+
pending.reject(new AppServerError(code, errorMessage));
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
pending.resolve(message.result);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (typeof message.method === "string") {
|
|
381
|
+
this.dispatchNotification(message.method, message.params);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
dispatchNotification(method, params) {
|
|
385
|
+
if (method === "turn/completed") {
|
|
386
|
+
const turn = extractTurn(params) ?? (isRecord(params) ? params : undefined);
|
|
387
|
+
const turnId = firstString(turn?.id);
|
|
388
|
+
if (!turn || !turnId) {
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const waiter = this.turnWaiters.get(turnId);
|
|
392
|
+
if (waiter) {
|
|
393
|
+
this.turnWaiters.delete(turnId);
|
|
394
|
+
waiter.resolve(turn);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
this.completedTurns.set(turnId, turn);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
if (method === "error") {
|
|
401
|
+
const turn = isRecord(params) ? extractTurn(params) : undefined;
|
|
402
|
+
const turnId = firstString(turn?.id);
|
|
403
|
+
if (turn && turnId && firstString(turn.status) === "failed") {
|
|
404
|
+
const waiter = this.turnWaiters.get(turnId);
|
|
405
|
+
if (waiter) {
|
|
406
|
+
this.turnWaiters.delete(turnId);
|
|
407
|
+
waiter.reject(turnFailure(turn));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
respondToServerRequest(message) {
|
|
413
|
+
const method = String(message.method);
|
|
414
|
+
const id = message.id;
|
|
415
|
+
if (APPROVAL_METHODS.has(method)) {
|
|
416
|
+
// Unattended continuation: accept in-thread approvals only.
|
|
417
|
+
// Sandbox/approvalPolicy are not overridden here — Codex thread settings apply.
|
|
418
|
+
// Never login / consume credits.
|
|
419
|
+
this.transport.send({ id, result: { decision: UNATTENDED_APPROVAL_DECISION } });
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
this.transport.send({
|
|
423
|
+
id,
|
|
424
|
+
error: { code: -32601, message: `autocodex does not handle ${method}` },
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function requireThreadId(threadId) {
|
|
429
|
+
const id = threadId.trim();
|
|
430
|
+
if (!id) {
|
|
431
|
+
throw new AutocodexError("thread.id is required");
|
|
432
|
+
}
|
|
433
|
+
if (id === "--last" || id === "last") {
|
|
434
|
+
throw new AutocodexError("Refusing resume --last. Autocodex only resumes an explicit thread.id.");
|
|
435
|
+
}
|
|
436
|
+
return id;
|
|
437
|
+
}
|
|
438
|
+
function looksLikeLastResume(method, params) {
|
|
439
|
+
if (method !== "thread/resume" || !isRecord(params)) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
const threadId = firstString(params.threadId, params.thread_id);
|
|
443
|
+
return threadId === "--last" || threadId === "last";
|
|
444
|
+
}
|
|
445
|
+
function extractThread(value) {
|
|
446
|
+
if (!isRecord(value)) {
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
449
|
+
if (isRecord(value.thread)) {
|
|
450
|
+
return value.thread;
|
|
451
|
+
}
|
|
452
|
+
if (typeof value.id === "string") {
|
|
453
|
+
return value;
|
|
454
|
+
}
|
|
455
|
+
return undefined;
|
|
456
|
+
}
|
|
457
|
+
function extractTurn(value) {
|
|
458
|
+
if (!isRecord(value)) {
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
if (isRecord(value.turn)) {
|
|
462
|
+
return value.turn;
|
|
463
|
+
}
|
|
464
|
+
if (typeof value.id === "string" && (value.status !== undefined || value.items !== undefined)) {
|
|
465
|
+
return value;
|
|
466
|
+
}
|
|
467
|
+
return undefined;
|
|
468
|
+
}
|
|
469
|
+
function turnFailure(turn) {
|
|
470
|
+
const error = turn && isRecord(turn.error) ? turn.error : undefined;
|
|
471
|
+
const message = firstString(error?.message) ?? "Codex turn failed";
|
|
472
|
+
return new AutocodexError(message);
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server.js","sourceRoot":"","sources":["../../src/providers/app-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CodexAppServerClient, type SpawnAppServerOptions } from "./app-server.js";
|
|
2
|
+
import type { AgentProvider, ResumeResult, UsageLimitEvent } from "../provider.js";
|
|
3
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Absolute Unix seconds only.
|
|
6
|
+
* Accepts finite numbers, numeric strings, and RFC3339 instants.
|
|
7
|
+
* Never Date.parse of display banners ("Try again at 3:51 PM").
|
|
8
|
+
*/
|
|
9
|
+
export declare function asFiniteUnix(value: unknown): number | null;
|
|
10
|
+
/**
|
|
11
|
+
* Resume target is Codex `thread.id`.
|
|
12
|
+
* Never silently use `thread.sessionId` (fork-root / live session-tree root).
|
|
13
|
+
*/
|
|
14
|
+
export declare function pickSessionId(value: unknown, hint?: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Parse official Codex app-server / protocol payloads.
|
|
17
|
+
* Does not scrape terminals and does not read $CODEX_HOME auth files.
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectCodexUsageLimit(event: unknown, hintSessionId?: string): UsageLimitEvent | null;
|
|
20
|
+
export interface CodexProviderOptions {
|
|
21
|
+
/** Injected live client (tests). Handshake runs on first use if needed. */
|
|
22
|
+
client?: CodexAppServerClient;
|
|
23
|
+
/** Override how the live connection is opened. */
|
|
24
|
+
connect?: () => Promise<CodexAppServerClient>;
|
|
25
|
+
/** Spawn `codex app-server` (stdio). Ignored when `client` or `connect` is set. */
|
|
26
|
+
spawn?: SpawnAppServerOptions;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Live Codex adapter: parse official events, then `thread/resume` + `turn/start`
|
|
30
|
+
* on the official app-server JSON-RPC (stdio by default).
|
|
31
|
+
*/
|
|
32
|
+
export declare class CodexProvider implements AgentProvider {
|
|
33
|
+
readonly name: "codex";
|
|
34
|
+
private client;
|
|
35
|
+
private connecting;
|
|
36
|
+
private readonly connect;
|
|
37
|
+
constructor(options?: CodexProviderOptions);
|
|
38
|
+
detectUsageLimit(event: unknown, hintSessionId?: string): UsageLimitEvent | null;
|
|
39
|
+
readAccountRateLimits(): Promise<unknown>;
|
|
40
|
+
resumeSession(sessionId: string): Promise<ResumeResult>;
|
|
41
|
+
sendContinuation(sessionId: string, prompt: string): Promise<void>;
|
|
42
|
+
close(): Promise<void>;
|
|
43
|
+
private ensureClient;
|
|
44
|
+
}
|