From 8231868774344988af1e5410ecccd0cf9778abb3 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 21 Apr 2026 00:43:24 -0500 Subject: [PATCH] Fix missions list date handling --- .../plugin-missions/src/mission-service.ts | 8 ++++- .../plugins/plugin-missions/src/ui/index.tsx | 6 +++- .../plugin-missions/tests/plugin.spec.ts | 31 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/plugins/plugin-missions/src/mission-service.ts b/packages/plugins/plugin-missions/src/mission-service.ts index a7140730b8e..3a2b976dfc9 100644 --- a/packages/plugins/plugin-missions/src/mission-service.ts +++ b/packages/plugins/plugin-missions/src/mission-service.ts @@ -331,6 +331,12 @@ function normalizeId(value: string) { return value.trim().toUpperCase(); } +function toIsoDateString(value: Date | string | null | undefined): string { + if (value instanceof Date) return value.toISOString(); + if (typeof value === "string") return value; + return new Date(0).toISOString(); +} + function rootMissionOrigin(pluginId: string) { return `plugin:${pluginId}`; } @@ -1585,7 +1591,7 @@ export async function listMissionSummaries(ctx: PluginContext, companyId: string }, costCents: summary.costSummary.costCents, latestRunStatus: summary.runSummary.latestRunStatus, - updatedAt: root.updatedAt.toISOString(), + updatedAt: toIsoDateString(root.updatedAt), })) .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)); } diff --git a/packages/plugins/plugin-missions/src/ui/index.tsx b/packages/plugins/plugin-missions/src/ui/index.tsx index efb4b682716..71571bb3e0f 100644 --- a/packages/plugins/plugin-missions/src/ui/index.tsx +++ b/packages/plugins/plugin-missions/src/ui/index.tsx @@ -204,6 +204,10 @@ function formatDate(value: string | null) { }); } +function findingRenderKey(finding: MissionSummary["validationSummary"]["findings"][number]) { + return `${finding.sourceReportKey}:${finding.id}`; +} + function Section({ title, action, @@ -408,7 +412,7 @@ function SummarySections({ {summary.validationSummary.findings.length > 0 ? (
{summary.validationSummary.findings.map((finding) => ( -
+
{finding.title} diff --git a/packages/plugins/plugin-missions/tests/plugin.spec.ts b/packages/plugins/plugin-missions/tests/plugin.spec.ts index 9bca1d1fc45..9e0643de3ae 100644 --- a/packages/plugins/plugin-missions/tests/plugin.spec.ts +++ b/packages/plugins/plugin-missions/tests/plugin.spec.ts @@ -220,4 +220,35 @@ describe("missions plugin worker", () => { expect.objectContaining({ id: workerAgentId, name: "Worker One" }), ]); }); + + it("lists persisted mission roots when host issue timestamps are serialized strings", async () => { + const companyId = randomUUID(); + const rootIssueId = randomUUID(); + const updatedAt = "2026-04-20T12:00:00.000Z"; + const harness = createTestHarness({ manifest }); + + harness.seed({ + issues: [ + issue({ + id: rootIssueId, + companyId, + title: "Persisted mission root", + identifier: "PAP-1691", + originKind: "plugin:paperclip.missions", + updatedAt: updatedAt as unknown as Date, + }), + ], + }); + + await plugin.definition.setup(harness.ctx); + + const list = await harness.getData>>("mission-list", { companyId }); + expect(list).toEqual([ + expect.objectContaining({ + missionIssueId: rootIssueId, + missionTitle: "Persisted mission root", + updatedAt, + }), + ]); + }); });