superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,298 +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
|
-
"""Synthetic bootstrap for cold-start ML ranking.
|
|
6
|
-
|
|
7
|
-
Generates (query, fact, label) triples from existing memory patterns
|
|
8
|
-
so the adaptive ranker can operate before real feedback accumulates.
|
|
9
|
-
|
|
10
|
-
Four strategies:
|
|
11
|
-
1. Access-based -- frequently accessed memories are positive for their keywords
|
|
12
|
-
2. Importance-based -- high-importance memories are positive for their tags
|
|
13
|
-
3. Pattern-based -- learned identity patterns generate synthetic queries
|
|
14
|
-
4. Recency-based -- recent memories rank higher for shared-topic queries
|
|
15
|
-
|
|
16
|
-
Ported from V2 SyntheticBootstrapper with V2-specific deps removed.
|
|
17
|
-
|
|
18
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import hashlib
|
|
24
|
-
import json
|
|
25
|
-
import logging
|
|
26
|
-
import re
|
|
27
|
-
import sqlite3
|
|
28
|
-
from collections import Counter
|
|
29
|
-
from pathlib import Path
|
|
30
|
-
from typing import Any, Optional
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
# ---------------------------------------------------------------------------
|
|
35
|
-
# Stopwords for keyword extraction (no NLP dep)
|
|
36
|
-
# ---------------------------------------------------------------------------
|
|
37
|
-
_STOPWORDS = frozenset({
|
|
38
|
-
"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
|
|
39
|
-
"have", "has", "had", "do", "does", "did", "will", "would", "shall",
|
|
40
|
-
"should", "may", "might", "can", "could", "to", "of", "in", "for",
|
|
41
|
-
"on", "with", "at", "by", "from", "as", "into", "through", "during",
|
|
42
|
-
"before", "after", "above", "below", "between", "under", "again",
|
|
43
|
-
"further", "then", "once", "here", "there", "when", "where", "why",
|
|
44
|
-
"how", "all", "each", "every", "both", "few", "more", "most", "other",
|
|
45
|
-
"some", "such", "no", "not", "only", "own", "same", "so", "than",
|
|
46
|
-
"too", "very", "just", "because", "but", "and", "or", "if", "while",
|
|
47
|
-
"about", "up", "out", "off", "over", "also", "it", "its", "this",
|
|
48
|
-
"that", "i", "me", "my", "we", "our", "you", "your", "he", "him",
|
|
49
|
-
"she", "her", "they", "them", "what", "which", "who", "whom",
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
_WORD_RE = re.compile(r"[a-zA-Z0-9_]+")
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class SyntheticBootstrap:
|
|
56
|
-
"""Generate synthetic training data for cold-start ML ranking.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
db_path: Path to the sqlite database containing a ``memories`` table.
|
|
60
|
-
A fresh database is created if the file does not exist.
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
def __init__(self, db_path: Path | str) -> None:
|
|
64
|
-
self._db_path = Path(db_path)
|
|
65
|
-
self._ensure_schema()
|
|
66
|
-
|
|
67
|
-
# ------------------------------------------------------------------
|
|
68
|
-
# Public API
|
|
69
|
-
# ------------------------------------------------------------------
|
|
70
|
-
|
|
71
|
-
def generate(self, profile_id: str, count: int = 200) -> list[dict]:
|
|
72
|
-
"""Generate synthetic (query, fact_id, label) triples.
|
|
73
|
-
|
|
74
|
-
Returns up to *count* records. Returns an empty list when
|
|
75
|
-
the profile has no memories to mine from.
|
|
76
|
-
"""
|
|
77
|
-
memories = self._fetch_memories(profile_id)
|
|
78
|
-
if not memories:
|
|
79
|
-
return []
|
|
80
|
-
|
|
81
|
-
records: list[dict] = []
|
|
82
|
-
records.extend(self._access_based(memories))
|
|
83
|
-
records.extend(self._importance_based(memories))
|
|
84
|
-
records.extend(self._recency_based(memories))
|
|
85
|
-
|
|
86
|
-
# Trim to target count with source diversity
|
|
87
|
-
if len(records) > count:
|
|
88
|
-
records = self._diverse_sample(records, count)
|
|
89
|
-
|
|
90
|
-
return records
|
|
91
|
-
|
|
92
|
-
# ------------------------------------------------------------------
|
|
93
|
-
# Strategy 1: access-based
|
|
94
|
-
# ------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
def _access_based(self, memories: list[dict]) -> list[dict]:
|
|
97
|
-
"""Memories accessed 5+ times are positive for their keywords."""
|
|
98
|
-
records: list[dict] = []
|
|
99
|
-
high_access = [m for m in memories if m.get("access_count", 0) >= 5]
|
|
100
|
-
|
|
101
|
-
for mem in high_access:
|
|
102
|
-
keywords = _extract_keywords(mem.get("content", ""))
|
|
103
|
-
if not keywords:
|
|
104
|
-
continue
|
|
105
|
-
query = " ".join(keywords)
|
|
106
|
-
|
|
107
|
-
records.append(_build_record(query, mem, label=1.0, source="access_pos"))
|
|
108
|
-
|
|
109
|
-
# Pick negatives from memories with different tags
|
|
110
|
-
for neg in self._find_negatives(memories, mem, limit=2):
|
|
111
|
-
records.append(_build_record(query, neg, label=0.0, source="access_neg"))
|
|
112
|
-
|
|
113
|
-
return records
|
|
114
|
-
|
|
115
|
-
# ------------------------------------------------------------------
|
|
116
|
-
# Strategy 2: importance-based
|
|
117
|
-
# ------------------------------------------------------------------
|
|
118
|
-
|
|
119
|
-
def _importance_based(self, memories: list[dict]) -> list[dict]:
|
|
120
|
-
"""High-importance memories (>=8) are positive for their tags."""
|
|
121
|
-
records: list[dict] = []
|
|
122
|
-
important = [m for m in memories if (m.get("importance") or 0) >= 8]
|
|
123
|
-
|
|
124
|
-
for mem in important:
|
|
125
|
-
query = self._tags_to_query(mem)
|
|
126
|
-
if not query:
|
|
127
|
-
keywords = _extract_keywords(mem.get("content", ""))
|
|
128
|
-
query = " ".join(keywords) if keywords else ""
|
|
129
|
-
if not query:
|
|
130
|
-
continue
|
|
131
|
-
|
|
132
|
-
records.append(_build_record(query, mem, label=1.0, source="importance_pos"))
|
|
133
|
-
|
|
134
|
-
for neg in self._find_negatives(memories, mem, limit=2):
|
|
135
|
-
records.append(_build_record(query, neg, label=0.0, source="importance_neg"))
|
|
136
|
-
|
|
137
|
-
return records
|
|
138
|
-
|
|
139
|
-
# ------------------------------------------------------------------
|
|
140
|
-
# Strategy 3: recency-based
|
|
141
|
-
# ------------------------------------------------------------------
|
|
142
|
-
|
|
143
|
-
def _recency_based(self, memories: list[dict]) -> list[dict]:
|
|
144
|
-
"""Recent memories rank higher for shared-topic queries."""
|
|
145
|
-
records: list[dict] = []
|
|
146
|
-
recent = memories[:30] # Already sorted by created_at DESC
|
|
147
|
-
if len(recent) < 4:
|
|
148
|
-
return records
|
|
149
|
-
|
|
150
|
-
seen_queries: set[str] = set()
|
|
151
|
-
for mem in recent[:15]:
|
|
152
|
-
keywords = _extract_keywords(mem.get("content", ""))
|
|
153
|
-
query = " ".join(keywords) if keywords else ""
|
|
154
|
-
if not query or query in seen_queries:
|
|
155
|
-
continue
|
|
156
|
-
seen_queries.add(query)
|
|
157
|
-
|
|
158
|
-
records.append(_build_record(query, mem, label=0.8, source="recency_pos"))
|
|
159
|
-
|
|
160
|
-
# Older memories about the same topic are weak negatives
|
|
161
|
-
for older in memories[30:]:
|
|
162
|
-
content = (older.get("content") or "").lower()
|
|
163
|
-
if any(kw in content for kw in keywords):
|
|
164
|
-
records.append(
|
|
165
|
-
_build_record(query, older, label=0.3, source="recency_neg")
|
|
166
|
-
)
|
|
167
|
-
break
|
|
168
|
-
|
|
169
|
-
return records
|
|
170
|
-
|
|
171
|
-
# ------------------------------------------------------------------
|
|
172
|
-
# Database
|
|
173
|
-
# ------------------------------------------------------------------
|
|
174
|
-
|
|
175
|
-
def _ensure_schema(self) -> None:
|
|
176
|
-
"""Create the memories table if it does not exist (for testing)."""
|
|
177
|
-
conn = sqlite3.connect(str(self._db_path))
|
|
178
|
-
try:
|
|
179
|
-
conn.execute(
|
|
180
|
-
"""CREATE TABLE IF NOT EXISTS memories (
|
|
181
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
182
|
-
profile_id TEXT DEFAULT 'default',
|
|
183
|
-
content TEXT,
|
|
184
|
-
tags TEXT,
|
|
185
|
-
importance INTEGER DEFAULT 5,
|
|
186
|
-
access_count INTEGER DEFAULT 0,
|
|
187
|
-
created_at TEXT
|
|
188
|
-
)"""
|
|
189
|
-
)
|
|
190
|
-
conn.commit()
|
|
191
|
-
finally:
|
|
192
|
-
conn.close()
|
|
193
|
-
|
|
194
|
-
def _fetch_memories(self, profile_id: str) -> list[dict]:
|
|
195
|
-
"""Fetch memories for a profile, ordered by recency."""
|
|
196
|
-
conn = sqlite3.connect(str(self._db_path))
|
|
197
|
-
conn.row_factory = sqlite3.Row
|
|
198
|
-
try:
|
|
199
|
-
cur = conn.execute(
|
|
200
|
-
"SELECT * FROM memories WHERE profile_id = ? "
|
|
201
|
-
"ORDER BY created_at DESC LIMIT 500",
|
|
202
|
-
(profile_id,),
|
|
203
|
-
)
|
|
204
|
-
return [dict(r) for r in cur.fetchall()]
|
|
205
|
-
except sqlite3.OperationalError:
|
|
206
|
-
return []
|
|
207
|
-
finally:
|
|
208
|
-
conn.close()
|
|
209
|
-
|
|
210
|
-
# ------------------------------------------------------------------
|
|
211
|
-
# Helpers
|
|
212
|
-
# ------------------------------------------------------------------
|
|
213
|
-
|
|
214
|
-
@staticmethod
|
|
215
|
-
def _tags_to_query(memory: dict) -> str:
|
|
216
|
-
"""Extract a query string from the memory's tags field."""
|
|
217
|
-
tags = memory.get("tags", "")
|
|
218
|
-
if not tags:
|
|
219
|
-
return ""
|
|
220
|
-
if isinstance(tags, list):
|
|
221
|
-
return " ".join(tags[:5])
|
|
222
|
-
try:
|
|
223
|
-
parsed = json.loads(tags)
|
|
224
|
-
if isinstance(parsed, list):
|
|
225
|
-
return " ".join(str(t) for t in parsed[:5])
|
|
226
|
-
except (json.JSONDecodeError, TypeError):
|
|
227
|
-
pass
|
|
228
|
-
return " ".join(t.strip() for t in str(tags).split(",") if t.strip())[:5]
|
|
229
|
-
|
|
230
|
-
@staticmethod
|
|
231
|
-
def _find_negatives(
|
|
232
|
-
memories: list[dict], anchor: dict, limit: int = 2
|
|
233
|
-
) -> list[dict]:
|
|
234
|
-
"""Pick memories dissimilar to anchor (different tags or id)."""
|
|
235
|
-
anchor_id = anchor.get("id")
|
|
236
|
-
anchor_tags = set(
|
|
237
|
-
t.strip().lower()
|
|
238
|
-
for t in str(anchor.get("tags", "")).split(",")
|
|
239
|
-
if t.strip()
|
|
240
|
-
)
|
|
241
|
-
negatives: list[dict] = []
|
|
242
|
-
for mem in memories:
|
|
243
|
-
if mem.get("id") == anchor_id:
|
|
244
|
-
continue
|
|
245
|
-
mem_tags = set(
|
|
246
|
-
t.strip().lower()
|
|
247
|
-
for t in str(mem.get("tags", "")).split(",")
|
|
248
|
-
if t.strip()
|
|
249
|
-
)
|
|
250
|
-
if not mem_tags & anchor_tags:
|
|
251
|
-
negatives.append(mem)
|
|
252
|
-
if len(negatives) >= limit:
|
|
253
|
-
break
|
|
254
|
-
return negatives
|
|
255
|
-
|
|
256
|
-
@staticmethod
|
|
257
|
-
def _diverse_sample(records: list[dict], target: int) -> list[dict]:
|
|
258
|
-
"""Sample records proportionally across sources."""
|
|
259
|
-
by_source: dict[str, list[dict]] = {}
|
|
260
|
-
for r in records:
|
|
261
|
-
by_source.setdefault(r["source"], []).append(r)
|
|
262
|
-
n_sources = len(by_source) or 1
|
|
263
|
-
per_source = max(1, target // n_sources)
|
|
264
|
-
sampled: list[dict] = []
|
|
265
|
-
for src_records in by_source.values():
|
|
266
|
-
sampled.extend(src_records[:per_source])
|
|
267
|
-
return sampled[:target]
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
# ----------------------------------------------------------------------
|
|
271
|
-
# Module-level helpers (stateless)
|
|
272
|
-
# ----------------------------------------------------------------------
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
def _extract_keywords(content: str, top_n: int = 3) -> list[str]:
|
|
276
|
-
"""Extract top-N keywords from text via frequency (no NLP deps)."""
|
|
277
|
-
if not content:
|
|
278
|
-
return []
|
|
279
|
-
tokens = _WORD_RE.findall(content.lower())
|
|
280
|
-
filtered = [t for t in tokens if t not in _STOPWORDS and len(t) > 2]
|
|
281
|
-
counts = Counter(filtered)
|
|
282
|
-
return [word for word, _ in counts.most_common(top_n)]
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
def _build_record(
|
|
286
|
-
query: str,
|
|
287
|
-
memory: dict,
|
|
288
|
-
label: float,
|
|
289
|
-
source: str,
|
|
290
|
-
) -> dict:
|
|
291
|
-
"""Build a single training record."""
|
|
292
|
-
return {
|
|
293
|
-
"query": query,
|
|
294
|
-
"query_hash": hashlib.sha256(query.encode()).hexdigest()[:16],
|
|
295
|
-
"fact_id": memory.get("id", 0),
|
|
296
|
-
"label": label,
|
|
297
|
-
"source": source,
|
|
298
|
-
}
|
|
@@ -1,398 +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.22 — F4.A Stage-8 H-01 fix
|
|
4
|
-
|
|
5
|
-
"""ConsolidationWorker — background memory maintenance lifecycle.
|
|
6
|
-
|
|
7
|
-
Runs periodically (every 6 hours or on-demand) to:
|
|
8
|
-
1. Decay confidence on unused facts (floor 0.1).
|
|
9
|
-
2. Deduplicate near-identical facts via HNSW (LLD-12).
|
|
10
|
-
3. Mine behavioural patterns (``pattern_miner.generate_patterns``).
|
|
11
|
-
4. Recompute graph intelligence.
|
|
12
|
-
5. Auto-retrain the adaptive ranker — online (LLD-10) or legacy
|
|
13
|
-
cold-start gated by Stage-8 H-07.
|
|
14
|
-
6. Compile entity truth blocks (v3.4.3).
|
|
15
|
-
|
|
16
|
-
The class itself is kept lean: every heavy helper lives in a dedicated
|
|
17
|
-
module (``pattern_miner``, ``ranker_retrain_online``,
|
|
18
|
-
``ranker_retrain_legacy``).
|
|
19
|
-
|
|
20
|
-
Contract refs:
|
|
21
|
-
- LLD-10 §2 + §3 — online retrain orchestration.
|
|
22
|
-
- LLD-12 §2 — HNSW dedup path.
|
|
23
|
-
- Stage 8 H-01 + H-07 — file split + legacy gating.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
import json
|
|
29
|
-
import logging
|
|
30
|
-
import os
|
|
31
|
-
import sqlite3
|
|
32
|
-
from datetime import datetime, timezone
|
|
33
|
-
from pathlib import Path
|
|
34
|
-
|
|
35
|
-
from superlocalmemory.storage.write_lock import get_write_lock
|
|
36
|
-
|
|
37
|
-
logger = logging.getLogger(__name__)
|
|
38
|
-
|
|
39
|
-
__all__ = ("ConsolidationWorker",)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class ConsolidationWorker:
|
|
43
|
-
"""Background memory maintenance worker.
|
|
44
|
-
|
|
45
|
-
Call :py:meth:`run` periodically or via the dashboard button. All
|
|
46
|
-
operations are safe — they improve quality without losing data.
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
def __init__(
|
|
50
|
-
self, memory_db: str | Path, learning_db: str | Path,
|
|
51
|
-
) -> None:
|
|
52
|
-
self._memory_db = str(memory_db)
|
|
53
|
-
self._learning_db = str(learning_db)
|
|
54
|
-
|
|
55
|
-
# ------------------------------------------------------------------
|
|
56
|
-
# Public API
|
|
57
|
-
# ------------------------------------------------------------------
|
|
58
|
-
|
|
59
|
-
def run(self, profile_id: str, dry_run: bool = False) -> dict:
|
|
60
|
-
"""Run full consolidation cycle. Returns stats."""
|
|
61
|
-
stats = {
|
|
62
|
-
"decayed": 0,
|
|
63
|
-
"deduped": 0,
|
|
64
|
-
"retrained": False,
|
|
65
|
-
"signal_count": 0,
|
|
66
|
-
"ranker_phase": 1,
|
|
67
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
# 1. Confidence decay on unused facts.
|
|
71
|
-
try:
|
|
72
|
-
from superlocalmemory.learning.signals import LearningSignals
|
|
73
|
-
decayed = LearningSignals.decay_confidence(
|
|
74
|
-
self._memory_db, profile_id, rate=0.001,
|
|
75
|
-
)
|
|
76
|
-
stats["decayed"] = decayed
|
|
77
|
-
if not dry_run:
|
|
78
|
-
logger.info(
|
|
79
|
-
"Confidence decay: %d facts affected", decayed,
|
|
80
|
-
)
|
|
81
|
-
except Exception as exc:
|
|
82
|
-
logger.debug("Decay failed: %s", exc)
|
|
83
|
-
|
|
84
|
-
# 2. Deduplication (HNSW + fallback).
|
|
85
|
-
try:
|
|
86
|
-
deduped = self._deduplicate(profile_id, dry_run)
|
|
87
|
-
stats["deduped"] = deduped
|
|
88
|
-
except Exception as exc:
|
|
89
|
-
logger.debug("Dedup failed: %s", exc)
|
|
90
|
-
|
|
91
|
-
# 3. Behavioural patterns.
|
|
92
|
-
try:
|
|
93
|
-
patterns = self._generate_patterns(profile_id, dry_run)
|
|
94
|
-
stats["patterns_generated"] = patterns
|
|
95
|
-
except Exception as exc:
|
|
96
|
-
logger.debug("Pattern generation failed: %s", exc)
|
|
97
|
-
|
|
98
|
-
# 4. Recompute graph intelligence (v3.4.2).
|
|
99
|
-
try:
|
|
100
|
-
from superlocalmemory.core.graph_analyzer import GraphAnalyzer
|
|
101
|
-
conn_ga = sqlite3.connect(self._memory_db, timeout=10)
|
|
102
|
-
conn_ga.execute("PRAGMA busy_timeout=5000")
|
|
103
|
-
conn_ga.row_factory = sqlite3.Row
|
|
104
|
-
|
|
105
|
-
# Wrap _DBProxy.execute writes in the process-level write lock.
|
|
106
|
-
# Reads pass through without the lock (WAL-safe).
|
|
107
|
-
_ga_write_lock = get_write_lock(self._memory_db)
|
|
108
|
-
|
|
109
|
-
class _DBProxy:
|
|
110
|
-
"""Minimal DB proxy for GraphAnalyzer compatibility."""
|
|
111
|
-
|
|
112
|
-
def __init__(self, connection: sqlite3.Connection) -> None:
|
|
113
|
-
self._conn = connection
|
|
114
|
-
|
|
115
|
-
def execute(self, sql: str, params: tuple = ()) -> list:
|
|
116
|
-
if sql.strip().upper().startswith(
|
|
117
|
-
("INSERT", "UPDATE", "DELETE", "ALTER", "CREATE"),
|
|
118
|
-
):
|
|
119
|
-
with _ga_write_lock:
|
|
120
|
-
cursor = self._conn.execute(sql, params)
|
|
121
|
-
self._conn.commit()
|
|
122
|
-
return []
|
|
123
|
-
return self._conn.execute(sql, params).fetchall()
|
|
124
|
-
|
|
125
|
-
ga = GraphAnalyzer(_DBProxy(conn_ga))
|
|
126
|
-
if not dry_run:
|
|
127
|
-
ga_result = ga.compute_and_store(profile_id)
|
|
128
|
-
stats["graph_nodes"] = ga_result.get("node_count", 0)
|
|
129
|
-
stats["graph_communities"] = ga_result.get(
|
|
130
|
-
"community_count", 0,
|
|
131
|
-
)
|
|
132
|
-
logger.info(
|
|
133
|
-
"Graph analysis: %d nodes, %d communities",
|
|
134
|
-
stats["graph_nodes"], stats["graph_communities"],
|
|
135
|
-
)
|
|
136
|
-
conn_ga.close()
|
|
137
|
-
except Exception as exc:
|
|
138
|
-
logger.debug("Graph analysis failed: %s", exc)
|
|
139
|
-
|
|
140
|
-
# 5. Ranker retrain — online (LLD-10) or legacy cold-start.
|
|
141
|
-
#
|
|
142
|
-
# Gating (Stage-8 H-07): once a profile has an active model the
|
|
143
|
-
# online path wins unconditionally. The legacy cold-start path
|
|
144
|
-
# only fires when there is NO active model (``_should_retrain``
|
|
145
|
-
# returns False because no active row exists) AND the raw
|
|
146
|
-
# signal_count crosses 200. Partial unique indexes M009 keep
|
|
147
|
-
# both paths from racing.
|
|
148
|
-
try:
|
|
149
|
-
from superlocalmemory.learning.feedback import FeedbackCollector
|
|
150
|
-
collector = FeedbackCollector(Path(self._learning_db))
|
|
151
|
-
signal_count = collector.get_feedback_count(profile_id)
|
|
152
|
-
stats["signal_count"] = signal_count
|
|
153
|
-
stats["ranker_phase"] = (
|
|
154
|
-
1 if signal_count < 50 else (2 if signal_count < 200 else 3)
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
if not dry_run:
|
|
158
|
-
# Late import — the shim hosts ``_run_shadow_cycle`` so
|
|
159
|
-
# that monkey-patches on ``consolidation_worker`` reach
|
|
160
|
-
# into the orchestrator's helper lookups.
|
|
161
|
-
from superlocalmemory.learning import consolidation_worker \
|
|
162
|
-
as _shim
|
|
163
|
-
if self._should_retrain(profile_id):
|
|
164
|
-
stats["online_retrain"] = _shim._run_shadow_cycle(
|
|
165
|
-
memory_db_path=self._memory_db,
|
|
166
|
-
learning_db_path=self._learning_db,
|
|
167
|
-
profile_id=profile_id,
|
|
168
|
-
)
|
|
169
|
-
elif signal_count >= 200:
|
|
170
|
-
# Cold-start only: no active model yet.
|
|
171
|
-
retrained = self._retrain_ranker(
|
|
172
|
-
profile_id, signal_count,
|
|
173
|
-
)
|
|
174
|
-
stats["retrained"] = retrained
|
|
175
|
-
except Exception as exc:
|
|
176
|
-
logger.debug("Retrain check failed: %s", exc)
|
|
177
|
-
|
|
178
|
-
# 6. Entity compilation (v3.4.3).
|
|
179
|
-
if not dry_run:
|
|
180
|
-
try:
|
|
181
|
-
from superlocalmemory.learning.entity_compiler import (
|
|
182
|
-
EntityCompiler,
|
|
183
|
-
)
|
|
184
|
-
from superlocalmemory.core.config import SLMConfig
|
|
185
|
-
config = SLMConfig.load()
|
|
186
|
-
compiler = EntityCompiler(self._memory_db, config)
|
|
187
|
-
ec_result = compiler.compile_all(profile_id)
|
|
188
|
-
stats["entities_compiled"] = ec_result.get("compiled", 0)
|
|
189
|
-
if ec_result["compiled"] > 0:
|
|
190
|
-
logger.info(
|
|
191
|
-
"Entity compilation: %d entities compiled",
|
|
192
|
-
ec_result["compiled"],
|
|
193
|
-
)
|
|
194
|
-
except Exception as exc:
|
|
195
|
-
logger.debug("Entity compilation failed: %s", exc)
|
|
196
|
-
|
|
197
|
-
return stats
|
|
198
|
-
|
|
199
|
-
# ------------------------------------------------------------------
|
|
200
|
-
# Private helpers
|
|
201
|
-
# ------------------------------------------------------------------
|
|
202
|
-
|
|
203
|
-
def _deduplicate(self, profile_id: str, dry_run: bool) -> int:
|
|
204
|
-
"""Find and mark near-duplicate facts.
|
|
205
|
-
|
|
206
|
-
v3.4.22 (LLD-12): prefer HNSW ANN + entity-overlap dedup with a
|
|
207
|
-
reversible merge log. On any error (missing schema columns,
|
|
208
|
-
hnswlib unavailable, RAM budget exceeded) fall back to the
|
|
209
|
-
legacy prefix dedup so existing deployments keep working.
|
|
210
|
-
|
|
211
|
-
Never DELETEs from atomic_facts — merges flip archive_status
|
|
212
|
-
and write memory_merge_log rows.
|
|
213
|
-
"""
|
|
214
|
-
# v3.4.22 preferred path: HNSW + memory_merge (LLD-12).
|
|
215
|
-
try:
|
|
216
|
-
from superlocalmemory.learning.hnsw_dedup import (
|
|
217
|
-
HnswDeduplicator,
|
|
218
|
-
)
|
|
219
|
-
from superlocalmemory.learning.memory_merge import apply_merges
|
|
220
|
-
|
|
221
|
-
dedup = HnswDeduplicator(memory_db_path=self._memory_db)
|
|
222
|
-
candidates = dedup.find_merge_candidates(profile_id)
|
|
223
|
-
if not candidates:
|
|
224
|
-
return 0
|
|
225
|
-
if dry_run:
|
|
226
|
-
return len(candidates)
|
|
227
|
-
applied = apply_merges(
|
|
228
|
-
self._memory_db, candidates, profile_id=profile_id,
|
|
229
|
-
)
|
|
230
|
-
return applied
|
|
231
|
-
except sqlite3.OperationalError as exc:
|
|
232
|
-
# Schema predates M011 — fall through to legacy path.
|
|
233
|
-
logger.debug("hnsw dedup schema missing, fallback: %s", exc)
|
|
234
|
-
except Exception as exc:
|
|
235
|
-
logger.debug("hnsw dedup unexpected error, fallback: %s", exc)
|
|
236
|
-
|
|
237
|
-
# Legacy fallback (pre-v3.4.22 behaviour).
|
|
238
|
-
# S9-defer H-P-09: hard cap on the fallback scan so a profile
|
|
239
|
-
# with 5M+ atomic_facts cannot OOM the consolidation worker
|
|
240
|
-
# when hnswlib is unavailable. The fallback is a prefix-match
|
|
241
|
-
# heuristic anyway; scanning more than 100k rows via this
|
|
242
|
-
# code path is noise, not signal. The cap can be raised via
|
|
243
|
-
# env var for benchmarking.
|
|
244
|
-
_LEGACY_DEDUP_SCAN_CAP = int(
|
|
245
|
-
os.environ.get("SLM_LEGACY_DEDUP_SCAN_CAP", "100000")
|
|
246
|
-
)
|
|
247
|
-
try:
|
|
248
|
-
# READ phase — no write lock needed (WAL allows concurrent reads).
|
|
249
|
-
conn_r = sqlite3.connect(self._memory_db, timeout=10)
|
|
250
|
-
conn_r.execute("PRAGMA busy_timeout=5000")
|
|
251
|
-
conn_r.row_factory = sqlite3.Row
|
|
252
|
-
|
|
253
|
-
rows = conn_r.execute(
|
|
254
|
-
"SELECT fact_id, content FROM atomic_facts "
|
|
255
|
-
"WHERE profile_id = ? ORDER BY created_at LIMIT ?",
|
|
256
|
-
(profile_id, _LEGACY_DEDUP_SCAN_CAP),
|
|
257
|
-
).fetchall()
|
|
258
|
-
conn_r.close()
|
|
259
|
-
|
|
260
|
-
seen_prefixes: dict[str, str] = {}
|
|
261
|
-
duplicates = []
|
|
262
|
-
|
|
263
|
-
for r in rows:
|
|
264
|
-
d = dict(r)
|
|
265
|
-
prefix = d["content"][:100].strip().lower()
|
|
266
|
-
if prefix in seen_prefixes:
|
|
267
|
-
duplicates.append(d["fact_id"])
|
|
268
|
-
else:
|
|
269
|
-
seen_prefixes[prefix] = d["fact_id"]
|
|
270
|
-
|
|
271
|
-
if duplicates and not dry_run:
|
|
272
|
-
# WRITE phase — acquire the process-level write lock before
|
|
273
|
-
# opening the sqlite3 connection, so this UPDATE is serialised
|
|
274
|
-
# with all other in-process writers (DatabaseManager,
|
|
275
|
-
# VectorStore, adapter sync) and cannot cause SQLITE_BUSY.
|
|
276
|
-
with get_write_lock(self._memory_db):
|
|
277
|
-
conn_w = sqlite3.connect(self._memory_db, timeout=10)
|
|
278
|
-
try:
|
|
279
|
-
for fid in duplicates:
|
|
280
|
-
conn_w.execute(
|
|
281
|
-
"UPDATE atomic_facts "
|
|
282
|
-
"SET confidence = MAX(0.1, confidence * 0.5) "
|
|
283
|
-
"WHERE fact_id = ?",
|
|
284
|
-
(fid,),
|
|
285
|
-
)
|
|
286
|
-
conn_w.commit()
|
|
287
|
-
finally:
|
|
288
|
-
conn_w.close()
|
|
289
|
-
|
|
290
|
-
return len(duplicates)
|
|
291
|
-
except Exception:
|
|
292
|
-
return 0
|
|
293
|
-
|
|
294
|
-
def _generate_patterns(
|
|
295
|
-
self, profile_id: str, dry_run: bool = False,
|
|
296
|
-
) -> int:
|
|
297
|
-
"""Back-compat shim delegating to ``pattern_miner.generate_patterns``.
|
|
298
|
-
|
|
299
|
-
Preserved so the MCP ``run_maintenance`` tool and any external
|
|
300
|
-
caller that bound this method directly keeps working.
|
|
301
|
-
"""
|
|
302
|
-
from superlocalmemory.learning.pattern_miner import generate_patterns
|
|
303
|
-
return generate_patterns(
|
|
304
|
-
self._memory_db, self._learning_db, profile_id, dry_run,
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
def _retrain_ranker(self, profile_id: str, signal_count: int) -> bool:
|
|
308
|
-
"""Legacy cold-start retrain. DEPRECATED.
|
|
309
|
-
|
|
310
|
-
Delegates to the deprecated legacy impl; a one-shot
|
|
311
|
-
``DeprecationWarning`` fires on first invocation per process.
|
|
312
|
-
"""
|
|
313
|
-
try:
|
|
314
|
-
from superlocalmemory.learning import consolidation_worker \
|
|
315
|
-
as _shim
|
|
316
|
-
return _shim._retrain_ranker_impl(self._learning_db, profile_id)
|
|
317
|
-
except Exception as exc:
|
|
318
|
-
logger.debug("Retrain failed: %s", exc)
|
|
319
|
-
return False
|
|
320
|
-
|
|
321
|
-
# ------------------------------------------------------------------
|
|
322
|
-
# LLD-10 — online retrain trigger
|
|
323
|
-
# ------------------------------------------------------------------
|
|
324
|
-
|
|
325
|
-
def _should_retrain(self, profile_id: str) -> bool:
|
|
326
|
-
"""Return True if the outcome-count or 24h trigger has fired.
|
|
327
|
-
|
|
328
|
-
Reads ``learning_model_state.metadata_json`` on the active row.
|
|
329
|
-
Honours ``metadata_json.retrain_disabled_until`` (post-rollback
|
|
330
|
-
cooldown). No DB writes — pure SELECT + JSON parse.
|
|
331
|
-
"""
|
|
332
|
-
from superlocalmemory.learning.ranker_retrain_online import (
|
|
333
|
-
RETRAIN_NEW_OUTCOMES_THRESHOLD,
|
|
334
|
-
RETRAIN_HOURS_THRESHOLD,
|
|
335
|
-
)
|
|
336
|
-
try:
|
|
337
|
-
conn = sqlite3.connect(self._learning_db, timeout=5)
|
|
338
|
-
try:
|
|
339
|
-
conn.row_factory = sqlite3.Row
|
|
340
|
-
row = conn.execute(
|
|
341
|
-
"SELECT metadata_json FROM learning_model_state "
|
|
342
|
-
"WHERE profile_id = ? AND is_active = 1 LIMIT 1",
|
|
343
|
-
(profile_id,),
|
|
344
|
-
).fetchone()
|
|
345
|
-
finally:
|
|
346
|
-
conn.close()
|
|
347
|
-
except sqlite3.Error as exc:
|
|
348
|
-
logger.debug("_should_retrain sqlite error: %s", exc)
|
|
349
|
-
return False
|
|
350
|
-
|
|
351
|
-
if row is None:
|
|
352
|
-
# No active model yet — let the legacy cold-start path
|
|
353
|
-
# (signal_count >= 200) drive first training.
|
|
354
|
-
return False
|
|
355
|
-
|
|
356
|
-
try:
|
|
357
|
-
meta = json.loads(row["metadata_json"] or "{}")
|
|
358
|
-
except (TypeError, ValueError):
|
|
359
|
-
meta = {}
|
|
360
|
-
|
|
361
|
-
now = datetime.now(timezone.utc)
|
|
362
|
-
|
|
363
|
-
# Cooldown: honour retrain_disabled_until (post-rollback).
|
|
364
|
-
disabled_until = meta.get("retrain_disabled_until")
|
|
365
|
-
if disabled_until:
|
|
366
|
-
try:
|
|
367
|
-
dt = datetime.fromisoformat(disabled_until)
|
|
368
|
-
if dt.tzinfo is None:
|
|
369
|
-
dt = dt.replace(tzinfo=timezone.utc)
|
|
370
|
-
if dt > now:
|
|
371
|
-
return False
|
|
372
|
-
except (TypeError, ValueError):
|
|
373
|
-
pass # malformed → ignore the cooldown
|
|
374
|
-
|
|
375
|
-
# Trigger A — outcome-count delta.
|
|
376
|
-
try:
|
|
377
|
-
new_outcomes = int(
|
|
378
|
-
meta.get("new_outcomes_since_last_retrain", 0) or 0,
|
|
379
|
-
)
|
|
380
|
-
except (TypeError, ValueError):
|
|
381
|
-
new_outcomes = 0
|
|
382
|
-
if new_outcomes >= RETRAIN_NEW_OUTCOMES_THRESHOLD:
|
|
383
|
-
return True
|
|
384
|
-
|
|
385
|
-
# Trigger B — hours since last retrain.
|
|
386
|
-
last = meta.get("last_retrain_at")
|
|
387
|
-
if last:
|
|
388
|
-
try:
|
|
389
|
-
last_dt = datetime.fromisoformat(last)
|
|
390
|
-
if last_dt.tzinfo is None:
|
|
391
|
-
last_dt = last_dt.replace(tzinfo=timezone.utc)
|
|
392
|
-
hours = (now - last_dt).total_seconds() / 3600.0
|
|
393
|
-
if hours >= RETRAIN_HOURS_THRESHOLD:
|
|
394
|
-
return True
|
|
395
|
-
except (TypeError, ValueError):
|
|
396
|
-
pass
|
|
397
|
-
|
|
398
|
-
return False
|