Skip to main content

Session

Struct Session 

Source
pub struct Session {
Show 36 fields pub input: String, pub input_images: Vec<ImageAttachment>, pub input_text_files: Vec<TextFileAttachment>, pub output_lines: Vec<String>, pub workflow_tx: UnboundedSender<TuiMessage>, pub workflow_state: WorkflowState, pub config_toml: Option<String>, pub secrets: Option<HashMap<String, String>>, pub build_info: Option<BuildInfo>, pub resume_info: Option<ResumeInfo>, pub backup_resume_info: Option<ResumeInfo>, pub todo_lines: Vec<String>, pub cancel_token: CancellationToken, pub pending_command: Option<String>, pub handoff_pending: bool, pub pending_tool_lines: Vec<(String, usize, Option<String>)>, pub current_context_tokens: usize, pub auto_handoff: AutoHandoffConfig, pub mcp_servers: Vec<McpServerInfo>, pub should_quit: bool, pub auto_scroll: bool, pub agent_name: String, pub token_store: Option<Arc<dyn TokenStore>>, pub mcp_loader: Option<()>, pub project_id: Option<String>, pub project_name: Option<String>, pub session_id: Option<String>, pub session_name: Option<String>, pub home_dir: Option<PathBuf>, pub workflow_permit: Option<OwnedSemaphorePermit>, pub identity: Option<String>, pub model: Option<String>, pub rotating_from_handoff: bool, pub briefing_born: bool, pub handoff_count: u32, pub compaction_status: SharedCompactionStatus,
}
Expand description

Holds all state that is independent of the presentation layer (TUI, API, Web). Frontend crates compose this struct and add their own UI-specific fields.

Fields§

§input: String

Input buffer for user commands

§input_images: Vec<ImageAttachment>

Pre-loaded image attachments (multimodal) for the next command. Consumed by execute_command and attached to the initial user turn; callers (API/web) fill this before invoking execute_command.

§input_text_files: Vec<TextFileAttachment>

Pre-loaded text/markdown file attachments for the next command. Same lifecycle as input_images: callers fill before execute_command; consumed exactly once. Composed into the task text as fenced synthetic blocks.

§output_lines: Vec<String>

Output log lines

§workflow_tx: UnboundedSender<TuiMessage>

Sender for messages from async workflows (clone and pass to workflow runners)

§workflow_state: WorkflowState

Current workflow lifecycle state

§config_toml: Option<String>

Configuration TOML for ABK workflows

§secrets: Option<HashMap<String, String>>

Secrets for ABK workflows

§build_info: Option<BuildInfo>

Build info for ABK workflows

§resume_info: Option<ResumeInfo>

Resume info from the last completed task for session continuity

§backup_resume_info: Option<ResumeInfo>

Saved resume_info before execute_command consumes it; restored if task is cancelled before producing a real checkpoint (mistake-ENTER recovery).

§todo_lines: Vec<String>

Latest todo list from LLM todowrite tool

§cancel_token: CancellationToken

Cancellation token for aborting the current workflow

§pending_command: Option<String>

Command buffered by user during cancellation wind-down.

§handoff_pending: bool

Whether a session handoff (Ctrl+H) should fire once the current workflow cancels.

§pending_tool_lines: Vec<(String, usize, Option<String>)>

In-flight spinner entries: (tool_name, output_lines_index, hint).

§current_context_tokens: usize

Current context token count (updated from ApiCallStarted events).

§auto_handoff: AutoHandoffConfig

Auto-handoff configuration parsed from [tui.auto_handoff].

§mcp_servers: Vec<McpServerInfo>

MCP server statuses received from agent init

§should_quit: bool

Whether the session should quit

§auto_scroll: bool

Whether auto-scroll is enabled (follows new output)

§agent_name: String

Agent name for checkpoint/token paths (replaces ABK_AGENT_NAME env var). Defaults to “trustee”. Set from config at startup.

§token_store: Option<Arc<dyn TokenStore>>

Per-session token store (None = FileTokenStore fallback). When set, MCP credential flows use this instead of file-based storage.

§mcp_loader: Option<()>§project_id: Option<String>

Storage partition key (replaces path hash). None = hash(working_dir)

§project_name: Option<String>

Human-readable project name. None = directory name

§session_id: Option<String>

Storage directory name (replaces timestamp slug). None = auto-generate

§session_name: Option<String>

Human-readable session name. None = no description

§home_dir: Option<PathBuf>

Per-user home directory for checkpoint storage. None = default ~/.{agent_name}/ Set to ~/.trustee/users/{user_hash}/ for per-user isolation in web mode.

§workflow_permit: Option<OwnedSemaphorePermit>

Concurrency permit — held while a workflow is running. When the workflow completes (state → Idle), this is dropped, releasing the permit back to the global semaphore. None when no workflow is running or when concurrency limiting is disabled.

§identity: Option<String>

Optional agent identity content (e.g. fetched from Fame). When set, prepended to lifecycle.system_template in the config clone inside execute_command() and trigger_handoff(). None = use the config’s default system template.

§model: Option<String>

Optional model override for the next command. When set, [llm.providers.{model}] from the config TOML is injected into [llm.provider] before creating the agent, switching the LLM for that command. Consumed per-command (cleared after injection). None = use the default [llm.provider].

§rotating_from_handoff: bool

Set to true immediately before the post-handoff briefing execute, so execute_command treats that run as a rotation rather than a fresh session: it derives a new chain identity but does NOT clear the visible transcript (Bug 2). Cleared once the rotation is handled.

§briefing_born: bool

True while the current chain identity was born from a handoff briefing and no user command has run in it yet (Bug 4). While true, handoff is blocked entirely (manual + auto) to prevent briefing-of-briefing loops. Cleared on the first user-initiated command.

§handoff_count: u32

Monotonic count of handoff rotations this session has performed. Surfaced in live-session listings so the UI can show lineage (Bug 5: “name rotated silently” → “name · ↻2”).

§compaction_status: SharedCompactionStatus

Shared compaction-status handle (abk 0.21.4).

The session owns the handle and threads a clone through the run’s RunContext; abk’s compaction loop stamps in_progress/started_at while a summarization run is in flight and records the durable last trace on completion. trustee-api reads it in the live-session payload so consoles can show “compacting…” state that survives a refresh (the /compact command never enters the transcript — it is intercepted before becoming a task message).

Implementations§

Source§

impl Session

Source

pub fn new() -> (Self, UnboundedReceiver<TuiMessage>)

Create a new Session with default state and a fresh message channel.

Returns (Session, Receiver) so the caller can own the receiver without locking the session (prevents deadlock in async drain loops).

Source

pub fn parse_auto_handoff_config(&mut self)

Parse auto-handoff configuration from the stored config TOML.

Source

pub fn handle_workflow_message(&mut self, msg: TuiMessage)

Handle messages from async workflows.

This processes all workflow lifecycle events, output updates, and state transitions. Returns true if the caller should check for pending commands/handoffs after.

Source

pub fn execute_command(&mut self)

Execute the current command in the input buffer.

Spawns an async ABK workflow task, clears the input buffer, and sets workflow_state to Running.

Source

pub fn request_handoff(&mut self, hint: String)

Request a session handoff through the safe state-machine entry point.

Mirrors the TUI Ctrl+H behavior:

  • Idle → trigger the handoff immediately
  • Running → cancel the workflow, fire handoff once it stops
  • Cancelling → queue handoff for when it stops

This prevents any caller (web button, API, future MCP tool) from spawning a briefing task concurrently with a running workflow (Bugs 1/2/5).

Source

pub fn trigger_handoff(&mut self, hint: String)

Trigger a session handoff.

Runs a single LLM call using the current session’s resume_info to generate a briefing. On completion, sends TuiMessage::HandoffReady(briefing).

This is the internal Idle-only entry point. Callers that may be invoked while a workflow is running should use Session::request_handoff.

Trait Implementations§

Source§

impl Default for Session

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
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> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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