fix: avoid forcing mobile drawer on auto-activation

This commit is contained in:
Justin Skowyra
2026-09-02 23:26:04 +08:00
committed by Menghuan1918
parent dde0923980
commit d6c587e577
6 changed files with 231 additions and 27 deletions
+18 -10
View File
@@ -554,8 +554,10 @@ export function Sidebar(props: { ctx: Context; store: SidebarStore }) {
* Subagent auto-activation: the moment the current conversation spawns its
* FIRST direct subagent (a 0 → N transition on the list feed), the "auto
* open" pref is on, and the Subagent tab type is enabled in settings,
* open the panel (if collapsed) and focus the Subagent page
* (single-instance: an existing tab is focused, never duplicated).
* focus the Subagent page (single-instance: an existing tab is focused,
* never duplicated). On wide viewports the right panel also expands; on
* narrow viewports background activity never forces the full-screen drawer
* open over the chat.
* Switching to a session that already has subagents never triggers — its
* baseline starts at the current count — so a deliberate layout is never
* fought.
@@ -581,10 +583,14 @@ export function Sidebar(props: { ctx: Context; store: SidebarStore }) {
if (!detectNewDirectSubagent(baseline, ctx.sessions.list.getSnapshot(), sessionId)) return
if (!store.getPrefs().autoOpenSubagent) return
if (ctx.get('betterSidebar')?.isTabEnabled('subagent') === false) return
store.reduce(s => s.panelOpen ? s : togglePanel(s))
// Pin the landing to the right panel: the auto-opened Subagent page must
// appear where the panel just expanded, not in a bottom-panel pane the
// user last touched.
// Read the viewport when the delayed activation fires: a resize while
// the debounce is armed must not let background activity force the
// narrow full-screen drawer open over the chat.
if (!isNarrowWidth(window.innerWidth)) {
store.reduce(s => s.panelOpen ? s : togglePanel(s))
}
// Pin the landing to the right panel: the auto-activated Subagent page
// must be ready there, not in a bottom-panel pane the user last touched.
store.reduce(s => ({ ...s, activePane: firstLeaf(s.splits).id }))
ctx.get('betterSidebar')?.openTab({ type: 'subagent', title: t('subagent') })
}, AUTO_OPEN_DEBOUNCE_MS)
@@ -601,9 +607,9 @@ export function Sidebar(props: { ctx: Context; store: SidebarStore }) {
/**
* Job auto-activation: the moment a NEW background job appears for the
* current conversation (a job id the previous snapshot lacked), the
* auto-open pref is on, and the Jobs tab type is enabled, open the panel
* (if collapsed) and focus the Jobs page. Unlike the subagent trigger
* (0 → N only), ANY new job id triggers: the agent may start several
* auto-open pref is on, and the Jobs tab type is enabled, focus the Jobs
* page. The right panel expands only on wide viewports. Unlike the subagent
* trigger (0 → N only), ANY new job id triggers: the agent may start several
* jobs in one session, and each should surface. A fresh page load never
* triggers — its baseline starts at the current snapshot.
*/
@@ -615,7 +621,9 @@ export function Sidebar(props: { ctx: Context; store: SidebarStore }) {
if (!detectNewJob(prev, sessionList, sessionId)) return
if (!store.getPrefs().autoOpenJobs) return
if (ctx.get('betterSidebar')?.isTabEnabled('subagent') === false) return
store.reduce(s => s.panelOpen ? s : togglePanel(s))
if (!isNarrowWidth(window.innerWidth)) {
store.reduce(s => s.panelOpen ? s : togglePanel(s))
}
store.reduce(s => ({ ...s, activePane: firstLeaf(s.splits).id }))
ctx.get('betterSidebar')?.openTab({ type: 'subagent', title: t('subagent') })
}, [sessionList, sessionId, store, ctx])