55 lines
2.3 KiB
JavaScript
55 lines
2.3 KiB
JavaScript
// 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;
|
|
} |