Skip to content

Commit 698d41c

Browse files
authored
Merge pull request #9 from Sankhya-AI/alpha
Release-V1
2 parents 339757a + 36f705d commit 698d41c

75 files changed

Lines changed: 12863 additions & 2282 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ You have three agents configured: Claude Code for deep reasoning, Codex for fast
133133
| **No episodic memory** | Vector search only | CAST scenes — time/place/topic clustering |
134134
| **No consolidation** | Store everything as-is | CLS sleep cycles — episodic to semantic distillation |
135135
| **No real-time coordination** | Polling or nothing | Active memory signal bus — agents see each other instantly |
136-
| **Concurrent access** | Single-process locks | sqlite-vec WAL — multiple agents, one DB |
136+
| **Agents don't learn** | Retrain or nothing | Skill-policy memory — agents accumulate reusable skills |
137+
| **Concurrent access** | Single-process locks | zvec HNSW — multiple agents, directory-based collections |
137138

138139
---
139140

@@ -155,6 +156,35 @@ Agent capabilities are stored as memories: *"claude-code: Advanced coding agent.
155156

156157
No new database tables. No separate routing service. The same `Memory.add()` / `Memory.search()` that stores user conversations also stores agent profiles and routes tasks.
157158

159+
### Skill Memory — the self-improvement loop
160+
161+
Agents learn from experience. When an agent completes a task, Engram records the trajectory (actions, tools, results). Successful trajectories accumulate. The Skill Miner analyzes clusters of similar trajectories and extracts reusable **skills** — validated procedures stored as SKILL.md files with YAML frontmatter.
162+
163+
Skills have confidence scores that update on success/failure (Bayesian, asymmetric — failures penalize more). High-confidence skills are automatically suggested when matching tasks arrive. The loop:
164+
165+
```
166+
Agent works → Trajectory recorded → Miner extracts patterns → Skills stored
167+
↑ |
168+
└── Agent applies skill → Outcome logged → Confidence updated ──┘
169+
```
170+
171+
```python
172+
from engram import SmartMemory
173+
174+
m = SmartMemory(preset="smart")
175+
176+
# Search for relevant skills
177+
skills = m.search_skills("fix python import error")
178+
179+
# Apply a skill — returns injectable recipe
180+
result = m.apply_skill(skill_id)
181+
182+
# Report outcome — updates confidence
183+
m.log_skill_outcome(skill_id, success=True)
184+
```
185+
186+
Skills are discovered from `~/.engram/skills/` and `{repo}/.engram/skills/`. Six MCP tools: `search_skills`, `apply_skill`, `log_skill_outcome`, `record_trajectory_step`, `mine_skills`, `get_skill_stats`.
187+
158188
### Handoff
159189

160190
When an agent pauses (rate limit, crash, tool switch), it saves a session digest: task summary, decisions made, files touched, TODOs remaining. The next agent loads it and continues. If no digest was saved, Engram falls back to parsing the conversation logs automatically.
@@ -171,6 +201,8 @@ When an agent pauses (rate limit, crash, tool switch), it saves a session digest
171201
| **CLS Distillation** | Sleep-cycle replay: episodic to semantic fact extraction |
172202
| **Multi-trace** | Benna-Fusi model — fast/mid/slow decay traces per memory |
173203
| **Intent routing** | Episodic vs semantic query classification |
204+
| **Skill Memory** | SKILL.md files — discover, apply, and mine reusable agent skills |
205+
| **Skill Miner** | Trajectory recording → pattern extraction → skill compilation |
174206
| **Orchestrator** | Agent registry + semantic task routing + CAS claim/release |
175207
| **Handoff bus** | Session digests, checkpoints, JSONL log fallback |
176208
| **Active Memory** | Real-time signal bus with TTL tiers |
@@ -206,7 +238,7 @@ memory.add("User prefers Python over TypeScript", user_id="u1")
206238
results = memory.search("programming preferences", user_id="u1")
207239
```
208240

209-
**18 MCP tools** — memory CRUD, semantic search, episodic scenes, profiles, decay, session handoff. One command configures Claude Code, Cursor, and Codex:
241+
**14 MCP tools** — memory CRUD, semantic search, session handoff, skill search/apply/mine, trajectory recording. One command configures Claude Code, Cursor, and Codex:
210242

211243
```bash
212244
engram install
@@ -342,13 +374,14 @@ Works with any tool-calling agent via REST: `engram-api` starts a server at `htt
342374
```
343375
├── engram/ # engram-memory — core Python package
344376
│ ├── core/ # decay, echo, category, scenes, distillation, traces
345-
│ ├── memory/ # Memory class (orchestrates all layers)
377+
│ ├── memory/ # CoreMemory → SmartMemory → FullMemory
378+
│ ├── skills/ # skill schema, store, discovery, executor, miner, trajectories
346379
│ ├── llms/ # LLM providers (gemini, openai, nvidia, ollama)
347380
│ ├── embeddings/ # embedding providers
348-
│ ├── vector_stores/ # sqlite-vec, in-memory
381+
│ ├── vector_stores/ # zvec, sqlite-vec, in-memory
349382
│ ├── db/ # SQLite persistence
350383
│ ├── api/ # REST API endpoints
351-
│ ├── mcp_server.py # MCP server (18 tools)
384+
│ ├── mcp_server.py # MCP server (14 tools)
352385
│ └── cli.py # CLI interface
353386
├── engram-bus/ # engram-bus — agent communication
354387
│ └── engram_bus/ # bus, pub/sub, handoff store, TCP server

engram-bus/tests/__init__.py

Whitespace-only changes.

engram-enterprise/engram_enterprise/api/app.py

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
from fastapi.staticfiles import StaticFiles
1515
from pydantic import BaseModel, Field
1616

17-
from engram import Memory
17+
from engram.configs.base import EmbedderConfig, LLMConfig, MemoryConfig, VectorStoreConfig
18+
from engram.memory.main import Memory
1819
from engram_enterprise.api.auth import (
1920
enforce_session_issuer,
2021
get_token_from_request,
@@ -41,6 +42,7 @@
4142
SessionCreateResponse,
4243
)
4344
from engram_enterprise.policy import feature_enabled
45+
from engram_enterprise.kernel import PersonalMemoryKernel
4446
from engram.exceptions import FadeMemValidationError
4547
from engram.observability import add_metrics_routes, logger as structured_logger, metrics
4648

@@ -103,19 +105,54 @@ class DecayResponse(BaseModel):
103105

104106
_memory: Optional[Memory] = None
105107
_memory_lock = threading.Lock()
108+
_kernel: Optional[PersonalMemoryKernel] = None
109+
_kernel_lock = threading.Lock()
110+
111+
112+
def _fallback_memory_config() -> MemoryConfig:
113+
data_dir = os.path.join(os.path.expanduser("~"), ".engram")
114+
os.makedirs(data_dir, exist_ok=True)
115+
dims = 384
116+
return MemoryConfig(
117+
llm=LLMConfig(provider="mock", config={}),
118+
embedder=EmbedderConfig(provider="simple", config={"embedding_dims": dims}),
119+
vector_store=VectorStoreConfig(
120+
provider="memory",
121+
config={
122+
"collection_name": "engram_enterprise",
123+
"embedding_model_dims": dims,
124+
},
125+
),
126+
history_db_path=os.path.join(data_dir, "enterprise_history.db"),
127+
collection_name="engram_enterprise",
128+
embedding_model_dims=dims,
129+
)
106130

107131

108132
def get_memory() -> Memory:
109133
global _memory
110134
if _memory is None:
111135
with _memory_lock:
112136
if _memory is None:
113-
_memory = Memory()
137+
try:
138+
_memory = Memory()
139+
except Exception as exc:
140+
logger.warning(
141+
"Failed to initialize default Memory config (%s). "
142+
"Falling back to mock/simple in-memory configuration.",
143+
exc,
144+
)
145+
_memory = Memory(config=_fallback_memory_config())
114146
return _memory
115147

116148

117149
def get_kernel():
118-
return get_memory().kernel
150+
global _kernel
151+
if _kernel is None:
152+
with _kernel_lock:
153+
if _kernel is None:
154+
_kernel = PersonalMemoryKernel(get_memory())
155+
return _kernel
119156

120157

121158
def _extract_content(messages: Optional[Union[str, List[Dict[str, Any]]]], content: Optional[str]) -> str:

engram-enterprise/tests/__init__.py

Whitespace-only changes.

engram-skills/engram_skills/__init__.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

engram-skills/engram_skills/config.py

Lines changed: 0 additions & 11 deletions
This file was deleted.

engram-skills/engram_skills/loader.py

Lines changed: 0 additions & 100 deletions
This file was deleted.

engram-skills/engram_skills/mcp_tools.py

Lines changed: 0 additions & 104 deletions
This file was deleted.

0 commit comments

Comments
 (0)