Skip to content

fix(agent-manager): preserve tab and panel state across project switches - #14529

Merged
marius-kilocode merged 2 commits into
mainfrom
fix-session-update-on-project-switch
Sep 24, 2026
Merged

marius-kilocode merged 2 commits into
mainfrom
fix-session-update-on-project-switch

Conversation

@marius-kilocode

Copy link
Copy Markdown
Collaborator

Issue

No existing issue. This was reported directly while testing multi-project Agent Manager.

Context

When Agent Manager switches between projects or between a project and a managed worktree, the view the user left was not restored reliably. The selected tab could change, tab order could be replaced, and the right sidebar could reopen a stale context or lose its content. Late terminal creation replies could also change the selection of a context the user had already left.

Implementation

  • Scope remembered drafts and terminals to their owning project instead of accepting any pending or terminal id.
  • Save the outgoing tab memory before a host-driven project activation, and clear transient selection before restoring the incoming target.
  • Keep a Review tab's backing session so restoring Review selects the right session, and closing it returns to that session rather than the first one.
  • Merge durable tab order with webview-only tabs (terminals, drafts, Review) instead of replacing the order on each state push.
  • Namespace diff scope memory by project while keeping the plain context for diff ids, and keep review drafts when switching away.
  • Ignore late terminal creation replies whose owner context is no longer active, and append the terminal to the owner's tab order.

The state hydration logic moved into project/hydration.ts to keep AgentManagerApp.tsx within its line limit.

Screenshots / Video

N/A. The change is interaction state, not static layout. Media is omitted because the Agent Manager header shows account data in this environment and PR assets are public.

How to Test

Manual/local verification

  • Ran the isolated VS Code self-test with two projects and one managed worktree.
  • Selected the second terminal, kept a mixed draft and terminal tab order, opened the right diff panel, then switched projects and returned. The second terminal stayed selected, the tab order was unchanged, and the right panel stayed open with its own diff scope.
  • Repeated with Review selected, then closed the restored Review tab and confirmed the original session came back.
  • Ran Add Project while a terminal was selected and confirmed the terminal selection and panel survived instead of reopening a stale Review.
  • Confirmed an explicitly closed right panel stayed closed after a round trip.

Reviewer test steps

  1. Enable the multi-project experimental setting.
  2. Open Agent Manager and add a second project.
  3. In project A, select a non-first session or a terminal tab and open the right diff panel.
  4. Switch to project B, then back to project A.
  5. Confirm the selected tab, tab order, and right panel are unchanged.
  6. Repeat with Review selected, and with the panel closed.

Blocked checks and substitute verification

  • No blocked checks.

Checklist

  • Issue linked above, or exception explained
  • Tests/verification described
  • Screenshots/video included for visual changes, or marked N/A
  • Changeset considered for user-facing changes
  • I personally reviewed the diff and can explain the changes, including any AI-assisted work.

Switching projects or worktrees could lose the selected tab, reorder tabs, or drop the right sidebar context. Late terminal replies could also steal selection from the visible context.

- Restrict remembered drafts and terminals to their owning project.
- Save the outgoing view before a host-driven project activation.
- Keep Review's backing session so closing it restores the right tab.
- Merge durable tab order with webview-only tabs instead of replacing it.
- Namespace diff scope per project and keep review drafts on switch.
- Ignore late terminal creation replies from an inactive context.
Comment thread packages/kilo-vscode/webview-ui/agent-manager/project/store.ts Outdated
@kilo-code-bot

kilo-code-bot Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

The prior SUGGESTION (hardcoded "review" / "pending:" in project/store.ts) is resolved: REVIEW_TAB_ID and PENDING_PREFIX now live in tab-ids.ts and are imported by both AgentManagerApp.tsx and project/store.ts.

Files Reviewed (3 files, incremental)
  • packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx
  • packages/kilo-vscode/webview-ui/agent-manager/project/store.ts
  • packages/kilo-vscode/webview-ui/agent-manager/tab-ids.ts - new file
Previous Review Summary (commit df604a1)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit df604a1)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-vscode/webview-ui/agent-manager/project/store.ts 106 New mergeTransientTabs predicate hardcodes "review" / "pending:", duplicating REVIEW_TAB_ID / PENDING_PREFIX from AgentManagerApp.tsx; a rename would silently break tab-order preservation.
Files Reviewed (16 files)
  • .changeset/fix-local-project-switch.md
  • packages/kilo-vscode/tests/unit/agent-manager-diff-scope-state.test.ts
  • packages/kilo-vscode/tests/unit/agent-manager-review-routing.test.ts
  • packages/kilo-vscode/tests/unit/agent-manager-selection-actions.test.ts
  • packages/kilo-vscode/tests/unit/agent-manager-terminal-state.test.ts
  • packages/kilo-vscode/tests/unit/agent-manager-worktree-diffs.test.ts
  • packages/kilo-vscode/tests/unit/project-review-state.test.ts
  • packages/kilo-vscode/tests/unit/project-store.test.ts
  • packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx
  • packages/kilo-vscode/webview-ui/agent-manager/diff-review-scope.ts
  • packages/kilo-vscode/webview-ui/agent-manager/diff-scope-state.ts
  • packages/kilo-vscode/webview-ui/agent-manager/project/hydration.ts
  • packages/kilo-vscode/webview-ui/agent-manager/project/store.ts - 1 issue
  • packages/kilo-vscode/webview-ui/agent-manager/selection-actions.ts
  • packages/kilo-vscode/webview-ui/agent-manager/tab-order.ts
  • packages/kilo-vscode/webview-ui/agent-manager/terminal/state.ts

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

The project store hardcoded the Review tab id and the pending draft prefix when merging tab order. Move both constants into a shared module and import them from the app and the store so a rename cannot silently break tab-order preservation.
@marius-kilocode
marius-kilocode merged commit fbf99aa into main Sep 24, 2026
25 checks passed
@marius-kilocode
marius-kilocode deleted the fix-session-update-on-project-switch branch September 24, 2026 10:10
iscekic pushed a commit that referenced this pull request Sep 26, 2026
…4554)

## Automated docs sync — 2026-09-25

This PR keeps kilo.ai/docs in sync with features merged to [Kilo-Org/cloud](https://github.com/Kilo-Org/cloud) and [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode). Every change below links to the merged PR it documents.

- Window: `2026-09-24T07:08:33.639Z` → `2026-09-25T07:05:29.302Z`
- Verification (docs build + tests): **passing**

### Surface: `cloud-mobile`

- Assignees / requested reviewers: @iscekic and @eshurakov
- Derivation: Derived from the repository layout. A product surface is a package under packages/ that ships a distinct client, plugin, backend, or hosted service: cli = packages/opencode/ + packages/tui/ + packages/server/ + packages/sdk/ + packages/plugin/; vscode = packages/kilo-vscode/ + packages/kilo-web-ui/ + packages/kilo-ui/; jetbrains = packages/kilo-jetbrains/; gateway = packages/kilo-gateway/; web = packages/kilo-console/ + packages/kilo-indexing/ + packages/kilo-memory/ + packages/kilo-sandbox/. Docs route from the IA tree packages/kilo-docs/pages/ plus docs/jetbrains-vscode-settings-parity.md: each surface lists the pages sections that document it, and the per-platform pages under packages/kilo-docs/pages/code-with-ai/platforms/ map to the matching extension surface (the vscode/ directory to vscode, jetbrains.md to jetbrains). A doc path belongs to the surface with the longest matching prefix; a path that matches none of those prefixes falls to `other` (the explicit other prefixes are listed under other.docs). The cloud surfaces are derived the same way from the Kilo-Org/cloud layout: cloud-mobile = apps/mobile/, cloud-web = apps/web/, cloud-extension = apps/extension/, and cloud-agent = the cloud-agent packages under packages/ (packages/cloud-agent-sdk/ + packages/cloud-agent-profile/). A cloud source names its repository while a bare string still means this repository. The pages under packages/kilo-docs/pages/collaborate/ document the cloud web app (app.kilo.ai: teams dashboard, billing, SSO, adoption dashboard), so they route to cloud-web. No page under packages/kilo-docs/pages/ documents the browser side-panel extension yet, so cloud-extension lists no docs prefix.
- Map: `.github/docs-sync/surfaces.json`
- Surface map: `cli`, `vscode`, `jetbrains`, `gateway`, `web`, `cloud-mobile`, `cloud-web`, `cloud-extension`, `cloud-agent`, `other`
- Source prefixes: `apps/mobile/` (Kilo-Org/cloud)
- Doc prefixes: `packages/kilo-docs/pages/code-with-ai/platforms/mobile.md`
- Paths that fall to `other`: `packages/kilo-docs/pages/community/`, `packages/kilo-docs/pages/kiloclaw/`, `packages/kilo-docs/pages/contributing/`, `packages/kilo-docs/LEARNINGS.md`, `docs/`
- Reviewers are ranked from `Kilo-Org/cloud`; the workflow needs a token with `contents: read` on that repository (repository secret `CROSS_REPO_ACCESS_TOKEN`, exposed to the upsert step as `CLOUD_REPO_TOKEN`).
- How the two were computed: Reviewers for `cloud-mobile` are ranked from `Kilo-Org/cloud` git history over `apps/mobile/` (a commit 180 days old counts half as much, half-life 180 days). Bots (author type "Bot" or a login matching /\[bot\]$/i) and people without admin, write, or maintain permission are excluded.

### Changes

<!-- docs-sync:changes:start -->
| Docs change | Source |
| --- | --- |
| updated pages/code-with-ai/platforms/mobile.md | [Kilo-Org/cloud#6386](Kilo-Org/cloud#6386) |
| updated pages/ai-providers/openai-chatgpt-plus-pro.md | [Kilo-Org/cloud#6702](Kilo-Org/cloud#6702) |
| updated pages/code-with-ai/platforms/cloud-agent.md | [Kilo-Org/cloud#6683](Kilo-Org/cloud#6683) |
| updated pages/getting-started/byok.md | [Kilo-Org/cloud#6692](Kilo-Org/cloud#6692) |
<!-- docs-sync:changes:end -->

### Pending — will retry

<!-- docs-sync:pending:start -->
_None._
<!-- docs-sync:pending:end -->

### Considered, no docs change needed

<!-- docs-sync:skipped:start -->
| PR | Reason |
| --- | --- |
| [Kilo-Org/cloud#6658](Kilo-Org/cloud#6658) | Internal sandbox lifecycle fix with no user-visible workflow or setting. |
| [Kilo-Org/cloud#6673](Kilo-Org/cloud#6673) | Internal container CA trust plumbing, no user-facing behavior. |
| [Kilo-Org/cloud#6672](Kilo-Org/cloud#6672) | Internal sandbox launch/recovery fix with no documented workflow change. |
| [Kilo-Org/cloud#6660](Kilo-Org/cloud#6660) | Internal cloud-agent queue delivery fix; no new command, setting, or workflow for users. |
| [Kilo-Org/cloud#6226](Kilo-Org/cloud#6226) | Internal gateway alias-routing change, not user-visible. |
| [#14490](#14490) | Tool-call animation and streaming UI polish; users do not need to learn a new workflow. |
| [#14530](#14530) | Bug fix restoring intended worktree-pool behavior, no doc change needed. |
| [#14529](#14529) | Bug fix restoring tab/panel state across project switches. |
| [#14531](#14531) | Reconnect recovery bug fix, restores already-documented behavior. |
| [#14532](#14532) | Bug fix keeping session tab title in sync on rename. |
| [Kilo-Org/cloud#6088](Kilo-Org/cloud#6088) | Removes internal/admin model-experiment surfaces, not public product docs. |
| [Kilo-Org/cloud#6682](Kilo-Org/cloud#6682) | Internal control-socket reconnect race fix, no user-facing change. |
| [#14534](#14534) | Transcript re-render performance bug fix. |
| [#14535](#14535) | Bug fix preserving the loaded browser page across context switches. |
| [Kilo-Org/cloud#6684](Kilo-Org/cloud#6684) | Reverted by Kilo-Org/cloud#6685. |
| [Kilo-Org/cloud#6678](Kilo-Org/cloud#6678) | Dead-code constant removal, no user-visible effect. |
| [Kilo-Org/cloud#6687](Kilo-Org/cloud#6687) | Removes internal model-experiment maintenance and retains tables, no user-facing change. |
| [#14515](#14515) | JetBrains plugin unload crash fix, no documented behavior change. |
| [#14520](#14520) | JetBrains transcript/list rendering performance work. |
| [Kilo-Org/cloud#6614](Kilo-Org/cloud#6614) | Mobile PR Review header and session title bug fix, no doc change needed. |
| [Kilo-Org/cloud#6625](Kilo-Org/cloud#6625) | Internal mobile secure-store error-handling refactor. |
| [Kilo-Org/cloud#6624](Kilo-Org/cloud#6624) | Mobile auth bug fix that stops a retry loop; restores expected sign-in behavior with no new setting or workflow. |
| [#14310](#14310) | Contributor/CI fix making the kilo-v2 checkout installable; not user-visible product behavior. |
| [Kilo-Org/cloud#6611](Kilo-Org/cloud#6611) | Mobile notification-tap fix that selects the session's organization; restores correct behavior rather than adding a learnable feature. |
| [Kilo-Org/cloud#6644](Kilo-Org/cloud#6644) | Mobile sign-in layout/alignment polish; no change to what a user must do. |
| [Kilo-Org/cloud#6601](Kilo-Org/cloud#6601) | Mobile layout fix keeping empty states clear of the tab bar; purely visual. |
| [#14543](#14543) | CI/release infrastructure adding Windows binary code signing; no public docs impact. |
| [Kilo-Org/cloud#6616](Kilo-Org/cloud#6616) | Mobile visual defect fixes and a session-title fallback; no new user workflow or setting. |
| [Kilo-Org/cloud#6630](Kilo-Org/cloud#6630) | Reports an edge-case partial worktree restore; failure-path plumbing with no new user-facing workflow, target setting, or config. |
| [Kilo-Org/cloud#6699](Kilo-Org/cloud#6699) | Cloud Agent e2e stabilization plus internal idle-sandbox capacity handling; not user-visible. |
| [#14545](#14545) | Automated JetBrains release/changelog PR; underlying user-facing changes are triaged from their own PRs. |
| [Kilo-Org/cloud#6708](Kilo-Org/cloud#6708) | Internal AI-gateway request-logging policy change in the admin panel; no existing public docs surface and no change to how users run Kilo Code. |
| [#14533](#14533) | Documentation already shipped with the merged PR. The experimental.task_model_selection flag is gone from the current source, and pages/code-with-ai/agents/model-selection.md, pages/code-with-ai/agents/context-mentions.md, and pages/getting-started/settings/index.md already describe per-task selection as default-on with no stale experiment references. |
| [#14510](#14510) | Documentation already shipped with the merged PR. Marketplace companion-skill support is present in the current source (packages/opencode/src/kilocode/marketplace/companions.ts and installer), and pages/customize/marketplace.md already documents installing, publishing, and removing MCP servers with companion skills. |
<!-- docs-sync:skipped:end -->

---

(bot) Generated by the docs-sync workflow. Humans review and merge; while this PR stays open, the next daily run appends new changes here. Branch: `docs/auto-sync-2026-09-25`.
<!-- docs-sync: processed-through 2026-09-25T07:05:29.302Z -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants