112 lines · 3.5 KB · TypeScript
RawDownload
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);  });});