struct ClientInner {
writer: Arc<SharedWriter>,
claude_pid: Option<u32>,
initialization_result: Option<Value>,
cached_init_data: Option<Value>,
session_id: Arc<RwLock<String>>,
pending_controls: Arc<Mutex<HashMap<String, Sender<Result<Value, Error>>>>>,
reader_task: Mutex<Option<JoinHandle<()>>>,
shutdown_tx: Mutex<Option<Sender<()>>>,
disconnect_requested: AtomicBool,
}Fields§
§writer: Arc<SharedWriter>Cloned writer (mpsc-backed via the transport’s writer task).
claude_pid: Option<u32>PID of the spawned claude child captured at spawn time.
Stable for the lifetime of the subprocess; consumers (e.g. the
Inspector pane’s OS-level process walker) cache snapshots
keyed off this value. None when the transport couldn’t
report a PID (in practice never for a live subprocess, but
the optional makes the test stubs and post-disconnect path
total).
initialization_result: Option<Value>Cached response from the initialize control_request -
populated during spawn and never mutated afterwards.
cached_init_data: Option<Value>Captured system/init payload (model, tools, mcp_servers,
slash_commands, …). The CLI emits this once after init and the
SDK strips it from the user-visible Message stream; cache it
here so forge-agent can answer footer / slash queries without
re-running the handshake.
session_id: Arc<RwLock<String>>Captured session id. The reader task updates it as messages
arrive; consumers read the current value via
Client::session_id.
pending_controls: Arc<Mutex<HashMap<String, Sender<Result<Value, Error>>>>>In-flight outbound control_requests waiting on responses.
The reader task routes incoming control_responses here.
reader_task: Mutex<Option<JoinHandle<()>>>Reader task handle. Awaited on Client::disconnect.
shutdown_tx: Mutex<Option<Sender<()>>>Shutdown signal for the reader task. take()’d on the first
Client::disconnect call; subsequent calls are no-ops.
disconnect_requested: AtomicBoolSet by Client::disconnect before the
shutdown signal, so the stream’s end can be read as “told to
stop” rather than pipe death.