superlocalmemory 3.6.23 → 3.7.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/CHANGELOG.md +61 -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 +17 -9
- 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/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/manifest.json +1 -1
- package/plugin-src/requirements.txt +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.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 +7 -7
- 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 +32 -23
- 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 +130 -31
- 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/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/scripts/preuninstall.js
CHANGED
|
@@ -1,57 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* SuperLocalMemory
|
|
3
|
+
* SuperLocalMemory NPM pre-uninstall notice.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* npm owns and removes the package directory, including its private Python
|
|
6
|
+
* runtime. Durable SLM data has separate ownership and is never inspected or
|
|
7
|
+
* modified by an application-code uninstall.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* ATTRIBUTION REQUIRED: This notice must be preserved in all copies.
|
|
9
|
+
* Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
10
|
+
* Licensed under AGPL-3.0-or-later.
|
|
12
11
|
*/
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
const os = require('os');
|
|
16
|
-
const fs = require('fs');
|
|
17
|
-
|
|
18
|
-
console.log('\n════════════════════════════════════════════════════════════');
|
|
19
|
-
console.log(' SuperLocalMemory V3 - Uninstalling');
|
|
20
|
-
console.log('════════════════════════════════════════════════════════════\n');
|
|
21
|
-
|
|
22
|
-
const SLM_DIR = path.join(os.homedir(), '.superlocalmemory');
|
|
23
|
-
|
|
24
|
-
if (fs.existsSync(SLM_DIR)) {
|
|
25
|
-
console.log('⚠️ Your data is preserved at: ' + SLM_DIR);
|
|
26
|
-
console.log('');
|
|
27
|
-
console.log(' This includes:');
|
|
28
|
-
console.log(' • Your memory database (memory.db)');
|
|
29
|
-
console.log(' • All learned patterns');
|
|
30
|
-
console.log(' • Knowledge graph');
|
|
31
|
-
console.log(' • Profile data');
|
|
32
|
-
console.log('');
|
|
33
|
-
console.log(' To completely remove SuperLocalMemory:');
|
|
34
|
-
if (os.platform() === 'win32') {
|
|
35
|
-
console.log(' rmdir /s "' + SLM_DIR + '"');
|
|
36
|
-
} else {
|
|
37
|
-
console.log(' rm -rf "' + SLM_DIR + '"');
|
|
38
|
-
}
|
|
39
|
-
console.log('');
|
|
40
|
-
console.log(' To backup your data first:');
|
|
41
|
-
if (os.platform() === 'win32') {
|
|
42
|
-
console.log(' xcopy "' + SLM_DIR + '" "%USERPROFILE%\\slm-backup\\" /E /I');
|
|
43
|
-
} else {
|
|
44
|
-
console.log(' cp -r "' + SLM_DIR + '" ~/slm-backup/');
|
|
45
|
-
}
|
|
46
|
-
console.log('');
|
|
47
|
-
} else {
|
|
48
|
-
console.log('ℹ️ No data directory found at ' + SLM_DIR);
|
|
49
|
-
console.log('');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
console.log('📦 Removing NPM package...');
|
|
53
|
-
console.log(' (slm and superlocalmemory commands will be unavailable)');
|
|
54
|
-
console.log('');
|
|
13
|
+
'use strict';
|
|
55
14
|
|
|
56
|
-
|
|
57
|
-
|
|
15
|
+
console.log('SuperLocalMemory application code is being removed.');
|
|
16
|
+
console.log('Memory data is preserved. No database, profile, backup, or configuration was inspected or changed.');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""SuperLocalMemory — information-geometric agent memory.
|
|
2
2
|
|
|
3
3
|
v3.6.9: all 7 retrieval layers at full quality (Hopfield@1000, entity_graph@100,
|
|
4
|
-
SA neighbor-cache fix
|
|
4
|
+
SA neighbor-cache fix and a genuine latency-bounded fast path). See CHANGELOG.md.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import os
|
|
@@ -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.7.1"
|
|
36
36
|
|
|
37
37
|
_REQUIRED_VERSIONS = {
|
|
38
38
|
"sentence_transformers": "5.3.0",
|
|
@@ -9,7 +9,7 @@ by the system carries a verifiable proof of origin. Verification
|
|
|
9
9
|
detects any modification to the content after signing.
|
|
10
10
|
|
|
11
11
|
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
12
|
-
License:
|
|
12
|
+
License: AGPL-3.0-or-later
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
@@ -17,33 +17,46 @@ from __future__ import annotations
|
|
|
17
17
|
import hashlib
|
|
18
18
|
import hmac
|
|
19
19
|
import os
|
|
20
|
-
import sys
|
|
21
20
|
from datetime import datetime, timezone
|
|
22
21
|
from typing import Dict
|
|
23
22
|
|
|
23
|
+
from superlocalmemory.infra.data_root import state_path
|
|
24
|
+
|
|
25
|
+
|
|
24
26
|
def _get_or_create_key() -> str:
|
|
25
27
|
"""Load key from env or generate a persistent random one."""
|
|
26
28
|
env_key = os.environ.get("SLM_SIGNER_KEY")
|
|
27
29
|
if env_key:
|
|
28
30
|
return env_key
|
|
29
|
-
|
|
31
|
+
|
|
32
|
+
key_path = state_path(".signer_key")
|
|
30
33
|
try:
|
|
31
|
-
|
|
32
|
-
return f.read().strip()
|
|
34
|
+
key = key_path.read_text(encoding="utf-8").strip()
|
|
33
35
|
except FileNotFoundError:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
os.makedirs(os.path.dirname(key_path), exist_ok=True)
|
|
37
|
-
with open(key_path, "w") as f:
|
|
38
|
-
f.write(key)
|
|
39
|
-
# On POSIX, restrict the key file to owner-only read/write.
|
|
40
|
-
# On Windows, os.chmod only supports setting the read-only flag
|
|
41
|
-
# and cannot enforce Unix-style permissions, so we skip it.
|
|
42
|
-
if sys.platform != "win32":
|
|
43
|
-
os.chmod(key_path, 0o600)
|
|
36
|
+
key = ""
|
|
37
|
+
if key:
|
|
44
38
|
return key
|
|
45
39
|
|
|
46
|
-
|
|
40
|
+
import secrets
|
|
41
|
+
|
|
42
|
+
key = secrets.token_hex(32)
|
|
43
|
+
key_path.parent.mkdir(parents=True, exist_ok=True)
|
|
44
|
+
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
|
|
45
|
+
if hasattr(os, "O_NOFOLLOW"):
|
|
46
|
+
flags |= os.O_NOFOLLOW
|
|
47
|
+
try:
|
|
48
|
+
fd = os.open(str(key_path), flags, 0o600)
|
|
49
|
+
try:
|
|
50
|
+
os.write(fd, key.encode("utf-8"))
|
|
51
|
+
finally:
|
|
52
|
+
os.close(fd)
|
|
53
|
+
except FileExistsError:
|
|
54
|
+
key = key_path.read_text(encoding="utf-8").strip()
|
|
55
|
+
if not key:
|
|
56
|
+
raise RuntimeError(f"signer key is empty: {key_path}")
|
|
57
|
+
if os.name != "nt":
|
|
58
|
+
os.chmod(key_path, 0o600)
|
|
59
|
+
return key
|
|
47
60
|
|
|
48
61
|
|
|
49
62
|
class QualixarSigner:
|
|
@@ -63,9 +76,11 @@ class QualixarSigner:
|
|
|
63
76
|
_PLATFORM: str = "Qualixar"
|
|
64
77
|
_AUTHOR: str = "Varun Pratap Bhardwaj"
|
|
65
78
|
_AUTHOR_URL: str = "https://varunpratap.com"
|
|
66
|
-
_LICENSE: str = "
|
|
79
|
+
_LICENSE: str = "AGPL-3.0-or-later"
|
|
67
80
|
|
|
68
|
-
def __init__(self, secret_key: str =
|
|
81
|
+
def __init__(self, secret_key: str | None = None) -> None:
|
|
82
|
+
if secret_key is None:
|
|
83
|
+
secret_key = _get_or_create_key()
|
|
69
84
|
if not secret_key:
|
|
70
85
|
raise ValueError("secret_key must be a non-empty string")
|
|
71
86
|
self._secret_key: bytes = secret_key.encode("utf-8")
|
|
@@ -85,7 +100,7 @@ class QualixarSigner:
|
|
|
85
100
|
|
|
86
101
|
- ``platform`` – always ``"Qualixar"``
|
|
87
102
|
- ``author`` – always ``"Varun Pratap Bhardwaj"``
|
|
88
|
-
- ``license`` – always ``"
|
|
103
|
+
- ``license`` – always ``"AGPL-3.0-or-later"``
|
|
89
104
|
- ``content_hash`` – SHA-256 hex digest of *content*
|
|
90
105
|
- ``signature`` – HMAC-SHA256 hex digest (key-dependent)
|
|
91
106
|
- ``timestamp`` – ISO 8601 UTC timestamp
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
"""WP-07 — Lazy first-run initialisation (pip cross-install).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Lightweight import only — zero heavy imports, STDOUT-SILENT.
|
|
8
8
|
|
|
9
9
|
Public API
|
|
10
10
|
----------
|
|
@@ -25,6 +25,8 @@ import json
|
|
|
25
25
|
import os
|
|
26
26
|
from pathlib import Path
|
|
27
27
|
|
|
28
|
+
from superlocalmemory import __version__ as _RUNTIME_VERSION
|
|
29
|
+
|
|
28
30
|
|
|
29
31
|
# ---------------------------------------------------------------------------
|
|
30
32
|
# Public: home resolution
|
|
@@ -42,11 +44,9 @@ def slm_home() -> Path:
|
|
|
42
44
|
|
|
43
45
|
Pure: no mkdir, no side effects.
|
|
44
46
|
"""
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return Path(val)
|
|
49
|
-
return Path.home() / ".superlocalmemory"
|
|
47
|
+
from superlocalmemory.infra.data_root import canonical_data_root
|
|
48
|
+
|
|
49
|
+
return canonical_data_root()
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
# ---------------------------------------------------------------------------
|
|
@@ -57,7 +57,7 @@ def slm_home() -> Path:
|
|
|
57
57
|
# Only mode + base_dir; everything else uses SLMConfig defaults.
|
|
58
58
|
_MINIMAL_CONFIG: dict = {
|
|
59
59
|
"mode": "a",
|
|
60
|
-
"version":
|
|
60
|
+
"version": _RUNTIME_VERSION,
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
|