import { tool } from "@opencode-ai/plugin"; const internalBaseUrl = process.env.TJWATER_AGENT_INTERNAL_BASE_URL ?? "http://127.0.0.1:8787"; const internalToken = process.env.TJWATER_AGENT_INTERNAL_TOKEN ?? ""; type StoreRenderRefArgs = { file_path?: unknown; filePath?: unknown; }; export function resolveStoreRenderFilePath(args: StoreRenderRefArgs): string { if (typeof args.file_path === "string" && args.file_path.trim() !== "") { return args.file_path; } if (typeof args.filePath === "string" && args.filePath.trim() !== "") { return args.filePath; } throw new Error("file_path is required"); } export default tool({ description: "导入当前对话工作目录下的受控 JSON 包装文件并返回 render_ref。文件必须是 { metadata: object, location: { file_path: string }, data: { node_area_map, area_ids?, area_colors? } },location.file_path 必须与传入的绝对路径完全一致。只接受当前对话工作目录内的真实文件,不接受其他对话目录、目录外路径或指向目录外的符号链接。", args: { reason: tool.schema .string() .describe( "为何需要将此本地渲染数据持久化为 render_ref,以便后续通过 render_junctions 渲染到前端。", ), file_path: tool.schema .string() .optional() .describe( "位于当前对话工作目录内的包装 JSON 文件绝对路径。必须包含 metadata、location.file_path 和 data;data 才是 render_junctions 使用的 { node_area_map, area_ids?, area_colors? }。", ), filePath: tool.schema .string() .optional() .describe("兼容旧调用的参数名;新调用应优先使用 file_path。"), }, async execute(args, context) { const filePath = resolveStoreRenderFilePath(args); const response = await fetch( `${internalBaseUrl}/internal/tools/store-render-ref`, { method: "POST", headers: { "Content-Type": "application/json", "x-agent-internal-token": internalToken, }, body: JSON.stringify({ session_id: context.sessionID, file_path: filePath, }), }, ); const text = await response.text(); if (!response.ok) { throw new Error(text); } return text; }, });