Capability
Session handoff
Move an in-progress local Claude Code, Codex CLI, or opencode session into a fresh boxkite sandbox — full conversation history, not a task summary — and keep interacting with it from there. The CLI keeps running under your own portable, scoped credential, never a copy of your laptop's raw login session.
How a handoff runs
Every step below composes existing, already-reviewed primitives — sandbox creation, file_create, and the same takeover PTY the dashboard's own terminal uses. No new control-plane or sidecar surface was added for this.
How a handoff runs
Locate session
The adapter finds your tool's real on-disk session state (or, for opencode, its own export format) and a portable, scoped credential -- never your raw browser login session.
Install & run
boxkite-handoff is a separate companion CLI, built on the Python SDK — it is not yet published to a registry. Install it from a checkout of this repo:
pip install ./handoff-cli
BOXKITE_API_KEY=... BOXKITE_BASE_URL=... boxkite-handoff claude-codePass --session <id> for a specific session, or omit it to hand off whichever local session was modified most recently.
How credentials stay safe
Your credential is never typed anywhere as a literal value. It's written once to a short-lived file, read back with a single reference to its path, and deleted immediately by that same command — so at no point does the raw token appear in a command, a log line, or shell history.
- Always the tool's own portable, scoped, independently-revocable token — never your raw browser/OAuth session.
- Written only to a short-lived file under
/tmp, never anywhere that syncs to durable storage. - Deleted by the same command that reads it, and every session identifier is validated before it can reach a shell command.
Full technical design
docs/handoff-adapters.md in the repo for the complete adapter contract, architecture diagrams, and security design behind this.Supported tools
| Tool | Status | Credential |
|---|---|---|
| Claude Code | Supported — cwd-sensitive resume | claude setup-token |
| Codex CLI | Supported — path-based resume | OPENAI_API_KEY or a personal access token |
| opencode | Supported — via export/import | provider API key from auth.json |
| Cursor | Not yet — cursor-agent's local session store couldn't be confirmed as a portable, copyable file. Raises a clear error rather than faking support. | — |
The adapter contract is designed for community contribution — adding a new tool means implementing onelocate_session() call, not touching the shared orchestration. See docs/handoff-adapters.md's "Adding a new adapter" section.
Where this fits today
Not an MCP capability, and not a control-plane API
boxkite-handoff is a standalone local CLI for exactly this reason, and it composes existing control-plane/SDK primitives rather than adding new ones — there is nothing new to call directly from the Python/JS/Go/Rust SDKs either.Related
- Python SDK —
boxkite-handoffis built directly onBoxkiteClient. - Audit log & takeover — the same channel this feature attaches to, and why everything typed on it gets logged.
- Secrets management — a different trust boundary (brokering a third-party key to a semi-trusted agent) than a handoff's own credential handling.
- MCP server — why this capability isn't exposed as an MCP tool.
- Security model — the broader defense-in-depth posture this feature was built to fit inside, not around.