import { describe, expect, it } from "vitest"; import { Schema } from "effect"; import { ProviderSendTurnInput, ProviderSessionStartInput } from "./provider"; const decodeProviderSessionStartInput = Schema.decodeUnknownSync(ProviderSessionStartInput); const decodeProviderSendTurnInput = Schema.decodeUnknownSync(ProviderSendTurnInput); describe("ProviderSessionStartInput", () => { it("accepts codex-compatible payloads", () => { const parsed = decodeProviderSessionStartInput({ threadId: "thread-1", provider: "codex", cwd: "/tmp/workspace", model: "gpt-5.3-codex", modelOptions: { codex: { reasoningEffort: "high", fastMode: true, }, }, runtimeMode: "full-access", providerOptions: { codex: { binaryPath: "/usr/local/bin/codex", homePath: "/tmp/.codex", }, }, }); expect(parsed.runtimeMode).toBe("full-access"); expect(parsed.modelOptions?.codex?.reasoningEffort).toBe("high"); expect(parsed.modelOptions?.codex?.fastMode).toBe(true); expect(parsed.providerOptions?.codex?.binaryPath).toBe("/usr/local/bin/codex"); expect(parsed.providerOptions?.codex?.homePath).toBe("/tmp/.codex"); }); it("rejects payloads without runtime mode", () => { expect(() => decodeProviderSessionStartInput({ threadId: "thread-1", provider: "codex", }), ).toThrow(); }); it("accepts claude runtime knobs", () => { const parsed = decodeProviderSessionStartInput({ threadId: "thread-1", provider: "claudeAgent", cwd: "/tmp/workspace", model: "claude-sonnet-4-6", modelOptions: { claudeAgent: { thinking: true, effort: "max", fastMode: true, }, }, providerOptions: { claudeAgent: { binaryPath: "/usr/local/bin/claude", permissionMode: "plan", maxThinkingTokens: 12_000, }, }, runtimeMode: "full-access", }); expect(parsed.provider).toBe("claudeAgent"); expect(parsed.modelOptions?.claudeAgent?.thinking).toBe(true); expect(parsed.modelOptions?.claudeAgent?.effort).toBe("max"); expect(parsed.modelOptions?.claudeAgent?.fastMode).toBe(true); expect(parsed.providerOptions?.claudeAgent?.binaryPath).toBe("/usr/local/bin/claude"); expect(parsed.providerOptions?.claudeAgent?.permissionMode).toBe("plan"); expect(parsed.providerOptions?.claudeAgent?.maxThinkingTokens).toBe(12_000); expect(parsed.runtimeMode).toBe("full-access"); }); }); describe("ProviderSendTurnInput", () => { it("accepts provider-scoped model options", () => { const parsed = decodeProviderSendTurnInput({ threadId: "thread-1", model: "gpt-5.3-codex", modelOptions: { codex: { reasoningEffort: "xhigh", fastMode: true, }, }, }); expect(parsed.model).toBe("gpt-5.3-codex"); expect(parsed.modelOptions?.codex?.reasoningEffort).toBe("xhigh"); expect(parsed.modelOptions?.codex?.fastMode).toBe(true); }); it("accepts claude provider effort options including ultrathink", () => { const parsed = decodeProviderSendTurnInput({ threadId: "thread-1", model: "claude-sonnet-4-6", modelOptions: { claudeAgent: { effort: "ultrathink", fastMode: true, }, }, }); expect(parsed.modelOptions?.claudeAgent?.effort).toBe("ultrathink"); expect(parsed.modelOptions?.claudeAgent?.fastMode).toBe(true); }); });