Repository navigation
feat(threads): every fork into a new tab carries the conversation itself - #236
Merged
Merged
Conversation
Forking from a user message, the model or account picker, the usage-limit banner and mobile Hand off now use upstream's native thread fork, as "Fork from this response" already did. A fork onto another model switches the new tab before its first message, so the conversation is handed to that provider on send. A summary is used only when no response has finished. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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.
Only Fork from this response used upstream's native thread fork. Every other way to fork a chat into a new tab used the fork's summary handoff: Fork into new tab on a user message, the model picker's fork button, the account picker's New tab, the usage-limit banner's Continue in new tab, and mobile Hand off. Those tabs started from a summary chip, not the real conversation with upstream's fork marker.
Fix
ForkThreadTabInputtakes an optionalmodelSelection.ThreadTabs.forkrunsthread.fork, thenthread.model-selection.seton the new tab when the model differs. Upstream's fork already resolves a cross-provider or cross-account fork on the first send by handing over the full conversation, and every adapter supports that.latestThreadForkPointandthreadForkPointBeforeMessagepick the completed response to fork from, including responses inherited from an earlier fork.docs/fork-differences.mdand the user guides.Screenshots
Tested in the web app against a copy of real data, on a Claude Opus 5.5 thread.
Fork into new tab on a user message. The new tab carries the conversation through the previous reply under upstream's "Forked from conversation" divider. The message waits in the composer, and the model stays Claude Opus 5.5.
Model picker fork onto GPT-6.1-Sol (Codex). The new tab carries the whole conversation through the latest reply and runs GPT-6.1-Sol. The server stored
codexas the new tab's provider.First message in that Codex tab. Upstream hands the Claude conversation to Codex on send: the thread shows a "Context handoff Claude Opus 5.5 → GPT-6.1-Sol" marker, and the stored transfer resolution is
portable_context. Codex recalls the previous exchange correctly.Notes
Verification
vp testonapps/server/src/threadTabs/ThreadTabs.test.tsandpackages/client-runtime/src/threadTabs.test.ts, both with new tests and both passing.🤖 Generated with Claude Code