diff --git a/src/commands/doctor-session-state-providers.test.ts b/src/commands/doctor-session-state-providers.test.ts index 786b3ccec5c..ef9edb661f8 100644 --- a/src/commands/doctor-session-state-providers.test.ts +++ b/src/commands/doctor-session-state-providers.test.ts @@ -3,6 +3,7 @@ import { applySessionRouteStateRepair, resolveConfiguredDoctorSessionStateRoute, scanSessionRouteStateOwners, + storeMayContainPluginSessionRouteState, } from "./doctor-session-state-providers.js"; const codexOwner = { @@ -15,6 +16,35 @@ const codexOwner = { }; describe("doctor session state provider routes", () => { + it("skips plugin route-state scans for unrelated recovery metadata", () => { + expect( + storeMayContainPluginSessionRouteState({ + "agent:main:subagent:wedged-child": { + sessionId: "session-wedged-child", + updatedAt: 1, + abortedLastRun: true, + subagentRecovery: { + automaticAttempts: 2, + lastAttemptAt: 1, + wedgedAt: 2, + wedgedReason: "blocked", + }, + }, + }), + ).toBe(false); + + expect( + storeMayContainPluginSessionRouteState({ + "agent:main:telegram:direct:1": { + sessionId: "session-codex", + updatedAt: 1, + modelProvider: "openai-codex", + model: "gpt-5.4", + }, + }), + ).toBe(true); + }); + it("preserves raw configured CLI runtimes before harness policy normalization", () => { expect( resolveConfiguredDoctorSessionStateRoute({ diff --git a/src/commands/doctor-session-state-providers.ts b/src/commands/doctor-session-state-providers.ts index e35bf45d7dc..7e775f16997 100644 --- a/src/commands/doctor-session-state-providers.ts +++ b/src/commands/doctor-session-state-providers.ts @@ -126,6 +126,29 @@ function resolvePluginDoctorSessionRouteStateOwners(params: { return listPluginDoctorSessionRouteStateOwners({ env: params.env }); } +function entryMayContainPluginSessionRouteState(entry: SessionEntry): boolean { + const record = entry as unknown as Record; + return ( + normalizeString(record.providerOverride) !== undefined || + normalizeString(record.modelOverride) !== undefined || + normalizeString(record.modelOverrideSource) !== undefined || + record.liveModelSwitchPending !== undefined || + normalizeString(record.modelProvider) !== undefined || + normalizeString(record.model) !== undefined || + normalizeString(record.agentHarnessId) !== undefined || + record.cliSessionBindings !== undefined || + record.cliSessionIds !== undefined || + normalizeString(record.authProfileOverride) !== undefined || + normalizeString(record.authProfileOverrideSource) !== undefined + ); +} + +export function storeMayContainPluginSessionRouteState( + store: Record, +): boolean { + return Object.values(store).some((entry) => entryMayContainPluginSessionRouteState(entry)); +} + export type DoctorSessionRouteState = { defaultProvider: string; configuredModelRefs: string[]; @@ -434,6 +457,9 @@ export async function runPluginSessionStateDoctorRepairs(params: { warnings: string[]; changes: string[]; }): Promise { + if (!storeMayContainPluginSessionRouteState(params.store)) { + return; + } const owners = resolvePluginDoctorSessionRouteStateOwners({ env: params.env }); if (owners.length === 0) { return;