/** * OpenCode Tool Wrapper - 供 Python 调用的命令行接口 * * 用法: * bun run tool-wrapper.ts * * 示例: * bun run tool-wrapper.ts read '{"filePath": "config.py"}' * * 支持的工具: * - read: 读取文件 * - edit: 编辑文件 * - write: 写入文件 * - bash: 执行命令 * - glob: 文件匹配 * - grep: 内容搜索 * - webfetch: 抓取网页 * - lsp: LSP 诊断 */ import { resolve } from 'path' // 动态导入工具(避免编译时依赖) async function loadTool(toolName: string) { // 从 agent/tools/adapters/ 定位到 vendor/opencode const toolPath = resolve(__dirname, '../../../../vendor/opencode/packages/opencode/src/tool') switch (toolName) { case 'read': return (await import(`${toolPath}/read.ts`)).ReadTool case 'edit': return (await import(`${toolPath}/edit.ts`)).EditTool case 'write': return (await import(`${toolPath}/write.ts`)).WriteTool case 'bash': return (await import(`${toolPath}/bash.ts`)).BashTool case 'glob': return (await import(`${toolPath}/glob.ts`)).GlobTool case 'grep': return (await import(`${toolPath}/grep.ts`)).GrepTool case 'webfetch': return (await import(`${toolPath}/webfetch.ts`)).WebFetchTool case 'lsp': return (await import(`${toolPath}/lsp.ts`)).LspTool default: throw new Error(`Unknown tool: ${toolName}`) } } async function main() { const toolName = process.argv[2] const argsJson = process.argv[3] if (!toolName || !argsJson) { console.error('Usage: bun run tool-wrapper.ts ') console.error('Example: bun run tool-wrapper.ts read \'{"filePath": "test.py"}\'') process.exit(1) } try { // 解析参数 const args = JSON.parse(argsJson) // 加载工具 const Tool = await loadTool(toolName) // 构造最小化的 context(Python 调用不需要完整 context) const context = { sessionID: 'python-adapter', messageID: 'python-adapter', agent: 'python', abort: new AbortController().signal, messages: [], metadata: () => {}, ask: async () => {}, // 跳过权限检查(由 Python 层处理) } // 初始化工具 const toolInfo = await Tool.init() // 执行工具 const result = await toolInfo.execute(args, context) // 输出 JSON 结果 const output = { title: result.title, output: result.output, metadata: result.metadata || {}, attachments: result.attachments || [] } console.log(JSON.stringify(output)) } catch (error: any) { // 输出错误信息 const errorOutput = { title: 'Error', output: `Tool execution failed: ${error.message}`, metadata: { error: error.message, stack: error.stack } } console.error(JSON.stringify(errorOutput)) process.exit(1) } } main().catch((error) => { console.error(JSON.stringify({ title: 'Fatal Error', output: `Fatal error: ${error.message}`, metadata: { error: error.message, stack: error.stack } })) process.exit(1) })