pub struct WebSocketExecutor { /* private fields */ }Expand description
Execute commands against a remote cli daemon over WebSocket —
connection per command on the daemon’s /execute route.
The daemon runs each request IN-PROCESS (no child binary) with the
envelope’s AgentArguments applied as a per-request config
override (mcp_session_id is ignored server-side; the daemon’s
filesystem layout and secret are never overridable). This is what
lets a consumer — notably the viewer — run on a different machine
than the cli: the only local requirement is network reach to the
daemon’s published ws:// address.
Wire contract (one connection per execute):
- client sends TWO text messages: first the
AuthEnvelope(always —{"signature": null}against a secretless daemon), then theExecuteEnvelope, then only reads; - the daemon sends one text message per stream item — exactly the
cli’s stdout JSONL line shapes (a
TJSON, or acrate::cli::Error{"type":"error",...}line) — then closes; - dropping the stream drops the connection, which cancels the in-process run on the daemon.
Auth is the first-message preamble shared by every daemon WebSocket
route (headers are never used — browser WebSocket clients can’t set
them): when the daemon has a DAEMON_SECRET, the AuthEnvelope
must carry the pre-derived sha256=<hex(SHA256(secret))> — set it
verbatim via Self::signature — or the daemon closes the
connection without a word.
Implementations§
Source§impl WebSocketExecutor
impl WebSocketExecutor
pub fn new(url: impl Into<String>) -> Self
Sourcepub fn signature(self, signature: impl Into<String>) -> Self
pub fn signature(self, signature: impl Into<String>) -> Self
Attach the daemon auth signature (the pre-derived
sha256=<hex(SHA256(DAEMON_SECRET))>), sent verbatim in the
AuthEnvelope preamble on every connection. Without it the
daemon must be running without a secret.
Trait Implementations§
Source§impl CommandExecutor for WebSocketExecutor
impl CommandExecutor for WebSocketExecutor
type Error = Error
type Stream<T> = Pin<Box<dyn Stream<Item = Result<T, Error>> + Send>> where T: Send + 'static
async fn execute<R, T>(
&self,
request: R,
agent_arguments: Option<&AgentArguments>,
) -> Result<Self::Stream<T>, Error>where
R: CommandRequest + Send + Serialize,
T: CommandResponse + Serialize + DeserializeOwned + Send + 'static,
Source§async fn execute_one<R, T>(
&self,
request: R,
agent_arguments: Option<&AgentArguments>,
) -> Result<T, Error>where
R: CommandRequest + Send + Serialize,
T: CommandResponse + Serialize + DeserializeOwned + Send + 'static,
async fn execute_one<R, T>(
&self,
request: R,
agent_arguments: Option<&AgentArguments>,
) -> Result<T, Error>where
R: CommandRequest + Send + Serialize,
T: CommandResponse + Serialize + DeserializeOwned + Send + 'static,
Auto Trait Implementations§
impl Freeze for WebSocketExecutor
impl RefUnwindSafe for WebSocketExecutor
impl Send for WebSocketExecutor
impl Sync for WebSocketExecutor
impl Unpin for WebSocketExecutor
impl UnsafeUnpin for WebSocketExecutor
impl UnwindSafe for WebSocketExecutor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more