@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
@@ -0,0 +1,57 @@
1
+ export interface LaunchdHost {
2
+ platform: NodeJS.Platform;
3
+ homeDir: string;
4
+ uid: number;
5
+ nodePath: string;
6
+ cliPath: string;
7
+ pathEnv: string;
8
+ extraEnv?: Record<string, string>;
9
+ runLaunchctl(args: string[]): string;
10
+ }
11
+ export interface LaunchdActionResult {
12
+ attempted: boolean;
13
+ loaded: boolean;
14
+ skipped: boolean;
15
+ label: string;
16
+ plistPath: string;
17
+ stdoutLog: string;
18
+ stderrLog: string;
19
+ /** User-facing. Never includes raw launchctl text. */
20
+ message: string;
21
+ nextStep: string | null;
22
+ /** Technical detail for logs/tests only — not shown in the TUI. */
23
+ detail: string;
24
+ }
25
+ export interface LaunchctlFailure {
26
+ code: number | null;
27
+ text: string;
28
+ args: string[];
29
+ }
30
+ export { HELPER_FAIL_MESSAGE, HELPER_OFF_MESSAGE, HELPER_ON_MESSAGE, HELPER_RETRY_NEXT_STEP, HELPER_ROOT_NEXT_STEP, HELPER_WINDOW_NEXT_STEP, containsRawLaunchdJargon, userFacingError, } from "./facing.js";
31
+ /** Child stdio: never inherit. Raw launchctl lines must not reach the terminal. */
32
+ export declare const LAUNCHCTL_EXEC_OPTIONS: {
33
+ encoding: "utf8";
34
+ stdio: ["ignore", "pipe", "pipe"];
35
+ };
36
+ export declare function describeLaunchctlFailure(error: unknown, args?: string[]): LaunchctlFailure;
37
+ export declare function isBootoutNotLoaded(failure: LaunchctlFailure): boolean;
38
+ export declare function isBootstrapAlreadyLoaded(failure: LaunchctlFailure): boolean;
39
+ export declare function printLooksHealthy(stdout: string): boolean;
40
+ export declare function defaultLaunchdHost(): LaunchdHost;
41
+ export declare function launchdGuiDomain(uid: number): string;
42
+ export declare function launchdServiceTarget(uid: number, label?: string): string;
43
+ /**
44
+ * KeepAlive LaunchAgent. On boot/wake launchd starts (or restarts) `autocodex daemon`,
45
+ * which reloads SQLite and drives wait / resume / continue-once from absolute `reset_at_unix`.
46
+ */
47
+ export declare function renderLaunchAgentPlist(options: {
48
+ nodePath: string;
49
+ cliPath: string;
50
+ dataDir: string;
51
+ stdoutLog: string;
52
+ stderrLog: string;
53
+ pathEnv: string;
54
+ extraEnv?: Record<string, string>;
55
+ }): string;
56
+ export declare function installLaunchAgent(dataDir: string, host?: LaunchdHost): LaunchdActionResult;
57
+ export declare function uninstallLaunchAgent(dataDir: string, host?: LaunchdHost): LaunchdActionResult;
@@ -0,0 +1,333 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname } from "node:path";
5
+ import { LAUNCHD_LABEL } from "./defaults.js";
6
+ import { HELPER_FAIL_MESSAGE, HELPER_OFF_MESSAGE, HELPER_ON_MESSAGE, HELPER_RETRY_NEXT_STEP, HELPER_ROOT_NEXT_STEP, HELPER_WINDOW_NEXT_STEP, containsRawLaunchdJargon, } from "./facing.js";
7
+ import { daemonLogPaths, launchAgentPlistPath, launchAgentsDir, materializeRuntimeCli, resolveAutocodexCliPath, } from "./paths.js";
8
+ export { HELPER_FAIL_MESSAGE, HELPER_OFF_MESSAGE, HELPER_ON_MESSAGE, HELPER_RETRY_NEXT_STEP, HELPER_ROOT_NEXT_STEP, HELPER_WINDOW_NEXT_STEP, containsRawLaunchdJargon, userFacingError, } from "./facing.js";
9
+ /** Child stdio: never inherit. Raw launchctl lines must not reach the terminal. */
10
+ export const LAUNCHCTL_EXEC_OPTIONS = {
11
+ encoding: "utf8",
12
+ stdio: ["ignore", "pipe", "pipe"],
13
+ };
14
+ export function describeLaunchctlFailure(error, args = []) {
15
+ const err = error;
16
+ const text = [err.stderr, err.stdout, err.message].filter(Boolean).join("\n");
17
+ const matched = text.match(/failed:\s*(\d+)/i);
18
+ const code = matched
19
+ ? Number(matched[1])
20
+ : typeof err.status === "number"
21
+ ? err.status
22
+ : null;
23
+ return { code, text, args };
24
+ }
25
+ export function isBootoutNotLoaded(failure) {
26
+ if (failure.code === 3) {
27
+ return true;
28
+ }
29
+ return /no such process/i.test(failure.text) || /could not find service/i.test(failure.text);
30
+ }
31
+ export function isBootstrapAlreadyLoaded(failure) {
32
+ if (failure.code === 5) {
33
+ return true;
34
+ }
35
+ return /already (loaded|bootstrapped|exists)/i.test(failure.text);
36
+ }
37
+ export function printLooksHealthy(stdout) {
38
+ if (!stdout.trim()) {
39
+ return false;
40
+ }
41
+ if (/LoadError/i.test(stdout) && !/LoadError\s*=\s*0\b/.test(stdout)) {
42
+ return false;
43
+ }
44
+ return true;
45
+ }
46
+ export function defaultLaunchdHost() {
47
+ const extraEnv = {};
48
+ const codexBin = process.env.AUTOCODEX_CODEX_BIN?.trim() || process.env.CODEX_BIN?.trim();
49
+ if (codexBin) {
50
+ extraEnv.AUTOCODEX_CODEX_BIN = codexBin;
51
+ }
52
+ return {
53
+ platform: process.platform,
54
+ homeDir: homedir(),
55
+ uid: typeof process.getuid === "function" ? (process.getuid() ?? 501) : 501,
56
+ nodePath: process.execPath,
57
+ cliPath: resolveAutocodexCliPath(),
58
+ pathEnv: process.env.PATH ?? "/usr/bin:/bin:/usr/sbin:/sbin",
59
+ extraEnv,
60
+ runLaunchctl(args) {
61
+ return execFileSync("launchctl", args, LAUNCHCTL_EXEC_OPTIONS);
62
+ },
63
+ };
64
+ }
65
+ export function launchdGuiDomain(uid) {
66
+ return `gui/${uid}`;
67
+ }
68
+ export function launchdServiceTarget(uid, label = LAUNCHD_LABEL) {
69
+ return `${launchdGuiDomain(uid)}/${label}`;
70
+ }
71
+ function escapePlist(value) {
72
+ return value
73
+ .replaceAll("&", "&amp;")
74
+ .replaceAll("<", "&lt;")
75
+ .replaceAll(">", "&gt;")
76
+ .replaceAll('"', "&quot;");
77
+ }
78
+ function plistString(value) {
79
+ return `<string>${escapePlist(value)}</string>`;
80
+ }
81
+ function launchdPathEnv(host) {
82
+ const extras = ["/opt/homebrew/bin", "/usr/local/bin", dirname(host.nodePath)];
83
+ const codexBin = host.extraEnv?.AUTOCODEX_CODEX_BIN;
84
+ if (codexBin) {
85
+ extras.unshift(dirname(codexBin));
86
+ }
87
+ return [...extras, host.pathEnv].join(":");
88
+ }
89
+ function launchctl(host, args) {
90
+ try {
91
+ return { ok: true, stdout: host.runLaunchctl(args) ?? "" };
92
+ }
93
+ catch (error) {
94
+ return { ok: false, failure: describeLaunchctlFailure(error, args) };
95
+ }
96
+ }
97
+ function emptyResult(dataDir, host) {
98
+ const logs = daemonLogPaths(dataDir);
99
+ return {
100
+ attempted: false,
101
+ loaded: false,
102
+ skipped: false,
103
+ label: LAUNCHD_LABEL,
104
+ plistPath: launchAgentPlistPath(host.homeDir),
105
+ stdoutLog: logs.stdout,
106
+ stderrLog: logs.stderr,
107
+ message: "",
108
+ nextStep: null,
109
+ detail: "",
110
+ };
111
+ }
112
+ function userResult(base, patch) {
113
+ const next = { ...base, ...patch };
114
+ if (containsRawLaunchdJargon(next.message)) {
115
+ next.message = HELPER_FAIL_MESSAGE;
116
+ }
117
+ if (next.nextStep && containsRawLaunchdJargon(next.nextStep)) {
118
+ next.nextStep = HELPER_RETRY_NEXT_STEP;
119
+ }
120
+ return next;
121
+ }
122
+ function servicePrint(host) {
123
+ const printed = launchctl(host, ["print", launchdServiceTarget(host.uid)]);
124
+ if (!printed.ok) {
125
+ return { loaded: false, stdout: "" };
126
+ }
127
+ return { loaded: printLooksHealthy(printed.stdout), stdout: printed.stdout };
128
+ }
129
+ /**
130
+ * Boot-out failed: 3 means the helper was already stopped. That is success.
131
+ */
132
+ function bootoutIgnoreMissing(host, plistPath) {
133
+ const service = launchdServiceTarget(host.uid);
134
+ const first = launchctl(host, ["bootout", service]);
135
+ if (first.ok) {
136
+ return "bootout ok";
137
+ }
138
+ if (isBootoutNotLoaded(first.failure)) {
139
+ return "bootout not loaded (ok)";
140
+ }
141
+ const alt = launchctl(host, ["bootout", launchdGuiDomain(host.uid), plistPath]);
142
+ if (alt.ok || (alt.ok === false && isBootoutNotLoaded(alt.failure))) {
143
+ return "bootout via plist (ok)";
144
+ }
145
+ return `bootout unresolved code=${first.failure.code ?? "?"}`;
146
+ }
147
+ /**
148
+ * KeepAlive LaunchAgent. On boot/wake launchd starts (or restarts) `autocodex daemon`,
149
+ * which reloads SQLite and drives wait / resume / continue-once from absolute `reset_at_unix`.
150
+ */
151
+ export function renderLaunchAgentPlist(options) {
152
+ const envEntries = [
153
+ ["PATH", options.pathEnv],
154
+ ["AUTOCODEX_DATA_DIR", options.dataDir],
155
+ ...Object.entries(options.extraEnv ?? {}),
156
+ ]
157
+ .map(([key, value]) => ` <key>${escapePlist(key)}</key>\n ${plistString(value)}`)
158
+ .join("\n");
159
+ return `<?xml version="1.0" encoding="UTF-8"?>
160
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
161
+ <plist version="1.0">
162
+ <dict>
163
+ <key>Label</key>
164
+ ${plistString(LAUNCHD_LABEL)}
165
+ <key>ProgramArguments</key>
166
+ <array>
167
+ ${plistString(options.nodePath)}
168
+ ${plistString(options.cliPath)}
169
+ ${plistString("daemon")}
170
+ ${plistString("--data-dir")}
171
+ ${plistString(options.dataDir)}
172
+ </array>
173
+ <key>WorkingDirectory</key>
174
+ ${plistString(options.dataDir)}
175
+ <key>EnvironmentVariables</key>
176
+ <dict>
177
+ ${envEntries}
178
+ </dict>
179
+ <key>RunAtLoad</key>
180
+ <true/>
181
+ <key>KeepAlive</key>
182
+ <true/>
183
+ <key>ThrottleInterval</key>
184
+ <integer>10</integer>
185
+ <key>ProcessType</key>
186
+ ${plistString("Background")}
187
+ <key>StandardOutPath</key>
188
+ ${plistString(options.stdoutLog)}
189
+ <key>StandardErrorPath</key>
190
+ ${plistString(options.stderrLog)}
191
+ </dict>
192
+ </plist>
193
+ `;
194
+ }
195
+ function writeAgentPlist(dataDir, host, plistPath, logs) {
196
+ const cliPath = materializeRuntimeCli(dataDir, host.cliPath);
197
+ mkdirSync(dataDir, { recursive: true });
198
+ mkdirSync(launchAgentsDir(host.homeDir), { recursive: true });
199
+ writeFileSync(plistPath, renderLaunchAgentPlist({
200
+ nodePath: host.nodePath,
201
+ cliPath,
202
+ dataDir,
203
+ stdoutLog: logs.stdout,
204
+ stderrLog: logs.stderr,
205
+ pathEnv: launchdPathEnv(host),
206
+ extraEnv: host.extraEnv,
207
+ }), "utf8");
208
+ return cliPath;
209
+ }
210
+ function kickstartBestEffort(host) {
211
+ launchctl(host, ["kickstart", "-k", launchdServiceTarget(host.uid)]);
212
+ }
213
+ function enableBestEffort(host) {
214
+ launchctl(host, ["enable", launchdServiceTarget(host.uid)]);
215
+ }
216
+ export function installLaunchAgent(dataDir, host = defaultLaunchdHost()) {
217
+ const logs = daemonLogPaths(dataDir);
218
+ const plistPath = launchAgentPlistPath(host.homeDir);
219
+ const base = emptyResult(dataDir, host);
220
+ if (host.platform !== "darwin") {
221
+ return userResult(base, {
222
+ skipped: true,
223
+ message: "Auto-resume is on in this window.",
224
+ nextStep: HELPER_WINDOW_NEXT_STEP,
225
+ detail: `launchd skipped (${host.platform})`,
226
+ });
227
+ }
228
+ if (host.uid === 0) {
229
+ return userResult(base, {
230
+ attempted: false,
231
+ message: "Run this as your normal user, not as root.",
232
+ nextStep: HELPER_ROOT_NEXT_STEP,
233
+ detail: "uid=0; gui/0 is the wrong domain",
234
+ });
235
+ }
236
+ const cliPath = writeAgentPlist(dataDir, host, plistPath, logs);
237
+ const domain = launchdGuiDomain(host.uid);
238
+ const notes = [`plist ${plistPath}`, `cli ${cliPath}`];
239
+ enableBestEffort(host);
240
+ const already = servicePrint(host);
241
+ if (already.loaded) {
242
+ kickstartBestEffort(host);
243
+ return userResult(base, {
244
+ attempted: true,
245
+ loaded: true,
246
+ message: HELPER_ON_MESSAGE,
247
+ nextStep: null,
248
+ detail: `${notes.join("; ")}; already loaded`,
249
+ });
250
+ }
251
+ notes.push(bootoutIgnoreMissing(host, plistPath));
252
+ const bootstrapped = launchctl(host, ["bootstrap", domain, plistPath]);
253
+ if (!bootstrapped.ok) {
254
+ notes.push(`bootstrap code=${bootstrapped.failure.code ?? "?"}`);
255
+ if (isBootstrapAlreadyLoaded(bootstrapped.failure)) {
256
+ const after = servicePrint(host);
257
+ if (after.loaded) {
258
+ enableBestEffort(host);
259
+ kickstartBestEffort(host);
260
+ return userResult(base, {
261
+ attempted: true,
262
+ loaded: true,
263
+ message: HELPER_ON_MESSAGE,
264
+ nextStep: null,
265
+ detail: `${notes.join("; ")}; recovered already-loaded`,
266
+ });
267
+ }
268
+ }
269
+ enableBestEffort(host);
270
+ kickstartBestEffort(host);
271
+ const recovered = servicePrint(host);
272
+ if (recovered.loaded) {
273
+ return userResult(base, {
274
+ attempted: true,
275
+ loaded: true,
276
+ message: HELPER_ON_MESSAGE,
277
+ nextStep: null,
278
+ detail: `${notes.join("; ")}; recovered via enable/kickstart`,
279
+ });
280
+ }
281
+ return userResult(base, {
282
+ attempted: true,
283
+ loaded: false,
284
+ message: HELPER_FAIL_MESSAGE,
285
+ nextStep: HELPER_RETRY_NEXT_STEP,
286
+ detail: notes.join("; "),
287
+ });
288
+ }
289
+ enableBestEffort(host);
290
+ kickstartBestEffort(host);
291
+ return userResult(base, {
292
+ attempted: true,
293
+ loaded: true,
294
+ message: HELPER_ON_MESSAGE,
295
+ nextStep: null,
296
+ detail: notes.join("; "),
297
+ });
298
+ }
299
+ export function uninstallLaunchAgent(dataDir, host = defaultLaunchdHost()) {
300
+ const base = emptyResult(dataDir, host);
301
+ if (host.platform !== "darwin") {
302
+ return userResult(base, {
303
+ skipped: true,
304
+ message: HELPER_OFF_MESSAGE,
305
+ nextStep: null,
306
+ detail: `launchd skipped (${host.platform})`,
307
+ });
308
+ }
309
+ const notes = [bootoutIgnoreMissing(host, base.plistPath)];
310
+ try {
311
+ if (existsSync(base.plistPath)) {
312
+ unlinkSync(base.plistPath);
313
+ notes.push("plist removed");
314
+ }
315
+ return userResult(base, {
316
+ attempted: true,
317
+ loaded: false,
318
+ message: HELPER_OFF_MESSAGE,
319
+ nextStep: null,
320
+ detail: notes.join("; "),
321
+ });
322
+ }
323
+ catch (error) {
324
+ return userResult(base, {
325
+ attempted: true,
326
+ loaded: false,
327
+ message: "Couldn't stop the background helper.",
328
+ nextStep: HELPER_RETRY_NEXT_STEP,
329
+ detail: error instanceof Error ? error.message : String(error),
330
+ });
331
+ }
332
+ }
333
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type DaemonRecord, type MachineEvent, type SessionRecord } from "./types.js";
2
+ export interface MachineState {
3
+ daemon: DaemonRecord;
4
+ sessions: Map<string, SessionRecord>;
5
+ }
6
+ export interface TransitionResult {
7
+ state: MachineState;
8
+ logs: {
9
+ sessionId: string | null;
10
+ kind: string;
11
+ message: string;
12
+ }[];
13
+ }
14
+ export declare function emptyState(nowUnix: number): MachineState;
15
+ /**
16
+ * Pure state machine. Clock and I/O stay outside so tests can use FakeClock
17
+ * and a recording provider.
18
+ */
19
+ export declare function applyEvent(state: MachineState, event: MachineEvent, nowUnix: number): TransitionResult;
20
+ export declare function sessionsNeedingResume(state: MachineState): SessionRecord[];
21
+ export declare function sessionsNeedingContinue(state: MachineState): SessionRecord[];