superlocalmemory 3.6.23 → 3.7.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 (285) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +271 -71
  3. package/bin/slm-npm +43 -89
  4. package/ide/configs/antigravity-mcp.json +2 -2
  5. package/ide/configs/chatgpt-desktop-mcp.json +1 -1
  6. package/ide/configs/claude-desktop-mcp.json +2 -2
  7. package/ide/configs/windsurf-mcp.json +2 -2
  8. package/ide/hooks/context-hook.js +6 -2
  9. package/ide/hooks/post-recall-hook.js +7 -3
  10. package/ide/hooks/tool-event-hook.sh +2 -1
  11. package/package.json +17 -9
  12. package/plugin/.claude-plugin/plugin.json +1 -1
  13. package/plugin/_GENERATED.md +1 -1
  14. package/plugin/agents/slm-memory-advisor.md +1 -1
  15. package/plugin/requirements.txt +1 -1
  16. package/plugin/skills/slm-session/SKILL.md +1 -1
  17. package/plugin-src/agents/slm-memory-advisor.md +1 -1
  18. package/plugin-src/manifest.json +1 -1
  19. package/plugin-src/requirements.txt +1 -1
  20. package/plugin-src/rules/AGENTS.md +1 -1
  21. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  22. package/pyproject.toml +40 -8
  23. package/scripts/postinstall-interactive.js +17 -94
  24. package/scripts/postinstall.js +185 -258
  25. package/scripts/preuninstall.js +9 -50
  26. package/src/superlocalmemory/__init__.py +2 -2
  27. package/src/superlocalmemory/attribution/mathematical_dna.py +1 -1
  28. package/src/superlocalmemory/attribution/signer.py +34 -19
  29. package/src/superlocalmemory/attribution/watermark.py +1 -1
  30. package/src/superlocalmemory/cli/_lazy_init.py +7 -7
  31. package/src/superlocalmemory/cli/commands.py +453 -191
  32. package/src/superlocalmemory/cli/context_commands.py +5 -4
  33. package/src/superlocalmemory/cli/daemon.py +282 -187
  34. package/src/superlocalmemory/cli/db_migrate.py +3 -1
  35. package/src/superlocalmemory/cli/diagnostics_cmd.py +28 -0
  36. package/src/superlocalmemory/cli/evidence_cmd.py +103 -0
  37. package/src/superlocalmemory/cli/ingest_cmd.py +7 -3
  38. package/src/superlocalmemory/cli/main.py +128 -31
  39. package/src/superlocalmemory/cli/pending_store.py +54 -38
  40. package/src/superlocalmemory/cli/scale_engine_cmd.py +37 -0
  41. package/src/superlocalmemory/cli/service_installer.py +57 -52
  42. package/src/superlocalmemory/cli/setup_wizard.py +142 -88
  43. package/src/superlocalmemory/cli/version_banner.py +2 -1
  44. package/src/superlocalmemory/code_graph/config.py +3 -1
  45. package/src/superlocalmemory/core/backend_orchestrator.py +81 -21
  46. package/src/superlocalmemory/core/config.py +65 -20
  47. package/src/superlocalmemory/core/consolidation_engine.py +9 -7
  48. package/src/superlocalmemory/core/context_cache.py +56 -8
  49. package/src/superlocalmemory/core/derivation_lineage.py +246 -0
  50. package/src/superlocalmemory/core/embedding_worker.py +32 -20
  51. package/src/superlocalmemory/core/embeddings.py +54 -18
  52. package/src/superlocalmemory/core/engine.py +150 -104
  53. package/src/superlocalmemory/core/engine_ingestion.py +513 -0
  54. package/src/superlocalmemory/core/engine_wiring.py +32 -23
  55. package/src/superlocalmemory/core/evidence_bundle.py +526 -0
  56. package/src/superlocalmemory/core/fact_consolidator.py +5 -11
  57. package/src/superlocalmemory/core/graph_analyzer.py +2 -2
  58. package/src/superlocalmemory/core/health_monitor.py +4 -2
  59. package/src/superlocalmemory/core/ingestion_command.py +636 -0
  60. package/src/superlocalmemory/core/injection.py +69 -18
  61. package/src/superlocalmemory/core/lifecycle_state.py +153 -0
  62. package/src/superlocalmemory/core/maintenance.py +1 -1
  63. package/src/superlocalmemory/core/maintenance_scheduler.py +51 -35
  64. package/src/superlocalmemory/core/mutations.py +143 -0
  65. package/src/superlocalmemory/core/platform_utils.py +7 -4
  66. package/src/superlocalmemory/core/ram_lock.py +16 -5
  67. package/src/superlocalmemory/core/rate_limit.py +1 -1
  68. package/src/superlocalmemory/core/recall_pipeline.py +60 -101
  69. package/src/superlocalmemory/core/recall_worker.py +76 -59
  70. package/src/superlocalmemory/core/registry.py +1 -1
  71. package/src/superlocalmemory/core/scale_engine.py +293 -0
  72. package/src/superlocalmemory/core/score_contract.py +62 -0
  73. package/src/superlocalmemory/core/security_primitives.py +3 -1
  74. package/src/superlocalmemory/core/slm_disabled.py +3 -5
  75. package/src/superlocalmemory/core/store_pipeline.py +172 -40
  76. package/src/superlocalmemory/core/tier_manager.py +32 -20
  77. package/src/superlocalmemory/core/worker_pool.py +13 -4
  78. package/src/superlocalmemory/dynamics/activation_guided_quantization.py +1 -1
  79. package/src/superlocalmemory/dynamics/eap_scheduler.py +10 -3
  80. package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +1 -1
  81. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +1 -1
  82. package/src/superlocalmemory/encoding/auto_linker.py +1 -1
  83. package/src/superlocalmemory/encoding/cognitive_consolidator.py +7 -16
  84. package/src/superlocalmemory/encoding/consolidator.py +22 -5
  85. package/src/superlocalmemory/encoding/fact_extractor.py +1 -1
  86. package/src/superlocalmemory/encoding/foresight.py +2 -0
  87. package/src/superlocalmemory/encoding/graph_builder.py +1 -1
  88. package/src/superlocalmemory/encoding/temporal_parser.py +2 -0
  89. package/src/superlocalmemory/evaluation/__init__.py +13 -0
  90. package/src/superlocalmemory/evaluation/calibration.py +308 -0
  91. package/src/superlocalmemory/evolution/skill_evolver.py +2 -1
  92. package/src/superlocalmemory/graph/cozo_backend.py +256 -23
  93. package/src/superlocalmemory/hooks/_outcome_common.py +21 -11
  94. package/src/superlocalmemory/hooks/antigravity_adapter.py +10 -31
  95. package/src/superlocalmemory/hooks/auto_invoker.py +25 -27
  96. package/src/superlocalmemory/hooks/auto_recall.py +31 -6
  97. package/src/superlocalmemory/hooks/auto_recall_hook.py +13 -33
  98. package/src/superlocalmemory/hooks/before_web_hook.py +9 -7
  99. package/src/superlocalmemory/hooks/claude_code_hooks.py +123 -35
  100. package/src/superlocalmemory/hooks/codex_assets.py +59 -0
  101. package/src/superlocalmemory/hooks/codex_hooks.py +186 -0
  102. package/src/superlocalmemory/hooks/context_payload.py +1 -1
  103. package/src/superlocalmemory/hooks/copilot_adapter.py +9 -24
  104. package/src/superlocalmemory/hooks/cursor_adapter.py +10 -32
  105. package/src/superlocalmemory/hooks/hook_daemon.py +4 -2
  106. package/src/superlocalmemory/hooks/hook_handlers.py +219 -32
  107. package/src/superlocalmemory/hooks/memory_protocol.py +5 -3
  108. package/src/superlocalmemory/hooks/post_tool_async_hook.py +4 -2
  109. package/src/superlocalmemory/hooks/session_registry.py +15 -8
  110. package/src/superlocalmemory/hooks/stop_outcome_hook.py +10 -6
  111. package/src/superlocalmemory/hooks/topic_shift_hook.py +42 -12
  112. package/src/superlocalmemory/hooks/user_prompt_hook.py +9 -14
  113. package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +19 -11
  114. package/src/superlocalmemory/infra/auth_middleware.py +38 -5
  115. package/src/superlocalmemory/infra/backup.py +7 -5
  116. package/src/superlocalmemory/infra/cloud_backup.py +18 -8
  117. package/src/superlocalmemory/infra/daemon_identity.py +248 -0
  118. package/src/superlocalmemory/infra/data_root.py +199 -0
  119. package/src/superlocalmemory/infra/event_bus.py +3 -1
  120. package/src/superlocalmemory/infra/local_diagnostics.py +327 -0
  121. package/src/superlocalmemory/infra/process_reaper.py +23 -0
  122. package/src/superlocalmemory/ingestion/adapter_manager.py +27 -9
  123. package/src/superlocalmemory/ingestion/base_adapter.py +25 -31
  124. package/src/superlocalmemory/ingestion/calendar_adapter.py +13 -4
  125. package/src/superlocalmemory/ingestion/credentials.py +14 -7
  126. package/src/superlocalmemory/ingestion/gmail_adapter.py +13 -4
  127. package/src/superlocalmemory/ingestion/transcript_adapter.py +7 -2
  128. package/src/superlocalmemory/learning/consolidation_quantization_worker.py +1 -1
  129. package/src/superlocalmemory/learning/ensemble.py +11 -0
  130. package/src/superlocalmemory/learning/entity_compiler.py +1 -1
  131. package/src/superlocalmemory/learning/feedback.py +1 -1
  132. package/src/superlocalmemory/learning/forgetting_scheduler.py +12 -7
  133. package/src/superlocalmemory/learning/quantization_scheduler.py +1 -1
  134. package/src/superlocalmemory/learning/ranker.py +4 -1
  135. package/src/superlocalmemory/learning/source_quality.py +1 -1
  136. package/src/superlocalmemory/learning/trigram_index.py +3 -2
  137. package/src/superlocalmemory/llm/backbone.py +1 -1
  138. package/src/superlocalmemory/math/ebbinghaus.py +1 -1
  139. package/src/superlocalmemory/math/fisher.py +1 -1
  140. package/src/superlocalmemory/math/fisher_quantized.py +1 -1
  141. package/src/superlocalmemory/math/hopfield.py +1 -1
  142. package/src/superlocalmemory/math/langevin.py +1 -1
  143. package/src/superlocalmemory/math/polar_quant.py +3 -4
  144. package/src/superlocalmemory/math/qjl.py +1 -1
  145. package/src/superlocalmemory/math/sheaf.py +1 -1
  146. package/src/superlocalmemory/math/turbo_quant.py +3 -2
  147. package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -11
  148. package/src/superlocalmemory/mcp/_pool_adapter.py +27 -0
  149. package/src/superlocalmemory/mcp/http_transport.py +53 -0
  150. package/src/superlocalmemory/mcp/server.py +39 -13
  151. package/src/superlocalmemory/mcp/shared.py +69 -3
  152. package/src/superlocalmemory/mcp/tools_active.py +141 -31
  153. package/src/superlocalmemory/mcp/tools_core.py +130 -31
  154. package/src/superlocalmemory/mcp/tools_evolution.py +5 -7
  155. package/src/superlocalmemory/mcp/tools_learning.py +42 -2
  156. package/src/superlocalmemory/mcp/tools_mesh.py +7 -23
  157. package/src/superlocalmemory/mcp/tools_optimize.py +8 -1
  158. package/src/superlocalmemory/mcp/tools_v28.py +23 -2
  159. package/src/superlocalmemory/mcp/tools_v3.py +26 -1
  160. package/src/superlocalmemory/mcp/tools_v33.py +56 -17
  161. package/src/superlocalmemory/mesh/broker.py +2 -0
  162. package/src/superlocalmemory/mesh/remote_sync.py +50 -12
  163. package/src/superlocalmemory/optimize/cache/manager.py +77 -1
  164. package/src/superlocalmemory/optimize/cache/semantic.py +23 -3
  165. package/src/superlocalmemory/optimize/compress/ccr.py +4 -0
  166. package/src/superlocalmemory/optimize/compress/router.py +6 -1
  167. package/src/superlocalmemory/optimize/config/__init__.py +5 -0
  168. package/src/superlocalmemory/optimize/config/store.py +6 -4
  169. package/src/superlocalmemory/optimize/proxy/_helpers.py +15 -5
  170. package/src/superlocalmemory/optimize/proxy/capture.py +3 -2
  171. package/src/superlocalmemory/optimize/proxy/server.py +2 -2
  172. package/src/superlocalmemory/optimize/storage/db.py +12 -12
  173. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  174. package/src/superlocalmemory/retrieval/ann_index.py +1 -1
  175. package/src/superlocalmemory/retrieval/bm25_channel.py +35 -11
  176. package/src/superlocalmemory/retrieval/bridge_discovery.py +73 -8
  177. package/src/superlocalmemory/retrieval/engine.py +169 -79
  178. package/src/superlocalmemory/retrieval/entity_channel.py +289 -67
  179. package/src/superlocalmemory/retrieval/forgetting_filter.py +1 -1
  180. package/src/superlocalmemory/retrieval/fusion.py +1 -1
  181. package/src/superlocalmemory/retrieval/hopfield_channel.py +118 -30
  182. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  183. package/src/superlocalmemory/retrieval/quantization_aware_search.py +16 -10
  184. package/src/superlocalmemory/retrieval/reranker.py +56 -20
  185. package/src/superlocalmemory/retrieval/scope_policy.py +85 -0
  186. package/src/superlocalmemory/retrieval/semantic_channel.py +122 -14
  187. package/src/superlocalmemory/retrieval/spreading_activation.py +141 -25
  188. package/src/superlocalmemory/retrieval/strategy.py +1 -1
  189. package/src/superlocalmemory/retrieval/temporal_channel.py +30 -15
  190. package/src/superlocalmemory/retrieval/vector_store.py +1 -1
  191. package/src/superlocalmemory/server/api.py +10 -7
  192. package/src/superlocalmemory/server/bandit_loops.py +4 -2
  193. package/src/superlocalmemory/server/recall_serializer.py +24 -0
  194. package/src/superlocalmemory/server/route_mutations.py +84 -0
  195. package/src/superlocalmemory/server/routes/agents.py +8 -6
  196. package/src/superlocalmemory/server/routes/brain.py +14 -12
  197. package/src/superlocalmemory/server/routes/chat.py +29 -12
  198. package/src/superlocalmemory/server/routes/data_io.py +55 -24
  199. package/src/superlocalmemory/server/routes/helpers.py +8 -63
  200. package/src/superlocalmemory/server/routes/ingest.py +53 -36
  201. package/src/superlocalmemory/server/routes/memories.py +104 -43
  202. package/src/superlocalmemory/server/routes/mesh.py +31 -0
  203. package/src/superlocalmemory/server/routes/profiles.py +26 -4
  204. package/src/superlocalmemory/server/routes/tiers.py +43 -11
  205. package/src/superlocalmemory/server/routes/timeline.py +5 -1
  206. package/src/superlocalmemory/server/routes/v3_api.py +76 -21
  207. package/src/superlocalmemory/server/security_middleware.py +1 -1
  208. package/src/superlocalmemory/server/unified_daemon.py +680 -293
  209. package/src/superlocalmemory/server/write_identity.py +147 -0
  210. package/src/superlocalmemory/storage/access_log.py +4 -3
  211. package/src/superlocalmemory/storage/database.py +118 -25
  212. package/src/superlocalmemory/storage/migration_runner.py +84 -1
  213. package/src/superlocalmemory/storage/migration_v33.py +1 -1
  214. package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +6 -60
  215. package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +120 -0
  216. package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +54 -0
  217. package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +52 -0
  218. package/src/superlocalmemory/storage/migrations/__init__.py +5 -0
  219. package/src/superlocalmemory/storage/models.py +16 -0
  220. package/src/superlocalmemory/storage/quantized_store.py +20 -3
  221. package/src/superlocalmemory/storage/v2_migrator.py +5 -3
  222. package/src/superlocalmemory/ui/favicon.svg +5 -0
  223. package/src/superlocalmemory/ui/index.html +1 -0
  224. package/src/superlocalmemory/ui/js/compliance.js +1 -1
  225. package/src/superlocalmemory/ui/js/core.js +49 -8
  226. package/src/superlocalmemory/ui/js/dashboard.js +23 -2
  227. package/src/superlocalmemory/ui/js/feedback.js +1 -1
  228. package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
  229. package/src/superlocalmemory/ui/js/graph-ui.js +1 -1
  230. package/src/superlocalmemory/ui/js/lifecycle.js +1 -1
  231. package/src/superlocalmemory/ui/js/ng-mesh.js +15 -49
  232. package/src/superlocalmemory/ui/js/settings.js +4 -2
  233. package/src/superlocalmemory/vector/lancedb_backend.py +57 -9
  234. package/bin/slm +0 -59
  235. package/bin/slm.bat +0 -77
  236. package/bin/slm.cmd +0 -5
  237. package/ide/integrations/langchain/README.md +0 -106
  238. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +0 -9
  239. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +0 -201
  240. package/ide/integrations/langchain/pyproject.toml +0 -38
  241. package/ide/integrations/langchain/tests/__init__.py +0 -3
  242. package/ide/integrations/langchain/tests/test_chat_message_history.py +0 -215
  243. package/ide/integrations/langchain/tests/test_security.py +0 -117
  244. package/ide/integrations/llamaindex/README.md +0 -81
  245. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +0 -9
  246. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +0 -316
  247. package/ide/integrations/llamaindex/pyproject.toml +0 -43
  248. package/ide/integrations/llamaindex/tests/__init__.py +0 -3
  249. package/ide/integrations/llamaindex/tests/test_chat_store.py +0 -294
  250. package/ide/integrations/llamaindex/tests/test_security.py +0 -241
  251. package/scripts/__tests__/build-plugin.test.mjs +0 -613
  252. package/scripts/_savings_math.py +0 -270
  253. package/scripts/build-dmg.sh +0 -417
  254. package/scripts/build-plugin.js +0 -742
  255. package/scripts/build-slm-hook.ps1 +0 -40
  256. package/scripts/build-slm-hook.sh +0 -45
  257. package/scripts/build_entry.py +0 -452
  258. package/scripts/ci/stage5b_gate.sh +0 -50
  259. package/scripts/dogfood_savings.py +0 -490
  260. package/scripts/generate-thumbnails.py +0 -218
  261. package/scripts/install-skills.ps1 +0 -4
  262. package/scripts/install-skills.sh +0 -5
  263. package/scripts/install.ps1 +0 -701
  264. package/scripts/install.sh +0 -1015
  265. package/scripts/postinstall_binary.js +0 -287
  266. package/scripts/prepack.js +0 -33
  267. package/scripts/release_manifest.py +0 -273
  268. package/scripts/slm-hook.spec +0 -56
  269. package/scripts/start-dashboard.ps1 +0 -52
  270. package/scripts/start-dashboard.sh +0 -41
  271. package/scripts/sync-wiki.ps1 +0 -127
  272. package/scripts/sync-wiki.sh +0 -82
  273. package/scripts/test-dmg.sh +0 -161
  274. package/scripts/test-npm-package.ps1 +0 -252
  275. package/scripts/test-npm-package.sh +0 -207
  276. package/scripts/verify-install.ps1 +0 -294
  277. package/scripts/verify-install.sh +0 -266
  278. package/scripts/verify-v27.ps1 +0 -301
  279. package/scripts/verify-v27.sh +0 -233
  280. package/src/superlocalmemory.egg-info/PKG-INFO +0 -516
  281. package/src/superlocalmemory.egg-info/SOURCES.txt +0 -529
  282. package/src/superlocalmemory.egg-info/dependency_links.txt +0 -1
  283. package/src/superlocalmemory.egg-info/entry_points.txt +0 -2
  284. package/src/superlocalmemory.egg-info/requires.txt +0 -71
  285. package/src/superlocalmemory.egg-info/top_level.txt +0 -1
package/bin/slm-npm CHANGED
@@ -1,103 +1,57 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * SuperLocalMemory V3 - NPM Global CLI Wrapper
3
+ * SuperLocalMemory V3 - NPM CLI wrapper.
4
+ *
5
+ * Executes only the Python interpreter installed into this npm package's
6
+ * private virtual environment. The Python runtime owns canonical data-root
7
+ * precedence (SLM_DATA_DIR, SL_MEMORY_PATH, SLM_HOME); this wrapper passes the
8
+ * environment through and performs no durable-data writes.
4
9
  *
5
10
  * Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
6
- * Licensed under MIT License (see LICENSE file)
7
- * Repository: https://github.com/qualixar/superlocalmemory
11
+ * Licensed under AGPL-3.0-or-later.
8
12
  */
9
13
 
14
+ 'use strict';
15
+
10
16
  const { spawnSync } = require('child_process');
11
17
  const path = require('path');
12
18
  const os = require('os');
13
19
  const fs = require('fs');
14
20
 
15
- // V3 package root (where src/superlocalmemory/ lives)
16
- const PKG_ROOT = path.join(__dirname, '..');
17
- const SRC_DIR = path.join(PKG_ROOT, 'src');
18
- const CLI_MODULE = 'superlocalmemory.cli.main';
19
-
20
- // Find Python 3 binary (robust multi-fallback detection)
21
- function findPython() {
22
- const candidates = [
23
- 'python3',
24
- 'python',
25
- '/opt/homebrew/bin/python3',
26
- '/usr/local/bin/python3',
27
- '/usr/bin/python3',
28
- ];
29
-
30
- // On Windows, also check common locations
31
- if (os.platform() === 'win32') {
32
- candidates.push(
33
- 'py -3',
34
- path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python312', 'python.exe'),
35
- path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python311', 'python.exe'),
36
- );
37
- }
38
-
39
- for (const candidate of candidates) {
40
- try {
41
- const parts = candidate.split(' ');
42
- const result = spawnSync(parts[0], [...parts.slice(1), '--version'], {
43
- stdio: 'pipe',
44
- timeout: 5000,
45
- });
46
- if (result.status === 0) {
47
- const version = (result.stdout || '').toString().trim();
48
- if (version.includes('3.')) {
49
- return candidate;
50
- }
51
- }
52
- } catch (e) {
53
- // Try next candidate
54
- }
55
- }
56
- return null;
21
+ const packageRoot = path.resolve(__dirname, '..');
22
+ const runtimePython = os.platform() === 'win32'
23
+ ? path.join(packageRoot, '.slm-venv', 'Scripts', 'python.exe')
24
+ : path.join(packageRoot, '.slm-venv', 'bin', 'python');
25
+
26
+ if (!fs.existsSync(runtimePython)) {
27
+ console.error('SuperLocalMemory npm runtime is missing or incomplete.');
28
+ console.error(`Expected the package-owned interpreter at: ${runtimePython}`);
29
+ console.error('Repair it without touching system Python by running:');
30
+ console.error(' npm rebuild superlocalmemory');
31
+ console.error('If Python is missing, install Python 3.11-3.14 first.');
32
+ process.exit(1);
57
33
  }
58
34
 
59
- // Ensure ~/.superlocalmemory/ exists
60
- const SLM_HOME = process.env.SL_MEMORY_PATH || path.join(os.homedir(), '.superlocalmemory');
61
- if (!fs.existsSync(SLM_HOME)) {
62
- fs.mkdirSync(SLM_HOME, { recursive: true });
35
+ const runtimeEnv = {
36
+ ...process.env,
37
+ PYTORCH_MPS_HIGH_WATERMARK_RATIO: '0.0',
38
+ PYTORCH_MPS_MEM_LIMIT: '0',
39
+ PYTORCH_ENABLE_MPS_FALLBACK: '1',
40
+ TOKENIZERS_PARALLELISM: 'false',
41
+ TORCH_DEVICE: 'cpu',
42
+ CUDA_VISIBLE_DEVICES: '',
43
+ };
44
+ // Never let a caller's development checkout override the npm artifact.
45
+ delete runtimeEnv.PYTHONPATH;
46
+
47
+ const result = spawnSync(
48
+ runtimePython,
49
+ ['-m', 'superlocalmemory.cli.main', ...process.argv.slice(2)],
50
+ { stdio: 'inherit', env: runtimeEnv },
51
+ );
52
+
53
+ if (result.error) {
54
+ console.error(`SuperLocalMemory runtime failed to start: ${result.error.message}`);
55
+ process.exit(1);
63
56
  }
64
-
65
- // Find Python
66
- const python = findPython();
67
- if (!python) {
68
- console.error('Error: Python 3.11+ not found.');
69
- console.error('Install Python from https://python.org/downloads/');
70
- process.exit(1);
71
- }
72
-
73
- // Handle --version directly from package.json (Python importlib.metadata
74
- // fails when running via PYTHONPATH instead of pip install)
75
- const args = process.argv.slice(2);
76
- if (args.includes('--version') || args.includes('-v')) {
77
- const pkg = require(path.join(PKG_ROOT, 'package.json'));
78
- console.log(`superlocalmemory ${pkg.version}`);
79
- process.exit(0);
80
- }
81
-
82
- // Launch V3 CLI via Python module
83
- const pythonParts = python.split(' ');
84
- const result = spawnSync(pythonParts[0], [
85
- ...pythonParts.slice(1),
86
- '-m', CLI_MODULE, ...args
87
- ], {
88
- stdio: 'inherit',
89
- env: {
90
- ...process.env,
91
- PYTHONPATH: SRC_DIR + (process.env.PYTHONPATH ? path.delimiter + process.env.PYTHONPATH : ''),
92
- // Prevent PyTorch Metal/MPS GPU memory reservation on Apple Silicon.
93
- // Without these, macOS Activity Monitor shows 3-6 GB for a 40 MB process.
94
- PYTORCH_MPS_HIGH_WATERMARK_RATIO: '0.0',
95
- PYTORCH_MPS_MEM_LIMIT: '0',
96
- PYTORCH_ENABLE_MPS_FALLBACK: '1',
97
- TOKENIZERS_PARALLELISM: 'false',
98
- TORCH_DEVICE: 'cpu',
99
- CUDA_VISIBLE_DEVICES: '',
100
- },
101
- });
102
-
103
- process.exit(result.status || 0);
57
+ process.exit(Number.isInteger(result.status) ? result.status : 1);
@@ -5,8 +5,8 @@
5
5
  "args": [
6
6
  "mcp"
7
7
  ],
8
- "description": "SuperLocalMemory V3 - 100% local memory system",
8
+ "description": "SuperLocalMemory V3 - local-first agent memory",
9
9
  "type": "stdio"
10
10
  }
11
11
  }
12
- }
12
+ }
@@ -12,5 +12,5 @@
12
12
  "step7": "In any chat, click + -> More -> select SuperLocalMemory connector"
13
13
  },
14
14
  "_alternative_transport": "For Streamable HTTP (recommended): slm serve --transport streamable-http --port 8417",
15
- "_note": "100% local -- your MCP server runs on YOUR machine. The tunnel just makes it reachable by ChatGPT servers. All data stays in ~/.superlocalmemory/memory.db"
15
+ "_note": "The MCP server and core memory state run locally. A tunnel transmits requested MCP data to ChatGPT; review that data path and any optional integrations before enabling it."
16
16
  }
@@ -5,8 +5,8 @@
5
5
  "args": [
6
6
  "mcp"
7
7
  ],
8
- "description": "SuperLocalMemory V3 - 100% local memory system for AI assistants",
8
+ "description": "SuperLocalMemory V3 - local-first memory for AI assistants",
9
9
  "type": "stdio"
10
10
  }
11
11
  }
12
- }
12
+ }
@@ -5,8 +5,8 @@
5
5
  "args": [
6
6
  "mcp"
7
7
  ],
8
- "description": "SuperLocalMemory V3 - 100% local memory system for AI assistants",
8
+ "description": "SuperLocalMemory V3 - local-first memory for AI assistants",
9
9
  "type": "stdio"
10
10
  }
11
11
  }
12
- }
12
+ }
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * SuperLocalMemory V3 - Session Start Context Hook
4
4
  * Copyright (c) 2026 Varun Pratap Bhardwaj
5
- * Licensed under Elastic License 2.0
5
+ * Licensed under GNU Affero General Public License v3.0 or later
6
6
  *
7
7
  * Loads recent memories and learned patterns on Claude Code session start.
8
8
  * Outputs context to stderr (Claude Code reads hook stderr as context).
@@ -13,10 +13,14 @@ const { execFile } = require('child_process');
13
13
  const { promisify } = require('util');
14
14
  const path = require('path');
15
15
  const fs = require('fs');
16
+ const os = require('os');
16
17
 
17
18
  const execFileAsync = promisify(execFile);
18
19
 
19
- const MEMORY_DIR = path.join(process.env.HOME, '.superlocalmemory');
20
+ const MEMORY_DIR = process.env.SLM_DATA_DIR
21
+ || process.env.SL_MEMORY_PATH
22
+ || process.env.SLM_HOME
23
+ || path.join(os.homedir(), '.superlocalmemory');
20
24
  const DB_PATH = path.join(MEMORY_DIR, 'memory.db');
21
25
 
22
26
  async function loadSessionContext() {
@@ -2,21 +2,25 @@
2
2
  /**
3
3
  * SuperLocalMemory V3 - Post-Recall Hook
4
4
  * Copyright (c) 2026 Varun Pratap Bhardwaj
5
- * Licensed under Elastic License 2.0
5
+ * Licensed under GNU Affero General Public License v3.0 or later
6
6
  *
7
7
  * Claude Code hook that tracks recall events for implicit signal collection.
8
8
  * This hook fires after the slm-recall skill completes, recording timing
9
9
  * data that the signal inference engine uses to detect satisfaction/dissatisfaction.
10
10
  *
11
11
  * Installation: Automatically registered via install-skills.sh
12
- * All data stays 100% local.
12
+ * The core hook reads local SLM state; the host client and optional integrations
13
+ * retain their own network behavior.
13
14
  */
14
15
 
15
16
  const fs = require('fs');
16
17
  const path = require('path');
17
18
  const os = require('os');
18
19
 
19
- const MEMORY_DIR = path.join(os.homedir(), '.superlocalmemory');
20
+ const MEMORY_DIR = process.env.SLM_DATA_DIR
21
+ || process.env.SL_MEMORY_PATH
22
+ || process.env.SLM_HOME
23
+ || path.join(os.homedir(), '.superlocalmemory');
20
24
  const HOOK_LOG = path.join(MEMORY_DIR, 'recall-events.jsonl');
21
25
 
22
26
  // Parse input from Claude Code hook system
@@ -58,7 +58,8 @@ esac
58
58
 
59
59
  # Get daemon port
60
60
  PORT=8765
61
- PORT_FILE="$HOME/.superlocalmemory/daemon.port"
61
+ DATA_ROOT="${SLM_DATA_DIR:-${SL_MEMORY_PATH:-${SLM_HOME:-$HOME/.superlocalmemory}}}"
62
+ PORT_FILE="$DATA_ROOT/daemon.port"
62
63
  [ -f "$PORT_FILE" ] && PORT=$(cat "$PORT_FILE" 2>/dev/null || echo 8765)
63
64
 
64
65
  # If no python, send basic event (backward compatible)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "3.6.23",
4
- "description": "Information-geometric agent memory with mathematical guarantees. 4-channel retrieval, Fisher-Rao similarity, zero-LLM mode, EU AI Act compliant. Works with Claude, Cursor, Windsurf, and 17+ AI tools.",
3
+ "version": "3.7.1",
4
+ "description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "ai-memory",
7
7
  "claude-ai",
@@ -46,9 +46,9 @@
46
46
  "superlocalmemory": "./bin/slm-npm"
47
47
  },
48
48
  "scripts": {
49
- "build:plugin": "node scripts/build-plugin.js",
50
- "check:plugin": "node scripts/build-plugin.js --check",
51
- "prepack": "node scripts/build-plugin.js && node scripts/prepack.js",
49
+ "build:plugin": "node scripts/build-plugin.mjs",
50
+ "check:plugin": "node scripts/build-plugin.mjs --check",
51
+ "prepack": "node scripts/build-plugin.mjs && node scripts/prepack.js",
52
52
  "postinstall": "node scripts/postinstall.js",
53
53
  "preuninstall": "node scripts/preuninstall.js",
54
54
  "test": "node --test 'tests/ui/*.mjs'"
@@ -63,10 +63,18 @@
63
63
  "win32"
64
64
  ],
65
65
  "files": [
66
- "bin/",
67
- "src/",
68
- "ide/",
69
- "scripts/",
66
+ "bin/slm-npm",
67
+ "src/superlocalmemory/",
68
+ "!src/**/__pycache__/",
69
+ "!src/**/*.pyc",
70
+ "!src/**/*.pyo",
71
+ "ide/completions/",
72
+ "ide/configs/",
73
+ "ide/hooks/",
74
+ "scripts/postinstall.js",
75
+ "scripts/postinstall-interactive.js",
76
+ "scripts/postinstall/validation.js",
77
+ "scripts/preuninstall.js",
70
78
  ".claude-plugin/",
71
79
  "plugin/",
72
80
  "plugin-src/",
@@ -16,5 +16,5 @@
16
16
  "mcpServers": "./.mcp.json",
17
17
  "name": "superlocalmemory",
18
18
  "repository": "https://github.com/qualixar/superlocalmemory",
19
- "version": "3.6.23"
19
+ "version": "3.7.1"
20
20
  }
@@ -1,6 +1,6 @@
1
1
  # _GENERATED — DO NOT HAND-EDIT
2
2
 
3
- This directory is generated by `scripts/build-plugin.js` from `plugin-src/`.
3
+ This directory is generated by `scripts/build-plugin.mjs` from `plugin-src/`.
4
4
  Run `npm run build:plugin` to regenerate.
5
5
  Run `npm run check:plugin` (or `--check`) in CI to verify in-sync.
6
6
  Source of truth: `plugin-src/skills/`, `plugin-src/manifest.json`.
@@ -10,7 +10,7 @@ model: inherit
10
10
  ---
11
11
 
12
12
  # Role
13
- You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. SLM is 100% local; every tool runs on the user's machine.
13
+ You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. Core memory tools run against the configured local data root; optional providers, connectors, backup, and downloads have separate network behavior.
14
14
 
15
15
  # When to act
16
16
  When the main agent: starts a session and hasn't loaded project context; is about to or just made a decision worth persisting; asks "what did we decide about X"; gets recall results that look irrelevant/empty.
@@ -1 +1 @@
1
- superlocalmemory==3.6.23
1
+ superlocalmemory==3.7.1
@@ -63,7 +63,7 @@ session_init(
63
63
  ### What it does
64
64
 
65
65
  1. Derives a search query from `project_path` (or uses your explicit `query`).
66
- 2. Runs a 2-tier recall: full 6-channel via daemon (primary) or FTS5 BM25
66
+ 2. Runs a 2-tier recall: full daemon retrieval (primary) or FTS5 BM25
67
67
  (emergency fallback if daemon is unreachable).
68
68
  3. Merges any pinned "core memory" facts with the recall results.
69
69
  4. Applies an age gate — memories older than `max_age_days` are suppressed
@@ -10,7 +10,7 @@ model: inherit
10
10
  ---
11
11
 
12
12
  # Role
13
- You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. SLM is 100% local; every tool runs on the user's machine.
13
+ You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. Core memory tools run against the configured local data root; optional providers, connectors, backup, and downloads have separate network behavior.
14
14
 
15
15
  # When to act
16
16
  When the main agent: starts a session and hasn't loaded project context; is about to or just made a decision worth persisting; asks "what did we decide about X"; gets recall results that look irrelevant/empty.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.6.23",
2
+ "version": "3.7.1",
3
3
  "pluginName": "superlocalmemory",
4
4
  "displayName": "SuperLocalMemory",
5
5
  "repository": "https://github.com/qualixar/superlocalmemory",
@@ -1 +1 @@
1
- superlocalmemory==3.6.23
1
+ superlocalmemory==3.7.1
@@ -1,7 +1,7 @@
1
1
  # SuperLocalMemory — Agent Rules
2
2
 
3
3
  > Drop into any IDE agent config or AGENTS.md to give agents disciplined SLM usage.
4
- > SLM is local-first: every MCP tool runs on the user's machine, zero cloud calls.
4
+ > SLM is local-first: MCP memory tools use the configured local runtime. Optional providers, connectors, backup, and downloads have separate network behavior.
5
5
  > Prefer MCP tools when the server is running; use the CLI fallback table when not.
6
6
 
7
7
  ---
@@ -63,7 +63,7 @@ session_init(
63
63
  ### What it does
64
64
 
65
65
  1. Derives a search query from `project_path` (or uses your explicit `query`).
66
- 2. Runs a 2-tier recall: full 6-channel via daemon (primary) or FTS5 BM25
66
+ 2. Runs a 2-tier recall: full daemon retrieval (primary) or FTS5 BM25
67
67
  (emergency fallback if daemon is unreachable).
68
68
  3. Merges any pinned "core memory" facts with the recall results.
69
69
  4. Applies an age gate — memories older than `max_age_days` are suppressed
package/pyproject.toml CHANGED
@@ -1,9 +1,10 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.6.23"
4
- description = "Information-geometric agent memory with mathematical guarantees"
3
+ version = "3.7.1"
4
+ description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
- license = {text = "AGPL-3.0-or-later"}
6
+ license = "AGPL-3.0-or-later"
7
+ license-files = ["LICENSE", "NOTICE"]
7
8
  requires-python = ">=3.11,<3.15"
8
9
  authors = [
9
10
  {name = "Varun Pratap Bhardwaj", email = "admin@superlocalmemory.com"},
@@ -15,7 +16,6 @@ keywords = [
15
16
  classifiers = [
16
17
  "Development Status :: 4 - Beta",
17
18
  "Intended Audience :: Developers",
18
- "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
19
19
  "Operating System :: OS Independent",
20
20
  "Operating System :: MacOS",
21
21
  "Operating System :: Microsoft :: Windows",
@@ -73,6 +73,12 @@ dependencies = [
73
73
  "scikit-learn==1.8.0",
74
74
  # Vector KNN extension for the semantic channel.
75
75
  "sqlite-vec==0.1.9",
76
+ # Scale Engine projections. These ship with the base install so every
77
+ # fresh Python user can prepare them on day one. They remain inactive
78
+ # until `slm db scale prepare -> verify -> promote` proves parity with
79
+ # canonical SQLite; dependency installation never migrates user data.
80
+ "lancedb==0.30.2",
81
+ "pycozo[embedded]==0.3.0",
76
82
  # v3.6.10: LLMLingua-2 prose compression (aggressive mode, opt-in at runtime).
77
83
  # Hard dependency so `pip install superlocalmemory` ships compression-ready;
78
84
  # the ~560MB model downloads on first setup/warmup (fail-open). Verified the
@@ -108,6 +114,18 @@ learning = [
108
114
  performance = [
109
115
  "orjson>=3.9.0",
110
116
  ]
117
+ lancedb = [
118
+ "lancedb==0.30.2",
119
+ ]
120
+ cozo = [
121
+ "pycozo[embedded]==0.3.0",
122
+ ]
123
+ # Backwards-compatible explicit install target for automation and docs. The
124
+ # packages are also base dependencies from v3.7 onward.
125
+ scale = [
126
+ "lancedb==0.30.2",
127
+ "pycozo[embedded]==0.3.0",
128
+ ]
111
129
  ingestion = [
112
130
  "keyring>=25.0.0",
113
131
  "google-auth-oauthlib>=1.2.0",
@@ -115,13 +133,16 @@ ingestion = [
115
133
  "icalendar>=6.0.0",
116
134
  ]
117
135
  full = [
118
- "superlocalmemory[search,ui,learning,performance,ingestion,injection]",
136
+ "superlocalmemory[search,ui,learning,performance,ingestion,injection,scale]",
119
137
  ]
120
138
  dev = [
121
139
  "pytest>=8.0",
122
140
  "pytest-cov>=4.1",
123
141
  "pytest-asyncio>=0.21",
124
142
  "sqlite-vec>=0.1.6",
143
+ # Starlette TestClient's maintained synchronous backend. Test-only: the
144
+ # product runtime continues to use the separately pinned httpx client.
145
+ "httpx2==2.5.0",
125
146
  ]
126
147
 
127
148
  [project.urls]
@@ -134,25 +155,35 @@ Issues = "https://github.com/qualixar/superlocalmemory/issues"
134
155
  slm = "superlocalmemory.cli.main:main"
135
156
 
136
157
  [build-system]
137
- requires = ["setuptools>=68.0", "wheel"]
158
+ requires = ["setuptools>=77.0.3", "wheel"]
138
159
  build-backend = "setuptools.build_meta"
139
160
 
140
161
  [tool.setuptools.packages.find]
141
162
  where = ["src"]
142
163
 
143
164
  [tool.setuptools.package-data]
144
- superlocalmemory = ["ui/**/*"]
165
+ superlocalmemory = ["ui/**/*", "optimize/NOTICE"]
166
+
167
+ [tool.setuptools.data-files]
168
+ "share/superlocalmemory/codex/skills/slm-cache" = ["plugin-src/skills/slm-cache/SKILL.md"]
169
+ "share/superlocalmemory/codex/skills/slm-compress" = ["plugin-src/skills/slm-compress/SKILL.md"]
170
+ "share/superlocalmemory/codex/skills/slm-graph" = ["plugin-src/skills/slm-graph/SKILL.md"]
171
+ "share/superlocalmemory/codex/skills/slm-recall" = ["plugin-src/skills/slm-recall/SKILL.md"]
172
+ "share/superlocalmemory/codex/skills/slm-remember" = ["plugin-src/skills/slm-remember/SKILL.md"]
173
+ "share/superlocalmemory/codex/skills/slm-session" = ["plugin-src/skills/slm-session/SKILL.md"]
174
+ "share/superlocalmemory/codex/skills/slm-status" = ["plugin-src/skills/slm-status/SKILL.md"]
145
175
 
146
176
  [tool.pytest.ini_options]
147
177
  testpaths = ["tests"]
148
178
  pythonpath = ["src"]
149
- addopts = "-p no:cacheprovider -p no:subtests -m 'not slow and not ollama and not benchmark'"
179
+ addopts = "-p no:cacheprovider -p no:subtests -m 'not slow and not ollama and not benchmark and not native'"
150
180
  asyncio_mode = "auto"
151
181
  faulthandler_timeout = 0
152
182
  markers = [
153
183
  "slow: marks tests as slow — real engine/model loading (run with: pytest -m slow)",
154
184
  "ollama: marks tests that require a running Ollama instance",
155
185
  "benchmark: marks CI-only evo-memory benchmark tests (run with: pytest tests/test_benchmarks/ -m benchmark)",
186
+ "native: marks optional native-backend tests that run in a dedicated process lane",
156
187
  "asyncio: marks tests as async — runs via pytest-asyncio (auto-mode in this project)",
157
188
  ]
158
189
  filterwarnings = [
@@ -192,6 +223,7 @@ select = ["E", "F", "I", "W"]
192
223
  [dependency-groups]
193
224
  dev = [
194
225
  "build>=1.4.0",
226
+ "httpx2==2.5.0",
195
227
  "pytest>=9.0.2",
196
228
  "pytest-asyncio>=0.21",
197
229
  "twine>=6.2.0",