49 lines
2.2 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: step parser - ASCII-only, no regex on Chinese chars
function parsePlanSteps(stepsText, planId) {
if (!stepsText) return [];
var lines = stepsText.split("\n").filter(function(l) { return l.trim(); });
var tasks = [];
var idx = 0;
for (var i = 0; i < lines.length; i++) {
var m = lines[i].match(/^\s*(\d+)\.?\s+(.+)/);
if (m) {
idx++;
var desc = m[2].trim();
var action = "write_file";
var d = desc;
if (d.indexOf("API") !== -1 || d.indexOf("Notion") !== -1) action = "call_api";
if (d.indexOf("curl") !== -1 || d.indexOf("npm") !== -1 || d.indexOf("git") !== -1) action = "run_cmd";
tasks.push({ id: planId + "-t" + idx, action: action, target: "", description: desc, context: "Notion:" + stepsText.slice(0, 200) });
}
}
console.log("[StepParser] " + planId + " -> " + tasks.length + " tasks");
return tasks;
}