Skip to content

Workspace activity panel doesn't remember being hidden: reopens in new workspaces and after restart #9417

Open

Description

@l16i

Where did this happen?

Desktop app (macOS)

Version

2.0.5

What happened?

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:

#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

  1. Use a window wide enough for the panel to dock (center pane about 1496px or wider).
  2. Open a workspace. The activity panel is already open.
  3. Click "Hide workspace activity". The panel closes.
  4. Open a new tab in that workspace. The panel stays hidden, as expected.
  5. Open a new workspace. The panel is open again.
  6. Go back to the first workspace, then quit and reopen Paradev. The panel is open again there too.

Logs, screenshots, or recordings

No response

Activity

  1. added
    bugSomething isn't working
    on Nov 6, 2026
  2. github-actions commented on Nov 6, 2026

    @github-actions
    Contributor

    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:

    1. Make the center pane at least 1496px wide.
    2. Open a workspace. The panel is docked.
    3. Click the activity button to hide it.
    4. 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):

    1. 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.
    2. 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.
    3. 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions