import { describe, expect, it } from "vitest"; import { createEnvRuntimeSettings } from "../../src/settings/runtime.js"; describe("runtime settings", () => { it("reads the model registry from the current env at call time", async () => { const env: Record = { ANTHROPIC_DEFAULT_SONNET_MODEL: "anthropic/claude-sonnet-5", }; const settings = createEnvRuntimeSettings(env); expect((await settings.modelRegistry()).resolve(undefined, "draft")).toBe("anthropic/claude-sonnet-5"); env["ANTHROPIC_DEFAULT_SONNET_MODEL"] = "z-ai/glm-4.7"; expect((await settings.modelRegistry()).resolve(undefined, "draft")).toBe("z-ai/glm-4.7"); }); it("returns provider SDK env without requiring global process env mutation", async () => { const settings = createEnvRuntimeSettings({ ANTHROPIC_BASE_URL: "https://example.test/api", ANTHROPIC_AUTH_TOKEN: "openrouter-token", ANTHROPIC_API_KEY: "explicit-api-key", }); await expect(settings.provider("openrouter")).resolves.toMatchObject({ id: "openrouter", baseUrl: "https://example.test/api", authToken: "openrouter-token", anthropicApiKey: "explicit-api-key", sdkEnv: { ANTHROPIC_BASE_URL: "https://example.test/api", ANTHROPIC_AUTH_TOKEN: "openrouter-token", ANTHROPIC_API_KEY: "explicit-api-key", }, }); }); it("defaults Anthropic API key to empty for OpenRouter's Anthropic skin", async () => { const settings = createEnvRuntimeSettings({ ANTHROPIC_AUTH_TOKEN: "openrouter-token", }); await expect(settings.provider("openrouter")).resolves.toMatchObject({ baseUrl: "https://openrouter.ai/api", anthropicApiKey: "", sdkEnv: { ANTHROPIC_API_KEY: "", }, }); }); it("requires an auth token for the OpenRouter provider", async () => { const settings = createEnvRuntimeSettings({}); await expect(settings.provider("openrouter")).rejects.toThrow("missing required runtime setting: ANTHROPIC_AUTH_TOKEN"); }); it("honors HUB_AGENT_MAX_TURNS as a runtime run policy", async () => { const settings = createEnvRuntimeSettings({ HUB_AGENT_MAX_TURNS: "9", }); await expect(settings.runPolicy({ projectId: "p", roleId: "draft" })).resolves.toEqual({ maxTurns: 9 }); }); });