Skip to content

Session History: resume folder workspace chats in their own folder - #27209

Merged
brennanb2025 merged 7 commits into
mainfrom
brennanb2025/session-history-folder-resume
Oct 11, 2026
Merged

brennanb2025 merged 7 commits into
mainfrom
brennanb2025/session-history-folder-resume

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

Agent Session History knows which workspace each saved chat belongs to by looking at the folder the chat ran in. It only ever looked among git worktrees. A chat that ran in a folder workspace (a plain folder, not a git worktree) therefore had no workspace, and resuming it either didn't work or opened it in the wrong place. Now folder workspaces count as owners too, so their chats resume back into their own folder, just like a worktree's chats resume into their worktree.

What Changed

The problem (found in #26798's live QA and reproduced on main): open a folder workspace that has saved agent chats, then open Session History:

  • Subagent rows that can be resumed on their own (OMP subagents; Claude subagents never get their own resume button) always had Resume disabled. Subagent rows never fall back to whatever workspace is active (that would resume them somewhere unrelated). The history couldn't place them in the folder, so they had no target at all.
  • The parent row showed its workspace as "Unavailable worktree" even though the folder is open in the sidebar. It had no "Resume in Worktree" / "Jump to Worktree" action.
  • If a git worktree was the active workspace instead, the folder chat's only resume action targeted that unrelated worktree. For Claude, that resume can't find the conversation, because Claude looks a transcript up by the directory it ran in.
  • The tab menu's "Resume in New Native Chat" / "Resume in New CLI" shares this gating and had the same gap.

After:

  • A chat (and its subagents) recorded in a folder workspace resumes into that folder from Session History and from the tab menu, whichever workspace is active.

  • The row shows the folder's name, plus "Current folder" when you're in it.

  • Jump takes you to the folder.

  • Folder rows are labelled as folders, never as worktrees: "Resume in Folder", a "Folder" heading, "Current folder" / "Folder" / "Archived folder", "Jump to Folder", and "Folder workspace is no longer available.". Before, they said "Unavailable worktree". Translated in all six languages.

Chats in git worktrees, SSH workspaces and WSL workspaces behave exactly as before, wording included.

Mechanism: the session→workspace match (buildWorktreeCandidates, fed by the panel's useAiVaultSessionWorktreeMap and the tab menu's resolveTabSessionSwitch) now receives the git worktrees plus folder workspaces as their standard folder:<id> rows (folderWorkspaceToWorktree, the same adapter the sidebar, dashboard and Linear views use).

Everything downstream already accepted a folder: target: resume gating, launch, host checks and folder activation. So the fix is one shared list, aiVaultSessionOwnerWorkspaces, used by both surfaces.

  • Ties keep their old answer: git worktrees come first and the candidate sort is stable. A git worktree at the same path as a folder, or nested inside it, keeps its own chats.
  • Host matching uses the folder's stored host, so an SSH or runtime folder only owns chats recorded on that host.
  • Both Session History jumps (to the conversation's workspace and to its original pane) now go through Orca's shared activateAndRevealWorkspace, and so does the panel's resume activation. That path routes folder: ids to folder activation, which checks the folder still exists and is reachable, and never sets a fake active project. The generic "Worktree is no longer available." toast stays for a workspace that's gone. It's skipped only when folder activation already showed its own reason, so the user never gets two toasts.

Why

The bug came from the ownership list missing a whole kind of workspace, not from the resume gate. A guard in the resume path (for example, "if the active workspace is a folder, allow it") would have fixed only the active-folder case. Subagent rows and the "Unavailable worktree" label would still be wrong. Adding folder workspaces to the one list every Session History surface reads fixes all of these and reuses the existing workspace-row concept.

The handoff suspected the panel's activeWorktreeId gate. I checked: a folder workspace's active id is already folder:<id>, and that gate accepts it. The parent row in an active folder was never the broken case.

Linked Issue

Found in #26798 live QA. No separate issue.

Visual Proof

Hidden test app with the same setup on both sides: a git project repo, a folder workspace "Notes" (a plain folder in a project group), and saved conversations recorded in that folder. Stand-in agent programs record where Orca launched them. "After" shots are from the final head caa3ec3c887.

1. Subagent of a folder conversation (OMP, the agent whose subagents can be resumed on their own)

Before (main) After (this PR)
before after
Notes folder open: the row says Unavailable worktree and the subagent's resume button is disabled. The subagent's resume button is enabled ("Resume in Folder") and the row no longer says unavailable. Clicking it resumes the subagent in a new tab in Notes, from Notes or from the git project.

2. Folder conversation while a git worktree is active (Claude)

Before (main) After (this PR)
before after
The only action was "Resume in New Tab". The resumed folder conversation opened as a tab of the unrelated git project (main stays selected, though the shell is in notes). The folder row names Notes, says Folder, and offers Resume in Folder and Jump to Folder. The git row below keeps its worktree wording.
After: row menu After: resumed into its folder
menu after-resume
The folder row's menu says "Jump to Folder" / "Resume in Folder"; nothing on a folder row says "worktree". Orca switches to Notes and resumes the conversation there; the rows now read Current folder · Notes.

Testing

  • New tests:

    • Folder ownership: the folder resolves as the owner; a nested or same-path git worktree keeps its chats; SSH-hosted folders match only that host's chats; an archived folder isn't a jump target.
    • Parent and subagent rows in a folder resume into the folder with a folder, a git worktree, or nothing active.
    • Git worktree chats are unchanged when folders exist.
    • Tab-menu/panel parity for a folder chat.
  • Ablation: with the fix reverted, 7 of the new tests fail.

  • All Session History and tab-menu test files pass (46 files, 428+ tests).

  • Label tests: folder rows read Folder in every label and menu; git rows keep the worktree text.

  • Jump feedback tests: one toast for a missing workspace or a folder id that exists on two hosts, none extra when folder activation already explained why.

  • tc:web and orca-ci-checks pass.

  • No main-process change: the main side (resume preparation, launch, agentSession.reveal) already handles folder: workspace ids.

  • Live QA (macOS, hidden test app with stand-in agents, no real agent logins): before (main dab3f6e) and after (branch). The driver was Codex gpt-5.6-terra.

    • Folder Claude conversation: resumes into Notes, both with Notes active and with the git project active (it switches to Notes).
    • Folder Codex CLI session: the tab lands in Notes.
    • OMP subagent in Notes: disabled on main; enabled on the branch, resumes into Notes from either workspace.
    • Jump to Folder from the git project lands on Notes.
    • Git conversation control: identical on main and the branch.
    • No render errors, page errors or extra notices. The real ~/.claude, ~/.codex and ~/.orca were hashed before and after: unchanged.
    • Not verified live: re-attaching a real Codex conversation. The stand-in can't serve a Codex resume, so Orca printed its "previous session unavailable, started fresh" fallback on both main and the branch. Also not verified live: SSH, WSL and Windows; those are covered by unit tests only.
  • I manually tested these changes locally

  • Automated tests added/updated, or explained why not below

Review

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • SSH / WSL / runtime: folder rows carry the host the folder catalog stamped on them, and matching is host-checked as before. An SSH or runtime folder only owns chats from its own host. WSL folders resolve through the same WSL-distro gate the active-folder resume already used.
  • Windows / Linux: path matching uses the existing cross-platform matcher, including the WSL UNC alias.
  • Performance: the session map now also rebuilds when the folder workspace list changes, which already happens for git worktree list changes. It adds one candidate per folder workspace.
  • Not in this PR (follow-ups):
    • Session History search scoped to "This workspace" still doesn't resolve a folder:<id> workspace on the host side (session-search-scope-resolution.ts). That's a listing/search gap, separate from resume.
    • The floating workspace isn't a history owner.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

…older

Session History matched a session to its workspace only among git worktrees, so a
conversation recorded in a folder workspace had no owner: its subagent rows could
never resume, and the parent row only offered whatever workspace happened to be
active. Folder workspaces now join the owner list as their usual folder: rows.
…hout a second toast

Both Session History jumps and the resume activation now go through
activateAndRevealWorkspace, which owns the folder routing and its path gate.
A folder the gate refuses already shows why, so the generic 'no longer
available' toast is kept only for a workspace that is actually gone.
…d not pick a folder

Folder activation only explains a refusal once it resolves the folder's
owner; an id present on two hosts returns before any toast. Suppress the
generic toast only when that owner resolves.
@brennanb2025

brennanb2025 commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor Author

Review summary (head caa3ec3c887)

The problem. Session History decides which workspace a saved conversation belongs to by matching the folder it ran in, and it only checked git worktrees. A conversation recorded in a folder workspace (a plain folder in a project group, not a git worktree) therefore belonged to nothing:

  • the row said "Unavailable worktree";
  • subagents that can be resumed on their own (OMP) had Resume disabled;
  • with a git worktree active, the only resume target was that unrelated worktree, so the conversation opened as one of its tabs.

What changes for the user. Folder conversations and their subagents now show the folder's name, and resume into that folder from Session History and from the tab menu, whichever workspace is active. Jump takes you to the folder.

Folder rows are labelled as folders, never as worktrees, in all six languages:

  • "Resume in Folder"
  • a "Folder" heading with a folder icon
  • "Current folder" / "Folder" / "Archived folder"
  • "Jump to Folder" in the tooltip and both row menus
  • "Folder workspace is no longer available."

Git worktree, SSH and WSL rows behave and read exactly as before.

How. Folder workspaces join the session→workspace matching list as the same folder:<id> rows the sidebar already uses. Git rows go first, so a git worktree at the same path keeps its own chats. Everything downstream already accepted a folder target. The panel's jumps and resume activation now go through Orca's shared activateAndRevealWorkspace, which handles folders with their path check.

Review loop.

  • Round 1:
    • The architecture challenger designed a fix from the issue alone, and it matched this design: keep, no split.
    • The adversarial reviewer found no P0–P2.
    • Fixed:
      • Jump to a folder that's refused showed two error toasts.
      • The resume code duplicated the shared workspace activation function.
      • A WSL-path test was added.
  • Round 2: one P3 from the round-1 fix. A folder id present on two hosts got no feedback on Jump. Fixed, and tested against the real owner lookup.
  • Coordinator review: folder rows must not say "worktree". Fixed by labelling each row by its workspace kind, derived from the row's folder: id.
  • Round 3: reviewed that wording change and found the row's "…" and right-click menus still said "Jump to Worktree" (P2, fixed). Spanish and Japanese strings were aligned with the existing worktree ones.
  • Readiness checklist: PASS, no proven P0/P1/P2.

Deferred (pre-existing or out of scope, in the PR notes):

  • Session History search scoped to a folder workspace finds nothing, because the host can't resolve folder:<id> (P2, follow-up).
  • Resume lookups find folders by id alone when the same id exists on two hosts.
  • Folder rows still say "worktree".
  • Reopening a native-chat row uses the git-only activator.
  • The floating workspace isn't matched.

Verified:

  • Unit tests for ownership, parent and subagent resume, tab-menu parity, jump feedback, and folder versus worktree labels (including the row menu). Ablation: 7 new tests fail without the fix.
  • 46 Session History/tab-menu test files pass. tc:web and orca-ci-checks (23/23) pass.
  • CI on caa3ec3c887: 14 pass, 0 fail, 16 path-gated skips. The localization catalog, extraction and coverage checks pass.
  • Live wording check at the final head: a DOM scan of every folder row found no "worktree" in text, aria-labels, titles, tooltips or menus. Git rows still say "Current worktree" / "Resume in Worktree".
  • Live before/after on a hidden macOS test app with stand-in agents (screenshots in the PR body): a Claude parent, a Codex CLI session, an OMP subagent, and the git control. The driver was Codex gpt-5.6-terra.
  • Real ~/.claude, ~/.codex and ~/.orca hashes unchanged.

Not verified:

  • Live SSH, WSL and Windows (unit tests only).
  • Re-attaching a real Codex conversation: the stand-in can't serve one, and Orca's "started fresh" fallback appeared identically on main and the branch.
  • Claude subagents: they have no resume button of their own, by design.

QA note. My first rig launcher had a broken free-port check, and another lane's QA driver briefly attached to my rig. I told that lane, fixed the launcher, and reran all evidence on clean rigs.

@brennanb2025
brennanb2025 marked this pull request as ready for review October 10, 2026 10:26
@coderabbitai

coderabbitai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6ce7aa7f-4245-48e8-8d85-b8b0d197f1c4



📥 Commits

Reviewing files that changed from the base of the PR and between 04cf042 and caa3ec3.




📒 Files selected for processing (19)
  • src/renderer/src/components/right-sidebar/AiVaultSessionActionMenuItems.test.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionActionMenuItems.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionDetails.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionRow.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionSubagents.test.tsx
  • src/renderer/src/components/right-sidebar/SessionRowTrailingActions.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-resume.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-row-display.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree-affordances.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree.ts
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json



Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.





📝 Walkthrough
📝 Walkthrough
📝 Walkthrough

Walkthrough

AI Vault session ownership and resume-target resolution now include folder workspaces. Original-pane navigation and resume-in-chat launch use unified workspace activation. Session details and navigation actions show folder-specific labels and statuses. Tests cover folder ownership, resume targets, activation outcomes, and tab switching.





Priority: ⬇️ Low

Merge Risk: 🟡 Moderate · up to caa3e

Folder sessions with duplicate IDs across hosts can fail to open, and may target the active host rather than the session's owner. Resolve host-qualified activation before merging.

Pre-merge checks | Passed 4 | Failed 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 17.86% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 28 functions across 20 files. (6 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly and concisely describes the main change: resuming Session History chats in their owning folder workspace.
Description check Passed The description is detailed and mostly complete. It explains the problem, user-visible changes, implementation, testing, visual proof, compatibility considerations, and out-of-scope items. Minor gaps …

Full details: Docstring Coverage

Explanation

Docstring coverage is 17.86% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 28 functions across 20 files. (6 skipped: 6 unsupported.)


  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR





  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d633f68c-7955-483b-99be-cd0bea3206d1
📥 Commits

Reviewing files that changed from the base of the PR and between 3c71318 and 04cf042.

📒 Files selected for processing (11)
  • src/renderer/src/components/right-sidebar/AiVaultPanel.legacy-filter.test.tsx
  • src/renderer/src/components/right-sidebar/AiVaultPanel.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-resume-in-chat-launch.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-resume-in-chat-launch.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree-map.test.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-worktree.ts
  • src/renderer/src/components/tab-bar/tab-session-history-switch.parity.test.ts
  • src/renderer/src/components/tab-bar/tab-session-history-switch.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.

}

function revealSessionWorkspace(workspaceId: string): boolean {
if (activateAndRevealWorkspace(workspaceId) !== false) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

🔎 Supported by static analysis

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C 12 'function activateAndRevealFolderWorkspace|function activateAndRevealWorkspace|findFolderWorkspaceOwner|getPreferredFolderExecutionHostId' \
  src/renderer/src/lib/worktree-activation.ts \
  src/renderer/src/lib/folder-workspace-runtime-owner.ts
rg -n -C 5 'activateAiVaultResumeWorkspace\(|jumpToWorktree\(' src/renderer/src/components

Repository: stablyai/orca

Length of output: 29313


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf '%s\n' '--- original pane actions ---'
nl -ba src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.ts | sed -n '1,180p'
printf '%s\n' '--- resume launch ---'
nl -ba src/renderer/src/components/right-sidebar/ai-vault-session-resume-in-chat-launch.ts | sed -n '1,180p'
printf '%s\n' '--- activation owner implementation ---'
nl -ba src/renderer/src/lib/worktree-activation.ts | sed -n '80,125p;333,365p'
nl -ba src/renderer/src/lib/folder-workspace-runtime-owner.ts | sed -n '1,80p'
printf '%s\n' '--- indexed owner definitions/usages ---'
rg -n -C 8 --glob '*.ts' -- 'findIndexedFolderWorkspaceOwner|function findIndexedFolderWorkspaceOwner|const findIndexedFolderWorkspaceOwner' src/renderer/src src/shared
printf '%s\n' '--- session host fields and callers ---'
rg -n -C 6 --glob '*.ts' -- 'executionHostId.*targetId|targetId.*executionHostId|activateAiVaultResumeWorkspace\(|jumpToWorktree\(' src/renderer/src/components/right-sidebar

Repository: stablyai/orca

Length of output: 42315


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf '%s\n' '--- indexed folder owner implementation ---'
nl -ba src/renderer/src/lib/worktree-runtime-owner-index.ts | sed -n '1,340p'
printf '%s\n' '--- original pane target definition and session types ---'
rg -n -C 12 --glob '*.ts' -- 'findOriginalAiVaultSessionPane|interface AiVaultSession|type AiVaultSession|executionHostId' \
  src/renderer/src/components/right-sidebar/ai-vault-original-pane.ts \
  src/shared/ai-vault-types.ts \
  src/renderer/src/components/right-sidebar/ai-vault-original-pane-index.ts
printf '%s\n' '--- target construction and resume target identity ---'
rg -n -C 12 --glob '*.ts' -- 'targetId|worktreeId:.*session|executionHostId:.*session|jumpToWorktree\(' \
  src/renderer/src/components/right-sidebar src/renderer/src/lib

Repository: stablyai/orca

Length of output: 45667


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf '%s\n' '--- original pane target shape and construction ---'
nl -ba src/renderer/src/components/right-sidebar/ai-vault-original-pane.ts | sed -n '1,70p;180,250p'
nl -ba src/renderer/src/components/right-sidebar/ai-vault-original-pane-index.ts | sed -n '1,95p'
printf '%s\n' '--- original-pane action call sites ---'
rg -n -C 8 --glob '*.tsx' --glob '*.ts' -- 'jumpToOriginalPane|jumpToWorktree|getOriginalPaneTarget' src/renderer/src/components/right-sidebar
printf '%s\n' '--- resume action inputs and target construction ---'
nl -ba src/renderer/src/components/right-sidebar/ai-vault-session-launch-actions.ts | sed -n '1,180p'
rg -n -C 10 --glob '*.ts' --glob '*.tsx' -- 'targetId\s*=|targetId\s*:|executionHostId' src/renderer/src/components/right-sidebar/ai-vault-session-launch-actions.ts src/renderer/src/components/right-sidebar/*session*history* src/renderer/src/components/right-sidebar/*vault*

Repository: stablyai/orca

Length of output: 45666


🏁 Script executed:

#!/bin/bash
set -euo pipefail
nl -ba src/renderer/src/components/right-sidebar/ai-vault-session-launch-actions.ts | sed -n '60,165p'
rg -n -C 6 --glob '*.tsx' --glob '*.ts' -- 'jumpToWorktree\(' src/renderer/src/components/right-sidebar
rg -n -C 6 --glob '*.tsx' --glob '*.ts' -- 'resumeAiVaultSessionInNewChat|activateAiVaultResumeWorkspace' src/renderer/src/components/right-sidebar

Repository: stablyai/orca

Length of output: 32053


Pass executionHostId through folder activation.

When the same folder ID exists on multiple hosts, the unqualified lookup is ambiguous and activation can return false. Pass session.executionHostId to activateAndRevealWorkspace for original-pane jumps, folder-row jumps, terminal resume, and resume-in-chat. Pass the same host to the fallback findFolderWorkspaceOwner check.

Update activateAiVaultResumeWorkspace to accept the host and forward { executionHostId }. Update its callers to pass the session host.

📍 Affects 2 files
  • src/renderer/src/components/right-sidebar/ai-vault-original-pane-actions.ts#L118-L118 (this comment)
  • src/renderer/src/components/right-sidebar/ai-vault-session-resume-in-chat-launch.ts#L14-L14

Folder rows now read 'Resume in Folder', 'Folder' (details heading),
'Current folder' / 'Folder' / 'Archived folder', 'Jump to Folder', and
'Folder workspace is no longer available.'. The kind is derived from the
row's folder: workspace id; git worktree rows are unchanged.
…rows

Also shows a plain folder icon on a folder row's details heading and aligns
the Spanish and Japanese folder strings with their worktree counterparts.
@brennanb2025
brennanb2025 merged commit bedf6f5 into main Oct 11, 2026
30 checks passed
@brennanb2025
brennanb2025 deleted the brennanb2025/session-history-folder-resume branch October 11, 2026 20:15
brennanb2025 added a commit that referenced this pull request Oct 15, 2026
…27209)

* fix(session-history): resume folder workspace sessions in their own folder

Session History matched a session to its workspace only among git worktrees, so a
conversation recorded in a folder workspace had no owner: its subagent rows could
never resume, and the parent row only offered whatever workspace happened to be
active. Folder workspaces now join the owner list as their usual folder: rows.

* test(session-history): mock folderWorkspaces as the array the store holds

* fix(session-history): jump through the shared workspace activator without a second toast

Both Session History jumps and the resume activation now go through
activateAndRevealWorkspace, which owns the folder routing and its path gate.
A folder the gate refuses already shows why, so the generic 'no longer
available' toast is kept only for a workspace that is actually gone.

* fix(session-history): keep the jump toast when folder activation could not pick a folder

Folder activation only explains a refusal once it resolves the folder's
owner; an id present on two hosts returns before any toast. Suppress the
generic toast only when that owner resolves.

* test(session-history): type the folder fixture without an assertion

* fix(session-history): call folder workspaces folders, not worktrees

Folder rows now read 'Resume in Folder', 'Folder' (details heading),
'Current folder' / 'Folder' / 'Archived folder', 'Jump to Folder', and
'Folder workspace is no longer available.'. The kind is derived from the
row's folder: workspace id; git worktree rows are unchanged.

* fix(session-history): say Jump to Folder in the row menus for folder rows

Also shows a plain folder icon on a folder row's details heading and aligns
the Spanish and Japanese folder strings with their worktree counterparts.

(cherry picked from commit bedf6f5)
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.

1 participant