superlocalmemory 4.1.13 → 4.1.14
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 +48 -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,672 +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
|
-
"""Embedding migration on mode/model switch.
|
|
6
|
-
|
|
7
|
-
When a user switches modes (e.g., Mode B Ollama -> Mode A sentence-transformers),
|
|
8
|
-
the embeddings live in different vector spaces. This module detects the mismatch
|
|
9
|
-
and flags facts for progressive re-embedding.
|
|
10
|
-
|
|
11
|
-
Key table: ``embedding_metadata.model_name`` stores the model used for each fact.
|
|
12
|
-
A config-level field in ``config.json`` stores the current model signature.
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import hashlib
|
|
20
|
-
import itertools
|
|
21
|
-
import json
|
|
22
|
-
import logging
|
|
23
|
-
import os as _os
|
|
24
|
-
import sqlite3
|
|
25
|
-
import tempfile
|
|
26
|
-
import time
|
|
27
|
-
from pathlib import Path
|
|
28
|
-
from typing import TYPE_CHECKING, Any
|
|
29
|
-
|
|
30
|
-
import numpy as np
|
|
31
|
-
|
|
32
|
-
from superlocalmemory.storage.embedding_codec import encode_embedding
|
|
33
|
-
|
|
34
|
-
if TYPE_CHECKING:
|
|
35
|
-
from superlocalmemory.core.config import SLMConfig
|
|
36
|
-
|
|
37
|
-
logger = logging.getLogger(__name__)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class EmbeddingMigrationAborted(RuntimeError):
|
|
41
|
-
"""Raised when embedding migration aborts; old signature stays active.
|
|
42
|
-
|
|
43
|
-
Distinct from a no-op return of ``0`` (no embedder / no facts). Callers
|
|
44
|
-
must treat this as failure, not success.
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# ---------------------------------------------------------------------------
|
|
49
|
-
# Backfill constants
|
|
50
|
-
# ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
#: Default batch size for backfill_missing_embeddings.
|
|
53
|
-
_BACKFILL_BATCH_SIZE = 50
|
|
54
|
-
|
|
55
|
-
#: Cooperative yield between per-fact writes in backfill_missing_embeddings.
|
|
56
|
-
#: After every fact's UPDATE + INSERT pair, the write-back loop releases
|
|
57
|
-
#: db._lock for this many seconds, giving concurrent user writes a guaranteed
|
|
58
|
-
#: acquisition window. Tunable via SLM_SELFHEAL_WRITE_DELAY_S; set to 0 to
|
|
59
|
-
#: disable (only do this on single-user dev databases with no concurrency).
|
|
60
|
-
#: Default 5 ms is imperceptible for humans but visible to the OS scheduler.
|
|
61
|
-
_SELFHEAL_WRITE_DELAY_S: float = float(_os.environ.get("SLM_SELFHEAL_WRITE_DELAY_S", "0.005"))
|
|
62
|
-
|
|
63
|
-
#: Max characters embedded per fact during backfill. The embedding model
|
|
64
|
-
#: (nomic-embed-text-v1.5) truncates at ~8192 tokens anyway, but a raw
|
|
65
|
-
#: oversized document (observed up to 107 KB on a real DB) makes the shared
|
|
66
|
-
#: single-worker embedder busy for 15-20s on ONE fact — starving foreground
|
|
67
|
-
#: recall during a self-heal pass. Bounding the input keeps every fact's embed
|
|
68
|
-
#: fast and the worker responsive; the leading slice captures the fact's gist
|
|
69
|
-
#: for semantic recall. Facts this large are documents that were almost
|
|
70
|
-
#: certainly NULL because they failed to embed at ingestion for the same reason.
|
|
71
|
-
_MAX_EMBED_CHARS = 8000
|
|
72
|
-
|
|
73
|
-
# Sentinel stored in config.json when no model has been set yet.
|
|
74
|
-
_NO_MODEL = ""
|
|
75
|
-
|
|
76
|
-
# Batch size for progressive re-embedding.
|
|
77
|
-
_REINDEX_BATCH_SIZE = 50
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _activate_staged_vectors(
|
|
81
|
-
config: SLMConfig,
|
|
82
|
-
db: Any,
|
|
83
|
-
stage_path: Path,
|
|
84
|
-
expected_count: int,
|
|
85
|
-
) -> None:
|
|
86
|
-
"""Atomically replace canonical and sqlite-vec embeddings from a shadow DB."""
|
|
87
|
-
db_path = getattr(db, "db_path", None)
|
|
88
|
-
if not isinstance(db_path, (str, Path)):
|
|
89
|
-
raise RuntimeError("embedding migration requires an authoritative db_path")
|
|
90
|
-
|
|
91
|
-
import sqlite_vec
|
|
92
|
-
|
|
93
|
-
from superlocalmemory.storage.write_lock import get_write_lock
|
|
94
|
-
|
|
95
|
-
db_path = Path(db_path)
|
|
96
|
-
with get_write_lock(db_path), sqlite3.connect(stage_path) as stage:
|
|
97
|
-
conn = sqlite3.connect(db_path)
|
|
98
|
-
try:
|
|
99
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
100
|
-
conn.enable_load_extension(True)
|
|
101
|
-
sqlite_vec.load(conn)
|
|
102
|
-
conn.enable_load_extension(False)
|
|
103
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
104
|
-
canonical = conn.execute(
|
|
105
|
-
"SELECT fact_id, profile_id, content "
|
|
106
|
-
"FROM atomic_facts ORDER BY fact_id"
|
|
107
|
-
)
|
|
108
|
-
staged = stage.execute(
|
|
109
|
-
"SELECT fact_id, profile_id, content_hash "
|
|
110
|
-
"FROM staged_embeddings ORDER BY fact_id"
|
|
111
|
-
)
|
|
112
|
-
for current, shadow in itertools.zip_longest(canonical, staged):
|
|
113
|
-
if current is None or shadow is None:
|
|
114
|
-
raise RuntimeError("canonical fact set changed during migration")
|
|
115
|
-
current_key = (str(current[0]), str(current[1]))
|
|
116
|
-
shadow_key = (str(shadow[0]), str(shadow[1]))
|
|
117
|
-
current_hash = hashlib.sha256(str(current[2]).encode("utf-8")).hexdigest()
|
|
118
|
-
if current_key != shadow_key or current_hash != str(shadow[2]):
|
|
119
|
-
raise RuntimeError(
|
|
120
|
-
f"canonical fact changed during migration: {current_key[0]}"
|
|
121
|
-
)
|
|
122
|
-
conn.execute("DROP TABLE IF EXISTS embedding_metadata")
|
|
123
|
-
conn.execute("DROP TABLE IF EXISTS vector_row_map")
|
|
124
|
-
conn.execute("DROP TABLE IF EXISTS fact_embeddings")
|
|
125
|
-
conn.execute(
|
|
126
|
-
"CREATE VIRTUAL TABLE fact_embeddings USING vec0("
|
|
127
|
-
"profile_id TEXT PARTITION KEY, "
|
|
128
|
-
f"embedding float[{config.embedding.dimension}] distance_metric=cosine)"
|
|
129
|
-
)
|
|
130
|
-
conn.execute(
|
|
131
|
-
"CREATE TABLE embedding_metadata ("
|
|
132
|
-
"vec_rowid INTEGER PRIMARY KEY, fact_id TEXT NOT NULL UNIQUE, "
|
|
133
|
-
"profile_id TEXT NOT NULL DEFAULT 'default', "
|
|
134
|
-
"model_name TEXT NOT NULL DEFAULT '', "
|
|
135
|
-
"dimension INTEGER NOT NULL DEFAULT 768, "
|
|
136
|
-
"created_at TEXT NOT NULL DEFAULT (datetime('now')))"
|
|
137
|
-
)
|
|
138
|
-
conn.execute(
|
|
139
|
-
"CREATE INDEX idx_embmeta_fact ON embedding_metadata (fact_id)"
|
|
140
|
-
)
|
|
141
|
-
conn.execute(
|
|
142
|
-
"CREATE INDEX idx_embmeta_profile ON embedding_metadata (profile_id)"
|
|
143
|
-
)
|
|
144
|
-
conn.execute(
|
|
145
|
-
"CREATE TABLE vector_row_map ("
|
|
146
|
-
"fact_id TEXT NOT NULL PRIMARY KEY, profile_id TEXT NOT NULL, "
|
|
147
|
-
"vec_rowid INTEGER NOT NULL)"
|
|
148
|
-
)
|
|
149
|
-
conn.execute(
|
|
150
|
-
"CREATE INDEX idx_vector_row_map_profile "
|
|
151
|
-
"ON vector_row_map (profile_id)"
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
first_probe: tuple[bytes, str] | None = None
|
|
155
|
-
activated = 0
|
|
156
|
-
for rowid, (fact_id, profile_id, embedding_json) in enumerate(
|
|
157
|
-
stage.execute(
|
|
158
|
-
"SELECT fact_id, profile_id, embedding "
|
|
159
|
-
"FROM staged_embeddings ORDER BY fact_id"
|
|
160
|
-
),
|
|
161
|
-
start=1,
|
|
162
|
-
):
|
|
163
|
-
vector = json.loads(embedding_json)
|
|
164
|
-
vec_bytes = np.asarray(vector, dtype=np.float32).tobytes()
|
|
165
|
-
conn.execute(
|
|
166
|
-
"INSERT INTO fact_embeddings(rowid, profile_id, embedding) "
|
|
167
|
-
"VALUES (?, ?, ?)",
|
|
168
|
-
(rowid, profile_id, vec_bytes),
|
|
169
|
-
)
|
|
170
|
-
conn.execute(
|
|
171
|
-
"INSERT INTO embedding_metadata "
|
|
172
|
-
"(vec_rowid, fact_id, profile_id, model_name, dimension) "
|
|
173
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
174
|
-
(
|
|
175
|
-
rowid,
|
|
176
|
-
fact_id,
|
|
177
|
-
profile_id,
|
|
178
|
-
config.embedding.model_name,
|
|
179
|
-
config.embedding.dimension,
|
|
180
|
-
),
|
|
181
|
-
)
|
|
182
|
-
conn.execute(
|
|
183
|
-
"INSERT INTO vector_row_map (fact_id, profile_id, vec_rowid) "
|
|
184
|
-
"VALUES (?, ?, ?)",
|
|
185
|
-
(fact_id, profile_id, rowid),
|
|
186
|
-
)
|
|
187
|
-
updated = conn.execute(
|
|
188
|
-
"UPDATE atomic_facts SET embedding = ? "
|
|
189
|
-
"WHERE fact_id = ? AND profile_id = ?",
|
|
190
|
-
(encode_embedding(vector), fact_id, profile_id),
|
|
191
|
-
)
|
|
192
|
-
if updated.rowcount != 1:
|
|
193
|
-
raise RuntimeError(
|
|
194
|
-
f"canonical fact changed during migration: {fact_id}"
|
|
195
|
-
)
|
|
196
|
-
if first_probe is None:
|
|
197
|
-
first_probe = (vec_bytes, profile_id)
|
|
198
|
-
activated += 1
|
|
199
|
-
|
|
200
|
-
counts = [
|
|
201
|
-
int(conn.execute(f"SELECT COUNT(*) FROM {table}").fetchone()[0])
|
|
202
|
-
for table in (
|
|
203
|
-
"fact_embeddings",
|
|
204
|
-
"embedding_metadata",
|
|
205
|
-
"vector_row_map",
|
|
206
|
-
)
|
|
207
|
-
]
|
|
208
|
-
if activated != expected_count or any(c != expected_count for c in counts):
|
|
209
|
-
raise RuntimeError(
|
|
210
|
-
f"vector activation incomplete: activated={activated}, "
|
|
211
|
-
f"projection_counts={counts}, expected={expected_count}"
|
|
212
|
-
)
|
|
213
|
-
if first_probe is not None:
|
|
214
|
-
probe = conn.execute(
|
|
215
|
-
"SELECT rowid FROM fact_embeddings "
|
|
216
|
-
"WHERE embedding MATCH ? AND profile_id = ? AND k = 1",
|
|
217
|
-
(first_probe[0], first_probe[1]),
|
|
218
|
-
).fetchone()
|
|
219
|
-
if probe is None:
|
|
220
|
-
raise RuntimeError("post-activation KNN probe returned no row")
|
|
221
|
-
conn.commit()
|
|
222
|
-
except Exception:
|
|
223
|
-
conn.rollback()
|
|
224
|
-
raise
|
|
225
|
-
finally:
|
|
226
|
-
conn.close()
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
def _model_signature(config: SLMConfig) -> str:
|
|
230
|
-
"""Derive a deterministic signature from the active embedding config.
|
|
231
|
-
|
|
232
|
-
V3.3.4: Only model_name + dimension matter. Provider (sentence-transformers
|
|
233
|
-
vs ollama) doesn't change the embedding space when the model is the same.
|
|
234
|
-
This prevents spurious re-indexing when switching Mode A ↔ B.
|
|
235
|
-
"""
|
|
236
|
-
emb = config.embedding
|
|
237
|
-
return f"{emb.model_name}::{emb.dimension}"
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def _normalize_signature(signature: str) -> str:
|
|
241
|
-
"""Normalize a signature for equivalence comparison.
|
|
242
|
-
|
|
243
|
-
v3.8.2 self-healing: the SAME embedding model has been recorded under
|
|
244
|
-
different name strings across releases — notably the HuggingFace org
|
|
245
|
-
prefix drifted (``nomic-ai/nomic-embed-text-v1.5`` vs the bare
|
|
246
|
-
``nomic-embed-text-v1.5``). A prefix-only difference does NOT change the
|
|
247
|
-
embedding vector space, so it must not trigger a full multi-hour re-embed
|
|
248
|
-
when a non-technical user upgrades. This collapses the model name to its
|
|
249
|
-
basename (segment after the last ``/``) while keeping the ``::dimension``
|
|
250
|
-
suffix — a genuine model change (different basename OR dimension) still
|
|
251
|
-
differs and still triggers migration.
|
|
252
|
-
"""
|
|
253
|
-
model, sep, dim = signature.partition("::")
|
|
254
|
-
model = model.rsplit("/", 1)[-1].strip()
|
|
255
|
-
return f"{model}{sep}{dim}" if sep else model
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def _read_stored_signature(config_dir: Path) -> str:
|
|
259
|
-
"""Read the last-used embedding model signature from config.json."""
|
|
260
|
-
config_path = config_dir / "config.json"
|
|
261
|
-
if not config_path.exists():
|
|
262
|
-
return _NO_MODEL
|
|
263
|
-
try:
|
|
264
|
-
data = json.loads(config_path.read_text())
|
|
265
|
-
return data.get("embedding_signature", _NO_MODEL)
|
|
266
|
-
except (json.JSONDecodeError, OSError):
|
|
267
|
-
return _NO_MODEL
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
def _write_stored_signature(config_dir: Path, signature: str) -> None:
|
|
271
|
-
"""Persist the current embedding model signature to config.json."""
|
|
272
|
-
config_path = config_dir / "config.json"
|
|
273
|
-
data: dict[str, Any] = {}
|
|
274
|
-
if config_path.exists():
|
|
275
|
-
try:
|
|
276
|
-
data = json.loads(config_path.read_text())
|
|
277
|
-
except (json.JSONDecodeError, OSError):
|
|
278
|
-
pass
|
|
279
|
-
data["embedding_signature"] = signature
|
|
280
|
-
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
281
|
-
config_path.write_text(json.dumps(data, indent=2))
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
def check_embedding_migration(config: SLMConfig) -> bool:
|
|
285
|
-
"""Check if embedding model changed since last run.
|
|
286
|
-
|
|
287
|
-
Returns True if re-indexing is needed (model signature differs).
|
|
288
|
-
Returns False if signatures match or this is the first run.
|
|
289
|
-
"""
|
|
290
|
-
current_sig = _model_signature(config)
|
|
291
|
-
stored_sig = _read_stored_signature(config.base_dir)
|
|
292
|
-
|
|
293
|
-
if stored_sig == _NO_MODEL:
|
|
294
|
-
# First run — store signature, no migration needed.
|
|
295
|
-
_write_stored_signature(config.base_dir, current_sig)
|
|
296
|
-
logger.info("Embedding signature initialized: %s", current_sig)
|
|
297
|
-
return False
|
|
298
|
-
|
|
299
|
-
if stored_sig == current_sig:
|
|
300
|
-
return False
|
|
301
|
-
|
|
302
|
-
# v3.8.2 self-healing: a prefix-only model-name drift (e.g. the nomic-ai/
|
|
303
|
-
# org prefix appearing/disappearing between releases) is the SAME vector
|
|
304
|
-
# space — absorb the transition by refreshing the stored signature to the
|
|
305
|
-
# current form, with NO re-embed. This spares non-technical users a
|
|
306
|
-
# multi-hour full re-index on a cosmetic upgrade.
|
|
307
|
-
if _normalize_signature(stored_sig) == _normalize_signature(current_sig):
|
|
308
|
-
_write_stored_signature(config.base_dir, current_sig)
|
|
309
|
-
logger.info(
|
|
310
|
-
"Embedding signature normalized (no re-embed): %s ~= %s",
|
|
311
|
-
stored_sig,
|
|
312
|
-
current_sig,
|
|
313
|
-
)
|
|
314
|
-
return False
|
|
315
|
-
|
|
316
|
-
logger.warning(
|
|
317
|
-
"Embedding model changed: %s -> %s. Re-indexing required.",
|
|
318
|
-
stored_sig,
|
|
319
|
-
current_sig,
|
|
320
|
-
)
|
|
321
|
-
return True
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
def run_embedding_migration(
|
|
325
|
-
config: SLMConfig,
|
|
326
|
-
db: Any,
|
|
327
|
-
embedder: Any,
|
|
328
|
-
) -> int:
|
|
329
|
-
"""Stage and atomically activate embeddings for the current model.
|
|
330
|
-
|
|
331
|
-
Embedding is performed in bounded batches into a temporary shadow store.
|
|
332
|
-
Canonical rows are changed only after every target fact has a valid vector;
|
|
333
|
-
the activation itself runs in one database transaction. A failed batch,
|
|
334
|
-
malformed vector set, or database write therefore leaves both the old
|
|
335
|
-
embeddings and the old model signature active.
|
|
336
|
-
"""
|
|
337
|
-
if embedder is None:
|
|
338
|
-
logger.warning("No embedder available. Skipping re-indexing.")
|
|
339
|
-
return 0
|
|
340
|
-
|
|
341
|
-
current_sig = _model_signature(config)
|
|
342
|
-
# Embedding configuration is database-wide. Rebuild every profile so one
|
|
343
|
-
# vec0 table never contains vectors from mixed model spaces.
|
|
344
|
-
rows = db.execute(
|
|
345
|
-
"SELECT fact_id, profile_id, content FROM atomic_facts ORDER BY created_at",
|
|
346
|
-
)
|
|
347
|
-
facts = [
|
|
348
|
-
(dict(r)["fact_id"], dict(r)["profile_id"], dict(r)["content"])
|
|
349
|
-
for r in rows
|
|
350
|
-
]
|
|
351
|
-
total = len(facts)
|
|
352
|
-
|
|
353
|
-
if total == 0:
|
|
354
|
-
_write_stored_signature(config.base_dir, current_sig)
|
|
355
|
-
return 0
|
|
356
|
-
|
|
357
|
-
logger.info(
|
|
358
|
-
"Re-embedding %d facts with model %s (batch_size=%d)",
|
|
359
|
-
total,
|
|
360
|
-
current_sig,
|
|
361
|
-
_REINDEX_BATCH_SIZE,
|
|
362
|
-
)
|
|
363
|
-
|
|
364
|
-
config.base_dir.mkdir(parents=True, exist_ok=True)
|
|
365
|
-
try:
|
|
366
|
-
with tempfile.TemporaryDirectory(
|
|
367
|
-
prefix="embedding-migration-",
|
|
368
|
-
dir=config.base_dir,
|
|
369
|
-
) as stage_dir:
|
|
370
|
-
stage_path = Path(stage_dir) / "shadow.sqlite3"
|
|
371
|
-
with sqlite3.connect(stage_path) as stage:
|
|
372
|
-
stage.execute(
|
|
373
|
-
"CREATE TABLE staged_embeddings ("
|
|
374
|
-
"fact_id TEXT PRIMARY KEY, profile_id TEXT NOT NULL, "
|
|
375
|
-
"content_hash TEXT NOT NULL, embedding TEXT NOT NULL)"
|
|
376
|
-
)
|
|
377
|
-
for i in range(0, total, _REINDEX_BATCH_SIZE):
|
|
378
|
-
batch = facts[i : i + _REINDEX_BATCH_SIZE]
|
|
379
|
-
texts = [content for _, _, content in batch]
|
|
380
|
-
fact_ids = [fid for fid, _, _ in batch]
|
|
381
|
-
profile_ids = [pid for _, pid, _ in batch]
|
|
382
|
-
vectors = list(embedder.embed_batch(texts))
|
|
383
|
-
if len(vectors) != len(batch):
|
|
384
|
-
raise ValueError(
|
|
385
|
-
"embedder returned "
|
|
386
|
-
f"{len(vectors)} vectors for {len(batch)} facts"
|
|
387
|
-
)
|
|
388
|
-
staged_rows: list[tuple[str, str, str, str]] = []
|
|
389
|
-
for fid, profile_id, content, vec in zip(
|
|
390
|
-
fact_ids, profile_ids, texts, vectors, strict=True
|
|
391
|
-
):
|
|
392
|
-
if vec is None or len(vec) != config.embedding.dimension:
|
|
393
|
-
raise ValueError(
|
|
394
|
-
f"invalid embedding for fact {fid[:16]}: "
|
|
395
|
-
f"expected dimension {config.embedding.dimension}"
|
|
396
|
-
)
|
|
397
|
-
staged_rows.append(
|
|
398
|
-
(
|
|
399
|
-
fid,
|
|
400
|
-
profile_id,
|
|
401
|
-
hashlib.sha256(content.encode("utf-8")).hexdigest(),
|
|
402
|
-
json.dumps([float(value) for value in vec]),
|
|
403
|
-
)
|
|
404
|
-
)
|
|
405
|
-
stage.executemany(
|
|
406
|
-
"INSERT INTO staged_embeddings "
|
|
407
|
-
"(fact_id, profile_id, content_hash, embedding) "
|
|
408
|
-
"VALUES (?, ?, ?, ?)",
|
|
409
|
-
staged_rows,
|
|
410
|
-
)
|
|
411
|
-
stage.commit()
|
|
412
|
-
|
|
413
|
-
staged_count = int(
|
|
414
|
-
stage.execute("SELECT COUNT(*) FROM staged_embeddings").fetchone()[0]
|
|
415
|
-
)
|
|
416
|
-
if staged_count != total:
|
|
417
|
-
raise ValueError(
|
|
418
|
-
f"shadow migration incomplete: {staged_count}/{total} facts"
|
|
419
|
-
)
|
|
420
|
-
|
|
421
|
-
_activate_staged_vectors(config, db, stage_path, total)
|
|
422
|
-
except Exception as exc:
|
|
423
|
-
logger.error(
|
|
424
|
-
"Embedding migration aborted; previous embedding space remains active: %s",
|
|
425
|
-
exc,
|
|
426
|
-
)
|
|
427
|
-
# Do NOT write a new signature — old embedding space stays active.
|
|
428
|
-
# Raise so callers can distinguish abort from no-op (return 0).
|
|
429
|
-
raise EmbeddingMigrationAborted(
|
|
430
|
-
"Embedding migration aborted; previous embedding space remains "
|
|
431
|
-
f"active: {exc}"
|
|
432
|
-
) from exc
|
|
433
|
-
|
|
434
|
-
_write_stored_signature(config.base_dir, current_sig)
|
|
435
|
-
logger.info(
|
|
436
|
-
"Embedding migration complete: %d/%d facts re-embedded.",
|
|
437
|
-
total,
|
|
438
|
-
total,
|
|
439
|
-
)
|
|
440
|
-
return total
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
# ---------------------------------------------------------------------------
|
|
444
|
-
# Backfill: embed facts that were NEVER embedded (embedding IS NULL)
|
|
445
|
-
# ---------------------------------------------------------------------------
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
def _count_null_embeddings(
|
|
449
|
-
db: Any,
|
|
450
|
-
profile_id: str,
|
|
451
|
-
all_profiles: bool,
|
|
452
|
-
) -> int:
|
|
453
|
-
"""Return count of atomic_facts rows with NULL embedding."""
|
|
454
|
-
if all_profiles:
|
|
455
|
-
rows = db.execute(
|
|
456
|
-
"SELECT count(*) AS c FROM atomic_facts WHERE embedding IS NULL",
|
|
457
|
-
)
|
|
458
|
-
else:
|
|
459
|
-
rows = db.execute(
|
|
460
|
-
"SELECT count(*) AS c FROM atomic_facts WHERE embedding IS NULL AND profile_id = ?",
|
|
461
|
-
(profile_id,),
|
|
462
|
-
)
|
|
463
|
-
return int(rows[0]["c"]) if rows else 0
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
def backfill_missing_embeddings(
|
|
467
|
-
config: "SLMConfig",
|
|
468
|
-
db: Any,
|
|
469
|
-
embedder: Any,
|
|
470
|
-
batch_size: int = _BACKFILL_BATCH_SIZE,
|
|
471
|
-
limit: int | None = None,
|
|
472
|
-
all_profiles: bool = False,
|
|
473
|
-
) -> dict[str, int]:
|
|
474
|
-
"""Embed atomic_facts rows whose ``embedding`` column is NULL.
|
|
475
|
-
|
|
476
|
-
Unlike :func:`run_embedding_migration` (which re-embeds on model-signature
|
|
477
|
-
change), this function handles facts that were *never* embedded — for
|
|
478
|
-
example facts stored while the embedder was unavailable.
|
|
479
|
-
|
|
480
|
-
Resumable and idempotent: re-running after a partial run only processes
|
|
481
|
-
the remaining NULLs. Fail-open per-fact: a single bad fact logs a warning
|
|
482
|
-
and is skipped; the batch continues.
|
|
483
|
-
|
|
484
|
-
Writes mirror :func:`run_embedding_migration` exactly:
|
|
485
|
-
* ``atomic_facts.embedding`` ← ``json.dumps(vector)``
|
|
486
|
-
* sqlite-vec + ``embedding_metadata`` ← one atomic projection pair
|
|
487
|
-
|
|
488
|
-
Args:
|
|
489
|
-
config: Active SLMConfig (provides profile_id, model name, dimension).
|
|
490
|
-
db: DatabaseManager (or duck-compatible object with ``.execute()``).
|
|
491
|
-
embedder: Object implementing ``embed_batch(texts) -> list[vec|None]``
|
|
492
|
-
and (optionally) ``embed(text) -> vec|None``. Pass ``None`` to
|
|
493
|
-
make this a no-op (returns zero counts).
|
|
494
|
-
batch_size: Facts per embed_batch() call. Defaults to 50.
|
|
495
|
-
limit: Maximum facts to embed in this call. ``None`` means no cap —
|
|
496
|
-
all NULL-embedding facts are processed. Use a bounded limit for
|
|
497
|
-
the maintenance self-healing path so each pass is quick.
|
|
498
|
-
all_profiles: When ``True``, processes facts from every profile in the
|
|
499
|
-
database. When ``False`` (default), scopes to
|
|
500
|
-
``config.active_profile``.
|
|
501
|
-
|
|
502
|
-
Returns:
|
|
503
|
-
``{"scanned": int, "embedded": int, "remaining_null": int}``
|
|
504
|
-
|
|
505
|
-
*scanned*: total NULL-embedding facts found before applying *limit*.
|
|
506
|
-
*embedded*: facts successfully written in this call.
|
|
507
|
-
*remaining_null*: NULL count after the call (includes facts not yet
|
|
508
|
-
reached because of *limit*).
|
|
509
|
-
"""
|
|
510
|
-
profile_id = config.active_profile
|
|
511
|
-
|
|
512
|
-
if embedder is None:
|
|
513
|
-
logger.warning("backfill_missing_embeddings: no embedder available — skipping.")
|
|
514
|
-
return {"scanned": 0, "embedded": 0, "remaining_null": 0}
|
|
515
|
-
|
|
516
|
-
# ------------------------------------------------------------------
|
|
517
|
-
# 1. Fetch all NULL-embedding facts (cheap query; only reads IDs + content)
|
|
518
|
-
# ------------------------------------------------------------------
|
|
519
|
-
if all_profiles:
|
|
520
|
-
rows = db.execute(
|
|
521
|
-
"SELECT fact_id, content, profile_id FROM atomic_facts "
|
|
522
|
-
"WHERE embedding IS NULL ORDER BY created_at",
|
|
523
|
-
)
|
|
524
|
-
else:
|
|
525
|
-
rows = db.execute(
|
|
526
|
-
"SELECT fact_id, content, profile_id FROM atomic_facts "
|
|
527
|
-
"WHERE embedding IS NULL AND profile_id = ? ORDER BY created_at",
|
|
528
|
-
(profile_id,),
|
|
529
|
-
)
|
|
530
|
-
|
|
531
|
-
facts: list[tuple[str, str, str]] = [
|
|
532
|
-
(dict(r)["fact_id"], dict(r)["content"], dict(r)["profile_id"]) for r in rows
|
|
533
|
-
]
|
|
534
|
-
scanned = len(facts)
|
|
535
|
-
|
|
536
|
-
if scanned == 0:
|
|
537
|
-
return {"scanned": 0, "embedded": 0, "remaining_null": 0}
|
|
538
|
-
|
|
539
|
-
# Apply call-level limit (resumability: next call picks up where this left off)
|
|
540
|
-
if limit is not None:
|
|
541
|
-
facts = facts[:limit]
|
|
542
|
-
|
|
543
|
-
current_model = config.embedding.model_name
|
|
544
|
-
current_dim = config.embedding.dimension
|
|
545
|
-
embedded = 0
|
|
546
|
-
vector_store = None
|
|
547
|
-
try:
|
|
548
|
-
from superlocalmemory.retrieval.vector_store import (
|
|
549
|
-
VectorStore,
|
|
550
|
-
VectorStoreConfig,
|
|
551
|
-
)
|
|
552
|
-
|
|
553
|
-
db_path = getattr(db, "db_path", None)
|
|
554
|
-
if db_path is not None:
|
|
555
|
-
vector_store = VectorStore(
|
|
556
|
-
db_path,
|
|
557
|
-
VectorStoreConfig(
|
|
558
|
-
dimension=current_dim,
|
|
559
|
-
model_name=current_model,
|
|
560
|
-
),
|
|
561
|
-
)
|
|
562
|
-
except Exception as exc:
|
|
563
|
-
logger.debug("backfill: vector store unavailable: %s", exc)
|
|
564
|
-
|
|
565
|
-
# ------------------------------------------------------------------
|
|
566
|
-
# 2. Batch embed and write back
|
|
567
|
-
# ------------------------------------------------------------------
|
|
568
|
-
for batch_start in range(0, len(facts), batch_size):
|
|
569
|
-
batch = facts[batch_start : batch_start + batch_size]
|
|
570
|
-
# Bound per-fact input so an oversized document doesn't monopolize the
|
|
571
|
-
# shared embedding worker (starving foreground recall during self-heal).
|
|
572
|
-
texts = [(content or "")[:_MAX_EMBED_CHARS] for _, content, _ in batch]
|
|
573
|
-
fact_ids = [fid for fid, _, _ in batch]
|
|
574
|
-
prof_ids = [pid for _, _, pid in batch]
|
|
575
|
-
|
|
576
|
-
# Attempt batch embed; fall back to per-fact on batch failure. Mark the
|
|
577
|
-
# whole inference burst as background work so the shared embedding
|
|
578
|
-
# service yields between items if a recall begins after the daemon's
|
|
579
|
-
# initial in-flight check.
|
|
580
|
-
from superlocalmemory.core.recall_gate import background_work
|
|
581
|
-
|
|
582
|
-
with background_work():
|
|
583
|
-
try:
|
|
584
|
-
vectors: list[Any] = embedder.embed_batch(texts)
|
|
585
|
-
except Exception as exc:
|
|
586
|
-
logger.warning(
|
|
587
|
-
"backfill: batch embed failed for facts %d-%d: %s — retrying per-fact.",
|
|
588
|
-
batch_start,
|
|
589
|
-
batch_start + len(batch),
|
|
590
|
-
exc,
|
|
591
|
-
)
|
|
592
|
-
vectors = []
|
|
593
|
-
for text in texts:
|
|
594
|
-
try:
|
|
595
|
-
vec = embedder.embed(text)
|
|
596
|
-
vectors.append(vec)
|
|
597
|
-
except Exception as per_fact_exc:
|
|
598
|
-
logger.warning(
|
|
599
|
-
"backfill: per-fact embed failed for '%s...': %s",
|
|
600
|
-
text[:40],
|
|
601
|
-
per_fact_exc,
|
|
602
|
-
)
|
|
603
|
-
vectors.append(None)
|
|
604
|
-
|
|
605
|
-
# Write each successfully-embedded fact back to the DB.
|
|
606
|
-
for fid, vec, pid in zip(fact_ids, vectors, prof_ids):
|
|
607
|
-
if vec is None:
|
|
608
|
-
logger.warning("backfill: null vector for fact %s — skipping.", fid[:16])
|
|
609
|
-
continue
|
|
610
|
-
try:
|
|
611
|
-
embedding_blob = encode_embedding(vec)
|
|
612
|
-
# Metadata is not an independent record: it is the pointer to
|
|
613
|
-
# a sqlite-vec row. Creating it before the vector payload leaves
|
|
614
|
-
# semantic recall permanently blind while reporting success.
|
|
615
|
-
# VectorStore owns the atomic pair and repairs legacy orphans.
|
|
616
|
-
projection_written = False
|
|
617
|
-
if vector_store is not None and getattr(vector_store, "available", False):
|
|
618
|
-
projection_written = vector_store.upsert(
|
|
619
|
-
fid,
|
|
620
|
-
pid,
|
|
621
|
-
vec,
|
|
622
|
-
model_name=current_model,
|
|
623
|
-
)
|
|
624
|
-
if not projection_written:
|
|
625
|
-
# Keep the canonical embedding NULL so the next
|
|
626
|
-
# bounded self-heal pass retries this fact. The old
|
|
627
|
-
# order wrote JSON first, permanently removed the fact
|
|
628
|
-
# from the backfill query, and silently stranded recall
|
|
629
|
-
# without its sqlite-vec projection.
|
|
630
|
-
logger.warning(
|
|
631
|
-
"backfill: vector projection failed for fact %s; "
|
|
632
|
-
"leaving it pending for retry",
|
|
633
|
-
fid[:16],
|
|
634
|
-
)
|
|
635
|
-
continue
|
|
636
|
-
|
|
637
|
-
try:
|
|
638
|
-
# Publish the canonical JSON only after the derived vector
|
|
639
|
-
# projection is durable. When sqlite-vec is unavailable,
|
|
640
|
-
# this remains the supported JSON-only fallback path.
|
|
641
|
-
db.execute(
|
|
642
|
-
"UPDATE atomic_facts SET embedding = ? WHERE fact_id = ?",
|
|
643
|
-
(embedding_blob, fid),
|
|
644
|
-
)
|
|
645
|
-
except Exception:
|
|
646
|
-
if projection_written and vector_store is not None:
|
|
647
|
-
vector_store.delete(fid)
|
|
648
|
-
raise
|
|
649
|
-
embedded += 1
|
|
650
|
-
# Cooperative yield: release db._lock briefly so concurrent
|
|
651
|
-
# user writes can acquire it between facts. Without this,
|
|
652
|
-
# the write-back loop holds db._lock in rapid succession
|
|
653
|
-
# (Python RLock has no fairness guarantee), potentially
|
|
654
|
-
# starving user POST /remember writes for seconds on large DBs.
|
|
655
|
-
if _SELFHEAL_WRITE_DELAY_S > 0:
|
|
656
|
-
time.sleep(_SELFHEAL_WRITE_DELAY_S)
|
|
657
|
-
except Exception as exc:
|
|
658
|
-
logger.warning("backfill: failed to write fact %s: %s", fid[:16], exc)
|
|
659
|
-
|
|
660
|
-
# ------------------------------------------------------------------
|
|
661
|
-
# 3. Count remaining NULLs (accounts for the limit; tells caller how
|
|
662
|
-
# many passes remain before full convergence).
|
|
663
|
-
# ------------------------------------------------------------------
|
|
664
|
-
remaining = _count_null_embeddings(db, profile_id, all_profiles)
|
|
665
|
-
|
|
666
|
-
logger.info(
|
|
667
|
-
"Embedding backfill: %d/%d facts embedded, %d remaining NULL.",
|
|
668
|
-
embedded,
|
|
669
|
-
scanned,
|
|
670
|
-
remaining,
|
|
671
|
-
)
|
|
672
|
-
return {"scanned": scanned, "embedded": embedded, "remaining_null": remaining}
|