

























@@ -15,6 +15,8 @@ import {
1515type SourceDeliveryPlan,
1616type SourceDeliveryVisibleDelivery,
1717} from "../../infra/outbound/source-delivery-plan.js";
18+import { logMessageProcessed, logMessageQueued } from "../../logging/diagnostic.js";
19+import { stringifyRouteThreadId } from "../../plugin-sdk/channel-route.js";
1820import { isCommandLaneTaskTimeoutError } from "../../process/command-queue.js";
1921import { CommandLane } from "../../process/lanes.js";
2022import { createLazyImportLoader } from "../../shared/lazy-promise.js";
@@ -1184,6 +1186,21 @@ export async function runCronIsolatedAgentTurn(params: {
11841186// the correct context even if adoptCronRunSessionMetadata() rotates it.
11851187const initialSessionId = prepared.context.cronSession.sessionEntry.sessionId;
118611881189+const turnStartedAtMs = Date.now();
1190+const taskLabel =
1191+params.job.payload.kind === "agentTurn"
1192+ ? params.job.name?.trim() || params.job.id
1193+ : params.job.id;
1194+logMessageQueued({
1195+sessionId: prepared.context.runSessionId,
1196+sessionKey: prepared.context.runSessionKey,
1197+channel: "cron",
1198+source: "cron-isolated",
1199+ taskLabel,
1200+});
1201+1202+let outcome: "completed" | "error" = "completed";
1203+let outcomeError: string | undefined;
11871204try {
11881205const { executeCronRun } = await loadCronExecutorRuntime();
11891206const execution = await executeCronRun({
@@ -1222,21 +1239,30 @@ export async function runCronIsolatedAgentTurn(params: {
12221239suppressExecNotifyOnExit: prepared.context.suppressExecNotifyOnExit,
12231240});
12241241if (isAborted()) {
1242+outcome = "error";
1243+outcomeError = abortReason();
12251244return prepared.context.withRunSession({
12261245status: "error",
12271246error: abortReason(),
12281247diagnostics: createCronRunDiagnosticsFromError("cron-setup", abortReason()),
12291248});
12301249}
1231-return await finalizeCronRun({
1250+const finalized = await finalizeCronRun({
12321251prepared: prepared.context,
12331252 execution,
12341253 abortReason,
12351254 isAborted,
12361255});
1256+if (finalized.status === "error") {
1257+outcome = "error";
1258+outcomeError = finalized.error;
1259+}
1260+return finalized;
12371261} catch (err) {
12381262const isCronLaneTimeout = isAborted() || isCronNestedLaneTaskTimeoutError(err);
12391263const error = isCronLaneTimeout ? abortReason() : String(err);
1264+outcome = "error";
1265+outcomeError = error;
12401266return prepared.context.withRunSession({
12411267status: "error",
12421268 error,
@@ -1246,6 +1272,14 @@ export async function runCronIsolatedAgentTurn(params: {
12461272),
12471273});
12481274} finally {
1275+logMessageProcessed({
1276+channel: "cron",
1277+sessionId: prepared.context.runSessionId,
1278+sessionKey: prepared.context.runSessionKey,
1279+durationMs: Date.now() - turnStartedAtMs,
1280+ outcome,
1281+error: outcomeError,
1282+});
12491283// Release runtime references after the run completes (success or failure).
12501284// The session entry has already been persisted to disk by this point,
12511285// so the in-memory store and run context can be safely dropped.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。