refactor(client): archivedSessionIds public face becomes a plain array

Public snapshot state stays in the store engine's plain-data vocabulary
(immer drafts reject Sets without the MapSet plugin, which stays off):
manager/service/contract carry readonly SessionId[] in Host order, and
the tree derivations build their own transient Set — the
expandedProjects pattern. Membership-unchanged installs still keep the
array reference for Object.is short-circuits.
This commit is contained in:
imccyu
2026-07-31 10:40:09 +08:00
committed by imccyu
parent 5fc2645afc
commit 9ed87a6dba
26 changed files with 62 additions and 53 deletions

View File

@@ -73,7 +73,7 @@ export function conversationSnapshot(sessionId: SessionId): ConversationSnapshot
export function workspaceListState(): WorkspaceListState {
return {
items: [],
archivedSessionIds: new Set(),
archivedSessionIds: [],
state: 'idle',
phase: 'ready',
error: null,

View File

@@ -199,11 +199,8 @@ export class TestWorkspaces implements IWorkspaces {
await (stub(sessionId) as Promise<void>)
return
}
// Built outside the draft: reading a Set through an immer draft needs
// the MapSet plugin, while assigning a fresh Set does not.
const next = new Set([...this.list.getSnapshot().archivedSessionIds, sessionId])
await this.update((draft) => {
draft.archivedSessionIds = next
draft.archivedSessionIds = [...draft.archivedSessionIds, sessionId]
})
}
}