Session Chat for Claude Code
Unofficial community extension, not affiliated with or endorsed by Anthropic. "Claude" and "Claude Code" are trademarks of Anthropic. Needs your own Claude plan and the claude CLI (v2.1.225+ on macOS/Linux, v2.1.234+ on Windows). macOS, Linux and Windows (Windows support is new and lightly tested).
A Messenger-style chat pane in VS Code for talking to a named Claude Code session (for example
hp-release running on another machine with Remote Control).
- Type a message; it is delivered to the target session.
- Online / busy / offline status for the target, like a chat app.
- Name + short time on every message; the target's replies show as plain text.
- Sign-in check, a session picker for every device on your account, and 5-hour / weekly usage bars.
- Replies are read verbatim from the relay's transcript, so no model rewording and no tool noise.
How it works
webview <-> extension host <-> hidden `claude --remote-control` (in a pty) <-> target session
Headless claude -p cannot hold a Remote Control connection, so the extension runs an interactive
claude --remote-control chat-relay inside a pseudo-terminal (media/pty_bridge.py, stdlib Python).
- Sending: a prompt
RELAY "<target>" "<text>" is typed into the relay; its system prompt makes it call
SendMessage with the text unchanged (one cheap haiku turn per message).
- Delivery status: the relay transcript (
~/.claude/projects/*/<session-id>.jsonl) records the
SendMessage call and result.
- Replies: incoming peer messages are stored in the transcript as
origin: {kind: "peer", body}.
- Presence:
/list-agents is typed into the relay on a timer. It is a slash command, so it uses no model tokens.
The relay only has SendMessage, ListAgents and ToolSearch, and is told never to act on peer messages.
Requirements
- macOS or Linux with
python3, or Windows 10/11 (uses ConPTY through a bundled module), and the claude CLI (v2.1.225+; v2.1.234+ on Windows) signed in with claude.ai (same account as the target).
- Target session running with Remote Control (
claude --remote-control hp-release), with crossSessionInbound
allowing messages, and the permissions it needs allow-listed (a message cannot approve a prompt).
- No
ANTHROPIC_BASE_URL, Bedrock/Vertex, or CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC (Remote Control is unavailable then).
Develop
npm install
npm run build # bundle to dist/
npm test # parser unit tests
Open this folder in VS Code and press F5 (Run Extension). The Session Chat icon appears in the activity bar.
Manual end-to-end check against the real CLI (--send really messages the target):
npx esbuild test/integration.ts --bundle --platform=node --outfile=dist/int.js
node dist/int.js # start relay, read presence
node dist/int.js --send "ping" # also send a message and print the reply
Package: npm run package produces a .vsix.
Settings
| Setting |
Default |
Meaning |
sessionChat.targetSession |
hp-release |
Session to chat with |
sessionChat.myName |
Mac |
Name on your messages |
sessionChat.relayName |
chat-relay |
Name the target sees you as |
sessionChat.model |
haiku |
Relay model |
sessionChat.claudePath |
auto |
Path to claude |
sessionChat.pollSeconds |
45 |
Presence refresh interval |
Keeping usage low
Every message costs a few small haiku calls on the relay, and the other session spends tokens on its own model
to read and answer. The pane shows the relay's own tokens under the quota bars. To keep the other session's
replies short, add this to that session's CLAUDE.md:
When a message arrives from another session (for example "chat-relay"), reply in one or two plain sentences.
No headings, no code blocks unless asked, and no restating the request.
Measured relay cost (one list-sessions request, warm cache, haiku)
|
calls |
new input |
cached input |
output |
| default relay |
2 |
5.1k |
15.3k |
109 |
| slim relay (default) |
2 |
3.4k |
8.9k |
32 |
Two calls is the floor: one to call the tool, one to read its result. Turning tool search off was tested and is
worse (every tool schema loads up front). The cache lasts about an hour, so messaging regularly keeps it warm;
the first message after a long pause pays for the cache again. There is no model-free path to a session on
another machine, so sending always costs those calls.
Windows
The relay needs a pseudo-terminal. macOS and Linux get one from media/pty_bridge.py (Python standard library).
Windows has no such module, so the Windows packages bundle @lydell/node-pty
(prebuilt ConPTY binaries, no compiler needed) under native/. The Marketplace serves each platform its own package.
claude is found with where.exe; a real claude.exe is preferred over an npm claude.cmd shim, which is run through cmd.exe.
- If something fails on Windows, set
sessionChat.claudePath to the full path of claude.exe and use Session Chat: Restart Relay.
- Not verified on Windows by the author yet. Please report what you see (Help > Toggle Developer Tools > Console, filter
session-chat).
Why a session may not reply
A session that receives a message answers in its own terminal. Its plain-text output is never delivered to the sender;
it has to call SendMessage back. Session Chat therefore appends a one-line note asking for that (setting sessionChat.replyHint).
If you turn the note off, put a rule in the other session's CLAUDE.md instead: reply to messages from other sessions with SendMessage.