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
impl SessionActor
Sourcepub fn spawn<F>(
supervisor: &TaskSupervisor,
registry: &Arc<LiveSessionRegistry>,
session_id: &SessionId,
build_agent: F,
mailbox_capacity: usize,
) -> (SessionActorHandle, BlockingHandle<()>)
pub fn spawn<F>( supervisor: &TaskSupervisor, registry: &Arc<LiveSessionRegistry>, session_id: &SessionId, build_agent: F, mailbox_capacity: usize, ) -> (SessionActorHandle, BlockingHandle<()>)
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§
impl Freeze for SessionActor
impl RefUnwindSafe for SessionActor
impl Send for SessionActor
impl Sync for SessionActor
impl Unpin for SessionActor
impl UnsafeUnpin for SessionActor
impl UnwindSafe for SessionActor
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request