import { describe, expect, it } from "vitest"; import { getComposerProviderState } from "./composerProviderRegistry"; describe("getComposerProviderState", () => { it("returns codex defaults when no codex draft options exist", () => { const state = getComposerProviderState({ provider: "codex", model: "gpt-5.4", prompt: "", modelOptions: undefined, }); expect(state).toEqual({ provider: "codex", promptEffort: "high", modelOptionsForDispatch: undefined, }); }); it("normalizes codex dispatch options while preserving the selected effort", () => { const state = getComposerProviderState({ provider: "codex", model: "gpt-5.4", prompt: "", modelOptions: { codex: { reasoningEffort: "low", fastMode: true, }, }, }); expect(state).toEqual({ provider: "codex", promptEffort: "low", modelOptionsForDispatch: { reasoningEffort: "low", fastMode: true, }, }); }); it("preserves codex fast mode when it is the only active option", () => { const state = getComposerProviderState({ provider: "codex", model: "gpt-5.4", prompt: "", modelOptions: { codex: { fastMode: true, }, }, }); expect(state).toEqual({ provider: "codex", promptEffort: "high", modelOptionsForDispatch: { fastMode: true, }, }); }); it("drops explicit codex default/off overrides from dispatch while keeping the selected effort label", () => { const state = getComposerProviderState({ provider: "codex", model: "gpt-5.4", prompt: "", modelOptions: { codex: { reasoningEffort: "high", fastMode: false, }, }, }); expect(state).toEqual({ provider: "codex", promptEffort: "high", modelOptionsForDispatch: undefined, }); }); it("returns Claude defaults for effort-capable models", () => { const state = getComposerProviderState({ provider: "claudeAgent", model: "claude-sonnet-4-6", prompt: "", modelOptions: undefined, }); expect(state).toEqual({ provider: "claudeAgent", promptEffort: "high", modelOptionsForDispatch: undefined, }); }); it("tracks Claude ultrathink from the prompt without changing dispatch effort", () => { const state = getComposerProviderState({ provider: "claudeAgent", model: "claude-sonnet-4-6", prompt: "Ultrathink:\nInvestigate this failure", modelOptions: { claudeAgent: { effort: "medium", }, }, }); expect(state).toEqual({ provider: "claudeAgent", promptEffort: "medium", modelOptionsForDispatch: { effort: "medium", }, composerFrameClassName: "ultrathink-frame", composerSurfaceClassName: "shadow-[0_0_0_1px_rgba(255,255,255,0.04)_inset]", modelPickerIconClassName: "ultrathink-chroma", }); }); it("drops unsupported Claude effort options for models without effort controls", () => { const state = getComposerProviderState({ provider: "claudeAgent", model: "claude-haiku-4-5", prompt: "", modelOptions: { claudeAgent: { effort: "max", thinking: false, }, }, }); expect(state).toEqual({ provider: "claudeAgent", promptEffort: null, modelOptionsForDispatch: { thinking: false, }, }); }); it("preserves Claude fast mode when it is the only active option", () => { const state = getComposerProviderState({ provider: "claudeAgent", model: "claude-opus-4-6", prompt: "", modelOptions: { claudeAgent: { fastMode: true, }, }, }); expect(state).toEqual({ provider: "claudeAgent", promptEffort: "high", modelOptionsForDispatch: { fastMode: true, }, }); }); it("drops explicit Claude default/off overrides from dispatch while keeping the selected effort label", () => { const state = getComposerProviderState({ provider: "claudeAgent", model: "claude-opus-4-6", prompt: "", modelOptions: { claudeAgent: { effort: "high", fastMode: false, }, }, }); expect(state).toEqual({ provider: "claudeAgent", promptEffort: "high", modelOptionsForDispatch: undefined, }); }); });