Files
oh-my-pi/packages/coding-agent/src/tools/renderers.ts
T
maximhar 94ad651d17 feat: add MCP tool discovery search (#352)
* Add MCP tool discovery search and live refresh

* Fix MCP discovery review feedback

* Address remaining MCP discovery review comments

* feat: compact MCP discovery search results

* fix: align MCP discovery search contract

* feat: add MCP server tool counts to discovery hints

* fix(agent): corrected stale toolChoice validation against active tools

- Fixed stale forced toolChoice passed to provider after mid-turn tool refresh by validating against active tools.
- Added refreshToolChoiceForActiveTools() to filter invalid tool choices when available tools change.
- Changed getToolChoice config to use computed function instead of static property for dynamic validation.
- Fixed MCP tool selection tracking in coding-agent to distinguish between discovery-enabled and non-discovery sessions.
- Updated search_tool_bm25 to filter already-selected tools before applying limit parameter.

---------

Co-authored-by: can1357 <me@can.ac>
2026-03-16 13:43:43 +01:00

67 lines
2.8 KiB
TypeScript

/**
* TUI renderers for built-in tools.
*
* These provide rich visualization for tool calls and results in the TUI.
*/
import type { Component } from "@oh-my-pi/pi-tui";
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
import { lspToolRenderer } from "../lsp/render";
import type { Theme } from "../modes/theme/theme";
import { editToolRenderer } from "../patch";
import { taskToolRenderer } from "../task/render";
import { webSearchToolRenderer } from "../web/search/render";
import { askToolRenderer } from "./ask";
import { astEditToolRenderer } from "./ast-edit";
import { astGrepToolRenderer } from "./ast-grep";
import { bashToolRenderer } from "./bash";
import { calculatorToolRenderer } from "./calculator";
import { fetchToolRenderer } from "./fetch";
import { findToolRenderer } from "./find";
import { grepToolRenderer } from "./grep";
import { inspectImageToolRenderer } from "./inspect-image-renderer";
import { notebookToolRenderer } from "./notebook";
import { pythonToolRenderer } from "./python";
import { readToolRenderer } from "./read";
import { resolveToolRenderer } from "./resolve";
import { searchToolBm25Renderer } from "./search-tool-bm25";
import { sshToolRenderer } from "./ssh";
import { todoWriteToolRenderer } from "./todo-write";
import { writeToolRenderer } from "./write";
type ToolRenderer = {
renderCall: (args: unknown, options: RenderResultOptions, theme: Theme) => Component;
renderResult: (
result: { content: Array<{ type: string; text?: string }>; details?: unknown; isError?: boolean },
options: RenderResultOptions & { renderContext?: Record<string, unknown> },
theme: Theme,
args?: unknown,
) => Component;
mergeCallAndResult?: boolean;
/** Render without background box, inline in the response flow */
inline?: boolean;
};
export const toolRenderers: Record<string, ToolRenderer> = {
ask: askToolRenderer as ToolRenderer,
ast_grep: astGrepToolRenderer as ToolRenderer,
ast_edit: astEditToolRenderer as ToolRenderer,
bash: bashToolRenderer as ToolRenderer,
python: pythonToolRenderer as ToolRenderer,
calc: calculatorToolRenderer as ToolRenderer,
edit: editToolRenderer as ToolRenderer,
find: findToolRenderer as ToolRenderer,
grep: grepToolRenderer as ToolRenderer,
lsp: lspToolRenderer as ToolRenderer,
notebook: notebookToolRenderer as ToolRenderer,
inspect_image: inspectImageToolRenderer as ToolRenderer,
read: readToolRenderer as ToolRenderer,
resolve: resolveToolRenderer as ToolRenderer,
search_tool_bm25: searchToolBm25Renderer as ToolRenderer,
ssh: sshToolRenderer as ToolRenderer,
task: taskToolRenderer as ToolRenderer,
todo_write: todoWriteToolRenderer as ToolRenderer,
fetch: fetchToolRenderer as ToolRenderer,
web_search: webSearchToolRenderer as ToolRenderer,
write: writeToolRenderer as ToolRenderer,
};