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.
- package/.claude-plugin/marketplace.json +1 -1
- package/ATTRIBUTION.md +1 -3
- package/CHANGELOG.md +129 -0
- package/README.md +205 -123
- package/package.json +12 -3
- package/plugin/.claude-plugin/plugin.json +2 -3
- package/plugin/CLAUDE.md +8 -8
- package/plugin/agents/slm-governance-advisor.md +80 -0
- package/plugin/agents/slm-loop-runner.md +71 -0
- package/plugin/agents/slm-memory-advisor.md +10 -5
- package/plugin/agents/slm-optimize-advisor.md +9 -3
- package/plugin/commands/slm-loop.md +31 -0
- package/plugin/hooks/hooks.json +79 -0
- package/plugin/requirements.txt +1 -1
- package/plugin/scripts/slm-launch +46 -7
- package/plugin/settings.json +9 -0
- package/plugin/skills/slm-cache/SKILL.md +9 -1
- package/plugin/skills/slm-compress/SKILL.md +8 -1
- package/plugin/skills/slm-governance/SKILL.md +248 -0
- package/plugin/skills/slm-graph/SKILL.md +17 -3
- package/plugin/skills/slm-loop/SKILL.md +99 -0
- package/plugin/skills/slm-mesh/SKILL.md +282 -0
- package/plugin/skills/slm-profile/SKILL.md +148 -0
- package/plugin/skills/slm-recall/SKILL.md +46 -10
- package/plugin/skills/slm-remember/SKILL.md +48 -1
- package/plugin/skills/slm-scope/SKILL.md +176 -0
- package/plugin/skills/slm-session/SKILL.md +24 -1
- package/plugin/skills/slm-status/SKILL.md +18 -1
- package/plugin-src/rules/AGENTS.md +57 -18
- package/plugin-src/skills/slm-cache/SKILL.md +9 -1
- package/plugin-src/skills/slm-compress/SKILL.md +8 -1
- package/plugin-src/skills/slm-graph/SKILL.md +17 -3
- package/plugin-src/skills/slm-recall/SKILL.md +46 -10
- package/plugin-src/skills/slm-remember/SKILL.md +48 -1
- package/plugin-src/skills/slm-session/SKILL.md +24 -1
- package/plugin-src/skills/slm-status/SKILL.md +18 -1
- package/pyproject.toml +2 -1
- package/scripts/postinstall/validation.js +2 -0
- package/scripts/postinstall-interactive.js +74 -2
- package/src/superlocalmemory/__init__.py +1 -1
- package/src/superlocalmemory/access/__init__.py +3 -0
- package/src/superlocalmemory/access/rbac.py +477 -0
- package/src/superlocalmemory/cli/commands.py +228 -17
- package/src/superlocalmemory/cli/compress_cmd.py +17 -7
- package/src/superlocalmemory/cli/daemon.py +7 -0
- package/src/superlocalmemory/cli/loop_cmd.py +187 -0
- package/src/superlocalmemory/cli/main.py +49 -8
- package/src/superlocalmemory/cli/mesh_cmd.py +38 -0
- package/src/superlocalmemory/cli/optimize_cmd.py +3 -0
- package/src/superlocalmemory/cli/pending_store.py +49 -13
- package/src/superlocalmemory/cli/proxy_cmd.py +4 -0
- package/src/superlocalmemory/cli/scale_engine_cmd.py +6 -0
- package/src/superlocalmemory/cli/setup_wizard.py +22 -13
- package/src/superlocalmemory/cli/version_banner.py +17 -3
- package/src/superlocalmemory/compliance/audit.py +6 -0
- package/src/superlocalmemory/compliance/gdpr.py +128 -138
- package/src/superlocalmemory/compliance/retention.py +176 -45
- package/src/superlocalmemory/core/backend_orchestrator.py +23 -59
- package/src/superlocalmemory/core/community_summary.py +267 -0
- package/src/superlocalmemory/core/config.py +216 -3
- package/src/superlocalmemory/core/consolidation_engine.py +95 -22
- package/src/superlocalmemory/core/context_cache.py +61 -18
- package/src/superlocalmemory/core/embedding_worker.py +21 -7
- package/src/superlocalmemory/core/embeddings.py +131 -46
- package/src/superlocalmemory/core/engine.py +41 -22
- package/src/superlocalmemory/core/engine_ingestion.py +359 -43
- package/src/superlocalmemory/core/engine_wiring.py +13 -0
- package/src/superlocalmemory/core/entity_community.py +178 -0
- package/src/superlocalmemory/core/graph_analyzer.py +39 -2
- package/src/superlocalmemory/core/graph_pruner.py +13 -8
- package/src/superlocalmemory/core/ingestion_command.py +134 -25
- package/src/superlocalmemory/core/injection.py +12 -7
- package/src/superlocalmemory/core/key_expander.py +138 -0
- package/src/superlocalmemory/core/maintenance.py +23 -0
- package/src/superlocalmemory/core/maintenance_scheduler.py +17 -7
- package/src/superlocalmemory/core/modes.py +1 -1
- package/src/superlocalmemory/core/mutations.py +2 -2
- package/src/superlocalmemory/core/pii.py +105 -0
- package/src/superlocalmemory/core/progressive_abstraction.py +208 -0
- package/src/superlocalmemory/core/recall_pipeline.py +7 -3
- package/src/superlocalmemory/core/recall_worker.py +20 -6
- package/src/superlocalmemory/core/scale_engine.py +60 -1
- package/src/superlocalmemory/core/security_primitives.py +40 -2
- package/src/superlocalmemory/core/store_pipeline.py +186 -29
- package/src/superlocalmemory/core/worker_pool.py +21 -6
- package/src/superlocalmemory/encoding/entity_reflexion.py +200 -0
- package/src/superlocalmemory/encoding/entity_resolver.py +34 -24
- package/src/superlocalmemory/encoding/fact_extractor.py +26 -1
- package/src/superlocalmemory/encoding/temporal_validator.py +64 -1
- package/src/superlocalmemory/evolution/evolution_store.py +122 -45
- package/src/superlocalmemory/evolution/llm_dispatch.py +12 -1
- package/src/superlocalmemory/evolution/model_selection.py +160 -0
- package/src/superlocalmemory/evolution/mutation_generator.py +16 -0
- package/src/superlocalmemory/evolution/skill_evolver.py +127 -42
- package/src/superlocalmemory/evolution/triggers.py +22 -13
- package/src/superlocalmemory/graph/cozo_backend.py +43 -20
- package/src/superlocalmemory/hooks/adapter_base.py +5 -1
- package/src/superlocalmemory/hooks/auto_recall.py +13 -1
- package/src/superlocalmemory/hooks/claude_code_hooks.py +11 -0
- package/src/superlocalmemory/hooks/codex_assets.py +64 -5
- package/src/superlocalmemory/hooks/hook_daemon.py +20 -3
- package/src/superlocalmemory/hooks/hook_handlers.py +6 -1
- package/src/superlocalmemory/hooks/memory_protocol.py +54 -0
- package/src/superlocalmemory/hooks/portable_kit.py +148 -3
- package/src/superlocalmemory/infra/backup.py +12 -1
- package/src/superlocalmemory/infra/daemon_identity.py +40 -4
- package/src/superlocalmemory/infra/data_root.py +43 -4
- package/src/superlocalmemory/infra/event_bus.py +107 -24
- package/src/superlocalmemory/infra/rate_limiter.py +93 -0
- package/src/superlocalmemory/ingestion/adapter_manager.py +4 -1
- package/src/superlocalmemory/ingestion/credentials.py +1 -1
- package/src/superlocalmemory/learning/cross_project.py +28 -19
- package/src/superlocalmemory/learning/model_rollback.py +3 -0
- package/src/superlocalmemory/learning/ranker_retrain_online.py +2 -0
- package/src/superlocalmemory/learning/reward.py +50 -0
- package/src/superlocalmemory/learning/reward_proxy.py +42 -9
- package/src/superlocalmemory/learning/source_quality.py +523 -1
- package/src/superlocalmemory/loops/__init__.py +56 -0
- package/src/superlocalmemory/loops/budget.py +58 -0
- package/src/superlocalmemory/loops/engine.py +164 -0
- package/src/superlocalmemory/loops/ledger.py +263 -0
- package/src/superlocalmemory/loops/models.py +152 -0
- package/src/superlocalmemory/loops/rules.py +52 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +3 -0
- package/src/superlocalmemory/mcp/_pool_adapter.py +2 -0
- package/src/superlocalmemory/mcp/profiles.py +103 -0
- package/src/superlocalmemory/mcp/server.py +32 -79
- package/src/superlocalmemory/mcp/tools_active.py +4 -7
- package/src/superlocalmemory/mcp/tools_code_graph.py +51 -5
- package/src/superlocalmemory/mcp/tools_core.py +12 -4
- package/src/superlocalmemory/mcp/tools_evolution.py +6 -3
- package/src/superlocalmemory/mcp/tools_learning.py +2 -2
- package/src/superlocalmemory/mcp/tools_loops.py +300 -0
- package/src/superlocalmemory/mcp/tools_mesh.py +140 -4
- package/src/superlocalmemory/mcp/tools_optimize.py +15 -8
- package/src/superlocalmemory/mesh/broker.py +237 -129
- package/src/superlocalmemory/mesh/remote_sync.py +50 -8
- package/src/superlocalmemory/optimize/NOTICE +1 -6
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +1 -4
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +1 -4
- package/src/superlocalmemory/optimize/cache/semantic.py +27 -19
- package/src/superlocalmemory/optimize/compress/align.py +32 -26
- package/src/superlocalmemory/optimize/compress/ccr.py +14 -71
- package/src/superlocalmemory/optimize/compress/router.py +105 -22
- package/src/superlocalmemory/optimize/config/defaults.py +1 -1
- package/src/superlocalmemory/optimize/config/schema.py +87 -4
- package/src/superlocalmemory/optimize/metrics/counters.py +13 -4
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -3
- package/src/superlocalmemory/optimize/proxy/_helpers.py +31 -4
- package/src/superlocalmemory/optimize/storage/db.py +38 -9
- package/src/superlocalmemory/optimize/storage/schema.py +10 -0
- package/src/superlocalmemory/parameterization/pattern_extractor.py +6 -3
- package/src/superlocalmemory/retrieval/agentic.py +1 -1
- package/src/superlocalmemory/retrieval/bm25_channel.py +68 -10
- package/src/superlocalmemory/retrieval/engine.py +221 -47
- package/src/superlocalmemory/retrieval/entity_channel.py +7 -5
- package/src/superlocalmemory/retrieval/hopfield_channel.py +9 -2
- package/src/superlocalmemory/retrieval/reranker.py +3 -4
- package/src/superlocalmemory/retrieval/semantic_channel.py +114 -21
- package/src/superlocalmemory/retrieval/spreading_activation.py +11 -2
- package/src/superlocalmemory/retrieval/temporal_channel.py +48 -9
- package/src/superlocalmemory/retrieval/temporal_frame.py +102 -0
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +135 -0
- package/src/superlocalmemory/retrieval/time_window.py +181 -0
- package/src/superlocalmemory/server/api.py +4 -4
- package/src/superlocalmemory/server/config_file.py +90 -0
- package/src/superlocalmemory/server/origin.py +50 -0
- package/src/superlocalmemory/server/profile_runtime.py +125 -8
- package/src/superlocalmemory/server/rbac_enforce.py +142 -0
- package/src/superlocalmemory/server/recall_health.py +24 -3
- package/src/superlocalmemory/server/recall_serializer.py +19 -1
- package/src/superlocalmemory/server/routes/abstraction.py +115 -0
- package/src/superlocalmemory/server/routes/agents.py +128 -38
- package/src/superlocalmemory/server/routes/backup.py +317 -70
- package/src/superlocalmemory/server/routes/behavioral.py +349 -71
- package/src/superlocalmemory/server/routes/brain.py +69 -12
- package/src/superlocalmemory/server/routes/chat.py +10 -5
- package/src/superlocalmemory/server/routes/compliance.py +171 -21
- package/src/superlocalmemory/server/routes/config_api.py +438 -0
- package/src/superlocalmemory/server/routes/data_io.py +30 -8
- package/src/superlocalmemory/server/routes/entity.py +108 -26
- package/src/superlocalmemory/server/routes/events.py +24 -8
- package/src/superlocalmemory/server/routes/evolution.py +189 -68
- package/src/superlocalmemory/server/routes/helpers.py +16 -1
- package/src/superlocalmemory/server/routes/ingest.py +7 -4
- package/src/superlocalmemory/server/routes/insights.py +3 -3
- package/src/superlocalmemory/server/routes/learning.py +289 -118
- package/src/superlocalmemory/server/routes/learning_telemetry.py +153 -0
- package/src/superlocalmemory/server/routes/lifecycle.py +59 -8
- package/src/superlocalmemory/server/routes/memories.py +182 -57
- package/src/superlocalmemory/server/routes/mesh.py +200 -31
- package/src/superlocalmemory/server/routes/optimize.py +33 -1
- package/src/superlocalmemory/server/routes/prewarm.py +2 -0
- package/src/superlocalmemory/server/routes/profiles.py +63 -17
- package/src/superlocalmemory/server/routes/ratelimit.py +132 -0
- package/src/superlocalmemory/server/routes/rbac.py +367 -0
- package/src/superlocalmemory/server/routes/stats.py +103 -158
- package/src/superlocalmemory/server/routes/tiers.py +11 -9
- package/src/superlocalmemory/server/routes/token.py +3 -13
- package/src/superlocalmemory/server/routes/v3_api.py +247 -89
- package/src/superlocalmemory/server/routes/ws.py +5 -2
- package/src/superlocalmemory/server/security_middleware.py +12 -5
- package/src/superlocalmemory/server/ui.py +20 -5
- package/src/superlocalmemory/server/unified_daemon.py +827 -72
- package/src/superlocalmemory/server/write_identity.py +38 -8
- package/src/superlocalmemory/storage/database.py +265 -53
- package/src/superlocalmemory/storage/migration_runner.py +132 -1
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +5 -0
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +108 -0
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +86 -0
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +194 -0
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +87 -0
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +90 -0
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +136 -0
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +163 -0
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +270 -0
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +137 -0
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +93 -0
- package/src/superlocalmemory/storage/migrations/__init__.py +4 -0
- package/src/superlocalmemory/storage/models.py +4 -0
- package/src/superlocalmemory/storage/schema.py +136 -1
- package/src/superlocalmemory/storage/schema_v32.py +2 -0
- package/src/superlocalmemory/storage/schema_v343.py +24 -12
- package/src/superlocalmemory/storage/schema_v347.py +4 -0
- package/src/superlocalmemory/trust/gate.py +49 -8
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +64 -0
- package/src/superlocalmemory/ui/assets/slm-icon.svg +36 -0
- package/src/superlocalmemory/ui/css/design-system.css +621 -0
- package/src/superlocalmemory/ui/css/neural-glass.css +6 -0
- package/src/superlocalmemory/ui/css/od-bridge.css +158 -0
- package/src/superlocalmemory/ui/favicon.svg +35 -4
- package/src/superlocalmemory/ui/index.html +303 -173
- package/src/superlocalmemory/ui/js/brain.js +5 -20
- package/src/superlocalmemory/ui/js/core.js +100 -41
- package/src/superlocalmemory/ui/js/dashboard.js +403 -65
- package/src/superlocalmemory/ui/js/event-delegation.js +102 -0
- package/src/superlocalmemory/ui/js/knowledge-graph.js +11 -11
- package/src/superlocalmemory/ui/js/math-health.js +1 -1
- package/src/superlocalmemory/ui/js/memories.js +15 -4
- package/src/superlocalmemory/ui/js/memory-chat.js +7 -7
- package/src/superlocalmemory/ui/js/ng-entities.js +6 -8
- package/src/superlocalmemory/ui/js/ng-ingestion.js +4 -4
- package/src/superlocalmemory/ui/js/ng-mesh.js +4 -9
- package/src/superlocalmemory/ui/js/ng-shell.js +8 -8
- package/src/superlocalmemory/ui/js/ng-skills.js +54 -2
- package/src/superlocalmemory/ui/js/od-agents.js +544 -0
- package/src/superlocalmemory/ui/js/od-auth-gate.js +257 -0
- package/src/superlocalmemory/ui/js/od-backup.js +871 -0
- package/src/superlocalmemory/ui/js/od-brain.js +816 -0
- package/src/superlocalmemory/ui/js/od-entities.js +579 -0
- package/src/superlocalmemory/ui/js/od-graph.js +600 -0
- package/src/superlocalmemory/ui/js/od-health.js +539 -0
- package/src/superlocalmemory/ui/js/od-mcp.js +508 -0
- package/src/superlocalmemory/ui/js/od-memories.js +929 -0
- package/src/superlocalmemory/ui/js/od-mesh.js +553 -0
- package/src/superlocalmemory/ui/js/od-operations.js +1250 -0
- package/src/superlocalmemory/ui/js/od-optimize.js +787 -0
- package/src/superlocalmemory/ui/js/od-settings.js +1107 -0
- package/src/superlocalmemory/ui/js/od-shell.js +809 -0
- package/src/superlocalmemory/ui/js/od-skills.js +600 -0
- package/src/superlocalmemory/ui/js/od-team.js +258 -0
- package/src/superlocalmemory/ui/js/profiles.js +159 -46
- package/src/superlocalmemory/ui/js/settings.js +17 -3
- package/src/superlocalmemory/ui/js/timeline.js +34 -5
- package/src/superlocalmemory/ui/js/trust-dashboard.js +2 -2
- package/src/superlocalmemory/vector/lancedb_backend.py +8 -6
- package/plugin-src/.mcp.json +0 -12
- package/plugin-src/agents/slm-memory-advisor.md +0 -44
- package/plugin-src/agents/slm-optimize-advisor.md +0 -38
- package/plugin-src/hooks/.gitkeep +0 -0
- package/plugin-src/hooks/hooks.json +0 -23
- package/plugin-src/manifest.json +0 -25
- package/plugin-src/requirements.txt +0 -1
- package/plugin-src/rules/CLAUDE.md.fragment +0 -44
- package/plugin-src/scripts/ensure-venv.bat +0 -122
- package/plugin-src/scripts/ensure-venv.sh +0 -105
- package/plugin-src/scripts/slm-launch +0 -23
- package/plugin-src/scripts/slm-launch.bat +0 -23
- package/plugin-src/settings.json +0 -16
- 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
|
|
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
|
|
105
|
-
|
|
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
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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(
|
|
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.
|
|
35
|
+
__version__ = "3.8.1"
|
|
36
36
|
|
|
37
37
|
_REQUIRED_VERSIONS = {
|
|
38
38
|
"sentence_transformers": "5.3.0",
|