Skip to main content

LeanCtxServer

Struct LeanCtxServer 

Source
pub struct LeanCtxServer {
Show 23 fields pub cache: SharedCache, pub session: SessionSlot, pub tool_calls: Arc<RwLock<Vec<ToolCallRecord>>>, pub call_count: Arc<AtomicUsize>, pub background_tick: Arc<AtomicUsize>, pub cache_ttl_secs: u64, pub last_call: Arc<RwLock<Instant>>, pub agent_id: Arc<RwLock<Option<String>>>, pub task_envelope: Arc<RwLock<Option<TaskEnvelopeV1>>>, pub native_receipt_authority: Option<Arc<HostReceiptAuthority>>, pub presence_agent_id: Arc<RwLock<Option<String>>>, pub client_name: Arc<RwLock<String>>, pub autonomy: Arc<AutonomyState>, pub loop_detector: Arc<RwLock<LoopDetector>>, pub workflow: Arc<RwLock<Option<WorkflowRun>>>, pub ledger: Arc<RwLock<ContextLedger>>, pub pipeline_stats: Arc<RwLock<PipelineStats>>, pub session_mode: SessionMode, pub workspace_id: String, pub channel_id: String, pub context_os: Option<Arc<ContextOsRuntime>>, pub context_ir: Option<Arc<RwLock<ContextIrV1>>>, pub registry: Option<Arc<ToolRegistry>>, /* private fields */
}
Expand description

Central MCP server state: cache, session, metrics, and autonomy runtime.

Fields§

§cache: SharedCache§session: SessionSlot§tool_calls: Arc<RwLock<Vec<ToolCallRecord>>>§call_count: Arc<AtomicUsize>§background_tick: Arc<AtomicUsize>

Every tool call, counted unconditionally at the top of call_tool_guarded.

call_count only advances inside record_checkpoint, which returns early whenever checkpointing is skipped — and minimal_overhead (default true) skips it for every tool. Anything scheduled off call_count therefore never runs in a default install. The daily telemetry flush was scheduled that way and consequently never sent.

§cache_ttl_secs: u64§last_call: Arc<RwLock<Instant>>§agent_id: Arc<RwLock<Option<String>>>§task_envelope: Arc<RwLock<Option<TaskEnvelopeV1>>>§native_receipt_authority: Option<Arc<HostReceiptAuthority>>

Installed by the trusted host before serving; never sourced from tool arguments.

§presence_agent_id: Arc<RwLock<Option<String>>>§client_name: Arc<RwLock<String>>§autonomy: Arc<AutonomyState>§loop_detector: Arc<RwLock<LoopDetector>>§workflow: Arc<RwLock<Option<WorkflowRun>>>§ledger: Arc<RwLock<ContextLedger>>§pipeline_stats: Arc<RwLock<PipelineStats>>§session_mode: SessionMode§workspace_id: String§channel_id: String§context_os: Option<Arc<ContextOsRuntime>>§context_ir: Option<Arc<RwLock<ContextIrV1>>>§registry: Option<Arc<ToolRegistry>>

Implementations§

Source§

impl LeanCtxServer

Source

pub async fn call_tool_guarded( &self, request: CallToolRequestParams, ) -> Result<CallToolResult, ErrorData>

A call keeps the session instance it was bound to once its roots were resolved, so a root change while it runs cannot redirect its late writes into the next project’s session (AP04-G1).

Source§

impl LeanCtxServer

Source

pub fn guard_egress( guard_name: &str, guard_args: Option<&Map<String, Value>>, agent_id: &str, ) -> Option<CallToolResult>

Egress DLP on agent writes and actions. A block is a tool error, audited for agent_id.

Source§

impl LeanCtxServer

Source

pub fn new() -> Self

Creates a new server with default settings, auto-detecting the project root.

Source

pub fn new_with_project_root(project_root: Option<&str>) -> Self

Creates a new server rooted at the given project directory.

Source

pub fn new_shared_with_context( project_root: &str, workspace_id: &str, channel_id: &str, ) -> Self

Creates a new server in Context OS shared mode for a specific workspace/channel.

Source

pub async fn check_idle_expiry(&self)

Clears the cache and saves the session if the TTL idle threshold has been exceeded.

Source

pub fn idle_ttl(&self) -> Duration

Idle TTL of the read cache (memory_cleanup / LEAN_CTX_CACHE_TTL); 0 = off.

Source

pub async fn release_idle_memory(&self)

Release what an idle server holds without waiting for the next call: the read cache (as check_idle_expiry would), the resident indexes and the allocator’s free pages. Everything reloads on demand. Restarts the TTL so the next call does not clear (and count) the cache a second time.

Source

pub async fn shutdown(&self)

Aggressive cleanup on connection drop: save session, consolidate knowledge, clear caches.

Order and bounds: the host that closed the connection waits a bounded time and then kills the process. What must not be lost comes first — the session’s last state — and what only enriches later sessions (the knowledge consolidation) runs afterwards within SHUTDOWN_ENRICHMENT. With a semantic detector bound it re-admits the session’s text through the model; run first and unbounded, it kept the server alive beyond the host’s wait while the last state was still to be saved. The consolidation reads the SAVED session, so it also belongs after the save.

Source§

impl LeanCtxServer

Source

pub async fn record_call( &self, tool: &str, original: usize, saved: usize, mode: Option<String>, )

Records a tool call’s token savings without timing information.

Source

pub async fn record_call_with_path( &self, tool: &str, original: usize, saved: usize, mode: Option<String>, path: Option<&str>, duration_ms: u64, )

Records a tool call like record_call, but includes an optional file path for observability and the measured handler duration (#1020 — the duration is what makes the row land in tool-calls.log).

Source

pub async fn record_call_with_timing( &self, tool: &str, original: usize, saved: usize, mode: Option<String>, duration_ms: u64, )

Records a tool call’s token savings, duration, and emits events and stats.

Source

pub async fn publish_value_snapshot(&self)

Folds security events recorded outside record_call (e.g. injection flags found after the handler) into the session and republishes the value snapshot, so the status line never lags a blocked or flagged call.

Source

pub fn increment_and_check(&self) -> bool

Increments the call counter and returns true if a checkpoint is due.

Source

pub async fn auto_checkpoint(&self) -> Option<String>

Generates a compressed context checkpoint with session state and multi-agent sync.

Source

pub fn append_tool_call_log( tool: &str, duration_ms: u64, original: usize, saved: usize, mode: Option<&str>, timestamp: &str, )

Appends a tool call entry to the rotating tool-calls.log file.

Source

pub async fn record_cep_snapshot(&self)

Persists a CEP (Cognitive Efficiency Protocol) score snapshot for analytics.

Source§

impl LeanCtxServer

Source

pub fn checkpoint_interval_effective() -> usize

Source

pub async fn resolve_path(&self, path: &str) -> Result<String, String>

Resolves a (possibly relative) tool path against the session’s project_root. Absolute paths and “.” are returned as-is. Relative paths like “src/main.rs” are joined with project_root so tools work regardless of the server’s cwd.

Source

pub async fn resolve_path_or_passthrough(&self, path: &str) -> String

Like resolve_path, but returns the original path on failure instead of an error.

Trait Implementations§

Source§

impl Clone for LeanCtxServer

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Default for LeanCtxServer

Source§

fn default() -> Self

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

impl ServerHandler for LeanCtxServer

Source§

fn get_info(&self) -> ServerConfig

Source§

async fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> Result<InitializeResult, ErrorData>

Source§

async fn list_tools( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> Result<ListToolsResult, ErrorData>

Source§

fn list_prompts( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>>

Source§

async fn get_prompt( &self, request: GetPromptRequestParams, _context: RequestContext<RoleServer>, ) -> Result<GetPromptResponse, ErrorData>

Source§

fn list_resources( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>>

Source§

async fn read_resource( &self, request: ReadResourceRequestParams, _context: RequestContext<RoleServer>, ) -> Result<ReadResourceResponse, ErrorData>

Source§

async fn call_tool( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CallToolResponse, ErrorData>

Handle a tools/call request from a client. Read more
Source§

async fn on_roots_list_changed(&self, _context: NotificationContext<RoleServer>)

Source§

fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Source§

fn negotiate_initialize( &self, request: &InitializeRequestParams, ) -> Result<InitializeResult, ErrorData>

Build the initialize response for request, negotiating the protocol version against Self::supported_protocol_versions. Read more
Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

Return the protocol versions supported by this server. Read more
Source§

fn discover( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture

Return this server’s discovery information.
Source§

fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + MaybeSendFuture

Source§

fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Source§

fn list_resource_templates( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + MaybeSendFuture

Source§

fn accepted_subscription_filter( &self, requested: &SubscriptionFilter, ) -> Option<SubscriptionFilter>

Return the subset of a requested notification filter this server accepts. Read more
Source§

fn listen( &self, context: SubscriptionContext, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Run one established subscription until it is cancelled or closed gracefully. Read more
Source§

fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

👎Deprecated:

resources/subscribe is legacy-only; implement accepted_subscription_filter and listen for protocol version 2026-07-28

Source§

fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

👎Deprecated:

resources/unsubscribe is legacy-only; subscriptions/listen is cancelled through its request lifecycle

Source§

fn get_tool(&self, _name: &str) -> Option<Tool>

Get a tool definition by name. Read more
Source§

fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + MaybeSendFuture

Source§

fn on_cancelled( &self, notification: CancelledNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_progress( &self, notification: ProgressNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_initialized( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn get_task( &self, request: GetTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + MaybeSendFuture

SEP-2663 tasks/get: return the current DetailedTask state.
Source§

fn update_task( &self, request: UpdateTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

SEP-2663 tasks/update: accept responses to outstanding in-task input requests. Returns an empty acknowledgement on success.
Source§

fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

SEP-2663 tasks/cancel: cooperative cancellation. Returns an empty acknowledgement; the task’s observable status may lag.
Source§

fn list_skills( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListSkillsResult, ErrorData>> + MaybeSendFuture

SEP-2640 skills/list: one page of the skills this server serves.
Source§

fn get_skill( &self, request: GetSkillRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetSkillResult, ErrorData>> + MaybeSendFuture

SEP-2640 skills/get: the entry for one skill, or -32602 when the server does not serve a skill at that URI.
Source§

fn read_resource_directory( &self, request: ReadResourceDirectoryRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + MaybeSendFuture

SEP-2640 resources/directory/read: the direct children of a directory resource, or -32602 when the URI is not a directory.

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<R, S> DynService<R> for S
where R: ServiceRole, S: Service<R>,

Source§

fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>

Source§

fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>

Source§

fn get_info(&self) -> <R as ServiceRole>::Info

Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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> 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<H> Service<RoleServer> for H
where H: ServerHandler,

Source§

async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>

Source§

async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, context: NotificationContext<RoleServer>, ) -> Result<(), ErrorData>

Source§

fn get_info(&self) -> <RoleServer as ServiceRole>::Info

Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

The protocol versions this service can speak, bounding what initialize negotiation may agree to. Read more
Source§

impl<S> ServiceExt<RoleServer> for S
where S: Service<RoleServer>,

Source§

fn serve_with_ct<T, E, A>( self, transport: T, ct: CancellationToken, ) -> impl Future<Output = Result<RunningService<RoleServer, S>, ServerInitializeError>> + MaybeSendFuture
where T: IntoTransport<RoleServer, E, A>, E: Error + Send + Sync + 'static, S: Sized,

Source§

fn into_dyn(self) -> Box<dyn DynService<R>>

Convert this service to a dynamic boxed service Read more
Source§

fn serve<T, E, A>( self, transport: T, ) -> impl Future<Output = Result<RunningService<R, Self>, <R as ServiceRole>::InitializeError>> + MaybeSendFuture
where T: IntoTransport<R, E, A>, E: Error + Send + Sync + 'static, Self: Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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