18.2 Cron 作业执行
18.2.1 隔离 Agent 执行(src/cron/isolated-agent.ts)
src/cron/isolated-agent.ts)两种执行模式
// src/cron/service/timer.ts — executeJobCore(简化版)
async function executeJobCore(state, job) {
// 模式一:主会话执行
if (job.sessionTarget === "main") {
const text = resolveJobPayloadTextForMain(job);
if (!text) return { status: "skipped", error: "requires non-empty text" };
// 注入系统事件
state.deps.enqueueSystemEvent(text, { agentId: job.agentId });
// 唤醒 Agent 处理
if (job.wakeMode === "now" && state.deps.runHeartbeatOnce) {
// 同步模式:等待心跳完成(最多 2 分钟)
for (;;) {
const result = await state.deps.runHeartbeatOnce({ reason: `cron:${job.id}` });
if (result.status !== "skipped" || result.reason !== "requests-in-flight") break;
if (state.deps.nowMs() - waitStartedAt > 2 * 60_000) {
state.deps.requestHeartbeatNow({ reason: `cron:${job.id}` });
return { status: "ok", summary: text };
}
await delay(250);
}
} else {
// 异步模式:仅请求心跳,不等待
state.deps.requestHeartbeatNow({ reason: `cron:${job.id}` });
}
return { status: "ok", summary: text };
}
// 模式二:隔离会话执行
if (job.payload.kind !== "agentTurn") {
return { status: "skipped", error: "isolated job requires agentTurn" };
}
const res = await state.deps.runIsolatedAgentJob({
job,
message: job.payload.message,
});
// 将摘要回传到主会话(如果配置了投递)
const deliveryPlan = resolveCronDeliveryPlan(job);
if (res.summary?.trim() && deliveryPlan.requested) {
state.deps.enqueueSystemEvent(`Cron: ${res.summary}`, { agentId: job.agentId });
if (job.wakeMode === "now") {
state.deps.requestHeartbeatNow({ reason: `cron:${job.id}` });
}
}
return { status: res.status, error: res.error, summary: res.summary };
}隔离 Agent 的运行细节
作业生命周期
18.2.2 投递计划(Delivery Plan)(src/cron/delivery.ts)
src/cron/delivery.ts)投递配置
投递计划解析
18.2.3 运行日志(src/cron/run-log.ts)
src/cron/run-log.ts)日志文件组织
日志条目
写入:顺序化 + 自动裁剪
读取:倒序扫描
18.2.4 Cron 存储与迁移(src/cron/store.ts)
src/cron/store.ts)存储格式
存储路径
加载与保存
Gateway 集成
本节小结
Last updated