
























@@ -10,6 +10,10 @@ const state = vi.hoisted(() => ({
1010clearAgentRunContextMock: vi.fn(),
1111updateSessionStoreAfterAgentRunMock: vi.fn(),
1212deliverAgentCommandResultMock: vi.fn(),
13+clearSessionAuthProfileOverrideMock: vi.fn(),
14+authProfileStoreMock: { profiles: {} } as { profiles: Record<string, unknown> },
15+sessionEntryMock: undefined as unknown,
16+sessionStoreMock: undefined as unknown,
1317}));
14181519vi.mock("./model-fallback.js", () => ({
@@ -57,12 +61,12 @@ vi.mock("./command/session.js", () => ({
5761resolveSession: () => ({
5862sessionId: "session-1",
5963sessionKey: "agent:main",
60-sessionEntry: {
64+sessionEntry: state.sessionEntryMock ?? {
6165sessionId: "session-1",
6266updatedAt: Date.now(),
6367skillsSnapshot: { prompt: "", skills: [], version: 0 },
6468},
65-sessionStore: undefined,
69+sessionStore: state.sessionStoreMock,
6670storePath: undefined,
6771isNewSession: false,
6872persistedThinking: undefined,
@@ -250,8 +254,13 @@ vi.mock("./auth-profiles.js", () => ({
250254ensureAuthProfileStore: () => ({ profiles: {} }),
251255}));
252256257+vi.mock("./auth-profiles/store.js", () => ({
258+ensureAuthProfileStore: () => state.authProfileStoreMock,
259+}));
260+253261vi.mock("./auth-profiles/session-override.js", () => ({
254-clearSessionAuthProfileOverride: vi.fn(),
262+clearSessionAuthProfileOverride: (...args: unknown[]) =>
263+state.clearSessionAuthProfileOverrideMock(...args),
255264}));
256265257266vi.mock("./defaults.js", () => ({
@@ -269,7 +278,12 @@ vi.mock("./model-catalog.js", () => ({
269278270279vi.mock("./model-selection.js", () => ({
271280buildAllowedModelSet: () => ({
272-allowedKeys: new Set<string>(["anthropic/claude", "openai/claude", "openai/gpt-5.4"]),
281+allowedKeys: new Set<string>([
282+"anthropic/claude",
283+"codex-cli/gpt-5.4",
284+"openai/claude",
285+"openai/gpt-5.4",
286+]),
273287allowedCatalog: [],
274288allowAny: false,
275289}),
@@ -281,6 +295,12 @@ vi.mock("./model-selection.js", () => ({
281295resolveThinkingDefault: () => "low",
282296}));
283297298+vi.mock("./provider-auth-aliases.js", () => ({
299+resolveProviderAuthAliasMap: () => ({}),
300+resolveProviderIdForAuth: (provider: string) =>
301+provider.trim().toLowerCase() === "codex-cli" ? "openai-codex" : provider.trim().toLowerCase(),
302+}));
303+284304vi.mock("./skills.js", () => ({
285305buildWorkspaceSkillSnapshot: () => ({}),
286306}));
@@ -376,6 +396,9 @@ function expectFallbackOverrideCalls(first: boolean, second: boolean) {
376396describe("agentCommand – LiveSessionModelSwitchError retry", () => {
377397beforeEach(() => {
378398vi.clearAllMocks();
399+state.authProfileStoreMock = { profiles: {} };
400+state.sessionEntryMock = undefined;
401+state.sessionStoreMock = undefined;
379402state.deliverAgentCommandResultMock.mockResolvedValue(undefined);
380403state.updateSessionStoreAfterAgentRunMock.mockResolvedValue(undefined);
381404});
@@ -450,6 +473,48 @@ describe("agentCommand – LiveSessionModelSwitchError retry", () => {
450473expect(state.runWithModelFallbackMock).toHaveBeenCalledTimes(2);
451474});
452475476+it("keeps aliased session auth profiles for codex-cli runs", async () => {
477+let capturedAuthProfileProvider: string | undefined;
478+const sessionEntry = {
479+sessionId: "session-1",
480+updatedAt: Date.now(),
481+providerOverride: "codex-cli",
482+modelOverride: "gpt-5.4",
483+authProfileOverride: "openai-codex:work",
484+authProfileOverrideSource: "user",
485+skillsSnapshot: { prompt: "", skills: [], version: 0 },
486+};
487+state.sessionEntryMock = sessionEntry;
488+state.authProfileStoreMock = {
489+profiles: {
490+"openai-codex:work": {
491+type: "api_key",
492+provider: "openai-codex",
493+key: "sk-test",
494+},
495+},
496+};
497+state.runWithModelFallbackMock.mockImplementation(async (params: FallbackRunnerParams) => {
498+const result = await params.run(params.provider, params.model);
499+return {
500+ result,
501+provider: params.provider,
502+model: params.model,
503+attempts: [],
504+};
505+});
506+state.runAgentAttemptMock.mockImplementation(async (...args: unknown[]) => {
507+const attemptParams = args[0] as { authProfileProvider?: string } | undefined;
508+capturedAuthProfileProvider = attemptParams?.authProfileProvider;
509+return makeSuccessResult("codex-cli", "gpt-5.4");
510+});
511+512+await runBasicAgentCommand();
513+514+expect(capturedAuthProfileProvider).toBe("codex-cli");
515+expect(state.clearSessionAuthProfileOverrideMock).not.toHaveBeenCalled();
516+});
517+453518it("updates hasSessionModelOverride for fallback resolution after switch", async () => {
454519setupModelSwitchRetry({
455520provider: "openai",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。