Cross-Session Messaging Claude Code: Sesi yang Saling Bicara

Hanya teks biasa. Pesan adalah sepotong teks yang ditulis satu Claude untuk Claude lain — bukan riwayat percakapan dan bukan file. Sesi penerima mendapat nama pengirim, teksnya, dan alamat balasan. Kalau Anda butuh seluruh konteksnya di terminal lain, lakukan resume sesi alih-alih mengirim pesan.
Tidak. Claude Code memberi tahu Claude penerima bahwa pesan itu datang dari sesi lain, bukan dari Anda, jadi ia tidak pernah dihitung sebagai persetujuan dan tidak bisa menjawab permission prompt yang tertunda. Claude penerima juga diinstruksikan untuk tidak pernah mengubah permission settings atau CLAUDE.md karena permintaan sesi lain, dan slash command di dalam teks pesan tiba sebagai teks biasa.
Hanya ketika pesannya meninggalkan mesin. Pesan ke sesi di mesin yang sama berjalan lewat Unix socket per sesi, atau named pipe di native Windows, dan tidak pernah menyentuh server Anthropic. Pesan ke sesi Anda di mesin lain menumpang koneksi Remote Control, dan pesan ke Claude Code on the web langsung menuju sesi cloud.
Pengiriman sesama mesin bekerja lewat tiap sesi yang mendaftarkan dirinya dalam file di disk, jadi dua sesi hanya bisa saling menjangkau bila melihat file yang sama. Container punya filesystem sendiri, sehingga sesi di dalamnya dan sesi di host saling terisolasi. Hal yang sama berlaku untuk sesi WSL 2 dan sesi native Windows pada satu komputer.
Menerima dan mengirim adalah dua kendali terpisah. Setel crossSessionInbound ke refuse untuk membuang pesan masuk, dan tambahkan permission deny rule bernama SendMessage serta ListAgents untuk menghentikan sesi ini mengirim atau melakukan listing. Administrator bisa menggabungkan keduanya di managed settings untuk mematikan fitur ini di seluruh organisasi.

Ringkasan Utama
Cross-session messaging Claude Code memungkinkan satu sesi Anda mengirim pesan teks biasa ke sesi lain lewat nama, memakai tool ListAgents dan SendMessage. Bukan riwayat percakapan dan bukan file — hanya teks. Pengiriman sesama mesin lewat socket per sesi yang tidak pernah menyentuh server Anthropic; pengiriman antarmesin menumpang koneksi Remote Control.
Saya pernah membuka tiga terminal pada repository yang sama: satu memigrasi schema, satu menulis ulang lapisan API terhadap schema itu, dan satu yang benar-benar saya awasi. Sesi API menghabiskan sebelas menit membangun terhadap kolom yang sudah diganti namanya empat puluh menit sebelumnya di sesi migrasi. Sayalah lapisan integrasi di antara keduanya, dan saya sedang tertidur di posisi itu.
Cross-session messaging adalah perbaikan untuk persis kasus itu, dan ia menyala secara default pada versi yang cukup baru tanpa perlu diaktifkan. Tulisan ini membahas cara sesi saling mengalamatkan, tiga kemungkinan nasib sebuah pesan yang tiba, model kepercayaan yang mencegah pesan dipakai sebagai persetujuan, ke mana pesan benar-benar berjalan, dan socket di bawahnya yang bisa dituliskan oleh sebuah hook.
Satuannya sengaja dibuat kecil: satu Claude menulis sepotong teks untuk Claude lain. Ia bukan riwayat percakapan dan bukan file. Kalau yang Anda inginkan adalah seluruh konteksnya, itu bukan messaging, itu resume sesi — dan salah memilih di antara keduanya adalah kekeliruan paling umum pada fitur ini.
Claude memakai dua tool, dan Anda tidak memanggil satu pun sendiri. ListAgents menemukan siapa yang bisa dijangkau dan SendMessage mengantarkan ke satu target lewat nama. Tool SendMessage yang sama juga mengalamatkan subagent dan teammate agent team, dan itu penting nanti: menolak tool ini menghapus ketiganya sekaligus.
Anda bisa menyerahkan penentuan target sepenuhnya ke Claude, atau menyebut sesinya sendiri lewat at-mention. Picker mention baru muncul setelah Anda mengetik minimal satu huruf sesudah tanda at — setelah tanda at kosong, baris sesi tidak muncul sama sekali, dan itu terbaca seolah fiturnya tidak ada.
# See what this session can reach. The FIRST line is this
# session's own name — the one your other sessions use to
# reach it. This session is never one of the rows below it.
/list-agents # also available as /peers
# Address a session by name in your own prompt. Type @ then
# at least one letter; a bare @ shows no session rows.
Let @api-worker know the schema migration finished
# Or leave the targeting to Claude entirely:
Ask the session in my other terminal whether the migration finished
# Ask to be told once when another session goes idle.
# One-shot, no polling, dropped after 12 hours.
Tell me when the migration session finishes what it is working onNama tidak dijamin unik. Ketika Anda memulai atau mengganti nama sesi dengan nama yang sudah dipakai sesi lain yang hidup, Claude Code membiarkan nama itu pada pemiliknya dan mengubah nama milik Anda menjadi varian. Sesi tetap bisa berakhir memakai nama yang sama, jadi listing menampilkan working directory tiap sesi lokal untuk membedakannya, dan bila lebih dari satu sesi hidup menjawab nama yang disebut, Claude bertanya dulu yang mana yang Anda maksud sebelum mengirim.
Claude penerima membaca pesan di sela tool call selama sebuah giliran aktif, jadi tool yang sedang berjalan tidak pernah terputus; kalau sesinya sedang idle, pesan itu memulai giliran baru. Yang sering luput adalah kedatangannya bukan dua kemungkinan. Setiap pesan berakhir di salah satu dari tiga keadaan:
Bagian ini layak dibaca dua kali, karena inilah yang membuat fiturnya aman dibiarkan menyala. Ketika sesi A mengirim pesan ke sesi B, Claude Code memberi tahu Claude di B bahwa pesan itu datang dari sesi lain, bukan dari Anda, lalu membatasi apa yang bisa dilakukannya:
Aturannya berlaku juga di sisi pengirim: Claude diinstruksikan untuk tidak pernah meminta sesi lain melakukan sesuatu yang ditolak atau diblokir di sesinya sendiri, dan mengembalikan pekerjaan itu kepada Anda. Teammate yang ditolak sebuah aksi tidak bisa mengoper permintaan itu ke rekannya agar dikerjakan. Itu menutup celah yang paling kentara, dan itulah alasan saya berhenti khawatir membiarkan inbound pada accept.
Satu setting menentukan apa yang dilakukan sebuah sesi terhadap pesan masuk, dan ia punya nilai tengah yang sungguh berguna. Ada pula kendali terpisah untuk pesan yang keluar dari mesin, dan sepasang deny rule untuk mematikan pengiriman sepenuhnya.
// Choose what a session does with messages from your others.
{
"crossSessionInbound": "accept" // accept | hold | refuse
}
// Require your approval before any message leaves this machine.
// A true from ANY settings scope applies, so a checked-in
// project file can turn the requirement ON but never OFF.
{
"isolatePeerMachines": true
}
// Turn it off for a whole organisation, in managed settings.
// Note both directions: deny rules stop sending and listing,
// crossSessionInbound stops receiving.
{
"permissions": { "deny": ["SendMessage", "ListAgents"] },
"crossSessionInbound": "refuse"
}Kalau tidak ada nilai yang berlaku, Claude Code memutuskan per pesan berdasarkan kelas permission mode kedua sesi. Sesi yang melewati permission prompt membentuk satu kelas dan sisanya kelas lain. Sesi yang meminta permission mengantarkan tiap pesan, dan hanya menahan pesan bila pengirimnya mengaku melewati prompt; sesi yang melewati prompt menahan tiap pesan untuk persetujuan Anda, dan hanya mengantar bila pengirimnya juga melewati. Pesan yang ditahan memunculkan dialog persetujuan yang kedaluwarsa dalam lima menit secara default dan bisa disetel agar tidak pernah kedaluwarsa.
Apakah sebuah pesan menyentuh server Anthropic sepenuhnya bergantung pada di mana sesi lawan berjalan, dan perbedaan itu layak Anda ketahui sebelum mengirim apa pun yang sensitif antarterminal.
Tiga tujuan, tiga rute:
| Di mana sesi lain berjalan | Cara pesan berjalan | Menyentuh server Anthropic |
|---|---|---|
| Di mesin ini | Unix socket per sesi, atau named pipe di Windows | Tidak |
| Di mesin Anda yang lain | Lewat koneksi Remote Control mesin tersebut | Ya |
| Di Claude Code on the web | Langsung ke sesi cloud | Ya |
Pengiriman sesama mesin bekerja lewat tiap sesi yang mendaftarkan dirinya dalam file di disk, jadi dua sesi hanya bisa saling menjangkau bila mereka melihat file yang sama. Sesi di dalam container dan sesi di host tidak bisa saling berkirim pesan. Begitu pula sesi di dalam WSL 2 dan sesi native Windows di komputer yang sama, karena keduanya mendaftar di bawah home directory berbeda dan mendengarkan tipe socket berbeda. Ini terlihat seperti bug padahal batas filesystem.
Setiap sesi dengan messaging mengikat sebuah inbox socket, dan Claude Code mengekspor path-nya sekaligus token per sesi ke hook dan perintah Bash. Itu mengubah detail implementasi privat menjadi sesuatu yang benar-benar berguna: sebuah script atau hook bisa menulis balik ke sesinya sendiri, dan begitulah cara Anda membuat build panjang atau callback CI berbicara ke percakapan yang memulainya.
# Each session binds its own inbox. Find the path two ways:
/status # the "Peer address" row, prefixed uds:
# Or from a hook or Bash command, where Claude Code exports it:
echo "$CLAUDE_CODE_MESSAGING_SOCKET"
echo "$CLAUDE_CODE_MESSAGING_TOKEN"
# A script can post back into its OWN session's socket. On
# native Windows the auth line is REQUIRED; on macOS and Linux
# it is optional. Send it as the first line of the connection:
#
# type=auth, token=$CLAUDE_CODE_MESSAGING_TOKEN
#
# Unix domain socket on macOS/Linux, named pipe on Windows.
# Restricted to your OS user either way, so another user's
# sessions on a shared machine cannot deliver to it.Pesan dari proses anak sendiri diperlakukan khusus. Bila tidak ada nilai inbound yang berlaku, Claude Code mengantarkan pesan yang bisa ia pastikan berasal dari proses anak sesi itu sendiri. Di Linux ia bisa memverifikasi lewat bukti proses bahkan setelah anaknya keluar; di macOS hanya selama prosesnya masih hidup; di native Windows dan di container tempat Claude Code berjalan sebagai process ID 1, token yang diekspor pada auth line adalah satu-satunya bukti. Kalau Anda menuliskannya dalam script, kirim saja auth line-nya — opsional di Unix dan wajib di Windows.
Dua sesi yang bisa saling menulis adalah loop yang menunggu terjadi, dan kanal ini dirancang dengan asumsi itu:
Kebiasaan yang membuat ini layak disiapkan sangat sempit: beri nama setiap sesi yang memang ingin saya simpan, supaya bisa saya alamatkan nanti tanpa langkah listing. Setelah itu, pola yang berguna adalah satu sesi berjalan lama mengerjakan sesuatu yang lambat dan satu sesi yang benar-benar saya awasi, dengan permintaan satu notifikasi idle di antara keduanya. Itu menggantikan hal yang selama ini saya kerjakan dengan buruk secara manual, yaitu ingat untuk mengecek.
Sumber & bacaan lanjutan