superlocalmemory 3.7.8 → 3.8.0

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 (260) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/ATTRIBUTION.md +1 -3
  3. package/CHANGELOG.md +69 -0
  4. package/README.md +199 -29
  5. package/package.json +4 -2
  6. package/plugin/.claude-plugin/plugin.json +2 -2
  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/agents/slm-governance-advisor.md +80 -0
  30. package/plugin-src/agents/slm-loop-runner.md +71 -0
  31. package/plugin-src/agents/slm-memory-advisor.md +10 -5
  32. package/plugin-src/agents/slm-optimize-advisor.md +9 -3
  33. package/plugin-src/commands/slm-loop.md +31 -0
  34. package/plugin-src/hooks/hooks.json +79 -0
  35. package/plugin-src/manifest.json +7 -2
  36. package/plugin-src/requirements.txt +1 -1
  37. package/plugin-src/rules/AGENTS.md +57 -18
  38. package/plugin-src/rules/CLAUDE.md.fragment +8 -8
  39. package/plugin-src/scripts/slm-launch +46 -7
  40. package/plugin-src/settings.json +9 -0
  41. package/plugin-src/skills/slm-cache/SKILL.md +9 -1
  42. package/plugin-src/skills/slm-compress/SKILL.md +8 -1
  43. package/plugin-src/skills/slm-governance/SKILL.md +248 -0
  44. package/plugin-src/skills/slm-graph/SKILL.md +17 -3
  45. package/plugin-src/skills/slm-loop/SKILL.md +99 -0
  46. package/plugin-src/skills/slm-mesh/SKILL.md +282 -0
  47. package/plugin-src/skills/slm-profile/SKILL.md +148 -0
  48. package/plugin-src/skills/slm-recall/SKILL.md +46 -10
  49. package/plugin-src/skills/slm-remember/SKILL.md +48 -1
  50. package/plugin-src/skills/slm-scope/SKILL.md +176 -0
  51. package/plugin-src/skills/slm-session/SKILL.md +24 -1
  52. package/plugin-src/skills/slm-status/SKILL.md +18 -1
  53. package/pyproject.toml +1 -1
  54. package/scripts/postinstall/validation.js +2 -0
  55. package/scripts/postinstall-interactive.js +74 -2
  56. package/src/superlocalmemory/__init__.py +1 -1
  57. package/src/superlocalmemory/access/__init__.py +3 -0
  58. package/src/superlocalmemory/access/rbac.py +477 -0
  59. package/src/superlocalmemory/cli/commands.py +94 -10
  60. package/src/superlocalmemory/cli/compress_cmd.py +17 -7
  61. package/src/superlocalmemory/cli/loop_cmd.py +192 -0
  62. package/src/superlocalmemory/cli/main.py +39 -4
  63. package/src/superlocalmemory/cli/mesh_cmd.py +38 -0
  64. package/src/superlocalmemory/cli/optimize_cmd.py +3 -0
  65. package/src/superlocalmemory/cli/pending_store.py +49 -13
  66. package/src/superlocalmemory/cli/proxy_cmd.py +4 -0
  67. package/src/superlocalmemory/cli/scale_engine_cmd.py +6 -0
  68. package/src/superlocalmemory/cli/setup_wizard.py +22 -13
  69. package/src/superlocalmemory/compliance/audit.py +6 -0
  70. package/src/superlocalmemory/compliance/gdpr.py +128 -138
  71. package/src/superlocalmemory/compliance/retention.py +176 -45
  72. package/src/superlocalmemory/core/backend_orchestrator.py +5 -43
  73. package/src/superlocalmemory/core/community_summary.py +267 -0
  74. package/src/superlocalmemory/core/config.py +216 -3
  75. package/src/superlocalmemory/core/consolidation_engine.py +95 -22
  76. package/src/superlocalmemory/core/context_cache.py +61 -18
  77. package/src/superlocalmemory/core/embedding_worker.py +17 -2
  78. package/src/superlocalmemory/core/embeddings.py +12 -1
  79. package/src/superlocalmemory/core/engine.py +17 -1
  80. package/src/superlocalmemory/core/engine_ingestion.py +29 -0
  81. package/src/superlocalmemory/core/engine_wiring.py +13 -0
  82. package/src/superlocalmemory/core/entity_community.py +178 -0
  83. package/src/superlocalmemory/core/graph_analyzer.py +39 -2
  84. package/src/superlocalmemory/core/graph_pruner.py +13 -8
  85. package/src/superlocalmemory/core/key_expander.py +138 -0
  86. package/src/superlocalmemory/core/maintenance.py +23 -0
  87. package/src/superlocalmemory/core/modes.py +1 -1
  88. package/src/superlocalmemory/core/mutations.py +2 -2
  89. package/src/superlocalmemory/core/pii.py +105 -0
  90. package/src/superlocalmemory/core/progressive_abstraction.py +208 -0
  91. package/src/superlocalmemory/core/recall_pipeline.py +2 -0
  92. package/src/superlocalmemory/core/recall_worker.py +20 -6
  93. package/src/superlocalmemory/core/scale_engine.py +60 -1
  94. package/src/superlocalmemory/core/security_primitives.py +40 -2
  95. package/src/superlocalmemory/core/store_pipeline.py +35 -11
  96. package/src/superlocalmemory/core/worker_pool.py +21 -6
  97. package/src/superlocalmemory/encoding/entity_reflexion.py +200 -0
  98. package/src/superlocalmemory/encoding/entity_resolver.py +34 -24
  99. package/src/superlocalmemory/encoding/fact_extractor.py +26 -1
  100. package/src/superlocalmemory/encoding/temporal_validator.py +64 -1
  101. package/src/superlocalmemory/evolution/evolution_store.py +122 -45
  102. package/src/superlocalmemory/evolution/llm_dispatch.py +12 -1
  103. package/src/superlocalmemory/evolution/model_selection.py +160 -0
  104. package/src/superlocalmemory/evolution/mutation_generator.py +16 -0
  105. package/src/superlocalmemory/evolution/skill_evolver.py +127 -42
  106. package/src/superlocalmemory/evolution/triggers.py +22 -13
  107. package/src/superlocalmemory/graph/cozo_backend.py +43 -20
  108. package/src/superlocalmemory/hooks/adapter_base.py +5 -1
  109. package/src/superlocalmemory/hooks/auto_recall.py +13 -1
  110. package/src/superlocalmemory/hooks/claude_code_hooks.py +11 -0
  111. package/src/superlocalmemory/hooks/codex_assets.py +64 -5
  112. package/src/superlocalmemory/hooks/hook_daemon.py +20 -3
  113. package/src/superlocalmemory/hooks/memory_protocol.py +54 -0
  114. package/src/superlocalmemory/hooks/portable_kit.py +114 -1
  115. package/src/superlocalmemory/infra/backup.py +12 -1
  116. package/src/superlocalmemory/infra/daemon_identity.py +40 -4
  117. package/src/superlocalmemory/infra/data_root.py +43 -4
  118. package/src/superlocalmemory/infra/event_bus.py +107 -24
  119. package/src/superlocalmemory/infra/rate_limiter.py +93 -0
  120. package/src/superlocalmemory/ingestion/adapter_manager.py +4 -1
  121. package/src/superlocalmemory/ingestion/credentials.py +1 -1
  122. package/src/superlocalmemory/learning/cross_project.py +28 -19
  123. package/src/superlocalmemory/learning/reward_proxy.py +42 -9
  124. package/src/superlocalmemory/loops/__init__.py +56 -0
  125. package/src/superlocalmemory/loops/budget.py +58 -0
  126. package/src/superlocalmemory/loops/engine.py +164 -0
  127. package/src/superlocalmemory/loops/ledger.py +243 -0
  128. package/src/superlocalmemory/loops/models.py +152 -0
  129. package/src/superlocalmemory/loops/rules.py +52 -0
  130. package/src/superlocalmemory/mcp/_daemon_proxy.py +3 -0
  131. package/src/superlocalmemory/mcp/_pool_adapter.py +2 -0
  132. package/src/superlocalmemory/mcp/profiles.py +103 -0
  133. package/src/superlocalmemory/mcp/server.py +21 -49
  134. package/src/superlocalmemory/mcp/tools_active.py +4 -7
  135. package/src/superlocalmemory/mcp/tools_code_graph.py +51 -5
  136. package/src/superlocalmemory/mcp/tools_core.py +8 -1
  137. package/src/superlocalmemory/mcp/tools_evolution.py +6 -3
  138. package/src/superlocalmemory/mcp/tools_loops.py +300 -0
  139. package/src/superlocalmemory/mcp/tools_mesh.py +140 -4
  140. package/src/superlocalmemory/mcp/tools_optimize.py +15 -8
  141. package/src/superlocalmemory/mesh/broker.py +237 -129
  142. package/src/superlocalmemory/mesh/remote_sync.py +50 -8
  143. package/src/superlocalmemory/optimize/NOTICE +1 -6
  144. package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +1 -4
  145. package/src/superlocalmemory/optimize/adapters/openai_adapter.py +1 -4
  146. package/src/superlocalmemory/optimize/cache/semantic.py +27 -19
  147. package/src/superlocalmemory/optimize/compress/align.py +32 -26
  148. package/src/superlocalmemory/optimize/compress/ccr.py +14 -71
  149. package/src/superlocalmemory/optimize/compress/router.py +105 -22
  150. package/src/superlocalmemory/optimize/config/defaults.py +1 -1
  151. package/src/superlocalmemory/optimize/config/schema.py +87 -4
  152. package/src/superlocalmemory/optimize/metrics/counters.py +13 -4
  153. package/src/superlocalmemory/optimize/metrics/estimator.py +0 -3
  154. package/src/superlocalmemory/optimize/proxy/_helpers.py +31 -4
  155. package/src/superlocalmemory/optimize/storage/db.py +38 -9
  156. package/src/superlocalmemory/optimize/storage/schema.py +10 -0
  157. package/src/superlocalmemory/parameterization/pattern_extractor.py +6 -3
  158. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  159. package/src/superlocalmemory/retrieval/bm25_channel.py +68 -10
  160. package/src/superlocalmemory/retrieval/engine.py +168 -26
  161. package/src/superlocalmemory/retrieval/entity_channel.py +7 -5
  162. package/src/superlocalmemory/retrieval/hopfield_channel.py +9 -2
  163. package/src/superlocalmemory/retrieval/semantic_channel.py +114 -21
  164. package/src/superlocalmemory/retrieval/spreading_activation.py +11 -2
  165. package/src/superlocalmemory/retrieval/temporal_channel.py +48 -9
  166. package/src/superlocalmemory/retrieval/temporal_frame.py +102 -0
  167. package/src/superlocalmemory/retrieval/temporal_validity_filter.py +135 -0
  168. package/src/superlocalmemory/retrieval/time_window.py +181 -0
  169. package/src/superlocalmemory/server/api.py +4 -4
  170. package/src/superlocalmemory/server/profile_runtime.py +125 -8
  171. package/src/superlocalmemory/server/rbac_enforce.py +142 -0
  172. package/src/superlocalmemory/server/recall_health.py +24 -3
  173. package/src/superlocalmemory/server/recall_serializer.py +19 -1
  174. package/src/superlocalmemory/server/routes/abstraction.py +115 -0
  175. package/src/superlocalmemory/server/routes/agents.py +128 -38
  176. package/src/superlocalmemory/server/routes/backup.py +34 -10
  177. package/src/superlocalmemory/server/routes/behavioral.py +13 -12
  178. package/src/superlocalmemory/server/routes/brain.py +21 -5
  179. package/src/superlocalmemory/server/routes/chat.py +10 -5
  180. package/src/superlocalmemory/server/routes/compliance.py +171 -21
  181. package/src/superlocalmemory/server/routes/config_api.py +436 -0
  182. package/src/superlocalmemory/server/routes/data_io.py +30 -8
  183. package/src/superlocalmemory/server/routes/entity.py +9 -4
  184. package/src/superlocalmemory/server/routes/events.py +24 -8
  185. package/src/superlocalmemory/server/routes/evolution.py +135 -17
  186. package/src/superlocalmemory/server/routes/helpers.py +16 -1
  187. package/src/superlocalmemory/server/routes/ingest.py +7 -4
  188. package/src/superlocalmemory/server/routes/insights.py +3 -3
  189. package/src/superlocalmemory/server/routes/learning.py +14 -14
  190. package/src/superlocalmemory/server/routes/lifecycle.py +59 -8
  191. package/src/superlocalmemory/server/routes/memories.py +182 -57
  192. package/src/superlocalmemory/server/routes/mesh.py +95 -15
  193. package/src/superlocalmemory/server/routes/optimize.py +33 -1
  194. package/src/superlocalmemory/server/routes/prewarm.py +2 -0
  195. package/src/superlocalmemory/server/routes/profiles.py +63 -17
  196. package/src/superlocalmemory/server/routes/ratelimit.py +124 -0
  197. package/src/superlocalmemory/server/routes/rbac.py +367 -0
  198. package/src/superlocalmemory/server/routes/stats.py +13 -6
  199. package/src/superlocalmemory/server/routes/tiers.py +11 -9
  200. package/src/superlocalmemory/server/routes/v3_api.py +183 -69
  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 +384 -56
  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 +53 -0
  208. package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +108 -0
  209. package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +86 -0
  210. package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +194 -0
  211. package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +87 -0
  212. package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +90 -0
  213. package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +136 -0
  214. package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +163 -0
  215. package/src/superlocalmemory/storage/models.py +4 -0
  216. package/src/superlocalmemory/storage/schema.py +87 -0
  217. package/src/superlocalmemory/storage/schema_v343.py +24 -12
  218. package/src/superlocalmemory/trust/gate.py +49 -8
  219. package/src/superlocalmemory/ui/assets/slm-icon-white.svg +64 -0
  220. package/src/superlocalmemory/ui/assets/slm-icon.svg +36 -0
  221. package/src/superlocalmemory/ui/css/design-system.css +621 -0
  222. package/src/superlocalmemory/ui/css/neural-glass.css +6 -0
  223. package/src/superlocalmemory/ui/css/od-bridge.css +158 -0
  224. package/src/superlocalmemory/ui/favicon.svg +35 -4
  225. package/src/superlocalmemory/ui/index.html +306 -173
  226. package/src/superlocalmemory/ui/js/brain.js +5 -20
  227. package/src/superlocalmemory/ui/js/core.js +47 -31
  228. package/src/superlocalmemory/ui/js/dashboard.js +314 -63
  229. package/src/superlocalmemory/ui/js/event-delegation.js +102 -0
  230. package/src/superlocalmemory/ui/js/knowledge-graph.js +11 -11
  231. package/src/superlocalmemory/ui/js/math-health.js +1 -1
  232. package/src/superlocalmemory/ui/js/memories.js +15 -4
  233. package/src/superlocalmemory/ui/js/memory-chat.js +7 -7
  234. package/src/superlocalmemory/ui/js/ng-entities.js +6 -8
  235. package/src/superlocalmemory/ui/js/ng-ingestion.js +4 -4
  236. package/src/superlocalmemory/ui/js/ng-mesh.js +4 -9
  237. package/src/superlocalmemory/ui/js/ng-shell.js +8 -8
  238. package/src/superlocalmemory/ui/js/ng-skills.js +54 -2
  239. package/src/superlocalmemory/ui/js/od-agents.js +544 -0
  240. package/src/superlocalmemory/ui/js/od-auth-gate.js +257 -0
  241. package/src/superlocalmemory/ui/js/od-backup.js +780 -0
  242. package/src/superlocalmemory/ui/js/od-brain.js +779 -0
  243. package/src/superlocalmemory/ui/js/od-entities.js +579 -0
  244. package/src/superlocalmemory/ui/js/od-graph.js +593 -0
  245. package/src/superlocalmemory/ui/js/od-health.js +539 -0
  246. package/src/superlocalmemory/ui/js/od-mcp.js +508 -0
  247. package/src/superlocalmemory/ui/js/od-memories.js +887 -0
  248. package/src/superlocalmemory/ui/js/od-mesh.js +539 -0
  249. package/src/superlocalmemory/ui/js/od-operations.js +1250 -0
  250. package/src/superlocalmemory/ui/js/od-optimize.js +787 -0
  251. package/src/superlocalmemory/ui/js/od-settings.js +1053 -0
  252. package/src/superlocalmemory/ui/js/od-shell.js +593 -0
  253. package/src/superlocalmemory/ui/js/od-skills.js +573 -0
  254. package/src/superlocalmemory/ui/js/od-team.js +258 -0
  255. package/src/superlocalmemory/ui/js/profiles.js +159 -46
  256. package/src/superlocalmemory/ui/js/settings.js +2 -2
  257. package/src/superlocalmemory/ui/js/timeline.js +34 -5
  258. package/src/superlocalmemory/ui/js/trust-dashboard.js +2 -2
  259. package/src/superlocalmemory/vector/lancedb_backend.py +8 -6
  260. package/src/superlocalmemory/learning/behavioral_listener.py +0 -94
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: slm-scope
3
+ description: Controls memory visibility across profiles — personal (private, default), shared (selected profiles), or global (all profiles on this machine). Default is always personal. Only change scope when the user explicitly asks to share a memory across workspaces. Works with both remember (write scope) and recall (read scope flags).
4
+ when_to_use: |
5
+ - "Share this memory with the team profile"
6
+ - "Store this globally so all my agents can see it"
7
+ - "Recall anything shared from the work profile"
8
+ - "Can other agents on this machine see my memories?"
9
+ - User explicitly asks to cross-profile share a fact or see shared facts
10
+ - Enterprise setup where multiple profiles collaborate
11
+ allowed-tools: remember, recall, search, list_recent, Bash
12
+ ---
13
+
14
+ # slm-scope — Memory Scope and Sharing Model
15
+
16
+ SuperLocalMemory is profile-isolated by default. Every profile is a fully
17
+ independent memory namespace. The scope model adds controlled, opt-in sharing
18
+ between profiles on the same machine — it is never active unless you explicitly
19
+ set it.
20
+
21
+ ---
22
+
23
+ ## The Three Scopes
24
+
25
+ | Scope | Visibility | When to use |
26
+ |-------|-----------|-------------|
27
+ | `personal` | Active profile only | Default — all facts. Never set explicitly. |
28
+ | `shared` | Active profile + `shared_with` profiles | Team handoffs, shared project context |
29
+ | `global` | Every profile on this machine | Machine-wide conventions, org-wide rules |
30
+
31
+ **The default is always `personal`.** A fact stored without a `scope` argument
32
+ is private to the profile that stored it. Recall without scope flags returns only
33
+ personal facts. This is identical to single-profile SLM.
34
+
35
+ ---
36
+
37
+ ## Opt-in is mandatory
38
+
39
+ Never set `scope="shared"` or `scope="global"` (or the recall equivalents
40
+ `include_shared`, `include_global`) unless the user explicitly asks you to share
41
+ or read across profiles. This is a hard rule — scope expansion is an action with
42
+ team-wide or machine-wide impact, and it must always be user-initiated.
43
+
44
+ ---
45
+
46
+ ## Writing a shared or global fact
47
+
48
+ ### share with specific profiles
49
+
50
+ ```
51
+ remember(
52
+ content="API gateway rate limit is 1000 req/min per client",
53
+ tags="api,limits,ops",
54
+ project="platform",
55
+ importance=8,
56
+ session_id="<sid>",
57
+ scope="shared",
58
+ shared_with="devops-profile,backend-profile",
59
+ )
60
+ ```
61
+
62
+ `shared_with` is a comma-separated list of profile IDs that should be able to
63
+ recall this fact. Use `slm status` to see the current profile name — that is the
64
+ `profile_id` to supply.
65
+
66
+ ### share with all profiles on the machine
67
+
68
+ ```
69
+ remember(
70
+ content="All services must enforce TLS 1.3 minimum",
71
+ tags="security,tls,global",
72
+ project="infra",
73
+ importance=9,
74
+ session_id="<sid>",
75
+ scope="global",
76
+ )
77
+ ```
78
+
79
+ `scope="global"` makes the fact visible to every profile on this machine. Use
80
+ this only for machine-wide conventions (security rules, org-wide constraints).
81
+
82
+ ---
83
+
84
+ ## Reading shared or global facts
85
+
86
+ By default, `recall` returns only the active profile's personal facts. To surface
87
+ shared and global facts, pass the opt-in flags:
88
+
89
+ ```
90
+ recall(
91
+ query="rate limiting rules",
92
+ limit=20,
93
+ include_global=True, # include global-scope facts
94
+ include_shared=True, # include facts shared with this profile
95
+ session_id="<sid>",
96
+ )
97
+ ```
98
+
99
+ You can opt in to either or both flags independently. Only the active profile's
100
+ permitted shared facts are returned — you cannot read another profile's personal
101
+ facts.
102
+
103
+ ### CLI equivalents
104
+
105
+ ```bash
106
+ # Recall with global facts included
107
+ slm recall "rate limiting rules" --include-global
108
+
109
+ # Recall with shared facts included
110
+ slm recall "rate limiting rules" --include-shared
111
+
112
+ # Both
113
+ slm recall "rate limiting rules" --include-global --include-shared
114
+
115
+ # Store a global fact
116
+ slm remember "TLS 1.3 minimum" --scope global
117
+
118
+ # Store a shared fact (shared-with is a comma-separated list of profile IDs)
119
+ slm remember "API rate limit 1000/min" --scope shared --shared-with devops,backend
120
+ ```
121
+
122
+ CLI flags verified in source: `--include-global` / `--no-global`, `--include-shared` / `--no-shared`,
123
+ `--scope personal|shared|global`, `--shared-with <profile-ids>`.
124
+
125
+ ---
126
+
127
+ ## Configuring scope defaults
128
+
129
+ Per-profile defaults live in `mode_a/b/c.json` configuration. To make a profile
130
+ always include global facts without passing flags each time:
131
+
132
+ ```json
133
+ {
134
+ "recall": {
135
+ "include_global": true,
136
+ "include_shared": false
137
+ }
138
+ }
139
+ ```
140
+
141
+ Changing the default requires editing the profile config directly — this is an
142
+ admin-level operation.
143
+
144
+ ---
145
+
146
+ ## Enterprise governance
147
+
148
+ In a governed workspace (admin/member/viewer roles), scope expansion may be
149
+ restricted:
150
+ - **Viewers** cannot write `scope="global"` facts — their writes are always `personal`.
151
+ - **Members** can write `scope="shared"` with profiles in their access list.
152
+ - **Admins** can write `scope="global"` unrestricted.
153
+
154
+ See `slm-governance` for the full enterprise behavior model.
155
+
156
+ ---
157
+
158
+ ## Scope deletion and retention
159
+
160
+ A `scope="global"` fact deleted by one profile is deleted for all profiles. A
161
+ `scope="shared"` fact is deleted from all profiles that had access to it.
162
+ Use `slm forget "<query>" --dry-run` before any deletion involving shared facts
163
+ to review the impact. See `slm-remember` for the full deletion discipline.
164
+
165
+ ---
166
+
167
+ ## Related skills
168
+
169
+ - `slm-remember` — full fact storage reference including scope parameters
170
+ - `slm-recall` — full retrieval reference including include_global/include_shared
171
+ - `slm-profile` — what a profile is and how to switch between them
172
+ - `slm-governance` — enterprise role restrictions on scope
173
+
174
+ ---
175
+
176
+ *SuperLocalMemory v3.8.0 · 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.0 · 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.0 · 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.0"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -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.0"
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."""