diff --git a/cli/src/codex/loop.ts b/cli/src/codex/loop.ts index d986db9e..8dbdaa0e 100644 --- a/cli/src/codex/loop.ts +++ b/cli/src/codex/loop.ts @@ -26,6 +26,7 @@ interface LoopOptions { codexArgs?: string[]; codexCliOverrides?: CodexCliOverrides; permissionMode?: PermissionMode; + resumeSessionId?: string; onSessionReady?: (session: CodexSession) => void; } @@ -37,7 +38,7 @@ export async function loop(opts: LoopOptions): Promise { api: opts.api, client: opts.session, path: opts.path, - sessionId: null, + sessionId: opts.resumeSessionId ?? null, logPath, messageQueue: opts.messageQueue, onModeChange: opts.onModeChange, diff --git a/cli/src/codex/runCodex.ts b/cli/src/codex/runCodex.ts index ded4fb14..b472182c 100644 --- a/cli/src/codex/runCodex.ts +++ b/cli/src/codex/runCodex.ts @@ -17,6 +17,7 @@ export async function runCodex(opts: { startedBy?: 'daemon' | 'terminal'; codexArgs?: string[]; permissionMode?: PermissionMode; + resumeSessionId?: string; }): Promise { const workingDirectory = process.cwd(); const startedBy = opts.startedBy ?? 'terminal'; @@ -116,6 +117,7 @@ export async function runCodex(opts: { codexCliOverrides, startedBy, permissionMode: currentPermissionMode, + resumeSessionId: opts.resumeSessionId, onModeChange: createModeChangeHandler(session), onSessionReady: (instance) => { sessionWrapperRef.current = instance; diff --git a/cli/src/commands/codex.ts b/cli/src/commands/codex.ts index e276c9b2..e98e0aff 100644 --- a/cli/src/commands/codex.ts +++ b/cli/src/commands/codex.ts @@ -16,11 +16,21 @@ export const codexCommand: CommandDefinition = { startedBy?: 'daemon' | 'terminal' codexArgs?: string[] permissionMode?: CodexPermissionMode + resumeSessionId?: string } = {} const unknownArgs: string[] = [] for (let i = 0; i < commandArgs.length; i++) { const arg = commandArgs[i] + if (i === 0 && arg === 'resume') { + const candidate = commandArgs[i + 1] + if (!candidate || candidate.startsWith('-')) { + throw new Error('resume requires a session id') + } + options.resumeSessionId = candidate + i += 1 + continue + } if (arg === '--started-by') { options.startedBy = commandArgs[++i] as 'daemon' | 'terminal' } else if (arg === '--yolo' || arg === '--dangerously-bypass-approvals-and-sandbox') {