pub struct Session {Show 27 fields
pub input: String,
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 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>,
}Expand description
Core session state for the Trustee agent.
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: StringInput buffer for user commands
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: WorkflowStateCurrent 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: CancellationTokenCancellation token for aborting the current workflow
pending_command: Option<String>Command buffered by user during cancellation wind-down.
handoff_pending: boolWhether 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: usizeCurrent context token count (updated from ApiCallStarted events).
auto_handoff: AutoHandoffConfigAuto-handoff configuration parsed from [tui.auto_handoff].
mcp_servers: Vec<McpServerInfo>MCP server statuses received from agent init
should_quit: boolWhether the session should quit
auto_scroll: boolWhether auto-scroll is enabled (follows new output)
agent_name: StringAgent 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.
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.
Implementations§
Source§impl Session
impl Session
Sourcepub fn new() -> (Self, UnboundedReceiver<TuiMessage>)
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).
Sourcepub fn parse_auto_handoff_config(&mut self)
pub fn parse_auto_handoff_config(&mut self)
Parse auto-handoff configuration from the stored config TOML.
Sourcepub fn handle_workflow_message(&mut self, msg: TuiMessage)
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.
Sourcepub fn execute_command(&mut self)
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.
Sourcepub fn trigger_handoff(&mut self, hint: String)
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).
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Session
impl !UnwindSafe for Session
impl Freeze for Session
impl Send for Session
impl Sync for Session
impl Unpin for Session
impl UnsafeUnpin for Session
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.