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>>>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
impl LeanCtxServer
Sourcepub async fn call_tool_guarded(
&self,
request: CallToolRequestParams,
) -> Result<CallToolResult, ErrorData>
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
impl LeanCtxServer
Sourcepub fn guard_egress(
guard_name: &str,
guard_args: Option<&Map<String, Value>>,
agent_id: &str,
) -> Option<CallToolResult>
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
impl LeanCtxServer
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new server with default settings, auto-detecting the project root.
Sourcepub fn new_with_project_root(project_root: Option<&str>) -> Self
pub fn new_with_project_root(project_root: Option<&str>) -> Self
Creates a new server rooted at the given project directory.
Creates a new server in Context OS shared mode for a specific workspace/channel.
Sourcepub async fn check_idle_expiry(&self)
pub async fn check_idle_expiry(&self)
Clears the cache and saves the session if the TTL idle threshold has been exceeded.
Sourcepub fn idle_ttl(&self) -> Duration
pub fn idle_ttl(&self) -> Duration
Idle TTL of the read cache (memory_cleanup / LEAN_CTX_CACHE_TTL); 0 = off.
Sourcepub async fn release_idle_memory(&self)
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.
Sourcepub async fn shutdown(&self)
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
impl LeanCtxServer
Sourcepub async fn record_call(
&self,
tool: &str,
original: usize,
saved: usize,
mode: Option<String>,
)
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.
Sourcepub async fn record_call_with_path(
&self,
tool: &str,
original: usize,
saved: usize,
mode: Option<String>,
path: Option<&str>,
duration_ms: u64,
)
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).
Sourcepub async fn record_call_with_timing(
&self,
tool: &str,
original: usize,
saved: usize,
mode: Option<String>,
duration_ms: u64,
)
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.
Sourcepub async fn publish_value_snapshot(&self)
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.
Sourcepub fn increment_and_check(&self) -> bool
pub fn increment_and_check(&self) -> bool
Increments the call counter and returns true if a checkpoint is due.
Sourcepub async fn auto_checkpoint(&self) -> Option<String>
pub async fn auto_checkpoint(&self) -> Option<String>
Generates a compressed context checkpoint with session state and multi-agent sync.
Sourcepub fn append_tool_call_log(
tool: &str,
duration_ms: u64,
original: usize,
saved: usize,
mode: Option<&str>,
timestamp: &str,
)
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.
Sourcepub async fn record_cep_snapshot(&self)
pub async fn record_cep_snapshot(&self)
Persists a CEP (Cognitive Efficiency Protocol) score snapshot for analytics.
Source§impl LeanCtxServer
impl LeanCtxServer
pub fn checkpoint_interval_effective() -> usize
Sourcepub async fn resolve_path(&self, path: &str) -> Result<String, String>
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.
Sourcepub async fn resolve_path_or_passthrough(&self, path: &str) -> String
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
impl Clone for LeanCtxServer
Source§impl Default for LeanCtxServer
impl Default for LeanCtxServer
Source§impl ServerHandler for LeanCtxServer
impl ServerHandler for LeanCtxServer
fn get_info(&self) -> ServerConfig
async fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> Result<InitializeResult, ErrorData>
async fn list_tools( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> Result<ListToolsResult, ErrorData>
fn list_prompts( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>>
async fn get_prompt( &self, request: GetPromptRequestParams, _context: RequestContext<RoleServer>, ) -> Result<GetPromptResponse, ErrorData>
fn list_resources( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>>
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>
async fn call_tool( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CallToolResponse, ErrorData>
tools/call request from a client. Read moreasync fn on_roots_list_changed(&self, _context: NotificationContext<RoleServer>)
fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
Source§fn negotiate_initialize(
&self,
request: &InitializeRequestParams,
) -> Result<InitializeResult, ErrorData>
fn negotiate_initialize( &self, request: &InitializeRequestParams, ) -> Result<InitializeResult, ErrorData>
initialize response for request, negotiating the
protocol version against Self::supported_protocol_versions. Read moreSource§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
Source§fn discover(
&self,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn discover( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + MaybeSendFuture
fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
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>
fn accepted_subscription_filter( &self, requested: &SubscriptionFilter, ) -> Option<SubscriptionFilter>
Source§fn listen(
&self,
context: SubscriptionContext,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn listen( &self, context: SubscriptionContext, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
Source§fn subscribe(
&self,
request: SubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
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
fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
resources/unsubscribe is legacy-only; subscriptions/listen is cancelled through its request lifecycle
fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + MaybeSendFuture
fn on_cancelled( &self, notification: CancelledNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_progress( &self, notification: ProgressNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_initialized( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
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
fn get_task( &self, request: GetTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + MaybeSendFuture
tasks/get: return the current DetailedTask state.Source§fn update_task(
&self,
request: UpdateTaskParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn update_task( &self, request: UpdateTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
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
fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
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
fn list_skills( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListSkillsResult, ErrorData>> + MaybeSendFuture
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
fn get_skill( &self, request: GetSkillRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetSkillResult, ErrorData>> + MaybeSendFuture
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
fn read_resource_directory( &self, request: ReadResourceDirectoryRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + MaybeSendFuture
resources/directory/read: the direct children of a
directory resource, or -32602 when the URI is not a directory.Auto Trait Implementations§
impl !RefUnwindSafe for LeanCtxServer
impl !UnwindSafe for LeanCtxServer
impl Forget for LeanCtxServer
impl Freeze for LeanCtxServer
impl Move for LeanCtxServer
impl Send for LeanCtxServer
impl Sync for LeanCtxServer
impl Unpin for LeanCtxServer
impl UnsafeUnpin for LeanCtxServer
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>
fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>
fn get_info(&self) -> <R as ServiceRole>::Info
Source§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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> 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<H> Service<RoleServer> for Hwhere
H: ServerHandler,
impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>
async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, context: NotificationContext<RoleServer>, ) -> Result<(), ErrorData>
fn get_info(&self) -> <RoleServer as ServiceRole>::Info
Source§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
initialize
negotiation may agree to. Read more