import { existsSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { CONFIG_DIR_NAME, type ExtensionAPI, } from "@earendil-works/pi-coding-agent"; import { Type } from "typebox"; const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const workflowScript = join(packageRoot, "scripts", "parse_china_standard.py"); export default function (pi: ExtensionAPI) { pi.registerTool({ name: "china_standard_parse", label: "解析中国国家标准", description: "按 GB、GB/T 或 GB/Z 标准编号从国家标准全文公开系统下载官方 PDF,使用 MinerU 解析,并返回工作区内 Markdown 文件的绝对路径。", promptSnippet: "下载并解析中国国家标准,返回 Markdown 文件路径", promptGuidelines: [ "Use china_standard_parse when the user asks to retrieve or read a Chinese national standard by its GB, GB/T, or GB/Z number.", "After china_standard_parse returns a Markdown path, use the read tool to inspect only the sections needed for the user's request.", ], parameters: Type.Object({ standard_number: Type.String({ description: '标准编号,例如 "GB/T 35697-2026"', }), }), async execute(_toolCallId, params, signal, onUpdate, ctx) { if (!existsSync(workflowScript)) { throw new Error(`国标解析脚本不存在:${workflowScript}`); } const outputRoot = resolve(ctx.cwd, "china-standard-output"); const projectConfig = resolve( ctx.cwd, CONFIG_DIR_NAME, "china-standard", "mineru.json", ); const command = [ workflowScript, params.standard_number, "--output-root", outputRoot, ]; if (!process.env.MINERU_CONFIG && existsSync(projectConfig)) { command.push("--config", projectConfig); } onUpdate?.({ content: [ { type: "text", text: `正在下载并解析 ${params.standard_number}` }, ], details: {}, }); const python = process.env.PYTHON || (process.platform === "win32" ? "python" : "python3"); const result = await pi.exec(python, command, { cwd: ctx.cwd, signal }); if (result.code !== 0) { const detail = result.stderr.trim() || result.stdout.trim() || `退出码 ${result.code}`; throw new Error(`国标解析失败:${detail}`); } let payload: unknown; try { payload = JSON.parse(result.stdout); } catch { throw new Error("国标解析脚本没有返回有效 JSON"); } if ( typeof payload !== "object" || payload === null || !("markdown" in payload) || typeof payload.markdown !== "string" || !payload.markdown.endsWith(".md") || !existsSync(payload.markdown) ) { throw new Error("国标解析结果没有包含有效的 Markdown 文件"); } return { content: [{ type: "text", text: payload.markdown }], details: {}, }; }, }); }