// HLDP-ZY://agents/zhuyuan-dev-agent/server.js // @guardian: ICE-GL-ZY001 · 铸渊 // @sovereign: TCS-0002∞ · 冰朔 // @copyright: 国作登字-2026-A-00037559 // BD001 常驻Agent v5.3 — 零点原核UI + 步骤解析 + 经验累积 require("dotenv").config(); const express = require("express"); const path = require("path"); const fs = require("fs"); const { handleTask } = require("./modules/task-receiver"); const { sendNotification } = require("./modules/email-notify"); const { expandPlan } = require("./modules/plan-expander"); const { call: rawCall, getStatus: getModelStatus } = require("./modules/model-caller"); const { executePlan } = require("./modules/executor"); const { createLogger, readLatestRun, listRuns } = require("./modules/logger"); const { wrapModelCaller, reset, getCallCount, isBudgetExceeded } = require("./modules/cost-guard"); const { record: writeBrain, recordMilestone, recordExperience, AGENT_ID } = require("./modules/brain-writer"); const { wakeAndCheck, testConnection } = require("./modules/notion-poller"); const safeCall = wrapModelCaller(rawCall); const app = express(); app.use(express.json({ limit: "10mb" })); const PORT = process.env.PORT || 3003; const PLANS_DIR = path.join(__dirname, "plans"); if (!fs.existsSync(PLANS_DIR)) fs.mkdirSync(PLANS_DIR, { recursive: true }); const START_TIME = new Date().toISOString(); // ═══ 步骤解析器 v5.3 — 将 Notion steps 文本转为 task 对象 ═══ function parsePlanSteps(stepsText, planId) { if (!stepsText) return []; const lines = stepsText.split("\n").filter(l => l.trim()); const tasks = []; let idx = 0; for (const line of lines) { const m = line.match(/^\s*(\d+)\.?\s+(.+)/); if (m) { idx++; const desc = m[2].trim(); let action = "write_file"; if (/安装|执行|运行|启动|重启|构建|编译/.test(desc)) action = "run_cmd"; if (/API|接口|对接|请求|调用/.test(desc)) action = "call_api"; if (/验证|测试|检查|确认|审核/.test(desc)) action = "check"; tasks.push({ id: planId + "-t" + idx, action, target: "", description: desc, context: "从Notion工单提取: " + (stepsText.slice(0, 200)) }); } } console.log("[StepParser] " + planId + " → " + tasks.length + " tasks"); return tasks; }