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,131 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Inverse-propensity weighting, so the bandit cannot confirm itself.
|
|
5
|
-
|
|
6
|
-
THE BIAS
|
|
7
|
-
--------
|
|
8
|
-
The bandit decides what is shown, and engagement is then measured on what was
|
|
9
|
-
shown. Feed that back raw and the loop is circular: an arm ranked first is seen
|
|
10
|
-
more, so it is engaged with more, so it is ranked first more. The arm that wins
|
|
11
|
-
is the one that was already winning, and the posterior records popularity it
|
|
12
|
-
manufactured rather than usefulness it discovered.
|
|
13
|
-
|
|
14
|
-
That is the self-referential signal in its exact form — a measurement taken
|
|
15
|
-
through the mechanism it is meant to evaluate cannot see that mechanism fail.
|
|
16
|
-
|
|
17
|
-
THE CORRECTION
|
|
18
|
-
--------------
|
|
19
|
-
Weight each observation by the inverse of the probability the policy had of
|
|
20
|
-
showing that arm. An arm the policy was unlikely to show, that was engaged with
|
|
21
|
-
anyway, is strong evidence; an arm the policy shows almost always is weak
|
|
22
|
-
evidence whatever happens to it. This is the standard IPS estimator from
|
|
23
|
-
counterfactual learning-to-rank, and it makes the update unbiased with respect
|
|
24
|
-
to the policy's own choices.
|
|
25
|
-
|
|
26
|
-
Under Thompson sampling the propensity is not a stored number: an arm is shown
|
|
27
|
-
when its posterior draw beats every competitor's, so the probability is
|
|
28
|
-
``P(theta_i > theta_j for all j != i)`` with each ``theta ~ Beta(alpha, beta)``.
|
|
29
|
-
There is no closed form for more than two arms, so it is estimated by sampling.
|
|
30
|
-
|
|
31
|
-
WHEN THE COMPETITORS ARE UNKNOWN
|
|
32
|
-
--------------------------------
|
|
33
|
-
Return a weight of exactly 1.0 — no correction. A wrong correction is worse
|
|
34
|
-
than none: it would silently scale evidence by a number with no meaning, and
|
|
35
|
-
unlike an absent correction nothing downstream could tell. Abstaining from a
|
|
36
|
-
correction is visible in ``PropensityEstimate.corrected``.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
from __future__ import annotations
|
|
40
|
-
|
|
41
|
-
import random
|
|
42
|
-
from dataclasses import dataclass
|
|
43
|
-
|
|
44
|
-
__all__ = ["PropensityEstimate", "estimate_propensity", "ips_weight", "MAX_WEIGHT"]
|
|
45
|
-
|
|
46
|
-
#: Ceiling on the weight a single observation may carry. IPS has unbounded
|
|
47
|
-
#: variance as propensity approaches zero: one rare event with p = 0.001 would
|
|
48
|
-
#: otherwise move a posterior by 1000 plays' worth. Clipping trades a little
|
|
49
|
-
#: bias for a variance that does not destroy the estimate — the standard
|
|
50
|
-
#: bias-variance trade in clipped IPS.
|
|
51
|
-
MAX_WEIGHT = 10.0
|
|
52
|
-
|
|
53
|
-
#: Propensities below this are treated as this value before inversion.
|
|
54
|
-
_MIN_PROPENSITY = 1.0 / MAX_WEIGHT
|
|
55
|
-
|
|
56
|
-
#: Monte Carlo draws. 2000 puts the standard error of a mid-range propensity
|
|
57
|
-
#: near 0.01, which is finer than the weight clipping can express.
|
|
58
|
-
_DRAWS = 2000
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@dataclass(frozen=True)
|
|
62
|
-
class PropensityEstimate:
|
|
63
|
-
"""A propensity and whether it was actually derived from anything."""
|
|
64
|
-
|
|
65
|
-
propensity: float
|
|
66
|
-
weight: float
|
|
67
|
-
corrected: bool
|
|
68
|
-
competitors: int = 0
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def estimate_propensity(
|
|
72
|
-
arm: tuple[float, float],
|
|
73
|
-
competitors: list[tuple[float, float]],
|
|
74
|
-
*,
|
|
75
|
-
draws: int = _DRAWS,
|
|
76
|
-
rng: random.Random | None = None,
|
|
77
|
-
) -> float:
|
|
78
|
-
"""P(this arm's Thompson draw is the largest), by Monte Carlo.
|
|
79
|
-
|
|
80
|
-
``arm`` and each competitor are ``(alpha, beta)`` posteriors. With no
|
|
81
|
-
competitors the arm is shown whenever it is considered, so the propensity
|
|
82
|
-
is 1.0 and the correction is a no-op.
|
|
83
|
-
"""
|
|
84
|
-
if not competitors:
|
|
85
|
-
return 1.0
|
|
86
|
-
# Fixed seed by default: the same play settled twice must produce the
|
|
87
|
-
# same weight, or a retry would move a posterior differently than the
|
|
88
|
-
# first attempt did.
|
|
89
|
-
generator = rng or random.Random(20260824)
|
|
90
|
-
alpha, beta = _sane(arm)
|
|
91
|
-
others = [_sane(c) for c in competitors]
|
|
92
|
-
|
|
93
|
-
wins = 0
|
|
94
|
-
for _ in range(max(1, int(draws))):
|
|
95
|
-
mine = generator.betavariate(alpha, beta)
|
|
96
|
-
if all(mine > generator.betavariate(a, b) for a, b in others):
|
|
97
|
-
wins += 1
|
|
98
|
-
return wins / max(1, int(draws))
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def _sane(posterior: tuple[float, float]) -> tuple[float, float]:
|
|
102
|
-
"""Beta requires strictly positive parameters; a stored 0 would raise."""
|
|
103
|
-
alpha, beta = posterior
|
|
104
|
-
return (max(float(alpha), 1e-6), max(float(beta), 1e-6))
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def ips_weight(
|
|
108
|
-
arm: tuple[float, float] | None,
|
|
109
|
-
competitors: list[tuple[float, float]] | None,
|
|
110
|
-
*,
|
|
111
|
-
draws: int = _DRAWS,
|
|
112
|
-
rng: random.Random | None = None,
|
|
113
|
-
) -> PropensityEstimate:
|
|
114
|
-
"""Clipped inverse-propensity weight for one observation.
|
|
115
|
-
|
|
116
|
-
Returns ``corrected=False`` and ``weight=1.0`` when there is nothing to
|
|
117
|
-
correct against, so a caller can tell an uncorrected update from a
|
|
118
|
-
corrected one that happened to land on 1.0.
|
|
119
|
-
"""
|
|
120
|
-
if arm is None or not competitors:
|
|
121
|
-
return PropensityEstimate(propensity=1.0, weight=1.0, corrected=False)
|
|
122
|
-
|
|
123
|
-
propensity = estimate_propensity(arm, competitors, draws=draws, rng=rng)
|
|
124
|
-
clipped = max(propensity, _MIN_PROPENSITY)
|
|
125
|
-
weight = min(1.0 / clipped, MAX_WEIGHT)
|
|
126
|
-
return PropensityEstimate(
|
|
127
|
-
propensity=propensity,
|
|
128
|
-
weight=weight,
|
|
129
|
-
corrected=True,
|
|
130
|
-
competitors=len(competitors),
|
|
131
|
-
)
|
|
@@ -1,300 +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
|
-
"""3-phase adaptive ranker — from heuristic to ML.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Phase 1: cross-encoder score only (cold start)
|
|
9
|
-
Phase 2: heuristic boosts (some data)
|
|
10
|
-
Phase 3: LightGBM **lambdarank** Booster (native, not LGBMRanker sklearn
|
|
11
|
-
wrapper) scoring on numpy feature matrices.
|
|
12
|
-
|
|
13
|
-
Transitions are automatic based on accumulated training data. Feature-name
|
|
14
|
-
drift is handled per LLD-02 §4.5 (``drift_mode``):
|
|
15
|
-
- ``aligned`` — score normally.
|
|
16
|
-
- ``subset`` — pad missing features with 0.0 in FEATURE_NAMES order.
|
|
17
|
-
- ``unknown`` — refuse to score; fall back to pre-model order.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import logging
|
|
23
|
-
import math
|
|
24
|
-
from typing import Any
|
|
25
|
-
|
|
26
|
-
from superlocalmemory.learning.features import (
|
|
27
|
-
FEATURE_DIM,
|
|
28
|
-
FEATURE_NAMES,
|
|
29
|
-
FeatureExtractor,
|
|
30
|
-
FeatureVector,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
logger = logging.getLogger(__name__)
|
|
34
|
-
|
|
35
|
-
# Phase thresholds
|
|
36
|
-
PHASE_2_THRESHOLD = 50 # signals needed to enter Phase 2
|
|
37
|
-
PHASE_3_THRESHOLD = 200 # signals needed to enter Phase 3
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class AdaptiveRanker:
|
|
41
|
-
"""3-phase adaptive re-ranker for V3 retrieval results."""
|
|
42
|
-
|
|
43
|
-
def __init__(
|
|
44
|
-
self,
|
|
45
|
-
signal_count: int = 0,
|
|
46
|
-
model_state: bytes | None = None,
|
|
47
|
-
*,
|
|
48
|
-
active_model: Any = None,
|
|
49
|
-
) -> None:
|
|
50
|
-
"""Build a ranker.
|
|
51
|
-
|
|
52
|
-
``active_model`` (``model_cache.ActiveModel``) is preferred when
|
|
53
|
-
available — it carries verified booster + feature_names. The legacy
|
|
54
|
-
``model_state`` bytes path remains for backward compatibility with
|
|
55
|
-
3.4.20 callers; it does NOT perform SHA-256 verification and should
|
|
56
|
-
not be used by the 3.4.22 recall path.
|
|
57
|
-
"""
|
|
58
|
-
self._signal_count = signal_count
|
|
59
|
-
self._active = active_model
|
|
60
|
-
# Back-compat: only fill in from raw bytes when no active_model given.
|
|
61
|
-
if active_model is None and model_state:
|
|
62
|
-
self._load_legacy_bytes(model_state)
|
|
63
|
-
|
|
64
|
-
# --- public properties ---------------------------------------------
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def phase(self) -> int:
|
|
68
|
-
if self._signal_count >= PHASE_3_THRESHOLD and self._active is not None:
|
|
69
|
-
return 3
|
|
70
|
-
if self._signal_count >= PHASE_2_THRESHOLD:
|
|
71
|
-
return 2
|
|
72
|
-
return 1
|
|
73
|
-
|
|
74
|
-
@property
|
|
75
|
-
def signal_count(self) -> int:
|
|
76
|
-
return self._signal_count
|
|
77
|
-
|
|
78
|
-
@signal_count.setter
|
|
79
|
-
def signal_count(self, value: int) -> None:
|
|
80
|
-
self._signal_count = value
|
|
81
|
-
|
|
82
|
-
@property
|
|
83
|
-
def active_model(self) -> Any:
|
|
84
|
-
return self._active
|
|
85
|
-
|
|
86
|
-
# --- re-rank entry points ------------------------------------------
|
|
87
|
-
|
|
88
|
-
def rerank(self, results: list[dict], query_context: dict) -> list[dict]:
|
|
89
|
-
"""Re-rank retrieval results based on current phase."""
|
|
90
|
-
if not results:
|
|
91
|
-
return results
|
|
92
|
-
|
|
93
|
-
if self.phase == 3:
|
|
94
|
-
return self._rerank_ml(results, query_context)
|
|
95
|
-
if self.phase == 2:
|
|
96
|
-
return self._rerank_heuristic(results, query_context)
|
|
97
|
-
return self._rerank_baseline(results)
|
|
98
|
-
|
|
99
|
-
def rank(self, candidates: list, query_context: dict) -> list:
|
|
100
|
-
"""LLD-02 §4.5 native inference path.
|
|
101
|
-
|
|
102
|
-
Accepts an iterable of objects that implement ``to_result_dict()``
|
|
103
|
-
(the signal-pipeline candidates) AND plain dicts (legacy).
|
|
104
|
-
"""
|
|
105
|
-
if self._active is None or not candidates:
|
|
106
|
-
return list(candidates)
|
|
107
|
-
|
|
108
|
-
# Build result dicts in a uniform shape.
|
|
109
|
-
result_dicts: list[dict] = []
|
|
110
|
-
for c in candidates:
|
|
111
|
-
if hasattr(c, "to_result_dict"):
|
|
112
|
-
result_dicts.append(c.to_result_dict())
|
|
113
|
-
elif isinstance(c, dict):
|
|
114
|
-
result_dicts.append(c)
|
|
115
|
-
else:
|
|
116
|
-
# Unknown candidate type — return original order.
|
|
117
|
-
return list(candidates)
|
|
118
|
-
|
|
119
|
-
from superlocalmemory.learning.model_cache import drift_mode
|
|
120
|
-
|
|
121
|
-
mode = drift_mode(self._active)
|
|
122
|
-
if mode == "unknown":
|
|
123
|
-
logger.info(
|
|
124
|
-
"ranker.rank: feature-name drift unknown; "
|
|
125
|
-
"falling back to pre-model order",
|
|
126
|
-
)
|
|
127
|
-
return list(candidates)
|
|
128
|
-
|
|
129
|
-
# Order matrix by CURRENT FEATURE_NAMES; if subset, missing names
|
|
130
|
-
# pad with 0.0 (FeatureExtractor already does this via .get(name, 0)).
|
|
131
|
-
try:
|
|
132
|
-
import numpy as np
|
|
133
|
-
except ImportError: # pragma: no cover — numpy is required dep
|
|
134
|
-
return list(candidates)
|
|
135
|
-
|
|
136
|
-
try:
|
|
137
|
-
rows = []
|
|
138
|
-
for rd in result_dicts:
|
|
139
|
-
fv = FeatureExtractor.extract(rd, query_context)
|
|
140
|
-
rows.append(fv.to_list())
|
|
141
|
-
X = np.asarray(rows, dtype=np.float32)
|
|
142
|
-
scores = self._active.booster.predict(X)
|
|
143
|
-
except Exception as exc: # pragma: no cover — booster.predict path
|
|
144
|
-
logger.warning("ranker.rank: booster.predict failed: %s", exc)
|
|
145
|
-
return list(candidates)
|
|
146
|
-
|
|
147
|
-
order = np.argsort(-scores, kind="stable")
|
|
148
|
-
return [candidates[int(i)] for i in order]
|
|
149
|
-
|
|
150
|
-
# --- phase implementations -----------------------------------------
|
|
151
|
-
|
|
152
|
-
def _rerank_baseline(self, results: list[dict]) -> list[dict]:
|
|
153
|
-
return sorted(
|
|
154
|
-
results,
|
|
155
|
-
key=lambda r: r.get("cross_encoder_score", r.get("score", 0)),
|
|
156
|
-
reverse=True,
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
def _rerank_heuristic(
|
|
160
|
-
self, results: list[dict], query_context: dict,
|
|
161
|
-
) -> list[dict]:
|
|
162
|
-
scored: list[dict] = []
|
|
163
|
-
for r in results:
|
|
164
|
-
base = r.get("cross_encoder_score", r.get("score", 0))
|
|
165
|
-
age_days = r.get("fact", {}).get("age_days", 30)
|
|
166
|
-
access_count = r.get("fact", {}).get("access_count", 0)
|
|
167
|
-
recency_boost = 0.1 * math.exp(-age_days / 30)
|
|
168
|
-
access_boost = 0.05 * min(access_count / 10, 1.0)
|
|
169
|
-
trust_boost = 0.1 * (r.get("trust_score", 0.5) - 0.5)
|
|
170
|
-
final = base + recency_boost + access_boost + trust_boost
|
|
171
|
-
scored.append({**r, "_adaptive_score": final})
|
|
172
|
-
return sorted(scored, key=lambda r: r["_adaptive_score"], reverse=True)
|
|
173
|
-
|
|
174
|
-
def _rerank_ml(
|
|
175
|
-
self, results: list[dict], query_context: dict,
|
|
176
|
-
) -> list[dict]:
|
|
177
|
-
"""Phase 3 prediction via native Booster."""
|
|
178
|
-
if self._active is None: # pragma: no cover — guarded by phase()
|
|
179
|
-
return self._rerank_heuristic(results, query_context)
|
|
180
|
-
|
|
181
|
-
from superlocalmemory.learning.model_cache import drift_mode
|
|
182
|
-
|
|
183
|
-
mode = drift_mode(self._active)
|
|
184
|
-
if mode == "unknown":
|
|
185
|
-
logger.info(
|
|
186
|
-
"ranker._rerank_ml: unknown drift → heuristic fallback",
|
|
187
|
-
)
|
|
188
|
-
return self._rerank_heuristic(results, query_context)
|
|
189
|
-
|
|
190
|
-
try:
|
|
191
|
-
import numpy as np
|
|
192
|
-
except ImportError: # pragma: no cover
|
|
193
|
-
return self._rerank_heuristic(results, query_context)
|
|
194
|
-
|
|
195
|
-
try:
|
|
196
|
-
feature_vectors = FeatureExtractor.extract_batch(
|
|
197
|
-
results, query_context,
|
|
198
|
-
)
|
|
199
|
-
X = np.asarray(
|
|
200
|
-
[fv.to_list() for fv in feature_vectors],
|
|
201
|
-
dtype=np.float32,
|
|
202
|
-
)
|
|
203
|
-
scores = self._active.booster.predict(X)
|
|
204
|
-
except Exception as exc: # pragma: no cover — booster.predict path
|
|
205
|
-
logger.warning("_rerank_ml failed: %s", exc)
|
|
206
|
-
return self._rerank_heuristic(results, query_context)
|
|
207
|
-
|
|
208
|
-
order = np.argsort(-scores, kind="stable")
|
|
209
|
-
return [
|
|
210
|
-
{**results[int(i)], "_adaptive_score": float(scores[int(i)])}
|
|
211
|
-
for i in order
|
|
212
|
-
]
|
|
213
|
-
|
|
214
|
-
# --- legacy load path (back-compat) --------------------------------
|
|
215
|
-
|
|
216
|
-
def _load_legacy_bytes(self, state: bytes) -> None:
|
|
217
|
-
"""Best-effort load from raw bytes — NO SHA-256 verify.
|
|
218
|
-
|
|
219
|
-
Kept for 3.4.20 callers. The 3.4.22 recall path uses
|
|
220
|
-
``model_cache.load_active`` which enforces verification.
|
|
221
|
-
"""
|
|
222
|
-
try:
|
|
223
|
-
import lightgbm as lgb # noqa: PLC0415
|
|
224
|
-
|
|
225
|
-
booster = lgb.Booster(model_str=state.decode("utf-8"))
|
|
226
|
-
except Exception as exc:
|
|
227
|
-
logger.warning("Legacy model load failed: %s", exc)
|
|
228
|
-
self._active = None
|
|
229
|
-
return
|
|
230
|
-
|
|
231
|
-
from superlocalmemory.learning.model_cache import ActiveModel
|
|
232
|
-
|
|
233
|
-
self._active = ActiveModel(
|
|
234
|
-
profile_id="legacy",
|
|
235
|
-
booster=booster,
|
|
236
|
-
feature_names=tuple(FEATURE_NAMES),
|
|
237
|
-
trained_at="",
|
|
238
|
-
sha256="",
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
# --- legacy train() shim (3.4.20 API) ------------------------------
|
|
242
|
-
|
|
243
|
-
def train(self, training_data: list) -> bool:
|
|
244
|
-
"""Deprecated — v3.4.22 training lives in ``consolidation_worker``.
|
|
245
|
-
|
|
246
|
-
Kept as a guard for 3.4.20 callers: returns False when
|
|
247
|
-
training_data is below the Phase-3 threshold, True after a best-
|
|
248
|
-
effort native booster fit on the legacy feature dict shape
|
|
249
|
-
(never persists to disk). Production training must go through
|
|
250
|
-
``consolidation_worker._retrain_ranker`` which uses real features
|
|
251
|
-
+ ``lambdarank`` + group + integrity persistence.
|
|
252
|
-
"""
|
|
253
|
-
if not training_data or len(training_data) < PHASE_3_THRESHOLD:
|
|
254
|
-
return False
|
|
255
|
-
# Best-effort legacy path — does NOT persist, does NOT promote.
|
|
256
|
-
try:
|
|
257
|
-
import lightgbm as lgb # noqa: PLC0415
|
|
258
|
-
import numpy as np
|
|
259
|
-
except ImportError:
|
|
260
|
-
return False
|
|
261
|
-
X = np.asarray(
|
|
262
|
-
[[float((d.get("features") or {}).get(n, 0.0))
|
|
263
|
-
for n in FEATURE_NAMES]
|
|
264
|
-
for d in training_data],
|
|
265
|
-
dtype=np.float32,
|
|
266
|
-
)
|
|
267
|
-
y = np.asarray(
|
|
268
|
-
[float(d.get("label", 0.0)) for d in training_data],
|
|
269
|
-
dtype=np.float32,
|
|
270
|
-
)
|
|
271
|
-
ds = lgb.Dataset(X, label=y, feature_name=list(FEATURE_NAMES),
|
|
272
|
-
free_raw_data=False)
|
|
273
|
-
try:
|
|
274
|
-
booster = lgb.train(
|
|
275
|
-
{"objective": "regression", "metric": "rmse",
|
|
276
|
-
"verbosity": -1, "min_data_in_leaf": 1},
|
|
277
|
-
ds, num_boost_round=10,
|
|
278
|
-
)
|
|
279
|
-
except Exception: # pragma: no cover — defensive
|
|
280
|
-
return False
|
|
281
|
-
from superlocalmemory.learning.model_cache import ActiveModel
|
|
282
|
-
|
|
283
|
-
self._active = ActiveModel(
|
|
284
|
-
profile_id="legacy",
|
|
285
|
-
booster=booster,
|
|
286
|
-
feature_names=tuple(FEATURE_NAMES),
|
|
287
|
-
trained_at="",
|
|
288
|
-
sha256="",
|
|
289
|
-
)
|
|
290
|
-
return True
|
|
291
|
-
|
|
292
|
-
# --- legacy serialiser (used by external code in 3.4.20) -----------
|
|
293
|
-
|
|
294
|
-
def get_model_state(self) -> bytes | None:
|
|
295
|
-
if self._active is None:
|
|
296
|
-
return None
|
|
297
|
-
try:
|
|
298
|
-
return self._active.booster.model_to_string().encode("utf-8")
|
|
299
|
-
except Exception: # pragma: no cover — defensive
|
|
300
|
-
return None
|
|
@@ -1,163 +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
|
-
"""Ranker retraining helpers shared by legacy + online paths.
|
|
6
|
-
|
|
7
|
-
These functions predate the LLD-10 online retrain wiring and remain
|
|
8
|
-
identical in behaviour; they are factored out so both
|
|
9
|
-
``ranker_retrain_legacy.py`` and ``ranker_retrain_online.py`` can call
|
|
10
|
-
them without importing from each other.
|
|
11
|
-
|
|
12
|
-
Contract refs:
|
|
13
|
-
- LLD-02 §4.6 — lambdarank retraining groups + shadow gate.
|
|
14
|
-
- LLD-10 §3.2 — in-sample NDCG gate before persisting a candidate.
|
|
15
|
-
- Stage 8 H-01 (architect) — file split.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import logging
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
__all__ = (
|
|
25
|
-
"_build_training_matrix",
|
|
26
|
-
"_shadow_test_improved",
|
|
27
|
-
"_compute_eval_metrics",
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def _build_training_matrix(rows: list[dict], feature_names):
|
|
32
|
-
"""Group rows by ``query_id``, preserve order by ``position``.
|
|
33
|
-
|
|
34
|
-
Returns ``(X, y_int, group_counts)``. ``group_counts`` is ``None``
|
|
35
|
-
when no groups are discoverable (empty input).
|
|
36
|
-
"""
|
|
37
|
-
import numpy as np
|
|
38
|
-
from superlocalmemory.learning.labeler import label_for_row
|
|
39
|
-
|
|
40
|
-
grouped: dict[str, list[dict]] = {}
|
|
41
|
-
for row in rows:
|
|
42
|
-
qid = row.get("query_id") or ""
|
|
43
|
-
grouped.setdefault(qid, []).append(row)
|
|
44
|
-
if not grouped:
|
|
45
|
-
return np.zeros((0, len(feature_names)), dtype=np.float32), [], None
|
|
46
|
-
|
|
47
|
-
xs: list[list[float]] = []
|
|
48
|
-
ys: list[int] = []
|
|
49
|
-
group_counts: list[int] = []
|
|
50
|
-
for qid, group_rows in grouped.items():
|
|
51
|
-
# Sort by position ascending; missing positions land at the end.
|
|
52
|
-
group_rows = sorted(
|
|
53
|
-
group_rows,
|
|
54
|
-
key=lambda r: (
|
|
55
|
-
r.get("position") if r.get("position") is not None else 10**9
|
|
56
|
-
),
|
|
57
|
-
)
|
|
58
|
-
for r in group_rows:
|
|
59
|
-
feats = r.get("features") or {}
|
|
60
|
-
xs.append([float(feats.get(n, 0.0)) for n in feature_names])
|
|
61
|
-
ys.append(label_for_row(r))
|
|
62
|
-
group_counts.append(len(group_rows))
|
|
63
|
-
|
|
64
|
-
X = np.asarray(xs, dtype=np.float32)
|
|
65
|
-
y = np.asarray(ys, dtype=np.int32)
|
|
66
|
-
return X, y, group_counts
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def _shadow_test_improved(prior_row, booster_new, rows, feature_names) -> bool:
|
|
70
|
-
"""Return True iff new booster beats prior on NDCG@10 with p<0.05.
|
|
71
|
-
|
|
72
|
-
Lightweight paired t-test across per-query NDCG@10 scores.
|
|
73
|
-
``prior_row`` is the dict returned by ``load_active_model`` — it
|
|
74
|
-
may be unusable (missing state_bytes / unparseable); in that case
|
|
75
|
-
we promote.
|
|
76
|
-
"""
|
|
77
|
-
try:
|
|
78
|
-
import numpy as np
|
|
79
|
-
import lightgbm as lgb
|
|
80
|
-
except ImportError: # pragma: no cover
|
|
81
|
-
return True
|
|
82
|
-
|
|
83
|
-
try:
|
|
84
|
-
prior_booster = lgb.Booster(
|
|
85
|
-
model_str=bytes(prior_row["state_bytes"]).decode("utf-8"),
|
|
86
|
-
)
|
|
87
|
-
except Exception:
|
|
88
|
-
return True # prior unusable → promote new.
|
|
89
|
-
|
|
90
|
-
X, y, groups = _build_training_matrix(rows, feature_names)
|
|
91
|
-
if groups is None or not groups:
|
|
92
|
-
return True
|
|
93
|
-
|
|
94
|
-
offsets = [0]
|
|
95
|
-
for g in groups:
|
|
96
|
-
offsets.append(offsets[-1] + g)
|
|
97
|
-
|
|
98
|
-
def _ndcg_at_k(scores, labels, k=10):
|
|
99
|
-
order = np.argsort(-scores)
|
|
100
|
-
gains_map = [0, 1, 3, 7, 15]
|
|
101
|
-
dcg = 0.0
|
|
102
|
-
for i, idx in enumerate(order[:k]):
|
|
103
|
-
l = int(labels[idx])
|
|
104
|
-
if 0 <= l < len(gains_map):
|
|
105
|
-
dcg += gains_map[l] / np.log2(i + 2)
|
|
106
|
-
ideal = sorted(labels.tolist(), reverse=True)[:k]
|
|
107
|
-
idcg = sum(
|
|
108
|
-
(gains_map[int(l)] if 0 <= int(l) < len(gains_map) else 0)
|
|
109
|
-
/ np.log2(i + 2)
|
|
110
|
-
for i, l in enumerate(ideal)
|
|
111
|
-
)
|
|
112
|
-
return dcg / idcg if idcg > 0 else 0.0
|
|
113
|
-
|
|
114
|
-
old_ndcgs: list[float] = []
|
|
115
|
-
new_ndcgs: list[float] = []
|
|
116
|
-
for i in range(len(groups)):
|
|
117
|
-
lo, hi = offsets[i], offsets[i + 1]
|
|
118
|
-
if hi - lo < 2:
|
|
119
|
-
continue
|
|
120
|
-
Xg, yg = X[lo:hi], y[lo:hi]
|
|
121
|
-
try:
|
|
122
|
-
s_old = prior_booster.predict(Xg)
|
|
123
|
-
s_new = booster_new.predict(Xg)
|
|
124
|
-
except Exception:
|
|
125
|
-
return False
|
|
126
|
-
old_ndcgs.append(_ndcg_at_k(s_old, yg))
|
|
127
|
-
new_ndcgs.append(_ndcg_at_k(s_new, yg))
|
|
128
|
-
|
|
129
|
-
if not old_ndcgs:
|
|
130
|
-
return True
|
|
131
|
-
old_arr = np.asarray(old_ndcgs)
|
|
132
|
-
new_arr = np.asarray(new_ndcgs)
|
|
133
|
-
delta = float(np.mean(new_arr - old_arr))
|
|
134
|
-
if delta < 0.02:
|
|
135
|
-
return False
|
|
136
|
-
|
|
137
|
-
# Paired t-test — small-sample safe.
|
|
138
|
-
diff = new_arr - old_arr
|
|
139
|
-
n = len(diff)
|
|
140
|
-
if n < 2:
|
|
141
|
-
return True
|
|
142
|
-
mean = float(np.mean(diff))
|
|
143
|
-
std = float(np.std(diff, ddof=1))
|
|
144
|
-
if std == 0.0:
|
|
145
|
-
return mean > 0
|
|
146
|
-
t_stat = mean / (std / np.sqrt(n))
|
|
147
|
-
# Rough threshold: t > 2.0 (~p<0.05 for n ≥ 10 two-tailed).
|
|
148
|
-
return t_stat > 2.0
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def _compute_eval_metrics(booster, rows, feature_names) -> dict:
|
|
152
|
-
"""Lightweight training metrics snapshot."""
|
|
153
|
-
try:
|
|
154
|
-
import numpy as np
|
|
155
|
-
X, y, groups = _build_training_matrix(rows, feature_names)
|
|
156
|
-
preds = booster.predict(X) if X.size else np.zeros(0)
|
|
157
|
-
return {
|
|
158
|
-
"n_rows": int(X.shape[0]),
|
|
159
|
-
"n_groups": int(len(groups or [])),
|
|
160
|
-
"mean_score": float(np.mean(preds)) if preds.size else 0.0,
|
|
161
|
-
}
|
|
162
|
-
except Exception: # pragma: no cover
|
|
163
|
-
return {}
|