Hierarchical, scope-gated codebase indexing and persistent memory system for AI agents
5
stars
178
commits
Python
primary language
Jul 14, 2026
updated
Persistent codebase intelligence for autonomous AI agents. Tessera gives agents bottom-up file access and top-down code understanding — across every project they're authorized to touch, with security from the ground up.
Persistent AI agents — orchestrators like AutoJack, task agents like OpenClaw — need to understand codebases the way a senior developer does. Not just "find this string in a file," but "what calls this function, across which projects, and what breaks if I change it?"
Today's agents burn context window and wall-clock time on repeated grep / find / cat cycles. They lose track of project structure between conversations. They can't safely delegate to sub-agents without leaking access to projects those agents shouldn't see. And they can't search documentation, config files, or assets alongside code.
Tessera indexes everything — code, documents, config files, media assets, binary files — into a structured, chunked, searchable database. It exposes that through 18 MCP tools that any agent can call. Responses come back in milliseconds, not seconds.
For orchestrator agents: Full system visibility. Register projects, group them into collections, search across all of them. Understand cross-project dependencies. Delegate scoped access to sub-agents via session tokens.
For task agents: Deep code intelligence within their authorized scope. Symbol lookup, reference tracing, impact analysis, document search — everything an IDE provides, but through tool calls.
For security: Deny-by-default scope gating. Sub-agents only see what the orchestrator explicitly grants. Credentials and secrets are blocked from indexing by un-negatable security patterns. No ambient access, no scope creep.
@wordpress/hooks (JS)events("pum_%") to explore hook namespaces# Who listens to this hook?
events("pum_popup_content", direction="registers_on")
# Find all unfired events (potential dead code)
events(detect_mismatches=True, mismatch_filter="unfired")
# Explore a hook namespace
events("pum_%", direction="fires", limit=20)
code, asset, document).txt, .rst, .csv, .log, .ini, .cfg, .toml, config files, dotfilesasset, code, or document via the source_type parameter.tesseraignore — Per-project ignore config with .gitignore syntax.env*, *.pem, *credentials*) are locked and cannot be overridden by project configtrusted field — Search results from code are marked trusted; document content is marked untrusted so agents can handle prompt injection riskGo, Ruby, Swift, PHP, TypeScript, JavaScript, Python — via tree-sitter grammars.
| Tool | Purpose |
|---|---|
search | Hybrid keyword + semantic search across code, documents, and assets (filterable by source_type) |
doc_search_tool | Document-only search (filterable by format or source_type) |
symbols | Look up functions, classes, methods by name/pattern/kind |
references | Find all references to a symbol (calls, imports, extends) |
file_context | Complete context for a file (symbols, refs, structure) |
impact | Trace downstream impact of changing a symbol |
cross_refs | Cross-project references to a symbol |
events | Analyze event/hook registrations, emissions, and mismatches across languages |
collection_map | Overview of projects in a collection with stats |
| Tool | Purpose |
|---|---|
register_project | Register a project for indexing |
reindex | Trigger full or incremental re-index |
status | Project indexing status and health |
drift_train | Train embedding drift adapter for model migration |
| Tool | Purpose |
|---|---|
create_scope_tool | Create scoped session tokens for sub-agents |
revoke_scope_tool | Revoke agent session tokens |
create_collection_tool | Create a project collection |
add_to_collection_tool | Add a project to a collection |
list_collections_tool | List all collections |
delete_collection_tool | Delete a collection |
git clone https://github.com/danieliser/tessera.git
cd tessera
uv sync
Add to your .mcp.json:
{
"mcpServers": {
"tessera": {
"command": "uv",
"args": [
"--directory", "/path/to/tessera",
"run", "python", "-m", "tessera", "serve"
]
}
}
}
Lock to a specific project (single-project mode):
uv run python -m tessera serve --project /path/to/your/project
Tessera works without embeddings (keyword search only via FTS5). For semantic search, point it at any local OpenAI-compatible embedding endpoint. The embedding dimension is auto-detected — no configuration needed.
Recommended: LM Studio with nomic-embed-text or any embedding model serving on /v1/embeddings.
Validated against Next.js v16.1.6 (3,677 chunks, 1,729 files) and Popup Maker (~580 files):
| Dataset | Doc Top-10 | Cross Top-10 | Code Top-10 | Blend MRR |
|---|---|---|---|---|
| Next.js | 100% | 100% | 70% | 0.748 |
| Popup Maker | — | — | 90% | 0.542 |
Default stack: BGE-base (768d, ~210MB) with filename-aware RRF boosting. No reranker needed — BGE-base vectors are strong enough on their own. PPR graph ranking available for impact/reference analysis but disabled in search (neutral-to-harmful in benchmarks).
uv run pytest tests/ -v
MCP Server (stdio)
├── Scope Validator (session-based, deny-by-default)
├── Query Router (project / collection / global)
│ ├── Search (FTS5 keyword + FAISS semantic + RRF merge)
│ ├── Symbols / References / Impact (SQLite graph)
│ └── Document Search (source_type filtering)
├── Per-Project Indexes
│ ├── SQLite (symbols, references, edges, files, chunk_meta)
│ └── FAISS (vector embeddings)
├── Global SQLite (~/.tessera/global.db)
│ ├── projects, collections, sessions
│ └── indexing_jobs
└── Indexer Pipeline
├── Tree-sitter parser (PHP, TS, JS, Python, Swift)
├── AST-aware code chunking
├── Document extraction (PDF, MD, YAML, JSON, HTML, XML, plaintext)
├── Asset metadata extraction (images, video, audio, fonts, archives)
└── Ignore filter (.tesseraignore, two-tier security)
v0.10.1 — Event/hook analysis with directional edges, per-language parser plugins, mismatch detection, action/filter subtyping, @wordpress/hooks support.
| Phase | Status | What |
|---|---|---|
| 1 | Done | Single-project indexer + scoped MCP server |
| 2 | Done | Incremental indexing + persistence |
| 3 | Done | Collection federation + cross-project refs |
| 4 | Done | Document indexing + drift adapter + ignore config + text formats |
| 4.5 | Done | Media/binary file metadata catalog |
| 5 | Done | PPR graph ranking + semantic snippet scoring |
| 6 | Planned | Always-on file watcher |
MIT
177 commits
1 commits
Python
100.0%
Hierarchical, scope-gated codebase indexing and persistent memory system for AI agents
5
stars
178
commits
Python
primary language
Jul 14, 2026
updated
Persistent codebase intelligence for autonomous AI agents. Tessera gives agents bottom-up file access and top-down code understanding — across every project they're authorized to touch, with security from the ground up.
Persistent AI agents — orchestrators like AutoJack, task agents like OpenClaw — need to understand codebases the way a senior developer does. Not just "find this string in a file," but "what calls this function, across which projects, and what breaks if I change it?"
Today's agents burn context window and wall-clock time on repeated grep / find / cat cycles. They lose track of project structure between conversations. They can't safely delegate to sub-agents without leaking access to projects those agents shouldn't see. And they can't search documentation, config files, or assets alongside code.
Tessera indexes everything — code, documents, config files, media assets, binary files — into a structured, chunked, searchable database. It exposes that through 18 MCP tools that any agent can call. Responses come back in milliseconds, not seconds.
For orchestrator agents: Full system visibility. Register projects, group them into collections, search across all of them. Understand cross-project dependencies. Delegate scoped access to sub-agents via session tokens.
For task agents: Deep code intelligence within their authorized scope. Symbol lookup, reference tracing, impact analysis, document search — everything an IDE provides, but through tool calls.
For security: Deny-by-default scope gating. Sub-agents only see what the orchestrator explicitly grants. Credentials and secrets are blocked from indexing by un-negatable security patterns. No ambient access, no scope creep.
@wordpress/hooks (JS)events("pum_%") to explore hook namespaces# Who listens to this hook?
events("pum_popup_content", direction="registers_on")
# Find all unfired events (potential dead code)
events(detect_mismatches=True, mismatch_filter="unfired")
# Explore a hook namespace
events("pum_%", direction="fires", limit=20)
code, asset, document).txt, .rst, .csv, .log, .ini, .cfg, .toml, config files, dotfilesasset, code, or document via the source_type parameter.tesseraignore — Per-project ignore config with .gitignore syntax.env*, *.pem, *credentials*) are locked and cannot be overridden by project configtrusted field — Search results from code are marked trusted; document content is marked untrusted so agents can handle prompt injection riskGo, Ruby, Swift, PHP, TypeScript, JavaScript, Python — via tree-sitter grammars.
| Tool | Purpose |
|---|---|
search | Hybrid keyword + semantic search across code, documents, and assets (filterable by source_type) |
doc_search_tool | Document-only search (filterable by format or source_type) |
symbols | Look up functions, classes, methods by name/pattern/kind |
references | Find all references to a symbol (calls, imports, extends) |
file_context | Complete context for a file (symbols, refs, structure) |
impact | Trace downstream impact of changing a symbol |
cross_refs | Cross-project references to a symbol |
events | Analyze event/hook registrations, emissions, and mismatches across languages |
collection_map | Overview of projects in a collection with stats |
| Tool | Purpose |
|---|---|
register_project | Register a project for indexing |
reindex | Trigger full or incremental re-index |
status | Project indexing status and health |
drift_train | Train embedding drift adapter for model migration |
| Tool | Purpose |
|---|---|
create_scope_tool | Create scoped session tokens for sub-agents |
revoke_scope_tool | Revoke agent session tokens |
create_collection_tool | Create a project collection |
add_to_collection_tool | Add a project to a collection |
list_collections_tool | List all collections |
delete_collection_tool | Delete a collection |
git clone https://github.com/danieliser/tessera.git
cd tessera
uv sync
Add to your .mcp.json:
{
"mcpServers": {
"tessera": {
"command": "uv",
"args": [
"--directory", "/path/to/tessera",
"run", "python", "-m", "tessera", "serve"
]
}
}
}
Lock to a specific project (single-project mode):
uv run python -m tessera serve --project /path/to/your/project
Tessera works without embeddings (keyword search only via FTS5). For semantic search, point it at any local OpenAI-compatible embedding endpoint. The embedding dimension is auto-detected — no configuration needed.
Recommended: LM Studio with nomic-embed-text or any embedding model serving on /v1/embeddings.
Validated against Next.js v16.1.6 (3,677 chunks, 1,729 files) and Popup Maker (~580 files):
| Dataset | Doc Top-10 | Cross Top-10 | Code Top-10 | Blend MRR |
|---|---|---|---|---|
| Next.js | 100% | 100% | 70% | 0.748 |
| Popup Maker | — | — | 90% | 0.542 |
Default stack: BGE-base (768d, ~210MB) with filename-aware RRF boosting. No reranker needed — BGE-base vectors are strong enough on their own. PPR graph ranking available for impact/reference analysis but disabled in search (neutral-to-harmful in benchmarks).
uv run pytest tests/ -v
MCP Server (stdio)
├── Scope Validator (session-based, deny-by-default)
├── Query Router (project / collection / global)
│ ├── Search (FTS5 keyword + FAISS semantic + RRF merge)
│ ├── Symbols / References / Impact (SQLite graph)
│ └── Document Search (source_type filtering)
├── Per-Project Indexes
│ ├── SQLite (symbols, references, edges, files, chunk_meta)
│ └── FAISS (vector embeddings)
├── Global SQLite (~/.tessera/global.db)
│ ├── projects, collections, sessions
│ └── indexing_jobs
└── Indexer Pipeline
├── Tree-sitter parser (PHP, TS, JS, Python, Swift)
├── AST-aware code chunking
├── Document extraction (PDF, MD, YAML, JSON, HTML, XML, plaintext)
├── Asset metadata extraction (images, video, audio, fonts, archives)
└── Ignore filter (.tesseraignore, two-tier security)
v0.10.1 — Event/hook analysis with directional edges, per-language parser plugins, mismatch detection, action/filter subtyping, @wordpress/hooks support.
| Phase | Status | What |
|---|---|---|
| 1 | Done | Single-project indexer + scoped MCP server |
| 2 | Done | Incremental indexing + persistence |
| 3 | Done | Collection federation + cross-project refs |
| 4 | Done | Document indexing + drift adapter + ignore config + text formats |
| 4.5 | Done | Media/binary file metadata catalog |
| 5 | Done | PPR graph ranking + semantic snippet scoring |
| 6 | Planned | Always-on file watcher |
MIT
177 commits
1 commits
Python
100.0%