PtyExecutor

Struct PtyExecutor 

Source
pub struct PtyExecutor { /* private fields */ }
Expand description

Executor for running prompts in a pseudo-terminal.

Implementations§

Source§

impl PtyExecutor

Source

pub fn new(backend: CliBackend, config: PtyConfig) -> Self

Creates a new PTY executor with the given backend and configuration.

Source

pub fn handle(&mut self) -> PtyHandle

Returns a handle for TUI integration.

Can only be called once - panics if called multiple times.

Source

pub async fn run_observe( &self, prompt: &str, interrupt_rx: Receiver<bool>, ) -> Result<PtyExecutionResult>

Runs in observe mode (output-only, no input forwarding).

This is an async function that listens for interrupt signals via the shared interrupt_rx watch channel from the event loop. Uses a separate thread for blocking PTY reads and tokio::select! for signal handling.

Returns when the process exits, idle timeout triggers, or interrupt is received.

§Arguments
  • prompt - The prompt to execute
  • interrupt_rx - Watch channel receiver for interrupt signals from the event loop
§Errors

Returns an error if PTY allocation fails, the command cannot be spawned, or an I/O error occurs during output handling.

Source

pub async fn run_observe_streaming<H: StreamHandler>( &self, prompt: &str, interrupt_rx: Receiver<bool>, handler: &mut H, ) -> Result<PtyExecutionResult>

Runs in observe mode with streaming event handling for JSON output.

When the backend’s output format is StreamJson, this method parses NDJSON lines and dispatches events to the provided handler for real-time display. For Text format, behaves identically to run_observe.

§Arguments
  • prompt - The prompt to execute
  • interrupt_rx - Watch channel receiver for interrupt signals
  • handler - Handler to receive streaming events
§Errors

Returns an error if PTY allocation fails, the command cannot be spawned, or an I/O error occurs during output handling.

Source

pub async fn run_interactive( &mut self, prompt: &str, interrupt_rx: Receiver<bool>, ) -> Result<PtyExecutionResult>

Runs in interactive mode (bidirectional I/O).

Uses tokio::select! for non-blocking I/O multiplexing between:

  1. PTY output (from blocking reader via channel)
  2. User input (from stdin thread via channel)
  3. Interrupt signal from event loop
  4. Idle timeout

This design ensures Ctrl+C is always responsive, even when the PTY has no output (e.g., during long-running tool calls).

§Arguments
  • prompt - The prompt to execute
  • interrupt_rx - Watch channel receiver for interrupt signals from the event loop
§Errors

Returns an error if PTY allocation fails, the command cannot be spawned, or an I/O error occurs during bidirectional communication.

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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, 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<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