superlocalmemory 4.1.13 → 4.1.15
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 +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,1162 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Interactive setup wizard for first-time configuration.
|
|
6
|
-
|
|
7
|
-
Runs automatically on first use of any `slm` command, or via `slm setup`.
|
|
8
|
-
Downloads models, configures mode, verifies installation.
|
|
9
|
-
|
|
10
|
-
For npm: triggered by postinstall.js after dependency installation.
|
|
11
|
-
For pip: triggered on first `slm` command when .setup-complete is missing.
|
|
12
|
-
|
|
13
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from __future__ import annotations
|
|
17
|
-
|
|
18
|
-
import os
|
|
19
|
-
import platform
|
|
20
|
-
import shutil
|
|
21
|
-
import subprocess
|
|
22
|
-
import sys
|
|
23
|
-
import time
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
from typing import Any
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
# ---------------------------------------------------------------------------
|
|
29
|
-
# Constants
|
|
30
|
-
# ---------------------------------------------------------------------------
|
|
31
|
-
|
|
32
|
-
# resolve via slm_home() so all 3 env aliases are honoured.
|
|
33
|
-
# Fallback keeps stdlib-only path if the import fails during early bootstrap.
|
|
34
|
-
def _resolve_slm_home() -> Path:
|
|
35
|
-
from superlocalmemory.infra.data_root import canonical_data_root
|
|
36
|
-
|
|
37
|
-
return canonical_data_root()
|
|
38
|
-
_EMBED_MODEL = "nomic-ai/nomic-embed-text-v1.5"
|
|
39
|
-
_RERANKER_MODEL = "cross-encoder/ms-marco-MiniLM-L-12-v2"
|
|
40
|
-
# v3.6.10: compulsory LLMLingua-2 prose compression model (~560MB, aggressive mode).
|
|
41
|
-
_COMPRESSOR_MODEL = "microsoft/llmlingua-2-xlm-roberta-large-meetingbank"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# ---------------------------------------------------------------------------
|
|
45
|
-
# Detection helpers
|
|
46
|
-
# ---------------------------------------------------------------------------
|
|
47
|
-
|
|
48
|
-
def is_interactive() -> bool:
|
|
49
|
-
"""True if running in a terminal (not CI, not piped, not MCP)."""
|
|
50
|
-
if os.environ.get("CI"):
|
|
51
|
-
return False
|
|
52
|
-
if os.environ.get("SLM_NON_INTERACTIVE"):
|
|
53
|
-
return False
|
|
54
|
-
return sys.stdin.isatty() and sys.stdout.isatty()
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def is_setup_complete() -> bool:
|
|
58
|
-
"""True if the setup wizard has been run at least once."""
|
|
59
|
-
return (_resolve_slm_home() / ".setup-complete").exists()
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def needs_setup() -> bool:
|
|
63
|
-
"""True if setup should auto-trigger (first use)."""
|
|
64
|
-
return not is_setup_complete()
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def _prompt(message: str, default: str = "") -> str:
|
|
68
|
-
"""Prompt user for input. Returns default if non-interactive."""
|
|
69
|
-
if not is_interactive():
|
|
70
|
-
return default
|
|
71
|
-
try:
|
|
72
|
-
return input(message).strip() or default
|
|
73
|
-
except (EOFError, KeyboardInterrupt):
|
|
74
|
-
print()
|
|
75
|
-
return default
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def _get_ram_gb() -> float:
|
|
79
|
-
"""Get total system RAM in GB."""
|
|
80
|
-
try:
|
|
81
|
-
import psutil
|
|
82
|
-
return psutil.virtual_memory().total / (1024 ** 3)
|
|
83
|
-
except ImportError:
|
|
84
|
-
pass
|
|
85
|
-
# Fallback: macOS
|
|
86
|
-
if platform.system() == "Darwin":
|
|
87
|
-
try:
|
|
88
|
-
out = subprocess.check_output(["sysctl", "-n", "hw.memsize"], text=True)
|
|
89
|
-
return int(out.strip()) / (1024 ** 3)
|
|
90
|
-
except Exception:
|
|
91
|
-
pass
|
|
92
|
-
# Fallback: Linux
|
|
93
|
-
try:
|
|
94
|
-
with open("/proc/meminfo") as f:
|
|
95
|
-
for line in f:
|
|
96
|
-
if line.startswith("MemTotal:"):
|
|
97
|
-
return int(line.split()[1]) / (1024 ** 2)
|
|
98
|
-
except Exception:
|
|
99
|
-
pass
|
|
100
|
-
return 0.0
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def _ollama_available() -> bool:
|
|
104
|
-
"""True if a local Ollama server is reachable (or its binary is installed).
|
|
105
|
-
|
|
106
|
-
v3.8.2: used to RECOMMEND Mode B at setup with a single keypress. Bounded
|
|
107
|
-
and fail-safe — a slow/absent Ollama never blocks or slows the wizard.
|
|
108
|
-
"""
|
|
109
|
-
try:
|
|
110
|
-
import httpx
|
|
111
|
-
|
|
112
|
-
if httpx.get("http://localhost:11434/api/tags", timeout=1.5).status_code == 200:
|
|
113
|
-
return True
|
|
114
|
-
except Exception:
|
|
115
|
-
pass
|
|
116
|
-
try:
|
|
117
|
-
return shutil.which("ollama") is not None
|
|
118
|
-
except Exception:
|
|
119
|
-
return False
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
# ---------------------------------------------------------------------------
|
|
123
|
-
# Model download
|
|
124
|
-
# ---------------------------------------------------------------------------
|
|
125
|
-
|
|
126
|
-
def _download_model(model_name: str, label: str) -> bool:
|
|
127
|
-
"""Download a HuggingFace model with visible progress.
|
|
128
|
-
|
|
129
|
-
Runs in a subprocess so the main process never loads torch.
|
|
130
|
-
stderr is inherited so the user sees download progress bars.
|
|
131
|
-
Returns True on success.
|
|
132
|
-
"""
|
|
133
|
-
print(f"\n Downloading {label}: {model_name}")
|
|
134
|
-
print(f" (this may take a few minutes on first run)\n")
|
|
135
|
-
|
|
136
|
-
# H-03: pass the model name as argv, never interpolated into executed
|
|
137
|
-
# source, so a crafted model_name cannot become arbitrary Python.
|
|
138
|
-
script = (
|
|
139
|
-
"import sys; "
|
|
140
|
-
"from sentence_transformers import SentenceTransformer; "
|
|
141
|
-
"m = SentenceTransformer(sys.argv[1], trust_remote_code=True); "
|
|
142
|
-
"d = m.get_sentence_embedding_dimension(); "
|
|
143
|
-
"print(f'OK dim={d}'); "
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
try:
|
|
147
|
-
result = subprocess.run(
|
|
148
|
-
[sys.executable, "-c", script, model_name],
|
|
149
|
-
timeout=600, # 10 min for large model downloads
|
|
150
|
-
capture_output=False, # Show download progress
|
|
151
|
-
text=True,
|
|
152
|
-
env={
|
|
153
|
-
**os.environ,
|
|
154
|
-
"CUDA_VISIBLE_DEVICES": "",
|
|
155
|
-
"TOKENIZERS_PARALLELISM": "false",
|
|
156
|
-
"TORCH_DEVICE": "cpu",
|
|
157
|
-
},
|
|
158
|
-
)
|
|
159
|
-
if result.returncode == 0:
|
|
160
|
-
print(f" ✓ {label} ready")
|
|
161
|
-
return True
|
|
162
|
-
print(f" ✗ {label} download failed (exit code {result.returncode})")
|
|
163
|
-
return False
|
|
164
|
-
except subprocess.TimeoutExpired:
|
|
165
|
-
print(f" ✗ {label} download timed out (10 min)")
|
|
166
|
-
return False
|
|
167
|
-
except FileNotFoundError:
|
|
168
|
-
print(f" ✗ Python not found: {sys.executable}")
|
|
169
|
-
return False
|
|
170
|
-
except Exception as exc:
|
|
171
|
-
print(f" ✗ {label} download error: {exc}")
|
|
172
|
-
return False
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def _download_reranker(model_name: str) -> bool:
|
|
176
|
-
"""Download cross-encoder reranker model."""
|
|
177
|
-
print(f"\n Downloading reranker: {model_name}")
|
|
178
|
-
print(f" (cross-encoder for result re-ranking)\n")
|
|
179
|
-
|
|
180
|
-
# H-03: model name via argv, never interpolated into executed source.
|
|
181
|
-
script = (
|
|
182
|
-
"import sys; from sentence_transformers import CrossEncoder; "
|
|
183
|
-
"m = CrossEncoder(sys.argv[1], trust_remote_code=True); "
|
|
184
|
-
"print('OK'); "
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
try:
|
|
188
|
-
result = subprocess.run(
|
|
189
|
-
[sys.executable, "-c", script, model_name],
|
|
190
|
-
timeout=300,
|
|
191
|
-
capture_output=False,
|
|
192
|
-
text=True,
|
|
193
|
-
env={
|
|
194
|
-
**os.environ,
|
|
195
|
-
"CUDA_VISIBLE_DEVICES": "",
|
|
196
|
-
"TOKENIZERS_PARALLELISM": "false",
|
|
197
|
-
"TORCH_DEVICE": "cpu",
|
|
198
|
-
},
|
|
199
|
-
)
|
|
200
|
-
if result.returncode == 0:
|
|
201
|
-
print(f" ✓ Reranker ready")
|
|
202
|
-
return True
|
|
203
|
-
print(f" ✗ Reranker download failed")
|
|
204
|
-
return False
|
|
205
|
-
except Exception as exc:
|
|
206
|
-
print(f" ✗ Reranker error: {exc}")
|
|
207
|
-
return False
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
def _download_compressor(model_name: str) -> bool:
|
|
211
|
-
"""Download the LLMLingua-2 prose compression model (v3.6.10).
|
|
212
|
-
|
|
213
|
-
Mirrors _download_reranker: a subprocess forces the HF download with visible
|
|
214
|
-
progress. Fail-open — a network hiccup must NOT break setup; the model also
|
|
215
|
-
lazy-downloads on first use in prose_llmlingua.py.
|
|
216
|
-
"""
|
|
217
|
-
print(f"\n Downloading compression model: {model_name}")
|
|
218
|
-
print(f" (LLMLingua-2 prose compressor, ~560MB — aggressive mode only)\n")
|
|
219
|
-
|
|
220
|
-
# H-03: model name via argv, never interpolated into executed source.
|
|
221
|
-
script = (
|
|
222
|
-
"import sys; from llmlingua import PromptCompressor; "
|
|
223
|
-
"PromptCompressor(model_name=sys.argv[1], use_llmlingua2=True, "
|
|
224
|
-
"device_map='cpu'); "
|
|
225
|
-
"print('OK')"
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
try:
|
|
229
|
-
result = subprocess.run(
|
|
230
|
-
[sys.executable, "-c", script, model_name],
|
|
231
|
-
timeout=900, # 560MB on a slow link can exceed 5 min
|
|
232
|
-
capture_output=False,
|
|
233
|
-
text=True,
|
|
234
|
-
env={
|
|
235
|
-
**os.environ,
|
|
236
|
-
"CUDA_VISIBLE_DEVICES": "",
|
|
237
|
-
"TOKENIZERS_PARALLELISM": "false",
|
|
238
|
-
"TORCH_DEVICE": "cpu",
|
|
239
|
-
},
|
|
240
|
-
)
|
|
241
|
-
if result.returncode == 0:
|
|
242
|
-
print(f" ✓ Compression model ready")
|
|
243
|
-
return True
|
|
244
|
-
print(f" ✗ Compression model download failed (will lazy-download on first use)")
|
|
245
|
-
return False
|
|
246
|
-
except ImportError:
|
|
247
|
-
print(f" ⚠ llmlingua not installed — compression model will download on first use")
|
|
248
|
-
return False
|
|
249
|
-
except Exception as exc:
|
|
250
|
-
print(f" ✗ Compression model error: {exc}")
|
|
251
|
-
return False
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
# ---------------------------------------------------------------------------
|
|
255
|
-
# Embedding-provider detection (v3.7.6 #72)
|
|
256
|
-
# ---------------------------------------------------------------------------
|
|
257
|
-
|
|
258
|
-
def _embedding_is_remote(config: Any) -> bool:
|
|
259
|
-
"""True when embeddings come from a remote/OpenAI-compatible endpoint.
|
|
260
|
-
|
|
261
|
-
In that case the local sentence-transformers download (768d nomic) is
|
|
262
|
-
unnecessary and would only waste bandwidth/disk (#72). Detection is by
|
|
263
|
-
provider name or the presence of a configured HTTP endpoint.
|
|
264
|
-
"""
|
|
265
|
-
emb = getattr(config, "embedding", None)
|
|
266
|
-
if emb is None:
|
|
267
|
-
return False
|
|
268
|
-
provider = (getattr(emb, "provider", "") or "").strip().lower()
|
|
269
|
-
endpoint = (
|
|
270
|
-
getattr(emb, "api_endpoint", "")
|
|
271
|
-
or getattr(emb, "base_url", "")
|
|
272
|
-
or ""
|
|
273
|
-
)
|
|
274
|
-
return provider in ("openai", "openai-compatible", "remote") or bool(endpoint)
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
def _reranker_is_remote(config: Any) -> bool:
|
|
278
|
-
"""True when reranking runs against a remote endpoint (v3.8.12, #105).
|
|
279
|
-
|
|
280
|
-
In that case the local ~130MB English cross-encoder download is pointless
|
|
281
|
-
— and worse, misleading, since it is not the model that will score recall.
|
|
282
|
-
Unlike embeddings, the endpoint alone is NOT sufficient: a stray endpoint
|
|
283
|
-
against a local backend is a misconfiguration the engine reports, not a
|
|
284
|
-
remote setup.
|
|
285
|
-
"""
|
|
286
|
-
rt = getattr(config, "retrieval", None)
|
|
287
|
-
if rt is None:
|
|
288
|
-
return False
|
|
289
|
-
backend = (getattr(rt, "cross_encoder_backend", "") or "").strip().lower()
|
|
290
|
-
endpoint = getattr(rt, "cross_encoder_endpoint", "") or ""
|
|
291
|
-
return backend in ("openai", "remote") and bool(endpoint)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
# Remote-reranker keys the wizard never asks about. ``retrieval`` is otherwise
|
|
295
|
-
# a mode-owned block that the wizard resets from the template, which would
|
|
296
|
-
# silently delete a working remote endpoint on every re-run (#105).
|
|
297
|
-
_USER_OWNED_RETRIEVAL_KEYS = (
|
|
298
|
-
"cross_encoder_backend",
|
|
299
|
-
"cross_encoder_endpoint",
|
|
300
|
-
"cross_encoder_api_key",
|
|
301
|
-
"cross_encoder_model",
|
|
302
|
-
"cross_encoder_timeout_seconds",
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
def _build_wizard_config(mode):
|
|
307
|
-
"""Apply mode-owned presets without erasing existing user-owned blocks."""
|
|
308
|
-
from superlocalmemory.core.config import SLMConfig
|
|
309
|
-
from superlocalmemory.infra.data_root import state_path
|
|
310
|
-
|
|
311
|
-
template = SLMConfig.for_mode(mode)
|
|
312
|
-
if not state_path("config.json").exists():
|
|
313
|
-
return template
|
|
314
|
-
existing = SLMConfig.load()
|
|
315
|
-
existing.mode = mode
|
|
316
|
-
existing.llm = template.llm
|
|
317
|
-
preserved = {
|
|
318
|
-
key: getattr(existing.retrieval, key)
|
|
319
|
-
for key in _USER_OWNED_RETRIEVAL_KEYS
|
|
320
|
-
if hasattr(existing.retrieval, key)
|
|
321
|
-
}
|
|
322
|
-
existing.retrieval = template.retrieval
|
|
323
|
-
for key, value in preserved.items():
|
|
324
|
-
setattr(existing.retrieval, key, value)
|
|
325
|
-
existing.math = template.math
|
|
326
|
-
existing.channel_weights = template.channel_weights
|
|
327
|
-
return existing
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
# ---------------------------------------------------------------------------
|
|
331
|
-
# Verification
|
|
332
|
-
# ---------------------------------------------------------------------------
|
|
333
|
-
|
|
334
|
-
def _verify_installation() -> bool:
|
|
335
|
-
"""Quick smoke test: embed a sentence, verify dimension."""
|
|
336
|
-
print("\n Running verification test...")
|
|
337
|
-
|
|
338
|
-
script = (
|
|
339
|
-
"from superlocalmemory.core.embeddings import EmbeddingService; "
|
|
340
|
-
"from superlocalmemory.core.config import EmbeddingConfig; "
|
|
341
|
-
"cfg = EmbeddingConfig(); "
|
|
342
|
-
"svc = EmbeddingService(cfg); "
|
|
343
|
-
"vec = svc.embed('SuperLocalMemory setup verification test'); "
|
|
344
|
-
"print(f'OK dim={len(vec)}' if vec else 'FAIL'); "
|
|
345
|
-
"svc.unload(); "
|
|
346
|
-
)
|
|
347
|
-
|
|
348
|
-
try:
|
|
349
|
-
result = subprocess.run(
|
|
350
|
-
[sys.executable, "-c", script],
|
|
351
|
-
timeout=120,
|
|
352
|
-
capture_output=True,
|
|
353
|
-
text=True,
|
|
354
|
-
env={
|
|
355
|
-
**os.environ,
|
|
356
|
-
"CUDA_VISIBLE_DEVICES": "",
|
|
357
|
-
"TOKENIZERS_PARALLELISM": "false",
|
|
358
|
-
"TORCH_DEVICE": "cpu",
|
|
359
|
-
},
|
|
360
|
-
)
|
|
361
|
-
stdout = result.stdout.strip()
|
|
362
|
-
if "OK dim=" in stdout:
|
|
363
|
-
dim = stdout.split("dim=")[1]
|
|
364
|
-
print(f" ✓ Embedding verified (dimension={dim})")
|
|
365
|
-
return True
|
|
366
|
-
print(f" ✗ Verification failed: {stdout}")
|
|
367
|
-
if result.stderr:
|
|
368
|
-
# Show last 3 lines of stderr for diagnosis
|
|
369
|
-
lines = result.stderr.strip().split("\n")
|
|
370
|
-
for line in lines[-3:]:
|
|
371
|
-
print(f" {line}")
|
|
372
|
-
return False
|
|
373
|
-
except subprocess.TimeoutExpired:
|
|
374
|
-
print(" ✗ Verification timed out (120s)")
|
|
375
|
-
return False
|
|
376
|
-
except Exception as exc:
|
|
377
|
-
print(f" ✗ Verification error: {exc}")
|
|
378
|
-
return False
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
# ---------------------------------------------------------------------------
|
|
382
|
-
# Mark setup complete
|
|
383
|
-
# ---------------------------------------------------------------------------
|
|
384
|
-
|
|
385
|
-
def _mark_complete() -> None:
|
|
386
|
-
"""Write .setup-complete marker file."""
|
|
387
|
-
slm_root = _resolve_slm_home()
|
|
388
|
-
slm_root.mkdir(parents=True, exist_ok=True)
|
|
389
|
-
(slm_root / ".setup-complete").write_text(
|
|
390
|
-
f"setup_completed={time.strftime('%Y-%m-%dT%H:%M:%S')}\n"
|
|
391
|
-
f"python={sys.executable}\n"
|
|
392
|
-
f"platform={platform.system()}\n"
|
|
393
|
-
f"version={platform.python_version()}\n"
|
|
394
|
-
)
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
# ---------------------------------------------------------------------------
|
|
398
|
-
# Main wizard
|
|
399
|
-
# ---------------------------------------------------------------------------
|
|
400
|
-
|
|
401
|
-
def run_wizard(auto: bool = False) -> None:
|
|
402
|
-
"""Run the interactive setup wizard.
|
|
403
|
-
|
|
404
|
-
Args:
|
|
405
|
-
auto: If True, use defaults without prompting (for npm postinstall
|
|
406
|
-
or CI environments).
|
|
407
|
-
"""
|
|
408
|
-
interactive = is_interactive() and not auto
|
|
409
|
-
slm_root = _resolve_slm_home()
|
|
410
|
-
|
|
411
|
-
print()
|
|
412
|
-
print("╔══════════════════════════════════════════════════════════╗")
|
|
413
|
-
print("║ SuperLocalMemory V4 — The Unified Brain ║")
|
|
414
|
-
print("║ by Varun Pratap Bhardwaj / Qualixar ║")
|
|
415
|
-
print("╚══════════════════════════════════════════════════════════╝")
|
|
416
|
-
print()
|
|
417
|
-
|
|
418
|
-
# -- Step 1: System check --
|
|
419
|
-
print("─── Step 1/10: System Check ───")
|
|
420
|
-
print()
|
|
421
|
-
py_ver = platform.python_version()
|
|
422
|
-
py_ok = sys.version_info >= (3, 11)
|
|
423
|
-
ram_gb = _get_ram_gb()
|
|
424
|
-
print(f" Python: {py_ver} {'✓' if py_ok else '✗ (3.11+ required)'}")
|
|
425
|
-
print(f" Platform: {platform.system()} {platform.machine()}")
|
|
426
|
-
if ram_gb > 0:
|
|
427
|
-
print(f" RAM: {ram_gb:.1f} GB {'✓' if ram_gb >= 4 else '⚠ (4GB+ recommended)'}")
|
|
428
|
-
print(f" Data dir: {slm_root}")
|
|
429
|
-
|
|
430
|
-
# Check sentence-transformers
|
|
431
|
-
st_ok = False
|
|
432
|
-
try:
|
|
433
|
-
import sentence_transformers # noqa: F401
|
|
434
|
-
st_ok = True
|
|
435
|
-
print(f" sentence-transformers: ✓")
|
|
436
|
-
except ImportError:
|
|
437
|
-
print(f" sentence-transformers: ✗ (not installed)")
|
|
438
|
-
print(f" Run: pip install 'sentence-transformers>=4.0.0'")
|
|
439
|
-
|
|
440
|
-
if not py_ok:
|
|
441
|
-
print("\n ✗ Python 3.11+ is required. Please upgrade Python.")
|
|
442
|
-
print(" https://python.org/downloads/")
|
|
443
|
-
return
|
|
444
|
-
|
|
445
|
-
# -- Step 2: Mode selection --
|
|
446
|
-
# v3.8.2: pre-detect Ollama so we can recommend Mode B with one keypress.
|
|
447
|
-
# No detection → zero-config Mode A. (Non-interactive always stays A: Mode B
|
|
448
|
-
# needs a pulled model, so we never assume it without the user confirming.)
|
|
449
|
-
ollama_present = _ollama_available()
|
|
450
|
-
default_mode = "b" if ollama_present else "a"
|
|
451
|
-
print()
|
|
452
|
-
print("─── Step 2/10: Choose Operating Mode ───")
|
|
453
|
-
print()
|
|
454
|
-
if ollama_present:
|
|
455
|
-
print(" ✓ Ollama detected on this machine — Mode B recommended.")
|
|
456
|
-
print(" Press Enter to accept, or pick another mode.")
|
|
457
|
-
print()
|
|
458
|
-
print(" [A] Local Guardian" + ("" if ollama_present else " (recommended)"))
|
|
459
|
-
print(" No model-provider call in the core memory path.")
|
|
460
|
-
print(" Review optional integrations and network policy for your deployment.")
|
|
461
|
-
print()
|
|
462
|
-
print(" [B] Smart Local" + (" (recommended — Ollama detected)" if ollama_present else ""))
|
|
463
|
-
print(" Local LLM via Ollama for enrichment.")
|
|
464
|
-
print(" Data stays on your machine.")
|
|
465
|
-
print()
|
|
466
|
-
print(" [C] Full Power")
|
|
467
|
-
print(" Cloud LLM for maximum accuracy.")
|
|
468
|
-
print(" Requires API key.")
|
|
469
|
-
print()
|
|
470
|
-
|
|
471
|
-
if interactive:
|
|
472
|
-
choice = _prompt(
|
|
473
|
-
f" Select mode [A/B/C] (default: {default_mode.upper()}): ",
|
|
474
|
-
default_mode,
|
|
475
|
-
).lower()
|
|
476
|
-
else:
|
|
477
|
-
choice = "a"
|
|
478
|
-
print(" Auto-selecting Mode A (non-interactive, zero-config)")
|
|
479
|
-
|
|
480
|
-
if choice not in ("a", "b", "c"):
|
|
481
|
-
print(f" Invalid choice '{choice}', using Mode A.")
|
|
482
|
-
choice = "a"
|
|
483
|
-
|
|
484
|
-
from superlocalmemory.core.config import SLMConfig
|
|
485
|
-
from superlocalmemory.storage.models import Mode
|
|
486
|
-
|
|
487
|
-
mode_map = {"a": Mode.A, "b": Mode.B, "c": Mode.C}
|
|
488
|
-
config = _build_wizard_config(mode_map[choice])
|
|
489
|
-
|
|
490
|
-
# -- Multi-scope (shared memory) opt-in — v3.6.15 --
|
|
491
|
-
# OFF by default: your memories stay private to this profile (3.6.14 behaviour).
|
|
492
|
-
# Enabling only turns ON recall VISIBILITY of other profiles' shared/global facts;
|
|
493
|
-
# your own writes still default to 'personal' (mark a memory shared/global per call
|
|
494
|
-
# with --scope). Existing users can flip this later in the `scope` section of
|
|
495
|
-
# mode_a/b/c.json. See docs/shared-memory.md.
|
|
496
|
-
print()
|
|
497
|
-
print(" Shared memory lets other local profiles' 'shared'/'global' memories")
|
|
498
|
-
print(" appear in your recall. It is OFF by default — your memories stay private.")
|
|
499
|
-
if interactive:
|
|
500
|
-
sm_choice = _prompt(
|
|
501
|
-
" See shared/global memories from other profiles by default? [y/N] (default: N): ",
|
|
502
|
-
"n",
|
|
503
|
-
).lower()
|
|
504
|
-
else:
|
|
505
|
-
sm_choice = "n"
|
|
506
|
-
if sm_choice in ("y", "yes"):
|
|
507
|
-
from superlocalmemory.core.config import ScopeConfig
|
|
508
|
-
config.scope = ScopeConfig(
|
|
509
|
-
default_scope="personal",
|
|
510
|
-
recall_include_global=True,
|
|
511
|
-
recall_include_shared=True,
|
|
512
|
-
)
|
|
513
|
-
print(" ✓ Shared-memory recall ENABLED (your own writes still default to personal).")
|
|
514
|
-
else:
|
|
515
|
-
print(" ✓ Shared memory OFF (default) — enable later in mode_*.json if needed.")
|
|
516
|
-
|
|
517
|
-
if choice == "b":
|
|
518
|
-
print()
|
|
519
|
-
if shutil.which("ollama"):
|
|
520
|
-
print(" ✓ Ollama found!")
|
|
521
|
-
else:
|
|
522
|
-
print(" ⚠ Ollama not found. Install: https://ollama.ai")
|
|
523
|
-
print(" After installing: ollama pull llama3.2")
|
|
524
|
-
|
|
525
|
-
if choice == "c" and interactive:
|
|
526
|
-
configure_provider(config)
|
|
527
|
-
else:
|
|
528
|
-
config.save(mode_change=True)
|
|
529
|
-
|
|
530
|
-
mode_names = {"a": "Local Guardian", "b": "Smart Local", "c": "Full Power"}
|
|
531
|
-
print(f"\n ✓ Mode {choice.upper()} ({mode_names[choice]}) configured")
|
|
532
|
-
|
|
533
|
-
# -- Step 3: Code Knowledge Graph --
|
|
534
|
-
print()
|
|
535
|
-
print("─── Step 3/10: Code Knowledge Graph ───")
|
|
536
|
-
print()
|
|
537
|
-
print(" CodeGraph builds a structural map of your codebase using Tree-sitter.")
|
|
538
|
-
print(" It gives your AI assistant blast-radius analysis, call graphs,")
|
|
539
|
-
print(" and connects code structure to your session memories.")
|
|
540
|
-
print()
|
|
541
|
-
print(" [Y] Enable CodeGraph (recommended for developers)")
|
|
542
|
-
print(" [N] Disable CodeGraph (can enable later via config)")
|
|
543
|
-
print()
|
|
544
|
-
|
|
545
|
-
if interactive:
|
|
546
|
-
cg_choice = _prompt(" Enable Code Knowledge Graph? [Y/n] (default: Y): ", "y").lower()
|
|
547
|
-
else:
|
|
548
|
-
cg_choice = "y"
|
|
549
|
-
print(" Auto-enabling CodeGraph (non-interactive)")
|
|
550
|
-
|
|
551
|
-
code_graph_enabled = cg_choice in ("", "y", "yes")
|
|
552
|
-
|
|
553
|
-
# Write code graph config
|
|
554
|
-
slm_root.mkdir(parents=True, exist_ok=True)
|
|
555
|
-
cg_config_path = slm_root / "code_graph_config.json"
|
|
556
|
-
import json
|
|
557
|
-
cg_config_data = {"enabled": code_graph_enabled, "bridge_enabled": code_graph_enabled}
|
|
558
|
-
cg_config_path.write_text(json.dumps(cg_config_data, indent=2))
|
|
559
|
-
|
|
560
|
-
if code_graph_enabled:
|
|
561
|
-
print(f"\n ✓ CodeGraph enabled")
|
|
562
|
-
print(f" Run `slm code-graph build` in any repo to index it")
|
|
563
|
-
else:
|
|
564
|
-
print(f"\n ✓ CodeGraph disabled (enable later in {cg_config_path})")
|
|
565
|
-
|
|
566
|
-
# v3.8.2: up-front download summary so a large pull is never a surprise on
|
|
567
|
-
# a metered/slow link. Sizes approximate, one-time, cached locally.
|
|
568
|
-
if st_ok and not _embedding_is_remote(config):
|
|
569
|
-
print()
|
|
570
|
-
print(" Models to download (one-time, cached locally):")
|
|
571
|
-
print(" • Embedding model ~500 MB — required for semantic recall")
|
|
572
|
-
print(" • Reranker model ~130 MB — result quality")
|
|
573
|
-
print(" • Compression model ~560 MB — optional (you'll be asked)")
|
|
574
|
-
|
|
575
|
-
# -- Step 4: Download models --
|
|
576
|
-
print()
|
|
577
|
-
# H-06 (CVE-2025-14926): a malicious HuggingFace checkpoint can execute code
|
|
578
|
-
# at load time. SLM only downloads its pinned defaults, but warn users who
|
|
579
|
-
# point config at a custom model.
|
|
580
|
-
print(" ⚠ Only install models from sources you trust — a malicious model")
|
|
581
|
-
print(" checkpoint can run code on your machine at load time. See SECURITY.md.")
|
|
582
|
-
print("─── Step 4/10: Download Embedding Model ───")
|
|
583
|
-
|
|
584
|
-
if _embedding_is_remote(config):
|
|
585
|
-
# v3.7.6 (#72): a remote/OpenAI-compatible embedding endpoint supplies
|
|
586
|
-
# its own vectors (any width, e.g. 1024d Qwen3-Embedding), so pulling the
|
|
587
|
-
# local 768d nomic model would be wasted bandwidth and could imply a
|
|
588
|
-
# dimension that does not match the endpoint.
|
|
589
|
-
emb = config.embedding
|
|
590
|
-
print(" ✓ Skipped — remote/OpenAI-compatible embedding endpoint configured")
|
|
591
|
-
print(f" provider={getattr(emb, 'provider', '?')}, "
|
|
592
|
-
f"dimension={getattr(emb, 'dimension', '?')}")
|
|
593
|
-
print(" No local embedding model needed.")
|
|
594
|
-
elif not st_ok:
|
|
595
|
-
print(" ⚠ Skipped (sentence-transformers not installed)")
|
|
596
|
-
print(" Models will download on first use.")
|
|
597
|
-
else:
|
|
598
|
-
embed_ok = _download_model(_EMBED_MODEL, "Embedding model")
|
|
599
|
-
if not embed_ok:
|
|
600
|
-
print(" ⚠ Model will download on first use (may take a few minutes)")
|
|
601
|
-
|
|
602
|
-
print()
|
|
603
|
-
print("─── Step 4b/10: Download Reranker Model ───")
|
|
604
|
-
|
|
605
|
-
if _reranker_is_remote(config):
|
|
606
|
-
# v3.8.12 (#105): a remote /v1/rerank endpoint scores the results, so
|
|
607
|
-
# the local English cross-encoder would be dead weight on disk.
|
|
608
|
-
rt = config.retrieval
|
|
609
|
-
print(" ✓ Skipped — remote rerank endpoint configured")
|
|
610
|
-
print(f" backend={getattr(rt, 'cross_encoder_backend', '?')}, "
|
|
611
|
-
f"model={getattr(rt, 'cross_encoder_model', '?')}")
|
|
612
|
-
print(" No local reranker model needed.")
|
|
613
|
-
elif not st_ok:
|
|
614
|
-
print(" ⚠ Skipped (sentence-transformers not installed)")
|
|
615
|
-
else:
|
|
616
|
-
_download_reranker(_RERANKER_MODEL)
|
|
617
|
-
|
|
618
|
-
print()
|
|
619
|
-
print("─── Step 4c/10: Compression Model (LLMLingua-2, ~560MB) ───")
|
|
620
|
-
print(" Only used for aggressive prompt compression. It also downloads")
|
|
621
|
-
print(" automatically the first time you enable that feature — so skipping")
|
|
622
|
-
print(" here is safe.")
|
|
623
|
-
# v3.8.2: consent-gate the 560MB compressor (was unconditional). Skip by
|
|
624
|
-
# default; it lazy-downloads on first real use of compression.
|
|
625
|
-
if not st_ok:
|
|
626
|
-
print(" ⚠ Skipped (sentence-transformers not installed)")
|
|
627
|
-
elif interactive:
|
|
628
|
-
comp_choice = _prompt(
|
|
629
|
-
" Download the ~560MB compression model now? [y/N] (default: N): ",
|
|
630
|
-
"n",
|
|
631
|
-
).lower()
|
|
632
|
-
if comp_choice in ("y", "yes"):
|
|
633
|
-
_download_compressor(_COMPRESSOR_MODEL)
|
|
634
|
-
else:
|
|
635
|
-
print(" ✓ Skipped — downloads automatically when you enable compression.")
|
|
636
|
-
else:
|
|
637
|
-
print(" ✓ Skipped (non-interactive) — downloads on first use.")
|
|
638
|
-
|
|
639
|
-
# -- Step 5: Daemon Configuration (v3.4.3) --
|
|
640
|
-
print()
|
|
641
|
-
print("─── Step 5/10: Daemon Configuration ───")
|
|
642
|
-
print()
|
|
643
|
-
print(" The SLM daemon runs in the background for instant memory access.")
|
|
644
|
-
print()
|
|
645
|
-
print(" [1] 24/7 Always-On (recommended — brain never sleeps)")
|
|
646
|
-
print(" [2] Auto-shutdown after idle (saves RAM when not coding)")
|
|
647
|
-
print()
|
|
648
|
-
|
|
649
|
-
if interactive:
|
|
650
|
-
daemon_choice = _prompt(" Select daemon mode [1/2] (default: 1): ", "1")
|
|
651
|
-
else:
|
|
652
|
-
daemon_choice = "1"
|
|
653
|
-
print(" Auto-selecting 24/7 mode (non-interactive)")
|
|
654
|
-
|
|
655
|
-
if daemon_choice == "2":
|
|
656
|
-
if interactive:
|
|
657
|
-
timeout_choice = _prompt(" Idle timeout [30m/1h/2h] (default: 30m): ", "30m")
|
|
658
|
-
else:
|
|
659
|
-
timeout_choice = "30m"
|
|
660
|
-
timeout_map = {"30m": 1800, "1h": 3600, "2h": 7200}
|
|
661
|
-
config.daemon_idle_timeout = timeout_map.get(timeout_choice, 1800)
|
|
662
|
-
print(f"\n ✓ Auto-shutdown after {timeout_choice} idle")
|
|
663
|
-
else:
|
|
664
|
-
config.daemon_idle_timeout = 0
|
|
665
|
-
print("\n ✓ 24/7 Always-On mode")
|
|
666
|
-
|
|
667
|
-
config.save(mode_change=True)
|
|
668
|
-
|
|
669
|
-
# -- Step 6: Mesh Communication (v3.4.3) --
|
|
670
|
-
print()
|
|
671
|
-
print("─── Step 6/10: Mesh Communication ───")
|
|
672
|
-
print()
|
|
673
|
-
print(" SLM Mesh enables agent-to-agent P2P communication.")
|
|
674
|
-
print(" Multiple AI sessions can share knowledge in real-time.")
|
|
675
|
-
print()
|
|
676
|
-
print(" [Y] Enable Mesh (recommended)")
|
|
677
|
-
print(" [N] Disable Mesh")
|
|
678
|
-
print()
|
|
679
|
-
|
|
680
|
-
if interactive:
|
|
681
|
-
mesh_choice = _prompt(" Enable Mesh? [Y/n] (default: Y): ", "y").lower()
|
|
682
|
-
else:
|
|
683
|
-
mesh_choice = "y"
|
|
684
|
-
print(" Auto-enabling Mesh (non-interactive)")
|
|
685
|
-
|
|
686
|
-
config.mesh_enabled = mesh_choice in ("", "y", "yes")
|
|
687
|
-
config.save(mode_change=True)
|
|
688
|
-
print(f"\n ✓ Mesh {'enabled' if config.mesh_enabled else 'disabled'}")
|
|
689
|
-
|
|
690
|
-
# -- Step 7: Ingestion Adapters (v3.4.3) --
|
|
691
|
-
print()
|
|
692
|
-
print("─── Step 7/10: Ingestion Adapters ───")
|
|
693
|
-
print()
|
|
694
|
-
print(" These let SLM learn from your email, calendar, and meetings.")
|
|
695
|
-
print(" All adapters are OFF by default. You can enable them later.")
|
|
696
|
-
print()
|
|
697
|
-
print(" Available adapters:")
|
|
698
|
-
print(" • Gmail Ingestion — requires Google OAuth setup")
|
|
699
|
-
print(" • Google Calendar — shares Gmail credentials")
|
|
700
|
-
print(" • Meeting Transcripts — watches a folder for .srt/.vtt files")
|
|
701
|
-
print()
|
|
702
|
-
|
|
703
|
-
if interactive:
|
|
704
|
-
adapter_input = _prompt(" Enable any now? [Enter to skip, or type: gmail,calendar,transcript]: ", "")
|
|
705
|
-
else:
|
|
706
|
-
adapter_input = ""
|
|
707
|
-
|
|
708
|
-
# Save adapter preferences (actual setup happens via `slm adapters enable X`)
|
|
709
|
-
adapters_config = {"gmail": False, "calendar": False, "transcript": False}
|
|
710
|
-
if adapter_input:
|
|
711
|
-
for name in adapter_input.split(","):
|
|
712
|
-
name = name.strip().lower()
|
|
713
|
-
if name in adapters_config:
|
|
714
|
-
adapters_config[name] = True
|
|
715
|
-
|
|
716
|
-
adapters_path = slm_root / "adapters.json"
|
|
717
|
-
import json as _json
|
|
718
|
-
adapters_path.write_text(_json.dumps(
|
|
719
|
-
{k: {"enabled": v, "tier": "polling"} for k, v in adapters_config.items()},
|
|
720
|
-
indent=2,
|
|
721
|
-
))
|
|
722
|
-
|
|
723
|
-
enabled_adapters = [k for k, v in adapters_config.items() if v]
|
|
724
|
-
if enabled_adapters:
|
|
725
|
-
print(f"\n ✓ Enabled: {', '.join(enabled_adapters)}")
|
|
726
|
-
print(" Run `slm adapters start <name>` to begin ingestion")
|
|
727
|
-
else:
|
|
728
|
-
print("\n ✓ All adapters disabled (enable later: slm adapters enable gmail)")
|
|
729
|
-
|
|
730
|
-
# -- Step 8: Entity Compilation (v3.4.3) --
|
|
731
|
-
print()
|
|
732
|
-
print("─── Step 8/10: Entity Compilation ───")
|
|
733
|
-
print()
|
|
734
|
-
print(" Entity compilation builds knowledge summaries per person,")
|
|
735
|
-
print(" project, and concept. Runs automatically during consolidation.")
|
|
736
|
-
print()
|
|
737
|
-
print(" [Y] Enable entity compilation (recommended)")
|
|
738
|
-
print(" [N] Disable")
|
|
739
|
-
print()
|
|
740
|
-
|
|
741
|
-
if interactive:
|
|
742
|
-
ec_choice = _prompt(" Enable entity compilation? [Y/n] (default: Y): ", "y").lower()
|
|
743
|
-
else:
|
|
744
|
-
ec_choice = "y"
|
|
745
|
-
print(" Auto-enabling entity compilation (non-interactive)")
|
|
746
|
-
|
|
747
|
-
config.entity_compilation_enabled = ec_choice in ("", "y", "yes")
|
|
748
|
-
config.save(mode_change=True)
|
|
749
|
-
print(f"\n ✓ Entity compilation {'enabled' if config.entity_compilation_enabled else 'disabled'}")
|
|
750
|
-
|
|
751
|
-
# -- Step 9: Skill Evolution (v3.4.11) --
|
|
752
|
-
print()
|
|
753
|
-
print("─── Step 9/10: Skill Evolution ───")
|
|
754
|
-
print()
|
|
755
|
-
print(" SLM can automatically evolve skills that underperform.")
|
|
756
|
-
print(" It detects degradation, generates improvements, and verifies them blindly.")
|
|
757
|
-
print(" Requires an LLM backend (Claude CLI, Ollama, or API key).")
|
|
758
|
-
print()
|
|
759
|
-
print(" OFF by default — when enabled it makes background LLM calls.")
|
|
760
|
-
print(" [Y] Enable Skill Evolution")
|
|
761
|
-
print(" [N] Keep disabled (enable later: slm config set evolution.enabled true)")
|
|
762
|
-
print()
|
|
763
|
-
|
|
764
|
-
# v3.8.2: default OFF (was Y) — consistent with the npm profiles and no
|
|
765
|
-
# surprise outbound LLM calls for a fresh user. Opt-in, not opt-out.
|
|
766
|
-
if interactive:
|
|
767
|
-
evo_choice = _prompt(" Enable Skill Evolution? [y/N] (default: N): ", "n").lower()
|
|
768
|
-
else:
|
|
769
|
-
evo_choice = "n"
|
|
770
|
-
print(" Skill Evolution stays OFF (non-interactive) — enable later with:")
|
|
771
|
-
print(" slm config set evolution.enabled true")
|
|
772
|
-
|
|
773
|
-
evolution_enabled = evo_choice in ("y", "yes")
|
|
774
|
-
|
|
775
|
-
# Write evolution config to config.json directly
|
|
776
|
-
# (SLMConfig.save() doesn't serialize evolution)
|
|
777
|
-
slm_root.mkdir(parents=True, exist_ok=True)
|
|
778
|
-
evo_config_path = slm_root / "config.json"
|
|
779
|
-
evo_cfg: dict = {}
|
|
780
|
-
if evo_config_path.exists():
|
|
781
|
-
try:
|
|
782
|
-
evo_cfg = json.loads(evo_config_path.read_text())
|
|
783
|
-
except (json.JSONDecodeError, OSError):
|
|
784
|
-
pass
|
|
785
|
-
evo_cfg["evolution"] = {
|
|
786
|
-
"enabled": evolution_enabled,
|
|
787
|
-
"backend": "auto",
|
|
788
|
-
}
|
|
789
|
-
evo_config_path.write_text(json.dumps(evo_cfg, indent=2) + "\n")
|
|
790
|
-
|
|
791
|
-
if evolution_enabled:
|
|
792
|
-
print(f"\n ✓ Skill Evolution enabled (backend: auto-detect)")
|
|
793
|
-
else:
|
|
794
|
-
print(f"\n ✓ Skill Evolution disabled")
|
|
795
|
-
|
|
796
|
-
# -- Step 10: Verification --
|
|
797
|
-
print()
|
|
798
|
-
print("─── Step 10/10: Verification ───")
|
|
799
|
-
|
|
800
|
-
if st_ok:
|
|
801
|
-
verified = _verify_installation()
|
|
802
|
-
else:
|
|
803
|
-
print(" ⚠ Skipped (sentence-transformers not installed)")
|
|
804
|
-
verified = False
|
|
805
|
-
|
|
806
|
-
# v3.4.26 options — data-dir safety + queue toggle. One prompt max.
|
|
807
|
-
try:
|
|
808
|
-
from superlocalmemory.cli.wizard_v3426_options import (
|
|
809
|
-
persist_v3426_options,
|
|
810
|
-
prompt_v3426_options,
|
|
811
|
-
validate_install_data_dir,
|
|
812
|
-
)
|
|
813
|
-
ok, reason = validate_install_data_dir(slm_root)
|
|
814
|
-
if not ok:
|
|
815
|
-
print()
|
|
816
|
-
print(" ⚠ Data directory check failed:")
|
|
817
|
-
for line in reason.splitlines():
|
|
818
|
-
print(f" {line}")
|
|
819
|
-
print()
|
|
820
|
-
v3426_opts = prompt_v3426_options(interactive=interactive)
|
|
821
|
-
persist_v3426_options(v3426_opts, slm_root)
|
|
822
|
-
except Exception as exc:
|
|
823
|
-
# Wizard must never crash over an advisory feature.
|
|
824
|
-
print(f" (v3.4.26 options step skipped: {exc})")
|
|
825
|
-
|
|
826
|
-
# External IDE configuration and login-time services cross ownership
|
|
827
|
-
# boundaries. They require explicit consent even inside the setup wizard.
|
|
828
|
-
_configure_external_integrations(interactive=interactive)
|
|
829
|
-
_configure_autostart(interactive=interactive)
|
|
830
|
-
|
|
831
|
-
# -- Done --
|
|
832
|
-
_mark_complete()
|
|
833
|
-
|
|
834
|
-
print()
|
|
835
|
-
print("╔══════════════════════════════════════════════════════════╗")
|
|
836
|
-
if verified:
|
|
837
|
-
print("║ ✓ Setup Complete — The Unified Brain is ready! ║")
|
|
838
|
-
else:
|
|
839
|
-
print("║ ✓ Setup Complete — basic config saved ║")
|
|
840
|
-
print("║ Models will auto-download on first use ║")
|
|
841
|
-
print("╚══════════════════════════════════════════════════════════╝")
|
|
842
|
-
print()
|
|
843
|
-
|
|
844
|
-
# Summary of choices
|
|
845
|
-
daemon_mode = "24/7" if config.daemon_idle_timeout == 0 else f"auto-shutdown ({config.daemon_idle_timeout}s)"
|
|
846
|
-
print(f" Enabled: Mode {choice.upper()}, Daemon ({daemon_mode})", end="")
|
|
847
|
-
if config.mesh_enabled:
|
|
848
|
-
print(", Mesh", end="")
|
|
849
|
-
if config.entity_compilation_enabled:
|
|
850
|
-
print(", Entity Compilation", end="")
|
|
851
|
-
if code_graph_enabled:
|
|
852
|
-
print(", CodeGraph", end="")
|
|
853
|
-
if evolution_enabled:
|
|
854
|
-
print(", Skill Evolution", end="")
|
|
855
|
-
print()
|
|
856
|
-
if enabled_adapters:
|
|
857
|
-
print(f" Adapters: {', '.join(enabled_adapters)}")
|
|
858
|
-
else:
|
|
859
|
-
print(" Adapters: none (enable via: slm adapters enable gmail)")
|
|
860
|
-
print()
|
|
861
|
-
# v3.8.2: surface component self-heal status so the user leaves setup
|
|
862
|
-
# KNOWING everything they need is present — or exactly what to run if not.
|
|
863
|
-
try:
|
|
864
|
-
from superlocalmemory.core import component_registry as _cr
|
|
865
|
-
|
|
866
|
-
_sum = _cr.snapshot(config)["summary"]
|
|
867
|
-
if _sum.get("healthy"):
|
|
868
|
-
print(" ✓ All components ready — models and dependencies present.")
|
|
869
|
-
else:
|
|
870
|
-
print(f" ⚠ {_sum.get('missing', 0)} component(s) need attention.")
|
|
871
|
-
print(" SLM auto-repairs fixable ones on daemon start. To check/fix now:")
|
|
872
|
-
print(" slm doctor (auto-fix: slm doctor --fix)")
|
|
873
|
-
except Exception:
|
|
874
|
-
pass
|
|
875
|
-
print()
|
|
876
|
-
print(" Quick start:")
|
|
877
|
-
print(' slm remember "your first memory"')
|
|
878
|
-
print(' slm recall "search query"')
|
|
879
|
-
print(" slm dashboard → http://localhost:8765")
|
|
880
|
-
print(" slm adapters enable gmail → start Gmail ingestion")
|
|
881
|
-
print()
|
|
882
|
-
print(" Need help?")
|
|
883
|
-
print(" slm help — every command, grouped (try: slm help self-heal)")
|
|
884
|
-
print(" slm doctor — diagnose issues (auto-fix: slm doctor --fix)")
|
|
885
|
-
print(" slm serve install — install auto-start service")
|
|
886
|
-
print(" https://github.com/qualixar/superlocalmemory")
|
|
887
|
-
print()
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
# ---------------------------------------------------------------------------
|
|
891
|
-
# First-use auto-trigger
|
|
892
|
-
# ---------------------------------------------------------------------------
|
|
893
|
-
|
|
894
|
-
def check_first_use(command: str) -> None:
|
|
895
|
-
"""Check if setup is needed before running a command.
|
|
896
|
-
|
|
897
|
-
Called from main.py before dispatching any command.
|
|
898
|
-
Skips for commands that don't need setup (setup, hook, --version, --help).
|
|
899
|
-
|
|
900
|
-
First use may initialize SLM-owned defaults, but it never edits an IDE,
|
|
901
|
-
installs a plugin, or creates an operating-system service. Those external
|
|
902
|
-
mutations require explicit consent inside ``slm setup``.
|
|
903
|
-
"""
|
|
904
|
-
# Commands that work without setup
|
|
905
|
-
_SKIP_COMMANDS = {
|
|
906
|
-
"setup", "init", "hook", "hooks", "reap", "mcp", "diagnostics",
|
|
907
|
-
}
|
|
908
|
-
if command in _SKIP_COMMANDS:
|
|
909
|
-
return
|
|
910
|
-
|
|
911
|
-
if is_setup_complete():
|
|
912
|
-
return
|
|
913
|
-
|
|
914
|
-
# Non-interactive: use defaults silently, don't block the command.
|
|
915
|
-
# CRIT-1: only save config when it does NOT already exist — lazy-init may
|
|
916
|
-
# have already written a valid config.json; overwriting it here would clobber
|
|
917
|
-
# any lazy-init content (e.g. a pre-existing mode-A skeleton).
|
|
918
|
-
if not is_interactive():
|
|
919
|
-
try:
|
|
920
|
-
from superlocalmemory.core.config import SLMConfig
|
|
921
|
-
from superlocalmemory.storage.models import Mode
|
|
922
|
-
config_path = _resolve_slm_home() / "config.json"
|
|
923
|
-
if not config_path.exists():
|
|
924
|
-
cfg = SLMConfig.for_mode(Mode.A)
|
|
925
|
-
cfg.save(mode_change=True)
|
|
926
|
-
_mark_complete()
|
|
927
|
-
except Exception:
|
|
928
|
-
pass
|
|
929
|
-
return
|
|
930
|
-
|
|
931
|
-
# Interactive: run the full wizard
|
|
932
|
-
print()
|
|
933
|
-
print(" First time using SuperLocalMemory!")
|
|
934
|
-
print(" Running setup wizard...\n")
|
|
935
|
-
run_wizard()
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
def _configure_external_integrations(*, interactive: bool) -> bool:
|
|
939
|
-
"""Request consent before editing Claude Code configuration.
|
|
940
|
-
|
|
941
|
-
v3.8.2: after the Claude Code step, a pip user can also wire every OTHER
|
|
942
|
-
detected IDE in one step (previously only Claude Code was offered here;
|
|
943
|
-
other IDEs required a manual `slm connect <ide>` each).
|
|
944
|
-
"""
|
|
945
|
-
print()
|
|
946
|
-
print(" Optional Claude Code integration can install the SLM plugin and hooks.")
|
|
947
|
-
if not interactive:
|
|
948
|
-
print(" Skipped in non-interactive setup. Run: slm connect claude-code")
|
|
949
|
-
return False
|
|
950
|
-
changed = False
|
|
951
|
-
choice = _prompt(
|
|
952
|
-
" Install Claude Code plugin and hooks now? [y/N] (default: N): ",
|
|
953
|
-
"n",
|
|
954
|
-
).lower()
|
|
955
|
-
if choice in ("y", "yes"):
|
|
956
|
-
changed = _install_external_integrations()
|
|
957
|
-
else:
|
|
958
|
-
print(" Skipped. Run `slm connect claude-code` when ready.")
|
|
959
|
-
# v3.8.2: offer to connect all other detected IDEs (Cursor, VS Code, …).
|
|
960
|
-
changed = _configure_other_ides(interactive=interactive) or changed
|
|
961
|
-
return changed
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
def _configure_other_ides(*, interactive: bool) -> bool:
|
|
965
|
-
"""Consent-gated: connect all OTHER detected IDEs (Cursor, VS Code, …).
|
|
966
|
-
|
|
967
|
-
Uses the same IDEConnector the dashboard uses. Best-effort — a failure to
|
|
968
|
-
detect or connect any single IDE never blocks setup.
|
|
969
|
-
"""
|
|
970
|
-
if not interactive:
|
|
971
|
-
return False
|
|
972
|
-
try:
|
|
973
|
-
from superlocalmemory.hooks.ide_connector import IDEConnector
|
|
974
|
-
|
|
975
|
-
connector = IDEConnector()
|
|
976
|
-
installed = [s for s in connector.get_status() if s.get("installed")]
|
|
977
|
-
except Exception:
|
|
978
|
-
return False
|
|
979
|
-
others = [s for s in installed if s.get("id") not in ("claude-code", "claude")]
|
|
980
|
-
if not others:
|
|
981
|
-
return False
|
|
982
|
-
names = ", ".join(s.get("name", s.get("id")) for s in others)
|
|
983
|
-
print()
|
|
984
|
-
print(f" Detected other IDEs: {names}")
|
|
985
|
-
print(" SLM can wire them all so memory works across every editor.")
|
|
986
|
-
choice = _prompt(" Connect them now? [Y/n] (default: Y): ", "y").lower()
|
|
987
|
-
if choice not in ("", "y", "yes"):
|
|
988
|
-
print(" Skipped. Connect any later with: slm connect <ide>")
|
|
989
|
-
return False
|
|
990
|
-
changed = False
|
|
991
|
-
for s in others:
|
|
992
|
-
ide_id = s.get("id")
|
|
993
|
-
label = s.get("name", ide_id)
|
|
994
|
-
try:
|
|
995
|
-
if connector.connect(ide_id):
|
|
996
|
-
print(f" ✓ {label}")
|
|
997
|
-
changed = True
|
|
998
|
-
else:
|
|
999
|
-
print(f" ⚠ {label} — connect later: slm connect {ide_id}")
|
|
1000
|
-
except Exception:
|
|
1001
|
-
print(f" ⚠ {label} — connect later: slm connect {ide_id}")
|
|
1002
|
-
return changed
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
def _install_external_integrations() -> bool:
|
|
1006
|
-
"""Install Claude Code hooks/plugin after explicit setup consent.
|
|
1007
|
-
|
|
1008
|
-
Installation rules:
|
|
1009
|
-
* Skip if the user explicitly opted out via ``slm hooks remove``
|
|
1010
|
-
* Skip hook configuration if Claude Code has no settings file.
|
|
1011
|
-
* Best-effort: setup remains usable when Claude Code is unavailable.
|
|
1012
|
-
"""
|
|
1013
|
-
changed = False
|
|
1014
|
-
try:
|
|
1015
|
-
opt_out = _resolve_slm_home() / "hooks" / ".hooks-disabled"
|
|
1016
|
-
claude_settings = Path.home() / ".claude" / "settings.json"
|
|
1017
|
-
if not opt_out.exists() and claude_settings.exists():
|
|
1018
|
-
from superlocalmemory.hooks.claude_code_hooks import install_hooks
|
|
1019
|
-
changed = bool(install_hooks()) or changed
|
|
1020
|
-
except Exception:
|
|
1021
|
-
# Best-effort: never block setup over an optional integration.
|
|
1022
|
-
pass
|
|
1023
|
-
|
|
1024
|
-
return _try_install_claude_plugin() or changed
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
def _try_install_claude_plugin() -> bool:
|
|
1028
|
-
"""Install the Claude Code plugin after explicit setup consent.
|
|
1029
|
-
|
|
1030
|
-
Runs ``claude plugin marketplace add qualixar/superlocalmemory`` then
|
|
1031
|
-
``claude plugin install superlocalmemory@qualixar`` if the ``claude``
|
|
1032
|
-
CLI is found in PATH. Silent on any error — plugin install is a
|
|
1033
|
-
convenience, not a hard requirement for SLM to function.
|
|
1034
|
-
"""
|
|
1035
|
-
import shutil
|
|
1036
|
-
import subprocess
|
|
1037
|
-
|
|
1038
|
-
claude = shutil.which("claude")
|
|
1039
|
-
if not claude:
|
|
1040
|
-
print(" Claude Code CLI not found; plugin installation skipped.")
|
|
1041
|
-
return False
|
|
1042
|
-
|
|
1043
|
-
_run = lambda cmd: subprocess.run( # noqa: E731
|
|
1044
|
-
cmd, capture_output=True, timeout=30, check=False
|
|
1045
|
-
)
|
|
1046
|
-
|
|
1047
|
-
try:
|
|
1048
|
-
marketplace = _run(
|
|
1049
|
-
[claude, "plugin", "marketplace", "add", "qualixar/superlocalmemory"]
|
|
1050
|
-
)
|
|
1051
|
-
installed = _run(
|
|
1052
|
-
[claude, "plugin", "install", "superlocalmemory@qualixar"]
|
|
1053
|
-
)
|
|
1054
|
-
return marketplace.returncode == 0 and installed.returncode == 0
|
|
1055
|
-
except Exception:
|
|
1056
|
-
return False
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
def _configure_autostart(*, interactive: bool) -> bool:
|
|
1060
|
-
"""Request consent before creating a login-time service definition."""
|
|
1061
|
-
print()
|
|
1062
|
-
print(" Optional auto-start keeps the SLM daemon available after login.")
|
|
1063
|
-
if not interactive:
|
|
1064
|
-
print(" Skipped in non-interactive setup. Run: slm serve install")
|
|
1065
|
-
return False
|
|
1066
|
-
choice = _prompt(
|
|
1067
|
-
" Install the user-level auto-start service now? [y/N] (default: N): ",
|
|
1068
|
-
"n",
|
|
1069
|
-
).lower()
|
|
1070
|
-
if choice not in ("y", "yes"):
|
|
1071
|
-
print(" Skipped. Run `slm serve install` when ready.")
|
|
1072
|
-
return False
|
|
1073
|
-
return _install_autostart_service()
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
def _install_autostart_service() -> bool:
|
|
1077
|
-
"""Install the user service after explicit setup consent."""
|
|
1078
|
-
try:
|
|
1079
|
-
from superlocalmemory.cli.service_installer import install_service
|
|
1080
|
-
|
|
1081
|
-
installed = bool(install_service())
|
|
1082
|
-
if installed:
|
|
1083
|
-
print(" ✓ User-level SLM auto-start service installed.")
|
|
1084
|
-
else:
|
|
1085
|
-
print(" ⚠ Service was not installed (run: slm serve install)")
|
|
1086
|
-
return installed
|
|
1087
|
-
except Exception:
|
|
1088
|
-
print(" ⚠ Service was not installed (run: slm serve install)")
|
|
1089
|
-
return False
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
# ---------------------------------------------------------------------------
|
|
1093
|
-
# Mode C provider config (preserved from original)
|
|
1094
|
-
# ---------------------------------------------------------------------------
|
|
1095
|
-
|
|
1096
|
-
def configure_provider(config: object, provider_name: str | None = None) -> None:
|
|
1097
|
-
"""Configure an LLM provider for Mode C.
|
|
1098
|
-
|
|
1099
|
-
When ``provider_name`` is supplied by ``slm provider set <provider>``,
|
|
1100
|
-
configuration is non-interactive and resolves its credential from the
|
|
1101
|
-
provider's documented environment variable. Omitting it preserves the
|
|
1102
|
-
existing interactive picker.
|
|
1103
|
-
"""
|
|
1104
|
-
from superlocalmemory.core.config import SLMConfig
|
|
1105
|
-
from superlocalmemory.storage.models import Mode
|
|
1106
|
-
|
|
1107
|
-
presets = SLMConfig.provider_presets()
|
|
1108
|
-
|
|
1109
|
-
providers = list(presets.keys())
|
|
1110
|
-
interactive_selection = provider_name is None
|
|
1111
|
-
if interactive_selection:
|
|
1112
|
-
print()
|
|
1113
|
-
print(" Choose your LLM provider:")
|
|
1114
|
-
print()
|
|
1115
|
-
for i, name in enumerate(providers, 1):
|
|
1116
|
-
preset = presets[name]
|
|
1117
|
-
print(f" [{i}] {name.capitalize()} — {preset['model']}")
|
|
1118
|
-
print()
|
|
1119
|
-
|
|
1120
|
-
idx = _prompt(f" Select provider [1-{len(providers)}]: ", "1")
|
|
1121
|
-
try:
|
|
1122
|
-
provider_name = providers[int(idx) - 1]
|
|
1123
|
-
except (ValueError, IndexError):
|
|
1124
|
-
print(" Invalid choice. Using OpenAI.")
|
|
1125
|
-
provider_name = "openai"
|
|
1126
|
-
elif provider_name not in presets:
|
|
1127
|
-
raise ValueError(f"Unsupported provider: {provider_name}")
|
|
1128
|
-
|
|
1129
|
-
preset = presets[provider_name]
|
|
1130
|
-
|
|
1131
|
-
# Resolve API key
|
|
1132
|
-
env_key = preset.get("env_key", "")
|
|
1133
|
-
api_key = ""
|
|
1134
|
-
if env_key:
|
|
1135
|
-
existing = os.environ.get(env_key, "")
|
|
1136
|
-
if existing:
|
|
1137
|
-
print(f" Found {env_key} in environment.")
|
|
1138
|
-
api_key = existing
|
|
1139
|
-
elif interactive_selection and is_interactive():
|
|
1140
|
-
api_key = _prompt(
|
|
1141
|
-
f" Enter your {provider_name.capitalize()} API key: ",
|
|
1142
|
-
)
|
|
1143
|
-
|
|
1144
|
-
# Provider selection is an additive configuration operation. Rebuilding
|
|
1145
|
-
# via ``for_mode`` used to reset retrieval, scale-engine, evolution, and
|
|
1146
|
-
# user-tuned embedding settings — surprising and unsafe after a user had
|
|
1147
|
-
# configured a local or promoted Cozo/Lance deployment. Keep every
|
|
1148
|
-
# unrelated setting intact and change only the mode/provider contract.
|
|
1149
|
-
from superlocalmemory.core.config import LLMConfig
|
|
1150
|
-
|
|
1151
|
-
updated = config if isinstance(config, SLMConfig) else SLMConfig.load()
|
|
1152
|
-
updated.mode = Mode.C
|
|
1153
|
-
updated.llm = LLMConfig(
|
|
1154
|
-
provider=provider_name,
|
|
1155
|
-
model=preset["model"],
|
|
1156
|
-
api_key=api_key,
|
|
1157
|
-
api_base=preset["base_url"],
|
|
1158
|
-
)
|
|
1159
|
-
updated.save(mode_change=True)
|
|
1160
|
-
SLMConfig.write_current_mode(Mode.C, updated.base_dir)
|
|
1161
|
-
print(f" Provider: {provider_name}")
|
|
1162
|
-
print(f" Model: {preset['model']}")
|