diff --git a/packages/opencode/src/tool/code-mode.ts b/packages/opencode/src/tool/code-mode.ts index 6d4937e081..aab2463e1c 100644 --- a/packages/opencode/src/tool/code-mode.ts +++ b/packages/opencode/src/tool/code-mode.ts @@ -88,22 +88,16 @@ export function groupByServer( return groups } -export function buildCatalog( - mcpTools: Record, - mcpDefs: Record, - servers: readonly string[], -): CatalogEntry[] { - return [...groupByServer(mcpTools, servers, mcpDefs).values()].flat().filter((entry) => entry.tool.execute !== undefined) -} - -export function catalogInstructions( +export function describeCatalog( mcpTools: Record, mcpDefs: Record, servers: readonly string[], ): string { - const catalog = buildCatalog(mcpTools, mcpDefs, servers) return CodeMode.make({ - tools: toolTree(catalog, () => () => Effect.fail(toolError("Tool preview is not executable."))), + tools: toolTree( + [...groupByServer(mcpTools, servers, mcpDefs).values()].flat().filter((entry) => entry.tool.execute !== undefined), + () => () => Effect.fail(toolError("Tool preview is not executable.")), + ), }).instructions() } @@ -288,7 +282,9 @@ export const CodeModeTool = Tool.define( const ruleset = Permission.merge(agent.permission, session.permission ?? []) const mcpTools = Permission.visibleTools(yield* mcp.tools(), ruleset) const servers = Object.keys(yield* mcp.clients()).map(McpCatalog.sanitize) - const catalog = buildCatalog(mcpTools, yield* mcp.defs(), servers) + const catalog = [...groupByServer(mcpTools, servers, yield* mcp.defs()).values()] + .flat() + .filter((entry) => entry.tool.execute !== undefined) const calls: CallEntry[] = [] const attachments: Attachment[] = [] diff --git a/packages/opencode/test/tool/code-mode-integration.test.ts b/packages/opencode/test/tool/code-mode-integration.test.ts index e58addfbb0..f9ed25a831 100644 --- a/packages/opencode/test/tool/code-mode-integration.test.ts +++ b/packages/opencode/test/tool/code-mode-integration.test.ts @@ -1,5 +1,5 @@ import { beforeAll, describe, expect, test } from "bun:test" -import { CodeModeTool, catalogInstructions } from "@/tool/code-mode" +import { CodeModeTool, describeCatalog } from "@/tool/code-mode" import { McpCatalog } from "@/mcp/catalog" import { Agent } from "@/agent/agent" import { MCP } from "@/mcp" @@ -161,7 +161,7 @@ async function buildTool() { ) return { tool: await Effect.runPromise(CodeModeTool.pipe(Effect.flatMap(Tool.init), Effect.provide(layer))), - description: catalogInstructions(mcpTools, mcpDefs, [SERVER]), + description: describeCatalog(mcpTools, mcpDefs, [SERVER]), } } diff --git a/packages/opencode/test/tool/code-mode.test.ts b/packages/opencode/test/tool/code-mode.test.ts index e1e3c8dcaf..79c27f8f33 100644 --- a/packages/opencode/test/tool/code-mode.test.ts +++ b/packages/opencode/test/tool/code-mode.test.ts @@ -3,7 +3,7 @@ import { CODE_MODE_TOOL, CodeModeTool, Parameters, - catalogInstructions, + describeCatalog, formatValue, groupByServer, toSandboxResult, @@ -100,7 +100,7 @@ function describeFor( servers?: string[], permission: PermissionV1.Rule[] = [], ) { - return catalogInstructions(Permission.visibleTools(mcpTools, permission), defs, serverNames(mcpTools, servers)) + return describeCatalog(Permission.visibleTools(mcpTools, permission), defs, serverNames(mcpTools, servers)) } describe("code mode execute", () => {