From 89efcbe1ec3a558e08d0dc5cfe7a9c8ad40c7b13 Mon Sep 17 00:00:00 2001 From: harshitsinghbhandari <24b4506@iitb.ac.in> Date: Sat, 18 Apr 2026 13:38:16 +0530 Subject: [PATCH] fix: address PR #1300 review follow-up comments --- packages/core/src/__tests__/metadata.test.ts | 24 +++++++++++++++++++ packages/core/src/metadata.ts | 8 ++++++- packages/web/src/app/globals.css | 5 ++++ packages/web/src/components/SessionDetail.tsx | 2 ++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/core/src/__tests__/metadata.test.ts b/packages/core/src/__tests__/metadata.test.ts index 98985514b..028c5b720 100644 --- a/packages/core/src/__tests__/metadata.test.ts +++ b/packages/core/src/__tests__/metadata.test.ts @@ -8,6 +8,7 @@ import { readMetadataRaw, readCanonicalLifecycle, readArchivedMetadataRaw, + mutateMetadata, writeMetadata, updateMetadata, deleteMetadata, @@ -212,6 +213,29 @@ describe("updateMetadata", () => { expect(meta!.status).toBe("pr_open"); expect(meta!.summary).toBeUndefined(); }); + + it("returns the normalized record that is actually persisted", () => { + writeMetadata(dataDir, "upd-5", { + worktree: "/tmp/w", + branch: "main", + status: "working", + summary: "doing stuff", + }); + + const next = mutateMetadata(dataDir, "upd-5", (existing) => ({ + ...existing, + summary: "", + pr: "https://github.com/org/repo/pull/5", + })); + + expect(next).toEqual({ + worktree: "/tmp/w", + branch: "main", + status: "working", + pr: "https://github.com/org/repo/pull/5", + }); + expect(readMetadataRaw(dataDir, "upd-5")).toEqual(next); + }); }); describe("readCanonicalLifecycle", () => { diff --git a/packages/core/src/metadata.ts b/packages/core/src/metadata.ts index 4214b7a56..9e8081ef6 100644 --- a/packages/core/src/metadata.ts +++ b/packages/core/src/metadata.ts @@ -193,6 +193,12 @@ function applyMetadataUpdates( return next; } +function normalizeMetadataRecord(data: Record): Record { + return Object.fromEntries( + Object.entries(data).filter(([, value]) => value !== undefined && value !== ""), + ); +} + export function mutateMetadata( dataDir: string, sessionId: SessionId, @@ -208,7 +214,7 @@ export function mutateMetadata( return null; } - const next = updater({ ...existing }); + const next = normalizeMetadataRecord(updater({ ...existing })); mkdirSync(dirname(path), { recursive: true }); atomicWriteFileSync(path, serializeMetadata(next)); diff --git a/packages/web/src/app/globals.css b/packages/web/src/app/globals.css index 59711e6fa..4572f3260 100644 --- a/packages/web/src/app/globals.css +++ b/packages/web/src/app/globals.css @@ -1854,6 +1854,11 @@ html.light .xterm .xterm-viewport:hover::-webkit-scrollbar-thumb:active { background: var(--color-status-ready); } +.session-detail-tone--idle { + color: var(--color-status-idle); + background: var(--color-status-idle); +} + .session-detail-tone--attention { color: var(--color-status-attention); background: var(--color-status-attention); diff --git a/packages/web/src/components/SessionDetail.tsx b/packages/web/src/components/SessionDetail.tsx index d83e7f498..9e5b5925e 100644 --- a/packages/web/src/components/SessionDetail.tsx +++ b/packages/web/src/components/SessionDetail.tsx @@ -131,6 +131,8 @@ function activityToneClass(activityColor: string): string { return "session-detail-tone--working"; case "var(--color-status-ready)": return "session-detail-tone--ready"; + case "var(--color-status-idle)": + return "session-detail-tone--idle"; case "var(--color-status-attention)": return "session-detail-tone--attention"; case "var(--color-status-error)":