From dbe2ab6f6229a5d1bed2cc370cee0abc2bf4b24a Mon Sep 17 00:00:00 2001 From: Rob Dunn Date: Mon, 16 Feb 2026 08:58:19 -0700 Subject: [PATCH] cron: keep usage telemetry in run log types + error paths --- src/cron/isolated-agent/run.ts | 7 +++++-- src/cron/run-log.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/cron/isolated-agent/run.ts b/src/cron/isolated-agent/run.ts index 064d829bc6..28e501e4d1 100644 --- a/src/cron/isolated-agent/run.ts +++ b/src/cron/isolated-agent/run.ts @@ -589,6 +589,7 @@ export async function runCronIsolatedAgentTurn(params: { error: resolvedDelivery.error.message, summary, outputText, + ...telemetry, }); } logWarn(`[cron:${params.job.id}] ${resolvedDelivery.error.message}`); @@ -602,6 +603,7 @@ export async function runCronIsolatedAgentTurn(params: { error: message, summary, outputText, + ...telemetry, }); } logWarn(`[cron:${params.job.id}] ${message}`); @@ -639,7 +641,7 @@ export async function runCronIsolatedAgentTurn(params: { } } catch (err) { if (!deliveryBestEffort) { - return withRunSession({ status: "error", summary, outputText, error: String(err) }); + return withRunSession({ status: "error", summary, outputText, error: String(err), ...telemetry }); } } } else if (synthesizedText) { @@ -730,13 +732,14 @@ export async function runCronIsolatedAgentTurn(params: { summary, outputText, error: message, + ...telemetry, }); } logWarn(`[cron:${params.job.id}] ${message}`); } } catch (err) { if (!deliveryBestEffort) { - return withRunSession({ status: "error", summary, outputText, error: String(err) }); + return withRunSession({ status: "error", summary, outputText, error: String(err), ...telemetry }); } logWarn(`[cron:${params.job.id}] ${String(err)}`); } diff --git a/src/cron/run-log.ts b/src/cron/run-log.ts index 25846ce81a..6b5152855a 100644 --- a/src/cron/run-log.ts +++ b/src/cron/run-log.ts @@ -13,6 +13,17 @@ export type CronRunLogEntry = { runAtMs?: number; durationMs?: number; nextRunAtMs?: number; + + // Telemetry (best-effort) + model?: string; + provider?: string; + usage?: { + input_tokens?: number; + output_tokens?: number; + total_tokens?: number; + cache_read_tokens?: number; + cache_write_tokens?: number; + }; }; export function resolveCronRunLogPath(params: { storePath: string; jobId: string }) { @@ -105,6 +116,27 @@ export async function readCronRunLogEntries( runAtMs: obj.runAtMs, durationMs: obj.durationMs, nextRunAtMs: obj.nextRunAtMs, + model: typeof obj.model === "string" && obj.model.trim() ? obj.model : undefined, + provider: typeof obj.provider === "string" && obj.provider.trim() ? obj.provider : undefined, + usage: + obj.usage && typeof obj.usage === "object" + ? { + input_tokens: + typeof (obj.usage as any).input_tokens === "number" ? (obj.usage as any).input_tokens : undefined, + output_tokens: + typeof (obj.usage as any).output_tokens === "number" ? (obj.usage as any).output_tokens : undefined, + total_tokens: + typeof (obj.usage as any).total_tokens === "number" ? (obj.usage as any).total_tokens : undefined, + cache_read_tokens: + typeof (obj.usage as any).cache_read_tokens === "number" + ? (obj.usage as any).cache_read_tokens + : undefined, + cache_write_tokens: + typeof (obj.usage as any).cache_write_tokens === "number" + ? (obj.usage as any).cache_write_tokens + : undefined, + } + : undefined, }; if (typeof obj.sessionId === "string" && obj.sessionId.trim().length > 0) { entry.sessionId = obj.sessionId;