import { describe, expect, it } from "vitest"; import type { ModelAliasIndex } from "../../agents/model-selection.js"; import type { ClawdbotConfig } from "../../config/config.js"; import { parseInlineDirectives } from "./directive-handling.js"; import { maybeHandleModelDirectiveInfo, resolveModelSelectionFromDirective, } from "./directive-handling.model.js"; function baseAliasIndex(): ModelAliasIndex { return { byAlias: new Map(), byKey: new Map() }; } describe("/model chat UX", () => { it("shows summary for /model with no args", async () => { const directives = parseInlineDirectives("/model"); const cfg = { commands: { text: true } } as unknown as ClawdbotConfig; const reply = await maybeHandleModelDirectiveInfo({ directives, cfg, agentDir: "/tmp/agent", activeAgentId: "main", provider: "anthropic", model: "claude-opus-4-5", defaultProvider: "anthropic", defaultModel: "claude-opus-4-5", aliasIndex: baseAliasIndex(), allowedModelCatalog: [], resetModelOverride: false, }); expect(reply?.text).toContain("Current:"); expect(reply?.text).toContain("Browse: /models"); expect(reply?.text).toContain("Switch: /model "); }); it("auto-applies closest match for typos", () => { const directives = parseInlineDirectives("/model anthropic/claud-opus-4-5"); const cfg = { commands: { text: true } } as unknown as ClawdbotConfig; const resolved = resolveModelSelectionFromDirective({ directives, cfg, agentDir: "/tmp/agent", defaultProvider: "anthropic", defaultModel: "claude-opus-4-5", aliasIndex: baseAliasIndex(), allowedModelKeys: new Set(["anthropic/claude-opus-4-5"]), allowedModelCatalog: [{ provider: "anthropic", id: "claude-opus-4-5" }], provider: "anthropic", }); expect(resolved.modelSelection).toEqual({ provider: "anthropic", model: "claude-opus-4-5", isDefault: true, }); expect(resolved.errorText).toBeUndefined(); }); });