remove transcript timeout for codex

This commit is contained in:
weishu
2026-04-24 13:45:16 +08:00
parent 83e5053156
commit 11e1d50e46
3 changed files with 115 additions and 30 deletions
+21 -9
View File
@@ -229,8 +229,12 @@ describe('codexLocalLauncher', () => {
]);
});
it('warns on session match failure without aborting local Codex launch', async () => {
it('does not emit a session warning while waiting for the first transcript path', async () => {
const { session, sessionEvents, getLocalLaunchFailure } = createSessionStub('default', undefined, 'c:\\workspace\\project');
let releaseRunBarrier: (() => void) | undefined;
harness.runBarrier = new Promise((resolve) => {
releaseRunBarrier = resolve;
});
vi.useFakeTimers();
const launcherPromise = codexLocalLauncher(session as never);
@@ -239,19 +243,25 @@ describe('codexLocalLauncher', () => {
await Promise.resolve();
vi.advanceTimersByTime(10_000);
await Promise.resolve();
expect(sessionEvents).toEqual([]);
if (releaseRunBarrier) {
releaseRunBarrier();
}
await launcherPromise;
expect(harness.launches.length).toBeGreaterThan(0);
expect(getLocalLaunchFailure()).toBeNull();
expect(sessionEvents).toContainEqual({
type: 'message',
message: 'No Codex SessionStart hook transcript path received within 10000ms. Keeping local Codex running; remote transcript sync may be unavailable for this launch.'
});
expect(sessionEvents).toEqual([]);
});
it('does not reuse a stale transcript path from a previous launch', async () => {
const staleTranscriptPath = join(tempDir, 'stale-transcript.jsonl');
const { session, sessionEvents } = createSessionStub('default', undefined, '/tmp/worktree', staleTranscriptPath);
let releaseRunBarrier: (() => void) | undefined;
harness.runBarrier = new Promise((resolve) => {
releaseRunBarrier = resolve;
});
vi.useFakeTimers();
const launcherPromise = codexLocalLauncher(session as never);
@@ -261,12 +271,14 @@ describe('codexLocalLauncher', () => {
vi.advanceTimersByTime(10_000);
await Promise.resolve();
expect(sessionEvents).toEqual([]);
if (releaseRunBarrier) {
releaseRunBarrier();
}
await launcherPromise;
expect(sessionEvents).toContainEqual({
type: 'message',
message: 'No Codex SessionStart hook transcript path received within 10000ms. Keeping local Codex running; remote transcript sync may be unavailable for this launch.'
});
expect(sessionEvents).toEqual([]);
});
it('passes SessionStart hook config into local Codex launch', async () => {
-21
View File
@@ -10,8 +10,6 @@ import { stripCodexCliOverrides } from './utils/codexCliOverrides';
import { buildCodexPermissionModeCliArgs } from './utils/permissionModeConfig';
import { BaseLocalLauncher } from '@/modules/common/launcher/BaseLocalLauncher';
const SESSION_HOOK_TIMEOUT_MS = 10_000;
export async function codexLocalLauncher(session: CodexSession): Promise<'switch' | 'exit'> {
const resumeSessionId = session.sessionId;
let scanner: CodexSessionScanner | null = null;
@@ -47,23 +45,6 @@ export async function codexLocalLauncher(session: CodexSession): Promise<'switch
});
logger.debug(`[codex-local]: Started Codex SessionStart hook server on port ${hookServer.port}`);
let hookTimeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {
hookTimeout = null;
const message = `No Codex SessionStart hook transcript path received within ${SESSION_HOOK_TIMEOUT_MS}ms.`;
logger.warn(`[codex-local]: ${message}`);
session.sendSessionEvent({
type: 'message',
message: `${message} Keeping local Codex running; remote transcript sync may be unavailable for this launch.`
});
}, SESSION_HOOK_TIMEOUT_MS);
const clearHookTimeout = () => {
if (hookTimeout) {
clearTimeout(hookTimeout);
hookTimeout = null;
}
};
const reportTranscriptSyncFailure = (transcriptPath: string, error: unknown): void => {
const detail = error instanceof Error ? error.message : String(error);
const message = `Codex transcript sync failed for ${transcriptPath}: ${detail}`;
@@ -80,7 +61,6 @@ export async function codexLocalLauncher(session: CodexSession): Promise<'switch
const processTranscriptPath = async (transcriptPath: string): Promise<void> => {
hookReady = true;
clearHookTimeout();
if (shuttingDown) {
return;
}
@@ -170,7 +150,6 @@ export async function codexLocalLauncher(session: CodexSession): Promise<'switch
return await launcher.run();
} finally {
shuttingDown = true;
clearHookTimeout();
session.removeTranscriptPathCallback(handleTranscriptPathCallback);
hookServer.stop();
if (pendingScannerSetup) {