import { tool } from "@opencode-ai/plugin"; import { ToolSessionContextStore } from "../../src/session/toolContextStore.js"; const internalBaseUrl = process.env.TJWATER_AGENT_INTERNAL_BASE_URL ?? "http://127.0.0.1:8787"; const internalToken = process.env.TJWATER_AGENT_INTERNAL_TOKEN ?? ""; const toolContextStore = new ToolSessionContextStore(); const initializePromise = toolContextStore.initialize(); export default tool({ description: "通过本地 Agent 桥接调用 TJWater 后端 API。需提供 API 路径、可选的请求方法以及查询参数。", args: { reason: tool.schema .string() .describe("Why this tool call is required for the current user request."), path: tool.schema.string().describe("Target backend API path, starting with '/'."), method: tool.schema .string() .optional() .describe("HTTP method. Defaults to GET."), arguments: tool.schema .record(tool.schema.string(), tool.schema.unknown()) .optional() .describe("Query arguments object."), }, async execute(args, context) { await initializePromise; const sessionContext = await toolContextStore.read(context.sessionID); if (!sessionContext) { throw new Error(`session context not found for ${context.sessionID}`); } // 工具本身不直接持有用户 token;通过 sessionID 回调 Agent 服务,由服务侧补齐用户上下文。 const response = await fetch(`${internalBaseUrl}/internal/tools/dynamic-http-call`, { method: "POST", headers: { "Content-Type": "application/json", "x-agent-internal-token": internalToken, }, body: JSON.stringify({ sessionScopeKey: sessionContext.sessionScopeKey, reason: args.reason, path: args.path, method: args.method, arguments: args.arguments, }), }); const text = await response.text(); if (!response.ok) { throw new Error(text); } return text; }, });