pub struct Router {
policy: Mutex<PolicyState>,
broker: Arc<Broker>,
config: Arc<ConfigState>,
store: Arc<Store>,
pending_activation: Mutex<Option<PendingActivation>>,
internal: UnboundedSender<Internal>,
last_tray: Mutex<Option<TrayState>>,
turn_active: Mutex<HashMap<String, bool>>,
stopped_at: Mutex<HashMap<String, i64>>,
notified_turns: Mutex<HashSet<(String, u64, u64)>>,
}Fields§
§policy: Mutex<PolicyState>§broker: Arc<Broker>§config: Arc<ConfigState>§store: Arc<Store>§pending_activation: Mutex<Option<PendingActivation>>A click whose pane’s workspace was open in no window: taken by the window the launcher opens on that workspace.
internal: UnboundedSender<Internal>§last_tray: Mutex<Option<TrayState>>§turn_active: Mutex<HashMap<String, bool>>block_id → last turn_active seen in controllerstatus.
stopped_at: Mutex<HashMap<String, i64>>block_id → when the user last stopped its turn (epoch ms).
notified_turns: Mutex<HashSet<(String, u64, u64)>>(block_id, turn_id, ended_at_ms) of turn ends already notified.
Implementations§
Source§impl Router
impl Router
fn settings(&self) -> Settings
Sourcefn owns_block(&self, block_id: &str) -> bool
fn owns_block(&self, block_id: &str) -> bool
Does this Router’s store know the block? BLOCKING (SQLite).
Sourcefn block_labels(&self, block_id: &str) -> (String, Option<String>)
fn block_labels(&self, block_id: &str) -> (String, Option<String>)
The block’s sanitized agent name and session summary, from one read.
BLOCKING (SQLite behind Store’s process-wide mutex) — only ever
reached through emit / emit_fixed, which callers must run off the
async workers (spawn_blocking; the #1782 failure class, see
websocket.rs’s controllerinput note). Not cached: the summary changes
every turn and emits are rare, so the read the summary needs anyway
also serves the name.
Sourcefn step(&self, input: Input) -> Vec<Action>
fn step(&self, input: Input) -> Vec<Action>
Run the policy and publish what it decided. Activate is returned,
not published: only ack produces it, and it needs a store lookup.
fn publish_tray_if_changed(&self, tray: TrayState)
fn publish(&self, action: &Action)
fn publish_event<E: Event>(&self, payload: &E::Payload)
Sourcepub fn emit(
&self,
kind: NotifyKind,
block_id: &str,
question: Option<&str>,
question_count: usize,
)
pub fn emit( &self, kind: NotifyKind, block_id: &str, question: Option<&str>, question_count: usize, )
A frontend reports a pane event. question is only used for
InputWaiting and goes through redact_body; question_count adds
“ (+N more)“ after it.
BLOCKING (the block lookup hits the store) — call from
spawn_blocking, never inline on an async worker.
Sourcepub fn emit_fixed(&self, kind: NotifyKind, block_id: &str, body: Option<String>)
pub fn emit_fixed(&self, kind: NotifyKind, block_id: &str, body: Option<String>)
srv-internal sources: the body is app-controlled fixed text, so it is
not redacted — only the preview=none setting strips it (in policy).
BLOCKING, like emit.
Sourcepub fn input_waiting_nonblocking(
&self,
block_id: &str,
question: Option<String>,
count: usize,
)
pub fn input_waiting_nonblocking( &self, block_id: &str, question: Option<String>, count: usize, )
srv-observed “agent is waiting on you” (Phase 5). Non-blocking: safe
from the controller’s stdout reader thread. Coalesces with the
renderer’s own report for the same block (same input: group).
Sourcepub fn turn_stopped_nonblocking(&self, block_id: &str)
pub fn turn_stopped_nonblocking(&self, block_id: &str)
The user stopped this block’s turn: cancel “finished” for it, and don’t turn the resulting turn-end into one (queued, ordered).
Sourcepub fn resolve_nonblocking(&self, block_id: &str, family: Family)
pub fn resolve_nonblocking(&self, block_id: &str, family: Family)
Ordered counterpart of resolve: queued behind any emit already sent
for the same block.
pub fn resolve(&self, block_id: &str, family: Family)
pub fn test(&self)
Sourcepub fn cloud_signed_out(&self)
pub fn cloud_signed_out(&self)
This channel’s MuxBus sign-in stopped working
(muxbus::delivery_status). Fixed text; about no agent. Taken down
with resolve("", Family::Cloud).
pub fn focus(&self, conn_id: &str, report: FocusReport)
pub fn disconnect(&self, conn_id: &str)
Sourcepub fn ack(&self, id: &str, clicked: bool) -> AckOutcome
pub fn ack(&self, id: &str, clicked: bool) -> AckOutcome
Presenter feedback (rich-content spec §3.3 A–D, F). For a click on a
pane’s toast: find the open window showing the pane and tell only it
to select the pane (notification:activate names the window); if the
pane’s workspace is open nowhere, park the click for the window the
launcher will open on it. The outcome tells the launcher what to raise
or open — every click ends with something in front.
BLOCKING (store reads) — call from spawn_blocking.
Sourcepub fn reveal_target(&self, block_id: &str) -> Option<BlockRevealEvent>
pub fn reveal_target(&self, block_id: &str) -> Option<BlockRevealEvent>
block.reveal: the block’s tab and the open window showing it,
resolved exactly as a toast click is (resolve_click_target + the
same open-window pick). None when the block is gone or its
workspace is open in no window.
BLOCKING (store reads) — call from spawn_blocking.
Sourcepub fn publish_block_reveal(&self, target: &BlockRevealEvent)
pub fn publish_block_reveal(&self, target: &BlockRevealEvent)
Tell target.window_id’s renderer to reveal the block.
Sourcepub fn take_pending_activation(
&self,
workspace_id: Option<&str>,
) -> Option<PendingActivation>
pub fn take_pending_activation( &self, workspace_id: Option<&str>, ) -> Option<PendingActivation>
One-shot: the pane a click asked for while its workspace was open in
no window. Only a window on that workspace takes it (workspace_id
None = an older frontend, which takes any), and only for 30 s.
Auto Trait Implementations§
impl !Freeze for Router
impl RefUnwindSafe for Router
impl Send for Router
impl Sync for Router
impl Unpin for Router
impl UnsafeUnpin for Router
impl UnwindSafe for Router
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<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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