@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,98 @@
1
+ import { defaultLaunchdHost, installLaunchAgent, } from "./launchd.js";
2
+ import { AUTO_RESUME_ON, buildSnapshot, helperFromLaunchd, parseThreadInput, } from "./view.js";
3
+ export class TrackerSession {
4
+ draft = "";
5
+ screen;
6
+ inputError = null;
7
+ helper;
8
+ app;
9
+ dataDir;
10
+ launchd;
11
+ shouldInstall;
12
+ install;
13
+ constructor(options) {
14
+ this.app = options.app;
15
+ this.dataDir = options.dataDir;
16
+ this.launchd = options.launchd;
17
+ this.shouldInstall = options.shouldInstall ?? true;
18
+ this.install = options.install ?? installLaunchAgent;
19
+ this.screen = this.app.sessions().length === 0 ? "ask" : "status";
20
+ this.helper = {
21
+ state: "on",
22
+ headline: AUTO_RESUME_ON,
23
+ nextStep: null,
24
+ driveInProcess: false,
25
+ };
26
+ this.syncBackground();
27
+ }
28
+ get needsInProcessDrive() {
29
+ return this.helper.driveInProcess;
30
+ }
31
+ hasSessions() {
32
+ return this.app.sessions().length > 0;
33
+ }
34
+ type(text) {
35
+ this.draft += text;
36
+ this.inputError = null;
37
+ }
38
+ backspace() {
39
+ this.draft = this.draft.slice(0, -1);
40
+ }
41
+ setDraft(text) {
42
+ this.draft = text;
43
+ this.inputError = null;
44
+ }
45
+ submitDraft() {
46
+ const parsed = parseThreadInput(this.draft);
47
+ if (!parsed.ok) {
48
+ this.inputError = parsed.error;
49
+ return false;
50
+ }
51
+ this.app.watch(parsed.sessionId);
52
+ this.syncBackground();
53
+ this.draft = "";
54
+ this.inputError = null;
55
+ this.screen = "status";
56
+ return true;
57
+ }
58
+ startAddAnother() {
59
+ this.screen = "ask";
60
+ this.draft = "";
61
+ this.inputError = null;
62
+ }
63
+ cancelAsk() {
64
+ if (this.hasSessions()) {
65
+ this.screen = "status";
66
+ this.draft = "";
67
+ this.inputError = null;
68
+ }
69
+ }
70
+ retryBackground() {
71
+ this.syncBackground();
72
+ }
73
+ snapshot() {
74
+ return buildSnapshot({
75
+ screen: this.screen,
76
+ draft: this.draft,
77
+ inputError: this.inputError,
78
+ sessions: this.app.sessions(),
79
+ helper: this.helper,
80
+ nowUnix: this.app.nowUnix(),
81
+ });
82
+ }
83
+ syncBackground() {
84
+ this.app.enable();
85
+ if (!this.shouldInstall) {
86
+ this.helper = {
87
+ state: "on",
88
+ headline: AUTO_RESUME_ON,
89
+ nextStep: null,
90
+ driveInProcess: false,
91
+ };
92
+ return;
93
+ }
94
+ const report = this.install(this.dataDir, this.launchd ?? defaultLaunchdHost());
95
+ this.helper = helperFromLaunchd(report);
96
+ }
97
+ }
98
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import type { AutoCodex } from "./app.js";
2
+ import type { LaunchdHost } from "./launchd.js";
3
+ import { runDaemon } from "./scheduler.js";
4
+ import { TrackerSession } from "./tracker.js";
5
+ import { type TuiSnapshot } from "./view.js";
6
+ export interface TuiIo {
7
+ stdout: (line: string) => void;
8
+ stderr: (line: string) => void;
9
+ }
10
+ export declare function TrackerView({ snap }: {
11
+ snap: TuiSnapshot;
12
+ }): import("react").JSX.Element;
13
+ export declare function TrackerApp({ session }: {
14
+ session: TrackerSession;
15
+ }): import("react").JSX.Element;
16
+ export interface RunTuiOptions {
17
+ app: AutoCodex;
18
+ dataDir: string;
19
+ launchd?: LaunchdHost;
20
+ shouldInstall?: boolean;
21
+ stdinIsTty?: boolean;
22
+ io?: TuiIo;
23
+ runDaemonLoop?: typeof runDaemon;
24
+ }
25
+ export declare function runTui(options: RunTuiOptions): Promise<number>;
package/dist/tui.js ADDED
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { Box, Text, render, useApp, useInput } from "ink";
4
+ import { DEFAULT_DAEMON_POLL_SECONDS } from "./defaults.js";
5
+ import { runDaemon } from "./scheduler.js";
6
+ import { TrackerSession } from "./tracker.js";
7
+ import { OPEN_TERMINAL_NEXT_STEP } from "./view.js";
8
+ export function TrackerView({ snap }) {
9
+ const showAsk = snap.screen === "ask";
10
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", paddingX: 1, width: 78, children: [_jsx(Text, { bold: true, children: "autocodex" }), _jsxs(Text, { children: [snap.helper.headline, snap.helper.state === "on" ? " will auto-resume when limits are back" : ""] }), snap.sessions.map((session) => (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { children: [_jsx(Text, { bold: true, children: session.sessionId }), _jsxs(Text, { children: [" ", session.phaseLabel] })] }), _jsxs(Text, { dimColor: true, children: ["Reset ", session.resetLabel, session.countdownLabel ? ` ${session.countdownLabel}` : ""] }), _jsx(Text, { dimColor: true, children: snap.sameThread }), session.notice ? _jsx(Text, { color: "yellow", children: session.notice }) : null, session.nextStep ? (_jsxs(Text, { color: "yellow", children: ["Next step: ", session.nextStep] })) : null] }, session.sessionId))), showAsk ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { children: snap.title }), _jsx(Text, { bold: true, color: "cyan", children: snap.findIdTitle }), snap.findIdBanner.map((line) => (_jsx(Text, { color: "cyan", children: line }, line))), _jsxs(Text, { children: [snap.pasteLabel, snap.draft, _jsx(Text, { color: "cyan", children: "\u2588" })] }), snap.inputError ? _jsx(Text, { color: "yellow", children: snap.inputError }) : null] })) : (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [snap.addHint, " ", snap.quitHint, snap.retryHint ? ` ${snap.retryHint}` : ""] }) })), snap.helper.nextStep ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "yellow", children: ["Next step: ", snap.helper.nextStep] }) })) : null] }));
11
+ }
12
+ export function TrackerApp({ session }) {
13
+ const { exit } = useApp();
14
+ const [snap, setSnap] = useState(() => session.snapshot());
15
+ const refresh = () => {
16
+ setSnap(session.snapshot());
17
+ };
18
+ useEffect(() => {
19
+ const id = setInterval(refresh, 1000);
20
+ return () => {
21
+ clearInterval(id);
22
+ };
23
+ }, [session]);
24
+ useInput((input, key) => {
25
+ if (session.snapshot().screen === "ask") {
26
+ if (key.return) {
27
+ session.submitDraft();
28
+ refresh();
29
+ return;
30
+ }
31
+ if (key.escape) {
32
+ session.cancelAsk();
33
+ refresh();
34
+ return;
35
+ }
36
+ if (key.backspace || key.delete) {
37
+ session.backspace();
38
+ refresh();
39
+ return;
40
+ }
41
+ if (input) {
42
+ session.type(input);
43
+ refresh();
44
+ }
45
+ return;
46
+ }
47
+ if (input === "q") {
48
+ exit();
49
+ return;
50
+ }
51
+ if (input === "a") {
52
+ session.startAddAnother();
53
+ refresh();
54
+ return;
55
+ }
56
+ if (input === "r") {
57
+ session.retryBackground();
58
+ refresh();
59
+ }
60
+ });
61
+ return _jsx(TrackerView, { snap: snap });
62
+ }
63
+ export async function runTui(options) {
64
+ const tty = options.stdinIsTty ?? Boolean(process.stdin.isTTY);
65
+ if (!tty) {
66
+ options.io?.stderr(OPEN_TERMINAL_NEXT_STEP);
67
+ return 1;
68
+ }
69
+ const session = new TrackerSession({
70
+ app: options.app,
71
+ dataDir: options.dataDir,
72
+ launchd: options.launchd,
73
+ shouldInstall: options.shouldInstall ?? true,
74
+ });
75
+ let stop = false;
76
+ const loop = options.runDaemonLoop ?? runDaemon;
77
+ const loopPromise = session.needsInProcessDrive
78
+ ? loop(options.app, {
79
+ pollSeconds: DEFAULT_DAEMON_POLL_SECONDS,
80
+ shouldContinue: () => !stop,
81
+ })
82
+ : Promise.resolve();
83
+ const instance = render(_jsx(TrackerApp, { session: session }));
84
+ await instance.waitUntilExit();
85
+ stop = true;
86
+ await loopPromise;
87
+ return 0;
88
+ }
89
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export declare const SESSION_PHASES: readonly ["idle", "watching", "waiting", "available", "resuming", "continuing", "completed", "cancelled", "failed"];
2
+ export type SessionPhase = (typeof SESSION_PHASES)[number];
3
+ export type LimitKind = "usage_limit" | "rate_limit";
4
+ export interface SessionRecord {
5
+ sessionId: string;
6
+ cwd: string | null;
7
+ phase: SessionPhase;
8
+ resetAtUnix: number | null;
9
+ limitKind: LimitKind | null;
10
+ continuationPrompt: string;
11
+ continuationSent: boolean;
12
+ resumeAttemptId: string | null;
13
+ lastError: string | null;
14
+ createdAtUnix: number;
15
+ updatedAtUnix: number;
16
+ }
17
+ export interface DaemonRecord {
18
+ enabled: boolean;
19
+ updatedAtUnix: number;
20
+ }
21
+ export interface LogEvent {
22
+ id: number;
23
+ sessionId: string | null;
24
+ atUnix: number;
25
+ kind: string;
26
+ message: string;
27
+ }
28
+ export interface AppStatus {
29
+ enabled: boolean;
30
+ sessions: SessionRecord[];
31
+ }
32
+ export type MachineEvent = {
33
+ type: "enable";
34
+ } | {
35
+ type: "disable";
36
+ } | {
37
+ type: "watch";
38
+ sessionId: string;
39
+ cwd?: string;
40
+ } | {
41
+ type: "limitHit";
42
+ sessionId: string;
43
+ resetAtUnix: number;
44
+ limitKind: LimitKind;
45
+ } | {
46
+ type: "tick";
47
+ } | {
48
+ type: "resumeStarted";
49
+ sessionId: string;
50
+ resumeAttemptId: string;
51
+ } | {
52
+ type: "resumeSucceeded";
53
+ sessionId: string;
54
+ resumedSessionId: string;
55
+ } | {
56
+ type: "resumeRetry";
57
+ sessionId: string;
58
+ error: string;
59
+ } | {
60
+ type: "continueSucceeded";
61
+ sessionId: string;
62
+ } | {
63
+ type: "cancel";
64
+ sessionId?: string;
65
+ } | {
66
+ type: "fail";
67
+ sessionId: string;
68
+ error: string;
69
+ };
70
+ export declare class AutocodexError extends Error {
71
+ constructor(message: string);
72
+ }
73
+ export declare class SameSessionRequiredError extends AutocodexError {
74
+ constructor(expected: string, actual: string);
75
+ }
76
+ export declare class MissingResetTimestampError extends AutocodexError {
77
+ constructor(sessionId: string);
78
+ }
79
+ /**
80
+ * Resume errors that must not stay in `resuming` for a later `step` / daemon tick.
81
+ * Foreign `thread.id`, ephemeral threads, and `--last` are permanent.
82
+ * JSON-RPC `-32600` (TUI owns the thread) and transport failures are retriable.
83
+ */
84
+ export declare function isRetriableResumeError(error: unknown): boolean;
package/dist/types.js ADDED
@@ -0,0 +1,48 @@
1
+ export const SESSION_PHASES = [
2
+ "idle",
3
+ "watching",
4
+ "waiting",
5
+ "available",
6
+ "resuming",
7
+ "continuing",
8
+ "completed",
9
+ "cancelled",
10
+ "failed",
11
+ ];
12
+ export class AutocodexError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.name = "AutocodexError";
16
+ }
17
+ }
18
+ export class SameSessionRequiredError extends AutocodexError {
19
+ constructor(expected, actual) {
20
+ super(`Refusing to continue: Codex returned session ${actual}, expected ${expected}. Autocodex never starts a new conversation.`);
21
+ this.name = "SameSessionRequiredError";
22
+ }
23
+ }
24
+ export class MissingResetTimestampError extends AutocodexError {
25
+ constructor(sessionId) {
26
+ super(`Usage limit detected for ${sessionId} but no absolute reset timestamp was provided. Refusing to guess a wait.`);
27
+ this.name = "MissingResetTimestampError";
28
+ }
29
+ }
30
+ /**
31
+ * Resume errors that must not stay in `resuming` for a later `step` / daemon tick.
32
+ * Foreign `thread.id`, ephemeral threads, and `--last` are permanent.
33
+ * JSON-RPC `-32600` (TUI owns the thread) and transport failures are retriable.
34
+ */
35
+ export function isRetriableResumeError(error) {
36
+ if (error instanceof SameSessionRequiredError) {
37
+ return false;
38
+ }
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ if (/never starts a new conversation/i.test(message) ||
41
+ /ephemeral Codex thread/i.test(message) ||
42
+ /did not return thread\.id/i.test(message) ||
43
+ /Refusing resume --last/i.test(message)) {
44
+ return false;
45
+ }
46
+ return true;
47
+ }
48
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM;IACN,UAAU;IACV,SAAS;IACT,WAAW;IACX,UAAU;IACV,YAAY;IACZ,WAAW;IACX,WAAW;IACX,QAAQ;CACA,CAAC;AAuDX,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IAC1D,YAAY,QAAgB,EAAE,MAAc;QAC1C,KAAK,CACH,gDAAgD,MAAM,cAAc,QAAQ,8CAA8C,CAC3H,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,cAAc;IAC5D,YAAY,SAAiB;QAC3B,KAAK,CACH,4BAA4B,SAAS,0EAA0E,CAChH,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IACE,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC;QAChD,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/view.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import type { LaunchdActionResult } from "./launchd.js";
2
+ import type { SessionPhase, SessionRecord } from "./types.js";
3
+ export { FIND_ID_TITLE, THREAD_ID_BANNER, THREAD_ID_TIP, THREAD_ID_TIP_LINES, } from "./facing.js";
4
+ export declare const ASK_TITLE = "Paste a Codex thread id";
5
+ export declare const ASK_ANOTHER_TITLE = "Paste another Codex thread id";
6
+ export declare const SAME_THREAD_PROMISE = "We'll resume this same thread when usage limits reset.";
7
+ export declare const ADD_ANOTHER_HINT = "[a] Add another thread";
8
+ export declare const QUIT_HINT = "[q] Quit";
9
+ export declare const RETRY_HINT = "[r] Try again";
10
+ export declare const AUTO_RESUME_ON = "Auto-resume ON";
11
+ export declare const OPEN_TERMINAL_NEXT_STEP = "Open a terminal and run: npx autocodex";
12
+ export declare const PASTE_HERE_LABEL = "Paste here: ";
13
+ export type TrackerScreen = "ask" | "status";
14
+ export interface HelperView {
15
+ state: "on" | "window" | "retry";
16
+ headline: string;
17
+ nextStep: string | null;
18
+ driveInProcess: boolean;
19
+ }
20
+ export interface SessionView {
21
+ sessionId: string;
22
+ phase: SessionPhase;
23
+ phaseLabel: string;
24
+ resetLabel: string;
25
+ countdownLabel: string | null;
26
+ notice: string | null;
27
+ nextStep: string | null;
28
+ }
29
+ export interface TuiSnapshot {
30
+ screen: TrackerScreen;
31
+ title: string;
32
+ tip: string;
33
+ tipLines: readonly string[];
34
+ findIdTitle: string;
35
+ findIdBanner: readonly string[];
36
+ pasteLabel: string;
37
+ draft: string;
38
+ inputError: string | null;
39
+ sessions: SessionView[];
40
+ helper: HelperView;
41
+ addHint: string;
42
+ quitHint: string;
43
+ retryHint: string | null;
44
+ sameThread: string;
45
+ }
46
+ export declare function parseThreadInput(raw: string): {
47
+ ok: true;
48
+ sessionId: string;
49
+ } | {
50
+ ok: false;
51
+ error: string;
52
+ };
53
+ export declare function formatDuration(seconds: number): string;
54
+ export declare function formatResetAt(resetAtUnix: number | null, nowUnix: number): {
55
+ when: string;
56
+ countdown: string | null;
57
+ };
58
+ export declare function humanPhase(phase: SessionPhase, lastError?: string | null): string;
59
+ export declare function helperFromLaunchd(report: LaunchdActionResult): HelperView;
60
+ export declare function sessionView(session: SessionRecord, nowUnix: number): SessionView;
61
+ export declare function buildSnapshot(options: {
62
+ screen: TrackerScreen;
63
+ draft: string;
64
+ inputError: string | null;
65
+ sessions: SessionRecord[];
66
+ helper: HelperView;
67
+ nowUnix: number;
68
+ }): TuiSnapshot;
package/dist/view.js ADDED
@@ -0,0 +1,139 @@
1
+ import { FIND_ID_TITLE, HELPER_FAIL_MESSAGE, HELPER_RETRY_NEXT_STEP, HELPER_WINDOW_NEXT_STEP, THREAD_ID_BANNER, THREAD_ID_TIP, THREAD_ID_TIP_LINES, sessionFacing, } from "./facing.js";
2
+ export { FIND_ID_TITLE, THREAD_ID_BANNER, THREAD_ID_TIP, THREAD_ID_TIP_LINES, } from "./facing.js";
3
+ export const ASK_TITLE = "Paste a Codex thread id";
4
+ export const ASK_ANOTHER_TITLE = "Paste another Codex thread id";
5
+ export const SAME_THREAD_PROMISE = "We'll resume this same thread when usage limits reset.";
6
+ export const ADD_ANOTHER_HINT = "[a] Add another thread";
7
+ export const QUIT_HINT = "[q] Quit";
8
+ export const RETRY_HINT = "[r] Try again";
9
+ export const AUTO_RESUME_ON = "Auto-resume ON";
10
+ export const OPEN_TERMINAL_NEXT_STEP = "Open a terminal and run: npx autocodex";
11
+ export const PASTE_HERE_LABEL = "Paste here: ";
12
+ export function parseThreadInput(raw) {
13
+ const id = raw.trim();
14
+ if (!id) {
15
+ return { ok: false, error: "Paste a thread id to start tracking." };
16
+ }
17
+ const folded = id.toLowerCase();
18
+ if (folded === "--last" || folded === "last" || folded === "resume --last") {
19
+ return {
20
+ ok: false,
21
+ error: "That would start a different chat. Paste the exact thread id from Codex.",
22
+ };
23
+ }
24
+ if (/\s/.test(id)) {
25
+ return { ok: false, error: "Use just the thread id — no extra words." };
26
+ }
27
+ return { ok: true, sessionId: id };
28
+ }
29
+ export function formatDuration(seconds) {
30
+ const total = Math.max(0, Math.floor(seconds));
31
+ const hours = Math.floor(total / 3600);
32
+ const minutes = Math.floor((total % 3600) / 60);
33
+ const secs = total % 60;
34
+ if (hours > 0) {
35
+ return `in ${hours}h ${minutes}m`;
36
+ }
37
+ if (minutes > 0) {
38
+ return `in ${minutes}m`;
39
+ }
40
+ return `in ${secs}s`;
41
+ }
42
+ export function formatResetAt(resetAtUnix, nowUnix) {
43
+ if (resetAtUnix === null || !Number.isFinite(resetAtUnix)) {
44
+ return { when: "not known yet", countdown: null };
45
+ }
46
+ const when = new Date(resetAtUnix * 1000).toISOString().replace(".000Z", "Z");
47
+ const delta = resetAtUnix - nowUnix;
48
+ if (delta <= 0) {
49
+ return { when, countdown: "ready now" };
50
+ }
51
+ return { when, countdown: formatDuration(delta) };
52
+ }
53
+ export function humanPhase(phase, lastError) {
54
+ if (phase === "resuming" && lastError) {
55
+ return "will retry";
56
+ }
57
+ switch (phase) {
58
+ case "idle":
59
+ case "watching":
60
+ return "tracking";
61
+ case "waiting":
62
+ return "waiting";
63
+ case "available":
64
+ return "ready";
65
+ case "resuming":
66
+ return "resuming";
67
+ case "continuing":
68
+ return "continuing";
69
+ case "completed":
70
+ return "resumed";
71
+ case "cancelled":
72
+ return "cancelled";
73
+ case "failed":
74
+ return "needs attention";
75
+ default: {
76
+ const _exhaustive = phase;
77
+ return _exhaustive;
78
+ }
79
+ }
80
+ }
81
+ export function helperFromLaunchd(report) {
82
+ if (report.loaded) {
83
+ return {
84
+ state: "on",
85
+ headline: AUTO_RESUME_ON,
86
+ nextStep: null,
87
+ driveInProcess: false,
88
+ };
89
+ }
90
+ if (report.skipped) {
91
+ return {
92
+ state: "window",
93
+ headline: "Auto-resume ON in this window",
94
+ nextStep: HELPER_WINDOW_NEXT_STEP,
95
+ driveInProcess: true,
96
+ };
97
+ }
98
+ return {
99
+ state: "retry",
100
+ headline: HELPER_FAIL_MESSAGE,
101
+ nextStep: report.nextStep ?? HELPER_RETRY_NEXT_STEP,
102
+ driveInProcess: true,
103
+ };
104
+ }
105
+ export function sessionView(session, nowUnix) {
106
+ const reset = formatResetAt(session.resetAtUnix, nowUnix);
107
+ const facing = sessionFacing(session.lastError);
108
+ return {
109
+ sessionId: session.sessionId,
110
+ phase: session.phase,
111
+ phaseLabel: humanPhase(session.phase, session.lastError),
112
+ resetLabel: reset.when,
113
+ countdownLabel: reset.countdown,
114
+ notice: facing?.message ?? null,
115
+ nextStep: facing?.nextStep ?? null,
116
+ };
117
+ }
118
+ export function buildSnapshot(options) {
119
+ const adding = options.screen === "ask";
120
+ const hasSessions = options.sessions.length > 0;
121
+ return {
122
+ screen: options.screen,
123
+ title: hasSessions && adding ? ASK_ANOTHER_TITLE : ASK_TITLE,
124
+ tip: THREAD_ID_TIP,
125
+ tipLines: THREAD_ID_TIP_LINES,
126
+ findIdTitle: FIND_ID_TITLE,
127
+ findIdBanner: THREAD_ID_BANNER,
128
+ pasteLabel: PASTE_HERE_LABEL,
129
+ draft: options.draft,
130
+ inputError: options.inputError,
131
+ sessions: options.sessions.map((session) => sessionView(session, options.nowUnix)),
132
+ helper: options.helper,
133
+ addHint: ADD_ANOTHER_HINT,
134
+ quitHint: QUIT_HINT,
135
+ retryHint: options.helper.state === "retry" ? RETRY_HINT : null,
136
+ sameThread: SAME_THREAD_PROMISE,
137
+ };
138
+ }
139
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@dhrxv29/autocodex",
3
+ "version": "0.1.0",
4
+ "description": "Paste a Codex thread id. Autocodex waits out the usage limit and resumes that same session.",
5
+ "type": "module",
6
+ "bin": {
7
+ "autocodex": "dist/cli.js"
8
+ },
9
+ "exports": {
10
+ ".": "./dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "LICENSE",
15
+ "README.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.json",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit",
20
+ "test": "tsx --test test/*.test.ts",
21
+ "start": "node dist/cli.js",
22
+ "dev": "tsx src/cli.ts",
23
+ "prepack": "npm run build",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/dhrxv8/autocodex.git"
29
+ },
30
+ "homepage": "https://github.com/dhrxv8/autocodex",
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "engines": {
35
+ "node": ">=22"
36
+ },
37
+ "keywords": [
38
+ "codex",
39
+ "openai",
40
+ "cli",
41
+ "usage-limit",
42
+ "resume"
43
+ ],
44
+ "author": "Dhruv Rao",
45
+ "license": "MIT",
46
+ "private": false,
47
+ "devDependencies": {
48
+ "@types/node": "^24.3.0",
49
+ "@types/react": "^19.2.18",
50
+ "tsx": "^4.20.5",
51
+ "typescript": "^5.9.2"
52
+ },
53
+ "dependencies": {
54
+ "ink": "^7.1.1",
55
+ "react": "^19.2.8"
56
+ }
57
+ }