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,777 +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 — Background Math Maintenance.
|
|
6
|
-
|
|
7
|
-
Periodic batch processing for mathematical layers:
|
|
8
|
-
1. Langevin batch_step on all active facts (self-organization)
|
|
9
|
-
1a. Backfill: seed uninitialized facts with metadata-aware positions (B+C)
|
|
10
|
-
2. Sheaf batch consistency check on recent facts
|
|
11
|
-
3. Fisher adaptive temperature recalculation
|
|
12
|
-
|
|
13
|
-
Frequency: every 6-24h or after 100 stores.
|
|
14
|
-
~100 Langevin steps to stationarity.
|
|
15
|
-
|
|
16
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
17
|
-
License: AGPL-3.0-or-later
|
|
18
|
-
"""
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import logging
|
|
22
|
-
import math as _math
|
|
23
|
-
from datetime import UTC, datetime, timedelta
|
|
24
|
-
from typing import TYPE_CHECKING
|
|
25
|
-
|
|
26
|
-
import numpy as np
|
|
27
|
-
|
|
28
|
-
if TYPE_CHECKING:
|
|
29
|
-
from superlocalmemory.core.config import SLMConfig
|
|
30
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class _ConsolidationDisabled(Exception):
|
|
36
|
-
"""Internal signal: consolidation is switched off, so skip its block.
|
|
37
|
-
|
|
38
|
-
A private exception rather than restructuring the surrounding try/except:
|
|
39
|
-
the block's job is to keep one optional maintenance step from taking the
|
|
40
|
-
whole pass down with it, and that guarantee should not be weakened to
|
|
41
|
-
express "deliberately skipped". Caught immediately below, never propagated.
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
# Backfill constants
|
|
45
|
-
_BACKFILL_BURN_IN_STEPS = 50
|
|
46
|
-
_LANGEVIN_DIM = 8
|
|
47
|
-
_MAX_NORM = 0.99
|
|
48
|
-
|
|
49
|
-
# ELC zone vocabulary: EbbinghausCurve returns 'archive'/'forgotten' but
|
|
50
|
-
# atomic_facts.lifecycle CHECK only allows 'active|warm|cold|archived'.
|
|
51
|
-
# Remap at write boundary so ELC never triggers IntegrityError.
|
|
52
|
-
_VALID_LIFECYCLE_ZONES: frozenset[str] = frozenset({"active", "warm", "cold", "archived"})
|
|
53
|
-
_ELC_ZONE_REMAP: dict[str, str] = {"archive": "archived", "forgotten": "archived"}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _age_days(created_at: str | None) -> float:
|
|
57
|
-
"""Age in days from an ISO timestamp.
|
|
58
|
-
|
|
59
|
-
Naive timestamps (no offset, no Z) are assumed UTC — some store paths
|
|
60
|
-
persist created_at without timezone info, and subtracting a naive
|
|
61
|
-
datetime from datetime.now(UTC) raises TypeError, which previously
|
|
62
|
-
aborted the whole backfill loop.
|
|
63
|
-
"""
|
|
64
|
-
if not created_at:
|
|
65
|
-
return 0.0
|
|
66
|
-
try:
|
|
67
|
-
created = datetime.fromisoformat(created_at.replace("Z", "+00:00"))
|
|
68
|
-
except (ValueError, TypeError):
|
|
69
|
-
return 0.0
|
|
70
|
-
if created.tzinfo is None:
|
|
71
|
-
created = created.replace(tzinfo=UTC)
|
|
72
|
-
return max(0.0, (datetime.now(UTC) - created).total_seconds() / 86400.0)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _compute_equilibrium_radius(
|
|
76
|
-
access_count: int,
|
|
77
|
-
age_days: float,
|
|
78
|
-
importance: float,
|
|
79
|
-
temperature: float = 0.3,
|
|
80
|
-
dim: int = 8,
|
|
81
|
-
) -> float:
|
|
82
|
-
"""Compute metadata-aware equilibrium radius (Strategy B).
|
|
83
|
-
|
|
84
|
-
Uses the Langevin potential coefficients to estimate where a fact
|
|
85
|
-
would settle if it had been in the dynamics from the start.
|
|
86
|
-
|
|
87
|
-
r_eq ≈ sqrt(T * dim / (2 * effective_alpha))
|
|
88
|
-
"""
|
|
89
|
-
alpha, beta, gamma, delta = 3.0, 0.8, 0.005, 0.5
|
|
90
|
-
effective_alpha = (
|
|
91
|
-
alpha
|
|
92
|
-
+ beta * _math.log(access_count + 1) / 10.0
|
|
93
|
-
- gamma * min(age_days, 365.0) / 365.0
|
|
94
|
-
+ delta * importance
|
|
95
|
-
)
|
|
96
|
-
effective_alpha = max(0.1, effective_alpha)
|
|
97
|
-
r_eq = _math.sqrt(temperature * dim / (2.0 * effective_alpha))
|
|
98
|
-
return min(r_eq, _MAX_NORM * 0.95)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def _seed_langevin_position(
|
|
102
|
-
access_count: int,
|
|
103
|
-
age_days: float,
|
|
104
|
-
importance: float,
|
|
105
|
-
temperature: float = 0.3,
|
|
106
|
-
dim: int = 8,
|
|
107
|
-
) -> list[float]:
|
|
108
|
-
"""Create a metadata-aware initial position (Strategy B).
|
|
109
|
-
|
|
110
|
-
Places the fact at the equilibrium radius with a random direction.
|
|
111
|
-
"""
|
|
112
|
-
r_eq = _compute_equilibrium_radius(
|
|
113
|
-
access_count, age_days, importance, temperature, dim,
|
|
114
|
-
)
|
|
115
|
-
rng = np.random.default_rng()
|
|
116
|
-
direction = rng.standard_normal(dim)
|
|
117
|
-
norm = float(np.linalg.norm(direction))
|
|
118
|
-
if norm < 1e-8:
|
|
119
|
-
direction = np.ones(dim)
|
|
120
|
-
norm = float(np.linalg.norm(direction))
|
|
121
|
-
return (direction / norm * r_eq).tolist()
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def close_stale_sessions(
|
|
125
|
-
db: DatabaseManager,
|
|
126
|
-
profile_id: str = "default",
|
|
127
|
-
*,
|
|
128
|
-
idle_hours: float = 24.0,
|
|
129
|
-
max_per_pass: int = 50,
|
|
130
|
-
) -> int:
|
|
131
|
-
"""Close application sessions idle longer than ``idle_hours``.
|
|
132
|
-
|
|
133
|
-
Nothing auto-calls ``close_session`` except the MCP tool — un-closed
|
|
134
|
-
sessions never get temporal summaries. This maintenance pass finds
|
|
135
|
-
sessions whose newest fact is older than the idle window and closes
|
|
136
|
-
them via ``run_close_session``.
|
|
137
|
-
|
|
138
|
-
Properties:
|
|
139
|
-
- Idempotent: already-summarised sessions are skipped (no double write).
|
|
140
|
-
- Bounded: at most ``max_per_pass`` sessions closed per call.
|
|
141
|
-
- Only sessions with entity-linked facts (summarisable) are selected.
|
|
142
|
-
|
|
143
|
-
Returns:
|
|
144
|
-
Number of sessions successfully summarised in this pass.
|
|
145
|
-
"""
|
|
146
|
-
if idle_hours <= 0 or max_per_pass <= 0:
|
|
147
|
-
return 0
|
|
148
|
-
|
|
149
|
-
from superlocalmemory.core.store_pipeline import (
|
|
150
|
-
_session_already_summarised,
|
|
151
|
-
run_close_session,
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
cutoff = (datetime.now(UTC) - timedelta(hours=float(idle_hours))).isoformat()
|
|
155
|
-
# Over-fetch slightly so already-closed rows in the window do not starve
|
|
156
|
-
# the bounded close budget.
|
|
157
|
-
fetch_limit = max(int(max_per_pass) * 3, int(max_per_pass))
|
|
158
|
-
try:
|
|
159
|
-
rows = db.execute(
|
|
160
|
-
"""
|
|
161
|
-
SELECT session_id, MAX(created_at) AS last_at
|
|
162
|
-
FROM atomic_facts
|
|
163
|
-
WHERE profile_id = ?
|
|
164
|
-
AND session_id IS NOT NULL
|
|
165
|
-
AND session_id != ''
|
|
166
|
-
AND canonical_entities_json IS NOT NULL
|
|
167
|
-
AND canonical_entities_json != '[]'
|
|
168
|
-
GROUP BY session_id
|
|
169
|
-
HAVING MAX(created_at) < ?
|
|
170
|
-
ORDER BY last_at ASC
|
|
171
|
-
LIMIT ?
|
|
172
|
-
""",
|
|
173
|
-
(profile_id, cutoff, fetch_limit),
|
|
174
|
-
)
|
|
175
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
176
|
-
logger.debug("stale session query failed: %s", exc)
|
|
177
|
-
return 0
|
|
178
|
-
|
|
179
|
-
closed = 0
|
|
180
|
-
for row in rows:
|
|
181
|
-
if closed >= int(max_per_pass):
|
|
182
|
-
break
|
|
183
|
-
d = dict(row)
|
|
184
|
-
sid = str(d.get("session_id") or "")
|
|
185
|
-
if not sid:
|
|
186
|
-
continue
|
|
187
|
-
if _session_already_summarised(db, profile_id, sid):
|
|
188
|
-
continue
|
|
189
|
-
try:
|
|
190
|
-
n = run_close_session(sid, profile_id, db=db)
|
|
191
|
-
except Exception as exc:
|
|
192
|
-
logger.warning("stale session close failed for %s: %s", sid, exc)
|
|
193
|
-
continue
|
|
194
|
-
if n > 0:
|
|
195
|
-
closed += 1
|
|
196
|
-
if closed:
|
|
197
|
-
logger.info(
|
|
198
|
-
"Closed %d stale session(s) (idle > %.1fh, profile=%s)",
|
|
199
|
-
closed, idle_hours, profile_id,
|
|
200
|
-
)
|
|
201
|
-
return closed
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
def run_maintenance(
|
|
205
|
-
db: DatabaseManager,
|
|
206
|
-
config: SLMConfig,
|
|
207
|
-
profile_id: str = "default",
|
|
208
|
-
embedder: object | None = None,
|
|
209
|
-
) -> dict[str, int]:
|
|
210
|
-
"""Run background maintenance on mathematical layers.
|
|
211
|
-
|
|
212
|
-
Args:
|
|
213
|
-
db: Database manager.
|
|
214
|
-
config: Full SLM configuration.
|
|
215
|
-
profile_id: Scope to this profile.
|
|
216
|
-
embedder: Optional embedder for self-healing NULL-embedding backfill.
|
|
217
|
-
When provided and NULL embeddings exist, up to 100 facts are
|
|
218
|
-
embedded per maintenance pass so the DB converges over time.
|
|
219
|
-
Pass ``None`` (default) to skip the backfill — existing callers
|
|
220
|
-
are unaffected.
|
|
221
|
-
|
|
222
|
-
Returns:
|
|
223
|
-
Dict of counts: langevin_updated, sheaf_checked, etc.
|
|
224
|
-
"""
|
|
225
|
-
counts: dict[str, int] = {
|
|
226
|
-
"langevin_backfilled": 0,
|
|
227
|
-
"langevin_updated": 0,
|
|
228
|
-
"fisher_coupled": 0,
|
|
229
|
-
"fisher_posterior_updated": 0, # P1-9: Fisher bayesian_update on access
|
|
230
|
-
"ebbinghaus_coupled": 0, # Phase 5: Ebbinghaus-Langevin coupling
|
|
231
|
-
"sheaf_checked": 0,
|
|
232
|
-
"entity_summaries_consolidated": 0, # V3.4.40
|
|
233
|
-
"orphan_metadata_gc": 0, # v3.6.4 (P1-3)
|
|
234
|
-
"expansion_backfilled": 0, # T3b
|
|
235
|
-
"embeddings_backfilled": 0, # v3.8.x NULL-embedding self-heal
|
|
236
|
-
"stale_sessions_closed": 0, # v4: orphaned application sessions
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
# Close idle application sessions so temporal summaries exist even when
|
|
240
|
-
# clients never call close_session. Bounded + idempotent; fail-soft.
|
|
241
|
-
try:
|
|
242
|
-
idle_hours = float(getattr(config, "session_idle_close_hours", 24.0) or 24.0)
|
|
243
|
-
max_close = int(getattr(config, "session_idle_close_max_per_pass", 50) or 50)
|
|
244
|
-
counts["stale_sessions_closed"] = close_stale_sessions(
|
|
245
|
-
db,
|
|
246
|
-
profile_id,
|
|
247
|
-
idle_hours=idle_hours,
|
|
248
|
-
max_per_pass=max_close,
|
|
249
|
-
)
|
|
250
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
251
|
-
logger.debug("stale session close skipped: %s", exc)
|
|
252
|
-
|
|
253
|
-
# P1-3 (embeddings-vector-02): sweep orphaned embedding_metadata left by
|
|
254
|
-
# any FK-off delete path, so the semantic channel never maps to dead facts.
|
|
255
|
-
# Runs before the early-return so it sweeps even for empty profiles.
|
|
256
|
-
try:
|
|
257
|
-
counts["orphan_metadata_gc"] = db.gc_orphaned_embedding_metadata()
|
|
258
|
-
except Exception as exc: # pragma: no cover - defensive
|
|
259
|
-
logger.debug("orphan metadata GC skipped: %s", exc)
|
|
260
|
-
|
|
261
|
-
# v3.8.x: self-healing NULL-embedding backfill. Facts stored while the
|
|
262
|
-
# embedder was unavailable end up with NULL embedding and are invisible to
|
|
263
|
-
# semantic recall. When an embedder is available, embed up to 100 facts
|
|
264
|
-
# per maintenance pass so the DB converges without blocking the caller.
|
|
265
|
-
if embedder is not None:
|
|
266
|
-
try:
|
|
267
|
-
from superlocalmemory.storage.embedding_migrator import (
|
|
268
|
-
backfill_missing_embeddings,
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
# Guard: skip entirely when nothing needs backfilling.
|
|
272
|
-
null_rows = db.execute(
|
|
273
|
-
"SELECT count(*) AS c FROM atomic_facts "
|
|
274
|
-
"WHERE embedding IS NULL AND profile_id = ?",
|
|
275
|
-
(profile_id,),
|
|
276
|
-
)
|
|
277
|
-
null_count = int(null_rows[0]["c"]) if null_rows else 0
|
|
278
|
-
if null_count > 0:
|
|
279
|
-
result = backfill_missing_embeddings(
|
|
280
|
-
config,
|
|
281
|
-
db,
|
|
282
|
-
embedder,
|
|
283
|
-
batch_size=50,
|
|
284
|
-
limit=100,
|
|
285
|
-
)
|
|
286
|
-
counts["embeddings_backfilled"] = result["embedded"]
|
|
287
|
-
if result["embedded"] > 0:
|
|
288
|
-
logger.info(
|
|
289
|
-
"Maintenance embedding backfill: %d facts embedded, "
|
|
290
|
-
"%d remaining.",
|
|
291
|
-
result["embedded"],
|
|
292
|
-
result["remaining_null"],
|
|
293
|
-
)
|
|
294
|
-
except Exception as exc:
|
|
295
|
-
logger.debug("embedding backfill skipped during maintenance: %s", exc)
|
|
296
|
-
|
|
297
|
-
facts = db.get_all_facts(profile_id)
|
|
298
|
-
if not facts:
|
|
299
|
-
return counts
|
|
300
|
-
|
|
301
|
-
# T3b: backfill fact-expansion alt-keys (Mode A, entity-alias based) for
|
|
302
|
-
# facts stored before expansion existed. Bounded per run + skips already-
|
|
303
|
-
# populated and entity-less facts, so it converges without re-work churn.
|
|
304
|
-
try:
|
|
305
|
-
from superlocalmemory.core.key_expander import KeyExpander
|
|
306
|
-
populated = {
|
|
307
|
-
dict(r)["fact_id"]
|
|
308
|
-
for r in db.execute("SELECT DISTINCT fact_id FROM fact_expansion_fts")
|
|
309
|
-
}
|
|
310
|
-
expander = KeyExpander(db)
|
|
311
|
-
for f in facts:
|
|
312
|
-
if counts["expansion_backfilled"] >= 500:
|
|
313
|
-
break
|
|
314
|
-
if f.fact_id in populated or not f.canonical_entities:
|
|
315
|
-
continue
|
|
316
|
-
alt = expander.expand(f, profile_id, mode="a")
|
|
317
|
-
if alt:
|
|
318
|
-
db.upsert_fact_expansion(f.fact_id, alt)
|
|
319
|
-
counts["expansion_backfilled"] += 1
|
|
320
|
-
except Exception as exc: # pragma: no cover — legacy DB / missing FTS
|
|
321
|
-
logger.debug("expansion backfill skipped: %s", exc)
|
|
322
|
-
|
|
323
|
-
# 1a. Backfill: seed uninitialized facts with metadata-aware positions (B+C)
|
|
324
|
-
if config.math.langevin_persist_positions:
|
|
325
|
-
try:
|
|
326
|
-
from superlocalmemory.math.langevin import LangevinDynamics
|
|
327
|
-
|
|
328
|
-
ld = LangevinDynamics(
|
|
329
|
-
dim=_LANGEVIN_DIM,
|
|
330
|
-
dt=config.math.langevin_dt,
|
|
331
|
-
temperature=config.math.langevin_temperature,
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
backfilled = 0
|
|
335
|
-
for f in facts:
|
|
336
|
-
if f.langevin_position is not None:
|
|
337
|
-
continue
|
|
338
|
-
age_days = _age_days(f.created_at)
|
|
339
|
-
# Strategy B: metadata-aware seed position
|
|
340
|
-
position = _seed_langevin_position(
|
|
341
|
-
f.access_count, age_days, f.importance,
|
|
342
|
-
config.math.langevin_temperature, _LANGEVIN_DIM,
|
|
343
|
-
)
|
|
344
|
-
# Strategy C: burn-in from the seeded position
|
|
345
|
-
for step_i in range(_BACKFILL_BURN_IN_STEPS):
|
|
346
|
-
position, _ = ld.step(
|
|
347
|
-
position, f.access_count, age_days, f.importance,
|
|
348
|
-
)
|
|
349
|
-
weight = ld.compute_lifecycle_weight(position)
|
|
350
|
-
lifecycle = ld.get_lifecycle_state(weight).value
|
|
351
|
-
db.update_fact(f.fact_id, {
|
|
352
|
-
"langevin_position": position,
|
|
353
|
-
"lifecycle": lifecycle,
|
|
354
|
-
})
|
|
355
|
-
f.langevin_position = position # update in-memory for step 1b
|
|
356
|
-
backfilled += 1
|
|
357
|
-
|
|
358
|
-
counts["langevin_backfilled"] = backfilled
|
|
359
|
-
if backfilled:
|
|
360
|
-
logger.info("Langevin backfill: %d facts initialized", backfilled)
|
|
361
|
-
except Exception as exc:
|
|
362
|
-
logger.warning("Langevin backfill failed: %s", exc)
|
|
363
|
-
|
|
364
|
-
# 1b. Langevin batch step on all positioned facts
|
|
365
|
-
if config.math.langevin_persist_positions:
|
|
366
|
-
try:
|
|
367
|
-
from superlocalmemory.math.langevin import LangevinDynamics
|
|
368
|
-
|
|
369
|
-
ld = LangevinDynamics(
|
|
370
|
-
dim=_LANGEVIN_DIM,
|
|
371
|
-
dt=config.math.langevin_dt,
|
|
372
|
-
temperature=config.math.langevin_temperature,
|
|
373
|
-
)
|
|
374
|
-
fact_dicts = []
|
|
375
|
-
for f in facts:
|
|
376
|
-
if f.langevin_position is None:
|
|
377
|
-
continue
|
|
378
|
-
age_days = _age_days(f.created_at)
|
|
379
|
-
fact_dicts.append({
|
|
380
|
-
"fact_id": f.fact_id,
|
|
381
|
-
"position": f.langevin_position,
|
|
382
|
-
"access_count": f.access_count,
|
|
383
|
-
"age_days": age_days,
|
|
384
|
-
"importance": f.importance,
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
if fact_dicts:
|
|
388
|
-
results = ld.batch_step(fact_dicts)
|
|
389
|
-
for r in results:
|
|
390
|
-
db.update_fact(r["fact_id"], {
|
|
391
|
-
"langevin_position": r["position"],
|
|
392
|
-
"lifecycle": r["lifecycle"],
|
|
393
|
-
})
|
|
394
|
-
counts["langevin_updated"] = len(results)
|
|
395
|
-
except Exception as exc:
|
|
396
|
-
logger.warning("Langevin maintenance failed: %s", exc)
|
|
397
|
-
|
|
398
|
-
# 1b. Fisher-Langevin coupling: modulate temperature per-fact
|
|
399
|
-
# High Fisher confidence (low variance) -> low temperature -> memory stabilizes
|
|
400
|
-
# Low Fisher confidence (high variance) -> high temperature -> memory fades
|
|
401
|
-
if config.math.langevin_persist_positions and counts["langevin_updated"] > 0:
|
|
402
|
-
try:
|
|
403
|
-
from superlocalmemory.dynamics.fisher_langevin_coupling import (
|
|
404
|
-
FisherLangevinCoupling,
|
|
405
|
-
)
|
|
406
|
-
|
|
407
|
-
coupling = FisherLangevinCoupling(
|
|
408
|
-
base_temperature=config.math.langevin_temperature,
|
|
409
|
-
)
|
|
410
|
-
coupled_count = 0
|
|
411
|
-
|
|
412
|
-
for f in facts:
|
|
413
|
-
if f.langevin_position is None or f.fisher_variance is None:
|
|
414
|
-
continue
|
|
415
|
-
eff_temp = coupling.get_effective_temperature(
|
|
416
|
-
f.fisher_variance, f.access_count,
|
|
417
|
-
)
|
|
418
|
-
# Re-run Langevin step with Fisher-coupled temperature
|
|
419
|
-
# only if it differs meaningfully from the base temperature
|
|
420
|
-
if abs(eff_temp - config.math.langevin_temperature) > 0.01:
|
|
421
|
-
from superlocalmemory.math.langevin import LangevinDynamics
|
|
422
|
-
|
|
423
|
-
coupled_ld = LangevinDynamics(
|
|
424
|
-
dim=8,
|
|
425
|
-
dt=config.math.langevin_dt,
|
|
426
|
-
temperature=eff_temp,
|
|
427
|
-
)
|
|
428
|
-
age_days = _age_days(f.created_at)
|
|
429
|
-
new_pos, weight = coupled_ld.step(
|
|
430
|
-
position=f.langevin_position,
|
|
431
|
-
access_count=f.access_count,
|
|
432
|
-
age_days=age_days,
|
|
433
|
-
importance=f.importance,
|
|
434
|
-
)
|
|
435
|
-
lifecycle = coupled_ld.get_lifecycle_state(weight).value
|
|
436
|
-
db.update_fact(f.fact_id, {
|
|
437
|
-
"langevin_position": new_pos,
|
|
438
|
-
"lifecycle": lifecycle,
|
|
439
|
-
})
|
|
440
|
-
coupled_count += 1
|
|
441
|
-
|
|
442
|
-
counts["fisher_coupled"] = coupled_count
|
|
443
|
-
except Exception as exc:
|
|
444
|
-
logger.warning("Fisher-Langevin coupling failed: %s", exc)
|
|
445
|
-
|
|
446
|
-
# 1c. Fisher posterior update (P1-9): tighten variance per new access event.
|
|
447
|
-
# Access-delta semantics: apply one Bayesian update per net-new access since
|
|
448
|
-
# the last maintenance run. Zero new accesses → variance unchanged.
|
|
449
|
-
# This prevents idle-corpus drift that tick-based updates would cause.
|
|
450
|
-
# Inline schema migration: adds fisher_last_applied_access when absent.
|
|
451
|
-
# Gate: config.math.fisher_bayesian_update (default True).
|
|
452
|
-
if config.math.fisher_bayesian_update:
|
|
453
|
-
try:
|
|
454
|
-
import json as _json
|
|
455
|
-
from superlocalmemory.math.fisher import FisherRaoMetric
|
|
456
|
-
|
|
457
|
-
# Inline migration — harmless no-op if column already exists.
|
|
458
|
-
try:
|
|
459
|
-
db.execute(
|
|
460
|
-
"ALTER TABLE atomic_facts "
|
|
461
|
-
"ADD COLUMN fisher_last_applied_access INTEGER NOT NULL DEFAULT 0"
|
|
462
|
-
)
|
|
463
|
-
except Exception:
|
|
464
|
-
pass # already migrated on a previous run
|
|
465
|
-
|
|
466
|
-
frm = FisherRaoMetric(temperature=config.math.fisher_temperature)
|
|
467
|
-
posterior_count = 0
|
|
468
|
-
for f in facts:
|
|
469
|
-
if f.fisher_variance is None:
|
|
470
|
-
continue
|
|
471
|
-
rows = db.execute(
|
|
472
|
-
"SELECT access_count, fisher_last_applied_access "
|
|
473
|
-
"FROM atomic_facts WHERE fact_id = ?",
|
|
474
|
-
(f.fact_id,),
|
|
475
|
-
)
|
|
476
|
-
if not rows:
|
|
477
|
-
continue
|
|
478
|
-
r = dict(rows[0])
|
|
479
|
-
acc = r.get("access_count") or 0
|
|
480
|
-
last_applied = r.get("fisher_last_applied_access") or 0
|
|
481
|
-
delta = acc - last_applied
|
|
482
|
-
if delta <= 0:
|
|
483
|
-
continue # no new accesses — variance unchanged this run
|
|
484
|
-
# Apply min(delta, 100) unit-information Bayesian updates.
|
|
485
|
-
# One update per access: 1/v_new = 1/v_old + 1 (unit obs_var).
|
|
486
|
-
current_var = list(f.fisher_variance)
|
|
487
|
-
dim = len(current_var)
|
|
488
|
-
obs_var = [1.0] * dim
|
|
489
|
-
applied = min(delta, 100)
|
|
490
|
-
for _ in range(applied):
|
|
491
|
-
current_var = frm.bayesian_update(current_var, obs_var)
|
|
492
|
-
# Single atomic write: variance + watermark together. Advance the
|
|
493
|
-
# watermark only by the number of updates ACTUALLY applied (not to
|
|
494
|
-
# acc), so accesses beyond the per-run cap are applied on subsequent
|
|
495
|
-
# runs instead of being silently dropped.
|
|
496
|
-
db.execute(
|
|
497
|
-
"UPDATE atomic_facts "
|
|
498
|
-
"SET fisher_variance = ?, fisher_last_applied_access = ? "
|
|
499
|
-
"WHERE fact_id = ?",
|
|
500
|
-
(_json.dumps(current_var), last_applied + applied, f.fact_id),
|
|
501
|
-
)
|
|
502
|
-
# Refresh in-memory so step 1d ELC sees the updated variance.
|
|
503
|
-
f.fisher_variance = current_var
|
|
504
|
-
posterior_count += 1
|
|
505
|
-
counts["fisher_posterior_updated"] = posterior_count
|
|
506
|
-
except Exception as exc:
|
|
507
|
-
logger.warning("Fisher posterior update failed: %s", exc)
|
|
508
|
-
|
|
509
|
-
# 1d. Ebbinghaus-Langevin coupling (Phase 5 — P1-ELC): combine forgetting
|
|
510
|
-
# drift with Fisher-Langevin dynamics to produce a unified lifecycle state.
|
|
511
|
-
# Updates the lifecycle zone of each fact based on Ebbinghaus retention.
|
|
512
|
-
# NOTE: this step overwrites the Langevin-only lifecycle set in step 1b.
|
|
513
|
-
# The Ebbinghaus zone is intentionally authoritative when ELC is ON.
|
|
514
|
-
# Gate: config.math.ebbinghaus_langevin_coupling_enabled (default False).
|
|
515
|
-
if config.math.ebbinghaus_langevin_coupling_enabled:
|
|
516
|
-
try:
|
|
517
|
-
from superlocalmemory.dynamics.ebbinghaus_langevin_coupling import (
|
|
518
|
-
EbbinghausLangevinCoupling,
|
|
519
|
-
)
|
|
520
|
-
from superlocalmemory.dynamics.fisher_langevin_coupling import (
|
|
521
|
-
FisherLangevinCoupling,
|
|
522
|
-
)
|
|
523
|
-
from superlocalmemory.math.ebbinghaus import EbbinghausCurve
|
|
524
|
-
from superlocalmemory.math.langevin import LangevinDynamics
|
|
525
|
-
|
|
526
|
-
ebbinghaus = EbbinghausCurve(config.forgetting)
|
|
527
|
-
langevin = LangevinDynamics(
|
|
528
|
-
dim=_LANGEVIN_DIM,
|
|
529
|
-
dt=config.math.langevin_dt,
|
|
530
|
-
temperature=config.math.langevin_temperature,
|
|
531
|
-
)
|
|
532
|
-
fisher_coupling = FisherLangevinCoupling(
|
|
533
|
-
base_temperature=config.math.langevin_temperature,
|
|
534
|
-
)
|
|
535
|
-
coupling = EbbinghausLangevinCoupling(
|
|
536
|
-
ebbinghaus, langevin, fisher_coupling, config.forgetting,
|
|
537
|
-
)
|
|
538
|
-
import numpy as np
|
|
539
|
-
|
|
540
|
-
# Build fact_id → last_accessed_at lookup from fact_retention.
|
|
541
|
-
# Using real last-access time (not created_at) so hot facts are not
|
|
542
|
-
# mis-classified as forgotten due to old creation timestamps.
|
|
543
|
-
if facts:
|
|
544
|
-
retention_rows = db.execute(
|
|
545
|
-
"SELECT fact_id, last_accessed_at FROM fact_retention "
|
|
546
|
-
"WHERE fact_id IN ({})".format(",".join("?" * len(facts))),
|
|
547
|
-
tuple(f.fact_id for f in facts),
|
|
548
|
-
)
|
|
549
|
-
else:
|
|
550
|
-
retention_rows = []
|
|
551
|
-
last_accessed_map: dict[str, str | None] = {
|
|
552
|
-
dict(r)["fact_id"]: dict(r)["last_accessed_at"]
|
|
553
|
-
for r in retention_rows
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
elc_count = 0
|
|
557
|
-
for f in facts:
|
|
558
|
-
if f.fisher_variance is None or f.langevin_position is None:
|
|
559
|
-
continue
|
|
560
|
-
# Prefer real last-access timestamp; fall back to created_at.
|
|
561
|
-
raw_ts = last_accessed_map.get(f.fact_id) or f.created_at
|
|
562
|
-
hours_since = _age_days(raw_ts) * 24.0
|
|
563
|
-
state = coupling.compute_coupled_state(
|
|
564
|
-
fact_id=f.fact_id,
|
|
565
|
-
fisher_variance=np.asarray(f.fisher_variance, dtype=np.float64),
|
|
566
|
-
langevin_radius=float(np.linalg.norm(f.langevin_position)),
|
|
567
|
-
access_count=f.access_count,
|
|
568
|
-
importance=f.importance,
|
|
569
|
-
confirmation_count=f.evidence_count,
|
|
570
|
-
emotional_salience=0.0,
|
|
571
|
-
hours_since_last_access=hours_since,
|
|
572
|
-
)
|
|
573
|
-
# Remap ELC zone vocabulary to atomic_facts CHECK constraint.
|
|
574
|
-
# EbbinghausCurve returns 'archive'/'forgotten'; schema only allows
|
|
575
|
-
# 'active|warm|cold|archived'.
|
|
576
|
-
zone = _ELC_ZONE_REMAP.get(state.lifecycle_zone, state.lifecycle_zone)
|
|
577
|
-
if zone not in _VALID_LIFECYCLE_ZONES:
|
|
578
|
-
logger.warning(
|
|
579
|
-
"ELC returned unknown lifecycle zone %r for fact %s — skipping",
|
|
580
|
-
state.lifecycle_zone, f.fact_id,
|
|
581
|
-
)
|
|
582
|
-
continue
|
|
583
|
-
# Count fact as processed regardless of whether we write.
|
|
584
|
-
elc_count += 1
|
|
585
|
-
# Skip write when zone hasn't changed — avoids O(N) UPDATEs per tick.
|
|
586
|
-
current_zone = (
|
|
587
|
-
f.lifecycle.value
|
|
588
|
-
if hasattr(f.lifecycle, "value")
|
|
589
|
-
else str(f.lifecycle)
|
|
590
|
-
)
|
|
591
|
-
if zone == current_zone:
|
|
592
|
-
continue
|
|
593
|
-
db.update_fact(f.fact_id, {"lifecycle": zone})
|
|
594
|
-
counts["ebbinghaus_coupled"] = elc_count
|
|
595
|
-
except Exception as exc:
|
|
596
|
-
logger.warning("Ebbinghaus-Langevin coupling failed: %s", exc)
|
|
597
|
-
|
|
598
|
-
# 2. Sheaf batch consistency on recent facts (last 24h)
|
|
599
|
-
if config.math.sheaf_at_encoding:
|
|
600
|
-
try:
|
|
601
|
-
from superlocalmemory.math.sheaf import SheafConsistencyChecker
|
|
602
|
-
|
|
603
|
-
checker = SheafConsistencyChecker(
|
|
604
|
-
db, config.math.sheaf_contradiction_threshold,
|
|
605
|
-
)
|
|
606
|
-
cutoff = (datetime.now(UTC) - timedelta(hours=24)).isoformat()
|
|
607
|
-
recent = [f for f in facts if f.created_at and f.created_at >= cutoff]
|
|
608
|
-
for f in recent:
|
|
609
|
-
if f.embedding and f.canonical_entities:
|
|
610
|
-
checker.check_consistency(f, profile_id)
|
|
611
|
-
counts["sheaf_checked"] += 1
|
|
612
|
-
except Exception as exc:
|
|
613
|
-
logger.warning("Sheaf maintenance failed: %s", exc)
|
|
614
|
-
|
|
615
|
-
# 3. V3.4.40: Entity summary consolidation
|
|
616
|
-
# Re-bound any entity_profiles whose knowledge_summary exceeded the cap
|
|
617
|
-
# (e.g. created before V3.4.40, or via a code path that bypassed the
|
|
618
|
-
# bounded _build_summary). Truncates in-place — keeps entity identity,
|
|
619
|
-
# drops bloat. Future writes go through ObservationBuilder.SUMMARY_*
|
|
620
|
-
# bounds and stay clean.
|
|
621
|
-
try:
|
|
622
|
-
consolidated = db.execute(
|
|
623
|
-
"""
|
|
624
|
-
UPDATE entity_profiles
|
|
625
|
-
SET knowledge_summary = SUBSTR(knowledge_summary, 1, 2047) || '…',
|
|
626
|
-
last_updated = datetime('now')
|
|
627
|
-
WHERE LENGTH(knowledge_summary) > 2048
|
|
628
|
-
AND profile_id = ?
|
|
629
|
-
""",
|
|
630
|
-
(profile_id,),
|
|
631
|
-
)
|
|
632
|
-
# SQLite doesn't return rowcount via execute() wrapper consistently.
|
|
633
|
-
# Re-count instead — fast on the small subset.
|
|
634
|
-
rows = db.execute(
|
|
635
|
-
"SELECT COUNT(*) AS c FROM entity_profiles "
|
|
636
|
-
"WHERE LENGTH(knowledge_summary) > 2048 AND profile_id = ?",
|
|
637
|
-
(profile_id,),
|
|
638
|
-
)
|
|
639
|
-
# If any remain >2048 after the UPDATE, log it. Otherwise count
|
|
640
|
-
# how many were truncated by diffing against the prior pass.
|
|
641
|
-
# (Best-effort; non-fatal.)
|
|
642
|
-
if rows:
|
|
643
|
-
remaining = dict(rows[0]).get("c", 0)
|
|
644
|
-
counts["entity_summaries_consolidated"] = max(
|
|
645
|
-
0, counts.get("entity_summaries_consolidated", 0)
|
|
646
|
-
) - remaining
|
|
647
|
-
except Exception as exc:
|
|
648
|
-
logger.warning("Entity summary consolidation failed: %s", exc)
|
|
649
|
-
|
|
650
|
-
# 4. Fact consolidation (v3.8.4 concurrency-safe path via DatabaseManager).
|
|
651
|
-
# Groups warm/cold atomic facts that share an entity and writes ONE
|
|
652
|
-
# DISPLAY summary per cluster into consolidated_summaries, with provenance
|
|
653
|
-
# in fact_consolidations. It does not write to atomic_facts and does not
|
|
654
|
-
# archive the source facts — until 4.0.10 it did both, which put 1,195
|
|
655
|
-
# model-written rows into the retrieval corpus and left 528 genuine
|
|
656
|
-
# memories archived out of normal recall.
|
|
657
|
-
#
|
|
658
|
-
# Uses the DatabaseManager path so LLM calls happen OUTSIDE the write lock:
|
|
659
|
-
# - Discover clusters in a short memory_read() (no write lock held).
|
|
660
|
-
# - Generate summary OUTSIDE any lock (Ollama/Cloud may take 30s).
|
|
661
|
-
# - Write per-cluster inside a short memory_write() (lock held for SQL only).
|
|
662
|
-
#
|
|
663
|
-
# NOT on the recall/store hot path. Runs as part of background maintenance.
|
|
664
|
-
counts["facts_consolidated"] = 0
|
|
665
|
-
try:
|
|
666
|
-
from superlocalmemory.core.fact_consolidator import consolidate_facts
|
|
667
|
-
|
|
668
|
-
# The documented off-switch has to actually switch something off.
|
|
669
|
-
# ConsolidationConfig.enabled has existed since Phase 5 and this call
|
|
670
|
-
# site never read it, so a user who ran `slm config` to turn
|
|
671
|
-
# consolidation off got consolidation anyway — for four months, on
|
|
672
|
-
# every maintenance pass. -2 is a third distinguishable value, kept
|
|
673
|
-
# apart from 0 (nothing to merge) and -1 (the step failed), so a
|
|
674
|
-
# deliberately disabled step is never mistaken for either.
|
|
675
|
-
_consolidation = getattr(config, "consolidation", None)
|
|
676
|
-
if _consolidation is not None and not getattr(_consolidation, "enabled", True):
|
|
677
|
-
counts["facts_consolidated"] = -2
|
|
678
|
-
logger.debug("Fact consolidation disabled by configuration")
|
|
679
|
-
raise _ConsolidationDisabled
|
|
680
|
-
|
|
681
|
-
fc_stats = consolidate_facts(
|
|
682
|
-
db,
|
|
683
|
-
profile_id=profile_id,
|
|
684
|
-
# Read from ConsolidationConfig, with the old SLMConfig-level name
|
|
685
|
-
# as the fallback. `getattr(config, "max_consolidation_clusters")`
|
|
686
|
-
# alone never resolved — SLMConfig has no such attribute — so the
|
|
687
|
-
# default was the only value this had ever used.
|
|
688
|
-
max_clusters=int(
|
|
689
|
-
getattr(_consolidation, "max_consolidation_clusters", None)
|
|
690
|
-
or getattr(config, "max_consolidation_clusters", None)
|
|
691
|
-
or 20
|
|
692
|
-
),
|
|
693
|
-
dry_run=False,
|
|
694
|
-
config=config,
|
|
695
|
-
)
|
|
696
|
-
counts["facts_consolidated"] = fc_stats.get("consolidated", 0)
|
|
697
|
-
if fc_stats.get("consolidated", 0) > 0:
|
|
698
|
-
logger.info(
|
|
699
|
-
"Fact consolidation: %d display summaries over %d facts "
|
|
700
|
-
"(%d clusters refused)",
|
|
701
|
-
fc_stats.get("consolidated", 0),
|
|
702
|
-
fc_stats.get("facts_summarized", 0),
|
|
703
|
-
fc_stats.get("rejected", 0),
|
|
704
|
-
)
|
|
705
|
-
except _ConsolidationDisabled:
|
|
706
|
-
pass
|
|
707
|
-
except Exception as exc:
|
|
708
|
-
# WARNING, not debug, and a distinguishable count. Leaving this at debug
|
|
709
|
-
# with facts_consolidated=0 made a failing consolidation report exactly
|
|
710
|
-
# the same numbers as a healthy run with nothing to merge, so a step that
|
|
711
|
-
# never worked would look like a step with no work to do — and nobody
|
|
712
|
-
# would ever see it in normal logs.
|
|
713
|
-
counts["facts_consolidated"] = -1
|
|
714
|
-
logger.warning(
|
|
715
|
-
"Fact consolidation FAILED during maintenance (reported as -1, "
|
|
716
|
-
"which is distinct from 0 = nothing to merge): %s", exc,
|
|
717
|
-
)
|
|
718
|
-
|
|
719
|
-
# 5. Code↔memory bridge (4.0.7).
|
|
720
|
-
# Resolves code entity mentions in new facts against the code graph and
|
|
721
|
-
# stores the links, plus derived enrichment text, in code_graph.db.
|
|
722
|
-
#
|
|
723
|
-
# RUNS HERE, NOT ON THE WRITE PATH. The bridge was authored to fire from
|
|
724
|
-
# BridgeEventListeners.on_memory_stored, and EventBus._notify_listeners
|
|
725
|
-
# dispatches synchronously on the emitting thread — which would have put
|
|
726
|
-
# entity resolution and enrichment inside every remember. The owner's
|
|
727
|
-
# constraint for 4.0.7 is that remember/recall timing must not move, so the
|
|
728
|
-
# memory-stored subscription is gone and the work happens in this pass.
|
|
729
|
-
# tests/test_code_graph/test_bridge_off_write_path.py fails if it comes back.
|
|
730
|
-
#
|
|
731
|
-
# Writes only code_graph.db, which no recall path opens, so this step cannot
|
|
732
|
-
# affect recall latency or results. Hebbian edges are the one exception and
|
|
733
|
-
# are NOT run here — they land in association_edges, which spreading
|
|
734
|
-
# activation reads; they are generated on explicit request instead.
|
|
735
|
-
counts["bridge_links"] = 0
|
|
736
|
-
counts["bridge_enriched"] = 0
|
|
737
|
-
try:
|
|
738
|
-
from superlocalmemory.code_graph.config import CodeGraphConfig
|
|
739
|
-
|
|
740
|
-
cg_cfg = CodeGraphConfig.load()
|
|
741
|
-
if cg_cfg.enabled and cg_cfg.bridge_enabled:
|
|
742
|
-
from superlocalmemory.code_graph.bridge.maintenance import run_bridge_pass
|
|
743
|
-
from superlocalmemory.code_graph.database import CodeGraphDatabase
|
|
744
|
-
|
|
745
|
-
cg_path = cg_cfg.get_db_path()
|
|
746
|
-
if cg_path.exists():
|
|
747
|
-
bridge_stats = run_bridge_pass(
|
|
748
|
-
db, CodeGraphDatabase(cg_path), profile_id,
|
|
749
|
-
)
|
|
750
|
-
counts["bridge_links"] = bridge_stats.get("links_created", 0)
|
|
751
|
-
counts["bridge_enriched"] = bridge_stats.get("enriched", 0)
|
|
752
|
-
except Exception as exc:
|
|
753
|
-
# -1 rather than 0, for the same reason fact consolidation uses it:
|
|
754
|
-
# a step that never worked must not report the same numbers as a
|
|
755
|
-
# healthy step with no work to do.
|
|
756
|
-
counts["bridge_links"] = -1
|
|
757
|
-
logger.warning(
|
|
758
|
-
"Code bridge pass FAILED during maintenance (reported as -1, "
|
|
759
|
-
"which is distinct from 0 = nothing to link): %s", exc,
|
|
760
|
-
)
|
|
761
|
-
|
|
762
|
-
logger.info(
|
|
763
|
-
"Maintenance complete: %d backfilled, %d Langevin, %d Fisher-coupled, "
|
|
764
|
-
"%d Sheaf, %d entity-summaries, %d facts-consolidated, %d code-links",
|
|
765
|
-
counts["langevin_backfilled"], counts["langevin_updated"],
|
|
766
|
-
counts["fisher_coupled"], counts["sheaf_checked"],
|
|
767
|
-
counts["entity_summaries_consolidated"],
|
|
768
|
-
counts["facts_consolidated"],
|
|
769
|
-
counts["bridge_links"],
|
|
770
|
-
)
|
|
771
|
-
return counts
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
# The bridge gate reads code_graph_config.json via CodeGraphConfig.load(), not
|
|
775
|
-
# SLMConfig: SLMConfig has no code_graph block, so there is nothing to read
|
|
776
|
-
# there. cli/setup_wizard.py writes that file; before 4.0.7 no loader existed
|
|
777
|
-
# and every call site hardcoded CodeGraphConfig(enabled=True) instead.
|