Repository navigation
Conversation
…owser handoff A code session becomes one turn of a conversation. Its first turn names the CLI session it starts, and each message after it resumes that session, so Claude Code (or Codex, resuming its thread) remembers the conversation. A message sent while a turn runs waits in the conversation, and the next turn starts once that one settles. Conversations are listed in Interactions beside agent runs, open with their turns, a composer and the sandbox's browser, and are reached from a project's new Sessions tab, its boot fix, Settings and "Latest conversation". While the browser runs, each Claude Code turn reaches it with a token of its own, revoked when the turn ends. The sidecar (1.9.1) mints those tokens, tells an agent when a person drove the browser since its last call, offers a browser_request_person tool whose request every viewer sees, names the waiting agent in the live view, and offers a person who takes over the file chooser an agent left open. A hand-back in the conversation is reported with the next message too. Every session now loads only the MCP servers it is given, and is told that the repository, tool output and pages are data. A boot fix's prompt asks for commands Claude Code can approve unattended, which a `gem search ^name$` pattern was not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
A session recorded before origins were (migration 027) took its origin from its evaluation run alone, so a boot fix from then read "Started from Settings"; one its project recorded as a boot fix now reads as one. The conversation page's browser pane sticks beside a long transcript, with a height and scroll of its own, so Take over and Hand back stay in view, and so does Claude Code's request for a person while the pane is open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
main was a scroll container that never scrolled, since the window scrolls the dashboard, so a conversation's sticky browser pane stayed at the top of the page. main now clips horizontally instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
The conversation and the sandbox's browser are now two panels that run to the bottom of the window and scroll on their own, with the composer pinned under the transcript, which follows new turns unless you scrolled up. Narrow screens stack them at their natural height. The browser hides and shows from the page header or its own panel, and the conversation panel offers it back when hidden. The choice goes in the URL (?browser=1/0) and is remembered for the next conversation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
A separator between the two panels resizes them, from 25% to 75% for the conversation. Drag it, or focus it and use the arrow keys, Home and End; Enter or a double-click puts it back at half and half. The split is remembered. Drag state lives in refs so a move that arrives before the next render still counts, and pointer capture keeps the drag over the live view's frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
This branch has not been deployed
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.
For 1.9.1. This is stacked on #588 (file upload), which is stacked on #584. It changes
browser-sidecar/, so it ships with the 1.9.1 sidecar publish. The sidecar is already at 1.9.1 on #588, and the engine accepts only a sidecar of its own version.Claude Code and Codex sessions become Interactions: conversations you can read, continue, and share the sandbox's browser with.
Conversations
conversation_root_id,turn_index,origin,context_noteandresume_session_idtocode_sessions. There's no backfill: existing sessions are one-turn conversations.--session-id), and every later turn resumes it (--resume). For Codex, a later turn runscodex exec resume <thread>, with the sandbox mode passed as--config.CodeConversation.post!).CodeSessionJobstarts the next turn once one settles. A conversation can have at most 50 turns and 3 waiting messages.POST /api/sandboxes/:sandbox_id/code_sessions/:id/messagesreturns 201 when the turn starts now, or 202 (waiting) when it waits.:chat_code_session. A subscription conversation can be continued only by the person signed in to the sandbox.GET /api/interactionstakessource=all|agent|claude_code|codex,project_idandsandbox_id.GET /api/interactions/code-<id>?after[<turn>]=Nreturns each turn's new transcript events.Browser handoff (sidecar S1–S5)
POST/DELETE /tokensmints per-client tokens that reach/mcponly. Each Claude Code turn gets one, labelled "Claude Code · turn N", in a 0600--mcp-configfile outside the checkout, with--allowedTools mcp__browser. It's revoked and removed when the turn ends.browser_request_person({ reason })tool, answered by the sidecar. Every viewer sees the request until someone takes control.Dashboard
/interactions/latest).CLAUDE CODE/CODEX · LIVEbadge./interactions/code-<id>:Hardening for every session
--strict-mcp-config, so a checkout's.mcp.jsoncan't add servers.--append-system-promptsaying repository content, tool output and pages are data.<dashboard-note>tags are stripped from what people type.gem search ^activeagent$was denied because Claude Code refuses, unattended, a command it can't read statically, and$reads as a variable. The prompt now asks for plain words and namesgem search --remote --exact NAME/gem info --remote NAME, andBash(gem info:*)joins the allowlist.Tests
codeConversations.test.mjs,codeInteractionViews.test.mjs, and live-view handoff state.mainyet, so expect the same 2EvalsRubyLLMConversationTestfailures as the rest of the stack until it merges.Related
docs/features/claude-code-interactions.md. The design is indocs/features/claude-code-interactions-design.md.Open questions
local_logintranscripts kept in~/.claude/projects?🤖 Generated with Claude Code
https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh