diff --git a/apps/server/src/provider/opencodeRuntime.cliParsers.test.ts b/apps/server/src/provider/opencodeRuntime.cliParsers.test.ts index 8d5ba353389d..18f0126a8faf 100644 --- a/apps/server/src/provider/opencodeRuntime.cliParsers.test.ts +++ b/apps/server/src/provider/opencodeRuntime.cliParsers.test.ts @@ -62,6 +62,25 @@ describe("parseModelsCliOutput", () => { NodeAssert.equal(Object.keys(result.providers.get("openai")!.models).length, 1); }); + it("parses model IDs with spaces without dropping the preceding model", () => { + const stdout = [ + "custom/model-one", + JSON.stringify({ + id: "model-one", + providerID: "custom", + name: "Model One", + }), + "custom/Model Two", + JSON.stringify({ id: "Model Two", providerID: "custom", name: "Model Two" }), + ].join("\n"); + + const result = parseModelsCliOutput(stdout); + const provider = result.providers.get("custom")!; + + NodeAssert.ok(provider.models["model-one"]); + NodeAssert.ok(provider.models["Model Two"]); + }); + it("handles empty input", () => { const result = parseModelsCliOutput(""); NodeAssert.equal(result.providers.size, 0); diff --git a/apps/server/src/provider/opencodeRuntime.ts b/apps/server/src/provider/opencodeRuntime.ts index 2ff4fa1292f2..495dccc0072b 100644 --- a/apps/server/src/provider/opencodeRuntime.ts +++ b/apps/server/src/provider/opencodeRuntime.ts @@ -196,7 +196,7 @@ function parseServerUrlFromOutput(output: string): string | null { return null; } -const SLUG_LINE_RE = /^(\S+\/\S+)\s*$/; +const SLUG_LINE_RE = /^(\S+\/.*\S)\s*$/; const AGENT_HEADER_RE = /^(.+)\s+\((\S+)\)\s*$/; // Agents that are always hidden in OpenCode but the CLI "agent list" command