pub struct SseCommandExecutor { /* private fields */ }Expand description
Execute commands against a remote cli daemon over plain HTTP —
one POST per command to the daemon’s /execute route, with the
result streamed back as Server-Sent Events.
The daemon runs each request IN-PROCESS (no child binary) with the
AgentArguments headers applied as a per-request config
override (mcp_session_id has no header; 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 http:// address.
Wire contract (one request per execute):
- client POSTs the
cli::command::Requestserde JSON as the raw body — nothing wraps it — with the auth signature in theX-OBJECTIVEAI-SIGNATUREheader and theAgentArgumentsidentity in theX-OBJECTIVEAI-AGENT-INSTANCE-HIERARCHY/-AGENT-ID/-AGENT-FULL-ID/-AGENT-REMOTE/-RESPONSE-ID/-RESPONSE-IDSrequest headers — the same names the api stamps on outbound calls, one header perSomefield (mcp_session_idhas no header). A missing header DELETES that config field for the run — the daemon never inherits its own resident value; - the daemon replies
text/event-stream, one SSEdata:event per stream item — exactly the cli’s stdout JSONL line shapes (aTJSON, or acrate::cli::Error{"type":"error",...}line) — then ends the response body; - the response body ending IS the end-of-stream marker (the HTTP
equivalent of the old WebSocket
Close); dropping the stream aborts the request, which cancels the in-process run on the daemon.
Auth is the X-OBJECTIVEAI-SIGNATURE header (the same header the
daemon’s SSE watcher routes use): when the daemon has a
DAEMON_SECRET, the header must carry the pre-derived
sha256=<hex(SHA256(secret))> — set it verbatim via
Self::signature — or the daemon answers 401 Unauthorized.
Implementations§
Trait Implementations§
Source§impl CommandExecutor for SseCommandExecutor
impl CommandExecutor for SseCommandExecutor
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 SseCommandExecutor
impl RefUnwindSafe for SseCommandExecutor
impl Send for SseCommandExecutor
impl Sync for SseCommandExecutor
impl Unpin for SseCommandExecutor
impl UnsafeUnpin for SseCommandExecutor
impl UnwindSafe for SseCommandExecutor
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