superlocalmemory 3.4.0 → 3.4.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/README.md +7 -8
- package/docs/screenshots/01-dashboard-main.png +0 -0
- package/docs/screenshots/02-knowledge-graph.png +0 -0
- package/docs/screenshots/03-patterns-learning.png +0 -0
- package/docs/screenshots/04-learning-dashboard.png +0 -0
- package/docs/screenshots/05-behavioral-analysis.png +0 -0
- package/docs/screenshots/06-graph-communities.png +0 -0
- package/package.json +2 -2
- package/pyproject.toml +1 -1
- package/src/superlocalmemory/core/engine_wiring.py +5 -1
- package/src/superlocalmemory/core/graph_analyzer.py +254 -12
- package/src/superlocalmemory/learning/consolidation_worker.py +240 -52
- package/src/superlocalmemory/retrieval/entity_channel.py +135 -4
- package/src/superlocalmemory/retrieval/spreading_activation.py +45 -0
- package/src/superlocalmemory/server/api.py +9 -1
- package/src/superlocalmemory/server/routes/behavioral.py +8 -4
- package/src/superlocalmemory/server/routes/chat.py +320 -0
- package/src/superlocalmemory/server/routes/insights.py +368 -0
- package/src/superlocalmemory/server/routes/learning.py +106 -6
- package/src/superlocalmemory/server/routes/memories.py +20 -9
- package/src/superlocalmemory/server/routes/stats.py +25 -3
- package/src/superlocalmemory/server/routes/timeline.py +252 -0
- package/src/superlocalmemory/server/routes/v3_api.py +161 -0
- package/src/superlocalmemory/server/ui.py +8 -0
- package/src/superlocalmemory/ui/index.html +168 -58
- package/src/superlocalmemory/ui/js/graph-event-bus.js +83 -0
- package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
- package/src/superlocalmemory/ui/js/knowledge-graph.js +942 -0
- package/src/superlocalmemory/ui/js/memory-chat.js +344 -0
- package/src/superlocalmemory/ui/js/memory-timeline.js +265 -0
- package/src/superlocalmemory/ui/js/quick-actions.js +334 -0
- package/src/superlocalmemory.egg-info/PKG-INFO +17 -14
- package/src/superlocalmemory.egg-info/SOURCES.txt +8 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// SuperLocalMemory v3.4.1 — Quick Insight Actions
|
|
2
|
+
// Copyright (c) 2026 Varun Pratap Bhardwaj — AGPL-3.0-or-later
|
|
3
|
+
// 5 one-click intelligence buttons. Safe DOM construction (HR-08).
|
|
4
|
+
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// INIT
|
|
7
|
+
// ============================================================================
|
|
8
|
+
|
|
9
|
+
function initQuickActions() {
|
|
10
|
+
var buttons = document.querySelectorAll('[data-insight-action]');
|
|
11
|
+
buttons.forEach(function(btn) {
|
|
12
|
+
btn.addEventListener('click', function() {
|
|
13
|
+
var action = btn.getAttribute('data-insight-action');
|
|
14
|
+
fetchInsight(action);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// FETCH + DISPATCH
|
|
21
|
+
// ============================================================================
|
|
22
|
+
|
|
23
|
+
function fetchInsight(actionName) {
|
|
24
|
+
var resultsDiv = document.getElementById('insight-results');
|
|
25
|
+
if (!resultsDiv) return;
|
|
26
|
+
|
|
27
|
+
// Show loading
|
|
28
|
+
resultsDiv.innerHTML = '';
|
|
29
|
+
var spinner = document.createElement('div');
|
|
30
|
+
spinner.className = 'text-center py-3';
|
|
31
|
+
spinner.innerHTML = '<div class="spinner-border spinner-border-sm text-primary"></div> Loading...';
|
|
32
|
+
resultsDiv.appendChild(spinner);
|
|
33
|
+
|
|
34
|
+
// Highlight active button
|
|
35
|
+
document.querySelectorAll('[data-insight-action]').forEach(function(b) {
|
|
36
|
+
b.classList.remove('active');
|
|
37
|
+
});
|
|
38
|
+
var activeBtn = document.querySelector('[data-insight-action="' + actionName + '"]');
|
|
39
|
+
if (activeBtn) activeBtn.classList.add('active');
|
|
40
|
+
|
|
41
|
+
fetch('/api/v3/insights/' + actionName)
|
|
42
|
+
.then(function(r) {
|
|
43
|
+
if (!r.ok) throw new Error('HTTP ' + r.status);
|
|
44
|
+
return r.json();
|
|
45
|
+
})
|
|
46
|
+
.then(function(data) {
|
|
47
|
+
resultsDiv.innerHTML = '';
|
|
48
|
+
renderInsightResult(actionName, data, resultsDiv);
|
|
49
|
+
})
|
|
50
|
+
.catch(function(e) {
|
|
51
|
+
resultsDiv.innerHTML = '';
|
|
52
|
+
var alert = document.createElement('div');
|
|
53
|
+
alert.className = 'alert alert-danger small';
|
|
54
|
+
alert.textContent = 'Failed to fetch insights: ' + e.message;
|
|
55
|
+
resultsDiv.appendChild(alert);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function renderInsightResult(action, data, container) {
|
|
60
|
+
if (data.count === 0 && action !== 'health') {
|
|
61
|
+
var empty = document.createElement('div');
|
|
62
|
+
empty.className = 'text-muted small py-2';
|
|
63
|
+
empty.textContent = 'No results for "' + action.replace(/_/g, ' ') + '".';
|
|
64
|
+
container.appendChild(empty);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Header with close button
|
|
69
|
+
var header = document.createElement('div');
|
|
70
|
+
header.className = 'd-flex justify-content-between align-items-center mb-2';
|
|
71
|
+
var title = document.createElement('strong');
|
|
72
|
+
title.className = 'small';
|
|
73
|
+
title.textContent = formatActionName(action) + ' (' + data.count + ')';
|
|
74
|
+
header.appendChild(title);
|
|
75
|
+
var closeBtn = document.createElement('button');
|
|
76
|
+
closeBtn.className = 'btn-close btn-close-sm';
|
|
77
|
+
closeBtn.setAttribute('aria-label', 'Close');
|
|
78
|
+
closeBtn.addEventListener('click', clearInsightResults);
|
|
79
|
+
header.appendChild(closeBtn);
|
|
80
|
+
container.appendChild(header);
|
|
81
|
+
|
|
82
|
+
var renderers = {
|
|
83
|
+
changed_this_week: renderChangedThisWeek,
|
|
84
|
+
opinions: renderOpinions,
|
|
85
|
+
contradictions: renderContradictions,
|
|
86
|
+
health: renderHealth,
|
|
87
|
+
cross_project: renderCrossProject,
|
|
88
|
+
};
|
|
89
|
+
var renderer = renderers[action];
|
|
90
|
+
if (renderer) renderer(data, container);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// RENDERERS (safe DOM — createElement/textContent only, no innerHTML)
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
function renderChangedThisWeek(data, container) {
|
|
98
|
+
var nodeIds = [];
|
|
99
|
+
(data.items || []).forEach(function(item) {
|
|
100
|
+
var card = document.createElement('div');
|
|
101
|
+
card.className = 'border rounded p-2 mb-1';
|
|
102
|
+
card.style.fontSize = '0.78rem';
|
|
103
|
+
|
|
104
|
+
var badge = document.createElement('span');
|
|
105
|
+
badge.className = 'badge bg-info me-1';
|
|
106
|
+
badge.textContent = item.fact_type || 'fact';
|
|
107
|
+
card.appendChild(badge);
|
|
108
|
+
|
|
109
|
+
var content = document.createElement('span');
|
|
110
|
+
content.textContent = item.content;
|
|
111
|
+
card.appendChild(content);
|
|
112
|
+
|
|
113
|
+
var ts = document.createElement('div');
|
|
114
|
+
ts.className = 'text-muted mt-1';
|
|
115
|
+
ts.style.fontSize = '0.7rem';
|
|
116
|
+
ts.textContent = formatTimestamp(item.created_at);
|
|
117
|
+
card.appendChild(ts);
|
|
118
|
+
|
|
119
|
+
container.appendChild(card);
|
|
120
|
+
if (item.fact_id) nodeIds.push(item.fact_id);
|
|
121
|
+
});
|
|
122
|
+
highlightNodesInGraph(nodeIds);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function renderOpinions(data, container) {
|
|
126
|
+
var nodeIds = [];
|
|
127
|
+
(data.items || []).forEach(function(item) {
|
|
128
|
+
var card = document.createElement('div');
|
|
129
|
+
card.className = 'border-start border-3 border-warning p-2 mb-1';
|
|
130
|
+
card.style.fontSize = '0.78rem';
|
|
131
|
+
|
|
132
|
+
var conf = document.createElement('span');
|
|
133
|
+
conf.className = 'badge bg-warning text-dark me-1';
|
|
134
|
+
conf.textContent = (item.confidence * 100).toFixed(0) + '%';
|
|
135
|
+
card.appendChild(conf);
|
|
136
|
+
|
|
137
|
+
var content = document.createElement('span');
|
|
138
|
+
content.textContent = item.content;
|
|
139
|
+
card.appendChild(content);
|
|
140
|
+
|
|
141
|
+
var ts = document.createElement('div');
|
|
142
|
+
ts.className = 'text-muted mt-1';
|
|
143
|
+
ts.style.fontSize = '0.7rem';
|
|
144
|
+
ts.textContent = formatTimestamp(item.created_at);
|
|
145
|
+
card.appendChild(ts);
|
|
146
|
+
|
|
147
|
+
container.appendChild(card);
|
|
148
|
+
if (item.fact_id) nodeIds.push(item.fact_id);
|
|
149
|
+
});
|
|
150
|
+
highlightNodesInGraph(nodeIds);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function renderContradictions(data, container) {
|
|
154
|
+
var nodeIds = [];
|
|
155
|
+
(data.items || []).forEach(function(item) {
|
|
156
|
+
var card = document.createElement('div');
|
|
157
|
+
card.className = 'alert alert-warning d-flex align-items-start mb-2 py-2';
|
|
158
|
+
|
|
159
|
+
var badge = document.createElement('span');
|
|
160
|
+
badge.className = 'badge bg-danger me-2';
|
|
161
|
+
badge.textContent = (item.severity * 100).toFixed(0) + '%';
|
|
162
|
+
card.appendChild(badge);
|
|
163
|
+
|
|
164
|
+
var body = document.createElement('div');
|
|
165
|
+
body.style.fontSize = '0.78rem';
|
|
166
|
+
|
|
167
|
+
var src = document.createElement('div');
|
|
168
|
+
src.textContent = item.source_content;
|
|
169
|
+
body.appendChild(src);
|
|
170
|
+
|
|
171
|
+
var vs = document.createElement('strong');
|
|
172
|
+
vs.className = 'text-danger';
|
|
173
|
+
vs.textContent = ' vs ';
|
|
174
|
+
body.appendChild(vs);
|
|
175
|
+
|
|
176
|
+
var tgt = document.createElement('div');
|
|
177
|
+
tgt.textContent = item.target_content;
|
|
178
|
+
body.appendChild(tgt);
|
|
179
|
+
|
|
180
|
+
card.appendChild(body);
|
|
181
|
+
container.appendChild(card);
|
|
182
|
+
|
|
183
|
+
if (item.source_id) nodeIds.push(item.source_id);
|
|
184
|
+
if (item.target_id) nodeIds.push(item.target_id);
|
|
185
|
+
});
|
|
186
|
+
highlightNodesInGraph(nodeIds);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function renderHealth(data, container) {
|
|
190
|
+
var health = (data.items && data.items[0]) || {};
|
|
191
|
+
|
|
192
|
+
// Trust section
|
|
193
|
+
var trust = health.trust || {};
|
|
194
|
+
var trustCard = document.createElement('div');
|
|
195
|
+
trustCard.className = 'border rounded p-2 mb-2';
|
|
196
|
+
var trustTitle = document.createElement('strong');
|
|
197
|
+
trustTitle.className = 'small';
|
|
198
|
+
trustTitle.textContent = 'Trust Distribution';
|
|
199
|
+
trustCard.appendChild(trustTitle);
|
|
200
|
+
['high', 'medium', 'low'].forEach(function(level) {
|
|
201
|
+
var row = document.createElement('div');
|
|
202
|
+
row.className = 'd-flex justify-content-between small';
|
|
203
|
+
var label = document.createElement('span');
|
|
204
|
+
label.textContent = level.charAt(0).toUpperCase() + level.slice(1);
|
|
205
|
+
row.appendChild(label);
|
|
206
|
+
var val = document.createElement('span');
|
|
207
|
+
val.className = 'text-muted';
|
|
208
|
+
val.textContent = trust[level] || 0;
|
|
209
|
+
row.appendChild(val);
|
|
210
|
+
trustCard.appendChild(row);
|
|
211
|
+
});
|
|
212
|
+
container.appendChild(trustCard);
|
|
213
|
+
|
|
214
|
+
// Retention zones
|
|
215
|
+
var zones = health.retention_zones;
|
|
216
|
+
if (zones) {
|
|
217
|
+
var retCard = document.createElement('div');
|
|
218
|
+
retCard.className = 'border rounded p-2 mb-2';
|
|
219
|
+
var retTitle = document.createElement('strong');
|
|
220
|
+
retTitle.className = 'small';
|
|
221
|
+
retTitle.textContent = 'Retention Zones';
|
|
222
|
+
retCard.appendChild(retTitle);
|
|
223
|
+
Object.keys(zones).forEach(function(zone) {
|
|
224
|
+
var row = document.createElement('div');
|
|
225
|
+
row.className = 'd-flex justify-content-between small';
|
|
226
|
+
var label = document.createElement('span');
|
|
227
|
+
label.textContent = zone;
|
|
228
|
+
row.appendChild(label);
|
|
229
|
+
var val = document.createElement('span');
|
|
230
|
+
val.className = 'text-muted';
|
|
231
|
+
val.textContent = zones[zone].count + ' (' + (zones[zone].avg_retention * 100).toFixed(0) + '%)';
|
|
232
|
+
row.appendChild(val);
|
|
233
|
+
retCard.appendChild(row);
|
|
234
|
+
});
|
|
235
|
+
container.appendChild(retCard);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Totals
|
|
239
|
+
var totals = health.totals || {};
|
|
240
|
+
var totCard = document.createElement('div');
|
|
241
|
+
totCard.className = 'border rounded p-2 mb-2';
|
|
242
|
+
var totTitle = document.createElement('strong');
|
|
243
|
+
totTitle.className = 'small';
|
|
244
|
+
totTitle.textContent = 'Memory Totals';
|
|
245
|
+
totCard.appendChild(totTitle);
|
|
246
|
+
[['Facts', totals.facts], ['Entities', totals.entities], ['Edges', totals.edges], ['Communities', health.community_count || 0]].forEach(function(pair) {
|
|
247
|
+
var row = document.createElement('div');
|
|
248
|
+
row.className = 'd-flex justify-content-between small';
|
|
249
|
+
var label = document.createElement('span');
|
|
250
|
+
label.textContent = pair[0];
|
|
251
|
+
row.appendChild(label);
|
|
252
|
+
var val = document.createElement('span');
|
|
253
|
+
val.className = 'text-muted';
|
|
254
|
+
val.textContent = pair[1] || 0;
|
|
255
|
+
row.appendChild(val);
|
|
256
|
+
totCard.appendChild(row);
|
|
257
|
+
});
|
|
258
|
+
container.appendChild(totCard);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function renderCrossProject(data, container) {
|
|
262
|
+
(data.items || []).forEach(function(item) {
|
|
263
|
+
var card = document.createElement('div');
|
|
264
|
+
card.className = 'border rounded p-2 mb-1';
|
|
265
|
+
card.style.fontSize = '0.78rem';
|
|
266
|
+
|
|
267
|
+
var name = document.createElement('strong');
|
|
268
|
+
name.textContent = item.canonical_name;
|
|
269
|
+
card.appendChild(name);
|
|
270
|
+
|
|
271
|
+
var badge = document.createElement('span');
|
|
272
|
+
badge.className = 'badge bg-primary ms-1';
|
|
273
|
+
badge.textContent = item.session_count + ' sessions';
|
|
274
|
+
card.appendChild(badge);
|
|
275
|
+
|
|
276
|
+
var detail = document.createElement('div');
|
|
277
|
+
detail.className = 'text-muted mt-1';
|
|
278
|
+
detail.style.fontSize = '0.7rem';
|
|
279
|
+
detail.textContent = (item.entity_type || 'entity') + ' — ' + item.fact_count + ' facts';
|
|
280
|
+
card.appendChild(detail);
|
|
281
|
+
|
|
282
|
+
container.appendChild(card);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// ============================================================================
|
|
287
|
+
// EVENT BUS INTEGRATION (fire-and-forget — Phase 3 adds listener)
|
|
288
|
+
// ============================================================================
|
|
289
|
+
|
|
290
|
+
function highlightNodesInGraph(nodeIds) {
|
|
291
|
+
if (!nodeIds || nodeIds.length === 0) return;
|
|
292
|
+
window.dispatchEvent(new CustomEvent('slm:graph:highlight', {
|
|
293
|
+
detail: { nodeIds: nodeIds },
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function clearInsightResults() {
|
|
298
|
+
var resultsDiv = document.getElementById('insight-results');
|
|
299
|
+
if (resultsDiv) resultsDiv.innerHTML = '';
|
|
300
|
+
// Clear button active state
|
|
301
|
+
document.querySelectorAll('[data-insight-action]').forEach(function(b) {
|
|
302
|
+
b.classList.remove('active');
|
|
303
|
+
});
|
|
304
|
+
// Clear graph highlights
|
|
305
|
+
window.dispatchEvent(new CustomEvent('slm:graph:clearHighlight', { detail: {} }));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// HELPERS
|
|
310
|
+
// ============================================================================
|
|
311
|
+
|
|
312
|
+
function formatActionName(action) {
|
|
313
|
+
return action.replace(/_/g, ' ').replace(/\b\w/g, function(c) { return c.toUpperCase(); });
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function formatTimestamp(ts) {
|
|
317
|
+
if (!ts) return '';
|
|
318
|
+
try {
|
|
319
|
+
var d = new Date(ts);
|
|
320
|
+
return d.toLocaleDateString() + ' ' + d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
321
|
+
} catch (_) {
|
|
322
|
+
return ts;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ============================================================================
|
|
327
|
+
// AUTO-INIT
|
|
328
|
+
// ============================================================================
|
|
329
|
+
|
|
330
|
+
if (document.readyState === 'loading') {
|
|
331
|
+
document.addEventListener('DOMContentLoaded', initQuickActions);
|
|
332
|
+
} else {
|
|
333
|
+
initQuickActions();
|
|
334
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superlocalmemory
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.1
|
|
4
4
|
Summary: Information-geometric agent memory with mathematical guarantees
|
|
5
5
|
Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
|
|
6
|
-
License:
|
|
6
|
+
License: AGPL-3.0-or-later
|
|
7
7
|
Project-URL: Homepage, https://superlocalmemory.com
|
|
8
8
|
Project-URL: Repository, https://github.com/qualixar/superlocalmemory
|
|
9
9
|
Project-URL: Documentation, https://github.com/qualixar/superlocalmemory/wiki
|
|
@@ -11,7 +11,7 @@ Project-URL: Issues, https://github.com/qualixar/superlocalmemory/issues
|
|
|
11
11
|
Keywords: ai-memory,mcp-server,local-first,agent-memory,information-geometry,privacy-first,eu-ai-act
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
14
|
-
Classifier: License ::
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
|
16
16
|
Classifier: Operating System :: MacOS
|
|
17
17
|
Classifier: Operating System :: Microsoft :: Windows
|
|
@@ -87,7 +87,7 @@ Dynamic: license-file
|
|
|
87
87
|
<a href="https://arxiv.org/abs/2603.14588"><img src="https://img.shields.io/badge/arXiv-2603.14588-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="arXiv Paper"/></a>
|
|
88
88
|
<a href="https://pypi.org/project/superlocalmemory/"><img src="https://img.shields.io/pypi/v/superlocalmemory?style=for-the-badge&logo=pypi&logoColor=white" alt="PyPI"/></a>
|
|
89
89
|
<a href="https://www.npmjs.com/package/superlocalmemory"><img src="https://img.shields.io/npm/v/superlocalmemory?style=for-the-badge&logo=npm&logoColor=white" alt="npm"/></a>
|
|
90
|
-
<a href="
|
|
90
|
+
<a href="https://www.gnu.org/licenses/agpl-3.0"><img src="https://img.shields.io/badge/License-AGPL_v3-blue.svg?style=for-the-badge" alt="AGPL v3"/></a>
|
|
91
91
|
<a href="#eu-ai-act-compliance"><img src="https://img.shields.io/badge/EU_AI_Act-Compliant-brightgreen?style=for-the-badge" alt="EU AI Act"/></a>
|
|
92
92
|
<a href="https://superlocalmemory.com"><img src="https://img.shields.io/badge/Web-superlocalmemory.com-ff6b35?style=for-the-badge" alt="Website"/></a>
|
|
93
93
|
<a href="#dual-interface-mcp--cli"><img src="https://img.shields.io/badge/MCP-Native-blue?style=for-the-badge" alt="MCP Native"/></a>
|
|
@@ -413,20 +413,19 @@ slm dashboard # Opens at http://localhost:8765
|
|
|
413
413
|
|
|
414
414
|
<details open>
|
|
415
415
|
<summary><strong>Dashboard Screenshots</strong> (click to collapse)</summary>
|
|
416
|
-
<p align="center"><img src="docs/screenshots/01-dashboard-main.png" alt="Dashboard" width="600"/></p>
|
|
416
|
+
<p align="center"><img src="docs/screenshots/01-dashboard-main.png" alt="Dashboard Overview — 3,100+ memories, 430K connections" width="600"/></p>
|
|
417
417
|
<p align="center">
|
|
418
|
-
<img src="docs/screenshots/02-knowledge-graph.png" alt="Graph" width="
|
|
419
|
-
<img src="docs/screenshots/
|
|
420
|
-
<img src="docs/screenshots/05-trust-dashboard.png" alt="Trust" width="190"/>
|
|
418
|
+
<img src="docs/screenshots/02-knowledge-graph.png" alt="Knowledge Graph — Sigma.js WebGL with community detection, chat, quick actions, timeline" width="290"/>
|
|
419
|
+
<img src="docs/screenshots/06-graph-communities.png" alt="Graph Communities — Louvain clustering with colored nodes" width="290"/>
|
|
421
420
|
</p>
|
|
422
421
|
<p align="center">
|
|
423
|
-
<img src="docs/screenshots/
|
|
424
|
-
<img src="docs/screenshots/
|
|
425
|
-
<img src="docs/screenshots/
|
|
422
|
+
<img src="docs/screenshots/03-patterns-learning.png" alt="Patterns — 50 learned behavioral patterns with confidence bars" width="190"/>
|
|
423
|
+
<img src="docs/screenshots/04-learning-dashboard.png" alt="Learning — 722 signals, ML Model phase, tech preferences" width="190"/>
|
|
424
|
+
<img src="docs/screenshots/05-behavioral-analysis.png" alt="Behavioral — pattern analysis with confidence distribution" width="190"/>
|
|
426
425
|
</p>
|
|
427
426
|
</details>
|
|
428
427
|
|
|
429
|
-
|
|
428
|
+
**v3.4.1 Visual Intelligence:** Sigma.js WebGL knowledge graph with community detection (Louvain/Leiden), 5 quick insight actions, D3 memory timeline, graph-enhanced retrieval (PageRank bias + community boost + contradiction suppression), and 56 auto-mined behavioral patterns. 23+ tabs. Runs locally — no data leaves your machine.
|
|
430
429
|
|
|
431
430
|
---
|
|
432
431
|
|
|
@@ -472,7 +471,7 @@ Auto-capture hooks: `slm hooks install` + `slm observe` + `slm session-context`.
|
|
|
472
471
|
- 17+ IDE integrations (Claude, Cursor, Windsurf, VS Code, JetBrains, Zed, etc.)
|
|
473
472
|
- 35 MCP tools + 7 MCP resources
|
|
474
473
|
- Profile isolation (independent memory spaces)
|
|
475
|
-
- 1400+ tests,
|
|
474
|
+
- 1400+ tests, AGPL v3, cross-platform (Mac/Linux/Windows)
|
|
476
475
|
- CPU-only — no GPU required
|
|
477
476
|
- Automatic orphaned process cleanup
|
|
478
477
|
|
|
@@ -581,7 +580,11 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. [Wiki](https://github.com
|
|
|
581
580
|
|
|
582
581
|
## License
|
|
583
582
|
|
|
584
|
-
|
|
583
|
+
GNU Affero General Public License v3.0 (AGPL-3.0). See [LICENSE](LICENSE).
|
|
584
|
+
|
|
585
|
+
For commercial licensing (closed-source, proprietary, or hosted use), see [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) or contact varun.pratap.bhardwaj@gmail.com.
|
|
586
|
+
|
|
587
|
+
Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar.
|
|
585
588
|
|
|
586
589
|
## Attribution
|
|
587
590
|
|
|
@@ -195,15 +195,18 @@ src/superlocalmemory/server/routes/__init__.py
|
|
|
195
195
|
src/superlocalmemory/server/routes/agents.py
|
|
196
196
|
src/superlocalmemory/server/routes/backup.py
|
|
197
197
|
src/superlocalmemory/server/routes/behavioral.py
|
|
198
|
+
src/superlocalmemory/server/routes/chat.py
|
|
198
199
|
src/superlocalmemory/server/routes/compliance.py
|
|
199
200
|
src/superlocalmemory/server/routes/data_io.py
|
|
200
201
|
src/superlocalmemory/server/routes/events.py
|
|
201
202
|
src/superlocalmemory/server/routes/helpers.py
|
|
203
|
+
src/superlocalmemory/server/routes/insights.py
|
|
202
204
|
src/superlocalmemory/server/routes/learning.py
|
|
203
205
|
src/superlocalmemory/server/routes/lifecycle.py
|
|
204
206
|
src/superlocalmemory/server/routes/memories.py
|
|
205
207
|
src/superlocalmemory/server/routes/profiles.py
|
|
206
208
|
src/superlocalmemory/server/routes/stats.py
|
|
209
|
+
src/superlocalmemory/server/routes/timeline.py
|
|
207
210
|
src/superlocalmemory/server/routes/v3_api.py
|
|
208
211
|
src/superlocalmemory/server/routes/ws.py
|
|
209
212
|
src/superlocalmemory/storage/__init__.py
|
|
@@ -236,18 +239,23 @@ src/superlocalmemory/ui/js/events.js
|
|
|
236
239
|
src/superlocalmemory/ui/js/fact-detail.js
|
|
237
240
|
src/superlocalmemory/ui/js/feedback.js
|
|
238
241
|
src/superlocalmemory/ui/js/graph-core.js
|
|
242
|
+
src/superlocalmemory/ui/js/graph-event-bus.js
|
|
239
243
|
src/superlocalmemory/ui/js/graph-filters.js
|
|
240
244
|
src/superlocalmemory/ui/js/graph-interactions.js
|
|
241
245
|
src/superlocalmemory/ui/js/graph-ui.js
|
|
242
246
|
src/superlocalmemory/ui/js/ide-status.js
|
|
243
247
|
src/superlocalmemory/ui/js/init.js
|
|
248
|
+
src/superlocalmemory/ui/js/knowledge-graph.js
|
|
244
249
|
src/superlocalmemory/ui/js/learning.js
|
|
245
250
|
src/superlocalmemory/ui/js/lifecycle.js
|
|
246
251
|
src/superlocalmemory/ui/js/math-health.js
|
|
247
252
|
src/superlocalmemory/ui/js/memories.js
|
|
253
|
+
src/superlocalmemory/ui/js/memory-chat.js
|
|
254
|
+
src/superlocalmemory/ui/js/memory-timeline.js
|
|
248
255
|
src/superlocalmemory/ui/js/modal.js
|
|
249
256
|
src/superlocalmemory/ui/js/patterns.js
|
|
250
257
|
src/superlocalmemory/ui/js/profiles.js
|
|
258
|
+
src/superlocalmemory/ui/js/quick-actions.js
|
|
251
259
|
src/superlocalmemory/ui/js/recall-lab.js
|
|
252
260
|
src/superlocalmemory/ui/js/search.js
|
|
253
261
|
src/superlocalmemory/ui/js/settings.js
|