You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Workspace activity panel doesn't remember being hidden: reopens in new workspaces and after restart #9417
Since a recent update, the workspace activity panel opens by itself in every new workspace and again after I restart the app. It takes up a lot of space on the right, so I keep having to click "Hide workspace activity".
Hiding it does work within a workspace, including across new tabs, but only until I quit the app.
I couldn't find a setting to turn this off or keep it hidden.
Expected: once I hide the panel, it stays hidden, including in new workspaces and after a restart. Remembering my last choice or adding a "Show activity panel automatically" setting would both solve this.
From reading the v2.0.5 source:
The panel docks automatically since feat(desktop): subagents, background work and PRs in the top bar #8975 (first shipped in v2.0.2). WorkspaceActivityMenu.tsx uses docked = fits && !hidden, so it shows by default whenever the pane is wide enough (about 1496px: 816px chat column + 2 × 340px).
hidden in activityPanelStore is per workspace and in memory only, which explains both cases above.
renderPaneAside always mounts ActivityPanelAside, and I didn't find a preference or feature flag controlling it.
#8975 describes the in-memory state as deliberate, so this may be a design choice rather than a defect. It's still disruptive on a large screen, where the panel fits almost all the time.
Steps to reproduce
Use a window wide enough for the panel to dock (center pane about 1496px or wider).
Open a workspace. The activity panel is already open.
Click "Hide workspace activity". The panel closes.
Open a new tab in that workspace. The panel stays hidden, as expected.
Open a new workspace. The panel is open again.
Go back to the first workspace, then quit and reopen Paradev. The panel is open again there too.
The report is accurate. The workspace activity panel docks by default whenever the center pane is wide enough. Hiding it is recorded per workspace, in memory only, so it shows again in every new workspace and after every restart. There is no preference to keep it hidden. The behavior comes from how the store is designed, not from a regression. On a wide screen it looks like a bug, because the panel almost always fits.
Affected code
All paths are under apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/.
components/WorkspaceActivityMenu/stores/activityPanelStore/activityPanelStore.ts:21-22, 49-55: hidden: Record<string, true> uses the workspace ID as its key. The store is a plain zustand create(...) with no persist middleware, so it starts empty on every app start and has no entry for a new workspace.
components/WorkspaceActivityMenu/WorkspaceActivityMenu.tsx:152-167: docked = fits && !hidden, so the panel opens by default whenever fits is true.
components/WorkspaceActivityMenu/WorkspaceActivityMenu.tsx:463-469: when the panel fits, onTriggerClick only calls setHidden(workspaceId, !hidden). This is the in-memory, per-workspace toggle.
components/WorkspaceActivityMenu/components/ActivityPanelAside/ActivityPanelAside.tsx:14, 34-48: fits is true when the host is at least CENTERED_CONTENT_WIDTH_PX + 2 * INSET_PX wide. That is 816 + 2 × (320 + 12 + 8) = 1496px, which matches the report.
components/WorkspaceActivityMenu/components/ActivityPanelAside/ActivityPanelAside.tsx:50-57: while the panel is shown, this sets --pane-aside-inset: 340px on the host. packages/panes/src/react/components/Workspace/components/Tab/components/Pane/components/PaneContent/PaneContent.tsx:21 then applies pr-[var(--pane-aside-inset,0px)] to every pane that does not opt out, which reduces the usable width of non-chat panes.
page.tsx:748-750: renderPaneAside always mounts <ActivityPanelAside>. No setting or flag controls it.
Root cause
The "hidden" choice lives in a non-persisted, per-workspace map whose default is "shown when it fits":
A new workspace has no entry, so hidden is false and the panel docks.
A restart rebuilds the store with an empty map, so every workspace docks again.
New tabs keep the choice because the key is the workspace ID, not the tab.
I ruled out a bug in measuring the width. The threshold and the ResizeObserver logic work as intended.
Reproduction
Manual:
Make the center pane at least 1496px wide.
Open a workspace. The panel is docked.
Click the activity button to hide it.
Open a different workspace, or restart the app. The panel is docked again.
Store-level bun:test sketch:
import{useActivityPanelStore}from"./activityPanelStore";test("hiding in one workspace does not carry to another",()=>{useActivityPanelStore.getState().setHidden("ws-a",true);expect(useActivityPanelStore.getState().hidden["ws-b"]).toBeUndefined();// docks by default});
The restart case follows from the store having no persist wrapper.
Fix direction
One option (pick one or combine them):
Global persisted preference. Add a small singleton store, for example { autoShowActivityPanel: boolean }, using zustand persist like apps/desktop/src/renderer/stores/workspace-agents-row.ts. Then use something like docked = fits && (hidden[workspaceId] === undefined ? autoShow : !hidden[workspaceId]). Make the per-workspace map tri-state (an explicit "shown" as well as "hidden") so one workspace can override the global default.
Remember the last choice. In the fits branch of onTriggerClick, also write the global default, so hiding once keeps the panel hidden in new workspaces and after restarts.
Settings toggle. Add "Show activity panel automatically" in Settings, backed by the same store, with a settings-search entry and Lingui strings plus check:i18n.
Keep it a fixed-size singleton, not a map keyed by workspace. apps/desktop/AGENTS.md requires every localStorage writer to be added to persisted-key-registry.test-data.ts, and keys by workspace would grow without bound. Leave the transient fits, floatingOpen and asideNodes state in memory.
Activity
github-actions commentedon Nov 6, 2026
The report is accurate. The workspace activity panel docks by default whenever the center pane is wide enough. Hiding it is recorded per workspace, in memory only, so it shows again in every new workspace and after every restart. There is no preference to keep it hidden. The behavior comes from how the store is designed, not from a regression. On a wide screen it looks like a bug, because the panel almost always fits.
Affected code
All paths are under
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/.components/WorkspaceActivityMenu/stores/activityPanelStore/activityPanelStore.ts:21-22, 49-55:hidden: Record<string, true>uses the workspace ID as its key. The store is a plain zustandcreate(...)with nopersistmiddleware, so it starts empty on every app start and has no entry for a new workspace.components/WorkspaceActivityMenu/WorkspaceActivityMenu.tsx:152-167:docked = fits && !hidden, so the panel opens by default wheneverfitsis true.components/WorkspaceActivityMenu/WorkspaceActivityMenu.tsx:463-469: when the panel fits,onTriggerClickonly callssetHidden(workspaceId, !hidden). This is the in-memory, per-workspace toggle.components/WorkspaceActivityMenu/components/ActivityPanelAside/ActivityPanelAside.tsx:14, 34-48:fitsis true when the host is at leastCENTERED_CONTENT_WIDTH_PX + 2 * INSET_PXwide. That is 816 + 2 × (320 + 12 + 8) = 1496px, which matches the report.components/WorkspaceActivityMenu/components/ActivityPanelAside/ActivityPanelAside.tsx:50-57: while the panel is shown, this sets--pane-aside-inset: 340pxon the host.packages/panes/src/react/components/Workspace/components/Tab/components/Pane/components/PaneContent/PaneContent.tsx:21then appliespr-[var(--pane-aside-inset,0px)]to every pane that does not opt out, which reduces the usable width of non-chat panes.page.tsx:748-750:renderPaneAsidealways mounts<ActivityPanelAside>. No setting or flag controls it.Root cause
The "hidden" choice lives in a non-persisted, per-workspace map whose default is "shown when it fits":
hiddenisfalseand the panel docks.I ruled out a bug in measuring the width. The threshold and the
ResizeObserverlogic work as intended.Reproduction
Manual:
Store-level
bun:testsketch:The restart case follows from the store having no
persistwrapper.Fix direction
One option (pick one or combine them):
{ autoShowActivityPanel: boolean }, using zustandpersistlikeapps/desktop/src/renderer/stores/workspace-agents-row.ts. Then use something likedocked = fits && (hidden[workspaceId] === undefined ? autoShow : !hidden[workspaceId]). Make the per-workspace map tri-state (an explicit "shown" as well as "hidden") so one workspace can override the global default.fitsbranch ofonTriggerClick, also write the global default, so hiding once keeps the panel hidden in new workspaces and after restarts.settings-searchentry and Lingui strings pluscheck:i18n.Keep it a fixed-size singleton, not a map keyed by workspace.
apps/desktop/AGENTS.mdrequires every localStorage writer to be added topersisted-key-registry.test-data.ts, and keys by workspace would grow without bound. Leave the transientfits,floatingOpenandasideNodesstate in memory.