























@@ -3,6 +3,7 @@ import path from "node:path";
33import { describe, expect, it, vi } from "vitest";
44import * as detachedTaskRuntime from "../../tasks/detached-task-runtime.js";
55import { findTaskByRunId, resetTaskRegistryForTests } from "../../tasks/task-registry.js";
6+import { formatTaskStatusDetail } from "../../tasks/task-status.js";
67import { setupCronServiceSuite, writeCronStoreSnapshot } from "../service.test-harness.js";
78import { loadCronStore } from "../store.js";
89import type { CronJob } from "../types.js";
@@ -132,11 +133,15 @@ function expectTaskRun(params: {
132133runtime: string;
133134status: string;
134135sourceId: string;
136+progressSummary?: string;
135137}) {
136138const task = findTaskByRunId(params.runId);
137139expect(task?.runtime).toBe(params.runtime);
138140expect(task?.status).toBe(params.status);
139141expect(task?.sourceId).toBe(params.sourceId);
142+if (params.progressSummary !== undefined) {
143+expect(task?.progressSummary).toBe(params.progressSummary);
144+}
140145}
141146142147function createMissedIsolatedJob(now: number): CronJob {
@@ -373,6 +378,7 @@ describe("cron service ops seam coverage", () => {
373378runtime: "cron",
374379status: "succeeded",
375380sourceId: "isolated-timeout",
381+progressSummary: "Running cron job.",
376382});
377383expect(findTaskByRunId(manualRunId)).toBeUndefined();
378384} finally {
@@ -546,9 +552,53 @@ describe("cron service ops seam coverage", () => {
546552runtime: "cron",
547553status: "timed_out",
548554sourceId: "startup-timeout",
555+progressSummary: "Running cron job.",
549556});
550557} finally {
551558restoreStateDir();
552559}
553560});
561+562+it("seeds active manual cron task progress for status surfaces", async () => {
563+const { storePath } = await makeStorePath();
564+const now = Date.parse("2026-03-23T12:00:00.000Z");
565+const restoreStateDir = withStateDirForStorePath(storePath);
566+567+try {
568+await writeDueIsolatedJobSnapshot(storePath, now);
569+let resolveRun: ((value: { status: "ok"; summary: string }) => void) | undefined;
570+const state = createCronServiceState({
571+ storePath,
572+cronEnabled: true,
573+log: logger,
574+nowMs: () => now,
575+enqueueSystemEvent: vi.fn(),
576+requestHeartbeat: vi.fn(),
577+runIsolatedAgentJob: vi.fn(
578+() =>
579+new Promise<{ status: "ok"; summary: string }>((resolve) => {
580+resolveRun = resolve;
581+}),
582+),
583+});
584+585+const manualRun = run(state, "isolated-timeout");
586+await vi.waitFor(() => {
587+expect(state.deps.runIsolatedAgentJob).toHaveBeenCalledTimes(1);
588+});
589+590+const task = findTaskByRunId(`cron:isolated-timeout:${now}`);
591+if (!task) {
592+throw new Error("expected active manual cron task ledger record");
593+}
594+expect(task.status).toBe("running");
595+expect(task.progressSummary).toBe("Running cron job.");
596+expect(formatTaskStatusDetail(task)).toBe("Running cron job.");
597+598+resolveRun?.({ status: "ok", summary: "done" });
599+await manualRun;
600+} finally {
601+restoreStateDir();
602+}
603+});
554604});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。