Skip to main content

SseCommandExecutor

Struct SseCommandExecutor 

Source
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::Request serde JSON as the raw body — nothing wraps it — with the auth signature in the X-OBJECTIVEAI-SIGNATURE header and the AgentArguments identity in the X-OBJECTIVEAI-AGENT-INSTANCE-HIERARCHY / -AGENT-ID / -AGENT-FULL-ID / -AGENT-REMOTE / -RESPONSE-ID / -RESPONSE-IDS request headers — the same names the api stamps on outbound calls, one header per Some field (mcp_session_id has 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 SSE data: event per stream item — exactly the cli’s stdout JSONL line shapes (a T JSON, or a crate::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§

Source§

impl SseCommandExecutor

Source

pub fn new(url: impl Into<String>) -> Self

Source

pub fn signature(self, signature: impl Into<String>) -> Self

Attach the daemon auth signature (the pre-derived sha256=<hex(SHA256(DAEMON_SECRET))>), sent as the X-OBJECTIVEAI-SIGNATURE header on every request. Without it the daemon must be running without a secret.

Trait Implementations§

Source§

impl CommandExecutor for SseCommandExecutor

Source§

type Error = Error

Source§

type Stream<T> = Pin<Box<dyn Stream<Item = Result<T, Error>> + Send>> where T: Send + 'static

Source§

async fn execute<R, T>( &self, request: R, agent_arguments: Option<&AgentArguments>, ) -> Result<Self::Stream<T>, Error>

Source§

async fn execute_one<R, T>( &self, request: R, agent_arguments: Option<&AgentArguments>, ) -> Result<T, Error>

Convenience for unary commands: run the request and resolve the first item from the stream. Implementations should error with their own “empty stream” variant if the stream closes without producing an item.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToAst for T

Source§

fn ast(self, begin: usize, end: usize) -> Spanned<Self>

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more