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.
Files changed (33) hide show
  1. package/README.md +7 -8
  2. package/docs/screenshots/01-dashboard-main.png +0 -0
  3. package/docs/screenshots/02-knowledge-graph.png +0 -0
  4. package/docs/screenshots/03-patterns-learning.png +0 -0
  5. package/docs/screenshots/04-learning-dashboard.png +0 -0
  6. package/docs/screenshots/05-behavioral-analysis.png +0 -0
  7. package/docs/screenshots/06-graph-communities.png +0 -0
  8. package/package.json +2 -2
  9. package/pyproject.toml +1 -1
  10. package/src/superlocalmemory/core/engine_wiring.py +5 -1
  11. package/src/superlocalmemory/core/graph_analyzer.py +254 -12
  12. package/src/superlocalmemory/learning/consolidation_worker.py +240 -52
  13. package/src/superlocalmemory/retrieval/entity_channel.py +135 -4
  14. package/src/superlocalmemory/retrieval/spreading_activation.py +45 -0
  15. package/src/superlocalmemory/server/api.py +9 -1
  16. package/src/superlocalmemory/server/routes/behavioral.py +8 -4
  17. package/src/superlocalmemory/server/routes/chat.py +320 -0
  18. package/src/superlocalmemory/server/routes/insights.py +368 -0
  19. package/src/superlocalmemory/server/routes/learning.py +106 -6
  20. package/src/superlocalmemory/server/routes/memories.py +20 -9
  21. package/src/superlocalmemory/server/routes/stats.py +25 -3
  22. package/src/superlocalmemory/server/routes/timeline.py +252 -0
  23. package/src/superlocalmemory/server/routes/v3_api.py +161 -0
  24. package/src/superlocalmemory/server/ui.py +8 -0
  25. package/src/superlocalmemory/ui/index.html +168 -58
  26. package/src/superlocalmemory/ui/js/graph-event-bus.js +83 -0
  27. package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
  28. package/src/superlocalmemory/ui/js/knowledge-graph.js +942 -0
  29. package/src/superlocalmemory/ui/js/memory-chat.js +344 -0
  30. package/src/superlocalmemory/ui/js/memory-timeline.js +265 -0
  31. package/src/superlocalmemory/ui/js/quick-actions.js +334 -0
  32. package/src/superlocalmemory.egg-info/PKG-INFO +17 -14
  33. 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.28
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: Elastic-2.0
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 :: Other/Proprietary 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="LICENSE"><img src="https://img.shields.io/badge/license-Elastic%202.0-blue?style=for-the-badge" alt="Elastic License 2.0"/></a>
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="190"/>
419
- <img src="docs/screenshots/03-math-health.png" alt="Math" width="190"/>
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/04-recall-lab.png" alt="Recall" width="190"/>
424
- <img src="docs/screenshots/06-settings.png" alt="Settings" width="190"/>
425
- <img src="docs/screenshots/07-memories-blurred.png" alt="Memories" width="190"/>
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
- 23 tabs: Dashboard, Recall Lab, Knowledge Graph, Memories, Trust Scores, Math Health, Compliance, Learning, IDE Connections, Settings, Memory Lifecycle, Compression, Patterns, and more. Runs locally — no data leaves your machine.
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, Elastic License 2.0, cross-platform (Mac/Linux/Windows)
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
- Elastic License 2.0. See [LICENSE](LICENSE). Previously MIT — changed April 2026 to protect research IP while keeping the project open for use and contributions.
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