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.
- package/.claude-plugin/marketplace.json +1 -1
- package/ATTRIBUTION.md +1 -3
- package/CHANGELOG.md +69 -0
- package/README.md +199 -29
- package/package.json +4 -2
- package/plugin/.claude-plugin/plugin.json +2 -2
- 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/agents/slm-governance-advisor.md +80 -0
- package/plugin-src/agents/slm-loop-runner.md +71 -0
- package/plugin-src/agents/slm-memory-advisor.md +10 -5
- package/plugin-src/agents/slm-optimize-advisor.md +9 -3
- package/plugin-src/commands/slm-loop.md +31 -0
- package/plugin-src/hooks/hooks.json +79 -0
- package/plugin-src/manifest.json +7 -2
- package/plugin-src/requirements.txt +1 -1
- package/plugin-src/rules/AGENTS.md +57 -18
- package/plugin-src/rules/CLAUDE.md.fragment +8 -8
- package/plugin-src/scripts/slm-launch +46 -7
- package/plugin-src/settings.json +9 -0
- 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-governance/SKILL.md +248 -0
- package/plugin-src/skills/slm-graph/SKILL.md +17 -3
- package/plugin-src/skills/slm-loop/SKILL.md +99 -0
- package/plugin-src/skills/slm-mesh/SKILL.md +282 -0
- package/plugin-src/skills/slm-profile/SKILL.md +148 -0
- 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-scope/SKILL.md +176 -0
- package/plugin-src/skills/slm-session/SKILL.md +24 -1
- package/plugin-src/skills/slm-status/SKILL.md +18 -1
- package/pyproject.toml +1 -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 +94 -10
- package/src/superlocalmemory/cli/compress_cmd.py +17 -7
- package/src/superlocalmemory/cli/loop_cmd.py +192 -0
- package/src/superlocalmemory/cli/main.py +39 -4
- 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/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 +5 -43
- 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 +17 -2
- package/src/superlocalmemory/core/embeddings.py +12 -1
- package/src/superlocalmemory/core/engine.py +17 -1
- package/src/superlocalmemory/core/engine_ingestion.py +29 -0
- 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/key_expander.py +138 -0
- package/src/superlocalmemory/core/maintenance.py +23 -0
- 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 +2 -0
- 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 +35 -11
- 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/memory_protocol.py +54 -0
- package/src/superlocalmemory/hooks/portable_kit.py +114 -1
- 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/reward_proxy.py +42 -9
- 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 +243 -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 +21 -49
- 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 +8 -1
- package/src/superlocalmemory/mcp/tools_evolution.py +6 -3
- 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 +168 -26
- package/src/superlocalmemory/retrieval/entity_channel.py +7 -5
- package/src/superlocalmemory/retrieval/hopfield_channel.py +9 -2
- 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/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 +34 -10
- package/src/superlocalmemory/server/routes/behavioral.py +13 -12
- package/src/superlocalmemory/server/routes/brain.py +21 -5
- 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 +436 -0
- package/src/superlocalmemory/server/routes/data_io.py +30 -8
- package/src/superlocalmemory/server/routes/entity.py +9 -4
- package/src/superlocalmemory/server/routes/events.py +24 -8
- package/src/superlocalmemory/server/routes/evolution.py +135 -17
- 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 +14 -14
- 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 +95 -15
- 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 +124 -0
- package/src/superlocalmemory/server/routes/rbac.py +367 -0
- package/src/superlocalmemory/server/routes/stats.py +13 -6
- package/src/superlocalmemory/server/routes/tiers.py +11 -9
- package/src/superlocalmemory/server/routes/v3_api.py +183 -69
- 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 +384 -56
- package/src/superlocalmemory/server/write_identity.py +38 -8
- package/src/superlocalmemory/storage/database.py +265 -53
- package/src/superlocalmemory/storage/migration_runner.py +53 -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/models.py +4 -0
- package/src/superlocalmemory/storage/schema.py +87 -0
- package/src/superlocalmemory/storage/schema_v343.py +24 -12
- 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 +306 -173
- package/src/superlocalmemory/ui/js/brain.js +5 -20
- package/src/superlocalmemory/ui/js/core.js +47 -31
- package/src/superlocalmemory/ui/js/dashboard.js +314 -63
- 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 +780 -0
- package/src/superlocalmemory/ui/js/od-brain.js +779 -0
- package/src/superlocalmemory/ui/js/od-entities.js +579 -0
- package/src/superlocalmemory/ui/js/od-graph.js +593 -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 +887 -0
- package/src/superlocalmemory/ui/js/od-mesh.js +539 -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 +1053 -0
- package/src/superlocalmemory/ui/js/od-shell.js +593 -0
- package/src/superlocalmemory/ui/js/od-skills.js +573 -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 +2 -2
- 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/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
|
-
|
|
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
|
-
|
|
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
|
@@ -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.0"
|
|
36
36
|
|
|
37
37
|
_REQUIRED_VERSIONS = {
|
|
38
38
|
"sentence_transformers": "5.3.0",
|