Przeglądaj źródła

fix(client-runtime): never reuse an archived blank session in connectWorkspace

Reusing one would open a session no grouping surface can show; the New
Session flow mints a fresh blank instead.
imccyu 2 miesięcy temu
rodzic
commit
fc0042e47e

+ 5 - 1
packages/client/runtime/src/client/workspaces/service.ts

@@ -94,10 +94,14 @@ export class WorkspacesService implements IWorkspaces {
     if (inflight !== undefined) return inflight
     if (inflight !== undefined) return inflight
     // Reuse: blank && same canonical cwd (workspace.path is the host realpath
     // Reuse: blank && same canonical cwd (workspace.path is the host realpath
     // canon; summary cwd is the session header passthrough of the same canon).
     // canon; summary cwd is the session header passthrough of the same canon).
+    // An archived blank is never reused: reuse would open a session no
+    // grouping surface can show, so New Session mints a fresh one instead.
+    const archived = this.list.getSnapshot().archivedSessionIds
     const sessions = this.sessions.list.getSnapshot()
     const sessions = this.sessions.list.getSnapshot()
     for (const id of sessions.ids) {
     for (const id of sessions.ids) {
       const summary = sessions.byId[id]
       const summary = sessions.byId[id]
-      if (summary !== undefined && summary.blank && summary.cwd === workspace.path) return summary.id
+      if (summary !== undefined && summary.blank && summary.cwd === workspace.path
+        && !archived.has(summary.id)) return summary.id
     }
     }
     const attempt = this.sessions.create({ workspaceId })
     const attempt = this.sessions.create({ workspaceId })
       .finally(() => { this.connecting.delete(workspaceId) })
       .finally(() => { this.connecting.delete(workspaceId) })

+ 6 - 0
packages/client/runtime/tests/workspaces-service.spec.ts

@@ -183,6 +183,12 @@ describe('WorkspacesService', () => {
 
 
     // Unknown workspace fails loud instead of silently creating in nowhere.
     // Unknown workspace fails loud instead of silently creating in nowhere.
     await expect(workspaces.connectWorkspace(wid('ghost'))).rejects.toThrow(/unknown workspace ghost/)
     await expect(workspaces.connectWorkspace(wid('ghost'))).rejects.toThrow(/unknown workspace ghost/)
+
+    // An archived blank is never reused: no surface can show it, so New
+    // Session mints a fresh one for alpha instead.
+    await workspaces.archiveSession(sid('s-blank'))
+    api.onCreate = () => Promise.resolve(ok({ sessionId: sid('s-fresh-2') }))
+    await expect(workspaces.connectWorkspace(wid('alpha'))).resolves.toBe('s-fresh-2')
   })
   })
 
 
   it('a rejected first prompt keeps the blank session eligible for connectWorkspace reuse', async () => {
   it('a rejected first prompt keeps the blank session eligible for connectWorkspace reuse', async () => {