diff --git a/packages/adapter-utils/src/types.ts b/packages/adapter-utils/src/types.ts index ce89e0e80b..345583e4c2 100644 --- a/packages/adapter-utils/src/types.ts +++ b/packages/adapter-utils/src/types.ts @@ -271,7 +271,7 @@ export interface ServerAdapterModule { sessionManagement?: import("./session-compaction.js").AdapterSessionManagement; supportsLocalAgentJwt?: boolean; models?: AdapterModel[]; - listModels?: () => Promise; + listModels?: (opts?: { command?: string }) => Promise; agentConfigurationDoc?: string; /** * Optional lifecycle hook when an agent is approved/hired (join-request or hire_agent approval). diff --git a/packages/adapters/opencode-local/src/server/models.test.ts b/packages/adapters/opencode-local/src/server/models.test.ts index cd49e4a274..6d12fe9629 100644 --- a/packages/adapters/opencode-local/src/server/models.test.ts +++ b/packages/adapters/opencode-local/src/server/models.test.ts @@ -16,6 +16,12 @@ describe("openCode models", () => { await expect(listOpenCodeModels()).resolves.toEqual([]); }); + it("uses command option when provided", async () => { + await expect( + listOpenCodeModels({ command: "__paperclip_missing_opencode_command__" }), + ).resolves.toEqual([]); + }); + it("rejects when model is missing", async () => { await expect( ensureOpenCodeModelConfiguredAndAvailable({ model: "" }), diff --git a/packages/adapters/opencode-local/src/server/models.ts b/packages/adapters/opencode-local/src/server/models.ts index 95cb1fc943..fc64393875 100644 --- a/packages/adapters/opencode-local/src/server/models.ts +++ b/packages/adapters/opencode-local/src/server/models.ts @@ -197,9 +197,9 @@ export async function ensureOpenCodeModelConfiguredAndAvailable(input: { return models; } -export async function listOpenCodeModels(): Promise { +export async function listOpenCodeModels(opts?: { command?: string }): Promise { try { - return await discoverOpenCodeModelsCached(); + return await discoverOpenCodeModelsCached({ command: opts?.command }); } catch { return []; } diff --git a/server/src/adapters/registry.ts b/server/src/adapters/registry.ts index 67a8e95ba2..041ab860f8 100644 --- a/server/src/adapters/registry.ts +++ b/server/src/adapters/registry.ts @@ -205,11 +205,11 @@ export function getServerAdapter(type: string): ServerAdapterModule { return adapter; } -export async function listAdapterModels(type: string): Promise<{ id: string; label: string }[]> { +export async function listAdapterModels(type: string, opts?: { command?: string }): Promise<{ id: string; label: string }[]> { const adapter = adaptersByType.get(type); if (!adapter) return []; if (adapter.listModels) { - const discovered = await adapter.listModels(); + const discovered = await adapter.listModels(opts); if (discovered.length > 0) return discovered; } return adapter.models ?? []; diff --git a/server/src/routes/agents.ts b/server/src/routes/agents.ts index f642eb10f5..6da1ad5195 100644 --- a/server/src/routes/agents.ts +++ b/server/src/routes/agents.ts @@ -667,7 +667,15 @@ export function agentRoutes(db: Db) { const companyId = req.params.companyId as string; assertCompanyAccess(req, companyId); const type = req.params.type as string; - const models = await listAdapterModels(type); + const agentId = typeof req.query.agentId === "string" ? req.query.agentId : undefined; + let command: string | undefined; + if (agentId) { + const agent = await svc.getById(agentId); + if (agent && agent.companyId === companyId && agent.adapterConfig && typeof agent.adapterConfig.command === "string") { + command = agent.adapterConfig.command; + } + } + const models = await listAdapterModels(type, command ? { command } : undefined); res.json(models); });