@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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/app.d.ts +47 -0
  4. package/dist/app.js +174 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +22 -0
  7. package/dist/cli.js +308 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/clock.d.ts +14 -0
  10. package/dist/clock.js +21 -0
  11. package/dist/clock.js.map +1 -0
  12. package/dist/defaults.d.ts +10 -0
  13. package/dist/defaults.js +11 -0
  14. package/dist/defaults.js.map +1 -0
  15. package/dist/facing.d.ts +31 -0
  16. package/dist/facing.js +115 -0
  17. package/dist/facing.js.map +1 -0
  18. package/dist/index.d.ts +17 -0
  19. package/dist/index.js +18 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/launchd.d.ts +57 -0
  22. package/dist/launchd.js +333 -0
  23. package/dist/launchd.js.map +1 -0
  24. package/dist/machine.d.ts +21 -0
  25. package/dist/machine.js +277 -0
  26. package/dist/machine.js.map +1 -0
  27. package/dist/paths.d.ts +20 -0
  28. package/dist/paths.js +58 -0
  29. package/dist/paths.js.map +1 -0
  30. package/dist/provider.d.ts +20 -0
  31. package/dist/provider.js +2 -0
  32. package/dist/provider.js.map +1 -0
  33. package/dist/providers/app-server.d.ts +102 -0
  34. package/dist/providers/app-server.js +474 -0
  35. package/dist/providers/app-server.js.map +1 -0
  36. package/dist/providers/codex.d.ts +44 -0
  37. package/dist/providers/codex.js +260 -0
  38. package/dist/providers/codex.js.map +1 -0
  39. package/dist/scheduler.d.ts +25 -0
  40. package/dist/scheduler.js +59 -0
  41. package/dist/scheduler.js.map +1 -0
  42. package/dist/schema.d.ts +5 -0
  43. package/dist/schema.js +41 -0
  44. package/dist/schema.js.map +1 -0
  45. package/dist/store.d.ts +15 -0
  46. package/dist/store.js +146 -0
  47. package/dist/store.js.map +1 -0
  48. package/dist/tracker.d.ts +33 -0
  49. package/dist/tracker.js +98 -0
  50. package/dist/tracker.js.map +1 -0
  51. package/dist/tui.d.ts +25 -0
  52. package/dist/tui.js +89 -0
  53. package/dist/tui.js.map +1 -0
  54. package/dist/types.d.ts +84 -0
  55. package/dist/types.js +48 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/view.d.ts +68 -0
  58. package/dist/view.js +139 -0
  59. package/dist/view.js.map +1 -0
  60. package/package.json +57 -0
package/dist/cli.js ADDED
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parseArgs } from "node:util";
5
+ import { AutoCodex } from "./app.js";
6
+ import { SystemClock } from "./clock.js";
7
+ import { DEFAULT_DAEMON_POLL_SECONDS } from "./defaults.js";
8
+ import { defaultLaunchdHost, installLaunchAgent, uninstallLaunchAgent, userFacingError, } from "./launchd.js";
9
+ import { defaultDataDir, sqlitePath } from "./paths.js";
10
+ import { CodexProvider } from "./providers/codex.js";
11
+ import { runDaemon } from "./scheduler.js";
12
+ import { SqliteStore } from "./store.js";
13
+ import { runTui } from "./tui.js";
14
+ import { sessionFacing } from "./facing.js";
15
+ import { OPEN_TERMINAL_NEXT_STEP } from "./view.js";
16
+ const USAGE = `autocodex — resume the same OpenAI Codex session after a usage-limit reset
17
+
18
+ npx autocodex Open the tracker
19
+
20
+ Paste a thread id when asked. The background helper starts itself.
21
+
22
+ Advanced:
23
+ autocodex enable # persist enabled + start background helper (macOS)
24
+ autocodex disable # persist disabled + stop background helper
25
+ autocodex daemon # long-running step loop (used by the helper)
26
+ autocodex status
27
+ autocodex sessions
28
+ autocodex watch <sessionId>
29
+ autocodex step
30
+ autocodex cancel [sessionId]
31
+ autocodex logs [--limit N]
32
+
33
+ Options:
34
+ --data-dir <path> SQLite directory (default: ~/.autocodex or $AUTOCODEX_DATA_DIR)
35
+ --poll-seconds <n> daemon poll / wake check (default: 30)
36
+ --help Show this help
37
+ `;
38
+ const defaultIo = {
39
+ stdout: (line) => {
40
+ process.stdout.write(`${line}\n`);
41
+ },
42
+ stderr: (line) => {
43
+ process.stderr.write(`${line}\n`);
44
+ },
45
+ };
46
+ const ADVANCED = new Set([
47
+ "enable",
48
+ "disable",
49
+ "daemon",
50
+ "status",
51
+ "sessions",
52
+ "watch",
53
+ "step",
54
+ "cancel",
55
+ "logs",
56
+ ]);
57
+ export async function runCli(argv, options = {}) {
58
+ const io = options.io ?? defaultIo;
59
+ if (argv.some((arg) => arg === "--last")) {
60
+ io.stderr("That would start a different chat. Next step: paste the exact Codex thread id.");
61
+ return 1;
62
+ }
63
+ let parsed;
64
+ try {
65
+ parsed = parseArgs({
66
+ args: argv,
67
+ allowPositionals: true,
68
+ options: {
69
+ help: { type: "boolean", default: false },
70
+ "data-dir": { type: "string" },
71
+ limit: { type: "string" },
72
+ "poll-seconds": { type: "string" },
73
+ },
74
+ });
75
+ }
76
+ catch (error) {
77
+ const facing = userFacingError(error);
78
+ io.stderr(facing.message);
79
+ io.stderr(`Next step: ${facing.nextStep}`);
80
+ return 1;
81
+ }
82
+ if (parsed.values.help || parsed.positionals[0] === "help") {
83
+ io.stdout(USAGE.trimEnd());
84
+ return 0;
85
+ }
86
+ const command = parsed.positionals[0];
87
+ if (command && !ADVANCED.has(command) && command !== "tui") {
88
+ io.stderr("Not sure what that means. Next step: run npx autocodex");
89
+ return 1;
90
+ }
91
+ const dataDir = parsed.values["data-dir"] ?? options.dataDir ?? defaultDataDir();
92
+ const store = options.app ? null : new SqliteStore(sqlitePath(dataDir));
93
+ const app = options.app ??
94
+ new AutoCodex({
95
+ store: store,
96
+ clock: new SystemClock(),
97
+ provider: new CodexProvider(),
98
+ });
99
+ const shouldInstall = !options.app || Boolean(options.launchd);
100
+ try {
101
+ if (!command || command === "tui") {
102
+ const tui = options.runTui ?? runTui;
103
+ return await tui({
104
+ app,
105
+ dataDir,
106
+ launchd: options.launchd,
107
+ shouldInstall,
108
+ stdinIsTty: options.stdinIsTty ?? Boolean(process.stdin.isTTY),
109
+ io,
110
+ runDaemonLoop: options.runDaemonLoop,
111
+ });
112
+ }
113
+ switch (command) {
114
+ case "enable": {
115
+ app.enable();
116
+ if (shouldInstall) {
117
+ const report = installLaunchAgent(dataDir, options.launchd ?? defaultLaunchdHost());
118
+ io.stdout(report.message);
119
+ if (report.nextStep) {
120
+ io.stdout(`Next step: ${report.nextStep}`);
121
+ }
122
+ return report.loaded || report.skipped ? 0 : 1;
123
+ }
124
+ io.stdout("Auto-resume is on.");
125
+ return 0;
126
+ }
127
+ case "disable": {
128
+ app.disable();
129
+ if (shouldInstall) {
130
+ const report = uninstallLaunchAgent(dataDir, options.launchd ?? defaultLaunchdHost());
131
+ io.stdout(report.message);
132
+ if (report.nextStep) {
133
+ io.stdout(`Next step: ${report.nextStep}`);
134
+ }
135
+ return 0;
136
+ }
137
+ io.stdout("Auto-resume is off.");
138
+ return 0;
139
+ }
140
+ case "daemon": {
141
+ const poll = parsed.values["poll-seconds"]
142
+ ? Number(parsed.values["poll-seconds"])
143
+ : DEFAULT_DAEMON_POLL_SECONDS;
144
+ const pollSeconds = Number.isFinite(poll) && poll > 0 ? poll : DEFAULT_DAEMON_POLL_SECONDS;
145
+ io.stdout(`daemon: data-dir=${dataDir} poll=${pollSeconds}s sqlite=${sqlitePath(dataDir)}`);
146
+ let stop = false;
147
+ const stopDaemon = () => {
148
+ stop = true;
149
+ };
150
+ process.once("SIGINT", stopDaemon);
151
+ process.once("SIGTERM", stopDaemon);
152
+ const loop = options.runDaemonLoop ?? runDaemon;
153
+ try {
154
+ await loop(app, {
155
+ pollSeconds,
156
+ shouldContinue: () => !stop,
157
+ sleep: async (seconds) => {
158
+ const end = Date.now() + Math.max(0, seconds) * 1000;
159
+ while (!stop && Date.now() < end) {
160
+ await new Promise((resolve) => {
161
+ setTimeout(resolve, Math.min(250, Math.max(0, end - Date.now())));
162
+ });
163
+ }
164
+ },
165
+ onCycle: (stepped) => {
166
+ io.stdout(`step: resumed=${stepped.resumed.length} continued=${stepped.continued.length} failed=${stepped.failed.length} retrying=${stepped.retrying.length}`);
167
+ },
168
+ });
169
+ }
170
+ finally {
171
+ process.off("SIGINT", stopDaemon);
172
+ process.off("SIGTERM", stopDaemon);
173
+ }
174
+ return 0;
175
+ }
176
+ case "status": {
177
+ const status = app.status();
178
+ io.stdout(`enabled: ${status.enabled}`);
179
+ io.stdout(`sessions: ${status.sessions.length}`);
180
+ for (const session of status.sessions) {
181
+ const reset = session.resetAtUnix ?? "-";
182
+ const facing = sessionFacing(session.lastError);
183
+ io.stdout(` ${session.sessionId} ${session.phase} resetAt=${reset} continued=${session.continuationSent}`);
184
+ if (facing) {
185
+ io.stdout(` Next step: ${facing.nextStep}`);
186
+ }
187
+ }
188
+ return 0;
189
+ }
190
+ case "watch": {
191
+ const sessionId = parsed.positionals[1];
192
+ if (!sessionId?.trim()) {
193
+ io.stderr("watch needs a Codex thread.id. Next step: run npx autocodex");
194
+ return 1;
195
+ }
196
+ if (sessionId.trim() === "--last" || sessionId.trim() === "last") {
197
+ io.stderr("That would start a different chat. Next step: paste the exact Codex thread id.");
198
+ return 1;
199
+ }
200
+ app.watch(sessionId.trim());
201
+ io.stdout(`watching ${sessionId.trim()}`);
202
+ return 0;
203
+ }
204
+ case "step": {
205
+ const stepped = await app.step();
206
+ io.stdout(`step: resumed=${stepped.resumed.length} continued=${stepped.continued.length} failed=${stepped.failed.length} retrying=${stepped.retrying.length}`);
207
+ for (const sessionId of stepped.resumed) {
208
+ io.stdout(` resumed ${sessionId}`);
209
+ }
210
+ for (const sessionId of stepped.continued) {
211
+ io.stdout(` continued ${sessionId}`);
212
+ }
213
+ for (const sessionId of stepped.retrying) {
214
+ io.stdout(` retrying ${sessionId}`);
215
+ }
216
+ for (const sessionId of stepped.failed) {
217
+ io.stdout(` failed ${sessionId}`);
218
+ }
219
+ return stepped.failed.length > 0 ? 1 : 0;
220
+ }
221
+ case "sessions": {
222
+ const sessions = app.sessions();
223
+ if (sessions.length === 0) {
224
+ io.stdout("(no sessions)");
225
+ return 0;
226
+ }
227
+ for (const session of sessions) {
228
+ io.stdout([
229
+ session.sessionId,
230
+ session.phase,
231
+ session.resetAtUnix ?? "",
232
+ session.limitKind ?? "",
233
+ session.continuationSent ? "continued" : "",
234
+ ]
235
+ .filter((part) => part !== "")
236
+ .join("\t"));
237
+ }
238
+ return 0;
239
+ }
240
+ case "cancel": {
241
+ const sessionId = parsed.positionals[1];
242
+ app.cancel(sessionId);
243
+ io.stdout(sessionId ? `cancelled ${sessionId}` : "cancelled all sessions");
244
+ return 0;
245
+ }
246
+ case "logs": {
247
+ const limit = parsed.values.limit ? Number(parsed.values.limit) : 50;
248
+ const events = app.logs(Number.isFinite(limit) ? limit : 50);
249
+ if (events.length === 0) {
250
+ io.stdout("(no logs)");
251
+ return 0;
252
+ }
253
+ for (const event of events.reverse()) {
254
+ io.stdout(`${event.atUnix} ${event.kind} ${event.sessionId ?? "-"} ${event.message}`);
255
+ }
256
+ return 0;
257
+ }
258
+ default:
259
+ io.stderr("Not sure what that means. Next step: run npx autocodex");
260
+ return 1;
261
+ }
262
+ }
263
+ catch (error) {
264
+ const facing = userFacingError(error);
265
+ io.stderr(facing.message);
266
+ io.stderr(`Next step: ${facing.nextStep}`);
267
+ return 1;
268
+ }
269
+ finally {
270
+ store?.close();
271
+ if (!options.app) {
272
+ await app.close();
273
+ }
274
+ }
275
+ }
276
+ /**
277
+ * True when this file is the process entry, including `npx autocodex`
278
+ * (npm bin is a symlink named `autocodex`, not `cli.js`).
279
+ */
280
+ export function isCliEntry(argv1, modulePath) {
281
+ if (!argv1) {
282
+ return false;
283
+ }
284
+ try {
285
+ return realpathSync(argv1) === realpathSync(modulePath);
286
+ }
287
+ catch {
288
+ const folded = argv1.replaceAll("\\", "/");
289
+ const self = modulePath.replaceAll("\\", "/");
290
+ return (folded === self ||
291
+ folded.endsWith("/src/cli.ts") ||
292
+ folded.endsWith("/dist/cli.js") ||
293
+ folded.endsWith("/cli.js") ||
294
+ folded.endsWith("/autocodex"));
295
+ }
296
+ }
297
+ if (isCliEntry(process.argv[1], fileURLToPath(import.meta.url))) {
298
+ runCli(process.argv.slice(2))
299
+ .then((code) => {
300
+ process.exitCode = code;
301
+ })
302
+ .catch((error) => {
303
+ const facing = userFacingError(error);
304
+ process.stderr.write(`${facing.message}\nNext step: ${facing.nextStep}\n`);
305
+ process.exitCode = 1;
306
+ });
307
+ }
308
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GAEhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBb,CAAC;AAMF,MAAM,SAAS,GAAU;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpC,CAAC;CACF,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAc,EACd,UAQI,EAAE;IAEN,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,SAAS,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;QACzC,EAAE,CAAC,MAAM,CAAC,gFAAgF,CAAC,CAAC;QAC5F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC3D,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3D,EAAE,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;QACX,IAAI,SAAS,CAAC;YACZ,KAAK,EAAE,KAAM;YACb,KAAK,EAAE,IAAI,WAAW,EAAE;YACxB,QAAQ,EAAE,IAAI,aAAa,EAAE;SAC9B,CAAC,CAAC;IAEL,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;YACrC,OAAO,MAAM,GAAG,CAAC;gBACf,GAAG;gBACH,OAAO;gBACP,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,aAAa;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC9D,EAAE;gBACF,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAC;oBACpF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACpB,EAAE,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC7C,CAAC;oBACD,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,CAAC;gBACD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAChC,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAC;oBACtF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACpB,EAAE,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC7C,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACjC,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;oBACxC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBACvC,CAAC,CAAC,2BAA2B,CAAC;gBAChC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC;gBAC3F,EAAE,CAAC,MAAM,CAAC,oBAAoB,OAAO,SAAS,WAAW,YAAY,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC5F,IAAI,IAAI,GAAG,KAAK,CAAC;gBACjB,MAAM,UAAU,GAAG,GAAS,EAAE;oBAC5B,IAAI,GAAG,IAAI,CAAC;gBACd,CAAC,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,GAAG,EAAE;wBACd,WAAW;wBACX,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI;wBAC3B,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;4BACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;4BACrD,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;gCACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oCAClC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gCACpE,CAAC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBACD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;4BACnB,EAAE,CAAC,MAAM,CACP,iBAAiB,OAAO,CAAC,OAAO,CAAC,MAAM,cAAc,OAAO,CAAC,SAAS,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,CAAC,MAAM,aAAa,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CACpJ,CAAC;wBACJ,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC5B,EAAE,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxC,EAAE,CAAC,MAAM,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;oBACzC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAChD,EAAE,CAAC,MAAM,CACP,KAAK,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,aAAa,KAAK,eAAe,OAAO,CAAC,gBAAgB,EAAE,CACpG,CAAC;oBACF,IAAI,MAAM,EAAE,CAAC;wBACX,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;oBACvB,EAAE,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;oBACzE,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;oBACjE,EAAE,CAAC,MAAM,CAAC,gFAAgF,CAAC,CAAC;oBAC5F,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5B,EAAE,CAAC,MAAM,CAAC,YAAY,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1C,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjC,EAAE,CAAC,MAAM,CACP,iBAAiB,OAAO,CAAC,OAAO,CAAC,MAAM,cAAc,OAAO,CAAC,SAAS,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,CAAC,MAAM,aAAa,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CACpJ,CAAC;gBACF,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACxC,EAAE,CAAC,MAAM,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBAC1C,EAAE,CAAC,MAAM,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACzC,EAAE,CAAC,MAAM,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;gBACvC,CAAC;gBACD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACvC,EAAE,CAAC,MAAM,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;oBAC3B,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,EAAE,CAAC,MAAM,CACP;wBACE,OAAO,CAAC,SAAS;wBACjB,OAAO,CAAC,KAAK;wBACb,OAAO,CAAC,WAAW,IAAI,EAAE;wBACzB,OAAO,CAAC,SAAS,IAAI,EAAE;wBACvB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;qBAC5C;yBACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;yBAC7B,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACxC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAC3E,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBACvB,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBACrC,EAAE,CAAC,MAAM,CACP,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAC9E,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD;gBACE,EAAE,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;gBACpE,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB,EAAE,UAAkB;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,CACL,MAAM,KAAK,IAAI;YACf,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC9B,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC9B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Unix time in seconds. Autocodex stores absolute reset timestamps, never relative delays. */
2
+ export interface Clock {
3
+ nowUnix(): number;
4
+ }
5
+ export declare class SystemClock implements Clock {
6
+ nowUnix(): number;
7
+ }
8
+ export declare class FakeClock implements Clock {
9
+ private unix;
10
+ constructor(unix: number);
11
+ nowUnix(): number;
12
+ set(unix: number): void;
13
+ advance(seconds: number): void;
14
+ }
package/dist/clock.js ADDED
@@ -0,0 +1,21 @@
1
+ export class SystemClock {
2
+ nowUnix() {
3
+ return Math.floor(Date.now() / 1000);
4
+ }
5
+ }
6
+ export class FakeClock {
7
+ unix;
8
+ constructor(unix) {
9
+ this.unix = unix;
10
+ }
11
+ nowUnix() {
12
+ return this.unix;
13
+ }
14
+ set(unix) {
15
+ this.unix = unix;
16
+ }
17
+ advance(seconds) {
18
+ this.unix += seconds;
19
+ }
20
+ }
21
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,WAAW;IACtB,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAEpC,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /** Default prompt sent once after the same Codex session is resumed. */
2
+ export declare const DEFAULT_CONTINUATION_PROMPT = "Please continue from where we left off before the usage limit reset, using the same context and instructions.";
3
+ export declare const DEFAULT_DATA_DIR_NAME = ".autocodex";
4
+ export declare const SQLITE_FILENAME = "state.sqlite";
5
+ /** launchd KeepAlive poll / wake check. Absolute `reset_at_unix` is still the source of truth. */
6
+ export declare const DEFAULT_DAEMON_POLL_SECONDS = 30;
7
+ /** User LaunchAgent label. Plist: `~/Library/LaunchAgents/<label>.plist`. */
8
+ export declare const LAUNCHD_LABEL = "com.autocodex.agent";
9
+ export declare const DAEMON_STDOUT_LOG = "daemon.stdout.log";
10
+ export declare const DAEMON_STDERR_LOG = "daemon.stderr.log";
@@ -0,0 +1,11 @@
1
+ /** Default prompt sent once after the same Codex session is resumed. */
2
+ export const DEFAULT_CONTINUATION_PROMPT = "Please continue from where we left off before the usage limit reset, using the same context and instructions.";
3
+ export const DEFAULT_DATA_DIR_NAME = ".autocodex";
4
+ export const SQLITE_FILENAME = "state.sqlite";
5
+ /** launchd KeepAlive poll / wake check. Absolute `reset_at_unix` is still the source of truth. */
6
+ export const DEFAULT_DAEMON_POLL_SECONDS = 30;
7
+ /** User LaunchAgent label. Plist: `~/Library/LaunchAgents/<label>.plist`. */
8
+ export const LAUNCHD_LABEL = "com.autocodex.agent";
9
+ export const DAEMON_STDOUT_LOG = "daemon.stdout.log";
10
+ export const DAEMON_STDERR_LOG = "daemon.stderr.log";
11
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GACtC,+GAA+G,CAAC;AAElH,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C,kGAAkG;AAClG,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Plain-English copy for the TUI and CLI.
3
+ * Never print raw launchctl, JSON-RPC, or stack text to a person.
4
+ */
5
+ export declare const HELPER_FAIL_MESSAGE = "Couldn't start the background helper.";
6
+ export declare const HELPER_RETRY_NEXT_STEP = "Press r to try again.";
7
+ export declare const HELPER_WINDOW_NEXT_STEP = "Leave this window open so we can resume after the reset.";
8
+ export declare const HELPER_ROOT_NEXT_STEP = "Open a regular terminal as your user and run: npx autocodex";
9
+ export declare const HELPER_ON_MESSAGE = "Auto-resume is on. You can close this window.";
10
+ export declare const HELPER_OFF_MESSAGE = "Background helper is off.";
11
+ export declare const RUN_AGAIN_NEXT_STEP = "Run npx autocodex again.";
12
+ export declare const PASTE_ID_NEXT_STEP = "Run npx autocodex and paste the id from Codex.";
13
+ export declare const CLOSE_CODEX_NEXT_STEP = "Close that Codex window. We'll retry this same thread.";
14
+ export declare const INSTALL_CODEX_NEXT_STEP = "Install Codex, sign in, then run npx autocodex.";
15
+ export declare const THREAD_BUSY_MESSAGE = "Codex is still using this chat.";
16
+ export declare const GENERIC_FAIL_MESSAGE = "Something went wrong.";
17
+ export declare const FIND_ID_TITLE = "How to find your id";
18
+ /** Screenshot-free, pre-aligned so it cannot wrap into junk. */
19
+ export declare const THREAD_ID_BANNER: readonly [" ┌─ in Codex ─────────────────────────┐", " │ 1. type /status │", " │ 2. copy the id that looks like │", " │ thr_… │", " │ 3. paste below, press Enter │", " └────────────────────────────────────┘"];
20
+ export declare const THREAD_ID_TIP_LINES: readonly ["In Codex type /status", "Copy the id that looks like thr_…", "Paste it below and press Enter"];
21
+ export declare const THREAD_ID_TIP: string;
22
+ export interface FacingCopy {
23
+ message: string;
24
+ nextStep: string;
25
+ }
26
+ export declare function containsRawLaunchdJargon(text: string): boolean;
27
+ /** True if a person-facing string still contains internals we must not show. */
28
+ export declare function containsUserHostileJargon(text: string): boolean;
29
+ export declare function facingFromText(raw: string): FacingCopy;
30
+ export declare function userFacingError(error: unknown): FacingCopy;
31
+ export declare function sessionFacing(lastError: string | null): FacingCopy | null;
package/dist/facing.js ADDED
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Plain-English copy for the TUI and CLI.
3
+ * Never print raw launchctl, JSON-RPC, or stack text to a person.
4
+ */
5
+ export const HELPER_FAIL_MESSAGE = "Couldn't start the background helper.";
6
+ export const HELPER_RETRY_NEXT_STEP = "Press r to try again.";
7
+ export const HELPER_WINDOW_NEXT_STEP = "Leave this window open so we can resume after the reset.";
8
+ export const HELPER_ROOT_NEXT_STEP = "Open a regular terminal as your user and run: npx autocodex";
9
+ export const HELPER_ON_MESSAGE = "Auto-resume is on. You can close this window.";
10
+ export const HELPER_OFF_MESSAGE = "Background helper is off.";
11
+ export const RUN_AGAIN_NEXT_STEP = "Run npx autocodex again.";
12
+ export const PASTE_ID_NEXT_STEP = "Run npx autocodex and paste the id from Codex.";
13
+ export const CLOSE_CODEX_NEXT_STEP = "Close that Codex window. We'll retry this same thread.";
14
+ export const INSTALL_CODEX_NEXT_STEP = "Install Codex, sign in, then run npx autocodex.";
15
+ export const THREAD_BUSY_MESSAGE = "Codex is still using this chat.";
16
+ export const GENERIC_FAIL_MESSAGE = "Something went wrong.";
17
+ export const FIND_ID_TITLE = "How to find your id";
18
+ /** Screenshot-free, pre-aligned so it cannot wrap into junk. */
19
+ export const THREAD_ID_BANNER = [
20
+ " ┌─ in Codex ─────────────────────────┐",
21
+ " │ 1. type /status │",
22
+ " │ 2. copy the id that looks like │",
23
+ " │ thr_… │",
24
+ " │ 3. paste below, press Enter │",
25
+ " └────────────────────────────────────┘",
26
+ ];
27
+ export const THREAD_ID_TIP_LINES = [
28
+ "In Codex type /status",
29
+ "Copy the id that looks like thr_…",
30
+ "Paste it below and press Enter",
31
+ ];
32
+ export const THREAD_ID_TIP = THREAD_ID_TIP_LINES.join("\n");
33
+ const RAW_LAUNCHD_JARGON = /bootstrap failed|boot-?out failed|launchctl|\bLoad failed:|command failed:[\s\S]*launchctl/i;
34
+ const THREAD_BUSY = /-32600|already opened by another client|thread is already opened/i;
35
+ const USER_HOSTILE_JARGON = /JSON-RPC|thread\/(?:fork|resume|start)|rateLimitResetCredit|LoadError|Bootstrap failed|Boot-out failed|launchctl|\b-32600\b/i;
36
+ export function containsRawLaunchdJargon(text) {
37
+ return RAW_LAUNCHD_JARGON.test(text);
38
+ }
39
+ /** True if a person-facing string still contains internals we must not show. */
40
+ export function containsUserHostileJargon(text) {
41
+ return containsRawLaunchdJargon(text) || USER_HOSTILE_JARGON.test(text);
42
+ }
43
+ export function facingFromText(raw) {
44
+ const text = raw.trim();
45
+ if (!text) {
46
+ return { message: GENERIC_FAIL_MESSAGE, nextStep: RUN_AGAIN_NEXT_STEP };
47
+ }
48
+ if (containsRawLaunchdJargon(text)) {
49
+ return { message: HELPER_FAIL_MESSAGE, nextStep: RUN_AGAIN_NEXT_STEP };
50
+ }
51
+ if (THREAD_BUSY.test(text) || /retry later\. Autocodex will not fork/i.test(text)) {
52
+ return { message: THREAD_BUSY_MESSAGE, nextStep: CLOSE_CODEX_NEXT_STEP };
53
+ }
54
+ if (/never starts a new conversation/i.test(text) ||
55
+ /Refusing to continue: Codex returned session/i.test(text)) {
56
+ return {
57
+ message: "Codex handed back a different chat. We did not switch to it.",
58
+ nextStep: PASTE_ID_NEXT_STEP,
59
+ };
60
+ }
61
+ if (/Refusing resume --last|resume --last/i.test(text)) {
62
+ return {
63
+ message: "That would start a different chat.",
64
+ nextStep: PASTE_ID_NEXT_STEP,
65
+ };
66
+ }
67
+ if (/ephemeral Codex thread/i.test(text)) {
68
+ return {
69
+ message: "That chat isn't saved, so we can't come back to it.",
70
+ nextStep: PASTE_ID_NEXT_STEP,
71
+ };
72
+ }
73
+ if (/no absolute reset timestamp|Refusing to guess a wait/i.test(text)) {
74
+ return {
75
+ message: "Codex didn't say when the limit lifts.",
76
+ nextStep: "Wait until Codex shows a reset time, then run npx autocodex.",
77
+ };
78
+ }
79
+ if (/Cannot start Codex|codex app-server|ENOENT|not found on PATH|AUTOCODEX_CODEX_BIN/i.test(text)) {
80
+ return {
81
+ message: "Codex isn't installed (or isn't on PATH).",
82
+ nextStep: INSTALL_CODEX_NEXT_STEP,
83
+ };
84
+ }
85
+ if (/stdio transport is closed|connection is closed|connection closed/i.test(text)) {
86
+ return {
87
+ message: "Lost the connection to Codex.",
88
+ nextStep: RUN_AGAIN_NEXT_STEP,
89
+ };
90
+ }
91
+ if (/sessionId is required|thread\.id is required/i.test(text)) {
92
+ return {
93
+ message: "A thread id is required.",
94
+ nextStep: PASTE_ID_NEXT_STEP,
95
+ };
96
+ }
97
+ if (/^Unknown (option|argument)/i.test(text)) {
98
+ return {
99
+ message: "That option isn't recognized.",
100
+ nextStep: "Run npx autocodex",
101
+ };
102
+ }
103
+ return { message: GENERIC_FAIL_MESSAGE, nextStep: RUN_AGAIN_NEXT_STEP };
104
+ }
105
+ export function userFacingError(error) {
106
+ const raw = error instanceof Error ? error.message : String(error);
107
+ return facingFromText(raw);
108
+ }
109
+ export function sessionFacing(lastError) {
110
+ if (!lastError) {
111
+ return null;
112
+ }
113
+ return facingFromText(lastError);
114
+ }
115
+ //# sourceMappingURL=facing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facing.js","sourceRoot":"","sources":["../src/facing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export { AutoCodex, type AutoCodexOptions, type StepResult } from "./app.js";
2
+ export { FakeClock, SystemClock, type Clock } from "./clock.js";
3
+ export { DEFAULT_CONTINUATION_PROMPT, DEFAULT_DAEMON_POLL_SECONDS, LAUNCHD_LABEL, } from "./defaults.js";
4
+ export { defaultLaunchdHost, describeLaunchctlFailure, LAUNCHCTL_EXEC_OPTIONS, installLaunchAgent, isBootstrapAlreadyLoaded, isBootoutNotLoaded, launchdGuiDomain, launchdServiceTarget, printLooksHealthy, renderLaunchAgentPlist, uninstallLaunchAgent, userFacingError, type LaunchdActionResult, type LaunchdHost, } from "./launchd.js";
5
+ export { THREAD_ID_BANNER, THREAD_ID_TIP, THREAD_ID_TIP_LINES, containsUserHostileJargon, facingFromText, sessionFacing, } from "./facing.js";
6
+ export { isCliEntry, runCli } from "./cli.js";
7
+ export { TrackerSession } from "./tracker.js";
8
+ export { TrackerView, runTui } from "./tui.js";
9
+ export { helperFromLaunchd, parseThreadInput, formatResetAt, } from "./view.js";
10
+ export { applyEvent, emptyState, sessionsNeedingContinue, sessionsNeedingResume } from "./machine.js";
11
+ export { daemonLogPaths, defaultDataDir, launchAgentPlistPath, launchAgentsDir, materializeRuntimeCli, resolveAutocodexCliPath, runtimeCliPath, sqlitePath, } from "./paths.js";
12
+ export { type AgentProvider, type ResumeResult, type UsageLimitEvent } from "./provider.js";
13
+ export { APPROVAL_METHODS, AppServerError, CodexAppServerClient, FORBIDDEN_APP_SERVER_METHODS, ForbiddenAppServerMethodError, StdioAppServerTransport, UNATTENDED_APPROVAL_DECISION, defaultAppServerSpawn, linkMemoryTransports, resolveCodexCommand, } from "./providers/app-server.js";
14
+ export { CodexProvider, asFiniteUnix, detectCodexUsageLimit, pickSessionId, type CodexProviderOptions, } from "./providers/codex.js";
15
+ export { runDaemon, runOnce, secondsUntilNextWork } from "./scheduler.js";
16
+ export { SqliteStore } from "./store.js";
17
+ export { AutocodexError, MissingResetTimestampError, SameSessionRequiredError, isRetriableResumeError, type AppStatus, type SessionPhase, type SessionRecord, } from "./types.js";
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { AutoCodex } from "./app.js";
2
+ export { FakeClock, SystemClock } from "./clock.js";
3
+ export { DEFAULT_CONTINUATION_PROMPT, DEFAULT_DAEMON_POLL_SECONDS, LAUNCHD_LABEL, } from "./defaults.js";
4
+ export { defaultLaunchdHost, describeLaunchctlFailure, LAUNCHCTL_EXEC_OPTIONS, installLaunchAgent, isBootstrapAlreadyLoaded, isBootoutNotLoaded, launchdGuiDomain, launchdServiceTarget, printLooksHealthy, renderLaunchAgentPlist, uninstallLaunchAgent, userFacingError, } from "./launchd.js";
5
+ export { THREAD_ID_BANNER, THREAD_ID_TIP, THREAD_ID_TIP_LINES, containsUserHostileJargon, facingFromText, sessionFacing, } from "./facing.js";
6
+ export { isCliEntry, runCli } from "./cli.js";
7
+ export { TrackerSession } from "./tracker.js";
8
+ export { TrackerView, runTui } from "./tui.js";
9
+ export { helperFromLaunchd, parseThreadInput, formatResetAt, } from "./view.js";
10
+ export { applyEvent, emptyState, sessionsNeedingContinue, sessionsNeedingResume } from "./machine.js";
11
+ export { daemonLogPaths, defaultDataDir, launchAgentPlistPath, launchAgentsDir, materializeRuntimeCli, resolveAutocodexCliPath, runtimeCliPath, sqlitePath, } from "./paths.js";
12
+ export {} from "./provider.js";
13
+ export { APPROVAL_METHODS, AppServerError, CodexAppServerClient, FORBIDDEN_APP_SERVER_METHODS, ForbiddenAppServerMethodError, StdioAppServerTransport, UNATTENDED_APPROVAL_DECISION, defaultAppServerSpawn, linkMemoryTransports, resolveCodexCommand, } from "./providers/app-server.js";
14
+ export { CodexProvider, asFiniteUnix, detectCodexUsageLimit, pickSessionId, } from "./providers/codex.js";
15
+ export { runDaemon, runOnce, secondsUntilNextWork } from "./scheduler.js";
16
+ export { SqliteStore } from "./store.js";
17
+ export { AutocodexError, MissingResetTimestampError, SameSessionRequiredError, isRetriableResumeError, } from "./types.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAChE,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,GAGhB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAA+D,MAAM,eAAe,CAAC;AAC5F,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,4BAA4B,EAC5B,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,GAIvB,MAAM,YAAY,CAAC"}