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.
This commit is contained in:
@@ -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) })
|
||||||
|
|||||||
@@ -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 () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user