declare const require: (name: string) => any const { describe, test, expect, beforeEach, afterEach, spyOn, mock } = require("bun:test") import { resolveCategoryExecution } from "./category-resolver" import type { ExecutorContext } from "./executor-types" import * as connectedProvidersCache from "../../shared/connected-providers-cache" describe("resolveCategoryExecution", () => { let connectedProvidersSpy: ReturnType | undefined let providerModelsSpy: ReturnType | undefined let hasConnectedProvidersSpy: ReturnType | undefined let hasProviderModelsSpy: ReturnType | undefined beforeEach(() => { mock.restore() connectedProvidersSpy = spyOn(connectedProvidersCache, "readConnectedProvidersCache").mockReturnValue(null) providerModelsSpy = spyOn(connectedProvidersCache, "readProviderModelsCache").mockReturnValue(null) hasConnectedProvidersSpy = spyOn(connectedProvidersCache, "hasConnectedProvidersCache").mockReturnValue(false) hasProviderModelsSpy = spyOn(connectedProvidersCache, "hasProviderModelsCache").mockReturnValue(false) }) afterEach(() => { connectedProvidersSpy?.mockRestore() providerModelsSpy?.mockRestore() hasConnectedProvidersSpy?.mockRestore() hasProviderModelsSpy?.mockRestore() }) const createMockExecutorContext = (): ExecutorContext => ({ client: {} as any, manager: {} as any, directory: "/tmp/test", userCategories: {}, sisyphusJuniorModel: undefined, }) test("returns unpinned resolution when category cache is not ready on first run", async () => { //#given const args = { category: "deep", prompt: "test prompt", description: "Test task", run_in_background: false, load_skills: [], blockedBy: undefined, enableSkillTools: false, } const executorCtx = createMockExecutorContext() executorCtx.userCategories = { deep: {}, } const inheritedModel = undefined const systemDefaultModel = "anthropic/claude-sonnet-4-6" //#when const result = await resolveCategoryExecution(args, executorCtx, inheritedModel, systemDefaultModel) //#then expect(result.error).toBeUndefined() expect(result.actualModel).toBeUndefined() expect(result.categoryModel).toBeUndefined() expect(result.agentToUse).toBeDefined() }) test("returns 'unknown category' error for truly unknown categories", async () => { //#given const args = { category: "definitely-not-a-real-category-xyz123", prompt: "test prompt", description: "Test task", run_in_background: false, load_skills: [], blockedBy: undefined, enableSkillTools: false, } const executorCtx = createMockExecutorContext() const inheritedModel = undefined const systemDefaultModel = "anthropic/claude-sonnet-4-6" //#when const result = await resolveCategoryExecution(args, executorCtx, inheritedModel, systemDefaultModel) //#then expect(result.error).toBeDefined() expect(result.error).toContain("Unknown category") expect(result.error).toContain("definitely-not-a-real-category-xyz123") }) test("uses category fallback_models for background/runtime fallback chain", async () => { //#given const args = { category: "deep", prompt: "test prompt", description: "Test task", run_in_background: false, load_skills: [], blockedBy: undefined, enableSkillTools: false, } const executorCtx = createMockExecutorContext() executorCtx.userCategories = { deep: { model: "quotio/claude-opus-4-6", fallback_models: ["quotio/kimi-k2.5", "openai/gpt-5.2(high)"], }, } //#when const result = await resolveCategoryExecution(args, executorCtx, undefined, "anthropic/claude-sonnet-4-6") //#then expect(result.error).toBeUndefined() expect(result.fallbackChain).toEqual([ { providers: ["quotio"], model: "kimi-k2.5", variant: undefined }, { providers: ["openai"], model: "gpt-5.2", variant: "high" }, ]) }) })