superlocalmemory 2.5.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +42 -3
- package/docs/architecture-diagram.drawio +405 -0
- package/package.json +4 -1
- package/scripts/generate-thumbnails.py +220 -0
- package/docs/COMPETITIVE-ANALYSIS.md +0 -210
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,22 @@ SuperLocalMemory V2 - Intelligent local memory system for AI coding assistants.
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
+
## [2.5.1] - 2026-02-13
|
|
20
|
+
|
|
21
|
+
**Release Type:** Framework Integration Release — "Plugged Into the Ecosystem"
|
|
22
|
+
**Backward Compatible:** Yes (additive packages only, no core changes)
|
|
23
|
+
|
|
24
|
+
### The Big Picture
|
|
25
|
+
SuperLocalMemory is now a first-class memory backend for LangChain and LlamaIndex — the two largest AI/LLM frameworks. Two pip-installable packages, zero cloud dependencies.
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- **LangChain Integration** (`langchain-superlocalmemory`): Persistent chat message history backed by local SQLite. Works with `RunnableWithMessageHistory` and LCEL chains. `pip install langchain-superlocalmemory`
|
|
29
|
+
- **LlamaIndex Integration** (`llama-index-storage-chat-store-superlocalmemory`): Full `BaseChatStore` implementation. Works with `ChatMemoryBuffer` and `SimpleChatEngine`. `pip install llama-index-storage-chat-store-superlocalmemory`
|
|
30
|
+
- **Example scripts** for both frameworks in `examples/` directory — runnable without API keys
|
|
31
|
+
- **Session isolation**: Framework memories are tagged separately and never appear in normal `slm recall`
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
19
35
|
## [2.5.0] - 2026-02-12
|
|
20
36
|
|
|
21
37
|
**Release Type:** Major Feature Release — "Your AI Memory Has a Heartbeat"
|
package/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://
|
|
2
|
+
<img src="https://varun369.github.io/SuperLocalMemoryV2/assets/branding/icon-512.png" alt="SuperLocalMemory V2" width="200"/>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<h1 align="center">
|
|
5
|
+
<h1 align="center">SuperLocalMemory V2</h1>
|
|
6
|
+
<p align="center"><strong>Your AI Finally Remembers You</strong></p>
|
|
6
7
|
|
|
7
8
|
<p align="center">
|
|
8
9
|
<strong>⚡ Created & Architected by <a href="https://github.com/varun369">Varun Pratap Bhardwaj</a> ⚡</strong><br/>
|
|
@@ -56,7 +57,43 @@
|
|
|
56
57
|
|
|
57
58
|
**Dashboard:** `python3 ~/.claude-memory/ui_server.py` then open `http://localhost:8765`
|
|
58
59
|
|
|
59
|
-
[Architecture Doc](docs/ARCHITECTURE-V2.5.md) | [Full Changelog](CHANGELOG.md)
|
|
60
|
+
[Interactive Architecture Diagram](https://varun369.github.io/SuperLocalMemoryV2/architecture.html) | [Architecture Doc](docs/ARCHITECTURE-V2.5.md) | [Full Changelog](CHANGELOG.md)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## NEW: Framework Integrations (v2.5.1)
|
|
65
|
+
|
|
66
|
+
Use SuperLocalMemory as a memory backend in your LangChain and LlamaIndex applications — 100% local, zero cloud.
|
|
67
|
+
|
|
68
|
+
### LangChain
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install langchain-superlocalmemory
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
76
|
+
from langchain_core.runnables.history import RunnableWithMessageHistory
|
|
77
|
+
|
|
78
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="my-session")
|
|
79
|
+
# Messages persist across sessions, stored locally in ~/.claude-memory/memory.db
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### LlamaIndex
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install llama-index-storage-chat-store-superlocalmemory
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from llama_index.storage.chat_store.superlocalmemory import SuperLocalMemoryChatStore
|
|
90
|
+
from llama_index.core.memory import ChatMemoryBuffer
|
|
91
|
+
|
|
92
|
+
chat_store = SuperLocalMemoryChatStore()
|
|
93
|
+
memory = ChatMemoryBuffer.from_defaults(chat_store=chat_store, chat_store_key="user-1")
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
[LangChain Guide](https://github.com/varun369/SuperLocalMemoryV2/wiki/LangChain-Integration) | [LlamaIndex Guide](https://github.com/varun369/SuperLocalMemoryV2/wiki/LlamaIndex-Integration)
|
|
60
97
|
|
|
61
98
|
---
|
|
62
99
|
|
|
@@ -445,6 +482,8 @@ Not another simple key-value store. SuperLocalMemory implements **cutting-edge m
|
|
|
445
482
|
|
|
446
483
|
### Multi-Layer Memory Architecture
|
|
447
484
|
|
|
485
|
+
**[View Interactive Architecture Diagram](https://varun369.github.io/SuperLocalMemoryV2/architecture.html)** — Click any layer for details, research references, and file paths.
|
|
486
|
+
|
|
448
487
|
```
|
|
449
488
|
┌─────────────────────────────────────────────────────────────┐
|
|
450
489
|
│ Layer 9: VISUALIZATION (NEW v2.2.0) │
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<mxfile host="app.diagrams.net" modified="2026-02-13T00:00:00.000Z" agent="SuperLocalMemory V2" version="24.0.0" type="device">
|
|
3
|
+
<diagram id="slm-v2-architecture" name="10-Layer Architecture">
|
|
4
|
+
<mxGraphModel dx="1422" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1200" pageHeight="900" background="#0A0E1A" math="0" shadow="0">
|
|
5
|
+
<root>
|
|
6
|
+
<mxCell id="0" />
|
|
7
|
+
<mxCell id="1" parent="0" />
|
|
8
|
+
|
|
9
|
+
<!-- ============================================================ -->
|
|
10
|
+
<!-- TITLE AND SUBTITLE -->
|
|
11
|
+
<!-- ============================================================ -->
|
|
12
|
+
<mxCell id="title" value="<font color='#FFFFFF' style='font-size:22px;font-weight:bold;'>SuperLocalMemory V2 &mdash; 10-Layer Architecture</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
13
|
+
<mxGeometry x="250" y="15" width="700" height="35" as="geometry" />
|
|
14
|
+
</mxCell>
|
|
15
|
+
<mxCell id="subtitle" value="<font color='#94A3B8' style='font-size:13px;'>MCP + A2A Dual Protocol &bull; Local-First &bull; Privacy-First &bull; Zero Cloud Dependencies</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
16
|
+
<mxGeometry x="310" y="48" width="580" height="25" as="geometry" />
|
|
17
|
+
</mxCell>
|
|
18
|
+
|
|
19
|
+
<!-- ============================================================ -->
|
|
20
|
+
<!-- 10-LAYER STACK (bottom to top, positioned from y=780 upward) -->
|
|
21
|
+
<!-- Each layer: 520w x 55h, centered at x=340 -->
|
|
22
|
+
<!-- ============================================================ -->
|
|
23
|
+
|
|
24
|
+
<!-- Layer 1: Raw Storage -->
|
|
25
|
+
<mxCell id="L1" value="<b>Layer 1: Raw Storage</b><br><font style='font-size:10px;color:#FEFCE8;'>src/memory_store_v2.py &mdash; SQLite + FTS5 + TF-IDF vectors<br>DB: ~/.claude-memory/memory.db</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F59E0B;fontColor=#1E1B0F;strokeColor=#D97706;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
26
|
+
<mxGeometry x="340" y="750" width="520" height="58" as="geometry" />
|
|
27
|
+
</mxCell>
|
|
28
|
+
|
|
29
|
+
<!-- Layer 2: Hierarchical Index -->
|
|
30
|
+
<mxCell id="L2" value="<b>Layer 2: Hierarchical Index</b><br><font style='font-size:10px;color:#FFF7ED;'>src/tree_manager.py &mdash; Parent-child relationships, breadcrumb navigation</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F97316;fontColor=#1E1B0F;strokeColor=#EA580C;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
31
|
+
<mxGeometry x="340" y="685" width="520" height="55" as="geometry" />
|
|
32
|
+
</mxCell>
|
|
33
|
+
|
|
34
|
+
<!-- Layer 3: Knowledge Graph -->
|
|
35
|
+
<mxCell id="L3" value="<b>Layer 3: Knowledge Graph</b><br><font style='font-size:10px;color:#FFF1F2;'>src/graph_engine.py &mdash; TF-IDF entity extraction, hierarchical Leiden clustering, community summaries</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EF4444;fontColor=#1E1B0F;strokeColor=#DC2626;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
36
|
+
<mxGeometry x="340" y="620" width="520" height="55" as="geometry" />
|
|
37
|
+
</mxCell>
|
|
38
|
+
|
|
39
|
+
<!-- Layer 4: Pattern Learning -->
|
|
40
|
+
<mxCell id="L4" value="<b>Layer 4: Pattern Learning</b><br><font style='font-size:10px;color:#FDF2F8;'>src/pattern_learner.py &mdash; MACLA Beta-Binomial Bayesian confidence scoring</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EC4899;fontColor=#1E1B0F;strokeColor=#DB2777;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
41
|
+
<mxGeometry x="340" y="555" width="520" height="55" as="geometry" />
|
|
42
|
+
</mxCell>
|
|
43
|
+
|
|
44
|
+
<!-- Layer 5: Skills Layer -->
|
|
45
|
+
<mxCell id="L5" value="<b>Layer 5: Skills Layer</b><br><font style='font-size:10px;color:#FAF5FF;'>skills/* &mdash; 6 slash-command skills (Claude Code, Continue.dev, Cody)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#A855F7;fontColor=#FFFFFF;strokeColor=#9333EA;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
46
|
+
<mxGeometry x="340" y="490" width="520" height="55" as="geometry" />
|
|
47
|
+
</mxCell>
|
|
48
|
+
|
|
49
|
+
<!-- Layer 6: MCP Integration -->
|
|
50
|
+
<mxCell id="L6" value="<b>Layer 6: MCP Integration</b><br><font style='font-size:10px;color:#EDE9FE;'>mcp_server.py &mdash; 6 tools, 4 resources, 2 prompts via Model Context Protocol</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#8B5CF6;fontColor=#FFFFFF;strokeColor=#7C3AED;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
51
|
+
<mxGeometry x="340" y="425" width="520" height="55" as="geometry" />
|
|
52
|
+
</mxCell>
|
|
53
|
+
|
|
54
|
+
<!-- Layer 7: Universal Access -->
|
|
55
|
+
<mxCell id="L7" value="<b>Layer 7: Universal Access</b><br><font style='font-size:10px;color:#EEF2FF;'>MCP + Skills + CLI &mdash; 3 access methods, 16+ IDE integrations</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6366F1;fontColor=#FFFFFF;strokeColor=#4F46E5;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
56
|
+
<mxGeometry x="340" y="360" width="520" height="55" as="geometry" />
|
|
57
|
+
</mxCell>
|
|
58
|
+
|
|
59
|
+
<!-- Layer 8: Hybrid Search -->
|
|
60
|
+
<mxCell id="L8" value="<b>Layer 8: Hybrid Search</b><br><font style='font-size:10px;color:#EFF6FF;'>src/hybrid_search.py &mdash; Semantic + FTS5 + Graph combined retrieval</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#3B82F6;fontColor=#FFFFFF;strokeColor=#2563EB;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
61
|
+
<mxGeometry x="340" y="295" width="520" height="55" as="geometry" />
|
|
62
|
+
</mxCell>
|
|
63
|
+
|
|
64
|
+
<!-- Layer 9: Visualization -->
|
|
65
|
+
<mxCell id="L9" value="<b>Layer 9: Visualization</b><br><font style='font-size:10px;color:#ECFEFF;'>ui_server.py &mdash; Interactive web dashboard, timeline, graph explorer</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#06B6D4;fontColor=#FFFFFF;strokeColor=#0891B2;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;" vertex="1" parent="1">
|
|
66
|
+
<mxGeometry x="340" y="230" width="520" height="55" as="geometry" />
|
|
67
|
+
</mxCell>
|
|
68
|
+
|
|
69
|
+
<!-- Layer 10: A2A Agent Collaboration -->
|
|
70
|
+
<mxCell id="L10" value="<b>Layer 10: A2A Agent Collaboration</b><br><font style='font-size:10px;color:#ECFDF5;'>src/a2a_server.py (PLANNED v2.6) &mdash; Agent-to-Agent Protocol (Google/Linux Foundation)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#10B981;fontColor=#FFFFFF;strokeColor=#059669;arcSize=8;fontSize=12;align=center;verticalAlign=middle;shadow=1;dashed=1;dashPattern=8 4;" vertex="1" parent="1">
|
|
71
|
+
<mxGeometry x="340" y="165" width="520" height="55" as="geometry" />
|
|
72
|
+
</mxCell>
|
|
73
|
+
|
|
74
|
+
<!-- ============================================================ -->
|
|
75
|
+
<!-- INTER-LAYER ARROWS (data flow upward) -->
|
|
76
|
+
<!-- ============================================================ -->
|
|
77
|
+
<mxCell id="arrow_L1_L2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L1" target="L2" parent="1">
|
|
78
|
+
<mxGeometry relative="1" as="geometry" />
|
|
79
|
+
</mxCell>
|
|
80
|
+
<mxCell id="arrow_L2_L3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L2" target="L3" parent="1">
|
|
81
|
+
<mxGeometry relative="1" as="geometry" />
|
|
82
|
+
</mxCell>
|
|
83
|
+
<mxCell id="arrow_L3_L4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L3" target="L4" parent="1">
|
|
84
|
+
<mxGeometry relative="1" as="geometry" />
|
|
85
|
+
</mxCell>
|
|
86
|
+
<mxCell id="arrow_L4_L5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L4" target="L5" parent="1">
|
|
87
|
+
<mxGeometry relative="1" as="geometry" />
|
|
88
|
+
</mxCell>
|
|
89
|
+
<mxCell id="arrow_L5_L6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L5" target="L6" parent="1">
|
|
90
|
+
<mxGeometry relative="1" as="geometry" />
|
|
91
|
+
</mxCell>
|
|
92
|
+
<mxCell id="arrow_L6_L7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L6" target="L7" parent="1">
|
|
93
|
+
<mxGeometry relative="1" as="geometry" />
|
|
94
|
+
</mxCell>
|
|
95
|
+
<mxCell id="arrow_L7_L8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L7" target="L8" parent="1">
|
|
96
|
+
<mxGeometry relative="1" as="geometry" />
|
|
97
|
+
</mxCell>
|
|
98
|
+
<mxCell id="arrow_L8_L9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;" edge="1" source="L8" target="L9" parent="1">
|
|
99
|
+
<mxGeometry relative="1" as="geometry" />
|
|
100
|
+
</mxCell>
|
|
101
|
+
<mxCell id="arrow_L9_L10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#475569;strokeWidth=1;endArrow=block;endFill=1;opacity=40;dashed=1;dashPattern=8 4;" edge="1" source="L9" target="L10" parent="1">
|
|
102
|
+
<mxGeometry relative="1" as="geometry" />
|
|
103
|
+
</mxCell>
|
|
104
|
+
|
|
105
|
+
<!-- ============================================================ -->
|
|
106
|
+
<!-- LEFT SIDE: MCP PROTOCOL PATH (Agent -> Tool) — LIVE -->
|
|
107
|
+
<!-- ============================================================ -->
|
|
108
|
+
|
|
109
|
+
<!-- MCP Path Vertical Bar -->
|
|
110
|
+
<mxCell id="mcp_path" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#8B5CF6;strokeColor=#7C3AED;opacity=20;arcSize=12;" vertex="1" parent="1">
|
|
111
|
+
<mxGeometry x="55" y="165" width="255" height="660" as="geometry" />
|
|
112
|
+
</mxCell>
|
|
113
|
+
|
|
114
|
+
<!-- MCP Path Label -->
|
|
115
|
+
<mxCell id="mcp_label" value="<font color='#C4B5FD' style='font-size:14px;font-weight:bold;'>MCP Protocol</font><br><font color='#A78BFA' style='font-size:11px;'>Agent &rarr; Tool</font><br><font color='#22C55E' style='font-size:10px;font-weight:bold;'>LIVE</font>" style="text;html=1;align=center;verticalAlign=top;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
116
|
+
<mxGeometry x="110" y="172" width="140" height="60" as="geometry" />
|
|
117
|
+
</mxCell>
|
|
118
|
+
|
|
119
|
+
<!-- MCP Connected IDEs -->
|
|
120
|
+
<mxCell id="mcp_ide1" value="<font style='font-size:10px;'><b>Claude Desktop</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
121
|
+
<mxGeometry x="70" y="245" width="110" height="30" as="geometry" />
|
|
122
|
+
</mxCell>
|
|
123
|
+
<mxCell id="mcp_ide2" value="<font style='font-size:10px;'><b>Cursor</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
124
|
+
<mxGeometry x="190" y="245" width="110" height="30" as="geometry" />
|
|
125
|
+
</mxCell>
|
|
126
|
+
<mxCell id="mcp_ide3" value="<font style='font-size:10px;'><b>Windsurf</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
127
|
+
<mxGeometry x="70" y="285" width="110" height="30" as="geometry" />
|
|
128
|
+
</mxCell>
|
|
129
|
+
<mxCell id="mcp_ide4" value="<font style='font-size:10px;'><b>VS Code / Copilot</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
130
|
+
<mxGeometry x="190" y="285" width="110" height="30" as="geometry" />
|
|
131
|
+
</mxCell>
|
|
132
|
+
<mxCell id="mcp_ide5" value="<font style='font-size:10px;'><b>Continue.dev</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
133
|
+
<mxGeometry x="70" y="325" width="110" height="30" as="geometry" />
|
|
134
|
+
</mxCell>
|
|
135
|
+
<mxCell id="mcp_ide6" value="<font style='font-size:10px;'><b>Zed</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#6D28D9;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
136
|
+
<mxGeometry x="190" y="325" width="110" height="30" as="geometry" />
|
|
137
|
+
</mxCell>
|
|
138
|
+
<mxCell id="mcp_ide_more" value="<font style='font-size:10px;color:#94A3B8;'>+ 10 more IDEs...</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
139
|
+
<mxGeometry x="115" y="360" width="120" height="25" as="geometry" />
|
|
140
|
+
</mxCell>
|
|
141
|
+
|
|
142
|
+
<!-- MCP Tools Detail -->
|
|
143
|
+
<mxCell id="mcp_tools" value="<font color='#C4B5FD' style='font-size:10px;'><b>MCP Capabilities:</b><br>6 Tools: remember, recall, search,<br>forget, list, build-graph<br>4 Resources: status, recent, stats, graph<br>2 Prompts: context, summary</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#4C1D95;arcSize=10;fontSize=10;align=left;spacingLeft=10;" vertex="1" parent="1">
|
|
144
|
+
<mxGeometry x="70" y="395" width="230" height="80" as="geometry" />
|
|
145
|
+
</mxCell>
|
|
146
|
+
|
|
147
|
+
<!-- MCP CLI & Skills -->
|
|
148
|
+
<mxCell id="mcp_cli" value="<font color='#C4B5FD' style='font-size:10px;'><b>CLI:</b> slm remember | recall | status<br><b>Skills:</b> /superlocalmemoryv2:*</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E1B4B;fontColor=#C4B5FD;strokeColor=#4C1D95;arcSize=10;fontSize=10;align=left;spacingLeft=10;" vertex="1" parent="1">
|
|
149
|
+
<mxGeometry x="70" y="485" width="230" height="45" as="geometry" />
|
|
150
|
+
</mxCell>
|
|
151
|
+
|
|
152
|
+
<!-- MCP Arrow to Layer 6 -->
|
|
153
|
+
<mxCell id="mcp_arrow_to_stack" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#8B5CF6;strokeWidth=2;rounded=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="mcp_tools" target="L6" parent="1">
|
|
154
|
+
<mxGeometry relative="1" as="geometry" />
|
|
155
|
+
</mxCell>
|
|
156
|
+
<mxCell id="mcp_arrow_to_L7" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#8B5CF6;strokeWidth=2;rounded=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="mcp_cli" target="L7" parent="1">
|
|
157
|
+
<mxGeometry relative="1" as="geometry" />
|
|
158
|
+
</mxCell>
|
|
159
|
+
|
|
160
|
+
<!-- MCP Arrow to Layer 5 (Skills) -->
|
|
161
|
+
<mxCell id="mcp_arrow_to_L5" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#8B5CF6;strokeWidth=1.5;rounded=1;exitX=1;exitY=0.8;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=0;" edge="1" source="mcp_cli" target="L5" parent="1">
|
|
162
|
+
<mxGeometry relative="1" as="geometry" />
|
|
163
|
+
</mxCell>
|
|
164
|
+
|
|
165
|
+
<!-- Database icon at bottom left -->
|
|
166
|
+
<mxCell id="db_icon" value="<font color='#F59E0B' style='font-size:11px;font-weight:bold;'>SQLite DB</font><br><font color='#94A3B8' style='font-size:9px;'>~/.claude-memory/<br>memory.db</font>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=6;fillColor=#1C1917;strokeColor=#F59E0B;fontColor=#F59E0B;arcSize=8;shadow=1;" vertex="1" parent="1">
|
|
167
|
+
<mxGeometry x="115" y="710" width="130" height="70" as="geometry" />
|
|
168
|
+
</mxCell>
|
|
169
|
+
<!-- DB Arrow to Layer 1 -->
|
|
170
|
+
<mxCell id="db_arrow" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#F59E0B;strokeWidth=2;rounded=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="db_icon" target="L1" parent="1">
|
|
171
|
+
<mxGeometry relative="1" as="geometry" />
|
|
172
|
+
</mxCell>
|
|
173
|
+
|
|
174
|
+
<!-- ============================================================ -->
|
|
175
|
+
<!-- RIGHT SIDE: A2A PROTOCOL PATH (Agent <-> Agent) — PLANNED -->
|
|
176
|
+
<!-- ============================================================ -->
|
|
177
|
+
|
|
178
|
+
<!-- A2A Path Vertical Bar -->
|
|
179
|
+
<mxCell id="a2a_path" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#10B981;strokeColor=#059669;opacity=15;arcSize=12;dashed=1;dashPattern=12 6;" vertex="1" parent="1">
|
|
180
|
+
<mxGeometry x="890" y="165" width="280" height="430" as="geometry" />
|
|
181
|
+
</mxCell>
|
|
182
|
+
|
|
183
|
+
<!-- A2A Path Label -->
|
|
184
|
+
<mxCell id="a2a_label" value="<font color='#6EE7B7' style='font-size:14px;font-weight:bold;'>A2A Protocol</font><br><font color='#34D399' style='font-size:11px;'>Agent &harr; Agent</font><br><font color='#FBBF24' style='font-size:10px;font-weight:bold;'>PLANNED v2.6</font>" style="text;html=1;align=center;verticalAlign=top;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
185
|
+
<mxGeometry x="960" y="172" width="140" height="60" as="geometry" />
|
|
186
|
+
</mxCell>
|
|
187
|
+
|
|
188
|
+
<!-- A2A Connected Agents -->
|
|
189
|
+
<mxCell id="a2a_agent1" value="<font style='font-size:10px;'><b>Research Agent</b><br>(Perplexity)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#064E3B;fontColor=#6EE7B7;strokeColor=#059669;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
190
|
+
<mxGeometry x="905" y="245" width="120" height="40" as="geometry" />
|
|
191
|
+
</mxCell>
|
|
192
|
+
<mxCell id="a2a_agent2" value="<font style='font-size:10px;'><b>Coding Agent</b><br>(Claude Code)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#064E3B;fontColor=#6EE7B7;strokeColor=#059669;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
193
|
+
<mxGeometry x="1035" y="245" width="120" height="40" as="geometry" />
|
|
194
|
+
</mxCell>
|
|
195
|
+
<mxCell id="a2a_agent3" value="<font style='font-size:10px;'><b>Testing Agent</b><br>(Codex)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#064E3B;fontColor=#6EE7B7;strokeColor=#059669;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
196
|
+
<mxGeometry x="905" y="295" width="120" height="40" as="geometry" />
|
|
197
|
+
</mxCell>
|
|
198
|
+
<mxCell id="a2a_agent4" value="<font style='font-size:10px;'><b>Review Agent</b><br>(Custom)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#064E3B;fontColor=#6EE7B7;strokeColor=#059669;arcSize=14;fontSize=10;shadow=1;" vertex="1" parent="1">
|
|
199
|
+
<mxGeometry x="1035" y="295" width="120" height="40" as="geometry" />
|
|
200
|
+
</mxCell>
|
|
201
|
+
|
|
202
|
+
<!-- A2A Protocol Details -->
|
|
203
|
+
<mxCell id="a2a_details" value="<font color='#6EE7B7' style='font-size:10px;'><b>A2A Capabilities:</b><br>JSON-RPC 2.0 + SSE Streaming<br>Agent Card Discovery<br>gRPC + JSON-RPC Dual Transport<br>Ed25519 Signed Security Cards<br>150+ orgs (Google, MS, AWS, IBM)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#064E3B;fontColor=#6EE7B7;strokeColor=#065F46;arcSize=10;fontSize=10;align=left;spacingLeft=10;" vertex="1" parent="1">
|
|
204
|
+
<mxGeometry x="910" y="350" width="245" height="90" as="geometry" />
|
|
205
|
+
</mxCell>
|
|
206
|
+
|
|
207
|
+
<!-- A2A Key Insight -->
|
|
208
|
+
<mxCell id="a2a_insight" value="<font color='#FBBF24' style='font-size:9px;'><b>Key Insight:</b> A2A has NO shared memory.<br>SLM fills this gap as the universal<br>memory layer for all agents.</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#422006;fontColor=#FBBF24;strokeColor=#92400E;arcSize=10;fontSize=9;align=center;dashed=1;dashPattern=4 4;" vertex="1" parent="1">
|
|
209
|
+
<mxGeometry x="920" y="455" width="225" height="50" as="geometry" />
|
|
210
|
+
</mxCell>
|
|
211
|
+
|
|
212
|
+
<!-- A2A Arrow to Layer 10 -->
|
|
213
|
+
<mxCell id="a2a_arrow_to_L10" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#10B981;strokeWidth=2;rounded=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;dashPattern=8 4;" edge="1" source="a2a_details" target="L10" parent="1">
|
|
214
|
+
<mxGeometry relative="1" as="geometry" />
|
|
215
|
+
</mxCell>
|
|
216
|
+
|
|
217
|
+
<!-- Bidirectional arrow showing A2A is bidirectional -->
|
|
218
|
+
<mxCell id="a2a_bidir" value="" style="endArrow=block;startArrow=block;endFill=1;startFill=1;html=1;strokeColor=#10B981;strokeWidth=1.5;rounded=1;dashed=1;dashPattern=6 3;" edge="1" source="a2a_agent1" target="a2a_agent2" parent="1">
|
|
219
|
+
<mxGeometry relative="1" as="geometry" />
|
|
220
|
+
</mxCell>
|
|
221
|
+
|
|
222
|
+
<!-- ============================================================ -->
|
|
223
|
+
<!-- v2.5 COMPONENTS GROUP (right side, below A2A) -->
|
|
224
|
+
<!-- ============================================================ -->
|
|
225
|
+
|
|
226
|
+
<!-- v2.5 Group Container -->
|
|
227
|
+
<mxCell id="v25_group" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#F59E0B;arcSize=6;dashed=1;dashPattern=8 4;strokeWidth=2;opacity=80;" vertex="1" parent="1">
|
|
228
|
+
<mxGeometry x="890" y="610" width="280" height="210" as="geometry" />
|
|
229
|
+
</mxCell>
|
|
230
|
+
|
|
231
|
+
<!-- v2.5 Group Title -->
|
|
232
|
+
<mxCell id="v25_title" value="<font color='#F59E0B' style='font-size:12px;font-weight:bold;'>v2.5 Components</font><br><font color='#FBBF24' style='font-size:9px;'>IN DEVELOPMENT</font>" style="text;html=1;align=center;verticalAlign=top;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
233
|
+
<mxGeometry x="960" y="615" width="140" height="38" as="geometry" />
|
|
234
|
+
</mxCell>
|
|
235
|
+
|
|
236
|
+
<!-- v2.5: db_connection_manager (PREREQUISITE) -->
|
|
237
|
+
<mxCell id="v25_db" value="<font style='font-size:9px;'><b>db_connection_manager.py</b><br>WAL mode, pool, write queue</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#F59E0B;arcSize=12;fontSize=9;shadow=1;" vertex="1" parent="1">
|
|
238
|
+
<mxGeometry x="900" y="655" width="125" height="36" as="geometry" />
|
|
239
|
+
</mxCell>
|
|
240
|
+
<mxCell id="v25_prereq_badge" value="<font color='#FEF3C7' style='font-size:7px;font-weight:bold;'>PREREQUISITE</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DC2626;fontColor=#FEF3C7;strokeColor=#DC2626;arcSize=20;fontSize=7;" vertex="1" parent="1">
|
|
241
|
+
<mxGeometry x="1030" y="655" width="70" height="16" as="geometry" />
|
|
242
|
+
</mxCell>
|
|
243
|
+
|
|
244
|
+
<!-- v2.5: event_bus -->
|
|
245
|
+
<mxCell id="v25_eventbus" value="<font style='font-size:9px;'><b>event_bus.py</b><br>SSE/WebSocket/Webhook</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
246
|
+
<mxGeometry x="1035" y="675" width="125" height="36" as="geometry" />
|
|
247
|
+
</mxCell>
|
|
248
|
+
|
|
249
|
+
<!-- v2.5: subscription_manager -->
|
|
250
|
+
<mxCell id="v25_sub" value="<font style='font-size:9px;'><b>subscription_manager.py</b><br>Durable/ephemeral subs</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
251
|
+
<mxGeometry x="900" y="697" width="125" height="36" as="geometry" />
|
|
252
|
+
</mxCell>
|
|
253
|
+
|
|
254
|
+
<!-- v2.5: webhook_dispatcher -->
|
|
255
|
+
<mxCell id="v25_webhook" value="<font style='font-size:9px;'><b>webhook_dispatcher.py</b><br>HTTP POST events</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
256
|
+
<mxGeometry x="1035" y="717" width="125" height="36" as="geometry" />
|
|
257
|
+
</mxCell>
|
|
258
|
+
|
|
259
|
+
<!-- v2.5: agent_registry -->
|
|
260
|
+
<mxCell id="v25_registry" value="<font style='font-size:9px;'><b>agent_registry.py</b><br>Agent tracking, protocols, stats</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
261
|
+
<mxGeometry x="900" y="739" width="125" height="36" as="geometry" />
|
|
262
|
+
</mxCell>
|
|
263
|
+
|
|
264
|
+
<!-- v2.5: provenance_tracker -->
|
|
265
|
+
<mxCell id="v25_provenance" value="<font style='font-size:9px;'><b>provenance_tracker.py</b><br>Memory origin, lineage</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
266
|
+
<mxGeometry x="1035" y="759" width="125" height="36" as="geometry" />
|
|
267
|
+
</mxCell>
|
|
268
|
+
|
|
269
|
+
<!-- v2.5: trust_scorer -->
|
|
270
|
+
<mxCell id="v25_trust" value="<font style='font-size:9px;'><b>trust_scorer.py</b><br>Bayesian trust (MACLA)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#78350F;fontColor=#FDE68A;strokeColor=#B45309;arcSize=12;fontSize=9;" vertex="1" parent="1">
|
|
271
|
+
<mxGeometry x="965" y="781" width="125" height="36" as="geometry" />
|
|
272
|
+
</mxCell>
|
|
273
|
+
|
|
274
|
+
<!-- v2.5 Arrow to main stack (db_connection_manager -> Layer 1) -->
|
|
275
|
+
<mxCell id="v25_arrow_db" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#F59E0B;strokeWidth=1.5;rounded=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.7;entryDx=0;entryDy=0;dashed=1;dashPattern=6 3;" edge="1" source="v25_db" target="L1" parent="1">
|
|
276
|
+
<mxGeometry relative="1" as="geometry" />
|
|
277
|
+
</mxCell>
|
|
278
|
+
|
|
279
|
+
<!-- v2.5 Arrow: event_bus -> Layer 9 (dashboard) -->
|
|
280
|
+
<mxCell id="v25_arrow_eventbus" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#F59E0B;strokeWidth=1.5;rounded=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;dashPattern=6 3;" edge="1" target="L9" parent="1">
|
|
281
|
+
<mxGeometry relative="1" as="geometry">
|
|
282
|
+
<mxPoint x="1035" y="693" as="sourcePoint" />
|
|
283
|
+
<Array as="points">
|
|
284
|
+
<mxPoint x="880" y="693" />
|
|
285
|
+
<mxPoint x="880" y="258" />
|
|
286
|
+
</Array>
|
|
287
|
+
</mxGeometry>
|
|
288
|
+
</mxCell>
|
|
289
|
+
|
|
290
|
+
<!-- v2.5 Arrow: agent_registry -> Layer 10 (A2A) -->
|
|
291
|
+
<mxCell id="v25_arrow_registry" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#F59E0B;strokeWidth=1.5;rounded=1;entryX=1;entryY=0.8;entryDx=0;entryDy=0;dashed=1;dashPattern=6 3;" edge="1" target="L10" parent="1">
|
|
292
|
+
<mxGeometry relative="1" as="geometry">
|
|
293
|
+
<mxPoint x="900" y="757" as="sourcePoint" />
|
|
294
|
+
<Array as="points">
|
|
295
|
+
<mxPoint x="875" y="757" />
|
|
296
|
+
<mxPoint x="875" y="209" />
|
|
297
|
+
</Array>
|
|
298
|
+
</mxGeometry>
|
|
299
|
+
</mxCell>
|
|
300
|
+
|
|
301
|
+
<!-- ============================================================ -->
|
|
302
|
+
<!-- LEGEND -->
|
|
303
|
+
<!-- ============================================================ -->
|
|
304
|
+
<mxCell id="legend_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#111827;strokeColor=#374151;arcSize=10;opacity=90;" vertex="1" parent="1">
|
|
305
|
+
<mxGeometry x="70" y="570" width="230" height="115" as="geometry" />
|
|
306
|
+
</mxCell>
|
|
307
|
+
<mxCell id="legend_title" value="<font color='#E5E7EB' style='font-size:11px;font-weight:bold;'>Legend</font>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
308
|
+
<mxGeometry x="82" y="575" width="60" height="25" as="geometry" />
|
|
309
|
+
</mxCell>
|
|
310
|
+
|
|
311
|
+
<!-- Legend: Live -->
|
|
312
|
+
<mxCell id="legend_live_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#22C55E;strokeColor=#16A34A;arcSize=30;" vertex="1" parent="1">
|
|
313
|
+
<mxGeometry x="85" y="605" width="14" height="14" as="geometry" />
|
|
314
|
+
</mxCell>
|
|
315
|
+
<mxCell id="legend_live_text" value="<font color='#D1D5DB' style='font-size:10px;'>Live (Production)</font>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
316
|
+
<mxGeometry x="105" y="600" width="110" height="25" as="geometry" />
|
|
317
|
+
</mxCell>
|
|
318
|
+
|
|
319
|
+
<!-- Legend: Planned v2.6 -->
|
|
320
|
+
<mxCell id="legend_planned_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#10B981;strokeColor=#059669;arcSize=30;dashed=1;dashPattern=4 2;" vertex="1" parent="1">
|
|
321
|
+
<mxGeometry x="85" y="628" width="14" height="14" as="geometry" />
|
|
322
|
+
</mxCell>
|
|
323
|
+
<mxCell id="legend_planned_text" value="<font color='#D1D5DB' style='font-size:10px;'>Planned v2.6 (A2A)</font>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
324
|
+
<mxGeometry x="105" y="623" width="120" height="25" as="geometry" />
|
|
325
|
+
</mxCell>
|
|
326
|
+
|
|
327
|
+
<!-- Legend: v2.5 In Development -->
|
|
328
|
+
<mxCell id="legend_dev_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F59E0B;strokeColor=#D97706;arcSize=30;dashed=1;dashPattern=4 2;" vertex="1" parent="1">
|
|
329
|
+
<mxGeometry x="85" y="651" width="14" height="14" as="geometry" />
|
|
330
|
+
</mxCell>
|
|
331
|
+
<mxCell id="legend_dev_text" value="<font color='#D1D5DB' style='font-size:10px;'>v2.5 In Development</font>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
332
|
+
<mxGeometry x="105" y="646" width="130" height="25" as="geometry" />
|
|
333
|
+
</mxCell>
|
|
334
|
+
|
|
335
|
+
<!-- Legend: MCP Protocol -->
|
|
336
|
+
<mxCell id="legend_mcp_line" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#8B5CF6;strokeWidth=2;rounded=0;" edge="1" parent="1">
|
|
337
|
+
<mxGeometry relative="1" as="geometry">
|
|
338
|
+
<mxPoint x="85" y="679" as="sourcePoint" />
|
|
339
|
+
<mxPoint x="99" y="679" as="targetPoint" />
|
|
340
|
+
</mxGeometry>
|
|
341
|
+
</mxCell>
|
|
342
|
+
<mxCell id="legend_mcp_text" value="<font color='#C4B5FD' style='font-size:10px;'>MCP Protocol (Violet)</font>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
343
|
+
<mxGeometry x="105" y="669" width="130" height="25" as="geometry" />
|
|
344
|
+
</mxCell>
|
|
345
|
+
|
|
346
|
+
<!-- ============================================================ -->
|
|
347
|
+
<!-- LAYER NUMBER BADGES (left side of each layer) -->
|
|
348
|
+
<!-- ============================================================ -->
|
|
349
|
+
<mxCell id="badge_L1" value="<font color='#0A0E1A' style='font-size:9px;font-weight:bold;'>L1</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#F59E0B;strokeColor=#D97706;aspect=fixed;" vertex="1" parent="1">
|
|
350
|
+
<mxGeometry x="345" y="753" width="24" height="24" as="geometry" />
|
|
351
|
+
</mxCell>
|
|
352
|
+
<mxCell id="badge_L2" value="<font color='#0A0E1A' style='font-size:9px;font-weight:bold;'>L2</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#F97316;strokeColor=#EA580C;aspect=fixed;" vertex="1" parent="1">
|
|
353
|
+
<mxGeometry x="345" y="700" width="24" height="24" as="geometry" />
|
|
354
|
+
</mxCell>
|
|
355
|
+
<mxCell id="badge_L3" value="<font color='#0A0E1A' style='font-size:9px;font-weight:bold;'>L3</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#EF4444;strokeColor=#DC2626;aspect=fixed;" vertex="1" parent="1">
|
|
356
|
+
<mxGeometry x="345" y="636" width="24" height="24" as="geometry" />
|
|
357
|
+
</mxCell>
|
|
358
|
+
<mxCell id="badge_L4" value="<font color='#0A0E1A' style='font-size:9px;font-weight:bold;'>L4</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#EC4899;strokeColor=#DB2777;aspect=fixed;" vertex="1" parent="1">
|
|
359
|
+
<mxGeometry x="345" y="571" width="24" height="24" as="geometry" />
|
|
360
|
+
</mxCell>
|
|
361
|
+
<mxCell id="badge_L5" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L5</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#A855F7;strokeColor=#9333EA;aspect=fixed;" vertex="1" parent="1">
|
|
362
|
+
<mxGeometry x="345" y="506" width="24" height="24" as="geometry" />
|
|
363
|
+
</mxCell>
|
|
364
|
+
<mxCell id="badge_L6" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L6</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#8B5CF6;strokeColor=#7C3AED;aspect=fixed;" vertex="1" parent="1">
|
|
365
|
+
<mxGeometry x="345" y="441" width="24" height="24" as="geometry" />
|
|
366
|
+
</mxCell>
|
|
367
|
+
<mxCell id="badge_L7" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L7</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#6366F1;strokeColor=#4F46E5;aspect=fixed;" vertex="1" parent="1">
|
|
368
|
+
<mxGeometry x="345" y="376" width="24" height="24" as="geometry" />
|
|
369
|
+
</mxCell>
|
|
370
|
+
<mxCell id="badge_L8" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L8</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#3B82F6;strokeColor=#2563EB;aspect=fixed;" vertex="1" parent="1">
|
|
371
|
+
<mxGeometry x="345" y="311" width="24" height="24" as="geometry" />
|
|
372
|
+
</mxCell>
|
|
373
|
+
<mxCell id="badge_L9" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L9</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#06B6D4;strokeColor=#0891B2;aspect=fixed;" vertex="1" parent="1">
|
|
374
|
+
<mxGeometry x="345" y="246" width="24" height="24" as="geometry" />
|
|
375
|
+
</mxCell>
|
|
376
|
+
<mxCell id="badge_L10" value="<font color='#FFFFFF' style='font-size:9px;font-weight:bold;'>L10</font>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#10B981;strokeColor=#059669;aspect=fixed;" vertex="1" parent="1">
|
|
377
|
+
<mxGeometry x="345" y="178" width="24" height="24" as="geometry" />
|
|
378
|
+
</mxCell>
|
|
379
|
+
|
|
380
|
+
<!-- ============================================================ -->
|
|
381
|
+
<!-- DATA FLOW ANNOTATION -->
|
|
382
|
+
<!-- ============================================================ -->
|
|
383
|
+
<mxCell id="dataflow_label" value="<font color='#64748B' style='font-size:10px;font-style:italic;'>Data flows upward through<br>additive enhancement layers</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
384
|
+
<mxGeometry x="75" y="835" width="170" height="40" as="geometry" />
|
|
385
|
+
</mxCell>
|
|
386
|
+
|
|
387
|
+
<!-- Upward arrow for data flow annotation -->
|
|
388
|
+
<mxCell id="dataflow_arrow" value="" style="endArrow=block;endFill=1;html=1;strokeColor=#475569;strokeWidth=1.5;rounded=0;" edge="1" parent="1">
|
|
389
|
+
<mxGeometry relative="1" as="geometry">
|
|
390
|
+
<mxPoint x="160" y="837" as="sourcePoint" />
|
|
391
|
+
<mxPoint x="160" y="815" as="targetPoint" />
|
|
392
|
+
</mxGeometry>
|
|
393
|
+
</mxCell>
|
|
394
|
+
|
|
395
|
+
<!-- ============================================================ -->
|
|
396
|
+
<!-- FOOTER — Attribution -->
|
|
397
|
+
<!-- ============================================================ -->
|
|
398
|
+
<mxCell id="footer" value="<font color='#475569' style='font-size:9px;'>SuperLocalMemory V2 &copy; 2026 Varun Pratap Bhardwaj &bull; MIT License &bull; github.com/varun369/SuperLocalMemoryV2</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
399
|
+
<mxGeometry x="310" y="860" width="560" height="25" as="geometry" />
|
|
400
|
+
</mxCell>
|
|
401
|
+
|
|
402
|
+
</root>
|
|
403
|
+
</mxGraphModel>
|
|
404
|
+
</diagram>
|
|
405
|
+
</mxfile>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superlocalmemory",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.1",
|
|
4
4
|
"description": "Your AI Finally Remembers You - Local-first intelligent memory system for AI assistants. Works with Claude, Cursor, Windsurf, VS Code/Copilot, Codex, and 16+ AI tools. 100% local, zero cloud dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-memory",
|
|
@@ -98,5 +98,8 @@
|
|
|
98
98
|
"year": "2026",
|
|
99
99
|
"github": "https://github.com/varun369",
|
|
100
100
|
"required": "Attribution notice must be preserved in all copies and derivative works"
|
|
101
|
+
},
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"docx": "^9.5.1"
|
|
101
104
|
}
|
|
102
105
|
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SuperLocalMemory V2 - Thumbnail Generator
|
|
4
|
+
Copyright (c) 2026 Varun Pratap Bhardwaj
|
|
5
|
+
Licensed under MIT License
|
|
6
|
+
|
|
7
|
+
Generates optimized thumbnail versions of all screenshots.
|
|
8
|
+
- Size: 320×180px (16:9 ratio)
|
|
9
|
+
- Format: PNG (for wiki/docs) and WebP (for website)
|
|
10
|
+
- Quality: High enough to recognize content
|
|
11
|
+
- File size: < 50KB per thumbnail
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import json
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from PIL import Image, ImageFilter, ImageOps
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
# Configuration
|
|
21
|
+
SCREENSHOT_DIR = Path(__file__).parent.parent / "assets" / "screenshots"
|
|
22
|
+
THUMBNAIL_DIR = Path(__file__).parent.parent / "assets" / "thumbnails"
|
|
23
|
+
THUMBNAIL_SIZE = (320, 180) # 16:9 ratio
|
|
24
|
+
QUALITY_PNG = 95
|
|
25
|
+
QUALITY_WEBP = 85
|
|
26
|
+
MAX_FILESIZE = 50 * 1024 # 50KB
|
|
27
|
+
|
|
28
|
+
# Category mapping based on filename patterns
|
|
29
|
+
CATEGORY_MAP = {
|
|
30
|
+
"overview": "dashboard",
|
|
31
|
+
"timeline": "timeline",
|
|
32
|
+
"agents": "agents",
|
|
33
|
+
"patterns": "patterns",
|
|
34
|
+
"clusters": "clusters",
|
|
35
|
+
"memories": "memories",
|
|
36
|
+
"graph": "graph",
|
|
37
|
+
"filtered": "search",
|
|
38
|
+
"live-events": "events",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
def get_category(filename):
|
|
42
|
+
"""Extract category from filename."""
|
|
43
|
+
for pattern, category in CATEGORY_MAP.items():
|
|
44
|
+
if pattern in filename.lower():
|
|
45
|
+
return category
|
|
46
|
+
return "general"
|
|
47
|
+
|
|
48
|
+
def get_title(filename):
|
|
49
|
+
"""Generate human-readable title from filename."""
|
|
50
|
+
# Remove extensions and convert dashes/underscores to spaces
|
|
51
|
+
name = Path(filename).stem
|
|
52
|
+
# Remove 'dashboard-' prefix if present
|
|
53
|
+
if name.startswith("dashboard-"):
|
|
54
|
+
name = name[9:]
|
|
55
|
+
# Remove '-dark' suffix
|
|
56
|
+
name = name.replace("-dark", "")
|
|
57
|
+
# Convert to title case
|
|
58
|
+
return " ".join(word.capitalize() for word in name.split("-"))
|
|
59
|
+
|
|
60
|
+
def get_description(filename, category):
|
|
61
|
+
"""Generate description based on filename and category."""
|
|
62
|
+
descriptions = {
|
|
63
|
+
"overview": "Main dashboard with memory statistics and knowledge graph overview",
|
|
64
|
+
"timeline": "Chronological timeline of all stored memories and events",
|
|
65
|
+
"agents": "Agent connections and activity tracking",
|
|
66
|
+
"patterns": "Learned coding patterns and user preferences",
|
|
67
|
+
"clusters": "Knowledge graph clusters and relationships",
|
|
68
|
+
"memories": "Detailed memory list with search and filtering",
|
|
69
|
+
"graph": "Interactive knowledge graph visualization",
|
|
70
|
+
"search": "Advanced memory search and filtering interface",
|
|
71
|
+
"events": "Real-time live event stream from memory operations",
|
|
72
|
+
}
|
|
73
|
+
is_dark = "-dark" in filename.lower()
|
|
74
|
+
base_desc = descriptions.get(category, "Dashboard interface")
|
|
75
|
+
if is_dark:
|
|
76
|
+
base_desc += " (dark mode)"
|
|
77
|
+
return base_desc
|
|
78
|
+
|
|
79
|
+
def resize_and_crop(image, target_size):
|
|
80
|
+
"""
|
|
81
|
+
Resize image to target size while maintaining aspect ratio.
|
|
82
|
+
Crops if necessary to achieve exact dimensions.
|
|
83
|
+
"""
|
|
84
|
+
img_ratio = image.width / image.height
|
|
85
|
+
target_ratio = target_size[0] / target_size[1]
|
|
86
|
+
|
|
87
|
+
if img_ratio > target_ratio:
|
|
88
|
+
# Image is wider, crop width
|
|
89
|
+
new_height = target_size[1]
|
|
90
|
+
new_width = int(new_height * img_ratio)
|
|
91
|
+
resized = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
|
92
|
+
left = (resized.width - target_size[0]) // 2
|
|
93
|
+
return resized.crop((left, 0, left + target_size[0], target_size[1]))
|
|
94
|
+
else:
|
|
95
|
+
# Image is taller, crop height
|
|
96
|
+
new_width = target_size[0]
|
|
97
|
+
new_height = int(new_width / img_ratio)
|
|
98
|
+
resized = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
|
99
|
+
top = (resized.height - target_size[1]) // 2
|
|
100
|
+
return resized.crop((0, top, target_size[0], top + target_size[1]))
|
|
101
|
+
|
|
102
|
+
def apply_sharpening(image):
|
|
103
|
+
"""Apply subtle sharpening to enhance detail."""
|
|
104
|
+
# Use UNSHARP_MASK equivalent with subtle settings
|
|
105
|
+
return image.filter(ImageFilter.UnsharpMask(radius=1, percent=100, threshold=3))
|
|
106
|
+
|
|
107
|
+
def generate_thumbnail(source_path, dest_dir, metadata):
|
|
108
|
+
"""Generate PNG and WebP thumbnails for a single source image."""
|
|
109
|
+
try:
|
|
110
|
+
# Open image
|
|
111
|
+
with Image.open(source_path) as img:
|
|
112
|
+
# Convert RGBA to RGB if necessary (for PNG/WebP)
|
|
113
|
+
if img.mode == "RGBA":
|
|
114
|
+
background = Image.new("RGB", img.size, (255, 255, 255))
|
|
115
|
+
background.paste(img, mask=img.split()[3])
|
|
116
|
+
img = background
|
|
117
|
+
elif img.mode != "RGB":
|
|
118
|
+
img = img.convert("RGB")
|
|
119
|
+
|
|
120
|
+
# Resize and crop
|
|
121
|
+
thumbnail = resize_and_crop(img, THUMBNAIL_SIZE)
|
|
122
|
+
|
|
123
|
+
# Apply sharpening
|
|
124
|
+
thumbnail = apply_sharpening(thumbnail)
|
|
125
|
+
|
|
126
|
+
filename = source_path.stem
|
|
127
|
+
|
|
128
|
+
# Save PNG version
|
|
129
|
+
png_path = dest_dir / f"{filename}-thumb.png"
|
|
130
|
+
thumbnail.save(png_path, "PNG", quality=QUALITY_PNG, optimize=True)
|
|
131
|
+
png_size = png_path.stat().st_size
|
|
132
|
+
|
|
133
|
+
# Save WebP version
|
|
134
|
+
webp_path = dest_dir / f"{filename}-thumb.webp"
|
|
135
|
+
thumbnail.save(webp_path, "WEBP", quality=QUALITY_WEBP, method=6)
|
|
136
|
+
webp_size = webp_path.stat().st_size
|
|
137
|
+
|
|
138
|
+
# Check file sizes
|
|
139
|
+
if png_size > MAX_FILESIZE:
|
|
140
|
+
print(f"⚠️ PNG {filename}: {png_size/1024:.1f}KB (exceeds limit)")
|
|
141
|
+
if webp_size > MAX_FILESIZE:
|
|
142
|
+
print(f"⚠️ WebP {filename}: {webp_size/1024:.1f}KB (exceeds limit)")
|
|
143
|
+
|
|
144
|
+
print(f"✓ {filename}")
|
|
145
|
+
print(f" PNG: {png_size/1024:.1f}KB | WebP: {webp_size/1024:.1f}KB")
|
|
146
|
+
|
|
147
|
+
# Store metadata
|
|
148
|
+
category = get_category(filename)
|
|
149
|
+
metadata[filename] = {
|
|
150
|
+
"title": get_title(filename),
|
|
151
|
+
"description": get_description(source_path.name, category),
|
|
152
|
+
"category": category,
|
|
153
|
+
"full_image": f"../screenshots/dashboard/{source_path.name}",
|
|
154
|
+
"thumbnail_png": f"{filename}-thumb.png",
|
|
155
|
+
"thumbnail_webp": f"{filename}-thumb.webp",
|
|
156
|
+
"created": datetime.now().isoformat(),
|
|
157
|
+
"original_size": f"{img.width}×{img.height}",
|
|
158
|
+
"thumbnail_size": f"{THUMBNAIL_SIZE[0]}×{THUMBNAIL_SIZE[1]}",
|
|
159
|
+
"png_size_kb": round(png_size / 1024, 2),
|
|
160
|
+
"webp_size_kb": round(webp_size / 1024, 2),
|
|
161
|
+
}
|
|
162
|
+
return True
|
|
163
|
+
except Exception as e:
|
|
164
|
+
print(f"✗ {source_path.name}: {str(e)}")
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
def main():
|
|
168
|
+
"""Generate all thumbnails."""
|
|
169
|
+
# Ensure thumbnail directory exists
|
|
170
|
+
THUMBNAIL_DIR.mkdir(parents=True, exist_ok=True)
|
|
171
|
+
|
|
172
|
+
# Verify screenshot directory exists
|
|
173
|
+
if not SCREENSHOT_DIR.exists():
|
|
174
|
+
print(f"Error: Screenshot directory not found: {SCREENSHOT_DIR}")
|
|
175
|
+
return 1
|
|
176
|
+
|
|
177
|
+
# Find all images in screenshot directory
|
|
178
|
+
image_extensions = {".png", ".jpg", ".jpeg", ".webp"}
|
|
179
|
+
sources = sorted([
|
|
180
|
+
f for f in SCREENSHOT_DIR.glob("**/*")
|
|
181
|
+
if f.is_file() and f.suffix.lower() in image_extensions and not f.name.startswith(".")
|
|
182
|
+
])
|
|
183
|
+
|
|
184
|
+
if not sources:
|
|
185
|
+
print(f"No images found in {SCREENSHOT_DIR}")
|
|
186
|
+
return 1
|
|
187
|
+
|
|
188
|
+
print(f"Found {len(sources)} images in {SCREENSHOT_DIR}")
|
|
189
|
+
print(f"Generating thumbnails to {THUMBNAIL_DIR}\n")
|
|
190
|
+
|
|
191
|
+
metadata = {}
|
|
192
|
+
successful = 0
|
|
193
|
+
failed = 0
|
|
194
|
+
|
|
195
|
+
for source in sources:
|
|
196
|
+
if generate_thumbnail(source, THUMBNAIL_DIR, metadata):
|
|
197
|
+
successful += 1
|
|
198
|
+
else:
|
|
199
|
+
failed += 1
|
|
200
|
+
|
|
201
|
+
# Save metadata index
|
|
202
|
+
index_path = THUMBNAIL_DIR / "index.json"
|
|
203
|
+
with open(index_path, "w") as f:
|
|
204
|
+
json.dump(metadata, f, indent=2, sort_keys=True)
|
|
205
|
+
print(f"\n✓ Saved metadata index to {index_path}")
|
|
206
|
+
|
|
207
|
+
# Print summary
|
|
208
|
+
print(f"\n{'='*60}")
|
|
209
|
+
print(f"Summary:")
|
|
210
|
+
print(f" Total processed: {len(sources)}")
|
|
211
|
+
print(f" Successful: {successful}")
|
|
212
|
+
print(f" Failed: {failed}")
|
|
213
|
+
print(f" PNG thumbnails: {len(list(THUMBNAIL_DIR.glob('*-thumb.png')))}")
|
|
214
|
+
print(f" WebP thumbnails: {len(list(THUMBNAIL_DIR.glob('*-thumb.webp')))}")
|
|
215
|
+
print(f" Total size: {sum(f.stat().st_size for f in THUMBNAIL_DIR.glob('*-thumb.*')) / 1024:.1f}KB")
|
|
216
|
+
|
|
217
|
+
return 0 if failed == 0 else 1
|
|
218
|
+
|
|
219
|
+
if __name__ == "__main__":
|
|
220
|
+
exit(main())
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
# Competitive Analysis: AI Memory Solutions (2026)
|
|
2
|
-
|
|
3
|
-
**Research Date:** February 2026
|
|
4
|
-
**Author:** Varun Pratap Bhardwaj
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Executive Summary
|
|
9
|
-
|
|
10
|
-
After extensive research of the paid/commercial AI memory landscape in 2026, **SuperLocalMemory V2 is the ONLY free solution offering all these features combined**: 7-layer universal architecture, pattern learning, multi-profile support, 100% local operation, and zero setup requirements.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Detailed Competitor Analysis
|
|
15
|
-
|
|
16
|
-
### 1. Mem0 (mem0.ai)
|
|
17
|
-
|
|
18
|
-
**Pricing:**
|
|
19
|
-
| Tier | Features | Price |
|
|
20
|
-
|------|----------|-------|
|
|
21
|
-
| Free | 10K memories, limited API calls | $0/month |
|
|
22
|
-
| Pro | Unlimited memories, higher limits | Usage-based |
|
|
23
|
-
| Enterprise | SSO, audit logs, on-prem, SLA | Custom |
|
|
24
|
-
|
|
25
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
26
|
-
- No 7-layer universal architecture (only semantic + graph)
|
|
27
|
-
- No pattern learning with identity profiles
|
|
28
|
-
- No multi-profile support
|
|
29
|
-
- Not 100% local (cloud-first design)
|
|
30
|
-
- Requires API keys and setup
|
|
31
|
-
- Usage-based billing can get expensive
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
### 2. Zep (getzep.com)
|
|
36
|
-
|
|
37
|
-
**Pricing:**
|
|
38
|
-
| Tier | Features | Price |
|
|
39
|
-
|------|----------|-------|
|
|
40
|
-
| Free | Basic features, limited credits | $0/month |
|
|
41
|
-
| Pro | 20K credits auto-refill | $50/month |
|
|
42
|
-
| Enterprise | BYOK, BYOM, BYOC, SLA | Custom |
|
|
43
|
-
|
|
44
|
-
**Credit System:** 1 credit = 1 Episode (data object). Episodes >350 bytes billed as multiples.
|
|
45
|
-
|
|
46
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
47
|
-
- No 7-layer universal architecture
|
|
48
|
-
- No pattern learning
|
|
49
|
-
- No multi-profile support natively
|
|
50
|
-
- Not 100% local (cloud-managed)
|
|
51
|
-
- Credit-based billing system
|
|
52
|
-
- Requires significant setup and API integration
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
### 3. Supermemory (supermemory.ai)
|
|
57
|
-
|
|
58
|
-
**Pricing:**
|
|
59
|
-
| Tier | Limits | Price |
|
|
60
|
-
|------|--------|-------|
|
|
61
|
-
| Free | 1M tokens, 10K search queries | $0/month |
|
|
62
|
-
| Pro | 3M tokens, 100K queries | $19/month |
|
|
63
|
-
| Scale | 80M tokens, 20M queries | $399/month |
|
|
64
|
-
| Enterprise | Custom limits | Custom |
|
|
65
|
-
|
|
66
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
67
|
-
- No 7-layer universal architecture
|
|
68
|
-
- No pattern learning
|
|
69
|
-
- No multi-profile support
|
|
70
|
-
- Not 100% local (cloud-based)
|
|
71
|
-
- Requires setup and API integration
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
### 4. Personal.AI (personal.ai)
|
|
76
|
-
|
|
77
|
-
**Pricing:**
|
|
78
|
-
| Tier | Description | Price |
|
|
79
|
-
|------|-------------|-------|
|
|
80
|
-
| Premium | Full features | $33.33/month |
|
|
81
|
-
| Custom | Enterprise | Contact sales |
|
|
82
|
-
|
|
83
|
-
**NO FREE PLAN AVAILABLE**
|
|
84
|
-
|
|
85
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
86
|
-
- No 7-layer universal architecture
|
|
87
|
-
- No pattern learning with confidence scoring
|
|
88
|
-
- Not 100% local (cloud-based)
|
|
89
|
-
- No free tier
|
|
90
|
-
- Closed ecosystem
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
### 5. Letta / MemGPT (letta.com)
|
|
95
|
-
|
|
96
|
-
**Pricing:**
|
|
97
|
-
| Tier | Description | Price |
|
|
98
|
-
|------|-------------|-------|
|
|
99
|
-
| Open Source | Self-hosted | Free |
|
|
100
|
-
| Letta Cloud | Managed service | Beta (TBD) |
|
|
101
|
-
|
|
102
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
103
|
-
- Different architecture (not 7-layer universal)
|
|
104
|
-
- No explicit pattern learning with identity profiles
|
|
105
|
-
- Limited multi-profile support
|
|
106
|
-
- Requires significant technical setup
|
|
107
|
-
- Complex installation process
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
### 6. Khoj (khoj.dev)
|
|
112
|
-
|
|
113
|
-
**Pricing:**
|
|
114
|
-
| Tier | Description | Price |
|
|
115
|
-
|------|-------------|-------|
|
|
116
|
-
| Free | Self-hosted, open source | $0 |
|
|
117
|
-
| Cloud | Hosted service | Tiered |
|
|
118
|
-
|
|
119
|
-
**What's MISSING vs SuperLocalMemory V2:**
|
|
120
|
-
- No 7-layer universal architecture
|
|
121
|
-
- No pattern learning with identity profiles
|
|
122
|
-
- No progressive compression system
|
|
123
|
-
- Not zero-setup
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Comprehensive Comparison Matrix
|
|
128
|
-
|
|
129
|
-
| Feature | Mem0 | Zep | Supermemory | Letta | Personal.AI | Khoj | **SuperLocalMemory V2** |
|
|
130
|
-
|---------|------|-----|-------------|-------|-------------|------|------------------------|
|
|
131
|
-
| **7-Layer Universal Architecture** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
|
132
|
-
| **Pattern Learning** | ❌ | ❌ | ❌ | ❌ | Partial | ❌ | ✅ |
|
|
133
|
-
| **Multi-Profile Support** | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
|
|
134
|
-
| **100% Local** | ❌ | ❌ | ❌ | Partial | ❌ | Partial | ✅ |
|
|
135
|
-
| **Zero Setup** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
|
136
|
-
| **Knowledge Graph** | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
|
137
|
-
| **Progressive Compression** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
|
138
|
-
| **Free Tier** | Limited | Limited | Limited | ✅ | ❌ | ✅ | **Unlimited** |
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Pricing Summary
|
|
143
|
-
|
|
144
|
-
| Solution | Free Tier | Entry Paid | Enterprise |
|
|
145
|
-
|----------|-----------|------------|------------|
|
|
146
|
-
| **SuperLocalMemory V2** | **Unlimited (MIT)** | **$0** | **$0** |
|
|
147
|
-
| Mem0 | 10K memories | Usage-based | Custom |
|
|
148
|
-
| Zep | Limited credits | $50/month | Custom |
|
|
149
|
-
| Supermemory | 1M tokens | $19/month | $399+/month |
|
|
150
|
-
| Personal.AI | None | $33.33/month | Custom |
|
|
151
|
-
| Letta | Self-hosted | Beta | TBD |
|
|
152
|
-
| Khoj | Self-hosted | Tiered | Custom |
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## Key Differentiators: SuperLocalMemory V2
|
|
157
|
-
|
|
158
|
-
### 1. 7-Layer Universal Architecture (UNIQUE)
|
|
159
|
-
No competitor offers this integrated architecture:
|
|
160
|
-
- Layer 1: Raw Storage (SQLite + FTS + embeddings)
|
|
161
|
-
- Layer 2: Hierarchical Index (PageIndex-style)
|
|
162
|
-
- Layer 3: Knowledge Graph (GraphRAG with Leiden clustering)
|
|
163
|
-
- Layer 4: Pattern Learning (xMemory-style identity profiles)
|
|
164
|
-
|
|
165
|
-
### 2. Pattern Learning with Confidence Scoring (UNIQUE)
|
|
166
|
-
Learns your:
|
|
167
|
-
- Coding preferences (frameworks, languages)
|
|
168
|
-
- Terminology patterns
|
|
169
|
-
- Style preferences
|
|
170
|
-
- With explicit confidence percentages
|
|
171
|
-
|
|
172
|
-
### 3. Multi-Profile Support (Rare)
|
|
173
|
-
- Isolated memory contexts per project/client
|
|
174
|
-
- Separate patterns, graphs, and memories
|
|
175
|
-
- Easy profile switching via CLI
|
|
176
|
-
|
|
177
|
-
### 4. 100% Local + Zero External APIs (Rare)
|
|
178
|
-
- No cloud dependencies
|
|
179
|
-
- No API keys required
|
|
180
|
-
- GDPR/HIPAA compliant by default
|
|
181
|
-
|
|
182
|
-
### 5. Zero Setup (UNIQUE)
|
|
183
|
-
- 5-minute installation
|
|
184
|
-
- Works immediately after `./install.sh`
|
|
185
|
-
- No Docker, no API keys, no cloud accounts
|
|
186
|
-
|
|
187
|
-
### 6. MIT License - Completely Free
|
|
188
|
-
- No usage limits
|
|
189
|
-
- No credit systems
|
|
190
|
-
- Commercial use allowed
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## Conclusion
|
|
195
|
-
|
|
196
|
-
**SuperLocalMemory V2 is demonstrably unique in the 2026 AI memory market.**
|
|
197
|
-
|
|
198
|
-
No single competitor offers ALL of:
|
|
199
|
-
1. 7-layer universal architecture
|
|
200
|
-
2. Pattern learning with identity profiles
|
|
201
|
-
3. Multi-profile support
|
|
202
|
-
4. 100% local operation
|
|
203
|
-
5. Zero setup requirements
|
|
204
|
-
6. Completely free (MIT license)
|
|
205
|
-
|
|
206
|
-
**SuperLocalMemory V2 is the only solution combining all these features together.**
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
*Research conducted February 2026 by Varun Pratap Bhardwaj*
|