superlocalmemory 3.6.23 → 3.7.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/CHANGELOG.md +52 -0
- package/README.md +271 -71
- package/bin/slm-npm +43 -89
- package/ide/configs/antigravity-mcp.json +2 -2
- package/ide/configs/chatgpt-desktop-mcp.json +1 -1
- package/ide/configs/claude-desktop-mcp.json +2 -2
- package/ide/configs/windsurf-mcp.json +2 -2
- package/ide/hooks/context-hook.js +6 -2
- package/ide/hooks/post-recall-hook.js +7 -3
- package/ide/hooks/tool-event-hook.sh +2 -1
- package/package.json +18 -10
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/_GENERATED.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/pyproject.toml +40 -8
- package/scripts/postinstall-interactive.js +17 -94
- package/scripts/postinstall.js +185 -258
- package/scripts/preuninstall.js +9 -50
- package/src/superlocalmemory/__init__.py +2 -2
- package/src/superlocalmemory/attribution/mathematical_dna.py +1 -1
- package/src/superlocalmemory/attribution/signer.py +34 -19
- package/src/superlocalmemory/attribution/watermark.py +1 -1
- package/src/superlocalmemory/cli/_lazy_init.py +3 -5
- package/src/superlocalmemory/cli/commands.py +453 -191
- package/src/superlocalmemory/cli/context_commands.py +5 -4
- package/src/superlocalmemory/cli/daemon.py +282 -187
- package/src/superlocalmemory/cli/db_migrate.py +3 -1
- package/src/superlocalmemory/cli/diagnostics_cmd.py +28 -0
- package/src/superlocalmemory/cli/evidence_cmd.py +103 -0
- package/src/superlocalmemory/cli/ingest_cmd.py +7 -3
- package/src/superlocalmemory/cli/main.py +128 -31
- package/src/superlocalmemory/cli/pending_store.py +54 -38
- package/src/superlocalmemory/cli/scale_engine_cmd.py +37 -0
- package/src/superlocalmemory/cli/service_installer.py +57 -52
- package/src/superlocalmemory/cli/setup_wizard.py +142 -88
- package/src/superlocalmemory/cli/version_banner.py +2 -1
- package/src/superlocalmemory/code_graph/config.py +3 -1
- package/src/superlocalmemory/core/backend_orchestrator.py +81 -21
- package/src/superlocalmemory/core/config.py +65 -20
- package/src/superlocalmemory/core/consolidation_engine.py +9 -7
- package/src/superlocalmemory/core/context_cache.py +56 -8
- package/src/superlocalmemory/core/derivation_lineage.py +246 -0
- package/src/superlocalmemory/core/embedding_worker.py +32 -20
- package/src/superlocalmemory/core/embeddings.py +54 -18
- package/src/superlocalmemory/core/engine.py +150 -104
- package/src/superlocalmemory/core/engine_ingestion.py +513 -0
- package/src/superlocalmemory/core/engine_wiring.py +2 -0
- package/src/superlocalmemory/core/evidence_bundle.py +526 -0
- package/src/superlocalmemory/core/fact_consolidator.py +5 -11
- package/src/superlocalmemory/core/graph_analyzer.py +2 -2
- package/src/superlocalmemory/core/health_monitor.py +4 -2
- package/src/superlocalmemory/core/ingestion_command.py +636 -0
- package/src/superlocalmemory/core/injection.py +69 -18
- package/src/superlocalmemory/core/lifecycle_state.py +153 -0
- package/src/superlocalmemory/core/maintenance.py +1 -1
- package/src/superlocalmemory/core/maintenance_scheduler.py +51 -35
- package/src/superlocalmemory/core/mutations.py +143 -0
- package/src/superlocalmemory/core/platform_utils.py +7 -4
- package/src/superlocalmemory/core/ram_lock.py +16 -5
- package/src/superlocalmemory/core/rate_limit.py +1 -1
- package/src/superlocalmemory/core/recall_pipeline.py +60 -101
- package/src/superlocalmemory/core/recall_worker.py +76 -59
- package/src/superlocalmemory/core/registry.py +1 -1
- package/src/superlocalmemory/core/scale_engine.py +293 -0
- package/src/superlocalmemory/core/score_contract.py +62 -0
- package/src/superlocalmemory/core/security_primitives.py +3 -1
- package/src/superlocalmemory/core/slm_disabled.py +3 -5
- package/src/superlocalmemory/core/store_pipeline.py +172 -40
- package/src/superlocalmemory/core/tier_manager.py +32 -20
- package/src/superlocalmemory/core/worker_pool.py +13 -4
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +1 -1
- package/src/superlocalmemory/dynamics/eap_scheduler.py +10 -3
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +1 -1
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +1 -1
- package/src/superlocalmemory/encoding/auto_linker.py +1 -1
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +7 -16
- package/src/superlocalmemory/encoding/consolidator.py +22 -5
- package/src/superlocalmemory/encoding/fact_extractor.py +1 -1
- package/src/superlocalmemory/encoding/foresight.py +2 -0
- package/src/superlocalmemory/encoding/graph_builder.py +1 -1
- package/src/superlocalmemory/encoding/temporal_parser.py +2 -0
- package/src/superlocalmemory/evaluation/__init__.py +13 -0
- package/src/superlocalmemory/evaluation/calibration.py +308 -0
- package/src/superlocalmemory/evolution/skill_evolver.py +2 -1
- package/src/superlocalmemory/graph/cozo_backend.py +256 -23
- package/src/superlocalmemory/hooks/_outcome_common.py +21 -11
- package/src/superlocalmemory/hooks/antigravity_adapter.py +10 -31
- package/src/superlocalmemory/hooks/auto_invoker.py +25 -27
- package/src/superlocalmemory/hooks/auto_recall.py +31 -6
- package/src/superlocalmemory/hooks/auto_recall_hook.py +13 -33
- package/src/superlocalmemory/hooks/before_web_hook.py +9 -7
- package/src/superlocalmemory/hooks/claude_code_hooks.py +123 -35
- package/src/superlocalmemory/hooks/codex_assets.py +59 -0
- package/src/superlocalmemory/hooks/codex_hooks.py +186 -0
- package/src/superlocalmemory/hooks/context_payload.py +1 -1
- package/src/superlocalmemory/hooks/copilot_adapter.py +9 -24
- package/src/superlocalmemory/hooks/cursor_adapter.py +10 -32
- package/src/superlocalmemory/hooks/hook_daemon.py +4 -2
- package/src/superlocalmemory/hooks/hook_handlers.py +219 -32
- package/src/superlocalmemory/hooks/memory_protocol.py +5 -3
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +4 -2
- package/src/superlocalmemory/hooks/session_registry.py +15 -8
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +10 -6
- package/src/superlocalmemory/hooks/topic_shift_hook.py +42 -12
- package/src/superlocalmemory/hooks/user_prompt_hook.py +9 -14
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +19 -11
- package/src/superlocalmemory/infra/auth_middleware.py +38 -5
- package/src/superlocalmemory/infra/backup.py +7 -5
- package/src/superlocalmemory/infra/cloud_backup.py +18 -8
- package/src/superlocalmemory/infra/daemon_identity.py +248 -0
- package/src/superlocalmemory/infra/data_root.py +199 -0
- package/src/superlocalmemory/infra/event_bus.py +3 -1
- package/src/superlocalmemory/infra/local_diagnostics.py +327 -0
- package/src/superlocalmemory/infra/process_reaper.py +23 -0
- package/src/superlocalmemory/ingestion/adapter_manager.py +27 -9
- package/src/superlocalmemory/ingestion/base_adapter.py +25 -31
- package/src/superlocalmemory/ingestion/calendar_adapter.py +13 -4
- package/src/superlocalmemory/ingestion/credentials.py +14 -7
- package/src/superlocalmemory/ingestion/gmail_adapter.py +13 -4
- package/src/superlocalmemory/ingestion/transcript_adapter.py +7 -2
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +1 -1
- package/src/superlocalmemory/learning/ensemble.py +11 -0
- package/src/superlocalmemory/learning/entity_compiler.py +1 -1
- package/src/superlocalmemory/learning/feedback.py +1 -1
- package/src/superlocalmemory/learning/forgetting_scheduler.py +12 -7
- package/src/superlocalmemory/learning/quantization_scheduler.py +1 -1
- package/src/superlocalmemory/learning/ranker.py +4 -1
- package/src/superlocalmemory/learning/source_quality.py +1 -1
- package/src/superlocalmemory/learning/trigram_index.py +3 -2
- package/src/superlocalmemory/llm/backbone.py +1 -1
- package/src/superlocalmemory/math/ebbinghaus.py +1 -1
- package/src/superlocalmemory/math/fisher.py +1 -1
- package/src/superlocalmemory/math/fisher_quantized.py +1 -1
- package/src/superlocalmemory/math/hopfield.py +1 -1
- package/src/superlocalmemory/math/langevin.py +1 -1
- package/src/superlocalmemory/math/polar_quant.py +3 -4
- package/src/superlocalmemory/math/qjl.py +1 -1
- package/src/superlocalmemory/math/sheaf.py +1 -1
- package/src/superlocalmemory/math/turbo_quant.py +3 -2
- package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -11
- package/src/superlocalmemory/mcp/_pool_adapter.py +27 -0
- package/src/superlocalmemory/mcp/http_transport.py +53 -0
- package/src/superlocalmemory/mcp/server.py +39 -13
- package/src/superlocalmemory/mcp/shared.py +69 -3
- package/src/superlocalmemory/mcp/tools_active.py +141 -31
- package/src/superlocalmemory/mcp/tools_core.py +128 -29
- package/src/superlocalmemory/mcp/tools_evolution.py +5 -7
- package/src/superlocalmemory/mcp/tools_learning.py +42 -2
- package/src/superlocalmemory/mcp/tools_mesh.py +7 -23
- package/src/superlocalmemory/mcp/tools_optimize.py +8 -1
- package/src/superlocalmemory/mcp/tools_v28.py +23 -2
- package/src/superlocalmemory/mcp/tools_v3.py +26 -1
- package/src/superlocalmemory/mcp/tools_v33.py +56 -17
- package/src/superlocalmemory/mesh/broker.py +2 -0
- package/src/superlocalmemory/mesh/remote_sync.py +50 -12
- package/src/superlocalmemory/optimize/cache/manager.py +77 -1
- package/src/superlocalmemory/optimize/cache/semantic.py +23 -3
- package/src/superlocalmemory/optimize/compress/ccr.py +4 -0
- package/src/superlocalmemory/optimize/compress/router.py +6 -1
- package/src/superlocalmemory/optimize/config/__init__.py +5 -0
- package/src/superlocalmemory/optimize/config/store.py +6 -4
- package/src/superlocalmemory/optimize/proxy/_helpers.py +15 -5
- package/src/superlocalmemory/optimize/proxy/capture.py +3 -2
- package/src/superlocalmemory/optimize/proxy/server.py +2 -2
- package/src/superlocalmemory/optimize/storage/db.py +12 -12
- package/src/superlocalmemory/retrieval/agentic.py +1 -1
- package/src/superlocalmemory/retrieval/ann_index.py +1 -1
- package/src/superlocalmemory/retrieval/bm25_channel.py +35 -11
- package/src/superlocalmemory/retrieval/bridge_discovery.py +73 -8
- package/src/superlocalmemory/retrieval/engine.py +169 -79
- package/src/superlocalmemory/retrieval/entity_channel.py +289 -67
- package/src/superlocalmemory/retrieval/forgetting_filter.py +1 -1
- package/src/superlocalmemory/retrieval/fusion.py +1 -1
- package/src/superlocalmemory/retrieval/hopfield_channel.py +118 -30
- package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +16 -10
- package/src/superlocalmemory/retrieval/reranker.py +56 -20
- package/src/superlocalmemory/retrieval/scope_policy.py +85 -0
- package/src/superlocalmemory/retrieval/semantic_channel.py +122 -14
- package/src/superlocalmemory/retrieval/spreading_activation.py +141 -25
- package/src/superlocalmemory/retrieval/strategy.py +1 -1
- package/src/superlocalmemory/retrieval/temporal_channel.py +30 -15
- package/src/superlocalmemory/retrieval/vector_store.py +1 -1
- package/src/superlocalmemory/server/api.py +10 -7
- package/src/superlocalmemory/server/bandit_loops.py +4 -2
- package/src/superlocalmemory/server/recall_serializer.py +24 -0
- package/src/superlocalmemory/server/route_mutations.py +84 -0
- package/src/superlocalmemory/server/routes/agents.py +8 -6
- package/src/superlocalmemory/server/routes/brain.py +14 -12
- package/src/superlocalmemory/server/routes/chat.py +29 -12
- package/src/superlocalmemory/server/routes/data_io.py +55 -24
- package/src/superlocalmemory/server/routes/helpers.py +8 -63
- package/src/superlocalmemory/server/routes/ingest.py +53 -36
- package/src/superlocalmemory/server/routes/memories.py +104 -43
- package/src/superlocalmemory/server/routes/mesh.py +31 -0
- package/src/superlocalmemory/server/routes/profiles.py +26 -4
- package/src/superlocalmemory/server/routes/tiers.py +43 -11
- package/src/superlocalmemory/server/routes/timeline.py +5 -1
- package/src/superlocalmemory/server/routes/v3_api.py +76 -21
- package/src/superlocalmemory/server/security_middleware.py +1 -1
- package/src/superlocalmemory/server/unified_daemon.py +680 -293
- package/src/superlocalmemory/server/write_identity.py +147 -0
- package/src/superlocalmemory/storage/access_log.py +4 -3
- package/src/superlocalmemory/storage/database.py +118 -25
- package/src/superlocalmemory/storage/migration_runner.py +84 -1
- package/src/superlocalmemory/storage/migration_v33.py +1 -1
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +6 -60
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +120 -0
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +54 -0
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +52 -0
- package/src/superlocalmemory/storage/migrations/__init__.py +5 -0
- package/src/superlocalmemory/storage/models.py +16 -0
- package/src/superlocalmemory/storage/quantized_store.py +20 -3
- package/src/superlocalmemory/storage/v2_migrator.py +5 -3
- package/src/superlocalmemory/ui/favicon.svg +5 -0
- package/src/superlocalmemory/ui/index.html +1 -0
- package/src/superlocalmemory/ui/js/compliance.js +1 -1
- package/src/superlocalmemory/ui/js/core.js +49 -8
- package/src/superlocalmemory/ui/js/dashboard.js +23 -2
- package/src/superlocalmemory/ui/js/feedback.js +1 -1
- package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
- package/src/superlocalmemory/ui/js/graph-ui.js +1 -1
- package/src/superlocalmemory/ui/js/lifecycle.js +1 -1
- package/src/superlocalmemory/ui/js/ng-mesh.js +15 -49
- package/src/superlocalmemory/ui/js/settings.js +4 -2
- package/src/superlocalmemory/vector/lancedb_backend.py +57 -9
- package/bin/slm +0 -59
- package/bin/slm.bat +0 -77
- package/bin/slm.cmd +0 -5
- package/ide/integrations/langchain/README.md +0 -106
- package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +0 -9
- package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +0 -201
- package/ide/integrations/langchain/pyproject.toml +0 -38
- package/ide/integrations/langchain/tests/__init__.py +0 -3
- package/ide/integrations/langchain/tests/test_chat_message_history.py +0 -215
- package/ide/integrations/langchain/tests/test_security.py +0 -117
- package/ide/integrations/llamaindex/README.md +0 -81
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +0 -9
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +0 -316
- package/ide/integrations/llamaindex/pyproject.toml +0 -43
- package/ide/integrations/llamaindex/tests/__init__.py +0 -3
- package/ide/integrations/llamaindex/tests/test_chat_store.py +0 -294
- package/ide/integrations/llamaindex/tests/test_security.py +0 -241
- 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 -15
- package/plugin-src/scripts/slm-launch.bat +0 -17
- package/plugin-src/settings.json +0 -16
- package/plugin-src/skills/slm-cache/SKILL.md +0 -140
- package/plugin-src/skills/slm-compress/SKILL.md +0 -143
- package/plugin-src/skills/slm-graph/SKILL.md +0 -300
- package/plugin-src/skills/slm-recall/SKILL.md +0 -204
- package/plugin-src/skills/slm-remember/SKILL.md +0 -194
- package/plugin-src/skills/slm-session/SKILL.md +0 -207
- package/plugin-src/skills/slm-status/SKILL.md +0 -149
- package/scripts/__tests__/build-plugin.test.mjs +0 -613
- package/scripts/_savings_math.py +0 -270
- package/scripts/build-dmg.sh +0 -417
- package/scripts/build-plugin.js +0 -742
- package/scripts/build-slm-hook.ps1 +0 -40
- package/scripts/build-slm-hook.sh +0 -45
- package/scripts/build_entry.py +0 -452
- package/scripts/ci/stage5b_gate.sh +0 -50
- package/scripts/dogfood_savings.py +0 -490
- package/scripts/generate-thumbnails.py +0 -218
- package/scripts/install-skills.ps1 +0 -4
- package/scripts/install-skills.sh +0 -5
- package/scripts/install.ps1 +0 -701
- package/scripts/install.sh +0 -1015
- package/scripts/postinstall_binary.js +0 -287
- package/scripts/prepack.js +0 -33
- package/scripts/release_manifest.py +0 -273
- package/scripts/slm-hook.spec +0 -56
- package/scripts/start-dashboard.ps1 +0 -52
- package/scripts/start-dashboard.sh +0 -41
- package/scripts/sync-wiki.ps1 +0 -127
- package/scripts/sync-wiki.sh +0 -82
- package/scripts/test-dmg.sh +0 -161
- package/scripts/test-npm-package.ps1 +0 -252
- package/scripts/test-npm-package.sh +0 -207
- package/scripts/verify-install.ps1 +0 -294
- package/scripts/verify-install.sh +0 -266
- package/scripts/verify-v27.ps1 +0 -301
- package/scripts/verify-v27.sh +0 -233
- package/src/superlocalmemory.egg-info/PKG-INFO +0 -516
- package/src/superlocalmemory.egg-info/SOURCES.txt +0 -529
- package/src/superlocalmemory.egg-info/dependency_links.txt +0 -1
- package/src/superlocalmemory.egg-info/entry_points.txt +0 -2
- package/src/superlocalmemory.egg-info/requires.txt +0 -71
- package/src/superlocalmemory.egg-info/top_level.txt +0 -1
package/bin/slm-npm
CHANGED
|
@@ -1,103 +1,57 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* SuperLocalMemory V3 - NPM
|
|
3
|
+
* SuperLocalMemory V3 - NPM CLI wrapper.
|
|
4
|
+
*
|
|
5
|
+
* Executes only the Python interpreter installed into this npm package's
|
|
6
|
+
* private virtual environment. The Python runtime owns canonical data-root
|
|
7
|
+
* precedence (SLM_DATA_DIR, SL_MEMORY_PATH, SLM_HOME); this wrapper passes the
|
|
8
|
+
* environment through and performs no durable-data writes.
|
|
4
9
|
*
|
|
5
10
|
* Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
6
|
-
* Licensed under
|
|
7
|
-
* Repository: https://github.com/qualixar/superlocalmemory
|
|
11
|
+
* Licensed under AGPL-3.0-or-later.
|
|
8
12
|
*/
|
|
9
13
|
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
10
16
|
const { spawnSync } = require('child_process');
|
|
11
17
|
const path = require('path');
|
|
12
18
|
const os = require('os');
|
|
13
19
|
const fs = require('fs');
|
|
14
20
|
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
'/usr/bin/python3',
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
// On Windows, also check common locations
|
|
31
|
-
if (os.platform() === 'win32') {
|
|
32
|
-
candidates.push(
|
|
33
|
-
'py -3',
|
|
34
|
-
path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python312', 'python.exe'),
|
|
35
|
-
path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python311', 'python.exe'),
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
for (const candidate of candidates) {
|
|
40
|
-
try {
|
|
41
|
-
const parts = candidate.split(' ');
|
|
42
|
-
const result = spawnSync(parts[0], [...parts.slice(1), '--version'], {
|
|
43
|
-
stdio: 'pipe',
|
|
44
|
-
timeout: 5000,
|
|
45
|
-
});
|
|
46
|
-
if (result.status === 0) {
|
|
47
|
-
const version = (result.stdout || '').toString().trim();
|
|
48
|
-
if (version.includes('3.')) {
|
|
49
|
-
return candidate;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
} catch (e) {
|
|
53
|
-
// Try next candidate
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return null;
|
|
21
|
+
const packageRoot = path.resolve(__dirname, '..');
|
|
22
|
+
const runtimePython = os.platform() === 'win32'
|
|
23
|
+
? path.join(packageRoot, '.slm-venv', 'Scripts', 'python.exe')
|
|
24
|
+
: path.join(packageRoot, '.slm-venv', 'bin', 'python');
|
|
25
|
+
|
|
26
|
+
if (!fs.existsSync(runtimePython)) {
|
|
27
|
+
console.error('SuperLocalMemory npm runtime is missing or incomplete.');
|
|
28
|
+
console.error(`Expected the package-owned interpreter at: ${runtimePython}`);
|
|
29
|
+
console.error('Repair it without touching system Python by running:');
|
|
30
|
+
console.error(' npm rebuild superlocalmemory');
|
|
31
|
+
console.error('If Python is missing, install Python 3.11-3.14 first.');
|
|
32
|
+
process.exit(1);
|
|
57
33
|
}
|
|
58
34
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
35
|
+
const runtimeEnv = {
|
|
36
|
+
...process.env,
|
|
37
|
+
PYTORCH_MPS_HIGH_WATERMARK_RATIO: '0.0',
|
|
38
|
+
PYTORCH_MPS_MEM_LIMIT: '0',
|
|
39
|
+
PYTORCH_ENABLE_MPS_FALLBACK: '1',
|
|
40
|
+
TOKENIZERS_PARALLELISM: 'false',
|
|
41
|
+
TORCH_DEVICE: 'cpu',
|
|
42
|
+
CUDA_VISIBLE_DEVICES: '',
|
|
43
|
+
};
|
|
44
|
+
// Never let a caller's development checkout override the npm artifact.
|
|
45
|
+
delete runtimeEnv.PYTHONPATH;
|
|
46
|
+
|
|
47
|
+
const result = spawnSync(
|
|
48
|
+
runtimePython,
|
|
49
|
+
['-m', 'superlocalmemory.cli.main', ...process.argv.slice(2)],
|
|
50
|
+
{ stdio: 'inherit', env: runtimeEnv },
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
if (result.error) {
|
|
54
|
+
console.error(`SuperLocalMemory runtime failed to start: ${result.error.message}`);
|
|
55
|
+
process.exit(1);
|
|
63
56
|
}
|
|
64
|
-
|
|
65
|
-
// Find Python
|
|
66
|
-
const python = findPython();
|
|
67
|
-
if (!python) {
|
|
68
|
-
console.error('Error: Python 3.11+ not found.');
|
|
69
|
-
console.error('Install Python from https://python.org/downloads/');
|
|
70
|
-
process.exit(1);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Handle --version directly from package.json (Python importlib.metadata
|
|
74
|
-
// fails when running via PYTHONPATH instead of pip install)
|
|
75
|
-
const args = process.argv.slice(2);
|
|
76
|
-
if (args.includes('--version') || args.includes('-v')) {
|
|
77
|
-
const pkg = require(path.join(PKG_ROOT, 'package.json'));
|
|
78
|
-
console.log(`superlocalmemory ${pkg.version}`);
|
|
79
|
-
process.exit(0);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Launch V3 CLI via Python module
|
|
83
|
-
const pythonParts = python.split(' ');
|
|
84
|
-
const result = spawnSync(pythonParts[0], [
|
|
85
|
-
...pythonParts.slice(1),
|
|
86
|
-
'-m', CLI_MODULE, ...args
|
|
87
|
-
], {
|
|
88
|
-
stdio: 'inherit',
|
|
89
|
-
env: {
|
|
90
|
-
...process.env,
|
|
91
|
-
PYTHONPATH: SRC_DIR + (process.env.PYTHONPATH ? path.delimiter + process.env.PYTHONPATH : ''),
|
|
92
|
-
// Prevent PyTorch Metal/MPS GPU memory reservation on Apple Silicon.
|
|
93
|
-
// Without these, macOS Activity Monitor shows 3-6 GB for a 40 MB process.
|
|
94
|
-
PYTORCH_MPS_HIGH_WATERMARK_RATIO: '0.0',
|
|
95
|
-
PYTORCH_MPS_MEM_LIMIT: '0',
|
|
96
|
-
PYTORCH_ENABLE_MPS_FALLBACK: '1',
|
|
97
|
-
TOKENIZERS_PARALLELISM: 'false',
|
|
98
|
-
TORCH_DEVICE: 'cpu',
|
|
99
|
-
CUDA_VISIBLE_DEVICES: '',
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
process.exit(result.status || 0);
|
|
57
|
+
process.exit(Number.isInteger(result.status) ? result.status : 1);
|
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
"step7": "In any chat, click + -> More -> select SuperLocalMemory connector"
|
|
13
13
|
},
|
|
14
14
|
"_alternative_transport": "For Streamable HTTP (recommended): slm serve --transport streamable-http --port 8417",
|
|
15
|
-
"_note": "
|
|
15
|
+
"_note": "The MCP server and core memory state run locally. A tunnel transmits requested MCP data to ChatGPT; review that data path and any optional integrations before enabling it."
|
|
16
16
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SuperLocalMemory V3 - Session Start Context Hook
|
|
4
4
|
* Copyright (c) 2026 Varun Pratap Bhardwaj
|
|
5
|
-
* Licensed under
|
|
5
|
+
* Licensed under GNU Affero General Public License v3.0 or later
|
|
6
6
|
*
|
|
7
7
|
* Loads recent memories and learned patterns on Claude Code session start.
|
|
8
8
|
* Outputs context to stderr (Claude Code reads hook stderr as context).
|
|
@@ -13,10 +13,14 @@ const { execFile } = require('child_process');
|
|
|
13
13
|
const { promisify } = require('util');
|
|
14
14
|
const path = require('path');
|
|
15
15
|
const fs = require('fs');
|
|
16
|
+
const os = require('os');
|
|
16
17
|
|
|
17
18
|
const execFileAsync = promisify(execFile);
|
|
18
19
|
|
|
19
|
-
const MEMORY_DIR =
|
|
20
|
+
const MEMORY_DIR = process.env.SLM_DATA_DIR
|
|
21
|
+
|| process.env.SL_MEMORY_PATH
|
|
22
|
+
|| process.env.SLM_HOME
|
|
23
|
+
|| path.join(os.homedir(), '.superlocalmemory');
|
|
20
24
|
const DB_PATH = path.join(MEMORY_DIR, 'memory.db');
|
|
21
25
|
|
|
22
26
|
async function loadSessionContext() {
|
|
@@ -2,21 +2,25 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SuperLocalMemory V3 - Post-Recall Hook
|
|
4
4
|
* Copyright (c) 2026 Varun Pratap Bhardwaj
|
|
5
|
-
* Licensed under
|
|
5
|
+
* Licensed under GNU Affero General Public License v3.0 or later
|
|
6
6
|
*
|
|
7
7
|
* Claude Code hook that tracks recall events for implicit signal collection.
|
|
8
8
|
* This hook fires after the slm-recall skill completes, recording timing
|
|
9
9
|
* data that the signal inference engine uses to detect satisfaction/dissatisfaction.
|
|
10
10
|
*
|
|
11
11
|
* Installation: Automatically registered via install-skills.sh
|
|
12
|
-
*
|
|
12
|
+
* The core hook reads local SLM state; the host client and optional integrations
|
|
13
|
+
* retain their own network behavior.
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
16
|
const fs = require('fs');
|
|
16
17
|
const path = require('path');
|
|
17
18
|
const os = require('os');
|
|
18
19
|
|
|
19
|
-
const MEMORY_DIR =
|
|
20
|
+
const MEMORY_DIR = process.env.SLM_DATA_DIR
|
|
21
|
+
|| process.env.SL_MEMORY_PATH
|
|
22
|
+
|| process.env.SLM_HOME
|
|
23
|
+
|| path.join(os.homedir(), '.superlocalmemory');
|
|
20
24
|
const HOOK_LOG = path.join(MEMORY_DIR, 'recall-events.jsonl');
|
|
21
25
|
|
|
22
26
|
// Parse input from Claude Code hook system
|
|
@@ -58,7 +58,8 @@ esac
|
|
|
58
58
|
|
|
59
59
|
# Get daemon port
|
|
60
60
|
PORT=8765
|
|
61
|
-
|
|
61
|
+
DATA_ROOT="${SLM_DATA_DIR:-${SL_MEMORY_PATH:-${SLM_HOME:-$HOME/.superlocalmemory}}}"
|
|
62
|
+
PORT_FILE="$DATA_ROOT/daemon.port"
|
|
62
63
|
[ -f "$PORT_FILE" ] && PORT=$(cat "$PORT_FILE" 2>/dev/null || echo 8765)
|
|
63
64
|
|
|
64
65
|
# If no python, send basic event (backward compatible)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superlocalmemory",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.7.0",
|
|
4
|
+
"description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-memory",
|
|
7
7
|
"claude-ai",
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"superlocalmemory": "./bin/slm-npm"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
|
-
"build:plugin": "node scripts/build-plugin.
|
|
50
|
-
"check:plugin": "node scripts/build-plugin.
|
|
51
|
-
"prepack": "node scripts/build-plugin.
|
|
49
|
+
"build:plugin": "node scripts/build-plugin.mjs",
|
|
50
|
+
"check:plugin": "node scripts/build-plugin.mjs --check",
|
|
51
|
+
"prepack": "node scripts/build-plugin.mjs && node scripts/prepack.js",
|
|
52
52
|
"postinstall": "node scripts/postinstall.js",
|
|
53
53
|
"preuninstall": "node scripts/preuninstall.js",
|
|
54
54
|
"test": "node --test 'tests/ui/*.mjs'"
|
|
@@ -63,13 +63,21 @@
|
|
|
63
63
|
"win32"
|
|
64
64
|
],
|
|
65
65
|
"files": [
|
|
66
|
-
"bin/",
|
|
67
|
-
"src/",
|
|
68
|
-
"
|
|
69
|
-
"
|
|
66
|
+
"bin/slm-npm",
|
|
67
|
+
"src/superlocalmemory/",
|
|
68
|
+
"!src/**/__pycache__/",
|
|
69
|
+
"!src/**/*.pyc",
|
|
70
|
+
"!src/**/*.pyo",
|
|
71
|
+
"ide/completions/",
|
|
72
|
+
"ide/configs/",
|
|
73
|
+
"ide/hooks/",
|
|
74
|
+
"scripts/postinstall.js",
|
|
75
|
+
"scripts/postinstall-interactive.js",
|
|
76
|
+
"scripts/postinstall/validation.js",
|
|
77
|
+
"scripts/preuninstall.js",
|
|
70
78
|
".claude-plugin/",
|
|
71
79
|
"plugin/",
|
|
72
|
-
"plugin-src/",
|
|
80
|
+
"plugin-src/rules/AGENTS.md",
|
|
73
81
|
"docs/pi-dev-integration.md",
|
|
74
82
|
"pyproject.toml",
|
|
75
83
|
"README.md",
|
package/plugin/_GENERATED.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# _GENERATED — DO NOT HAND-EDIT
|
|
2
2
|
|
|
3
|
-
This directory is generated by `scripts/build-plugin.
|
|
3
|
+
This directory is generated by `scripts/build-plugin.mjs` from `plugin-src/`.
|
|
4
4
|
Run `npm run build:plugin` to regenerate.
|
|
5
5
|
Run `npm run check:plugin` (or `--check`) in CI to verify in-sync.
|
|
6
6
|
Source of truth: `plugin-src/skills/`, `plugin-src/manifest.json`.
|
|
@@ -10,7 +10,7 @@ model: inherit
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Role
|
|
13
|
-
You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions.
|
|
13
|
+
You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. Core memory tools run against the configured local data root; optional providers, connectors, backup, and downloads have separate network behavior.
|
|
14
14
|
|
|
15
15
|
# When to act
|
|
16
16
|
When the main agent: starts a session and hasn't loaded project context; is about to or just made a decision worth persisting; asks "what did we decide about X"; gets recall results that look irrelevant/empty.
|
package/plugin/requirements.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
superlocalmemory==3.
|
|
1
|
+
superlocalmemory==3.7.0
|
|
@@ -63,7 +63,7 @@ session_init(
|
|
|
63
63
|
### What it does
|
|
64
64
|
|
|
65
65
|
1. Derives a search query from `project_path` (or uses your explicit `query`).
|
|
66
|
-
2. Runs a 2-tier recall: full
|
|
66
|
+
2. Runs a 2-tier recall: full daemon retrieval (primary) or FTS5 BM25
|
|
67
67
|
(emergency fallback if daemon is unreachable).
|
|
68
68
|
3. Merges any pinned "core memory" facts with the recall results.
|
|
69
69
|
4. Applies an age gate — memories older than `max_age_days` are suppressed
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# SuperLocalMemory — Agent Rules
|
|
2
2
|
|
|
3
3
|
> Drop into any IDE agent config or AGENTS.md to give agents disciplined SLM usage.
|
|
4
|
-
> SLM is local-first:
|
|
4
|
+
> SLM is local-first: MCP memory tools use the configured local runtime. Optional providers, connectors, backup, and downloads have separate network behavior.
|
|
5
5
|
> Prefer MCP tools when the server is running; use the CLI fallback table when not.
|
|
6
6
|
|
|
7
7
|
---
|
package/pyproject.toml
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "superlocalmemory"
|
|
3
|
-
version = "3.
|
|
4
|
-
description = "
|
|
3
|
+
version = "3.7.0"
|
|
4
|
+
description = "Local-first agent memory with auditable hybrid retrieval"
|
|
5
5
|
readme = "README.md"
|
|
6
|
-
license =
|
|
6
|
+
license = "AGPL-3.0-or-later"
|
|
7
|
+
license-files = ["LICENSE", "NOTICE"]
|
|
7
8
|
requires-python = ">=3.11,<3.15"
|
|
8
9
|
authors = [
|
|
9
10
|
{name = "Varun Pratap Bhardwaj", email = "admin@superlocalmemory.com"},
|
|
@@ -15,7 +16,6 @@ keywords = [
|
|
|
15
16
|
classifiers = [
|
|
16
17
|
"Development Status :: 4 - Beta",
|
|
17
18
|
"Intended Audience :: Developers",
|
|
18
|
-
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
|
|
19
19
|
"Operating System :: OS Independent",
|
|
20
20
|
"Operating System :: MacOS",
|
|
21
21
|
"Operating System :: Microsoft :: Windows",
|
|
@@ -73,6 +73,12 @@ dependencies = [
|
|
|
73
73
|
"scikit-learn==1.8.0",
|
|
74
74
|
# Vector KNN extension for the semantic channel.
|
|
75
75
|
"sqlite-vec==0.1.9",
|
|
76
|
+
# Scale Engine projections. These ship with the base install so every
|
|
77
|
+
# fresh Python user can prepare them on day one. They remain inactive
|
|
78
|
+
# until `slm db scale prepare -> verify -> promote` proves parity with
|
|
79
|
+
# canonical SQLite; dependency installation never migrates user data.
|
|
80
|
+
"lancedb==0.30.2",
|
|
81
|
+
"pycozo[embedded]==0.3.0",
|
|
76
82
|
# v3.6.10: LLMLingua-2 prose compression (aggressive mode, opt-in at runtime).
|
|
77
83
|
# Hard dependency so `pip install superlocalmemory` ships compression-ready;
|
|
78
84
|
# the ~560MB model downloads on first setup/warmup (fail-open). Verified the
|
|
@@ -108,6 +114,18 @@ learning = [
|
|
|
108
114
|
performance = [
|
|
109
115
|
"orjson>=3.9.0",
|
|
110
116
|
]
|
|
117
|
+
lancedb = [
|
|
118
|
+
"lancedb==0.30.2",
|
|
119
|
+
]
|
|
120
|
+
cozo = [
|
|
121
|
+
"pycozo[embedded]==0.3.0",
|
|
122
|
+
]
|
|
123
|
+
# Backwards-compatible explicit install target for automation and docs. The
|
|
124
|
+
# packages are also base dependencies from v3.7 onward.
|
|
125
|
+
scale = [
|
|
126
|
+
"lancedb==0.30.2",
|
|
127
|
+
"pycozo[embedded]==0.3.0",
|
|
128
|
+
]
|
|
111
129
|
ingestion = [
|
|
112
130
|
"keyring>=25.0.0",
|
|
113
131
|
"google-auth-oauthlib>=1.2.0",
|
|
@@ -115,13 +133,16 @@ ingestion = [
|
|
|
115
133
|
"icalendar>=6.0.0",
|
|
116
134
|
]
|
|
117
135
|
full = [
|
|
118
|
-
"superlocalmemory[search,ui,learning,performance,ingestion,injection]",
|
|
136
|
+
"superlocalmemory[search,ui,learning,performance,ingestion,injection,scale]",
|
|
119
137
|
]
|
|
120
138
|
dev = [
|
|
121
139
|
"pytest>=8.0",
|
|
122
140
|
"pytest-cov>=4.1",
|
|
123
141
|
"pytest-asyncio>=0.21",
|
|
124
142
|
"sqlite-vec>=0.1.6",
|
|
143
|
+
# Starlette TestClient's maintained synchronous backend. Test-only: the
|
|
144
|
+
# product runtime continues to use the separately pinned httpx client.
|
|
145
|
+
"httpx2==2.5.0",
|
|
125
146
|
]
|
|
126
147
|
|
|
127
148
|
[project.urls]
|
|
@@ -134,25 +155,35 @@ Issues = "https://github.com/qualixar/superlocalmemory/issues"
|
|
|
134
155
|
slm = "superlocalmemory.cli.main:main"
|
|
135
156
|
|
|
136
157
|
[build-system]
|
|
137
|
-
requires = ["setuptools>=
|
|
158
|
+
requires = ["setuptools>=77.0.3", "wheel"]
|
|
138
159
|
build-backend = "setuptools.build_meta"
|
|
139
160
|
|
|
140
161
|
[tool.setuptools.packages.find]
|
|
141
162
|
where = ["src"]
|
|
142
163
|
|
|
143
164
|
[tool.setuptools.package-data]
|
|
144
|
-
superlocalmemory = ["ui/**/*"]
|
|
165
|
+
superlocalmemory = ["ui/**/*", "optimize/NOTICE"]
|
|
166
|
+
|
|
167
|
+
[tool.setuptools.data-files]
|
|
168
|
+
"share/superlocalmemory/codex/skills/slm-cache" = ["plugin-src/skills/slm-cache/SKILL.md"]
|
|
169
|
+
"share/superlocalmemory/codex/skills/slm-compress" = ["plugin-src/skills/slm-compress/SKILL.md"]
|
|
170
|
+
"share/superlocalmemory/codex/skills/slm-graph" = ["plugin-src/skills/slm-graph/SKILL.md"]
|
|
171
|
+
"share/superlocalmemory/codex/skills/slm-recall" = ["plugin-src/skills/slm-recall/SKILL.md"]
|
|
172
|
+
"share/superlocalmemory/codex/skills/slm-remember" = ["plugin-src/skills/slm-remember/SKILL.md"]
|
|
173
|
+
"share/superlocalmemory/codex/skills/slm-session" = ["plugin-src/skills/slm-session/SKILL.md"]
|
|
174
|
+
"share/superlocalmemory/codex/skills/slm-status" = ["plugin-src/skills/slm-status/SKILL.md"]
|
|
145
175
|
|
|
146
176
|
[tool.pytest.ini_options]
|
|
147
177
|
testpaths = ["tests"]
|
|
148
178
|
pythonpath = ["src"]
|
|
149
|
-
addopts = "-p no:cacheprovider -p no:subtests -m 'not slow and not ollama and not benchmark'"
|
|
179
|
+
addopts = "-p no:cacheprovider -p no:subtests -m 'not slow and not ollama and not benchmark and not native'"
|
|
150
180
|
asyncio_mode = "auto"
|
|
151
181
|
faulthandler_timeout = 0
|
|
152
182
|
markers = [
|
|
153
183
|
"slow: marks tests as slow — real engine/model loading (run with: pytest -m slow)",
|
|
154
184
|
"ollama: marks tests that require a running Ollama instance",
|
|
155
185
|
"benchmark: marks CI-only evo-memory benchmark tests (run with: pytest tests/test_benchmarks/ -m benchmark)",
|
|
186
|
+
"native: marks optional native-backend tests that run in a dedicated process lane",
|
|
156
187
|
"asyncio: marks tests as async — runs via pytest-asyncio (auto-mode in this project)",
|
|
157
188
|
]
|
|
158
189
|
filterwarnings = [
|
|
@@ -192,6 +223,7 @@ select = ["E", "F", "I", "W"]
|
|
|
192
223
|
[dependency-groups]
|
|
193
224
|
dev = [
|
|
194
225
|
"build>=1.4.0",
|
|
226
|
+
"httpx2==2.5.0",
|
|
195
227
|
"pytest>=9.0.2",
|
|
196
228
|
"pytest-asyncio>=0.21",
|
|
197
229
|
"twine>=6.2.0",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* SuperLocalMemory
|
|
3
|
+
* SuperLocalMemory — Interactive Profile Configurator
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Invoked explicitly by `slm reconfigure`; it is not an npm lifecycle hook.
|
|
6
6
|
*
|
|
7
7
|
* Responsibilities:
|
|
8
8
|
* 1. Detect TTY; non-TTY (CI, piped stdin) → apply Balanced defaults
|
|
@@ -489,9 +489,9 @@ async function runInteractiveFlow(rl, recommendedProfile) {
|
|
|
489
489
|
// under 60 LOC per Stage-8 G2 scope.
|
|
490
490
|
function printLivingBrainDelta() {
|
|
491
491
|
console.log('');
|
|
492
|
-
console.log('
|
|
492
|
+
console.log('Current setup guarantees:');
|
|
493
493
|
console.log(' + session_init mandate hook — Claude calls ToolSearch→session_init first, every session');
|
|
494
|
-
console.log(' +
|
|
494
|
+
console.log(' + External IDE integrations are installed only after explicit consent in `slm setup`');
|
|
495
495
|
console.log(' + M017 migration — ccq_consolidated_blocks gets scope column (no more silent CCQ scope drop)');
|
|
496
496
|
console.log(' + GC-safe test flags baked into pyproject.toml + Makefile (no more macOS ARM SIGSEGV)');
|
|
497
497
|
console.log('What\'s unchanged:');
|
|
@@ -500,88 +500,6 @@ function printLivingBrainDelta() {
|
|
|
500
500
|
console.log(' * All CLI commands you already use');
|
|
501
501
|
}
|
|
502
502
|
|
|
503
|
-
// T1-B: Auto-install the Claude Code plugin after pip/npm install.
|
|
504
|
-
// Best-effort: never fails the installer, never blocks the main flow.
|
|
505
|
-
// Checks for `claude` CLI, then runs:
|
|
506
|
-
// 1. claude plugin marketplace add qualixar/superlocalmemory
|
|
507
|
-
// 2. claude plugin install superlocalmemory@qualixar
|
|
508
|
-
// 3. slm hooks install
|
|
509
|
-
async function tryInstallClaudePlugin() {
|
|
510
|
-
const { execFile } = require('child_process');
|
|
511
|
-
const { promisify } = require('util');
|
|
512
|
-
const execFileAsync = promisify(execFile);
|
|
513
|
-
|
|
514
|
-
// Find claude binary — try PATH first, then common install locations.
|
|
515
|
-
const claudeCandidates = ['claude'];
|
|
516
|
-
if (process.platform !== 'win32') {
|
|
517
|
-
claudeCandidates.push(
|
|
518
|
-
'/usr/local/bin/claude',
|
|
519
|
-
process.env.HOME + '/.npm-global/bin/claude',
|
|
520
|
-
process.env.HOME + '/.local/bin/claude',
|
|
521
|
-
);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
let claudeBin = null;
|
|
525
|
-
for (const candidate of claudeCandidates) {
|
|
526
|
-
try {
|
|
527
|
-
await execFileAsync(candidate, ['--version'], { timeout: 5000 });
|
|
528
|
-
claudeBin = candidate;
|
|
529
|
-
break;
|
|
530
|
-
} catch (_e) { /* keep looking */ }
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
if (!claudeBin) {
|
|
534
|
-
// Claude Code not installed — print guidance and skip.
|
|
535
|
-
console.log('SLM: Claude Code CLI not found — skipping plugin auto-install.');
|
|
536
|
-
console.log('SLM: To install the plugin manually after installing Claude Code:');
|
|
537
|
-
console.log('SLM: claude plugin marketplace add qualixar/superlocalmemory');
|
|
538
|
-
console.log('SLM: claude plugin install superlocalmemory@qualixar');
|
|
539
|
-
console.log('SLM: slm hooks install');
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
console.log('SLM: Claude Code found — installing SLM plugin...');
|
|
544
|
-
|
|
545
|
-
// Step 1: Add marketplace
|
|
546
|
-
try {
|
|
547
|
-
await execFileAsync(claudeBin,
|
|
548
|
-
['plugin', 'marketplace', 'add', 'qualixar/superlocalmemory'],
|
|
549
|
-
{ timeout: 30000 });
|
|
550
|
-
console.log('SLM: marketplace added (qualixar/superlocalmemory)');
|
|
551
|
-
} catch (e) {
|
|
552
|
-
// "already exists" or network error — not fatal
|
|
553
|
-
console.log('SLM: marketplace add note: ' + (e.stderr || e.message || String(e)).trim().split('\n')[0]);
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
// Step 2: Install plugin
|
|
557
|
-
try {
|
|
558
|
-
await execFileAsync(claudeBin,
|
|
559
|
-
['plugin', 'install', 'superlocalmemory@qualixar'],
|
|
560
|
-
{ timeout: 30000 });
|
|
561
|
-
console.log('SLM: plugin installed (superlocalmemory@qualixar)');
|
|
562
|
-
} catch (e) {
|
|
563
|
-
console.log('SLM: plugin install note: ' + (e.stderr || e.message || String(e)).trim().split('\n')[0]);
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
// Step 3: Install hooks (only if not already current — avoids needless writes)
|
|
567
|
-
// `slm hooks install` uses atomic tmp-then-rename and only touches the SLM
|
|
568
|
-
// section of settings.json; all other Claude Code settings are preserved.
|
|
569
|
-
try {
|
|
570
|
-
const statusResult = await execFileAsync('slm', ['hooks', 'status', '--json'],
|
|
571
|
-
{ timeout: 10000 }).catch(() => null);
|
|
572
|
-
const alreadyCurrent = statusResult &&
|
|
573
|
-
(() => { try { const s = JSON.parse(statusResult.stdout); return s.installed && !s.needs_upgrade; } catch { return false; } })();
|
|
574
|
-
if (!alreadyCurrent) {
|
|
575
|
-
await execFileAsync('slm', ['hooks', 'install'], { timeout: 15000 });
|
|
576
|
-
console.log('SLM: hooks installed into Claude Code settings');
|
|
577
|
-
} else {
|
|
578
|
-
console.log('SLM: hooks already current — skipped');
|
|
579
|
-
}
|
|
580
|
-
} catch (e) {
|
|
581
|
-
console.log('SLM: hooks install note: ' + (e.stderr || e.message || String(e)).trim().split('\n')[0]);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
|
|
585
503
|
function printFirstRunChecklist(config) {
|
|
586
504
|
console.log('');
|
|
587
505
|
console.log('SuperLocalMemory is configured.');
|
|
@@ -596,6 +514,14 @@ function printFirstRunChecklist(config) {
|
|
|
596
514
|
console.log(' slm doctor — run health checks (DB, models, ports)');
|
|
597
515
|
console.log(' slm health --watch — live health ladder readout');
|
|
598
516
|
console.log(' slm dashboard — open the dashboard in your browser');
|
|
517
|
+
console.log('');
|
|
518
|
+
console.log('Available capability map (nothing external is enabled silently):');
|
|
519
|
+
console.log(' Memory + graph: dated episodic facts, entity graph, and local SQLite retrieval are ready.');
|
|
520
|
+
console.log(' Scale Engine: stage and verify CozoDB graph + LanceDB vector projections with `slm db scale prepare`.');
|
|
521
|
+
console.log(' Cache + compression: use the MCP optimize tools or `slm optimize on`; aggressive prose is opt-in.');
|
|
522
|
+
console.log(' Mesh: local coordination is available; configure a shared secret before exposing it to a LAN.');
|
|
523
|
+
console.log(' Adapters: Gmail, Calendar, and Transcript are OFF until `slm adapters enable <name>`.');
|
|
524
|
+
console.log(' IDE add-ons: install only SLM-owned integration with `slm hooks install --agent codex` or `--agent claude`.');
|
|
599
525
|
if (config.skill_evolution_enabled) {
|
|
600
526
|
// UX-L3: make the failure mode explicit to users who opted into
|
|
601
527
|
// evolution. If three LLM calls fail, the circuit breaker trips — and
|
|
@@ -621,8 +547,11 @@ async function main() {
|
|
|
621
547
|
return 2;
|
|
622
548
|
}
|
|
623
549
|
}
|
|
624
|
-
const
|
|
625
|
-
|
|
550
|
+
const configuredRoot = process.env.SLM_DATA_DIR
|
|
551
|
+
|| process.env.SL_MEMORY_PATH
|
|
552
|
+
|| process.env.SLM_HOME
|
|
553
|
+
|| path.join(os.homedir(), '.superlocalmemory');
|
|
554
|
+
const slmDir = args.home ? path.join(args.home, '.superlocalmemory') : configuredRoot;
|
|
626
555
|
const cfgPath = path.join(slmDir, 'config.toml');
|
|
627
556
|
const bakPath = path.join(slmDir, 'config.toml.bak');
|
|
628
557
|
|
|
@@ -773,12 +702,6 @@ async function main() {
|
|
|
773
702
|
// UX-G2: show the one-screen delta banner so upgraders see what shipped.
|
|
774
703
|
printLivingBrainDelta();
|
|
775
704
|
|
|
776
|
-
// T1-B: Auto-install Claude Code plugin + hooks. Best-effort, non-blocking.
|
|
777
|
-
// Only runs on npm install (not --dry-run), when claude CLI is present.
|
|
778
|
-
if (!args.dryRun) {
|
|
779
|
-
await tryInstallClaudePlugin();
|
|
780
|
-
}
|
|
781
|
-
|
|
782
705
|
printFirstRunChecklist(config);
|
|
783
706
|
return 0;
|
|
784
707
|
}
|