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,507 +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 Maintenance Scheduler.
|
|
6
|
-
|
|
7
|
-
V3.3.13: Periodically triggers Langevin/Ebbinghaus/Sheaf maintenance
|
|
8
|
-
so users don't need to call run_maintenance manually.
|
|
9
|
-
|
|
10
|
-
Configurable interval via ForgettingConfig.scheduler_interval_minutes.
|
|
11
|
-
Defaults to 30 min. Optional forgetting/math work follows
|
|
12
|
-
``config.forgetting.enabled``; tier evaluation and bounded housekeeping do not.
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
License: AGPL-3.0-or-later
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import logging
|
|
21
|
-
import threading
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
|
-
|
|
24
|
-
if TYPE_CHECKING:
|
|
25
|
-
from superlocalmemory.core.config import SLMConfig
|
|
26
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class MaintenanceScheduler:
|
|
32
|
-
"""Background scheduler for periodic math maintenance.
|
|
33
|
-
|
|
34
|
-
Runs Langevin/Sheaf/Fisher maintenance at configurable intervals.
|
|
35
|
-
Thread-safe. Auto-stops on garbage collection or explicit stop().
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
def __init__(
|
|
39
|
-
self,
|
|
40
|
-
db: DatabaseManager,
|
|
41
|
-
config: SLMConfig,
|
|
42
|
-
profile_id: str = "default",
|
|
43
|
-
embedder: object | None = None,
|
|
44
|
-
) -> None:
|
|
45
|
-
self._db = db
|
|
46
|
-
self._config = config
|
|
47
|
-
self._profile_id = profile_id
|
|
48
|
-
# v3.8.2 self-heal: when provided, periodic maintenance backfills
|
|
49
|
-
# NULL embeddings so a DB stays fully queryable over time even if
|
|
50
|
-
# facts were stored while the embedder was unavailable. Runs
|
|
51
|
-
# independently of forgetting.enabled (see _run).
|
|
52
|
-
self._embedder = embedder
|
|
53
|
-
self._timer: threading.Timer | None = None
|
|
54
|
-
self._running = False
|
|
55
|
-
self._interval = config.forgetting.scheduler_interval_minutes * 60.0
|
|
56
|
-
|
|
57
|
-
def start(self) -> None:
|
|
58
|
-
"""Start the periodic scheduler. Idempotent."""
|
|
59
|
-
if self._running:
|
|
60
|
-
return
|
|
61
|
-
self._running = True
|
|
62
|
-
self._schedule_next()
|
|
63
|
-
# v3.8.5: one-shot activation-cache GC ~90s after boot so an upgrade
|
|
64
|
-
# backlog (observed 83k expired rows) clears promptly instead of waiting
|
|
65
|
-
# a full interval — delayed past boot warmup so it never competes for
|
|
66
|
-
# the write lock during the startup window.
|
|
67
|
-
self._initial_gc_timer = threading.Timer(90.0, self._initial_cache_gc)
|
|
68
|
-
self._initial_gc_timer.daemon = True
|
|
69
|
-
self._initial_gc_timer.start()
|
|
70
|
-
# An upgrade arrives with whatever backlog the previous version left.
|
|
71
|
-
# Waiting a full interval for the first graph-metrics pass would mean
|
|
72
|
-
# half an hour of ranking memories as though they had no position in the
|
|
73
|
-
# graph, on exactly the store that just gained the fix. Staggered behind
|
|
74
|
-
# the cache GC so the two never contend for the write lock.
|
|
75
|
-
self._initial_metrics_timer = threading.Timer(
|
|
76
|
-
150.0, self._initial_graph_metrics,
|
|
77
|
-
)
|
|
78
|
-
self._initial_metrics_timer.daemon = True
|
|
79
|
-
self._initial_metrics_timer.start()
|
|
80
|
-
# M048's re-read pass is idempotent and safe to replay (see its
|
|
81
|
-
# verify() docstring), but the migration runner never replays a
|
|
82
|
-
# completed migration and the cycle above only reaches it every
|
|
83
|
-
# ``scheduler_interval_minutes`` (360 by default). A store that
|
|
84
|
-
# drifted since the last cycle stays blocking — ready=false,
|
|
85
|
-
# migrations=false — for up to that whole interval after every
|
|
86
|
-
# restart, not because the fix is slow, but because nothing asks
|
|
87
|
-
# for it sooner. Staggered behind the other two so none of the
|
|
88
|
-
# three one-shots contend for the write lock.
|
|
89
|
-
self._initial_reclassify_timer = threading.Timer(
|
|
90
|
-
210.0, self._initial_reclassify_upcoming,
|
|
91
|
-
)
|
|
92
|
-
self._initial_reclassify_timer.daemon = True
|
|
93
|
-
self._initial_reclassify_timer.start()
|
|
94
|
-
logger.info(
|
|
95
|
-
"Maintenance scheduler started (interval=%dm)",
|
|
96
|
-
self._config.forgetting.scheduler_interval_minutes,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
def _initial_reclassify_upcoming(self) -> None:
|
|
100
|
-
"""Best-effort one-shot M048 re-read shortly after boot.
|
|
101
|
-
|
|
102
|
-
Runs the same pass the periodic cycle already runs (see below) so a
|
|
103
|
-
store that drifted before this restart converges within seconds
|
|
104
|
-
instead of waiting up to a full maintenance interval with the
|
|
105
|
-
daemon reporting itself not ready.
|
|
106
|
-
"""
|
|
107
|
-
if not self._running:
|
|
108
|
-
return
|
|
109
|
-
try:
|
|
110
|
-
from superlocalmemory.storage.migrations import (
|
|
111
|
-
M048_upcoming_holds_only_what_is_upcoming as _reclassify,
|
|
112
|
-
)
|
|
113
|
-
_reclassify.apply(open_connection=self._db.raw_connection)
|
|
114
|
-
except Exception as exc:
|
|
115
|
-
logger.debug("Startup plan re-read skipped: %s", exc)
|
|
116
|
-
|
|
117
|
-
def _initial_cache_gc(self) -> None:
|
|
118
|
-
"""Best-effort one-shot activation-cache GC shortly after boot."""
|
|
119
|
-
if not self._running:
|
|
120
|
-
return
|
|
121
|
-
try:
|
|
122
|
-
deleted = self._db.cleanup_activation_cache()
|
|
123
|
-
if deleted > 0:
|
|
124
|
-
logger.info(
|
|
125
|
-
"Activation-cache GC (startup): %d expired rows removed",
|
|
126
|
-
deleted,
|
|
127
|
-
)
|
|
128
|
-
except Exception as exc:
|
|
129
|
-
logger.debug("Startup activation-cache GC skipped: %s", exc)
|
|
130
|
-
|
|
131
|
-
def _initial_graph_metrics(self) -> None:
|
|
132
|
-
"""One-shot catch-up so an upgrade does not rank on stale metrics."""
|
|
133
|
-
if not self._running:
|
|
134
|
-
return
|
|
135
|
-
try:
|
|
136
|
-
from superlocalmemory.core.graph_metrics import (
|
|
137
|
-
compute_graph_metrics,
|
|
138
|
-
metrics_are_stale,
|
|
139
|
-
)
|
|
140
|
-
for profile_id in self._profile_ids():
|
|
141
|
-
stale, why = metrics_are_stale(self._db, profile_id)
|
|
142
|
-
if not stale:
|
|
143
|
-
continue
|
|
144
|
-
report = compute_graph_metrics(self._db, profile_id)
|
|
145
|
-
if report.ok:
|
|
146
|
-
logger.info(
|
|
147
|
-
"Graph metrics at startup (%s): %s", why, report.summary(),
|
|
148
|
-
)
|
|
149
|
-
else:
|
|
150
|
-
logger.warning("Graph metrics at startup: %s", report.summary())
|
|
151
|
-
except Exception as exc:
|
|
152
|
-
logger.debug("Startup graph metrics skipped: %s", exc)
|
|
153
|
-
|
|
154
|
-
def stop(self) -> None:
|
|
155
|
-
"""Stop the scheduler. Idempotent."""
|
|
156
|
-
self._running = False
|
|
157
|
-
if self._timer is not None:
|
|
158
|
-
self._timer.cancel()
|
|
159
|
-
self._timer = None
|
|
160
|
-
_gc_timer = getattr(self, "_initial_gc_timer", None)
|
|
161
|
-
if _gc_timer is not None:
|
|
162
|
-
_gc_timer.cancel()
|
|
163
|
-
self._initial_gc_timer = None
|
|
164
|
-
_metrics_timer = getattr(self, "_initial_metrics_timer", None)
|
|
165
|
-
if _metrics_timer is not None:
|
|
166
|
-
_metrics_timer.cancel()
|
|
167
|
-
self._initial_metrics_timer = None
|
|
168
|
-
_reclassify_timer = getattr(self, "_initial_reclassify_timer", None)
|
|
169
|
-
if _reclassify_timer is not None:
|
|
170
|
-
_reclassify_timer.cancel()
|
|
171
|
-
self._initial_reclassify_timer = None
|
|
172
|
-
logger.info("Maintenance scheduler stopped")
|
|
173
|
-
|
|
174
|
-
def _schedule_next(self) -> None:
|
|
175
|
-
"""Schedule the next maintenance run."""
|
|
176
|
-
if not self._running:
|
|
177
|
-
return
|
|
178
|
-
self._timer = threading.Timer(self._interval, self._run)
|
|
179
|
-
self._timer.daemon = True
|
|
180
|
-
self._timer.start()
|
|
181
|
-
|
|
182
|
-
#: Consecutive failures of one step before it stops being a hiccup.
|
|
183
|
-
_ESCALATE_AFTER = 3
|
|
184
|
-
|
|
185
|
-
def _record_step(self, step: str, ok: bool, detail: str = "") -> None:
|
|
186
|
-
"""Remember whether a maintenance step worked, and say so when it has
|
|
187
|
-
stopped working."""
|
|
188
|
-
counts = getattr(self, "_step_failures", None)
|
|
189
|
-
if counts is None:
|
|
190
|
-
counts = self._step_failures = {}
|
|
191
|
-
if ok:
|
|
192
|
-
if counts.pop(step, 0):
|
|
193
|
-
logger.info("maintenance: %s is working again", step)
|
|
194
|
-
return
|
|
195
|
-
counts[step] = counts.get(step, 0) + 1
|
|
196
|
-
if counts[step] >= self._ESCALATE_AFTER:
|
|
197
|
-
logger.error(
|
|
198
|
-
"maintenance: %s has failed %d cycles in a row (%s). This is "
|
|
199
|
-
"not a transient failure; the work it does is not being done.",
|
|
200
|
-
step, counts[step], detail or "no detail",
|
|
201
|
-
)
|
|
202
|
-
else:
|
|
203
|
-
logger.warning("maintenance: %s failed (%s)", step, detail or "")
|
|
204
|
-
|
|
205
|
-
def failing_steps(self) -> dict[str, int]:
|
|
206
|
-
"""Steps that have failed on consecutive cycles, and how many.
|
|
207
|
-
|
|
208
|
-
Read by the status surfaces, so an operator can see a persistently
|
|
209
|
-
broken maintenance step instead of having to find it in the log.
|
|
210
|
-
"""
|
|
211
|
-
return dict(getattr(self, "_step_failures", {}) or {})
|
|
212
|
-
|
|
213
|
-
def _note_step_outcomes(self) -> None:
|
|
214
|
-
"""Escalate anything still failing after this cycle's steps."""
|
|
215
|
-
failing = self.failing_steps()
|
|
216
|
-
if failing:
|
|
217
|
-
logger.warning(
|
|
218
|
-
"maintenance: %d step(s) still failing: %s",
|
|
219
|
-
len(failing),
|
|
220
|
-
", ".join(f"{name} x{count}" for name, count in sorted(failing.items())),
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
def _run(self) -> None:
|
|
224
|
-
"""Execute maintenance + auto-backup check, then schedule next run."""
|
|
225
|
-
if not self._running:
|
|
226
|
-
return
|
|
227
|
-
# v3.8.2 self-heal: bounded NULL-embedding backfill runs every cycle
|
|
228
|
-
# INDEPENDENTLY of forgetting.enabled and across ALL profiles — a fact
|
|
229
|
-
# stored while the embedder was down must become queryable again without
|
|
230
|
-
# the user touching anything. Idempotent + bounded (200/pass) so it
|
|
231
|
-
# converges quietly and is a no-op once coverage is complete.
|
|
232
|
-
if self._embedder is not None:
|
|
233
|
-
try:
|
|
234
|
-
from superlocalmemory.storage.embedding_migrator import (
|
|
235
|
-
backfill_missing_embeddings,
|
|
236
|
-
)
|
|
237
|
-
r = backfill_missing_embeddings(
|
|
238
|
-
self._config, self._db, self._embedder,
|
|
239
|
-
limit=50, all_profiles=True,
|
|
240
|
-
)
|
|
241
|
-
if r.get("embedded"):
|
|
242
|
-
logger.info(
|
|
243
|
-
"Self-heal backfill: %d embedded, %d remaining",
|
|
244
|
-
r["embedded"], r["remaining_null"],
|
|
245
|
-
)
|
|
246
|
-
except Exception as exc:
|
|
247
|
-
logger.debug("Self-heal backfill skipped: %s", exc)
|
|
248
|
-
|
|
249
|
-
for profile_id in self._profile_ids():
|
|
250
|
-
if self._config.forgetting.enabled:
|
|
251
|
-
try:
|
|
252
|
-
from superlocalmemory.core.maintenance import run_maintenance
|
|
253
|
-
counts = run_maintenance(self._db, self._config, profile_id)
|
|
254
|
-
logger.info(
|
|
255
|
-
"Scheduled maintenance complete for %s: %s",
|
|
256
|
-
profile_id,
|
|
257
|
-
counts,
|
|
258
|
-
)
|
|
259
|
-
except Exception as exc:
|
|
260
|
-
logger.warning(
|
|
261
|
-
"Scheduled maintenance failed for %s: %s",
|
|
262
|
-
profile_id,
|
|
263
|
-
exc,
|
|
264
|
-
)
|
|
265
|
-
|
|
266
|
-
# V3.4.11: Graph pruning (remove orphan edges)
|
|
267
|
-
# v3.8.4-G: thread GraphPruningConfig params so dashboard changes
|
|
268
|
-
# persist and take effect without a daemon restart.
|
|
269
|
-
try:
|
|
270
|
-
from superlocalmemory.core.graph_pruner import prune_graph
|
|
271
|
-
gp = self._config.graph_pruning
|
|
272
|
-
if not gp.enabled:
|
|
273
|
-
logger.debug(
|
|
274
|
-
"Graph pruning disabled by config for %s — skipping",
|
|
275
|
-
profile_id,
|
|
276
|
-
)
|
|
277
|
-
else:
|
|
278
|
-
# Fix A: pass DatabaseManager directly → writes serialised through _lock
|
|
279
|
-
prune_stats = prune_graph(
|
|
280
|
-
self._db,
|
|
281
|
-
profile_id,
|
|
282
|
-
max_degree=gp.max_degree_per_node,
|
|
283
|
-
min_edge_weight=gp.min_edge_weight,
|
|
284
|
-
)
|
|
285
|
-
removed = prune_stats["total_before"] - prune_stats["total_after"]
|
|
286
|
-
if removed > 0:
|
|
287
|
-
logger.info(
|
|
288
|
-
"Graph pruning for %s: %d edges removed", profile_id, removed
|
|
289
|
-
)
|
|
290
|
-
except AttributeError:
|
|
291
|
-
# Older SLMConfig without graph_pruning field (upgrade safety)
|
|
292
|
-
from superlocalmemory.core.graph_pruner import prune_graph
|
|
293
|
-
prune_stats = prune_graph(self._db, profile_id)
|
|
294
|
-
removed = prune_stats["total_before"] - prune_stats["total_after"]
|
|
295
|
-
if removed > 0:
|
|
296
|
-
logger.info("Graph pruning for %s: %d edges removed", profile_id, removed)
|
|
297
|
-
except Exception as exc:
|
|
298
|
-
logger.debug("Graph pruning skipped for %s: %s", profile_id, exc)
|
|
299
|
-
|
|
300
|
-
# Pruning the graph orphans the lineage of every edge it removed,
|
|
301
|
-
# and nothing had ever deleted from that table — on a real store it
|
|
302
|
-
# had grown to 39% rows describing edges that no longer existed.
|
|
303
|
-
# This runs immediately after so the rows the pass just orphaned are
|
|
304
|
-
# collected in the same pass.
|
|
305
|
-
try:
|
|
306
|
-
from superlocalmemory.storage.lineage_retention import (
|
|
307
|
-
prune_orphan_lineage,
|
|
308
|
-
)
|
|
309
|
-
report = prune_orphan_lineage(self._db, profile_id=profile_id)
|
|
310
|
-
if report.total:
|
|
311
|
-
logger.info(
|
|
312
|
-
"Lineage retention for %s: %d row(s) removed (%s)",
|
|
313
|
-
profile_id, report.total, report.deleted,
|
|
314
|
-
)
|
|
315
|
-
except Exception as exc:
|
|
316
|
-
logger.debug("Lineage retention skipped for %s: %s", profile_id, exc)
|
|
317
|
-
|
|
318
|
-
# Structural metrics. Recall multiplies a candidate's activation by
|
|
319
|
-
# its PageRank at every hop and biases it toward its query seeds'
|
|
320
|
-
# communities, and both numbers live in fact_importance -- so a
|
|
321
|
-
# memory missing from that table is found by the walk and then
|
|
322
|
-
# ranked as though it had no position in the graph.
|
|
323
|
-
#
|
|
324
|
-
# Nothing scheduled this. It ran only when a consolidation happened
|
|
325
|
-
# to fire or someone called the HTTP endpoint by hand, and on the
|
|
326
|
-
# author's store that meant one run in nine days: 1,036 of 4,034
|
|
327
|
-
# visible memories had no score and no community, and the newest
|
|
328
|
-
# four days of memories had none at all. This runs after pruning so
|
|
329
|
-
# it describes the graph that pruning left behind.
|
|
330
|
-
try:
|
|
331
|
-
from superlocalmemory.core.graph_metrics import (
|
|
332
|
-
compute_graph_metrics,
|
|
333
|
-
metrics_are_stale,
|
|
334
|
-
)
|
|
335
|
-
stale, why = metrics_are_stale(self._db, profile_id)
|
|
336
|
-
if stale:
|
|
337
|
-
backend = None
|
|
338
|
-
try:
|
|
339
|
-
from superlocalmemory.core.backend_orchestrator import (
|
|
340
|
-
get_orchestrator,
|
|
341
|
-
)
|
|
342
|
-
orchestrator = get_orchestrator()
|
|
343
|
-
if orchestrator is not None:
|
|
344
|
-
backend = orchestrator.get_graph_backend()
|
|
345
|
-
except Exception: # noqa: BLE001 -- in-process is the default anyway
|
|
346
|
-
backend = None
|
|
347
|
-
report = compute_graph_metrics(
|
|
348
|
-
self._db, profile_id, backend=backend,
|
|
349
|
-
)
|
|
350
|
-
if report.ok:
|
|
351
|
-
logger.info("Graph metrics (%s): %s", why, report.summary())
|
|
352
|
-
else:
|
|
353
|
-
logger.warning("Graph metrics: %s", report.summary())
|
|
354
|
-
else:
|
|
355
|
-
logger.debug("Graph metrics up to date for %s", profile_id)
|
|
356
|
-
self._record_step("graph metrics", True)
|
|
357
|
-
except Exception as exc: # noqa: BLE001
|
|
358
|
-
self._record_step("graph metrics", False, str(exc))
|
|
359
|
-
|
|
360
|
-
# Lifecycle evaluation must cover every stored profile, not only
|
|
361
|
-
# whichever profile was active when the engine started.
|
|
362
|
-
try:
|
|
363
|
-
from superlocalmemory.core.tier_manager import evaluate_tiers
|
|
364
|
-
stats = evaluate_tiers(self._db, profile_id)
|
|
365
|
-
demoted = stats["demoted_to_warm"] + stats["demoted_to_cold"] + stats["demoted_to_archive"]
|
|
366
|
-
if demoted > 0:
|
|
367
|
-
logger.info("Tier evaluation for %s: %d facts demoted", profile_id, demoted)
|
|
368
|
-
except Exception as exc:
|
|
369
|
-
logger.debug("Tier evaluation skipped for %s: %s", profile_id, exc)
|
|
370
|
-
|
|
371
|
-
# v3.6.6 F-5: Daily core-block recompile with hygiene.
|
|
372
|
-
try:
|
|
373
|
-
from superlocalmemory.core.block_hygiene import _recompile_core_blocks
|
|
374
|
-
_recompile_core_blocks(self._db, self._config, profile_id)
|
|
375
|
-
except Exception as exc:
|
|
376
|
-
logger.debug("Core-block recompile skipped for %s: %s", profile_id, exc)
|
|
377
|
-
|
|
378
|
-
# Re-read what is filed as a plan. The one-time pass runs as a
|
|
379
|
-
# migration; the rule it uses keeps getting sharper, and a completed
|
|
380
|
-
# migration is never replayed — so without this the store drifts
|
|
381
|
-
# further from the rule with every release and nothing repairs it. The
|
|
382
|
-
# pass is a pure function of the text and idempotent, so this is a no-op
|
|
383
|
-
# once the store has converged.
|
|
384
|
-
#
|
|
385
|
-
# Once per cycle, not once per profile: it reads the whole table in one
|
|
386
|
-
# sweep with no profile predicate, so running it per profile did the
|
|
387
|
-
# identical global work N times over and took the write lock N times to
|
|
388
|
-
# do it. It also takes and releases that lock per batch, so a memory
|
|
389
|
-
# being saved waits for one batch rather than the whole sweep.
|
|
390
|
-
#
|
|
391
|
-
# An earlier version reached for `_conn` and then `.connection`, and the
|
|
392
|
-
# database manager has neither, so the guard was always False and this
|
|
393
|
-
# had never run once -- the store drifted further from the rule with
|
|
394
|
-
# every release while a block that looks like it repairs that sat here
|
|
395
|
-
# doing nothing.
|
|
396
|
-
try:
|
|
397
|
-
from superlocalmemory.storage.migrations import (
|
|
398
|
-
M048_upcoming_holds_only_what_is_upcoming as _reclassify,
|
|
399
|
-
)
|
|
400
|
-
_reclassify.apply(open_connection=self._db.raw_connection)
|
|
401
|
-
self._record_step("re-reading plans", True)
|
|
402
|
-
except Exception as exc: # noqa: BLE001
|
|
403
|
-
self._record_step("re-reading plans", False, str(exc))
|
|
404
|
-
|
|
405
|
-
# Anything that has failed on several cycles running is not a blip.
|
|
406
|
-
# Every step here logs and continues, which is right -- one broken step
|
|
407
|
-
# must not stop the rest -- but it meant a step that had been failing
|
|
408
|
-
# for a week looked exactly like one that had just hiccupped, and the
|
|
409
|
-
# daemon still reported itself healthy throughout.
|
|
410
|
-
self._note_step_outcomes()
|
|
411
|
-
|
|
412
|
-
# Retention. Three tables had a pruner each, written and wired
|
|
413
|
-
# separately; the fourth unbounded table was found by reading a
|
|
414
|
-
# disk-usage report and the fifth by reading the fourth. The policy for
|
|
415
|
-
# every append-shaped table now lives in one registry and this enforces
|
|
416
|
-
# all of them, so a table added without a policy is something the test
|
|
417
|
-
# suite can see rather than something a person has to remember.
|
|
418
|
-
#
|
|
419
|
-
# Once per cycle, not per profile: every rule is keyed either on a row's
|
|
420
|
-
# own age or on whether its referent still exists, and neither is
|
|
421
|
-
# profile-scoped. Placed after the per-profile work so it sweeps rows
|
|
422
|
-
# that pass orphaned -- pruning the graph and demoting tiers is what
|
|
423
|
-
# leaves a lineage or temporal row without a referent.
|
|
424
|
-
# In pieces, each taking and releasing the write lock. Entering
|
|
425
|
-
# ``raw_connection`` is what takes that lock, so entering it once for
|
|
426
|
-
# the whole sweep held it for the whole sweep: measured at 1,480 ms and
|
|
427
|
-
# 123,888 rows on a 1 GB store, which is most of the budget a save is
|
|
428
|
-
# allowed, spent waiting.
|
|
429
|
-
try:
|
|
430
|
-
from superlocalmemory.storage.retention_policy import (
|
|
431
|
-
run_retention_bounded,
|
|
432
|
-
)
|
|
433
|
-
removed = run_retention_bounded(self._db.raw_connection)
|
|
434
|
-
if removed:
|
|
435
|
-
logger.info(
|
|
436
|
-
"Retention: %s",
|
|
437
|
-
", ".join(
|
|
438
|
-
f"{table} -{count}" for table, count in sorted(removed.items())
|
|
439
|
-
),
|
|
440
|
-
)
|
|
441
|
-
self._record_step("retention", True)
|
|
442
|
-
except Exception as exc: # noqa: BLE001
|
|
443
|
-
self._record_step("retention", False, str(exc))
|
|
444
|
-
|
|
445
|
-
# V3.4.10: Check if auto-backup is due
|
|
446
|
-
try:
|
|
447
|
-
from superlocalmemory.infra.backup import BackupManager
|
|
448
|
-
manager = BackupManager(db_path=self._db.db_path)
|
|
449
|
-
filename = manager.check_and_backup()
|
|
450
|
-
if filename:
|
|
451
|
-
logger.info("Auto-backup created: %s", filename)
|
|
452
|
-
self._sync_cloud_destinations(manager)
|
|
453
|
-
except Exception as exc:
|
|
454
|
-
logger.debug("Auto-backup check skipped: %s", exc)
|
|
455
|
-
|
|
456
|
-
try:
|
|
457
|
-
from superlocalmemory.cli.pending_store import cleanup_stale
|
|
458
|
-
stats = cleanup_stale()
|
|
459
|
-
if stats["total"] > 0:
|
|
460
|
-
logger.info("Pending cleanup: %s", stats)
|
|
461
|
-
except Exception as exc:
|
|
462
|
-
logger.debug("Pending cleanup skipped: %s", exc)
|
|
463
|
-
|
|
464
|
-
# v3.8.5: GC the spreading-activation result cache. Neither cleanup path
|
|
465
|
-
# was ever wired in, so activation_cache grew without bound (observed
|
|
466
|
-
# 83k expired rows, oldest ~3.5 months). Batched + DB-wide (expiry is
|
|
467
|
-
# not profile-scoped), so it runs once per cycle rather than per profile.
|
|
468
|
-
try:
|
|
469
|
-
deleted = self._db.cleanup_activation_cache()
|
|
470
|
-
if deleted > 0:
|
|
471
|
-
logger.info("Activation-cache GC: %d expired rows removed", deleted)
|
|
472
|
-
except Exception as exc:
|
|
473
|
-
logger.debug("Activation-cache GC skipped: %s", exc)
|
|
474
|
-
|
|
475
|
-
self._schedule_next()
|
|
476
|
-
|
|
477
|
-
def _profile_ids(self) -> tuple[str, ...]:
|
|
478
|
-
"""Return every persisted profile with a deterministic fallback."""
|
|
479
|
-
try:
|
|
480
|
-
rows = self._db.execute(
|
|
481
|
-
"SELECT profile_id FROM profiles ORDER BY profile_id",
|
|
482
|
-
(),
|
|
483
|
-
)
|
|
484
|
-
profiles = tuple(
|
|
485
|
-
dict.fromkeys(str(row["profile_id"]) for row in rows if row["profile_id"])
|
|
486
|
-
)
|
|
487
|
-
if profiles:
|
|
488
|
-
return profiles
|
|
489
|
-
except Exception as exc:
|
|
490
|
-
logger.debug("Profile enumeration failed: %s", exc)
|
|
491
|
-
return (self._profile_id,)
|
|
492
|
-
|
|
493
|
-
def _sync_cloud_destinations(self, manager: object) -> None:
|
|
494
|
-
"""Push latest backup to configured cloud destinations."""
|
|
495
|
-
try:
|
|
496
|
-
from superlocalmemory.infra.cloud_backup import sync_all_destinations
|
|
497
|
-
sync_all_destinations(self._db.db_path)
|
|
498
|
-
except ImportError:
|
|
499
|
-
pass # cloud_backup module not available yet
|
|
500
|
-
except Exception as exc:
|
|
501
|
-
logger.warning("Cloud sync failed (non-critical): %s", exc)
|
|
502
|
-
|
|
503
|
-
def __del__(self) -> None:
|
|
504
|
-
try:
|
|
505
|
-
self.stop()
|
|
506
|
-
except Exception:
|
|
507
|
-
pass
|
|
@@ -1,20 +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
|
|
4
|
-
|
|
5
|
-
"""Control-flow signals for best-effort materialization work.
|
|
6
|
-
|
|
7
|
-
These exceptions deliberately live outside the ingestion state machine and
|
|
8
|
-
embedding implementation so either layer can request a durable deferral
|
|
9
|
-
without introducing an import cycle.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class MaterializationDeferred(RuntimeError):
|
|
16
|
-
"""Best-effort enrichment yielded to a runtime transition.
|
|
17
|
-
|
|
18
|
-
The queryable projection is already durable. This signal must be handled
|
|
19
|
-
by :class:`IngestionCommand` as a requeue, never as a failed attempt.
|
|
20
|
-
"""
|
|
@@ -1,89 +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
|
|
4
|
-
|
|
5
|
-
"""V3.5.9 — McpEmbedderProxy: lightweight embedder for the MCP (LIGHT) process.
|
|
6
|
-
|
|
7
|
-
Problem: MemoryEngine(Capabilities.LIGHT) skips _init_heavy_layer(), leaving
|
|
8
|
-
_embedder=None permanently. Any memory stored via MCP tools has NULL embeddings
|
|
9
|
-
→ semantic search silently broken; health() lies, reporting unavailable.
|
|
10
|
-
|
|
11
|
-
Solution: a thin proxy that delegates embed_batch() to the running daemon via
|
|
12
|
-
its POST /api/embed endpoint over localhost HTTP. The daemon runs a FULL engine
|
|
13
|
-
with one real ONNX/Ollama worker. No second ONNX process is spawned.
|
|
14
|
-
|
|
15
|
-
Usage (engine.py LIGHT branch):
|
|
16
|
-
proxy = McpEmbedderProxy(port=8765)
|
|
17
|
-
if proxy.is_available():
|
|
18
|
-
engine._embedder = proxy
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import logging
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
|
-
|
|
27
|
-
_DEFAULT_TIMEOUT = 5.0 # seconds — fast enough for inline store() calls
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class McpEmbedderProxy:
|
|
31
|
-
"""Proxy embedder: MCP process → daemon's /api/embed over localhost HTTP."""
|
|
32
|
-
|
|
33
|
-
def __init__(self, port: int = 8765, timeout: float = _DEFAULT_TIMEOUT) -> None:
|
|
34
|
-
self._base_url = f"http://127.0.0.1:{port}"
|
|
35
|
-
self._timeout = timeout
|
|
36
|
-
self._available: bool | None = None # cached after first is_available() call
|
|
37
|
-
|
|
38
|
-
def is_available(self) -> bool:
|
|
39
|
-
"""Ping daemon's embed endpoint. Cached after first success."""
|
|
40
|
-
if self._available is True:
|
|
41
|
-
return True
|
|
42
|
-
try:
|
|
43
|
-
import httpx
|
|
44
|
-
resp = httpx.get(f"{self._base_url}/api/v3/embed/ping", timeout=2.0)
|
|
45
|
-
self._available = resp.status_code == 200
|
|
46
|
-
except Exception:
|
|
47
|
-
self._available = False
|
|
48
|
-
return bool(self._available)
|
|
49
|
-
|
|
50
|
-
# -- Embedder interface (matches embeddings.py / ollama_embedder.py) ------
|
|
51
|
-
|
|
52
|
-
def embed(self, text: str) -> list[float] | None:
|
|
53
|
-
"""Embed a single text via daemon. Returns None on any error."""
|
|
54
|
-
results = self.embed_batch([text])
|
|
55
|
-
return results[0] if results else None
|
|
56
|
-
|
|
57
|
-
def embed_batch(self, texts: list[str]) -> list[list[float] | None]:
|
|
58
|
-
"""Embed a batch of texts via daemon's /api/embed endpoint."""
|
|
59
|
-
if not texts:
|
|
60
|
-
return []
|
|
61
|
-
try:
|
|
62
|
-
import httpx
|
|
63
|
-
resp = httpx.post(
|
|
64
|
-
f"{self._base_url}/api/v3/embed",
|
|
65
|
-
json={"texts": texts},
|
|
66
|
-
timeout=self._timeout,
|
|
67
|
-
)
|
|
68
|
-
resp.raise_for_status()
|
|
69
|
-
data = resp.json()
|
|
70
|
-
embeddings = data.get("embeddings", [])
|
|
71
|
-
# Pad with None if daemon returned fewer results than requested
|
|
72
|
-
while len(embeddings) < len(texts):
|
|
73
|
-
embeddings.append(None)
|
|
74
|
-
return embeddings
|
|
75
|
-
except Exception as exc:
|
|
76
|
-
logger.debug("McpEmbedderProxy.embed_batch failed: %s", exc)
|
|
77
|
-
return [None] * len(texts)
|
|
78
|
-
|
|
79
|
-
def compute_fisher_params(
|
|
80
|
-
self, embedding: list[float]
|
|
81
|
-
) -> tuple[list[float] | None, list[float] | None]:
|
|
82
|
-
"""Fisher-Rao params stay in daemon's FULL engine; proxy returns None.
|
|
83
|
-
|
|
84
|
-
The MCP LIGHT process stores facts with embedding=<vector> but
|
|
85
|
-
fisher_mean=None, fisher_variance=None. The daemon's consolidation
|
|
86
|
-
pass fills these in asynchronously — same behaviour as the
|
|
87
|
-
write-through remember path.
|
|
88
|
-
"""
|
|
89
|
-
return None, None
|