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
1203 lines
65 KiB
Markdown
1203 lines
65 KiB
Markdown
# 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 (0–100%) |
|
||
| `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 1–3: normal; 4–6: 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
|
||
```
|