From adb2b5c351e96dd50b8a6192be1d60de9dd6bcb1 Mon Sep 17 00:00:00 2001 From: 777genius Date: Wed, 29 Apr 2026 19:59:39 +0300 Subject: [PATCH] test(member-work-sync): support codex connected-account live runs --- .../team/MemberWorkSyncCodex.live.test.ts | 69 +++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/test/main/services/team/MemberWorkSyncCodex.live.test.ts b/test/main/services/team/MemberWorkSyncCodex.live.test.ts index 63a89b94..27d58a20 100644 --- a/test/main/services/team/MemberWorkSyncCodex.live.test.ts +++ b/test/main/services/team/MemberWorkSyncCodex.live.test.ts @@ -57,6 +57,14 @@ liveDescribe('Member work sync Codex live e2e', () => { let previousNudgeFlag: string | undefined; let previousCodexHome: string | undefined; let codexHomeDir: string; + let ownsCodexHomeDir: boolean; + let codexAccountFeature: { + getSnapshot(): Promise; + dispose(): Promise; + } | null; + let providerConnectionService: { + setCodexAccountFeature(feature: { getSnapshot(): Promise } | null): void; + } | null; let svc: { stopTeam(teamName: string): Promise; isTeamAlive(teamName: string): boolean; @@ -89,9 +97,17 @@ liveDescribe('Member work sync Codex live e2e', () => { previousNudgeFlag = process.env.CLAUDE_TEAM_MEMBER_WORK_SYNC_NUDGES_ENABLED; previousCodexHome = process.env.CODEX_HOME; - const codexHomeRoot = path.resolve('temp', 'member-work-sync-codex-live'); - await fs.mkdir(codexHomeRoot, { recursive: true }); - codexHomeDir = await fs.mkdtemp(path.join(codexHomeRoot, 'codex-home-')); + const shouldUseConnectedAccountHome = allowConnectedChatGptAccount && !hasLiveCodexApiKey(); + if (shouldUseConnectedAccountHome) { + codexHomeDir = resolveConnectedCodexHome(previousCodexHome); + ownsCodexHomeDir = false; + await fs.access(codexHomeDir); + } else { + const codexHomeRoot = path.resolve('temp', 'member-work-sync-codex-live'); + await fs.mkdir(codexHomeRoot, { recursive: true }); + codexHomeDir = await fs.mkdtemp(path.join(codexHomeRoot, 'codex-home-')); + ownsCodexHomeDir = true; + } process.env.CLAUDE_AGENT_TEAMS_ORCHESTRATOR_CLI_PATH = process.env.CLAUDE_AGENT_TEAMS_ORCHESTRATOR_CLI_PATH?.trim() || DEFAULT_ORCHESTRATOR_CLI; @@ -99,6 +115,8 @@ liveDescribe('Member work sync Codex live e2e', () => { process.env.CLAUDE_TEAM_MEMBER_WORK_SYNC_NUDGES_ENABLED = '0'; process.env.CODEX_HOME = codexHomeDir; + codexAccountFeature = null; + providerConnectionService = null; svc = null; feature = null; controlServer = null; @@ -110,7 +128,9 @@ liveDescribe('Member work sync Codex live e2e', () => { await svc.stopTeam(teamName).catch(() => undefined); } svc?.setControlApiBaseUrlResolver(null); + providerConnectionService?.setCodexAccountFeature(null); await feature?.dispose().catch(() => undefined); + await codexAccountFeature?.dispose().catch(() => undefined); await controlServer?.close().catch(() => undefined); restoreEnv('CLAUDE_AGENT_TEAMS_ORCHESTRATOR_CLI_PATH', previousCliPath); @@ -124,7 +144,9 @@ liveDescribe('Member work sync Codex live e2e', () => { console.info(`[MemberWorkSyncCodex.live] preserved CODEX_HOME: ${codexHomeDir}`); } else { await fs.rm(tempDir, { recursive: true, force: true }); - await fs.rm(codexHomeDir, { recursive: true, force: true }); + if (ownsCodexHomeDir) { + await fs.rm(codexHomeDir, { recursive: true, force: true }); + } } }); @@ -155,6 +177,8 @@ liveDescribe('Member work sync Codex live e2e', () => { { TeamTaskReader }, { TeamKanbanManager }, { TeamMembersMetaStore }, + { createCodexAccountFeature }, + { ProviderConnectionService }, ] = await Promise.all([ import('../../../../src/main/services/team/TeamProvisioningService'), import('../../../../src/main/services/team/TeamDataService'), @@ -162,8 +186,29 @@ liveDescribe('Member work sync Codex live e2e', () => { import('../../../../src/main/services/team/TeamTaskReader'), import('../../../../src/main/services/team/TeamKanbanManager'), import('../../../../src/main/services/team/TeamMembersMetaStore'), + import('../../../../src/features/codex-account/main/composition/createCodexAccountFeature'), + import('../../../../src/main/services/runtime/ProviderConnectionService'), ]); + codexAccountFeature = createCodexAccountFeature({ + logger: { + info: () => undefined, + warn: () => undefined, + error: () => undefined, + }, + configManager: { + getConfig: () => ({ + providerConnections: { + codex: { + preferredAuthMode: hasLiveCodexApiKey() ? 'auto' : ('chatgpt' as const), + }, + }, + }), + }, + }); + providerConnectionService = ProviderConnectionService.getInstance(); + providerConnectionService.setCodexAccountFeature(codexAccountFeature); + svc = new TeamProvisioningService(); const activeService = svc; const teamDataService = new TeamDataService(); @@ -336,3 +381,19 @@ async function readFatalRuntimeMessage(teamName: string): Promise } return null; } + +function hasLiveCodexApiKey(): boolean { + return Boolean(process.env.OPENAI_API_KEY?.trim() || process.env.CODEX_API_KEY?.trim()); +} + +function resolveConnectedCodexHome(previousCodexHome: string | undefined): string { + const explicit = process.env.MEMBER_WORK_SYNC_CODEX_CONNECTED_HOME?.trim(); + if (explicit) { + return path.resolve(explicit); + } + const previous = previousCodexHome?.trim(); + if (previous) { + return path.resolve(previous); + } + return path.join(os.userInfo().homedir, '.codex'); +}