diff --git a/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx b/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx index 5ce041c9..9efaccae 100644 --- a/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx +++ b/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx @@ -34,9 +34,9 @@ export function shouldShowCodexReconnectPrompt({ (provider) => provider.providerId === 'codex' ); const codexConnection = codexProvider?.connection?.codex; - const loginStatus = codexConnection?.login.status; + const loginStatus = codexConnection?.login?.status; const loginPending = loginStatus === 'starting' || loginStatus === 'pending'; - if (loginPending && codexConnection?.login.authUrl) { + if (loginPending && codexConnection?.login?.authUrl) { return true; } diff --git a/src/renderer/components/team/dialogs/projectPathOptions.ts b/src/renderer/components/team/dialogs/projectPathOptions.ts index 435d228a..b3dba417 100644 --- a/src/renderer/components/team/dialogs/projectPathOptions.ts +++ b/src/renderer/components/team/dialogs/projectPathOptions.ts @@ -14,14 +14,19 @@ export interface ProjectPathOptionMeta { } function toProjectOption(project: ProjectPathProject): ComboboxOption { - return { + const option: ComboboxOption = { value: project.path, label: project.name, description: project.path, - meta: { - discoverySource: project.discoverySource, - } satisfies ProjectPathOptionMeta, }; + + if (project.discoverySource !== undefined) { + option.meta = { + discoverySource: project.discoverySource, + } satisfies ProjectPathOptionMeta; + } + + return option; } /** diff --git a/test/renderer/components/team/dialogs/LaunchTeamDialog.test.ts b/test/renderer/components/team/dialogs/LaunchTeamDialog.test.ts index b3b5a005..10b545bf 100644 --- a/test/renderer/components/team/dialogs/LaunchTeamDialog.test.ts +++ b/test/renderer/components/team/dialogs/LaunchTeamDialog.test.ts @@ -40,6 +40,7 @@ vi.mock('@renderer/api', () => ({ createdAt: 1, }, ]), + getDashboardRecentProjects: vi.fn(async () => ({ projects: [] })), teams: { getSavedRequest: vi.fn(async () => null), replaceMembers: vi.fn(async () => {}), diff --git a/test/renderer/store/teamChangeThrottle.test.ts b/test/renderer/store/teamChangeThrottle.test.ts index 1f5e05f9..162d2270 100644 --- a/test/renderer/store/teamChangeThrottle.test.ts +++ b/test/renderer/store/teamChangeThrottle.test.ts @@ -1280,7 +1280,7 @@ describe('team change throttling', () => { expect(refreshTeamChangePresenceSpy).toHaveBeenCalledWith('my-team'); }); - it('polls unknown in-progress tasks in round-robin order without starving later tasks', async () => { + it('keeps background polling disabled for unknown in-progress tasks', async () => { const invalidateTaskChangePresence = vi.fn(); const checkTaskHasChanges = vi.fn(async () => undefined); @@ -1321,24 +1321,11 @@ describe('team change throttling', () => { checkTaskHasChanges, } as never); - await vi.advanceTimersByTimeAsync(10_000); - expect(checkTaskHasChanges).toHaveBeenNthCalledWith( - 1, - 'my-team', - 'task-1', - expect.objectContaining({ status: 'in_progress', owner: 'alice' }) - ); - - await vi.advanceTimersByTimeAsync(10_000); - expect(checkTaskHasChanges).toHaveBeenNthCalledWith( - 2, - 'my-team', - 'task-2', - expect.objectContaining({ status: 'in_progress', owner: 'alice' }) - ); + await vi.advanceTimersByTimeAsync(20_000); + expect(checkTaskHasChanges).not.toHaveBeenCalled(); }); - it('polls visible non-selected graph teams from cached team data', async () => { + it('keeps background polling disabled for visible non-selected graph teams', async () => { const invalidateTaskChangePresence = vi.fn(); const checkTaskHasChanges = vi.fn(async () => undefined); @@ -1400,21 +1387,8 @@ describe('team change throttling', () => { checkTaskHasChanges, } as never); - await vi.advanceTimersByTimeAsync(10_000); - expect(checkTaskHasChanges).toHaveBeenNthCalledWith( - 1, - 'my-team', - 'task-1', - expect.objectContaining({ status: 'in_progress', owner: 'alice' }) - ); - - await vi.advanceTimersByTimeAsync(10_000); - expect(checkTaskHasChanges).toHaveBeenNthCalledWith( - 2, - 'my-team', - 'task-2', - expect.objectContaining({ status: 'in_progress', owner: 'alice' }) - ); + await vi.advanceTimersByTimeAsync(20_000); + expect(checkTaskHasChanges).not.toHaveBeenCalled(); }); it('per-team throttling: busy team does not block another visible team', async () => { diff --git a/test/renderer/utils/teamModelAvailability.test.ts b/test/renderer/utils/teamModelAvailability.test.ts index 04249b71..cb7f3540 100644 --- a/test/renderer/utils/teamModelAvailability.test.ts +++ b/test/renderer/utils/teamModelAvailability.test.ts @@ -204,6 +204,7 @@ describe('teamModelAvailability', () => { expect(getTeamModelSelectionError('codex', 'gpt-5.4', providerStatus)).toBeNull(); expect(getAvailableTeamProviderModelOptions('codex', providerStatus)).toEqual([ { value: '', label: 'Default', badgeLabel: 'Default' }, + { value: 'gpt-5.5', label: '5.5', badgeLabel: '5.5' }, { value: 'gpt-5.4', label: '5.4', badgeLabel: '5.4' }, { value: 'gpt-5.4-mini', label: '5.4 Mini', badgeLabel: '5.4-mini' }, { value: 'gpt-5.3-codex', label: '5.3 Codex', badgeLabel: '5.3-codex' },