feat(web): auto-reconcile external agent sessions on project open - #10386
Open
lewismarshall wants to merge 3 commits into
Open
feat(web): auto-reconcile external agent sessions on project open#10386lewismarshall wants to merge 3 commits into
lewismarshall wants to merge 3 commits into
Conversation
When environment shells bootstrap, automatically import external Claude Code and Codex sessions for every known project. This surfaces agent work already on disk in the thread list without requiring a manual "Import agent sessions…" action. The new useAgentSessionAutoReconcile hook reuses the existing idempotent agentSessions.import RPC. Each project is reconciled once per mount cycle; failures are silently ignored since a missing agent home is not actionable for the user. Refs: pingdotgg#6994, pingdotgg#6680 Co-authored-by: Lewis Marshall <lewismarshall@users.noreply.github.com>
Contributor
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds an always-on workflow that scans and imports external agent-session history for every known project when the chat experience starts, replacing a previously manual action. The new asynchronous production logic changes default runtime behavior and can create or update imported threads across projects. Not approved because:
Review your spending limits in Billing settings. You can add or adjust custom eligibility rules. Learn more. |
The original hook swallowed all import failures silently (.catch(() => {})),
making E2E debugging impossible when the server doesn't support the
agentSessions.import RPC (e.g. t3@0.0.38 predates PR pingdotgg#5362).
Changes:
- Add classifyImportFailure() that distinguishes four failure kinds:
unsupported-server (RpcClientError), interrupted, expected domain
errors, and unexpected defects.
- Log unsupported-server with a one-time console.warn naming the
required server version and PR pingdotgg#5362. Skip further import attempts
for that environment.
- Log expected errors (project not found, workspace mismatch, scan
error, auth) with console.warn including project context.
- Log unexpected errors with console.error for debugging.
- Log successful imports with console.info when importedCount > 0.
- Add 10 new unit tests for classifyImportFailure covering all
error classifications.
Co-authored-by: Lewis Marshall <lewismarshall@users.noreply.github.com>
selectUnreconciledProjects no longer eagerly adds keys to the reconciled set. The hook marks a project reconciled only after: - A successful import (importedCount + skippedCount returned). - A definitive domain error (project not found, workspace mismatch, scan error, auth error) — these won't resolve without user action. Transient failures (unsupported-server, unexpected defect, interrupted) leave the project eligible for retry on the next render cycle. This fixes the scenario where imports fail against an old server (pre-pingdotgg#5362) and the project is permanently marked done, preventing retry after a server upgrade without a full client remount. Also: console.info now logs for every successful import (even when importedCount is 0) with projectId, workspaceRoot, and skippedCount for E2E observability. Co-authored-by: Lewis Marshall <lewismarshall@users.noreply.github.com>
Contributor
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What Changed
Added always-on automatic reconciliation of external agent sessions (Claude Code, Codex) when projects become available on a connected environment.
A new
useAgentSessionAutoReconcilehook is mounted in the chat layout route. When environment shells bootstrap, it calls the existing idempotentagentSessions.importRPC for every known project, surfacing agent work already on disk in the thread list — without requiring a manual "Import agent sessions…" action.Related Ideas discussions:
Why
When connecting to a remote environment via T3 Connect, agent sessions already on disk (e.g. Claude CLI history under
~/.claude) do not appear in the project thread list unless the user manually triggers an import. The existingAgentSessionScanner+AgentSessionImporterinfrastructure (#5362) handles the heavy lifting, but is only wired into the first-run Welcome Wizard. Post-onboarding, there is no continuous visibility path.This PR adds the minimal client-side trigger to close that gap. It reuses the existing server-side import RPC, which is fully idempotent (thread IDs are prefixed with
import:, and per-source file-identity watermarks prevent re-reading unchanged transcripts).What shipped
useAgentSessionAutoReconcilehook: watches the project list, triggersagentSessions.importonce per project per mount cycleselectUnreconciledProjectspure function: extracted for testabilityChatRouteLayout(_chat.tsx)Out of scope
claude --remote-controlChecklist
Maintainer manual QA checklist
workspaceRootmatches agent sessioncwdon diskimport:threadsexpectedWorkspaceRootfails clearly / skips safelyTest commands (run in repo)
Refs: #6994, #6680