61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
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: {
|
||
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;
|
||
},
|
||
});
|