Files
yvgude--lean-ctx/ARCHITECTURE.md
T
wehub-resource-sync 26382a7ac6
CI / Clippy (push) Failing after 15m13s
CI / Test (ubuntu-latest) (push) Failing after 16m1s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Build (no embeddings / no ORT) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Cookbook (Node) (push) Has been cancelled
CI / Pi Extension (Node) (push) Has been cancelled
CI / Rust SDK (lean-ctx-client) (push) Has been cancelled
CI / Embed SDK (lean-ctx-sdk) (push) Has been cancelled
CI / Python SDK (leanctx) (push) Has been cancelled
CI / Hermes Plugin (Python) (push) Has been cancelled
CI / SDK Conformance Matrix (push) Has been cancelled
CI / Coverage (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled
CI / Adversarial Safety (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
CI / Output-Quality Gate (eval A/B) (push) Has been cancelled
CI / Documentation (push) Has been cancelled
CI / CI Green (push) Has been cancelled
JetBrains Plugin / Actionlint (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (rust) (push) Has been cancelled
JetBrains Plugin / Validation (push) Has been cancelled
JetBrains Plugin / Build (push) Has been cancelled
JetBrains Plugin / Test (push) Has been cancelled
Security Check / Security Scan (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:30 +08:00

1203 lines
65 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Architecture
lean-ctx is a single Rust binary that serves as both a **shell hook** (CLI compression) and a **persistent MCP server** (context intelligence for AI agents). This document describes the complete module structure, data flows, and processing pipeline.
## Diagram 1: Complete Architecture Overview
```mermaid
flowchart TB
subgraph delivery [Delivery Surface]
MCPStdio["MCP Server — stdio JSON-RPC"]
HTTPSingle["HTTP MCP Server — lean-ctx serve"]
HTTPTeam["Team Server — multi-workspace, auth, scopes, audit"]
CLI["CLI — 75+ subcommands incl. knowledge, session, overview, compress"]
DaemonUDS["Daemon — Unix Domain Socket, PID lifecycle"]
ShellHook["Shell Hook — ~/.zshenv interception"]
SDKClient["SDK — TypeScript client"]
end
subgraph dispatch [Dispatch and Governance]
PrePipeline["Pre-Pipeline — idle, meta-resolve, role, workflow, autonomy, loop, degradation, budget"]
RoleGuard["Role Guard — tool access by role"]
WorkflowGate["Workflow Gate — allowed_tools per state"]
LoopDetect["Loop Detection — throttle/block repeated searches"]
BudgetGate["Budget / SLO Gate — exhaustion blocking, throttling"]
DegradationEval["Degradation Policy — evaluate_v1_for_tool"]
ContextGate["Context Gate — pre: bounce/intent/graph/knowledge; post: ledger, overlays, eviction, elicitation"]
HybridDispatch["Hybrid Dispatch — Context Server (81 tools)"]
ToolRegistry["ToolRegistry — 81 trait-based tools (McpTool)"]
DispatchRegistry["Registry dispatch — dispatch/mod.rs (majority of tools)"]
PostPipeline["Post-Pipeline — Context IR, tokens, archive, density, translation, verify, enrich, auto-response, evidence, sandbox routing"]
end
subgraph contextio [Context I/O]
ReadPipeline["Read Pipeline — 10 modes: full, map, signatures, diff, task, reference, aggressive, entropy, lines, auto"]
ShellCompress["Shell Compression — 56 pattern modules (versioned v1)"]
SearchEngine["Search — BM25, regex, semantic, hybrid"]
GraphAwareRead["Graph-Aware Read — related files hint in every read"]
EditSafety["Edit Safety — ctx_edit, TOCTOU guard, path jail"]
BounceTracker["Bounce Tracker — per-file read events, bounce detection, adjusted savings"]
TreeSitter["Tree-sitter AST — 26 languages, signature extraction"]
RegexSig["Regex Signatures — fallback for unsupported languages"]
end
subgraph patterns [Shell Patterns — 56 modules]
PatGit["git — status, log, diff, push, pull, ..."]
PatCargo["cargo — build, test, clippy, bench, ..."]
PatNpm["npm/pnpm/bun/deno — install, run, build, ..."]
PatDocker["docker/kubectl/helm — ps, logs, build, ..."]
PatGh["gh — pr, issue, run, ..."]
PatGlab["glab — mr, issue, pipeline, ..."]
PatFd["fd/fdfind — directory grouping"]
PatJust["just — recipe compression"]
PatNinja["ninja — progress/warning dedup"]
PatClang["clang — diagnostic dedup, include collapse"]
PatOther["+ 50 more: aws, terraform, make, pip, maven, ..."]
end
subgraph policy [Policy Engine]
Profiles["Profiles — field-wise merge, Option<T> inheritance"]
Roles["Roles — coder, reviewer, explorer, ops"]
Budgets["Budgets — tokens, shell calls, cost limits"]
SLOs["SLOs — compression ratio, latency, cache efficiency"]
MemPolicy["Memory Policy — knowledge limits, decay, lifecycle"]
AutonomyDrv["Autonomy Drivers — prefetch, auto-dedup, auto-response"]
BoundaryPolicy["Boundary Policy — cross-project search/import, audit, universal gotchas"]
end
subgraph packaging [Context Packaging]
PkgManifest["Manifest — schema v1, SHA-256 integrity, provenance"]
PkgBuilder["Builder — collects Knowledge + Graph + Session + Gotchas"]
PkgLoader["Loader — merge facts (dedup), import graph, import gotchas"]
PkgRegistry["Registry — ~/.lean-ctx/packages/, index, versioning"]
PkgAutoLoad["Auto-Load — marked packages loaded on ctx_overview"]
PkgExport["Export/Import — .ctxpkg portable format"]
end
subgraph routing [Intent and Routing]
IntentRouter["Intent Router — classify, route, profile select"]
IntentProtocol["Intent Protocol — infer from tool calls, side-effects"]
WorkflowEngine["Workflow Engine — planning, coding, testing, done"]
InstrCompiler["Instruction Compiler — client + profile to instructions"]
ModePredictor["Mode Predictor — smart_read mode selection"]
TaskRelevance["Task Relevance — content scoring by task"]
end
subgraph compression [Compression and IR]
ContextIR["Context IR v1 — live lineage recording (hot-path), source, provenance, safety, tokens, freshness"]
Compressor["Compressor — entropy, attention, TF-IDF codebook"]
EntropyFilter["Entropy Filter — Shannon entropy per line"]
AttentionModel["Attention Model — U-curve positional weighting"]
TokenOptimizer["Neural Token Optimizer — context reorder, line scoring"]
FileCache["File Cache — hash-based, mtime validation, compressed output cache for map/signatures"]
MultiTokenizer["Multi-Tokenizer — o200k_base, cl100k_base, Gemini, Llama families"]
DedupEngine["Dedup Engine — Rabin-Karp rolling hash, cross-file"]
PopPruning["POP Pruning — intent-conditioned trimming"]
end
subgraph postpipeline [Post-Dispatch Output Pipeline]
PrefixOrdering["Prefix-Cache Ordering — static first, dynamic last"]
OutputDensity["Output Density — CRP/TDD compression"]
TokenTranslation["Tokenizer Translation — ascii, legacy, auto per model"]
OutputVerify["Output Verification — hallucination detect, path validation"]
ArchiveStore["Archive — large outputs stored, expandable via ctx_expand"]
RedactionEngine["Redaction — secrets, PII removal"]
AutoResponse["Autonomy Auto-Response — auto-dedup, graph hints, prefetch"]
SLOEvaluate["SLO Evaluate — post-call metrics"]
EvidenceLedger["Evidence Ledger — tool call journal with hashes"]
end
subgraph contextos [Context OS — Multi-Agent Runtime]
ContextBus["Context Bus — SQLite WAL, R/W split, per-stream broadcast, FTS5"]
SharedSessions["Shared Sessions — LRU-64, workspace/channel keyed, persist-on-evict"]
ContextOSMetrics["Metrics — events, sessions, active workspaces (TTL)"]
ContextOSRuntime["Runtime — emit_event, event classification, consistency levels"]
SSEStream["SSE Streaming — per-stream subscribe, redacted team events"]
ContextViews["Context Views — /v1/context/summary, /v1/events/search, /v1/events/lineage"]
end
subgraph memory [Context Memory]
Session["Session State — CCP, file refs F1..Fn, task, receipts"]
KnowledgeStore["Knowledge Store — facts, patterns, history, rooms, inverted token index"]
GotchaTracker["Gotcha Tracker — project + universal gotchas"]
EpisodicMem["Episodic Memory — episode tracking"]
ProceduralMem["Procedural Memory — learned procedures"]
ProspectiveMem["Prospective Memory — scheduled reminders"]
KnowledgeRelations["Knowledge Relations — fact-to-fact graph"]
KnowledgeEmbeddings["Knowledge Embeddings — semantic recall"]
ConsolidationEngine["Consolidation Engine — merge insights"]
MemoryLifecycle["Memory Lifecycle — decay, category-grouped consolidation, archive, rehydrate"]
SurvivalEngine["Session Survival — structured recovery queries"]
end
subgraph graph [Graph and Index]
PropertyGraph["Property Graph — AST nodes, 232+ edges, Multi-Edge BFS, related_files, file_connectivity"]
GraphIndex["Graph Index — dependency graph, imports"]
GraphEnricher["Graph Enricher — metadata enrichment"]
CallGraph["Call Graph — callers/callees"]
SymbolMap["Symbol Map — symbol to position"]
BM25Index["BM25 Index — lexical search + dense embeddings"]
HybridSearch["Hybrid Search — RRF: BM25 + semantic + graph proximity"]
RRFSearch["RRF Fusion — BM25 + Semantic + Graph Proximity"]
ArtifactIndex["Artifact Index — proof, pack, bundle indexing"]
end
subgraph a2a [Agent-to-Agent]
AgentRegistry["Agent Registry — register, list, status"]
HandoffLedger["Handoff Ledger — create, show, list"]
TransferBundle["Transfer Bundle v1 — privacy-aware export/import"]
CostAttribution["Cost Attribution — per-agent tracking"]
RateLimiter["Rate Limiter — per-agent throttle"]
CtxShare["ctx_share — push/pull file context between agents"]
CCPBundle["CCP Session Bundle — portable session format"]
end
subgraph verification [Verification and Contracts]
ContextProof["Context Proof v1 — JSON + HTML artifacts, replay hashes"]
VerifyObserve["Verification Observability — stats, warnings"]
SafetyNeedles["Safety Needles — secret detection patterns"]
Integrity["Integrity Checks — contract compliance"]
Contracts["Contracts — 19 versioned contracts, drift gates"]
DegPolicy["Degradation Policy v1 — graceful fallback"]
end
subgraph cognition [Cognition Drivers]
TokTranslDriver["Tokenizer Translation Driver — multi-family (O200k, Cl100k, Gemini, Llama)"]
AttnLayoutDriver["Attention Layout Driver — line ordering for attention"]
ClientConstraints["Client Constraints — per-IDE capability matrix"]
ClientCapabilities["Client Capabilities — 9 IDE runtime detection, Tier 1-4, MCP feature gates"]
LITM["LITM — Lost-in-the-Middle positioning"]
Adaptive["Adaptive Engine — task complexity, bandits, thresholds"]
LLMFeedback["LLM Feedback — compression quality signals"]
end
subgraph providers [External Providers — Context Engine]
ProviderFramework["Provider Framework — ctx_provider tool, ProviderRegistry"]
GitHubProvider["GitHub Provider — issues, PRs, actions"]
GitLabProvider["GitLab Provider — issues, MRs, pipelines"]
JiraProvider["Jira Provider — issues, sprints, projects"]
PostgresProvider["PostgreSQL Provider — tables, schema, queries"]
McpBridgeProvider["MCP Bridge Provider — mcp:name, HTTP+stdio"]
ConfigProvider["Config Provider — custom REST via TOML/JSON"]
ProviderCache["Provider Cache — TTL-based result caching"]
Consolidation["Consolidation Pipeline — chunks→BM25+Graph+Knowledge+Cache"]
end
subgraph infra [Infrastructure]
PathJail["Path Jail — sandbox, symlink traversal protection"]
IOBoundary["I/O Boundary — secret-path checks, role-aware"]
StartupGuard["Startup Guard — single instance, maintenance lock"]
EditorRegistry["Editor Registry — auto-detect IDE, config writers"]
DataDir["Data Dir — ~/.lean-ctx persistence"]
ProjectHash["Project Hash — repo fingerprint via git remote + identity"]
ConfigLoader["Config — .lean-ctx.toml + env overrides"]
Doctor["Doctor — 15-point diagnostics incl. SKILL check"]
HookInstaller["Hook Installer — 34 agent targets, HookMode (MCP/Hybrid)"]
SkillInstaller["SKILL Installer — Claude, Cursor, Codex skill files"]
DaemonMgr["Daemon Manager — PID, socket, start/stop/status"]
end
subgraph mcpprotocol [MCP Protocol Layer]
MCPResources["MCP Resources — 5 URI resources, subscribe-capable notifications"]
MCPPrompts["MCP Prompts — 5 slash commands (/context-focus, -review, -reset, -pin, -budget)"]
MCPElicitation["Elicitation — rate-limited suggestions, pressure/size/budget triggers"]
DynamicToolMgr["Dynamic Tools — 6 categories, on-demand loading, tools/list_changed"]
end
subgraph dashboardpanel [Dashboard Control Plane]
DashBounce["/api/context-bounce — bounce statistics"]
DashClient["/api/context-client — IDE identification"]
DashPressure["/api/context-pressure — budget pressure gauge"]
DashDynTools["/api/context-dynamic-tools — tool category status"]
end
delivery --> PrePipeline
PrePipeline --> RoleGuard
RoleGuard --> WorkflowGate
WorkflowGate --> LoopDetect
LoopDetect --> BudgetGate
BudgetGate --> DegradationEval
DegradationEval --> ContextGate
ContextGate --> HybridDispatch
HybridDispatch -->|"registry (81 tools)"| ToolRegistry
HybridDispatch -->|"legacy (6 tools)"| DispatchRegistry
ToolRegistry --> PostPipeline
DispatchRegistry --> PostPipeline
DispatchRegistry --> ReadPipeline
DispatchRegistry --> EditSafety
DispatchRegistry --> ShellCompress
DispatchRegistry --> SearchEngine
ShellCompress --> patterns
ReadPipeline --> TreeSitter
ReadPipeline --> RegexSig
ReadPipeline --> FileCache
ReadPipeline --> Compressor
ReadPipeline --> PropertyGraph
ReadPipeline --> GraphAwareRead
ToolRegistry --> Session
ToolRegistry --> KnowledgeStore
ToolRegistry --> AgentRegistry
ToolRegistry --> WorkflowEngine
ToolRegistry --> PropertyGraph
ToolRegistry --> ContextProof
ToolRegistry --> ArtifactIndex
PostPipeline --> PrefixOrdering
PrefixOrdering --> OutputDensity
OutputDensity --> TokenTranslation
TokenTranslation --> OutputVerify
OutputVerify --> ArchiveStore
ArchiveStore --> RedactionEngine
RedactionEngine --> AutoResponse
AutoResponse --> SLOEvaluate
SLOEvaluate --> EvidenceLedger
Session -.->|"task, project_root"| DispatchRegistry
Session -.->|"receipts, intents"| EvidenceLedger
Session --> SurvivalEngine
KnowledgeStore --> MemoryLifecycle
KnowledgeStore --> KnowledgeRelations
KnowledgeStore --> KnowledgeEmbeddings
KnowledgeStore --> ConsolidationEngine
GotchaTracker --> KnowledgeStore
PropertyGraph --> GraphIndex
GraphIndex --> GraphEnricher
GraphEnricher --> CallGraph
BM25Index --> HybridSearch
PropertyGraph --> RRFSearch
BM25Index --> RRFSearch
HandoffLedger --> TransferBundle
AgentRegistry --> CostAttribution
AgentRegistry --> RateLimiter
ContextIR --> ContextProof
EvidenceLedger --> ContextProof
Contracts --> Integrity
Compressor --> EntropyFilter
Compressor --> AttentionModel
Compressor --> TokenOptimizer
ToolRegistry --> DedupEngine
Profiles --> Budgets
Profiles --> SLOs
Profiles --> MemPolicy
Roles --> RoleGuard
EditSafety --> PathJail
PathJail --> IOBoundary
ToolRegistry --> ProviderFramework
ProviderFramework --> GitHubProvider
ProviderFramework --> GitLabProvider
ProviderFramework --> JiraProvider
ProviderFramework --> PostgresProvider
ProviderFramework --> McpBridgeProvider
ProviderFramework --> ConfigProvider
GitHubProvider --> ProviderCache
GitLabProvider --> ProviderCache
ProviderCache --> Consolidation
Consolidation --> BM25Index
Consolidation --> GraphIndex
Consolidation --> KnowledgeStore
Consolidation --> Session
ProviderFramework --> ContextIR
BoundaryPolicy --> KnowledgeStore
BoundaryPolicy --> GotchaTracker
BoundaryPolicy --> TransferBundle
TokTranslDriver --> TokenTranslation
AttnLayoutDriver --> Compressor
ClientConstraints --> InstrCompiler
Adaptive --> ModePredictor
LLMFeedback --> Adaptive
Adaptive --> ReadPipeline
LITM -.->|"position session data"| Session
LITM --> InstrCompiler
IntentRouter --> Profiles
IntentRouter --> IntentProtocol
IntentRouter -->|"effective_read_mode"| ModePredictor
IntentProtocol -.->|"infer from calls"| Session
TaskRelevance --> ReadPipeline
PopPruning --> ReadPipeline
ModePredictor -->|"intent-aware mode"| ReadPipeline
SymbolMap --> CallGraph
PropertyGraph --> SymbolMap
BM25Index --> ArtifactIndex
SafetyNeedles --> ShellCompress
VerifyObserve --> SLOEvaluate
VerifyObserve --> ToolRegistry
DegPolicy --> DegradationEval
ContextBus --> SharedSessions
ContextBus --> ContextOSMetrics
ContextOSRuntime --> ContextBus
SharedSessions --> Session
SSEStream --> ContextBus
ContextViews --> ContextBus
HTTPTeam --> ContextViews
HTTPTeam --> SSEStream
CCPBundle --> Session
EpisodicMem -.->|"project_hash, actions"| Session
ProceduralMem --> EpisodicMem
ProspectiveMem --> GotchaTracker
ConsolidationEngine --> Session
ConfigLoader --> Profiles
ConfigLoader --> Budgets
ProjectHash --> Session
DataDir --> Session
DataDir --> KnowledgeStore
StartupGuard --> DataDir
EditorRegistry --> HookInstaller
Doctor --> EditorRegistry
Doctor --> StartupGuard
BounceTracker -.->|"bounce rates"| ContextGate
ContextGate -.->|"post-dispatch"| EvidenceLedger
ReadPipeline --> BounceTracker
ClientCapabilities --> DynamicToolMgr
ClientCapabilities --> MCPResources
ClientCapabilities --> MCPPrompts
ClientCapabilities --> MCPElicitation
MCPResources -.->|"state"| Session
MCPResources -.->|"stats"| BounceTracker
MCPElicitation -.->|"hints"| ContextGate
DynamicToolMgr --> ToolRegistry
delivery --> MCPResources
delivery --> MCPPrompts
DashBounce -.-> BounceTracker
DashClient -.-> ClientCapabilities
DashPressure -.-> BudgetGate
DashDynTools -.-> DynamicToolMgr
```
## Diagram 2: MCP `call_tool` Request Lifecycle
```mermaid
flowchart TD
Request["JSON-RPC tools/call request"]
IdleCheck["check_idle_expiry"]
MetaResolve["Resolve meta-tool ctx -> ctx_*"]
RoleCheck["role_guard::check_tool_access"]
WFCheck{"Workflow active?"}
WFAllowed{"Tool in allowed_tools?"}
WFBlocked["Return: Tool blocked by workflow"]
AutonomyPre["autonomy::session_lifecycle_pre_hook — auto-context injection"]
LoopThrottle["LoopDetector::record_search/record_call"]
LoopBlocked{"Blocked?"}
LoopBlockMsg["Return: Loop detected"]
DegPolicy2["degradation_policy::evaluate_v1_for_tool"]
BudgetExhausted{"Budget exhausted?"}
BudgetBlockMsg["Return: BUDGET EXHAUSTED"]
SLOCheck{"SLO block/throttle?"}
SLOBlockMsg["Return: SLO BLOCK"]
SLOThrottle["Sleep throttle_ms"]
ShellBudget["BudgetTracker::record_shell if shell tool"]
DispatchCall["dispatch_inner — ToolRegistry lookup (81 tools)"]
TokenCount["count_tokens + BudgetTracker::record_tokens"]
IRRecord["Context IR record — lineage, tokens, duration, compression ratio"]
AnomalyRecord["anomaly::record_metric"]
BudgetWarn{"Budget warning level?"}
ArchiveCheck{"Output large enough to archive?"}
ArchiveOp["archive::store + redact → firewall digest (ephemeral) or hint"]
OutputDensity2["protocol::compress_output — CRP density"]
Translation["tokenizer_translation_driver::translate_tool_output"]
Verification["output_verification::verify_output"]
ArchiveHint["Append archive hint"]
AutoCtx["Prepend auto-context"]
ThrottleWarn["Append throttle warning"]
BudgetWarnMsg["Append budget warning"]
SLOEval["slo::evaluate — observability"]
ReadEnrich{"ctx_read?"}
GraphHints["enrich_after_read — graph hints, prefetch, auto-dedup"]
AutoResp["maybe_auto_response — autonomy post-processing"]
ShellEfficiency{"ctx_shell?"}
ShellHint["shell_efficiency_hint"]
SessionReceipt["session.record_tool_receipt + intent inference"]
EvidenceRecord["evidence_ledger::record"]
A2ACost["CostStore::record — per-agent cost"]
Checkpoint{"Auto-checkpoint?"}
CheckpointOp["session::auto_checkpoint"]
SlowLog["slow_log if duration > threshold"]
Response["Return CallToolResult"]
Request --> IdleCheck --> MetaResolve --> RoleCheck
RoleCheck --> WFCheck
WFCheck -->|yes| WFAllowed
WFCheck -->|no| AutonomyPre
WFAllowed -->|yes| AutonomyPre
WFAllowed -->|no| WFBlocked
AutonomyPre --> LoopThrottle
LoopThrottle --> LoopBlocked
LoopBlocked -->|yes| LoopBlockMsg
LoopBlocked -->|no| DegPolicy2
DegPolicy2 --> BudgetExhausted
BudgetExhausted -->|yes| BudgetBlockMsg
BudgetExhausted -->|no| SLOCheck
SLOCheck -->|block| SLOBlockMsg
SLOCheck -->|throttle| SLOThrottle
SLOCheck -->|ok| ShellBudget
SLOThrottle --> ShellBudget
ShellBudget --> DispatchCall
DispatchCall --> TokenCount --> IRRecord --> AnomalyRecord
AnomalyRecord --> BudgetWarn
BudgetWarn --> ArchiveCheck
ArchiveCheck -->|yes| ArchiveOp
ArchiveCheck -->|no| OutputDensity2
ArchiveOp --> OutputDensity2
OutputDensity2 --> Translation --> Verification
Verification --> ArchiveHint --> AutoCtx --> ThrottleWarn --> BudgetWarnMsg
BudgetWarnMsg --> SLOEval
SLOEval --> ReadEnrich
ReadEnrich -->|yes| GraphHints
ReadEnrich -->|no| AutoResp
GraphHints --> AutoResp
AutoResp --> ShellEfficiency
ShellEfficiency -->|yes| ShellHint
ShellEfficiency -->|no| SessionReceipt
ShellHint --> SessionReceipt
SessionReceipt --> EvidenceRecord --> A2ACost
A2ACost --> Checkpoint
Checkpoint -->|yes| CheckpointOp --> SlowLog
Checkpoint -->|no| SlowLog
SlowLog --> Response
```
## Context Gate Pipeline
The Context Gate (`server/context_gate.rs`) wraps every tool dispatch with intelligent pre- and post-processing, integrated directly into the main `call_tool` flow between the degradation policy check and hybrid dispatch.
### Pre-Dispatch Gates
Before every `ctx_read` call, the Context Gate evaluates five gates in sequence:
1. **Overlay Override** — Checks the Overlay Store for explicit mode overrides (Pin → full, Exclude → signatures, SetView → specified mode).
2. **Pressure-Based Auto-Downgrade** — When context pressure exceeds 75% (ForceCompression), automatically downgrades read modes (full → map, map → signatures) to reduce token consumption. At >90% (EvictLeastRelevant), even more aggressive downgrading is applied.
3. **Bounce Prevention** — Checks the Bounce Tracker for the target file's extension bounce rate. If it exceeds 30%, overrides compressed modes (map/signatures) to full to avoid wasted re-reads.
4. **Intent-Target Match** — Validates whether the requested read mode aligns with the current intent (e.g., prevents `signatures` mode when the intent is editing).
5. **Graph Proximity + Knowledge Relevance** — Consults the Property Graph and Knowledge Store for structural proximity and factual relevance.
### Post-Dispatch Processing
After every read completes, the Context Gate performs:
1. **Ledger Recording** — Records the read event to the Context Ledger with item ID, mode, tokens, and Φ score computed with the active task context.
2. **Overlay State Check** — Evaluates current overlays to determine if the read result should be modified (pinned, rewritten, or excluded).
3. **Reinjection Plan** — When pressure exceeds ForceCompression, retroactively marks existing "full" entries as "map" in the ledger to reduce effective context load.
4. **Eviction Hints** — Based on budget pressure, suggests items for eviction from the active context.
5. **Elicitation Hints** — When conditions trigger (high pressure, large files, budget exhaustion), appends suggestions to the tool result for supporting clients.
6. **Resource Notification** — When the ledger state changes significantly (new entry, pressure threshold crossed), sends `notifications/resources/updated` to subscribed clients so they can re-fetch context state.
## Diagram 3: Data Flow
```mermaid
flowchart LR
subgraph inputs [Input Sources]
FileSystem["File System"]
ShellOutput["Shell Commands"]
SearchQuery["Search Queries"]
AgentCall["Agent Tool Calls"]
HTTPReq["HTTP Requests"]
GitLabAPI["GitLab / External APIs"]
end
subgraph processing [Processing]
ReadModes["10 Read Modes"]
PatternCompress["56 Pattern Modules"]
BM25["BM25 Index"]
SemanticEmbed["Semantic Embeddings"]
end
subgraph state [Persistent State — ~/.lean-ctx/]
SessionJSON["sessions/*.json — CCP state, receipts, intents"]
KnowledgeJSON["knowledge/<hash>/knowledge.json — facts, patterns"]
GotchaJSON["knowledge/<hash>/gotchas.json — project gotchas"]
UniversalGotcha["universal-gotchas.json — cross-project"]
GraphData["graph/ — property graph, dependencies"]
IndexData["indexes/ — BM25, vector, artifact indexes"]
StatsJSON["stats.json — token savings, call counts"]
ProofArtifacts["proofs/ — context-proof-v1, context-ir-v1"]
ArchiveData["archives/ — large output storage"]
EvidenceJSON["evidence/ — tool call journal"]
HandoffData["handoffs/ — ledgers and bundles"]
end
subgraph derived [Derived Outputs]
CompressedCtx["Compressed Context — to LLM"]
ProofReport["Proof Artifacts — JSON + HTML"]
GainMetrics["Gain Metrics — savings, costs"]
IRSnapshot["Context IR — live lineage (every tool call), provenance, safety"]
PackBundle["PR Pack — diff context bundle"]
Instructions["Instructions — per-client, per-profile"]
end
FileSystem --> ReadModes --> CompressedCtx
ShellOutput --> PatternCompress --> CompressedCtx
SearchQuery --> BM25 --> CompressedCtx
SearchQuery --> SemanticEmbed --> CompressedCtx
GitLabAPI --> CompressedCtx
AgentCall --> SessionJSON
AgentCall --> KnowledgeJSON
AgentCall --> EvidenceJSON
ReadModes --> StatsJSON
PatternCompress --> StatsJSON
KnowledgeJSON --> CompressedCtx
SessionJSON --> CompressedCtx
GraphData --> CompressedCtx
EvidenceJSON --> ProofArtifacts
SessionJSON --> ProofArtifacts
KnowledgeJSON --> ProofArtifacts
StatsJSON --> GainMetrics
EvidenceJSON --> IRSnapshot
HandoffData --> PackBundle
SessionJSON -.->|"resume"| SessionJSON
KnowledgeJSON -.->|"lifecycle decay"| ArchiveData
ArchiveData -.->|"rehydrate"| KnowledgeJSON
```
## Module Overview
### Entry Points
| Module | Purpose |
|:---|:---|
| `main.rs` | CLI entry point — arg parsing, subcommand dispatch |
| `mcp_stdio.rs` | MCP stdio transport — JSON-RPC framing over stdin/stdout |
| `http_server/mod.rs` | Streamable HTTP MCP transport (single workspace) |
| `http_server/team.rs` | Multi-workspace team server with Bearer auth + scopes |
| `daemon.rs` | Daemon lifecycle — PID file, fork, stop, status |
| `daemon_client.rs` | HTTP-over-UDS client for CLI-to-daemon IPC |
### Server Layer
| Module | Purpose |
|:---|:---|
| `server/mod.rs` | `LeanCtxServer` — MCP server state, `call_tool` pipeline (dispatch + post-processing + Context IR recording) |
| `server/tool_trait.rs` | `McpTool` trait, `ToolOutput`, `ToolContext` — interface for self-contained tools |
| `server/registry.rs` | `ToolRegistry` — HashMap-based tool lookup, `build_registry()` registers all 81 trait-based tools |
| `server/dispatch/mod.rs` | Registry dispatch — `dispatch_inner` resolves every tool through the `ToolRegistry` (81 tools); `ctx_call` routes meta-invocations back through it |
| `server/context_gate.rs` | Context Gate — post-dispatch for ctx_read: ledger recording, eviction/elicitation hints, pressure tracking |
| `server/resources.rs` | MCP Resources — 5 URI-addressable subscribe-capable resources (`lean-ctx://context/*`) |
| `server/prompts.rs` | MCP Prompts — 5 slash commands for context manipulation |
| `server/elicitation.rs` | Elicitation — rate-limited proactive suggestions (max 1 per 20 calls) |
| `server/dynamic_tools.rs` | Dynamic Tool Manager — 6 categories (core, arch, debug, memory, metrics, session), on-demand loading |
| `server/execute.rs` | Shell command execution within MCP context |
| `server/helpers.rs` | Shared server utilities |
| `server/role_guard.rs` | Role-based tool access policy |
| `tool_defs/` | Tool metadata, JSON schemas, granular vs unified mode |
| `tools/` | 51+ tools (granular mode) + `LeanCtxServer` state struct |
| `tools/registered/` | 69 self-contained `McpTool` implementations (schema + handler co-located) |
### Shell Layer
| Module | Purpose |
|:---|:---|
| `shell.rs` | Shell command execution, output capture, compression |
| `shell_hook.rs` | Shell hook initialization (`lean-ctx init --global`) |
| `core/patterns/` | 56 pattern modules (added fd, just, ninja, clang, cargo run/bench) |
| `compound_lexer.rs` | Multi-command parsing (`&&`, `\|\|`, pipes) |
### Core Intelligence
| Module | Purpose |
|:---|:---|
| `core/cache.rs` | Content-addressed file cache with compressed output cache for map/signatures |
| `core/tokens.rs` | Multi-tokenizer counting (o200k_base, cl100k_base, Gemini correction, Llama) |
| `core/signatures.rs` | Signature extraction (regex + tree-sitter AST for 26 languages) |
| `core/compressor.rs` | Multi-strategy compression (entropy, attention, TF-IDF codebook) |
| `core/entropy.rs` | Shannon entropy analysis per line |
| `core/attention_model.rs` | U-curve positional weighting for LLM attention |
| `core/session.rs` | Cross-session memory (CCP), Session Survival Engine (structured recovery queries) |
| `core/hybrid_search.rs` | Hybrid Search with RRF — BM25 + semantic + graph proximity fusion |
| `core/knowledge.rs` | Persistent project knowledge store |
| `core/graph_index.rs` | Project dependency graph |
| `core/property_graph/` | AST-based property graph (node.rs, edge.rs, schema.rs, meta.rs, queries.rs — multi-edge BFS, related_files, file_connectivity) |
| `core/graph_context.rs` | Graph-aware read hints (`build_related_hint`, `build_related_paths_csv`) |
| `core/graph_provider.rs` | Unified graph backend abstraction (PropertyGraph / GraphIndex) |
| `core/graph_enricher.rs` | Metadata enrichment for graph nodes |
| `core/graph_export.rs` | Graph export to DOT/Mermaid/JSON formats |
| `core/dense_backend.rs` | Dense embedding backend for semantic search (ONNX all-MiniLM-L6-v2) |
| `core/embedding_index.rs` | BM25 + embedding index management |
| `core/import_resolver.rs` | Cross-file import resolution |
| `core/import_resolver.rs` + `core/deps.rs` | Import/call/type extraction per language |
| `core/heatmap.rs` | File access frequency tracking (atomic writes, flush/reset) |
| `core/bounce_tracker.rs` | Bounce detection — per-file read events, per-extension bounce rate tracking (30% threshold), adjusted savings |
| `core/client_capabilities.rs` | Client capability detection — 9 IDE runtime identification, Tier 1-4 classification, MCP feature gates |
| `core/updater.rs` | `lean-ctx update` — binary update, daemon restart, hook re-wire |
| `core/workspace_config.rs` | Workspace-level `.lean-ctx.toml` config parsing |
| `core/wrapped.rs` | Session-wrapped reports (savings summary, compression rate) |
| `core/protocol.rs` | Cognitive Efficiency Protocol (CEP) output density |
| `core/pipeline.rs` | Pipeline layer definitions and metrics aggregation |
| `core/context_ir.rs` | Context IR v1 — provenance, safety, token tracking |
| `core/context_proof.rs` | Machine-readable proof artifacts |
| `core/evidence_ledger.rs` | Tool call journal with verification hashes |
| `core/output_verification.rs` | Output quality checks (hallucination, paths) |
| `core/redaction.rs` | Secret/PII removal from outputs |
| `core/safety_needles.rs` | Secret detection patterns for output scanning |
| `core/sandbox.rs` | Sandboxed shell execution (ctx_execute) |
| `core/semantic_chunks.rs` | Semantic chunking for embedding indexing |
| `core/semantic_cache.rs` | Semantic similarity cache for near-duplicate detection |
| `core/rabin_karp.rs` | Rolling hash for cross-file deduplication |
| `core/codebook.rs` | TF-IDF codebook for compression vocabulary |
| `core/compression_safety.rs` | Safety checks for compression (no semantic loss) |
| `core/pop_pruning.rs` | Intent-conditioned content pruning (POP) |
| `core/context_deficit.rs` | Context deficit analysis for proactive fetch |
| `core/context_field.rs` | **CFT** — Unified Context Potential Function Φ(i,t): relevance + surprise + graph + history cost redundancy |
| `core/context_ledger.rs` | **CFT** — Rich Context Ledger with ContextItemId, states (Candidate/Included/Excluded/Pinned/Stale), Φ scores, ViewCosts, provenance |
| `core/context_overlay.rs` | **CFT** — Reversible overlays (Include/Exclude/Pin/Rewrite/SetView) with scope and staleness |
| `core/context_handles.rs` | **CFT** — Sparse lazy-loading handles (@F1, @S1, @K1) — 5-30 tokens per item |
| `core/context_compiler.rs` | **CFT** — Greedy Knapsack compiler with Boltzmann view selection and phase-transition downgrades |
| `core/context_policies.rs` | **CFT** — Declarative policy engine: match-pattern + condition + action rules |
| `core/contracts.rs` | 20 versioned contract definitions (incl. CONTEXT_PACKAGE_V1) |
| `core/integrity.rs` | Contract compliance verification |
| `core/memory_boundary.rs` | Cross-project boundary policy, audit events |
| `core/io_boundary.rs` | I/O boundary — secret-path checks, role-aware access |
| `core/providers/` | External provider framework (GitHub, GitLab, Jira, Postgres, MCP bridges, config-based REST) |
| `core/consolidation.rs` | Provider consolidation: chunks → BM25 + Graph edges + Knowledge facts + Cache |
| `core/cross_source_edges.rs` | Cross-source edge generation (issue → code file links) |
| `core/cross_source_hints.rs` | Cross-source hints for `ctx_read` (related issues/PRs) |
| `core/knowledge_provider_extract.rs` | Knowledge fact extraction from provider data |
| `core/content_chunk.rs` | ContentChunk abstraction for external data |
### Policy and Governance
| Module | Purpose |
|:---|:---|
| `core/profiles.rs` | Context profiles (coder, bugfix, review, exploration, hotfix, ci-debug) |
| `core/roles.rs` | Role system (coder, reviewer, explorer, ops) |
| `core/budgets.rs` | Budget definitions and defaults |
| `core/budget_tracker.rs` | Global token/shell/cost tracking |
| `core/slo.rs` | SLO evaluation (compression, latency, cache) |
| `core/degradation_policy.rs` | Budget/SLO-based tool degradation |
| `core/memory_policy.rs` | Knowledge limits, decay rates, lifecycle config |
| `core/autonomy_drivers.rs` | Prefetch, auto-dedup, auto-response rules |
| `core/loop_detection.rs` | Search loop throttling and blocking |
### Context Packaging
| Module | Purpose |
|:---|:---|
| `core/context_package/manifest.rs` | PackageManifest — schema validation, integrity (SHA-256), provenance, compatibility |
| `core/context_package/content.rs` | PackageContent — 5 layers: Knowledge, Graph, Session, Patterns, Gotchas |
| `core/context_package/builder.rs` | PackageBuilder — collects from Knowledge DB, Property Graph, Session, GotchaStore |
| `core/context_package/loader.rs` | PackageLoader — merges knowledge (dedup), imports graph nodes/edges, imports gotchas |
| `core/context_package/registry.rs` | LocalRegistry — `~/.lean-ctx/packages/`, index, versioning, export/import (.ctxpkg) |
| `core/context_package/auto_load.rs` | Auto-load — marked packages loaded on `ctx_overview` session start |
| `cli/pack_cmd.rs` | CLI — `lean-ctx pack create/list/info/remove/export/import/install/auto-load` (9 subcommands) |
### Context OS — Multi-Agent Runtime
| Module | Purpose |
|:---|:---|
| `core/context_os/mod.rs` | Runtime entry point, `emit_event`, `emit_directed_event`, event classification, consistency levels |
| `core/context_os/context_bus.rs` | Immutable event log — SQLite WAL, R/W split, per-stream broadcast, FTS5, TopicFilter, directed events, filtered subscriptions |
| `core/context_os/shared_sessions.rs` | Multi-agent shared sessions — LRU-64 eviction, workspace/channel keyed, persist-on-evict |
| `core/context_os/metrics.rs` | Observability — event counts, session loads/persists, active workspaces with TTL cleanup |
| `http_server/context_views.rs` | REST endpoints — `/v1/context/summary`, `/v1/events/search` (FTS + channel filter), `/v1/events/lineage` |
| `tools/knowledge_shared.rs` | Shared policy loader — deduplicated `load_policy_or_error` for knowledge tools |
### Memory and Knowledge
| Module | Purpose |
|:---|:---|
| `core/knowledge.rs` | ProjectKnowledge — facts, patterns, history, rooms, inverted token index for O(terms) recall |
| `core/gotcha_tracker/` | Gotcha tracking (project + universal) |
| `core/knowledge_relations.rs` | Fact-to-fact relation graph |
| `core/knowledge_embedding.rs` | Semantic recall via embeddings |
| `core/knowledge_bootstrap.rs` | Initial knowledge population |
| `core/memory_lifecycle.rs` | Decay, category-grouped consolidation (O(n) per category), archive, rehydrate |
| `core/consolidation_engine.rs` | Merge insights across sessions |
| `core/session_diff.rs` | Session state diffing for change detection |
| `core/episodic_memory.rs` | Episode tracking |
| `core/procedural_memory.rs` | Learned procedures |
| `core/prospective_memory.rs` | Scheduled reminders |
### Agent-to-Agent
| Module | Purpose |
|:---|:---|
| `core/agents.rs` | Agent registry (register, list, status) |
| `core/a2a/` | Agent-to-agent: cost attribution, rate limiting, messaging, agent cards, task protocol, A2A JSON-RPC compat |
| `core/a2a_transport.rs` | TransportEnvelopeV1 + AgentIdentityV1 — HMAC-signed cross-machine transport for .ctxpkg and handoff bundles |
| `core/handoff_ledger.rs` | Handoff creation and listing |
| `core/handoff_transfer_bundle.rs` | Privacy-aware portable export/import |
| `core/ccp_session_bundle.rs` | CCP session bundle format |
### Cognition Drivers
| Module | Purpose |
|:---|:---|
| `core/tokenizer_translation_driver.rs` | Token shorthand per model family |
| `core/attention_layout_driver.rs` | Line ordering for attention efficiency |
| `core/client_constraints.rs` | Per-IDE/model capability matrix |
| `core/litm.rs` | Lost-in-the-Middle positioning |
| `core/adaptive.rs` | Task complexity classification |
| `core/mode_predictor.rs` | Smart read mode selection |
| `core/intent_engine.rs` | Intent classification engine |
| `core/intent_protocol.rs` | Intent inference from tool call patterns |
| `core/intent_router.rs` | Intent-to-profile routing |
| `core/instruction_compiler.rs` | Client + profile to instruction compilation |
| `core/task_relevance.rs` | Content scoring by current task context |
| `core/task_briefing.rs` | Task context briefing generation |
| `core/route_extractor.rs` | API route extraction from source files |
| `core/bandit.rs` | Multi-armed bandits for mode selection |
| `core/llm_feedback.rs` | Compression quality feedback loop |
### Neural Layer
| Module | Purpose |
|:---|:---|
| `core/neural/mod.rs` | Neural optimization module orchestration |
| `core/neural/token_optimizer.rs` | Rules-based token reduction (whitespace, comments, redundancy) |
| `core/neural/context_reorder.rs` | L-curve attention reordering for salient information |
| `core/neural/line_scorer.rs` | Per-line importance scoring |
| `core/neural/cache_alignment.rs` | Prefix-cache-friendly content ordering |
| `core/neural/attention_learned.rs` | Learned attention weights for content prioritization |
### Internal Utilities
| Module | Purpose |
|:---|:---|
| `core/anomaly.rs` | Metric anomaly detection and recording |
| `core/archive.rs` | Large output archival and retrieval |
| `core/data_dir.rs` | `~/.lean-ctx/` data directory management |
| `core/error.rs` | `LeanCtxError` typed error definitions |
| `core/filters.rs` | Content filtering (gitignore, binary detection) |
| `core/home.rs` | Home directory resolution |
| `core/jsonc.rs` | JSONC (JSON with comments) parser |
| `core/limits.rs` | Resource limit constants |
| `core/logging.rs` | `tracing` logger initialization |
| `core/pathutil.rs` | Path normalization and resolution utilities |
| `core/sanitize.rs` | Output sanitization (control characters, encoding) |
| `core/version_check.rs` | Version compatibility checks |
| `core/slow_log.rs` | Slow operation logging (threshold-based) |
| `core/telemetry.rs` | Telemetry stub (zero collection, local only) |
| `core/mcp_manifest.rs` | MCP tool manifest generation |
| `core/portable_binary.rs` | Cross-platform binary packaging |
### CLI Layer
| Module | Purpose |
|:---|:---|
| `cli/mod.rs` | CLI subcommands (75+ commands) |
| `cli/dispatch.rs` | Subcommand routing and HTTP server startup |
| `cli/init_cmd.rs` | `lean-ctx init` — hook installation |
| `cli/proof_cmd.rs` | `lean-ctx proof` — proof artifact generation |
| `cli/verify_cmd.rs` | `lean-ctx verify` — verification status |
| `cli/instructions_cmd.rs` | `lean-ctx instructions` — instruction compilation |
| `cli/pack_cmd.rs` | `lean-ctx pack` — PR context bundle |
| `cli/index_cmd.rs` | `lean-ctx index` — graph/BM25 index management |
| `cli/profile_cmd.rs` | `lean-ctx profile` — profile management |
| `cli/knowledge_cmd.rs` | `lean-ctx knowledge remember/recall/search/export/import/remove/consolidate [--all]/status/health/lifecycle` |
| `cli/overview_cmd.rs` | `lean-ctx overview [task]` |
| `cli/compress_cmd.rs` | `lean-ctx compress` |
| `cli/session_cmd.rs` | Extended: `lean-ctx session task/finding/save/load/decision/reset/status` |
| `cli/cloud.rs` | Cloud sync, login, export |
### Integration Layer
| Module | Purpose |
|:---|:---|
| `hooks/` | Agent-specific installation (20+ agents/IDEs) |
| `hooks/mod.rs` | HookMode enum (Mcp/Hybrid), smart mode selection |
| `hooks/agents/` | Per-agent installers (20 agents: cursor, claude, codex, copilot, gemini, jetbrains, windsurf, cline, amp, kiro, opencode, crush, hermes, pi, ...) |
| `rules_inject.rs` | Rule file injection into project/home directories |
| `setup.rs` | SKILL installation, smart hook mode, all-agent coverage |
| `doctor.rs` | Diagnostics incl. SKILL check, provider env vars, MCP bridge status |
| `engine/` | `ContextEngine` — programmatic API for tool calls |
| `instructions.rs` | MCP instruction builder |
### Analytics and UI
| Module | Purpose |
|:---|:---|
| `core/stats/` | Token savings persistence (mod.rs, io.rs with file locking, format.rs, model.rs) |
| `core/gain/` | Gain scoring, model pricing, task classification |
| `core/heatmap.rs` | File access frequency tracking |
| `dashboard/` | Web dashboard (localhost:3333) |
| `dashboard/routes/context.rs` | Context Control Plane API — /api/context-bounce, /api/context-client, /api/context-pressure, /api/context-dynamic-tools |
| `dashboard/static/components/cockpit-context.js` | Runtime Control Plane panel — IDE indicator, pressure gauge, bounce stats, dynamic tool status |
| `tui/` | Terminal UI components |
| `report.rs` | Export and reporting |
## MCP Tools (57 granular + 5 unified)
### Core Tools (loaded by default)
| Tool | Purpose |
|:---|:---|
| `ctx_read` | Read file with 10 compression modes |
| `ctx_multi_read` | Batch read multiple files |
| `ctx_shell` | Execute shell command with pattern compression |
| `ctx_search` | Code search (regex + glob) |
| `ctx_edit` | Safe file editing with TOCTOU guard |
| `ctx_tree` | Directory listing |
| `ctx_session` | Session management (25 actions incl. output_stats) |
| `ctx_knowledge` | Knowledge store (21 actions incl. health) |
| `ctx_call` | Meta-tool for dynamic tool invocation |
### Discovery Tools (loaded on demand)
ctx_compress, ctx_benchmark, ctx_compare, ctx_metrics, ctx_analyze, ctx_cache, ctx_discover, ctx_smart_read, ctx_delta, ctx_pack, ctx_index, ctx_artifacts, ctx_dedup, ctx_fill, ctx_intent, ctx_response, ctx_context, ctx_proof, ctx_verify, ctx_graph, ctx_agent, ctx_share, ctx_overview, ctx_preload, ctx_prefetch, ctx_cost, ctx_gain, ctx_feedback, ctx_handoff, ctx_heatmap, ctx_task, ctx_impact, ctx_architecture, ctx_workflow, ctx_semantic_search, ctx_execute, ctx_symbol, ctx_refactor, ctx_routes, ctx_compress_memory, ctx_callgraph, ctx_outline, ctx_expand, ctx_review, ctx_provider
## LSP Integration (ctx_refactor)
The LSP subsystem (`lsp/`) provides language-server-powered refactoring via `ctx_refactor`.
```
┌─────────────────┐ ┌──────────────┐ ┌───────────────────┐
│ ctx_refactor │────▶│ Router │────▶│ LspClient │
│ (MCP tool) │ │ (per-lang) │ │ (channel-based) │
└─────────────────┘ └──────────────┘ └───────────────────┘
┌───────┴────────┐
│ Reader Thread │
│ (mpsc channel) │
└───────┬────────┘
│ stdio
┌───────▼────────┐
│ Language Server │
│ (subprocess) │
└────────────────┘
```
Key design decisions:
- **Channel-based IO**: A background thread reads LSP stdout via `mpsc::channel`, enabling timeout-protected reads without blocking the MCP server
- **Timeouts**: 60s for initialization (language servers index on start), 30s for requests, 5s for shutdown
- **Process health checks**: `check_alive()` before every request detects dead servers early
- **Lazy client lifecycle**: Language servers are started on first use per language, kept alive for the session, shut down on `Drop`
- **Router pattern**: `CLIENTS` static holds one `LspClient` per language; `with_client()` provides scoped mutable access
Supported servers: rust-analyzer, typescript-language-server, pylsp, gopls (configured in `lsp/config.rs`).
Optional enhancement — graceful degradation:
- If no language server is installed, `ctx_refactor` returns a clear error with install instructions
- `lean-ctx doctor` shows LSP availability in a dedicated section (not counted in score)
- Custom paths configurable via `[lsp]` section in `config.toml`
- Core features (`ctx_search`, `ctx_symbol`, `ctx_graph`) work without any language server
## Archive Full-Text Search (FTS5)
The archive FTS subsystem (`core/archive_fts.rs`) enables cross-archive fulltext search using SQLite FTS5.
- **Index hook**: Every `archive::store()` call indexes the content in the FTS5 virtual table
- **Cleanup hook**: `archive::cleanup()` removes entries from the FTS index
- **Search**: `ctx_expand action=search_all query="..."` searches all archived outputs
- **Storage**: `~/.lean-ctx/archive_fts.db` (SQLite, created lazily on first use)
## Bounce Detection
The Bounce Tracker (`core/bounce_tracker.rs`) monitors read patterns to detect and prevent token waste from "bounces" — when an agent reads a file in a compressed mode and immediately re-reads it in full mode.
### Mechanism
- **Event Recording** — Every `ctx_read` call records a `ReadEvent` with file path, mode, token count, and sequence number.
- **Bounce Detection** — A bounce is detected when a compressed read (map, signatures, aggressive) is followed by a full read of the same file within 3 tool calls. The tokens from the compressed read are marked as wasted.
- **Per-Extension Tracking** — Bounce rates are tracked per file extension (e.g., `.rs`, `.ts`). Extensions exceeding a 30% bounce rate trigger automatic mode upgrades via the Context Gate.
- **Adjusted Savings** — `adjusted_total_saved()` deducts wasted bounce tokens from the total savings metric, providing an honest measure of actual token savings.
### Integration Points
| Tool | Integration |
|:-----|:------------|
| `ctx_read` | Records read events, checks bounce prevention before mode selection |
| `ctx_edit` | Records edit events (edits after compressed reads count as bounces) |
| `ctx_shell` | Records shell events for cross-tool bounce analysis |
| `ctx_metrics` | Exposes bounce statistics via `action="bounce"` |
| MCP Resource | `lean-ctx://context/bounce` — subscribable bounce statistics |
## MCP Protocol Layer
lean-ctx implements three MCP protocol extensions beyond `tools/call`, all gated by client capability detection.
### MCP Resources (`server/resources.rs`)
Five URI-addressable resources provide live context state to supporting clients:
| URI | Content |
|:----|:--------|
| `lean-ctx://context/summary` | Session summary — files, tokens, savings |
| `lean-ctx://context/pressure` | Budget pressure gauge (0100%) |
| `lean-ctx://context/plan` | Current context plan from CFT compiler |
| `lean-ctx://context/pinned` | List of pinned context items |
| `lean-ctx://context/bounce` | Bounce detection statistics |
Resources are **subscribe-capable** — clients supporting `notifications/resources/updated` receive push notifications on state changes. Resources are only advertised in `ServerCapabilities` when the connected client supports them.
### MCP Prompts (`server/prompts.rs`)
Five slash commands appear as IDE-native commands in supporting clients:
| Command | Purpose |
|:--------|:--------|
| `/context-focus` | Set task focus — adjusts relevance scoring |
| `/context-review` | Review current context composition |
| `/context-reset` | Reset context state (overlays, pins, budget) |
| `/context-pin` | Pin a file or knowledge item to context |
| `/context-budget` | Adjust token budget parameters |
Prompts are gated by client capabilities — only enabled for clients that expose MCP prompt support.
### Elicitation (`server/elicitation.rs`)
Rate-limited proactive suggestions to the agent, triggered by context pressure:
- **Rate Limit** — Maximum 1 elicitation per 20 tool calls to avoid noise
- **Triggers**:
- Budget pressure exceeds 90%
- File read exceeds 5000 tokens (suggests compressed mode)
- Token budget exhausted (suggests eviction or budget increase)
- **Graceful Degradation** — For clients that don't support MCP elicitation, suggestions are appended as fallback hints in tool results
## Client Capability Detection
Runtime client identification (`core/client_capabilities.rs`) detects the connected IDE/agent during `initialize` and dynamically gates server features.
### Detected Clients
| Client | Tier | Key Capabilities |
|:-------|:-----|:-----------------|
| Cursor | 1 | All features — resources, prompts, elicitation, sampling, dynamic tools |
| Claude Code | 1 | All features |
| CodeBuddy | 1 | All features (same architecture as Claude Code) |
| Windsurf | 2 | Resources, prompts, dynamic tools (100-tool limit) |
| Zed | 2 | Resources, prompts |
| VS Code Copilot | 2 | Resources, dynamic tools |
| Kiro | 3 | Resources |
| Codex | 3 | Dynamic tools |
| Antigravity | 3 | Resources |
| Gemini CLI | 4 | Basic MCP only |
### Tier Classification
- **Tier 1** — Full MCP feature support (resources, prompts, elicitation, sampling, dynamic tools)
- **Tier 2** — Most features, some limitations (e.g., Windsurf 100-tool cap)
- **Tier 3** — Partial support, specific features only
- **Tier 4** — Basic `tools/call` only, no extensions
### ServerCapabilities Gating
The `initialize` handler dynamically builds `ServerCapabilities` based on the detected client. Each capability field (`resources`, `prompts`, `tools.listChanged`) is only present when the client supports it.
## Dynamic Tool Categories
The Dynamic Tool Manager (`server/dynamic_tools.rs`) organizes tools into 6 categories to manage tool count limits and reduce schema overhead.
### Categories
| Category | Count | Default | Description |
|:---------|:------|:--------|:------------|
| `core` | ~27 | Always | Essential read/write/search/session tools |
| `arch` | ~8 | On-demand | Architecture tools (graph, impact, callers, callees) |
| `debug` | ~5 | On-demand | Debug tools (proof, verify, anomaly) |
| `memory` | ~6 | On-demand | Memory tools (knowledge, episodic, procedural) |
| `metrics` | ~4 | On-demand | Metrics tools (cost, gain, benchmark, heatmap) |
| `session` | ~5 | Always | Session lifecycle tools (session, workflow, task) |
### Loading Strategy
- **Dynamic clients** (supporting `tools/list_changed`): Only `core` + `session` loaded at startup. Other categories loaded on demand via `ctx_load_tools`, with `notifications/tools/list_changed` sent to the client after every load/unload.
- **Static clients** (no `tools/list_changed` support): All tools loaded at initialization, preserving backward compatibility.
- **Windsurf** (100-tool limit): Category management ensures the limit is respected — core + session loaded first, remaining categories lazy-loaded, least-used categories evicted if the limit is reached.
### `ctx_load_tools` Tool
Agents can explicitly manage categories at runtime:
```
ctx_load_tools action=list # show category status
ctx_load_tools action=load category=arch # load architecture tools
ctx_load_tools action=unload category=debug # unload debug tools
```
After each load/unload, `notifications/tools/list_changed` is sent to the client. The client then re-fetches the tool list via `tools/list`, which returns only tools from active categories.
## Dashboard Control Plane
The dashboard (`localhost:3333`) includes a Runtime Control Plane panel with 4 new API endpoints:
| Endpoint | Content |
|:---------|:--------|
| `/api/context-bounce` | Bounce detection statistics — per-extension rates, wasted tokens |
| `/api/context-client` | Connected client identification — name, tier, capabilities |
| `/api/context-pressure` | Budget pressure gauge — current/max tokens, percentage |
| `/api/context-dynamic-tools` | Dynamic tool status — loaded categories, tool counts |
The frontend (`cockpit-context.js`) renders these as a unified control panel with IDE indicator badge, pressure gauge with color coding, bounce rate chart, and dynamic tool category toggles.
## Key Design Decisions
1. **Single binary** — No runtime dependencies. Shell hook, MCP server, CLI, and dashboard all in one `lean-ctx` binary.
2. **Persistent MCP server** — Unlike shell-hook-only tools, lean-ctx runs as a long-lived process. This enables file caching (re-reads cost ~13 tokens), session state, and cross-tool dedup.
3. **Pattern-based compression** — Each CLI tool (git, cargo, npm, ...) has a dedicated pattern module in `core/patterns/` (56 modules, versioned). Patterns are handcrafted per subcommand for maximum fidelity.
4. **tree-sitter for signatures** — AST-based extraction handles multi-line signatures, nested scopes, and arrow functions correctly across 26 languages. Falls back to regex for unsupported languages.
5. **Content-addressed caching** — Files are hashed on first read. Subsequent reads return a compact stub (~13 tokens) unless the file changed on disk.
6. **Error strategy**`thiserror` for typed errors (`LeanCtxError`), `anyhow` for ad-hoc contexts. Tools return user-friendly error messages; internal errors are logged via `tracing`.
7. **Lazy tool loading** — By default, only 9 core tools are exposed. Additional tools are loaded on demand via `ctx_discover_tools` to minimize schema token overhead for smaller models.
8. **7-stage pipeline** — Content flows through Input → Autonomy → Intent → Relevance → Compression → Translation → Delivery. Each stage can be enabled/disabled per profile.
9. **Post-dispatch output pipeline** — After tool execution, outputs pass through density compression, tokenizer translation, output verification, archiving, and autonomy post-processing before delivery.
10. **Contract-first governance** — 19 versioned contracts with CI drift gates ensure documentation, configuration, and runtime stay synchronized.
11. **Trait-based dispatch architecture** — all 81 tools are registered in a trait-based `McpTool` registry (`tools/registered/`), co-locating schema definitions with handlers to eliminate schema-drift. The earlier hybrid match-cascade has been fully retired: `dispatch_inner` resolves every tool — including the mutable-state ones (cache/session writes) — through the `ToolRegistry`, and `ctx_call` routes meta-invocations back through the same path. Post-dispatch processing (Context IR recording, terse compression, verification, enrichment) is handled inline in `server/mod.rs`. CI drift-gate tests (`tool_registry_complete.rs`) prevent duplicate dispatch and ensure schema consistency.
12. **Daemon mode**`lean-ctx serve --daemon` starts a background process with Unix Domain Socket for zero-overhead CLI-to-server IPC. PID file at `~/.local/share/lean-ctx/daemon.pid`, socket at `daemon.sock`.
13. **Multi-tokenizer support** — Token counting supports o200k_base (GPT), cl100k_base (Claude/Llama), and Gemini (with 1.1x correction). Auto-detected from client name.
14. **Hybrid hook mode** — Agents with reliable shell access use Hybrid mode: MCP for cached reads/search plus shell hooks that compress command output (`git`, `cargo`, `npm`, …) with zero schema overhead. Agents without reliable shell hooks (most IDE extensions) use MCP-only. Mode is auto-detected per agent (`recommend_hook_mode`) and can be overridden with `lean-ctx init --agent cursor --mode hybrid|mcp`.
15. **Field-wise profile merge** — Child profiles inherit unset fields from parents using `Option<T>` + `.or()` semantics. A child with only `[read] default_mode = "map"` inherits all other fields.
16. **Prefix-cache-friendly output** — Tool outputs are structured with static content (path, deps, types) before dynamic content (file body, session annotations) to maximize Anthropic/OpenAI prefix cache hits.
17. **Intent-aware read modes** — The intent classifier's recommended read mode is wired into `ctx_smart_read` as a strong signal, so task-appropriate modes are selected automatically.
18. **Graph-powered reads** — Every `ctx_read` consults the Property Graph for related files, appending a `[related: ...]` hint with scored paths. Agents immediately see file context without extra tool calls.
19. **Multi-signal search fusion** — Reciprocal Rank Fusion (RRF) combines BM25 (lexical), dense embeddings (semantic), and graph proximity (structural) in `ctx_semantic_search`, producing higher-quality results than any single signal.
20. **Session survival**`build_compaction_snapshot()` generates structured XML recovery sections (`<recovery_queries>`, `<knowledge_context>`, `<graph_context>`) so agents can reconstruct context after compaction.
21. **Incremental graph updates**`ctx_impact(action="update")` uses `git diff --name-only` to re-index only changed files instead of a full graph rebuild, keeping the Property Graph current with minimal cost.
22. **Progressive throttling**`AutonomyState` tracks repeated searches. Calls 13: normal; 46: hint to use `ctx_knowledge`; 7+: throttle hint. Sandbox-first routing redirects large outputs (>5 KB shell, >10 K tokens read) toward more efficient alternatives.
23. **Context Field Theory (CFT)** — Each context item has a unified potential Φ(i,t) combining 6 signals: task relevance (heat diffusion + PageRank), predictive surprise (cross-entropy), graph proximity (weighted BFS), history signal (Thompson Sampling bandit), token cost, and redundancy (Jaccard/MinHash). Budget pressure drives phase-transition view downgrades (full→signatures→map→handle) via Boltzmann-weighted selection.
24. **Context Handles** — Sparse lazy references (@F1, @S1, @K1) that represent context items in 5-30 tokens each, deferring expansion until the agent explicitly requests it via `ctx_expand`. This achieves Working Memory-like sparse coding.
25. **Reversible Overlays** — Context manipulations (exclude, pin, rewrite, set_view) are stored as reversible overlays with scope (Call/Session/Project/Agent/Global) and automatic staleness detection when source content changes.
26. **Context Compiler** — Greedy Knapsack algorithm selects items by efficiency (Φ/token), applies phase-transition view downgrades under budget pressure, and outputs in three modes: HandleManifest (5-10% tokens), Compressed (optimal views), FullPrompt (complete content).
27. **Context Bus R/W split** — The Context Bus uses a dedicated write connection plus a pool of read-only connections (WAL mode), enabling concurrent reads without blocking event appends. Per-stream broadcast channels replace the global channel, eliminating cross-workspace filtering overhead.
28. **Knowledge recall via inverted index** — Knowledge `recall()` builds a token index on load, reducing search from O(facts × terms × string_length) to O(terms × lookups). Category-grouped consolidation in `memory_lifecycle` reduces pairwise comparisons from O(n²) to O(n per category).
29. **LRU session eviction**`SharedSessionStore` caps cached sessions at 64, evicting the least-recently-used session (with disk persistence) when the limit is reached. Active workspace metrics auto-expire after 10 minutes of inactivity.
30. **Context Gate pipeline** — Every `ctx_read` passes through a pre-dispatch gate (bounce prevention, intent-target match, graph proximity, knowledge relevance) and a post-dispatch gate (ledger recording, overlay check, eviction/elicitation hints). This prevents wasteful reads at the source rather than compensating downstream.
31. **Bounce detection and adjusted savings** — The Bounce Tracker monitors read patterns for "bounces" (compressed read immediately followed by full read). Wasted tokens are deducted from savings metrics via `adjusted_total_saved()`, and per-extension bounce rates above 30% trigger automatic mode upgrades through the Context Gate.
32. **MCP protocol extensions** — Resources (5 URIs), Prompts (5 slash commands), and Elicitation (rate-limited suggestions) extend the basic MCP `tools/call` surface. All extensions are gated by client capability detection — only advertised in `ServerCapabilities` when the connected client supports them.
33. **Runtime client capability detection** — 9 IDE clients are identified during `initialize` and classified into Tiers 1-4 based on MCP feature support. `ServerCapabilities` is dynamically built per-client, ensuring no unsupported features are advertised.
34. **Dynamic tool categories** — Tools are organized into 6 categories (core, arch, debug, memory, metrics, session). Clients supporting `tools/list_changed` get only core+session at startup; others are loaded on-demand. This reduces initial schema overhead and respects tool count limits (e.g., Windsurf's 100-tool cap).
35. **Dashboard Control Plane** — 4 new API endpoints (/api/context-bounce, -client, -pressure, -dynamic-tools) expose runtime state. The frontend cockpit-context.js panel provides live visibility into IDE detection, budget pressure, bounce rates, and dynamic tool loading.
## Direction: Context Time Machine
The IR / proof / ledger foundations above are designed to compose into a single
temporal artifact. **Context IR** records live lineage (what entered context, from
where, at what token cost); **Context Proof** signs point-in-time snapshots with
replay hashes; the **Context Ledger** explains *why* each item was included, with
its Φ-score. Git-anchoring these and chaining them across commits yields a
**Context Snapshot** — a signed, navigable record you can rewind, reproduce,
resume, or share. This is a documented direction (not yet shipped); the design
lives in [`docs/concepts/context-time-machine.md`](docs/concepts/context-time-machine.md).
## Diagram 5: Context Field Theory (CFT) Architecture
```mermaid
flowchart TB
subgraph signals [Scoring Signals]
Relevance["R(i,t) — task_relevance.rs\nHeat Diffusion + PageRank"]
Surprise["S(i) — surprise.rs\nCross-Entropy Zipfian"]
Graph["G(i,t) — queries.rs\nWeighted BFS Distance"]
History["H(i) — bandit.rs\nThompson Sampling"]
Cost["C(i,v) — tokens.rs\nPer-View Token Cost"]
Redundancy["D(i) — entropy.rs\nJaccard/MinHash"]
end
subgraph cft [Context Field Theory]
Field["context_field.rs\nΦ = wR·R + wS·S + wG·G + wH·H wC·C wD·D"]
Ledger["context_ledger.rs\nRich Items + States + ViewCosts"]
Overlays["context_overlay.rs\nReversible Manipulations"]
Handles["context_handles.rs\n@F1 @S1 @K1 Sparse Refs"]
Compiler["context_compiler.rs\nGreedy Knapsack + Boltzmann"]
Policies["context_policies.rs\nDeclarative Rules"]
end
subgraph tools [MCP Tools]
CtxControl["ctx_control\nUniversal Manipulation"]
CtxPlan["ctx_plan\nContext Planning"]
CtxCompile["ctx_compile\nContext Compilation"]
end
subgraph dashboard [Dashboard]
APIField["/api/context-field"]
APIHandles["/api/context-handles"]
APIOverlays["/api/context-overlay-history"]
APIPlan["/api/context-plan"]
end
Relevance --> Field
Surprise --> Field
Graph --> Field
History --> Field
Cost --> Field
Redundancy --> Field
Field --> Ledger
Ledger --> Compiler
Overlays --> Compiler
Handles --> Compiler
Policies --> Compiler
CtxControl --> Overlays
CtxControl --> Ledger
CtxPlan --> Field
CtxPlan --> Policies
CtxCompile --> Compiler
CtxCompile --> Handles
Compiler --> APIField
Handles --> APIHandles
Overlays --> APIOverlays
Compiler --> APIPlan
```
## Build
```bash
cd rust
cargo build --release # Full build with tree-sitter (~17 MB)
cargo build --release --no-default-features # Without tree-sitter (~5.7 MB)
cargo test --all-features # Run all ~2900+ tests
cargo clippy --all-targets -- -D warnings
```