@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
package/dist/machine.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { DEFAULT_CONTINUATION_PROMPT } from "./defaults.js";
|
|
2
|
+
import { AutocodexError, MissingResetTimestampError, SameSessionRequiredError, } from "./types.js";
|
|
3
|
+
const TERMINAL = new Set(["completed", "cancelled", "failed"]);
|
|
4
|
+
function cloneState(state) {
|
|
5
|
+
return {
|
|
6
|
+
daemon: { ...state.daemon },
|
|
7
|
+
sessions: new Map([...state.sessions.entries()].map(([id, session]) => [id, { ...session }])),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function requireSessionId(sessionId) {
|
|
11
|
+
const id = sessionId.trim();
|
|
12
|
+
if (!id) {
|
|
13
|
+
throw new AutocodexError("sessionId is required");
|
|
14
|
+
}
|
|
15
|
+
return id;
|
|
16
|
+
}
|
|
17
|
+
function upsert(sessions, sessionId, nowUnix, patch) {
|
|
18
|
+
const existing = sessions.get(sessionId);
|
|
19
|
+
const next = existing
|
|
20
|
+
? { ...existing, ...patch, sessionId, updatedAtUnix: nowUnix }
|
|
21
|
+
: {
|
|
22
|
+
sessionId,
|
|
23
|
+
cwd: null,
|
|
24
|
+
phase: "idle",
|
|
25
|
+
resetAtUnix: null,
|
|
26
|
+
limitKind: null,
|
|
27
|
+
continuationPrompt: DEFAULT_CONTINUATION_PROMPT,
|
|
28
|
+
continuationSent: false,
|
|
29
|
+
resumeAttemptId: null,
|
|
30
|
+
lastError: null,
|
|
31
|
+
createdAtUnix: nowUnix,
|
|
32
|
+
updatedAtUnix: nowUnix,
|
|
33
|
+
...patch,
|
|
34
|
+
};
|
|
35
|
+
sessions.set(sessionId, next);
|
|
36
|
+
return next;
|
|
37
|
+
}
|
|
38
|
+
export function emptyState(nowUnix) {
|
|
39
|
+
return {
|
|
40
|
+
daemon: { enabled: false, updatedAtUnix: nowUnix },
|
|
41
|
+
sessions: new Map(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Pure state machine. Clock and I/O stay outside so tests can use FakeClock
|
|
46
|
+
* and a recording provider.
|
|
47
|
+
*/
|
|
48
|
+
export function applyEvent(state, event, nowUnix) {
|
|
49
|
+
const next = cloneState(state);
|
|
50
|
+
const logs = [];
|
|
51
|
+
switch (event.type) {
|
|
52
|
+
case "enable":
|
|
53
|
+
next.daemon = { enabled: true, updatedAtUnix: nowUnix };
|
|
54
|
+
logs.push({ sessionId: null, kind: "enable", message: "autocodex enabled" });
|
|
55
|
+
break;
|
|
56
|
+
case "disable":
|
|
57
|
+
next.daemon = { enabled: false, updatedAtUnix: nowUnix };
|
|
58
|
+
logs.push({ sessionId: null, kind: "disable", message: "autocodex disabled" });
|
|
59
|
+
break;
|
|
60
|
+
case "watch": {
|
|
61
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
62
|
+
const current = next.sessions.get(sessionId);
|
|
63
|
+
if (current && !TERMINAL.has(current.phase) && current.phase !== "idle") {
|
|
64
|
+
logs.push({
|
|
65
|
+
sessionId,
|
|
66
|
+
kind: "watch",
|
|
67
|
+
message: `already ${current.phase}`,
|
|
68
|
+
});
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
72
|
+
phase: "watching",
|
|
73
|
+
cwd: event.cwd ?? current?.cwd ?? null,
|
|
74
|
+
lastError: null,
|
|
75
|
+
});
|
|
76
|
+
logs.push({ sessionId, kind: "watch", message: "watching session" });
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case "limitHit": {
|
|
80
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
81
|
+
if (!Number.isFinite(event.resetAtUnix)) {
|
|
82
|
+
throw new MissingResetTimestampError(sessionId);
|
|
83
|
+
}
|
|
84
|
+
const current = next.sessions.get(sessionId);
|
|
85
|
+
if (current &&
|
|
86
|
+
current.resetAtUnix === event.resetAtUnix &&
|
|
87
|
+
(current.phase === "waiting" ||
|
|
88
|
+
current.phase === "available" ||
|
|
89
|
+
current.phase === "resuming" ||
|
|
90
|
+
current.phase === "continuing" ||
|
|
91
|
+
(current.phase === "completed" && current.continuationSent))) {
|
|
92
|
+
logs.push({
|
|
93
|
+
sessionId,
|
|
94
|
+
kind: "limitHit",
|
|
95
|
+
message: `idempotent limitHit for reset ${event.resetAtUnix}`,
|
|
96
|
+
});
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
if (current && (current.phase === "resuming" || current.phase === "continuing")) {
|
|
100
|
+
logs.push({
|
|
101
|
+
sessionId,
|
|
102
|
+
kind: "limitHit",
|
|
103
|
+
message: `ignored limitHit while ${current.phase}`,
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
if (current &&
|
|
108
|
+
current.resetAtUnix !== null &&
|
|
109
|
+
nowUnix >= current.resetAtUnix &&
|
|
110
|
+
event.resetAtUnix !== current.resetAtUnix &&
|
|
111
|
+
(current.phase === "waiting" || current.phase === "available")) {
|
|
112
|
+
logs.push({
|
|
113
|
+
sessionId,
|
|
114
|
+
kind: "limitHit",
|
|
115
|
+
message: `ignored new reset ${event.resetAtUnix}; finishing elapsed wait ${current.resetAtUnix}`,
|
|
116
|
+
});
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
120
|
+
phase: "waiting",
|
|
121
|
+
resetAtUnix: event.resetAtUnix,
|
|
122
|
+
limitKind: event.limitKind,
|
|
123
|
+
continuationSent: false,
|
|
124
|
+
resumeAttemptId: null,
|
|
125
|
+
lastError: null,
|
|
126
|
+
continuationPrompt: current?.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT,
|
|
127
|
+
cwd: current?.cwd ?? null,
|
|
128
|
+
});
|
|
129
|
+
logs.push({
|
|
130
|
+
sessionId,
|
|
131
|
+
kind: "limitHit",
|
|
132
|
+
message: `waiting until ${event.resetAtUnix}`,
|
|
133
|
+
});
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "tick": {
|
|
137
|
+
for (const session of next.sessions.values()) {
|
|
138
|
+
if (session.phase === "waiting" &&
|
|
139
|
+
session.resetAtUnix !== null &&
|
|
140
|
+
nowUnix >= session.resetAtUnix) {
|
|
141
|
+
session.phase = "available";
|
|
142
|
+
session.updatedAtUnix = nowUnix;
|
|
143
|
+
logs.push({
|
|
144
|
+
sessionId: session.sessionId,
|
|
145
|
+
kind: "available",
|
|
146
|
+
message: "reset timestamp reached",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case "resumeStarted": {
|
|
153
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
154
|
+
const current = next.sessions.get(sessionId);
|
|
155
|
+
if (!current || (current.phase !== "available" && current.phase !== "resuming")) {
|
|
156
|
+
throw new AutocodexError(`cannot resume session ${sessionId} unless it is available`);
|
|
157
|
+
}
|
|
158
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
159
|
+
phase: "resuming",
|
|
160
|
+
resumeAttemptId: current.resumeAttemptId ?? event.resumeAttemptId,
|
|
161
|
+
lastError: null,
|
|
162
|
+
});
|
|
163
|
+
logs.push({
|
|
164
|
+
sessionId,
|
|
165
|
+
kind: "resumeStarted",
|
|
166
|
+
message: current.phase === "resuming" ? "retry resume same session id" : "resuming same session id",
|
|
167
|
+
});
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case "resumeSucceeded": {
|
|
171
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
172
|
+
const current = next.sessions.get(sessionId);
|
|
173
|
+
if (!current || current.phase !== "resuming") {
|
|
174
|
+
throw new AutocodexError(`resumeSucceeded expected resuming, got ${current?.phase ?? "missing"}`);
|
|
175
|
+
}
|
|
176
|
+
if (event.resumedSessionId !== sessionId) {
|
|
177
|
+
const mismatch = new SameSessionRequiredError(sessionId, event.resumedSessionId);
|
|
178
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
179
|
+
phase: "failed",
|
|
180
|
+
lastError: mismatch.message,
|
|
181
|
+
});
|
|
182
|
+
logs.push({ sessionId, kind: "fail", message: mismatch.message });
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
186
|
+
phase: "continuing",
|
|
187
|
+
lastError: null,
|
|
188
|
+
});
|
|
189
|
+
logs.push({ sessionId, kind: "resumeSucceeded", message: "resumed same session" });
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "resumeRetry": {
|
|
193
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
194
|
+
const current = next.sessions.get(sessionId);
|
|
195
|
+
if (!current || (current.phase !== "resuming" && current.phase !== "available")) {
|
|
196
|
+
throw new AutocodexError(`resumeRetry expected available or resuming, got ${current?.phase ?? "missing"}`);
|
|
197
|
+
}
|
|
198
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
199
|
+
phase: "resuming",
|
|
200
|
+
lastError: event.error,
|
|
201
|
+
});
|
|
202
|
+
logs.push({
|
|
203
|
+
sessionId,
|
|
204
|
+
kind: "resumeRetry",
|
|
205
|
+
message: `${event.error} Same thread.id will be retried on the next step or daemon tick. Autocodex will not fork or use resume --last.`,
|
|
206
|
+
});
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case "continueSucceeded": {
|
|
210
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
211
|
+
const current = next.sessions.get(sessionId);
|
|
212
|
+
if (current?.continuationSent && current.phase === "completed") {
|
|
213
|
+
logs.push({
|
|
214
|
+
sessionId,
|
|
215
|
+
kind: "continueSucceeded",
|
|
216
|
+
message: "already continued once for this reset",
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
if (!current || current.phase !== "continuing") {
|
|
221
|
+
throw new AutocodexError(`continueSucceeded expected continuing, got ${current?.phase ?? "missing"}`);
|
|
222
|
+
}
|
|
223
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
224
|
+
phase: "completed",
|
|
225
|
+
continuationSent: true,
|
|
226
|
+
lastError: null,
|
|
227
|
+
});
|
|
228
|
+
logs.push({
|
|
229
|
+
sessionId,
|
|
230
|
+
kind: "continueSucceeded",
|
|
231
|
+
message: "continuation prompt sent once",
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case "cancel": {
|
|
236
|
+
const targets = event.sessionId
|
|
237
|
+
? [requireSessionId(event.sessionId)]
|
|
238
|
+
: [...next.sessions.keys()];
|
|
239
|
+
for (const sessionId of targets) {
|
|
240
|
+
const current = next.sessions.get(sessionId);
|
|
241
|
+
if (!current) {
|
|
242
|
+
throw new AutocodexError(`unknown session ${sessionId}`);
|
|
243
|
+
}
|
|
244
|
+
if (current.phase === "completed") {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
248
|
+
phase: "cancelled",
|
|
249
|
+
lastError: null,
|
|
250
|
+
});
|
|
251
|
+
logs.push({ sessionId, kind: "cancel", message: "cancelled" });
|
|
252
|
+
}
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
case "fail": {
|
|
256
|
+
const sessionId = requireSessionId(event.sessionId);
|
|
257
|
+
upsert(next.sessions, sessionId, nowUnix, {
|
|
258
|
+
phase: "failed",
|
|
259
|
+
lastError: event.error,
|
|
260
|
+
});
|
|
261
|
+
logs.push({ sessionId, kind: "fail", message: event.error });
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
default: {
|
|
265
|
+
const _exhaustive = event;
|
|
266
|
+
throw new AutocodexError(`unknown event ${JSON.stringify(_exhaustive)}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return { state: next, logs };
|
|
270
|
+
}
|
|
271
|
+
export function sessionsNeedingResume(state) {
|
|
272
|
+
return [...state.sessions.values()].filter((session) => session.phase === "available" || session.phase === "resuming");
|
|
273
|
+
}
|
|
274
|
+
export function sessionsNeedingContinue(state) {
|
|
275
|
+
return [...state.sessions.values()].filter((session) => session.phase === "continuing" && !session.continuationSent);
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function defaultDataDir(): string;
|
|
2
|
+
export declare function sqlitePath(dataDir: string): string;
|
|
3
|
+
export declare function launchAgentsDir(homeDir?: string): string;
|
|
4
|
+
export declare function launchAgentPlistPath(homeDir?: string): string;
|
|
5
|
+
export declare function daemonLogPaths(dataDir: string): {
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Absolute path written into the launchd plist.
|
|
11
|
+
* Prefer compiled `dist/cli.js` when the current process is `tsx src/cli.ts`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveAutocodexCliPath(entry?: string): string;
|
|
14
|
+
export declare function runtimeDir(dataDir: string): string;
|
|
15
|
+
export declare function runtimeCliPath(dataDir: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Copy the compiled CLI next to SQLite so launchd keeps a stable path
|
|
18
|
+
* after `npx` cache eviction.
|
|
19
|
+
*/
|
|
20
|
+
export declare function materializeRuntimeCli(dataDir: string, sourceCliPath: string): string;
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { DAEMON_STDERR_LOG, DAEMON_STDOUT_LOG, DEFAULT_DATA_DIR_NAME, LAUNCHD_LABEL, SQLITE_FILENAME, } from "./defaults.js";
|
|
5
|
+
export function defaultDataDir() {
|
|
6
|
+
return process.env.AUTOCODEX_DATA_DIR?.trim() || join(homedir(), DEFAULT_DATA_DIR_NAME);
|
|
7
|
+
}
|
|
8
|
+
export function sqlitePath(dataDir) {
|
|
9
|
+
return join(dataDir, SQLITE_FILENAME);
|
|
10
|
+
}
|
|
11
|
+
export function launchAgentsDir(homeDir = homedir()) {
|
|
12
|
+
return join(homeDir, "Library", "LaunchAgents");
|
|
13
|
+
}
|
|
14
|
+
export function launchAgentPlistPath(homeDir = homedir()) {
|
|
15
|
+
return join(launchAgentsDir(homeDir), `${LAUNCHD_LABEL}.plist`);
|
|
16
|
+
}
|
|
17
|
+
export function daemonLogPaths(dataDir) {
|
|
18
|
+
return {
|
|
19
|
+
stdout: join(dataDir, DAEMON_STDOUT_LOG),
|
|
20
|
+
stderr: join(dataDir, DAEMON_STDERR_LOG),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Absolute path written into the launchd plist.
|
|
25
|
+
* Prefer compiled `dist/cli.js` when the current process is `tsx src/cli.ts`.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveAutocodexCliPath(entry = process.argv[1]) {
|
|
28
|
+
const resolved = entry ? resolve(entry) : resolve(process.cwd(), "dist", "cli.js");
|
|
29
|
+
if (resolved.endsWith(`${join("src", "cli.ts")}`) || resolved.endsWith("/src/cli.ts")) {
|
|
30
|
+
const compiled = resolve(dirname(resolved), "..", "dist", "cli.js");
|
|
31
|
+
if (existsSync(compiled)) {
|
|
32
|
+
return compiled;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
37
|
+
export function runtimeDir(dataDir) {
|
|
38
|
+
return join(dataDir, "runtime");
|
|
39
|
+
}
|
|
40
|
+
export function runtimeCliPath(dataDir) {
|
|
41
|
+
return join(runtimeDir(dataDir), "cli.js");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Copy the compiled CLI next to SQLite so launchd keeps a stable path
|
|
45
|
+
* after `npx` cache eviction.
|
|
46
|
+
*/
|
|
47
|
+
export function materializeRuntimeCli(dataDir, sourceCliPath) {
|
|
48
|
+
if (!existsSync(sourceCliPath)) {
|
|
49
|
+
return sourceCliPath;
|
|
50
|
+
}
|
|
51
|
+
const destDir = runtimeDir(dataDir);
|
|
52
|
+
mkdirSync(destDir, { recursive: true });
|
|
53
|
+
const sourceDir = dirname(sourceCliPath);
|
|
54
|
+
cpSync(sourceDir, destDir, { recursive: true });
|
|
55
|
+
const destCli = join(destDir, basename(sourceCliPath) === "cli.ts" ? "cli.js" : basename(sourceCliPath));
|
|
56
|
+
return existsSync(destCli) ? destCli : sourceCliPath;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LimitKind } from "./types.js";
|
|
2
|
+
export interface UsageLimitEvent {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
resetAtUnix: number;
|
|
5
|
+
kind: LimitKind;
|
|
6
|
+
source: "app_server_turn" | "account_rate_limits" | "usage_limit_error";
|
|
7
|
+
}
|
|
8
|
+
export interface ResumeResult {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
}
|
|
11
|
+
/** Codex-only adapter. No other providers in MVP. */
|
|
12
|
+
export interface AgentProvider {
|
|
13
|
+
readonly name: "codex";
|
|
14
|
+
detectUsageLimit(event: unknown, hintSessionId?: string): UsageLimitEvent | null;
|
|
15
|
+
resumeSession(sessionId: string): Promise<ResumeResult>;
|
|
16
|
+
sendContinuation(sessionId: string, prompt: string): Promise<void>;
|
|
17
|
+
/** Live snapshot from `account/rateLimits/read`. Recording/fake providers omit this. */
|
|
18
|
+
readAccountRateLimits?(): Promise<unknown>;
|
|
19
|
+
close?(): void | Promise<void>;
|
|
20
|
+
}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
|
+
import { AutocodexError } from "../types.js";
|
|
3
|
+
/** Methods autocodex must never send. */
|
|
4
|
+
export declare const FORBIDDEN_APP_SERVER_METHODS: readonly ["thread/fork", "thread/start", "account/rateLimitResetCredit/consume", "account/login/start", "account/logout"];
|
|
5
|
+
export type ForbiddenAppServerMethod = (typeof FORBIDDEN_APP_SERVER_METHODS)[number];
|
|
6
|
+
/**
|
|
7
|
+
* In-thread approval RPCs Codex may send during `turn/start`.
|
|
8
|
+
* Autocodex is unattended: it answers `accept` so the continuation can finish.
|
|
9
|
+
* It does **not** send `approvalPolicy` / `sandboxPolicy` on resume or turn/start —
|
|
10
|
+
* those stay the thread's Codex-owned settings (omit = reuse). Not a policy engine.
|
|
11
|
+
*/
|
|
12
|
+
export declare const APPROVAL_METHODS: Set<string>;
|
|
13
|
+
/** Official decision payload for the three requestApproval methods above. */
|
|
14
|
+
export declare const UNATTENDED_APPROVAL_DECISION: "accept";
|
|
15
|
+
export interface JsonRpcTransport {
|
|
16
|
+
send(message: unknown): void;
|
|
17
|
+
onMessage(handler: (message: unknown) => void): () => void;
|
|
18
|
+
onClose?(handler: (error?: Error) => void): () => void;
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
export interface SpawnAppServerOptions {
|
|
22
|
+
command: string;
|
|
23
|
+
args?: string[];
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
}
|
|
26
|
+
export declare function resolveCodexCommand(): string;
|
|
27
|
+
export declare function defaultAppServerSpawn(): SpawnAppServerOptions;
|
|
28
|
+
export declare class AppServerError extends AutocodexError {
|
|
29
|
+
readonly code: number;
|
|
30
|
+
constructor(code: number, message: string);
|
|
31
|
+
}
|
|
32
|
+
export declare class ForbiddenAppServerMethodError extends AutocodexError {
|
|
33
|
+
constructor(method: string);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* In-memory bidirectional JSON-RPC transport for tests.
|
|
37
|
+
* Writes are delivered on a microtask so request handlers can register waiters.
|
|
38
|
+
*/
|
|
39
|
+
export declare function linkMemoryTransports(): {
|
|
40
|
+
client: JsonRpcTransport;
|
|
41
|
+
server: JsonRpcTransport;
|
|
42
|
+
};
|
|
43
|
+
/** Spawn `codex app-server` (stdio JSONL). Does not read $CODEX_HOME auth files. */
|
|
44
|
+
export declare class StdioAppServerTransport implements JsonRpcTransport {
|
|
45
|
+
private readonly child;
|
|
46
|
+
private readonly handlers;
|
|
47
|
+
private readonly closeHandlers;
|
|
48
|
+
private closed;
|
|
49
|
+
private spawnError;
|
|
50
|
+
constructor(child: ChildProcessWithoutNullStreams, command: string);
|
|
51
|
+
static spawn(options?: SpawnAppServerOptions): StdioAppServerTransport;
|
|
52
|
+
send(message: unknown): void;
|
|
53
|
+
onMessage(handler: (message: unknown) => void): () => void;
|
|
54
|
+
onClose(handler: (error?: Error) => void): () => void;
|
|
55
|
+
close(): void;
|
|
56
|
+
private fail;
|
|
57
|
+
}
|
|
58
|
+
export interface AppServerClientInfo {
|
|
59
|
+
name: string;
|
|
60
|
+
title?: string;
|
|
61
|
+
version: string;
|
|
62
|
+
}
|
|
63
|
+
export interface ThreadResumeResult {
|
|
64
|
+
threadId: string;
|
|
65
|
+
ephemeral: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface CodexAppServerClientOptions {
|
|
68
|
+
clientInfo?: AppServerClientInfo;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Official `codex app-server` JSON-RPC client.
|
|
72
|
+
* Wire format is JSONL without a `"jsonrpc":"2.0"` envelope field.
|
|
73
|
+
*/
|
|
74
|
+
export declare class CodexAppServerClient {
|
|
75
|
+
private readonly transport;
|
|
76
|
+
private readonly clientInfo;
|
|
77
|
+
private readonly pending;
|
|
78
|
+
private readonly turnWaiters;
|
|
79
|
+
private readonly completedTurns;
|
|
80
|
+
private readonly loadedThreads;
|
|
81
|
+
private nextId;
|
|
82
|
+
private initialized;
|
|
83
|
+
private closed;
|
|
84
|
+
private readonly unsubscribe;
|
|
85
|
+
private readonly unsubscribeClose;
|
|
86
|
+
constructor(transport: JsonRpcTransport, options?: CodexAppServerClientOptions);
|
|
87
|
+
get isInitialized(): boolean;
|
|
88
|
+
isThreadLoaded(threadId: string): boolean;
|
|
89
|
+
handshake(): Promise<unknown>;
|
|
90
|
+
threadResume(threadId: string): Promise<ThreadResumeResult>;
|
|
91
|
+
turnStart(threadId: string, prompt: string): Promise<void>;
|
|
92
|
+
rateLimitsRead(): Promise<unknown>;
|
|
93
|
+
request(method: string, params?: unknown): Promise<unknown>;
|
|
94
|
+
close(): void;
|
|
95
|
+
private failOpen;
|
|
96
|
+
private notify;
|
|
97
|
+
private assertOpen;
|
|
98
|
+
private expectTurnCompletion;
|
|
99
|
+
private dispatch;
|
|
100
|
+
private dispatchNotification;
|
|
101
|
+
private respondToServerRequest;
|
|
102
|
+
}
|