(opts: {
startedBy?: 'runner' | 'terminal';
codexArgs?: string[];
permissionMode?: PermissionMode;
resumeSessionId?: string;
model?: string;
modelReasoningEffort?: ReasoningEffort;
collaborationMode?: EnhancedMode['collaborationMode'];
existingSessionId?: string;
workingDirectory?: string;
})
| 25 | const REASONING_EFFORTS = new Set<ReasoningEffort>(['none', 'minimal', 'low', 'medium', 'high', 'xhigh']) |
| 26 | |
| 27 | export async function runCodex(opts: { |
| 28 | startedBy?: 'runner' | 'terminal'; |
| 29 | codexArgs?: string[]; |
| 30 | permissionMode?: PermissionMode; |
| 31 | resumeSessionId?: string; |
| 32 | model?: string; |
| 33 | modelReasoningEffort?: ReasoningEffort; |
| 34 | collaborationMode?: EnhancedMode['collaborationMode']; |
| 35 | existingSessionId?: string; |
| 36 | workingDirectory?: string; |
| 37 | }): Promise<void> { |
| 38 | const workingDirectory = opts.workingDirectory ?? getInvokedCwd(); |
| 39 | const startedBy = opts.startedBy ?? 'terminal'; |
| 40 | |
| 41 | logger.debug(`[codex] Starting with options: startedBy=${startedBy}`); |
| 42 | |
| 43 | let state: AgentState = { |
| 44 | controlledByUser: false |
| 45 | }; |
| 46 | const bootstrap = opts.existingSessionId |
| 47 | ? await bootstrapExistingSession({ |
| 48 | sessionId: opts.existingSessionId, |
| 49 | flavor: 'codex', |
| 50 | startedBy, |
| 51 | workingDirectory |
| 52 | }) |
| 53 | : await bootstrapSession({ |
| 54 | flavor: 'codex', |
| 55 | startedBy, |
| 56 | workingDirectory, |
| 57 | agentState: state, |
| 58 | model: opts.model, |
| 59 | modelReasoningEffort: opts.modelReasoningEffort |
| 60 | }); |
| 61 | const { api, session } = bootstrap; |
| 62 | |
| 63 | const startingMode: 'local' | 'remote' = startedBy === 'runner' ? 'remote' : 'local'; |
| 64 | |
| 65 | setControlledByUser(session, startingMode); |
| 66 | |
| 67 | const messageQueue = new MessageQueue2<EnhancedMode>((mode) => hashObject({ |
| 68 | permissionMode: mode.permissionMode, |
| 69 | model: mode.model, |
| 70 | modelReasoningEffort: mode.modelReasoningEffort, |
| 71 | collaborationMode: mode.collaborationMode |
| 72 | })); |
| 73 | |
| 74 | const codexCliOverrides = parseCodexCliOverrides(opts.codexArgs); |
| 75 | const sessionWrapperRef: { current: CodexSession | null } = { current: null }; |
| 76 | // 中文注释:当用户直接把现成的 Codex thread 导入到一个全新的 Hapi 会话时, |
| 77 | // 需要在首次附着 transcript 时回放已有历史;恢复已有 Hapi 会话时则保持原来的增量模式,避免重复灌入旧消息。 |
| 78 | const replayTranscriptHistoryOnStart = Boolean(opts.resumeSessionId && !opts.existingSessionId); |
| 79 | |
| 80 | let currentPermissionMode: PermissionMode = opts.permissionMode ?? 'default'; |
| 81 | let currentModel = opts.model; |
| 82 | let currentModelReasoningEffort: ReasoningEffort | undefined = opts.modelReasoningEffort; |
| 83 | let currentCollaborationMode: EnhancedMode['collaborationMode'] = opts.collaborationMode ?? 'default'; |
| 84 |
no test coverage detected