diff --git a/packages/coding-agent/src/cli/tiny-models-cli.ts b/packages/coding-agent/src/cli/tiny-models-cli.ts index 63e534880..ce7f29009 100644 --- a/packages/coding-agent/src/cli/tiny-models-cli.ts +++ b/packages/coding-agent/src/cli/tiny-models-cli.ts @@ -34,9 +34,11 @@ function writeLine(text = ""): void { process.stdout.write(`${text}\n`); } -function resolveModels(model: string | undefined): TinyLocalModelKey[] { +export function resolveModels(model: string | undefined): TinyLocalModelKey[] { if (!model) return [DEFAULT_TINY_TITLE_LOCAL_MODEL_KEY]; - if (model === "all") return TINY_LOCAL_MODELS.map(spec => spec.key); + // `all` is a prefetch convenience: skip models that fail before load (unsupported + // runtime), so the bulk download stays green when every *usable* model succeeds. + if (model === "all") return TINY_LOCAL_MODELS.filter(spec => !spec.unsupportedReason).map(spec => spec.key); if (!isTinyLocalModelKey(model)) { const values = TINY_LOCAL_MODELS.map(spec => spec.key).join(", "); throw new Error(`Unknown tiny local model: ${model}. Expected one of: ${values}, all`); diff --git a/packages/coding-agent/test/tiny-models-cli.test.ts b/packages/coding-agent/test/tiny-models-cli.test.ts new file mode 100644 index 000000000..8cd61a9f3 --- /dev/null +++ b/packages/coding-agent/test/tiny-models-cli.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from "bun:test"; +import { resolveModels } from "@oh-my-pi/pi-coding-agent/cli/tiny-models-cli"; +import { TINY_LOCAL_MODELS } from "@oh-my-pi/pi-coding-agent/tiny/models"; + +describe("tiny-models download model resolution", () => { + it("excludes load-blocked models from `all` so the bulk prefetch stays green", () => { + const unsupported = TINY_LOCAL_MODELS.filter(spec => spec.unsupportedReason).map(spec => spec.key); + // Guard: keep this regression meaningful — at least one registry entry must be load-blocked. + expect(unsupported.length).toBeGreaterThan(0); + + const all = resolveModels("all"); + for (const key of unsupported) expect(all).not.toContain(key); + + const usable = TINY_LOCAL_MODELS.filter(spec => !spec.unsupportedReason).map(spec => spec.key); + for (const key of usable) expect(all).toContain(key); + }); + + it("still resolves an explicitly requested unsupported model (only `all` is filtered)", () => { + const blocked = TINY_LOCAL_MODELS.find(spec => spec.unsupportedReason); + expect(blocked).toBeDefined(); + if (!blocked) return; + expect(resolveModels(blocked.key)).toEqual([blocked.key]); + }); +});