superlocalmemory 3.7.8 → 3.8.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 (280) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/ATTRIBUTION.md +1 -3
  3. package/CHANGELOG.md +129 -0
  4. package/README.md +205 -123
  5. package/package.json +12 -3
  6. package/plugin/.claude-plugin/plugin.json +2 -3
  7. package/plugin/CLAUDE.md +8 -8
  8. package/plugin/agents/slm-governance-advisor.md +80 -0
  9. package/plugin/agents/slm-loop-runner.md +71 -0
  10. package/plugin/agents/slm-memory-advisor.md +10 -5
  11. package/plugin/agents/slm-optimize-advisor.md +9 -3
  12. package/plugin/commands/slm-loop.md +31 -0
  13. package/plugin/hooks/hooks.json +79 -0
  14. package/plugin/requirements.txt +1 -1
  15. package/plugin/scripts/slm-launch +46 -7
  16. package/plugin/settings.json +9 -0
  17. package/plugin/skills/slm-cache/SKILL.md +9 -1
  18. package/plugin/skills/slm-compress/SKILL.md +8 -1
  19. package/plugin/skills/slm-governance/SKILL.md +248 -0
  20. package/plugin/skills/slm-graph/SKILL.md +17 -3
  21. package/plugin/skills/slm-loop/SKILL.md +99 -0
  22. package/plugin/skills/slm-mesh/SKILL.md +282 -0
  23. package/plugin/skills/slm-profile/SKILL.md +148 -0
  24. package/plugin/skills/slm-recall/SKILL.md +46 -10
  25. package/plugin/skills/slm-remember/SKILL.md +48 -1
  26. package/plugin/skills/slm-scope/SKILL.md +176 -0
  27. package/plugin/skills/slm-session/SKILL.md +24 -1
  28. package/plugin/skills/slm-status/SKILL.md +18 -1
  29. package/plugin-src/rules/AGENTS.md +57 -18
  30. package/plugin-src/skills/slm-cache/SKILL.md +9 -1
  31. package/plugin-src/skills/slm-compress/SKILL.md +8 -1
  32. package/plugin-src/skills/slm-graph/SKILL.md +17 -3
  33. package/plugin-src/skills/slm-recall/SKILL.md +46 -10
  34. package/plugin-src/skills/slm-remember/SKILL.md +48 -1
  35. package/plugin-src/skills/slm-session/SKILL.md +24 -1
  36. package/plugin-src/skills/slm-status/SKILL.md +18 -1
  37. package/pyproject.toml +2 -1
  38. package/scripts/postinstall/validation.js +2 -0
  39. package/scripts/postinstall-interactive.js +74 -2
  40. package/src/superlocalmemory/__init__.py +1 -1
  41. package/src/superlocalmemory/access/__init__.py +3 -0
  42. package/src/superlocalmemory/access/rbac.py +477 -0
  43. package/src/superlocalmemory/cli/commands.py +228 -17
  44. package/src/superlocalmemory/cli/compress_cmd.py +17 -7
  45. package/src/superlocalmemory/cli/daemon.py +7 -0
  46. package/src/superlocalmemory/cli/loop_cmd.py +187 -0
  47. package/src/superlocalmemory/cli/main.py +49 -8
  48. package/src/superlocalmemory/cli/mesh_cmd.py +38 -0
  49. package/src/superlocalmemory/cli/optimize_cmd.py +3 -0
  50. package/src/superlocalmemory/cli/pending_store.py +49 -13
  51. package/src/superlocalmemory/cli/proxy_cmd.py +4 -0
  52. package/src/superlocalmemory/cli/scale_engine_cmd.py +6 -0
  53. package/src/superlocalmemory/cli/setup_wizard.py +22 -13
  54. package/src/superlocalmemory/cli/version_banner.py +17 -3
  55. package/src/superlocalmemory/compliance/audit.py +6 -0
  56. package/src/superlocalmemory/compliance/gdpr.py +128 -138
  57. package/src/superlocalmemory/compliance/retention.py +176 -45
  58. package/src/superlocalmemory/core/backend_orchestrator.py +23 -59
  59. package/src/superlocalmemory/core/community_summary.py +267 -0
  60. package/src/superlocalmemory/core/config.py +216 -3
  61. package/src/superlocalmemory/core/consolidation_engine.py +95 -22
  62. package/src/superlocalmemory/core/context_cache.py +61 -18
  63. package/src/superlocalmemory/core/embedding_worker.py +21 -7
  64. package/src/superlocalmemory/core/embeddings.py +131 -46
  65. package/src/superlocalmemory/core/engine.py +41 -22
  66. package/src/superlocalmemory/core/engine_ingestion.py +359 -43
  67. package/src/superlocalmemory/core/engine_wiring.py +13 -0
  68. package/src/superlocalmemory/core/entity_community.py +178 -0
  69. package/src/superlocalmemory/core/graph_analyzer.py +39 -2
  70. package/src/superlocalmemory/core/graph_pruner.py +13 -8
  71. package/src/superlocalmemory/core/ingestion_command.py +134 -25
  72. package/src/superlocalmemory/core/injection.py +12 -7
  73. package/src/superlocalmemory/core/key_expander.py +138 -0
  74. package/src/superlocalmemory/core/maintenance.py +23 -0
  75. package/src/superlocalmemory/core/maintenance_scheduler.py +17 -7
  76. package/src/superlocalmemory/core/modes.py +1 -1
  77. package/src/superlocalmemory/core/mutations.py +2 -2
  78. package/src/superlocalmemory/core/pii.py +105 -0
  79. package/src/superlocalmemory/core/progressive_abstraction.py +208 -0
  80. package/src/superlocalmemory/core/recall_pipeline.py +7 -3
  81. package/src/superlocalmemory/core/recall_worker.py +20 -6
  82. package/src/superlocalmemory/core/scale_engine.py +60 -1
  83. package/src/superlocalmemory/core/security_primitives.py +40 -2
  84. package/src/superlocalmemory/core/store_pipeline.py +186 -29
  85. package/src/superlocalmemory/core/worker_pool.py +21 -6
  86. package/src/superlocalmemory/encoding/entity_reflexion.py +200 -0
  87. package/src/superlocalmemory/encoding/entity_resolver.py +34 -24
  88. package/src/superlocalmemory/encoding/fact_extractor.py +26 -1
  89. package/src/superlocalmemory/encoding/temporal_validator.py +64 -1
  90. package/src/superlocalmemory/evolution/evolution_store.py +122 -45
  91. package/src/superlocalmemory/evolution/llm_dispatch.py +12 -1
  92. package/src/superlocalmemory/evolution/model_selection.py +160 -0
  93. package/src/superlocalmemory/evolution/mutation_generator.py +16 -0
  94. package/src/superlocalmemory/evolution/skill_evolver.py +127 -42
  95. package/src/superlocalmemory/evolution/triggers.py +22 -13
  96. package/src/superlocalmemory/graph/cozo_backend.py +43 -20
  97. package/src/superlocalmemory/hooks/adapter_base.py +5 -1
  98. package/src/superlocalmemory/hooks/auto_recall.py +13 -1
  99. package/src/superlocalmemory/hooks/claude_code_hooks.py +11 -0
  100. package/src/superlocalmemory/hooks/codex_assets.py +64 -5
  101. package/src/superlocalmemory/hooks/hook_daemon.py +20 -3
  102. package/src/superlocalmemory/hooks/hook_handlers.py +6 -1
  103. package/src/superlocalmemory/hooks/memory_protocol.py +54 -0
  104. package/src/superlocalmemory/hooks/portable_kit.py +148 -3
  105. package/src/superlocalmemory/infra/backup.py +12 -1
  106. package/src/superlocalmemory/infra/daemon_identity.py +40 -4
  107. package/src/superlocalmemory/infra/data_root.py +43 -4
  108. package/src/superlocalmemory/infra/event_bus.py +107 -24
  109. package/src/superlocalmemory/infra/rate_limiter.py +93 -0
  110. package/src/superlocalmemory/ingestion/adapter_manager.py +4 -1
  111. package/src/superlocalmemory/ingestion/credentials.py +1 -1
  112. package/src/superlocalmemory/learning/cross_project.py +28 -19
  113. package/src/superlocalmemory/learning/model_rollback.py +3 -0
  114. package/src/superlocalmemory/learning/ranker_retrain_online.py +2 -0
  115. package/src/superlocalmemory/learning/reward.py +50 -0
  116. package/src/superlocalmemory/learning/reward_proxy.py +42 -9
  117. package/src/superlocalmemory/learning/source_quality.py +523 -1
  118. package/src/superlocalmemory/loops/__init__.py +56 -0
  119. package/src/superlocalmemory/loops/budget.py +58 -0
  120. package/src/superlocalmemory/loops/engine.py +164 -0
  121. package/src/superlocalmemory/loops/ledger.py +263 -0
  122. package/src/superlocalmemory/loops/models.py +152 -0
  123. package/src/superlocalmemory/loops/rules.py +52 -0
  124. package/src/superlocalmemory/mcp/_daemon_proxy.py +3 -0
  125. package/src/superlocalmemory/mcp/_pool_adapter.py +2 -0
  126. package/src/superlocalmemory/mcp/profiles.py +103 -0
  127. package/src/superlocalmemory/mcp/server.py +32 -79
  128. package/src/superlocalmemory/mcp/tools_active.py +4 -7
  129. package/src/superlocalmemory/mcp/tools_code_graph.py +51 -5
  130. package/src/superlocalmemory/mcp/tools_core.py +12 -4
  131. package/src/superlocalmemory/mcp/tools_evolution.py +6 -3
  132. package/src/superlocalmemory/mcp/tools_learning.py +2 -2
  133. package/src/superlocalmemory/mcp/tools_loops.py +300 -0
  134. package/src/superlocalmemory/mcp/tools_mesh.py +140 -4
  135. package/src/superlocalmemory/mcp/tools_optimize.py +15 -8
  136. package/src/superlocalmemory/mesh/broker.py +237 -129
  137. package/src/superlocalmemory/mesh/remote_sync.py +50 -8
  138. package/src/superlocalmemory/optimize/NOTICE +1 -6
  139. package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +1 -4
  140. package/src/superlocalmemory/optimize/adapters/openai_adapter.py +1 -4
  141. package/src/superlocalmemory/optimize/cache/semantic.py +27 -19
  142. package/src/superlocalmemory/optimize/compress/align.py +32 -26
  143. package/src/superlocalmemory/optimize/compress/ccr.py +14 -71
  144. package/src/superlocalmemory/optimize/compress/router.py +105 -22
  145. package/src/superlocalmemory/optimize/config/defaults.py +1 -1
  146. package/src/superlocalmemory/optimize/config/schema.py +87 -4
  147. package/src/superlocalmemory/optimize/metrics/counters.py +13 -4
  148. package/src/superlocalmemory/optimize/metrics/estimator.py +0 -3
  149. package/src/superlocalmemory/optimize/proxy/_helpers.py +31 -4
  150. package/src/superlocalmemory/optimize/storage/db.py +38 -9
  151. package/src/superlocalmemory/optimize/storage/schema.py +10 -0
  152. package/src/superlocalmemory/parameterization/pattern_extractor.py +6 -3
  153. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  154. package/src/superlocalmemory/retrieval/bm25_channel.py +68 -10
  155. package/src/superlocalmemory/retrieval/engine.py +221 -47
  156. package/src/superlocalmemory/retrieval/entity_channel.py +7 -5
  157. package/src/superlocalmemory/retrieval/hopfield_channel.py +9 -2
  158. package/src/superlocalmemory/retrieval/reranker.py +3 -4
  159. package/src/superlocalmemory/retrieval/semantic_channel.py +114 -21
  160. package/src/superlocalmemory/retrieval/spreading_activation.py +11 -2
  161. package/src/superlocalmemory/retrieval/temporal_channel.py +48 -9
  162. package/src/superlocalmemory/retrieval/temporal_frame.py +102 -0
  163. package/src/superlocalmemory/retrieval/temporal_validity_filter.py +135 -0
  164. package/src/superlocalmemory/retrieval/time_window.py +181 -0
  165. package/src/superlocalmemory/server/api.py +4 -4
  166. package/src/superlocalmemory/server/config_file.py +90 -0
  167. package/src/superlocalmemory/server/origin.py +50 -0
  168. package/src/superlocalmemory/server/profile_runtime.py +125 -8
  169. package/src/superlocalmemory/server/rbac_enforce.py +142 -0
  170. package/src/superlocalmemory/server/recall_health.py +24 -3
  171. package/src/superlocalmemory/server/recall_serializer.py +19 -1
  172. package/src/superlocalmemory/server/routes/abstraction.py +115 -0
  173. package/src/superlocalmemory/server/routes/agents.py +128 -38
  174. package/src/superlocalmemory/server/routes/backup.py +317 -70
  175. package/src/superlocalmemory/server/routes/behavioral.py +349 -71
  176. package/src/superlocalmemory/server/routes/brain.py +69 -12
  177. package/src/superlocalmemory/server/routes/chat.py +10 -5
  178. package/src/superlocalmemory/server/routes/compliance.py +171 -21
  179. package/src/superlocalmemory/server/routes/config_api.py +438 -0
  180. package/src/superlocalmemory/server/routes/data_io.py +30 -8
  181. package/src/superlocalmemory/server/routes/entity.py +108 -26
  182. package/src/superlocalmemory/server/routes/events.py +24 -8
  183. package/src/superlocalmemory/server/routes/evolution.py +189 -68
  184. package/src/superlocalmemory/server/routes/helpers.py +16 -1
  185. package/src/superlocalmemory/server/routes/ingest.py +7 -4
  186. package/src/superlocalmemory/server/routes/insights.py +3 -3
  187. package/src/superlocalmemory/server/routes/learning.py +289 -118
  188. package/src/superlocalmemory/server/routes/learning_telemetry.py +153 -0
  189. package/src/superlocalmemory/server/routes/lifecycle.py +59 -8
  190. package/src/superlocalmemory/server/routes/memories.py +182 -57
  191. package/src/superlocalmemory/server/routes/mesh.py +200 -31
  192. package/src/superlocalmemory/server/routes/optimize.py +33 -1
  193. package/src/superlocalmemory/server/routes/prewarm.py +2 -0
  194. package/src/superlocalmemory/server/routes/profiles.py +63 -17
  195. package/src/superlocalmemory/server/routes/ratelimit.py +132 -0
  196. package/src/superlocalmemory/server/routes/rbac.py +367 -0
  197. package/src/superlocalmemory/server/routes/stats.py +103 -158
  198. package/src/superlocalmemory/server/routes/tiers.py +11 -9
  199. package/src/superlocalmemory/server/routes/token.py +3 -13
  200. package/src/superlocalmemory/server/routes/v3_api.py +247 -89
  201. package/src/superlocalmemory/server/routes/ws.py +5 -2
  202. package/src/superlocalmemory/server/security_middleware.py +12 -5
  203. package/src/superlocalmemory/server/ui.py +20 -5
  204. package/src/superlocalmemory/server/unified_daemon.py +827 -72
  205. package/src/superlocalmemory/server/write_identity.py +38 -8
  206. package/src/superlocalmemory/storage/database.py +265 -53
  207. package/src/superlocalmemory/storage/migration_runner.py +132 -1
  208. package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +5 -0
  209. package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +108 -0
  210. package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +86 -0
  211. package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +194 -0
  212. package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +87 -0
  213. package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +90 -0
  214. package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +136 -0
  215. package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +163 -0
  216. package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +270 -0
  217. package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +137 -0
  218. package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +93 -0
  219. package/src/superlocalmemory/storage/migrations/__init__.py +4 -0
  220. package/src/superlocalmemory/storage/models.py +4 -0
  221. package/src/superlocalmemory/storage/schema.py +136 -1
  222. package/src/superlocalmemory/storage/schema_v32.py +2 -0
  223. package/src/superlocalmemory/storage/schema_v343.py +24 -12
  224. package/src/superlocalmemory/storage/schema_v347.py +4 -0
  225. package/src/superlocalmemory/trust/gate.py +49 -8
  226. package/src/superlocalmemory/ui/assets/slm-icon-white.svg +64 -0
  227. package/src/superlocalmemory/ui/assets/slm-icon.svg +36 -0
  228. package/src/superlocalmemory/ui/css/design-system.css +621 -0
  229. package/src/superlocalmemory/ui/css/neural-glass.css +6 -0
  230. package/src/superlocalmemory/ui/css/od-bridge.css +158 -0
  231. package/src/superlocalmemory/ui/favicon.svg +35 -4
  232. package/src/superlocalmemory/ui/index.html +303 -173
  233. package/src/superlocalmemory/ui/js/brain.js +5 -20
  234. package/src/superlocalmemory/ui/js/core.js +100 -41
  235. package/src/superlocalmemory/ui/js/dashboard.js +403 -65
  236. package/src/superlocalmemory/ui/js/event-delegation.js +102 -0
  237. package/src/superlocalmemory/ui/js/knowledge-graph.js +11 -11
  238. package/src/superlocalmemory/ui/js/math-health.js +1 -1
  239. package/src/superlocalmemory/ui/js/memories.js +15 -4
  240. package/src/superlocalmemory/ui/js/memory-chat.js +7 -7
  241. package/src/superlocalmemory/ui/js/ng-entities.js +6 -8
  242. package/src/superlocalmemory/ui/js/ng-ingestion.js +4 -4
  243. package/src/superlocalmemory/ui/js/ng-mesh.js +4 -9
  244. package/src/superlocalmemory/ui/js/ng-shell.js +8 -8
  245. package/src/superlocalmemory/ui/js/ng-skills.js +54 -2
  246. package/src/superlocalmemory/ui/js/od-agents.js +544 -0
  247. package/src/superlocalmemory/ui/js/od-auth-gate.js +257 -0
  248. package/src/superlocalmemory/ui/js/od-backup.js +871 -0
  249. package/src/superlocalmemory/ui/js/od-brain.js +816 -0
  250. package/src/superlocalmemory/ui/js/od-entities.js +579 -0
  251. package/src/superlocalmemory/ui/js/od-graph.js +600 -0
  252. package/src/superlocalmemory/ui/js/od-health.js +539 -0
  253. package/src/superlocalmemory/ui/js/od-mcp.js +508 -0
  254. package/src/superlocalmemory/ui/js/od-memories.js +929 -0
  255. package/src/superlocalmemory/ui/js/od-mesh.js +553 -0
  256. package/src/superlocalmemory/ui/js/od-operations.js +1250 -0
  257. package/src/superlocalmemory/ui/js/od-optimize.js +787 -0
  258. package/src/superlocalmemory/ui/js/od-settings.js +1107 -0
  259. package/src/superlocalmemory/ui/js/od-shell.js +809 -0
  260. package/src/superlocalmemory/ui/js/od-skills.js +600 -0
  261. package/src/superlocalmemory/ui/js/od-team.js +258 -0
  262. package/src/superlocalmemory/ui/js/profiles.js +159 -46
  263. package/src/superlocalmemory/ui/js/settings.js +17 -3
  264. package/src/superlocalmemory/ui/js/timeline.js +34 -5
  265. package/src/superlocalmemory/ui/js/trust-dashboard.js +2 -2
  266. package/src/superlocalmemory/vector/lancedb_backend.py +8 -6
  267. package/plugin-src/.mcp.json +0 -12
  268. package/plugin-src/agents/slm-memory-advisor.md +0 -44
  269. package/plugin-src/agents/slm-optimize-advisor.md +0 -38
  270. package/plugin-src/hooks/.gitkeep +0 -0
  271. package/plugin-src/hooks/hooks.json +0 -23
  272. package/plugin-src/manifest.json +0 -25
  273. package/plugin-src/requirements.txt +0 -1
  274. package/plugin-src/rules/CLAUDE.md.fragment +0 -44
  275. package/plugin-src/scripts/ensure-venv.bat +0 -122
  276. package/plugin-src/scripts/ensure-venv.sh +0 -105
  277. package/plugin-src/scripts/slm-launch +0 -23
  278. package/plugin-src/scripts/slm-launch.bat +0 -23
  279. package/plugin-src/settings.json +0 -16
  280. package/src/superlocalmemory/learning/behavioral_listener.py +0 -94
@@ -50,7 +50,7 @@ recall(
50
50
  query="authentication strategy decision",
51
51
  limit=20, # default 20; reduce to 5 for quick pre-task checks
52
52
  session_id="<sid>", # pass the session_id returned by session_init
53
- fast=False, # default False; True skips SpreadingActivation channel
53
+ fast=False, # default False; True enables faster, reduced-channel retrieval
54
54
  )
55
55
  ```
56
56
 
@@ -101,8 +101,8 @@ correctly, but feedback is not attributed to the session.
101
101
  ### 3. Fast mode
102
102
 
103
103
  Use `fast=True` for pre-tool-call checks where sub-second response matters.
104
- This skips the SpreadingActivation channel. The remaining channels semantic,
105
- lexical, temporal, and structural still run.
104
+ This enables a faster, reduced-channel mode. Core semantic and keyword channels
105
+ always run; additional graph and contextual channels are skipped.
106
106
 
107
107
  ```
108
108
  recall(query="rate limiting approach", limit=5, session_id="<sid>", fast=True)
@@ -142,12 +142,12 @@ once you have the `fact_id` for full content.
142
142
 
143
143
  ## How multi-channel retrieval works
144
144
 
145
- `recall` runs five candidate producers in parallel — semantic vector similarity,
146
- lexical BM25, temporal recency, spreading activation, and Hopfield — then fuses
147
- them with Reciprocal Rank Fusion (RRF), applies a reranker, and layers an
148
- optional entity-graph post-fusion score enhancement. The `channel_weights` field in the
149
- response shows how each channel contributed for that query. Weights adapt over
150
- time based on engagement signals attributed via `session_id`.
145
+ `recall` runs multiple candidate producers in parallel — semantic vector similarity,
146
+ keyword matching, temporal recency weighting, and contextual graph channels — then
147
+ fuses and reranks the combined results, with an optional entity-graph score
148
+ enhancement. The `channel_weights` field in the response shows how each channel
149
+ contributed for that query. Weights adapt over time based on engagement signals
150
+ attributed via `session_id`.
151
151
 
152
152
  To inspect per-channel scores for a real query against your own data:
153
153
 
@@ -202,4 +202,40 @@ trusts that what you surface came from the store.
202
202
 
203
203
  ---
204
204
 
205
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*
205
+ ## Multi-scope retrieval (v3.6.15+, opt-in)
206
+
207
+ By default `recall` returns only memories in the active profile (personal scope).
208
+ To also surface memories shared from other profiles, pass the scope flags:
209
+
210
+ ```
211
+ recall(
212
+ query="...",
213
+ include_global=True, # include global-scope memories (visible to all profiles)
214
+ include_shared=True, # include shared-scope memories (shared with this profile)
215
+ session_id="<sid>",
216
+ )
217
+ ```
218
+
219
+ Scope flags are **off by default**. Only enable them when the user explicitly asks
220
+ to see shared or global facts. See `slm-scope` for the full sharing model.
221
+
222
+ ---
223
+
224
+ ## Profile-aware retrieval (v3.8.0+)
225
+
226
+ `recall` always queries the currently active profile. To query a different
227
+ workspace, use `switch_profile` (requires `code`, `full`, or `power` MCP profile)
228
+ before recalling, then switch back. See `slm-profile` for workspace switching.
229
+
230
+ ---
231
+
232
+ ## Related skills
233
+
234
+ - `slm-remember` — store the decisions and facts that recall surfaces later
235
+ - `slm-session` — session lifecycle (must call before first recall)
236
+ - `slm-scope` — multi-scope sharing model (personal / shared / global)
237
+ - `slm-profile` — workspace isolation and profile switching
238
+
239
+ ---
240
+
241
+ *SuperLocalMemory v3.8.1 · Qualixar · AGPL-3.0-or-later*
@@ -191,4 +191,51 @@ slm remember "<content>" --scope shared --shared-with alice,bob
191
191
 
192
192
  ---
193
193
 
194
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*
194
+ ## Multi-scope sharing (v3.6.15+, opt-in)
195
+
196
+ Every `remember` call defaults to `personal` scope — private to the active profile.
197
+ To share a fact with other profiles on the same machine, set the `scope` parameter:
198
+
199
+ ```
200
+ # Share with every profile on this machine
201
+ remember(
202
+ content="API rate limit is 100 req/min per tenant",
203
+ tags="api,limits,shared",
204
+ project="platform",
205
+ scope="global", # visible to all profiles
206
+ session_id="<sid>",
207
+ )
208
+
209
+ # Share with specific profiles only
210
+ remember(
211
+ content="Staging DB migration runs Fridays 22:00 UTC",
212
+ tags="db,ops",
213
+ scope="shared",
214
+ shared_with="work-profile,devops-profile",
215
+ session_id="<sid>",
216
+ )
217
+ ```
218
+
219
+ **Only set scope when the user explicitly asks to share.** The default
220
+ `personal` scope is identical to single-profile SLM. See `slm-scope` for the
221
+ complete sharing model and when to use each scope.
222
+
223
+ ---
224
+
225
+ ## Profile-aware storage (v3.8.0+)
226
+
227
+ `remember` always stores in the active profile's namespace. To write to a
228
+ different workspace, use `switch_profile` first. See `slm-profile`.
229
+
230
+ ---
231
+
232
+ ## Related skills
233
+
234
+ - `slm-recall` — retrieve what was remembered
235
+ - `slm-session` — session lifecycle; session_id is required for attribution
236
+ - `slm-scope` — complete guide to personal / shared / global scopes
237
+ - `slm-profile` — workspace isolation and profile switching
238
+
239
+ ---
240
+
241
+ *SuperLocalMemory v3.8.1 · Qualixar · AGPL-3.0-or-later*
@@ -204,4 +204,27 @@ slm doctor [--json] # preflight check including daemon and embedding worker
204
204
 
205
205
  ---
206
206
 
207
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*
207
+ ## Profile context (v3.8.0+)
208
+
209
+ `session_init` operates on the currently active profile. If you need to start
210
+ a session on a different workspace, call `switch_profile` (requires `code`,
211
+ `full`, or `power` MCP profile) before `session_init`, then call `session_init`
212
+ for that workspace. See `slm-profile` for workspace switching.
213
+
214
+ The returned `memories` array reflects facts stored in the active profile only.
215
+ To also surface shared or global facts in the initial context, pass the query
216
+ explicitly and call `recall` with `include_global`/`include_shared` after
217
+ `session_init`. See `slm-scope` for the sharing model.
218
+
219
+ ---
220
+
221
+ ## Related skills
222
+
223
+ - `slm-recall` — multi-channel retrieval during the session
224
+ - `slm-remember` — store durable facts during the session
225
+ - `slm-profile` — workspace isolation and profile switching
226
+ - `slm-scope` — multi-scope sharing model
227
+
228
+ ---
229
+
230
+ *SuperLocalMemory v3.8.1 · Qualixar · AGPL-3.0-or-later*
@@ -146,4 +146,21 @@ Note: the `slm optimize` subcommands have known pre-existing parse-test failures
146
146
 
147
147
  ---
148
148
 
149
- SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later
149
+ ## Profile-aware status (v3.8.0+)
150
+
151
+ `slm status --json` reports the currently active profile name in the `profile`
152
+ field. Use this to confirm which workspace is active before starting work on a
153
+ multi-profile setup. To switch the active profile, see `slm-profile`.
154
+
155
+ ---
156
+
157
+ ## Related skills
158
+
159
+ - `slm-session` — session lifecycle (session_init/close_session)
160
+ - `slm-profile` — workspace isolation and profile switching
161
+ - `slm-cache` — KV cache performance metrics
162
+ - `slm-compress` — reversible context compression
163
+
164
+ ---
165
+
166
+ SuperLocalMemory v3.8.1 · Qualixar · AGPL-3.0-or-later
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.7.8"
3
+ version = "3.8.1"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -171,6 +171,7 @@ superlocalmemory = ["ui/**/*", "optimize/NOTICE"]
171
171
  "share/superlocalmemory/codex/skills/slm-remember" = ["plugin-src/skills/slm-remember/SKILL.md"]
172
172
  "share/superlocalmemory/codex/skills/slm-session" = ["plugin-src/skills/slm-session/SKILL.md"]
173
173
  "share/superlocalmemory/codex/skills/slm-status" = ["plugin-src/skills/slm-status/SKILL.md"]
174
+ "share/superlocalmemory/portable-kit/rules" = ["plugin-src/rules/AGENTS.md"]
174
175
 
175
176
  [tool.pytest.ini_options]
176
177
  testpaths = ["tests"]
@@ -44,6 +44,8 @@ function validateReplyFileSchema(obj) {
44
44
  consolidation_cadence: { type: 'string' },
45
45
  inline_entity_detection: { type: 'boolean' },
46
46
  telemetry: { type: 'string' },
47
+ // v3.8.0 — deployment mode (personal|enterprise)
48
+ deployment: { type: 'string', enum: ['personal', 'enterprise'] },
47
49
  };
48
50
  for (const key of Object.keys(obj)) {
49
51
  if (!Object.prototype.hasOwnProperty.call(schema, key)) {
@@ -144,6 +144,8 @@ function parseArgs(argv) {
144
144
  home: null,
145
145
  replyFile: null,
146
146
  homeOutsideHome: false, // H-10: opt-in flag for --home outside $HOME
147
+ // v3.8.0: deployment mode — "personal" | "enterprise" (default: personal)
148
+ deployment: null,
147
149
  };
148
150
  for (const a of argv) {
149
151
  if (a === '--dry-run') args.dryRun = true;
@@ -152,6 +154,11 @@ function parseArgs(argv) {
152
154
  else if (a.startsWith('--profile=')) args.profile = a.slice('--profile='.length);
153
155
  else if (a.startsWith('--home=')) args.home = a.slice('--home='.length);
154
156
  else if (a.startsWith('--reply-file=')) args.replyFile = a.slice('--reply-file='.length);
157
+ else if (a.startsWith('--deployment=')) {
158
+ const val = a.slice('--deployment='.length).toLowerCase();
159
+ // Only accept known presets; silently ignore anything else (safe default: personal)
160
+ args.deployment = (val === 'enterprise') ? 'enterprise' : 'personal';
161
+ }
155
162
  }
156
163
  return args;
157
164
  }
@@ -165,6 +172,22 @@ const {
165
172
  validateHomePath,
166
173
  } = require('./postinstall/validation.js');
167
174
 
175
+ // v3.8.0 — deployment mode helpers (personal vs enterprise)
176
+ const {
177
+ DEPLOYMENT_PRESETS,
178
+ DEFAULT_DEPLOYMENT_MODE,
179
+ promptDeploymentMode,
180
+ renderDeploymentBlock,
181
+ } = require('./postinstall/deployment.js');
182
+
183
+ // v3.8.0 — IDE multi-select + non-destructive connect
184
+ const {
185
+ IDE_IDS,
186
+ IDE_DISPLAY,
187
+ promptIdeMultiselect,
188
+ executeIdeConnections,
189
+ } = require('./postinstall/ide-multiselect.js');
190
+
168
191
  // ------------------------------------------------------------------------
169
192
  // TTY detection
170
193
  // ------------------------------------------------------------------------
@@ -198,8 +221,22 @@ function probeColdStartMs() {
198
221
  // synchronous spawn with timeout to keep total benchmark ≤15s.
199
222
  try {
200
223
  const { spawnSync } = require('child_process');
224
+ // Windows has no `python3`; use the py launcher (`py -3`) or fall back to
225
+ // `python`. Probing the wrong name returns a pessimistic estimate and
226
+ // downgrades the recommended profile on every Windows install.
227
+ let pythonBin = 'python3';
228
+ let pythonArgs = ['-c', 'pass'];
229
+ if (process.platform === 'win32') {
230
+ if (spawnSync('py', ['-3', '-c', 'pass'], { timeout: 1000 }).status === 0) {
231
+ pythonBin = 'py';
232
+ pythonArgs = ['-3', '-c', 'pass'];
233
+ } else {
234
+ pythonBin = 'python';
235
+ pythonArgs = ['-c', 'pass'];
236
+ }
237
+ }
201
238
  const start = Date.now();
202
- const r = spawnSync('python3', ['-c', 'pass'], { timeout: 5000 });
239
+ const r = spawnSync(pythonBin, pythonArgs, { timeout: 5000 });
203
240
  const elapsed = Date.now() - start;
204
241
  if (r.error || r.status !== 0) return 2000; // pessimistic
205
242
  return elapsed;
@@ -337,6 +374,11 @@ function renderConfigToml(config) {
337
374
  lines.push('[telemetry]');
338
375
  lines.push(`mode = ${tomlEscape(config.telemetry)}`);
339
376
  lines.push('');
377
+ // v3.8.0: [deployment] block — only serialised for non-personal modes to
378
+ // avoid churning existing config.toml files (no-churn contract).
379
+ // renderDeploymentBlock() returns [] for personal (the default).
380
+ const depLines = renderDeploymentBlock(config.deployment || null);
381
+ for (const dl of depLines) lines.push(dl);
340
382
  return lines.join('\n');
341
383
  }
342
384
 
@@ -626,12 +668,16 @@ async function main() {
626
668
  console.log(downgrade.line);
627
669
  }
628
670
 
671
+ // v3.8.0: resolve deployment preset (personal default; --deployment flag or TTY prompt).
672
+ let deploymentPreset = DEPLOYMENT_PRESETS[args.deployment] || DEPLOYMENT_PRESETS.personal;
673
+
629
674
  if (args.profile === 'custom' || (replyFileContents && replyFileContents.profile === 'custom')) {
630
675
  config = buildCustomConfig(replyFileContents || {});
631
676
  } else if (args.profile && PROFILES[args.profile]) {
632
677
  config = { profile: args.profile, ...PROFILES[args.profile] };
633
678
  } else if (nonInteractive) {
634
679
  // Non-TTY: silently apply recommended (benchmark-driven) profile.
680
+ // Deployment defaults to personal (no change to existing non-TTY behaviour).
635
681
  config = { profile: recommended, ...PROFILES[recommended] };
636
682
  } else {
637
683
  // Interactive TTY flow.
@@ -641,11 +687,24 @@ async function main() {
641
687
  });
642
688
  try {
643
689
  config = await runInteractiveFlow(rl, recommended);
690
+ // v3.8.0: deployment question (only in TTY if no --deployment flag given)
691
+ if (!args.deployment) {
692
+ deploymentPreset = await promptDeploymentMode(rl);
693
+ }
694
+ // v3.8.0: IDE multi-select (TTY only)
695
+ const selectedIdes = await promptIdeMultiselect(rl);
696
+ if (selectedIdes.length > 0) {
697
+ // Deferred — don't close rl yet so output lands before close message.
698
+ config._pendingIdes = selectedIdes;
699
+ }
644
700
  } finally {
645
701
  rl.close();
646
702
  }
647
703
  }
648
704
 
705
+ // Attach deployment to config object so renderConfigToml can serialise it.
706
+ config.deployment = deploymentPreset;
707
+
649
708
  // Dry-run: report only, no write.
650
709
  if (args.dryRun) {
651
710
  console.log('SLM dry-run: would write profile=' + config.profile +
@@ -692,12 +751,17 @@ async function main() {
692
751
  fs.closeSync(fd);
693
752
  }
694
753
  fs.renameSync(tmpPath, cfgPath);
695
- console.log('SLM: wrote config.toml for profile=' + config.profile);
754
+ console.log('SLM: wrote config.toml for profile=' + config.profile +
755
+ (config.deployment && config.deployment.mode !== 'personal'
756
+ ? ' deployment=' + config.deployment.mode
757
+ : ''));
696
758
  } catch (e) {
697
759
  console.error('SLM: failed to write config.toml: ' + e.message);
698
760
  return 4;
699
761
  }
700
762
 
763
+ // v3.8.0: Execute IDE connections after config write so state is consistent.
764
+ if (config._pendingIdes) executeIdeConnections(config._pendingIdes, slmDir);
701
765
 
702
766
  // UX-G2: show the one-screen delta banner so upgraders see what shipped.
703
767
  printLivingBrainDelta();
@@ -736,4 +800,12 @@ module.exports = {
736
800
  PROFILES,
737
801
  CUSTOM_KNOB_ENUMS, // UX-M3
738
802
  printLivingBrainDelta, // UX-G2 (exposed for the test harness only)
803
+ // v3.8.0 — deployment
804
+ DEPLOYMENT_PRESETS,
805
+ DEFAULT_DEPLOYMENT_MODE,
806
+ renderDeploymentBlock,
807
+ // v3.8.0 — IDE multi-select
808
+ IDE_IDS,
809
+ IDE_DISPLAY,
810
+ executeIdeConnections,
739
811
  };
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "3.7.8"
35
+ __version__ = "3.8.1"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under AGPL-3.0-or-later - see LICENSE file
3
+ """SLM access control (RBAC) package."""