(msg: Record<string, unknown>)
| 1957 | let codexEventQueue: Promise<void> | null = null; |
| 1958 | |
| 1959 | const handleCodexEvent = async (msg: Record<string, unknown>): Promise<void> => { |
| 1960 | const msgType = asString(msg.type); |
| 1961 | if (!msgType) return; |
| 1962 | const eventTurnId = asString(msg.turn_id ?? msg.turnId); |
| 1963 | const eventThreadId = asString(msg.thread_id ?? msg.threadId); |
| 1964 | const isTerminalEvent = msgType === 'task_complete' || msgType === 'turn_aborted' || msgType === 'task_failed'; |
| 1965 | const suppressReadyForThisTerminalEvent = isTerminalEvent |
| 1966 | ? consumeInterruptedTurnReadySuppression(eventTurnId) |
| 1967 | : false; |
| 1968 | |
| 1969 | if (msgType === 'thread_started') { |
| 1970 | const threadId = asString(msg.thread_id ?? msg.threadId); |
| 1971 | if (threadId) { |
| 1972 | if (!this.currentThreadId || this.currentThreadId === threadId) { |
| 1973 | this.currentThreadId = threadId; |
| 1974 | session.onSessionFound(threadId); |
| 1975 | } else { |
| 1976 | logger.debug( |
| 1977 | `[Codex] Ignoring thread_started for non-active thread; ` + |
| 1978 | `eventThreadId=${threadId}, activeThread=${this.currentThreadId}` |
| 1979 | ); |
| 1980 | } |
| 1981 | } |
| 1982 | return; |
| 1983 | } |
| 1984 | |
| 1985 | if (msgType === 'thread_compacted') { |
| 1986 | completeCompactRecovery(eventThreadId); |
| 1987 | return; |
| 1988 | } |
| 1989 | |
| 1990 | if (eventThreadId && this.currentThreadId && eventThreadId !== this.currentThreadId) { |
| 1991 | logger.debug( |
| 1992 | `[Codex] Routing event from non-active thread into agent trace; ` + |
| 1993 | `type=${msgType}, eventThreadId=${eventThreadId}, activeThread=${this.currentThreadId}` |
| 1994 | ); |
| 1995 | if (msgType === 'task_started') { |
| 1996 | if (eventTurnId) { |
| 1997 | this.activeChildTurns.set(eventThreadId, eventTurnId); |
| 1998 | } else { |
| 1999 | logger.debug(`[Codex] Child task_started missing turn id; threadId=${eventThreadId}`); |
| 2000 | } |
| 2001 | linkPendingAgentStartFromChildTask(eventThreadId); |
| 2002 | } else if (isTerminalEvent) { |
| 2003 | this.activeChildTurns.delete(eventThreadId); |
| 2004 | } |
| 2005 | handleChildCodexEvent(eventThreadId, msg); |
| 2006 | return; |
| 2007 | } |
| 2008 | |
| 2009 | if (!eventThreadId && this.currentThreadId && isScopeSensitiveCodexEvent(msgType) && hasKnownChildAgents()) { |
| 2010 | logger.debug( |
| 2011 | `[Codex] Dropping unscoped scope-sensitive event while child agents are active; ` + |
| 2012 | `type=${msgType}, activeThread=${this.currentThreadId}` |
| 2013 | ); |
| 2014 | return; |
| 2015 | } |
| 2016 |
nothing calls this directly
no test coverage detected