Skip to main content

SessionActor

Struct SessionActor 

Source
pub struct SessionActor;
Expand description

Owns a live Agent<LoopbackChannel> for one conversation-session (spec §9.2).

This is a driver, not a stored value — SessionActor::spawn returns a SessionActorHandle (cheap to clone, holds only channel senders) for LiveSessionRegistry to track; the actor’s own state lives entirely inside the spawned task.

Implementations§

Source§

impl SessionActor

Source

pub fn spawn<F>( supervisor: &TaskSupervisor, registry: &Arc<LiveSessionRegistry>, session_id: &SessionId, build_agent: F, mailbox_capacity: usize, resume_banner: Option<String>, ) -> (SessionActorHandle, BlockingHandle<()>)
where F: FnOnce(LoopbackChannel) -> Agent<LoopbackChannel> + Send + 'static,

Spawn a new SessionActor under supervisor (architect ruling D-8).

build_agent is called inside a dedicated thread (see the module doc) with a freshly constructed LoopbackChannel, and must return the Agent<LoopbackChannel> built from it — never pass an already-built Agent in, since Agent<LoopbackChannel> is !Send and cannot cross the thread boundary. Mirrors zeph-acp’s SendAgentSpawner (Arc<dyn Fn(...) -> Agent + Send + Sync>): typical callers wrap an existing AgentBuilder pipeline (the same one used for CLI/TUI/Telegram/ACP sessions) in a closure capturing only Send-safe dependencies (provider, skill registry, tool executor, the session’s Arc<SessionEventLog>, session id — all Send/Sync). Agent::new is sync, so build_agent is a plain sync closure — no async-construction-in-thread complexity.

Registers a coordinator task under the dynamic name serve.session.<id> via TaskSupervisor::spawn_oneshot — visible through supervisor.snapshot(). The coordinator never touches the !Send Agent; it only awaits the dedicated thread’s completion signal and, if the supervisor’s own CancellationToken fires first (process shutdown), forwards cancellation onto the session’s own token so Self::drive observes exactly one cancellation source regardless of trigger. Session actors intentionally do not auto-restart on panic or unexpected exit (spawn_oneshot’s RestartPolicy::RunOnce): re-driving a torn turn or replay in place is unsafe. Recovery is a fresh spawn (re-attach) that replays the durable log from the last committed seq, not an in-place restart.

Returns the SessionActorHandle for LiveSessionRegistry plus the raw BlockingHandle — callers that need a forced-abort fallback (e.g. if a serve.evict idle-eviction task’s cancellation overruns its TTL grace) should hold onto the latter. The graceful paths are sending SessionCommand::Shutdown over SessionActorHandle::tx, or cancelling SessionActorHandle::cancel directly (what idle eviction uses, spec §9.3, to target exactly this session without affecting any other live actor).

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be 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