fix(bots): keep the Bot Chat stale-tile probe discard-only so background refreshes never take focus

This commit is contained in:
Brooklyn Nicholson
2026-09-30 11:13:03 -05:00
parent 99a8d3717e
commit 0dfc3e39b9
2 changed files with 15 additions and 3 deletions

View File

@@ -68,7 +68,7 @@ describe('120810: compressed Bot Chat discards the stale tile', () => {
expect(focusMock).toHaveBeenCalledTimes(1)
const [ownerKey, probe, onlyIds] = focusMock.mock.calls[0]
expect(ownerKey).toBe('bot:ops')
expect(onlyIds).toEqual(expect.arrayContaining(['root-1', 'tip-9']))
expect(onlyIds).toEqual([])
// Stale: Bot Chat-titled tile at an id that is neither registry nor tip.
expect(probe({ storedSessionId: 'old-segment', workspaceTabTitle: 'Bot Chat' })).toBe(true)
// Live tip and registry row are never stale.
@@ -79,4 +79,14 @@ describe('120810: compressed Bot Chat discards the stale tile', () => {
// Tip opens after the probe.
expect(hostMock.openSession.mock.calls[0][0]).toBe('tip-9')
})
it('a background refresh discards stale tiles without fronting the live one (#121874)', async () => {
const { openBotCanonicalChat } = await loadModule()
await openBotCanonicalChat('ops', { background: true })
expect(focusMock).toHaveBeenCalledTimes(1)
const [, probe, onlyIds] = focusMock.mock.calls[0]
expect(onlyIds).toEqual([])
expect(probe({ storedSessionId: 'old-segment', workspaceTabTitle: 'Bot Chat' })).toBe(true)
})
})

View File

@@ -157,9 +157,11 @@ async function openStoredBotChat(
// Compression rotates the tip while tiles stay keyed by segment, and hidden
// Bot Chats never reach the sidebar listing the lineage guard reads, so the
// old-segment tile is discarded here or it survives beside the tip
// (hermes-agent#120810). Same owner-scoped probe the roster click runs.
// (hermes-agent#120810). Same owner-scoped probe the roster click runs, but
// discard-only (`[]` fronts nothing): a background refresh must never take
// the tab strip (#121874), and the openSession below fronts explicit opens.
const canonicalIds = [...new Set([summary?.id, storedId].filter(Boolean).map(String))]
host.focusOpenWorkspaceSession?.(ownerKey, isStaleBotChatTile(canonicalIds), canonicalIds)
host.focusOpenWorkspaceSession?.(ownerKey, isStaleBotChatTile(canonicalIds), [])
await host.openSession(storedId, {
...(route