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,637 +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
|
-
"""SuperLocalMemory v3.4.5 — Backend Orchestrator.
|
|
6
|
-
|
|
7
|
-
Central coordinator for multi-backend architecture.
|
|
8
|
-
Manages CozoDB, LanceDB, and TierManager lifecycle.
|
|
9
|
-
Handles auto-migration, fallback, and incremental sync.
|
|
10
|
-
|
|
11
|
-
This is the ONLY module that imports all three backends.
|
|
12
|
-
Other modules call BackendOrchestrator methods.
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import importlib.util
|
|
20
|
-
import logging
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
from typing import TYPE_CHECKING, Any
|
|
23
|
-
|
|
24
|
-
from superlocalmemory.core.projection_drain import ProjectionDrain
|
|
25
|
-
from superlocalmemory.storage import projection_outbox
|
|
26
|
-
|
|
27
|
-
if TYPE_CHECKING:
|
|
28
|
-
from superlocalmemory.core.config import SLMConfig
|
|
29
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def _module_spec_present(module: str) -> bool:
|
|
35
|
-
"""True if ``module`` can be imported, WITHOUT importing it.
|
|
36
|
-
|
|
37
|
-
``find_spec`` only resolves the loader; it never executes the module, so
|
|
38
|
-
native packages (lancedb, pycozo) cannot spawn background runtimes during
|
|
39
|
-
availability probes. Mirrors component_registry._module_present.
|
|
40
|
-
"""
|
|
41
|
-
try:
|
|
42
|
-
return importlib.util.find_spec(module) is not None
|
|
43
|
-
except Exception:
|
|
44
|
-
# A broken/partial install can raise inside find_spec — treat as absent.
|
|
45
|
-
return False
|
|
46
|
-
|
|
47
|
-
# ---------------------------------------------------------------------------
|
|
48
|
-
# Global singleton (set by daemon, read by store_pipeline)
|
|
49
|
-
# ---------------------------------------------------------------------------
|
|
50
|
-
|
|
51
|
-
_orchestrator: BackendOrchestrator | None = None
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def get_orchestrator() -> BackendOrchestrator | None:
|
|
55
|
-
"""Return the global BackendOrchestrator singleton."""
|
|
56
|
-
return _orchestrator
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def set_orchestrator(orch: BackendOrchestrator) -> None:
|
|
60
|
-
"""Set the global BackendOrchestrator singleton."""
|
|
61
|
-
global _orchestrator
|
|
62
|
-
_orchestrator = orch
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
# ---------------------------------------------------------------------------
|
|
66
|
-
# BackendOrchestrator
|
|
67
|
-
# ---------------------------------------------------------------------------
|
|
68
|
-
|
|
69
|
-
class BackendOrchestrator:
|
|
70
|
-
"""Central coordinator for multi-backend architecture.
|
|
71
|
-
|
|
72
|
-
Lifecycle:
|
|
73
|
-
on_daemon_start() → initialize bounded backend state → ready
|
|
74
|
-
sync_new_fact() → called from store_pipeline after SQLite write
|
|
75
|
-
health_check() → returns status of all backends
|
|
76
|
-
"""
|
|
77
|
-
|
|
78
|
-
def __init__(self, config: SLMConfig, db: DatabaseManager) -> None:
|
|
79
|
-
self._config = config
|
|
80
|
-
self._db = db
|
|
81
|
-
self._data_dir = Path(getattr(config, "data_dir", None) or config.base_dir)
|
|
82
|
-
self._cozo: Any = None
|
|
83
|
-
self._lancedb: Any = None
|
|
84
|
-
self._tiers: Any = None
|
|
85
|
-
self._backend_cache: dict[str, str] = {}
|
|
86
|
-
# Given accessors, not backends: a promotion or a rollback replaces
|
|
87
|
-
# them underneath the worker, and a reference captured here would keep
|
|
88
|
-
# writing into the projection that was just swapped out.
|
|
89
|
-
self._drain = ProjectionDrain(
|
|
90
|
-
db, self.get_graph_backend, self.get_vector_backend,
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
# ------------------------------------------------------------------
|
|
94
|
-
# Daemon Startup
|
|
95
|
-
# ------------------------------------------------------------------
|
|
96
|
-
|
|
97
|
-
def on_daemon_start(self) -> None:
|
|
98
|
-
"""Initialize bounded backend state without delaying daemon readiness."""
|
|
99
|
-
logger.info("BackendOrchestrator: daemon starting")
|
|
100
|
-
|
|
101
|
-
# 1. Apply schema (if not already applied)
|
|
102
|
-
self._apply_schema_v345()
|
|
103
|
-
|
|
104
|
-
# 2. Initialize TierManager (always). Backends are refreshed after
|
|
105
|
-
# optional projections have been opened below.
|
|
106
|
-
try:
|
|
107
|
-
from superlocalmemory.core.tier_manager import evaluate_tiers
|
|
108
|
-
self._tiers = evaluate_tiers
|
|
109
|
-
logger.info("BackendOrchestrator: tier evaluator registered")
|
|
110
|
-
except Exception as exc:
|
|
111
|
-
logger.warning("TierManager init failed (non-fatal): %s", exc)
|
|
112
|
-
|
|
113
|
-
# Full-database tier evaluation belongs to MaintenanceScheduler. Running
|
|
114
|
-
# it here blocks FastAPI lifespan readiness on mature upgrade databases
|
|
115
|
-
# and occurs before optional projection backends are fully registered.
|
|
116
|
-
|
|
117
|
-
self._recover_interrupted_scale_promotion()
|
|
118
|
-
|
|
119
|
-
# Reconcile what the config CLAIMS against what is on disk, before
|
|
120
|
-
# anything reads either -- and before the early return below, because
|
|
121
|
-
# the stores that need reconciling are exactly the ones that take it.
|
|
122
|
-
#
|
|
123
|
-
# This used to sit after that return, so it ran only for a store already
|
|
124
|
-
# in the promoted state. The real case it was written for is a store
|
|
125
|
-
# whose settings name a graph and a vector backend, whose state is
|
|
126
|
-
# `verified` rather than `promoted`, and where neither directory exists:
|
|
127
|
-
# the settings kept the claim, the reconcile never ran, and every
|
|
128
|
-
# restart preserved it. The test asserted the call appeared before
|
|
129
|
-
# another call in the source text, which is true either way.
|
|
130
|
-
self._reconcile_backend_selection()
|
|
131
|
-
|
|
132
|
-
# Backends may be installed with the product, but installing a wheel
|
|
133
|
-
# is not authorization to mutate an existing data root. Only a
|
|
134
|
-
# verified, explicit promotion may initialize and migrate projections.
|
|
135
|
-
if getattr(self._config, "scale_engine_state", "local_core") != "promoted":
|
|
136
|
-
logger.info(
|
|
137
|
-
"Scale Engine remains on Local Core (state=%s)",
|
|
138
|
-
getattr(self._config, "scale_engine_state", "local_core"),
|
|
139
|
-
)
|
|
140
|
-
# v3.8.5: schedule a background check that auto-promotes to
|
|
141
|
-
# Cozo+LanceDB only once the DB is large enough that they beat the
|
|
142
|
-
# SQLite graph. A no-op (and never even starts the build) for the
|
|
143
|
-
# vast majority of installs, which sit far below the threshold.
|
|
144
|
-
self._maybe_schedule_auto_promote()
|
|
145
|
-
# Started even with no projection open. A pass with no backend
|
|
146
|
-
# returns without touching a row, and starting it here means a
|
|
147
|
-
# promotion that completes mid-session has a worker waiting for it
|
|
148
|
-
# rather than a queue nobody is reading.
|
|
149
|
-
self._drain.start()
|
|
150
|
-
return
|
|
151
|
-
|
|
152
|
-
# 3. Initialize CozoDB if available
|
|
153
|
-
cozo_available = self._detect_cozo()
|
|
154
|
-
if cozo_available:
|
|
155
|
-
self._init_cozo()
|
|
156
|
-
|
|
157
|
-
# 4. Initialize LanceDB if available
|
|
158
|
-
lancedb_available = self._detect_lancedb()
|
|
159
|
-
if lancedb_available:
|
|
160
|
-
self._init_lancedb()
|
|
161
|
-
|
|
162
|
-
# A promoted stage is already parity-verified. Never rebuild it at
|
|
163
|
-
# startup: automatic migration would bypass the staged lifecycle and
|
|
164
|
-
# could make the active projection diverge from canonical SQLite.
|
|
165
|
-
if self._cozo:
|
|
166
|
-
self._update_status("cozo", "active", self._cozo.health_check().get("edges", 0))
|
|
167
|
-
if self._lancedb:
|
|
168
|
-
self._update_status("lancedb", "active", self._lancedb.health_check().get("vectors", 0))
|
|
169
|
-
try:
|
|
170
|
-
from superlocalmemory.core.tier_manager import set_backends
|
|
171
|
-
set_backends(cozo=self._cozo, lancedb=self._lancedb)
|
|
172
|
-
except Exception as exc:
|
|
173
|
-
logger.warning("TierManager backend registration failed (non-fatal): %s", exc)
|
|
174
|
-
|
|
175
|
-
self._drain.start()
|
|
176
|
-
|
|
177
|
-
logger.info(
|
|
178
|
-
"BackendOrchestrator: daemon ready (cozo=%s, lancedb=%s, queued=%d)",
|
|
179
|
-
"active" if self._cozo and self._cozo_status() == "active" else "off",
|
|
180
|
-
"active" if self._lancedb and self._lancedb_status() == "active" else "off",
|
|
181
|
-
projection_outbox.depth(self._db),
|
|
182
|
-
)
|
|
183
|
-
|
|
184
|
-
def _maybe_schedule_auto_promote(self) -> None:
|
|
185
|
-
"""Schedule a delayed, one-shot scale auto-promote check (v3.8.5).
|
|
186
|
-
|
|
187
|
-
Fires well after boot warmup so it never competes for CPU / the write
|
|
188
|
-
lock during the startup window — the daemon keeps serving canonical
|
|
189
|
-
SQLite throughout. A no-op (never even starts the build) unless
|
|
190
|
-
auto-promotion is enabled AND the DB has grown past the threshold where
|
|
191
|
-
a graph DB actually beats the well-indexed SQLite graph.
|
|
192
|
-
"""
|
|
193
|
-
import os
|
|
194
|
-
import threading
|
|
195
|
-
|
|
196
|
-
cfg = self._config
|
|
197
|
-
if not getattr(cfg, "scale_auto_promote_enabled", True):
|
|
198
|
-
return
|
|
199
|
-
# Only a store that has finished promoting has nothing left to do.
|
|
200
|
-
#
|
|
201
|
-
# This used to skip every state except ``local_core``, which made
|
|
202
|
-
# ``prepared`` and ``verified`` terminal: the daemon above returns
|
|
203
|
-
# early for anything that is not ``promoted``, so the backends never
|
|
204
|
-
# started, and this refused to finish the promotion that would have
|
|
205
|
-
# started them. A store that got as far as building and checking its
|
|
206
|
-
# projection then sat on SQLite forever while its own config named Cozo
|
|
207
|
-
# and LanceDB as the backends — measured on a real store whose
|
|
208
|
-
# ``backend_status`` read lancedb=not_initialized under
|
|
209
|
-
# ``scale_engine_state=verified``.
|
|
210
|
-
#
|
|
211
|
-
# ``run_auto_promote`` already resumes a half-finished stage
|
|
212
|
-
# (``_resumable_stage``) and applies the size threshold and the
|
|
213
|
-
# repair-required check itself, so it is the right place for every
|
|
214
|
-
# decision except "there is nothing left to do".
|
|
215
|
-
if str(getattr(cfg, "scale_engine_state", "local_core")).lower() == "promoted":
|
|
216
|
-
return
|
|
217
|
-
try:
|
|
218
|
-
delay = float(os.environ.get("SLM_AUTO_PROMOTE_DELAY_S", "300"))
|
|
219
|
-
except (TypeError, ValueError):
|
|
220
|
-
delay = 300.0
|
|
221
|
-
timer = threading.Timer(delay, self._auto_promote_if_at_scale)
|
|
222
|
-
timer.daemon = True
|
|
223
|
-
timer.start()
|
|
224
|
-
|
|
225
|
-
def _count_default_edges(self) -> int:
|
|
226
|
-
"""graph_edges count for the default profile (fail-soft → 0)."""
|
|
227
|
-
try:
|
|
228
|
-
rows = self._db.execute(
|
|
229
|
-
"SELECT COUNT(*) AS c FROM graph_edges WHERE profile_id = 'default'"
|
|
230
|
-
)
|
|
231
|
-
return int(rows[0]["c"]) if rows else 0
|
|
232
|
-
except Exception:
|
|
233
|
-
return 0
|
|
234
|
-
|
|
235
|
-
def _auto_promote_if_at_scale(self) -> None:
|
|
236
|
-
"""Build + promote the Cozo/Lance projection iff the DB is at scale.
|
|
237
|
-
|
|
238
|
-
Uses the SAME staged parity gate as the manual CLI path
|
|
239
|
-
(prepare → verify → promote). Any failure leaves canonical SQLite
|
|
240
|
-
selected — the projection is derived data, never the source of truth.
|
|
241
|
-
The promoted backends only serve after the next daemon restart, so this
|
|
242
|
-
logs a clear, actionable message rather than swapping under a live
|
|
243
|
-
process.
|
|
244
|
-
"""
|
|
245
|
-
try:
|
|
246
|
-
import os
|
|
247
|
-
|
|
248
|
-
cfg = self._config
|
|
249
|
-
# Same rule as the scheduler that armed this timer: only a store
|
|
250
|
-
# that has finished has nothing left to do. Fixing the scheduler
|
|
251
|
-
# alone would have armed a timer whose callback still refused.
|
|
252
|
-
if str(getattr(cfg, "scale_engine_state", "local_core")).lower() == "promoted":
|
|
253
|
-
return
|
|
254
|
-
threshold = int(
|
|
255
|
-
os.environ.get("SLM_AUTO_PROMOTE_MIN_EDGES", "")
|
|
256
|
-
or getattr(cfg, "scale_auto_promote_min_edges", 100_000)
|
|
257
|
-
)
|
|
258
|
-
edges = self._count_default_edges()
|
|
259
|
-
if edges < threshold:
|
|
260
|
-
logger.info(
|
|
261
|
-
"Scale auto-promote: %d edges < threshold %d — Local Core "
|
|
262
|
-
"(SQLite) stays optimal; no projection built.",
|
|
263
|
-
edges, threshold,
|
|
264
|
-
)
|
|
265
|
-
return
|
|
266
|
-
logger.info(
|
|
267
|
-
"Scale auto-promote: %d edges >= threshold %d — building "
|
|
268
|
-
"Cozo+LanceDB projection in the background (SQLite keeps serving).",
|
|
269
|
-
edges, threshold,
|
|
270
|
-
)
|
|
271
|
-
from superlocalmemory.core.scale_engine import ScaleEngineManager
|
|
272
|
-
|
|
273
|
-
mgr = ScaleEngineManager(cfg, profile_id="default")
|
|
274
|
-
prepared = mgr.prepare()
|
|
275
|
-
stage_id = prepared.get("stage_id")
|
|
276
|
-
mgr.verify(stage_id)
|
|
277
|
-
mgr.promote(stage_id)
|
|
278
|
-
logger.warning(
|
|
279
|
-
"Scale Engine AUTO-PROMOTED to Cozo+LanceDB at %d edges. RESTART "
|
|
280
|
-
"the daemon (`slm restart`) to activate the backends; until then "
|
|
281
|
-
"it keeps serving canonical SQLite.",
|
|
282
|
-
edges,
|
|
283
|
-
)
|
|
284
|
-
except Exception as exc:
|
|
285
|
-
# Derived-data failure must never take down Local Core.
|
|
286
|
-
logger.warning(
|
|
287
|
-
"Scale auto-promote skipped — staying on Local Core / SQLite: %s",
|
|
288
|
-
exc,
|
|
289
|
-
)
|
|
290
|
-
|
|
291
|
-
def _reconcile_backend_selection(self) -> None:
|
|
292
|
-
"""Stop the config claiming a backend the store does not have.
|
|
293
|
-
|
|
294
|
-
THE STATE THIS REPAIRS
|
|
295
|
-
|
|
296
|
-
On a real store: ``graph_backend='cozo'``, ``vector_backend='lancedb'``,
|
|
297
|
-
``scale_engine_state='verified'`` -- and neither the ``cozo/`` nor the
|
|
298
|
-
``lance/`` directory existed, with no promotion journal to explain it.
|
|
299
|
-
Something wrote the selection a completed promotion writes, without a
|
|
300
|
-
promotion having completed.
|
|
301
|
-
|
|
302
|
-
Nothing corrected it. ``recover_interrupted_promotion`` acts only when a
|
|
303
|
-
journal exists, so with no journal it returns immediately and the claim
|
|
304
|
-
survives every restart. The dashboard then reports the configured backend
|
|
305
|
-
while retrieval uses SQLite, which is the disagreement a person notices
|
|
306
|
-
last and trusts first.
|
|
307
|
-
|
|
308
|
-
WHAT THIS DOES NOT DO
|
|
309
|
-
|
|
310
|
-
It does not disable anything. ``auto`` still detects and initialises both
|
|
311
|
-
projections when their libraries are installed, so the only thing removed
|
|
312
|
-
is the false claim. It leaves ``verified`` alone -- that is a legitimate
|
|
313
|
-
waypoint meaning "parity checked, not yet promoted" -- and only resets
|
|
314
|
-
``promoted``, which asserts a swap that plainly did not happen. And it
|
|
315
|
-
never touches a selection whose directory is present, nor one with a
|
|
316
|
-
journal still open, because those belong to the promotion lifecycle.
|
|
317
|
-
"""
|
|
318
|
-
try:
|
|
319
|
-
from superlocalmemory.core.scale_engine import ScaleEngineManager
|
|
320
|
-
|
|
321
|
-
manager = ScaleEngineManager(self._config, profile_id="default")
|
|
322
|
-
if manager.promotion_journal_path.exists():
|
|
323
|
-
return # the recovery path owns this
|
|
324
|
-
cozo_path, lance_path = manager.active_paths
|
|
325
|
-
except Exception as exc: # noqa: BLE001 -- reconciliation is best effort
|
|
326
|
-
logger.debug("Backend reconciliation skipped: %s", exc)
|
|
327
|
-
return
|
|
328
|
-
|
|
329
|
-
corrections: list[str] = []
|
|
330
|
-
graph = getattr(self._config, "graph_backend", "auto") or "auto"
|
|
331
|
-
if graph not in ("auto", "sqlite") and not cozo_path.exists():
|
|
332
|
-
corrections.append(f"graph_backend {graph!r} -> 'auto' (no {cozo_path.name}/)")
|
|
333
|
-
self._config.graph_backend = "auto"
|
|
334
|
-
vector = getattr(self._config, "vector_backend", "auto") or "auto"
|
|
335
|
-
if vector not in ("auto", "sqlite-vec") and not lance_path.exists():
|
|
336
|
-
corrections.append(
|
|
337
|
-
f"vector_backend {vector!r} -> 'auto' (no {lance_path.name}/)"
|
|
338
|
-
)
|
|
339
|
-
self._config.vector_backend = "auto"
|
|
340
|
-
state = getattr(self._config, "scale_engine_state", "") or ""
|
|
341
|
-
if state == "promoted" and not (cozo_path.exists() or lance_path.exists()):
|
|
342
|
-
corrections.append("scale_engine_state 'promoted' -> 'local_core'")
|
|
343
|
-
self._config.scale_engine_state = "local_core"
|
|
344
|
-
|
|
345
|
-
if not corrections:
|
|
346
|
-
return
|
|
347
|
-
try:
|
|
348
|
-
self._config.save()
|
|
349
|
-
except Exception as exc: # noqa: BLE001
|
|
350
|
-
logger.warning(
|
|
351
|
-
"Backend selection is inconsistent with the data directory and "
|
|
352
|
-
"could not be corrected (%s): %s", exc, "; ".join(corrections),
|
|
353
|
-
)
|
|
354
|
-
return
|
|
355
|
-
logger.warning(
|
|
356
|
-
"Backend selection did not match the data directory; corrected: %s",
|
|
357
|
-
"; ".join(corrections),
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
def _recover_interrupted_scale_promotion(self) -> None:
|
|
361
|
-
"""Repair an interrupted promotion; never auto-mutate a legacy root."""
|
|
362
|
-
try:
|
|
363
|
-
from superlocalmemory.core.scale_engine import ScaleEngineManager
|
|
364
|
-
|
|
365
|
-
result = ScaleEngineManager(
|
|
366
|
-
self._config,
|
|
367
|
-
profile_id="default",
|
|
368
|
-
).recover_interrupted_promotion()
|
|
369
|
-
if result:
|
|
370
|
-
logger.warning("Scale Engine promotion recovery: %s", result)
|
|
371
|
-
except Exception as exc:
|
|
372
|
-
# A scale projection is derived data. Startup must keep serving
|
|
373
|
-
# canonical SQLite even if optional recovery itself is unhealthy.
|
|
374
|
-
logger.error(
|
|
375
|
-
"Scale Engine recovery requires repair; Local Core remains active: %s",
|
|
376
|
-
exc,
|
|
377
|
-
)
|
|
378
|
-
|
|
379
|
-
# ------------------------------------------------------------------
|
|
380
|
-
# Incremental Sync (F-04: called from store_pipeline)
|
|
381
|
-
# ------------------------------------------------------------------
|
|
382
|
-
|
|
383
|
-
def sync_new_fact(self, fact: Any) -> None:
|
|
384
|
-
"""Signal that a stored fact needs projecting.
|
|
385
|
-
|
|
386
|
-
The projection itself is not written here. It used to be — inline, on
|
|
387
|
-
the caller's thread, with every failure swallowed into a debug line —
|
|
388
|
-
and that is the defect the outbox replaced. The intent to project was
|
|
389
|
-
already committed to ``projection_outbox`` in the same SQLite
|
|
390
|
-
transaction as the fact, so all that is left to do is wake the worker
|
|
391
|
-
that owns the projections.
|
|
392
|
-
|
|
393
|
-
Kept as a method because callers name this operation, and because a
|
|
394
|
-
caller that reaches it without an outbox row (an old store, mid-upgrade)
|
|
395
|
-
should still get its fact projected rather than silently skipped.
|
|
396
|
-
"""
|
|
397
|
-
fact_id = getattr(fact, "fact_id", None)
|
|
398
|
-
if fact_id:
|
|
399
|
-
projection_outbox.enqueue(
|
|
400
|
-
self._db, fact_id, getattr(fact, "profile_id", None) or "default",
|
|
401
|
-
)
|
|
402
|
-
self._drain.notify()
|
|
403
|
-
|
|
404
|
-
def sync_deleted_fact(self, fact_id: str) -> None:
|
|
405
|
-
"""Signal that a deleted fact must leave the projections.
|
|
406
|
-
|
|
407
|
-
A forgotten memory still present in the graph or the vector index is
|
|
408
|
-
still recallable, so the removal is queued with the same durability as
|
|
409
|
-
the delete itself.
|
|
410
|
-
"""
|
|
411
|
-
if fact_id:
|
|
412
|
-
projection_outbox.enqueue_for_fact(
|
|
413
|
-
self._db, fact_id, projection_outbox.OP_DELETE,
|
|
414
|
-
)
|
|
415
|
-
self._drain.notify()
|
|
416
|
-
|
|
417
|
-
def sync_changed_fact(self, fact_id: str) -> None:
|
|
418
|
-
"""Refresh projections after an authorized canonical fact update."""
|
|
419
|
-
if fact_id:
|
|
420
|
-
projection_outbox.enqueue_for_fact(self._db, fact_id)
|
|
421
|
-
self._drain.notify()
|
|
422
|
-
|
|
423
|
-
# ------------------------------------------------------------------
|
|
424
|
-
# Backend Access
|
|
425
|
-
# ------------------------------------------------------------------
|
|
426
|
-
|
|
427
|
-
def get_graph_backend(self) -> Any:
|
|
428
|
-
"""Return active graph backend or None (caller falls back to NetworkX)."""
|
|
429
|
-
if self._cozo and self._cozo_status() == "active":
|
|
430
|
-
return self._cozo
|
|
431
|
-
return None
|
|
432
|
-
|
|
433
|
-
def get_vector_backend(self) -> Any:
|
|
434
|
-
"""Return active vector backend or None."""
|
|
435
|
-
if self._lancedb and self._lancedb_status() == "active":
|
|
436
|
-
return self._lancedb
|
|
437
|
-
return None
|
|
438
|
-
|
|
439
|
-
def graph_retrieval_ready(self) -> bool:
|
|
440
|
-
"""Whether Cozo can be injected into entity recall.
|
|
441
|
-
|
|
442
|
-
Cozo carries both canonical entity mappings and fact graph edges. The
|
|
443
|
-
entity channel still shadows every projected result against SQLite and
|
|
444
|
-
fails closed on any mismatch, so availability never weakens recall.
|
|
445
|
-
"""
|
|
446
|
-
return bool(self._cozo and self._cozo_status() == "active")
|
|
447
|
-
|
|
448
|
-
# ------------------------------------------------------------------
|
|
449
|
-
# Health Check
|
|
450
|
-
# ------------------------------------------------------------------
|
|
451
|
-
|
|
452
|
-
def health_check(self) -> dict[str, Any]:
|
|
453
|
-
"""Comprehensive health status for dashboard + CLI."""
|
|
454
|
-
result: dict[str, Any] = {
|
|
455
|
-
"sqlite": {"status": "active"},
|
|
456
|
-
"cozo": {"status": "not_available"},
|
|
457
|
-
"lancedb": {"status": "not_available"},
|
|
458
|
-
"tiers": {},
|
|
459
|
-
"warnings": [],
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
try:
|
|
463
|
-
from superlocalmemory.core.tier_manager import get_tier_stats
|
|
464
|
-
result["tiers"] = get_tier_stats(self._db)
|
|
465
|
-
except Exception:
|
|
466
|
-
pass
|
|
467
|
-
|
|
468
|
-
if self._cozo:
|
|
469
|
-
try:
|
|
470
|
-
result["cozo"] = self._cozo.health_check()
|
|
471
|
-
except Exception as exc:
|
|
472
|
-
result["cozo"] = {"status": "error", "error": str(exc)}
|
|
473
|
-
else:
|
|
474
|
-
result["warnings"].append(
|
|
475
|
-
"CozoDB not active. Install: pip install superlocalmemory[cozo]"
|
|
476
|
-
)
|
|
477
|
-
|
|
478
|
-
if self._lancedb:
|
|
479
|
-
try:
|
|
480
|
-
result["lancedb"] = self._lancedb.health_check()
|
|
481
|
-
except Exception as exc:
|
|
482
|
-
result["lancedb"] = {"status": "error", "error": str(exc)}
|
|
483
|
-
else:
|
|
484
|
-
result["warnings"].append(
|
|
485
|
-
"LanceDB not active. Install: pip install superlocalmemory[lancedb]"
|
|
486
|
-
)
|
|
487
|
-
|
|
488
|
-
outbox = projection_outbox.health(self._db)
|
|
489
|
-
outbox["draining"] = self._drain.running
|
|
490
|
-
result["projection_queue"] = outbox
|
|
491
|
-
if outbox["stalled"]:
|
|
492
|
-
result["warnings"].append(
|
|
493
|
-
f"{outbox['stalled']} memory/memories could not be projected into "
|
|
494
|
-
"the graph or vector store. Run `slm doctor` for the ids."
|
|
495
|
-
)
|
|
496
|
-
|
|
497
|
-
return result
|
|
498
|
-
|
|
499
|
-
# ------------------------------------------------------------------
|
|
500
|
-
# Projection queue
|
|
501
|
-
# ------------------------------------------------------------------
|
|
502
|
-
|
|
503
|
-
def drain_projections(self, limit: int = 200) -> dict[str, Any]:
|
|
504
|
-
"""Apply queued facts now, on the calling thread.
|
|
505
|
-
|
|
506
|
-
For the CLI, for a repair pass, and for any caller that needs the
|
|
507
|
-
projections current before it reads them rather than a few milliseconds
|
|
508
|
-
later. Ordinary writes do not need this — they signal the worker.
|
|
509
|
-
"""
|
|
510
|
-
return self._drain.drain_once(limit=limit).as_dict()
|
|
511
|
-
|
|
512
|
-
def outbox_health(self) -> dict[str, Any]:
|
|
513
|
-
"""Queue depth and stalled count, for the status surfaces."""
|
|
514
|
-
health = projection_outbox.health(self._db)
|
|
515
|
-
health["draining"] = self._drain.running
|
|
516
|
-
return health
|
|
517
|
-
|
|
518
|
-
def stop(self) -> None:
|
|
519
|
-
"""Stop the drain worker. For daemon shutdown and for tests."""
|
|
520
|
-
self._drain.stop()
|
|
521
|
-
|
|
522
|
-
# ------------------------------------------------------------------
|
|
523
|
-
# Internal: Detection
|
|
524
|
-
# ------------------------------------------------------------------
|
|
525
|
-
|
|
526
|
-
def _detect_cozo(self) -> bool:
|
|
527
|
-
gb = getattr(self._config, "graph_backend", "auto") or "auto"
|
|
528
|
-
if gb == "sqlite":
|
|
529
|
-
return False
|
|
530
|
-
if gb in ("auto", "cozo"):
|
|
531
|
-
# find_spec only resolves the loader — never executes the module.
|
|
532
|
-
# Native pycozo import can spawn background runtimes; do not probe
|
|
533
|
-
# availability by importing (Python 3.14 GC race class).
|
|
534
|
-
return _module_spec_present("pycozo")
|
|
535
|
-
return False
|
|
536
|
-
|
|
537
|
-
def _detect_lancedb(self) -> bool:
|
|
538
|
-
vb = getattr(self._config, "vector_backend", "auto") or "auto"
|
|
539
|
-
if vb == "sqlite-vec":
|
|
540
|
-
return False
|
|
541
|
-
if vb in ("auto", "lancedb"):
|
|
542
|
-
# find_spec never executes the module. `import lancedb` starts
|
|
543
|
-
# LanceDBBackgroundEventLoop and segfaults under Python 3.14 GC
|
|
544
|
-
# when the full suite races cleanup — never import for a yes/no.
|
|
545
|
-
return _module_spec_present("lancedb")
|
|
546
|
-
return False
|
|
547
|
-
|
|
548
|
-
# ------------------------------------------------------------------
|
|
549
|
-
# Internal: Init
|
|
550
|
-
# ------------------------------------------------------------------
|
|
551
|
-
|
|
552
|
-
def _init_cozo(self) -> None:
|
|
553
|
-
try:
|
|
554
|
-
from superlocalmemory.graph.cozo_backend import CozoDBGraphBackend
|
|
555
|
-
cozo_path = self._data_dir / "cozo"
|
|
556
|
-
cozo_path.mkdir(parents=True, exist_ok=True)
|
|
557
|
-
self._cozo = CozoDBGraphBackend(str(cozo_path / "graph"))
|
|
558
|
-
self._update_status("cozo", "not_initialized")
|
|
559
|
-
logger.info("CozoDB initialized at %s", cozo_path)
|
|
560
|
-
except BaseException as exc:
|
|
561
|
-
# PyO3 exposes Rust panics as PanicException(BaseException), not
|
|
562
|
-
# Exception. An incompatible optional projection must never abort
|
|
563
|
-
# daemon startup or hide canonical SQLite memory. Re-raise genuine
|
|
564
|
-
# process-control exceptions; preserve the graph and degrade Cozo.
|
|
565
|
-
if not isinstance(exc, Exception) and type(exc).__name__ != "PanicException":
|
|
566
|
-
raise
|
|
567
|
-
logger.warning("CozoDB init failed: %s", exc)
|
|
568
|
-
self._cozo = None
|
|
569
|
-
|
|
570
|
-
def _init_lancedb(self) -> None:
|
|
571
|
-
try:
|
|
572
|
-
from superlocalmemory.vector.lancedb_backend import LanceDBVectorBackend
|
|
573
|
-
lance_path = self._data_dir / "lance"
|
|
574
|
-
# v3.7.6 (#72): honor the configured embedding width instead of the
|
|
575
|
-
# hardcoded 768d, so custom endpoints (e.g. 1024d Qwen3-Embedding) work.
|
|
576
|
-
dimension = getattr(
|
|
577
|
-
getattr(self._config, "embedding", None), "dimension", None
|
|
578
|
-
)
|
|
579
|
-
self._lancedb = LanceDBVectorBackend(str(lance_path), dimension=dimension)
|
|
580
|
-
self._update_status("lancedb", "not_initialized")
|
|
581
|
-
logger.info("LanceDB initialized at %s", lance_path)
|
|
582
|
-
except Exception as exc:
|
|
583
|
-
logger.warning("LanceDB init failed: %s", exc)
|
|
584
|
-
self._lancedb = None
|
|
585
|
-
|
|
586
|
-
# v3.7.9 (scale MEDIUM-2): _migrate_cozo/_migrate_lancedb were dead code —
|
|
587
|
-
# never called anywhere — and bypassed the staged prepare→verify→promote
|
|
588
|
-
# safety envelope (no fingerprint, no parity, no backup). Removed so a future
|
|
589
|
-
# caller cannot re-import outside the lifecycle. Emergency re-imports must go
|
|
590
|
-
# through the Scale Engine lifecycle.
|
|
591
|
-
|
|
592
|
-
# ------------------------------------------------------------------
|
|
593
|
-
# Internal: Status
|
|
594
|
-
# ------------------------------------------------------------------
|
|
595
|
-
|
|
596
|
-
def _cozo_status(self) -> str:
|
|
597
|
-
return self._backend_cache.get("cozo", "not_initialized")
|
|
598
|
-
|
|
599
|
-
def _lancedb_status(self) -> str:
|
|
600
|
-
return self._backend_cache.get("lancedb", "not_initialized")
|
|
601
|
-
|
|
602
|
-
def _update_status(self, name: str, status: str,
|
|
603
|
-
count: int = 0, error: str = "") -> None:
|
|
604
|
-
self._backend_cache[name] = status
|
|
605
|
-
try:
|
|
606
|
-
# #47 fix: DatabaseManager has no `.conn`; execute() commits itself.
|
|
607
|
-
self._db.execute(
|
|
608
|
-
"INSERT OR REPLACE INTO backend_status "
|
|
609
|
-
"(backend_name, status, record_count, error_message, last_sync_at) "
|
|
610
|
-
"VALUES (?, ?, ?, ?, datetime('now'))",
|
|
611
|
-
(name, status, count, error),
|
|
612
|
-
)
|
|
613
|
-
except Exception as exc:
|
|
614
|
-
logger.debug("backend_status update failed for %s: %s", name, exc)
|
|
615
|
-
|
|
616
|
-
# ------------------------------------------------------------------
|
|
617
|
-
# Internal: Schema
|
|
618
|
-
# ------------------------------------------------------------------
|
|
619
|
-
|
|
620
|
-
def _apply_schema_v345(self) -> None:
|
|
621
|
-
try:
|
|
622
|
-
from superlocalmemory.storage.schema_v345 import (
|
|
623
|
-
apply_migration,
|
|
624
|
-
schema_version_applied,
|
|
625
|
-
)
|
|
626
|
-
# #47 fix: use raw_connection() — DatabaseManager has no `.conn`,
|
|
627
|
-
# so the old code raised AttributeError that was silently swallowed,
|
|
628
|
-
# leaving the v3.4.5 migration (access_count_30d) permanently unapplied.
|
|
629
|
-
with self._db.raw_connection() as conn:
|
|
630
|
-
if not schema_version_applied(conn):
|
|
631
|
-
result = apply_migration(conn)
|
|
632
|
-
if result.get("errors"):
|
|
633
|
-
logger.warning("Schema v3.4.5 had errors: %s", result["errors"])
|
|
634
|
-
except ImportError:
|
|
635
|
-
logger.debug("schema_v345 not found — skipping")
|
|
636
|
-
except Exception as exc:
|
|
637
|
-
logger.warning("Schema v3.4.5 apply failed (non-fatal): %s", exc)
|