/** * 容器入口:立刻打日志 → 校验必填 env / 数据目录 → 加载 Nitro。 * 直接 import .output(不跑 eve start prewarm,避免 HF 启动卡住)。 * 沙箱在 create 时空建 session,不依赖模板。 */ const t0 = Date.now(); const log = (msg) => process.stdout.write(`[evework] ${msg}\n`); const fail = (msg) => { process.stderr.write(`[evework] FATAL (+${Date.now() - t0}ms): ${msg}\n`); process.exit(1); }; log(`start pid=${process.pid} node=${process.version} cwd=${process.cwd()}`); const has = (name) => Boolean(process.env[name]?.trim()); const world = (process.env.WORKFLOW_WORLD ?? "local").trim().toLowerCase(); // Message MCP url 写死在 agent/connections/message.ts;可选 MESSAGE_MCP_TOKEN。 const missing = ["CUSTOM_BASE_URL", "CUSTOM_MODEL"].filter((k) => !has(k)); if (world === "postgres" || world === "world-postgres") { if (!has("WORKFLOW_POSTGRES_URL")) missing.push("WORKFLOW_POSTGRES_URL"); } if (missing.length > 0) { fail( `缺少环境变量: ${missing.join(", ")}。` + `HF → Settings → Variables and secrets。` + `镜像默认 WORKFLOW_WORLD=postgres,需 WORKFLOW_POSTGRES_URL;` + `也可设 WORKFLOW_WORLD=local(状态写容器内 .workflow-data,重启丢失)。`, ); } const dataDir = (process.env.EVEAGENT_DATA_DIR ?? "/data").trim() || "/data"; try { const { accessSync, constants, mkdirSync } = await import("node:fs"); mkdirSync(dataDir, { recursive: true }); accessSync(dataDir, constants.W_OK); } catch (err) { const detail = err instanceof Error ? err.message : String(err); fail(`数据目录不可写: ${dataDir}(${detail})。请挂载可写卷或修正 EVEAGENT_DATA_DIR`); } log( `workflow=${world} data=${dataDir} agent_key=${has("AGENT_API_KEY") ? "set" : "missing"}`, ); const entry = new URL("./.output/server/index.mjs", import.meta.url); log(`import ${entry.pathname}`); try { await import(entry.href); log(`nitro loaded +${Date.now() - t0}ms`); } catch (err) { const message = err instanceof Error ? (err.stack ?? err.message) : String(err); fail(`import 失败:\n${message}`); }