From 4cf6c130cde19197d6b657783b1ac5218984a2d1 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 5 Oct 2026 13:59:39 +0900 Subject: [PATCH] fix(web): distinguish empty resident context --- .../memory/[subjectId]/+page.svelte | 9 ++++++++- .../memory/memory-page.browser.spec.ts | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/web/workspace/src/routes/w/[workspaceId]/memory/[subjectId]/+page.svelte b/web/workspace/src/routes/w/[workspaceId]/memory/[subjectId]/+page.svelte index 86292ffa1..def40f255 100644 --- a/web/workspace/src/routes/w/[workspaceId]/memory/[subjectId]/+page.svelte +++ b/web/workspace/src/routes/w/[workspaceId]/memory/[subjectId]/+page.svelte @@ -47,6 +47,13 @@ return 'Generation failed'; } + function surfaceSummary(availability: SubjektivResidentSurfaceAvailability): string { + if (availability !== 'ready') return 'No current generated context is available to use.'; + return snapshot?.body_md.trim() + ? 'Current generated context is available.' + : 'A current empty surface exists; there is no resident context to show.'; + } + function subjectStateLabel(state: 'active' | 'retired'): string { return state === 'active' ? 'Available' : 'Retired'; } @@ -95,7 +102,7 @@ Resident context {#if surface} {surfaceLabel(surface.availability)} -

{surface.availability === 'ready' ? 'Current generated context is available.' : 'No current generated context is available to use.'}

+

{surfaceSummary(surface.availability)}

{:else} Unavailable

The resident context status could not be read.

diff --git a/web/workspace/src/routes/w/[workspaceId]/memory/memory-page.browser.spec.ts b/web/workspace/src/routes/w/[workspaceId]/memory/memory-page.browser.spec.ts index 9ed075458..f1b9bb906 100644 --- a/web/workspace/src/routes/w/[workspaceId]/memory/memory-page.browser.spec.ts +++ b/web/workspace/src/routes/w/[workspaceId]/memory/memory-page.browser.spec.ts @@ -1,6 +1,12 @@ // @vitest-environment happy-dom -import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/svelte"; +import { + cleanup, + fireEvent, + render, + screen, + waitFor, +} from "@testing-library/svelte"; import { afterEach, expect, test, vi } from "vitest"; const { gotoMock } = vi.hoisted(() => ({ @@ -181,7 +187,9 @@ test("preserves invalid and rejected role drafts with accessible errors", async }); test("warns about an unknown create outcome without replaying the POST", async () => { - const fetchMock = vi.fn(() => Promise.reject(new TypeError("connection reset"))); + const fetchMock = vi.fn(() => + Promise.reject(new TypeError("connection reset")) + ); vi.stubGlobal("fetch", fetchMock); render(SubjectIndexPage, { data: subjectIndexData() } as never); @@ -218,7 +226,8 @@ test("renders a ready resident surface and committed Memory lifecycle states", a availability: "ready" as const, snapshot: { snapshot_id: "snapshot-1", - body_md: "# Resident context\n\nUse the **current** committed record.", + body_md: + "# Resident context\n\nUse the **current** committed record.", memory_refs: [{ memory_id: "memory-1", revision: 3 }], built_from_store_revision: 9, created_at: "2026-01-02T03:04:05Z", @@ -308,6 +317,7 @@ test("distinguishes ready-empty, stale, failed, unavailable, and request error s } as never); expect(screen.getByText("Resident context is current but empty.")).not .toBeNull(); + expect(screen.getByText(/current empty surface exists/)).not.toBeNull(); expect(screen.getByText("No committed Memories yet.")).not.toBeNull(); await view.rerender(