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,279 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Engagement observed from what an agent did, not from what it was asked to say.
|
|
5
|
-
|
|
6
|
-
WHY THIS EXISTS
|
|
7
|
-
---------------
|
|
8
|
-
The reward ladder in ``reward_proxy`` asks one question — did a recalled
|
|
9
|
-
``fact_id`` appear verbatim in a later tool event — and defaults to ``0.5`` when
|
|
10
|
-
the answer is no. Both halves of that are broken.
|
|
11
|
-
|
|
12
|
-
The question requires the caller to copy an opaque marker into its next tool
|
|
13
|
-
call. Nothing makes it: no tool description asks for it and no rule requires
|
|
14
|
-
it. A design that depends on a behaviour nothing produces has no signal, and
|
|
15
|
-
in practice no signal was ever registered.
|
|
16
|
-
|
|
17
|
-
The default is worse than no answer. ``alpha += 0.5`` and ``beta += 0.5`` move
|
|
18
|
-
together, so a Beta posterior keeps its mean at exactly 0.5 while its variance
|
|
19
|
-
*shrinks*. Every neutral settlement makes an arm more confident that it is
|
|
20
|
-
average and harder for real evidence to move later. Neutral is not a safe
|
|
21
|
-
default; it is a slow commitment to knowing nothing.
|
|
22
|
-
|
|
23
|
-
WHAT REPLACES IT
|
|
24
|
-
----------------
|
|
25
|
-
Features computed from rows the system already writes. An agent that uses a
|
|
26
|
-
recalled memory leaves traces whether or not it cooperates: it reads or edits
|
|
27
|
-
the files the memory names, its next actions stay on the memory's subject, it
|
|
28
|
-
writes a follow-up memory that overlaps. None of that requires it to quote an
|
|
29
|
-
identifier.
|
|
30
|
-
|
|
31
|
-
Every feature here is observable, and each is reported separately so a reward
|
|
32
|
-
can say *why*. When nothing is observable the answer is ``None`` — abstain —
|
|
33
|
-
never a number.
|
|
34
|
-
|
|
35
|
-
NOT SELF-REFERENTIAL
|
|
36
|
-
--------------------
|
|
37
|
-
A signal derived from the mechanism it evaluates cannot detect that mechanism's
|
|
38
|
-
failure. Ranking position is therefore not a feature: the bandit chose the
|
|
39
|
-
ranking, so scoring it by what the bandit ranked first would confirm the bandit
|
|
40
|
-
to itself. Position enters only in ``propensity.py``, as a correction applied
|
|
41
|
-
*against* the observation, never as evidence for it.
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
from __future__ import annotations
|
|
45
|
-
|
|
46
|
-
import json
|
|
47
|
-
import re
|
|
48
|
-
import sqlite3
|
|
49
|
-
from dataclasses import dataclass, field
|
|
50
|
-
from datetime import datetime, timedelta
|
|
51
|
-
|
|
52
|
-
__all__ = [
|
|
53
|
-
"EngagementFeatures",
|
|
54
|
-
"OBSERVATION_WINDOW_SEC",
|
|
55
|
-
"extract_features",
|
|
56
|
-
"tokenize",
|
|
57
|
-
]
|
|
58
|
-
|
|
59
|
-
#: How long after a recall an action may still be counted as caused by it.
|
|
60
|
-
#: Wider than the old 30 s hit window: an agent reads a memory, then thinks,
|
|
61
|
-
#: then acts, and 30 s discarded most of the acting.
|
|
62
|
-
OBSERVATION_WINDOW_SEC = 300
|
|
63
|
-
|
|
64
|
-
#: Tools whose payload naming a recalled memory's content is strong evidence
|
|
65
|
-
#: the memory was actually used, not merely returned.
|
|
66
|
-
_ARTIFACT_TOOLS = frozenset({"Write", "Edit", "NotebookEdit", "MultiEdit"})
|
|
67
|
-
|
|
68
|
-
#: Words carrying no topical signal; overlap on these is noise, and without
|
|
69
|
-
#: this filter every pair of payloads overlaps.
|
|
70
|
-
_STOPWORDS = frozenset("""
|
|
71
|
-
a an the and or but if then than that this these those is are was were be been
|
|
72
|
-
being to of in on at by for with from as it its into over under about after
|
|
73
|
-
before not no nor so such can will would should could may might must do does
|
|
74
|
-
did done have has had i you he she we they them his her their our your my me
|
|
75
|
-
""".split())
|
|
76
|
-
|
|
77
|
-
_TOKEN_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_.\-/]{2,}")
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def tokenize(text: str) -> set[str]:
|
|
81
|
-
"""Content-bearing lowercase tokens, stopwords and short words removed."""
|
|
82
|
-
if not text:
|
|
83
|
-
return set()
|
|
84
|
-
return {
|
|
85
|
-
tok for tok in (m.group(0).lower() for m in _TOKEN_RE.finditer(text))
|
|
86
|
-
if tok not in _STOPWORDS and len(tok) > 2
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
@dataclass
|
|
91
|
-
class EngagementFeatures:
|
|
92
|
-
"""What was observed after one recall. Every field is measured, not inferred.
|
|
93
|
-
|
|
94
|
-
``observed`` is the honest summary: False means nothing happened that this
|
|
95
|
-
module can see, which is a reason to abstain rather than a reason to
|
|
96
|
-
penalise. An agent may have used a memory perfectly and left no trace.
|
|
97
|
-
"""
|
|
98
|
-
|
|
99
|
-
#: Best Jaccard-style overlap between any recalled fact and any following
|
|
100
|
-
#: tool payload, in [0, 1].
|
|
101
|
-
peak_overlap: float = 0.0
|
|
102
|
-
#: Overlap restricted to file-writing tools — the memory reached an artifact.
|
|
103
|
-
artifact_overlap: float = 0.0
|
|
104
|
-
#: A later remember/update_memory overlapping a recalled fact.
|
|
105
|
-
followup_write_overlap: float = 0.0
|
|
106
|
-
#: The same question asked again inside the requery window: the answer did
|
|
107
|
-
#: not satisfy. The one unambiguous negative available.
|
|
108
|
-
requeried: bool = False
|
|
109
|
-
#: Seconds from recall to the first following action, when there was one.
|
|
110
|
-
dwell_sec: float | None = None
|
|
111
|
-
#: Tool events seen in the window at all.
|
|
112
|
-
action_count: int = 0
|
|
113
|
-
#: Which fact ids the overlap landed on, so a reward can be explained.
|
|
114
|
-
matched_fact_ids: list[str] = field(default_factory=list)
|
|
115
|
-
#: A recalled fact's own id appeared verbatim in a later tool event. Rare,
|
|
116
|
-
#: because nothing makes an agent echo it — but unambiguous when it does
|
|
117
|
-
#: happen, so it is kept as the strongest single piece of evidence rather
|
|
118
|
-
#: than discarded along with the ladder that relied on it alone.
|
|
119
|
-
marker_hit: bool = False
|
|
120
|
-
|
|
121
|
-
@property
|
|
122
|
-
def observed(self) -> bool:
|
|
123
|
-
"""Whether anything at all was seen. Drives abstention."""
|
|
124
|
-
return bool(
|
|
125
|
-
self.requeried
|
|
126
|
-
or self.marker_hit
|
|
127
|
-
or self.action_count > 0
|
|
128
|
-
and (
|
|
129
|
-
self.peak_overlap > 0.0
|
|
130
|
-
or self.artifact_overlap > 0.0
|
|
131
|
-
or self.followup_write_overlap > 0.0
|
|
132
|
-
)
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def _table_exists(conn: sqlite3.Connection, name: str) -> bool:
|
|
137
|
-
try:
|
|
138
|
-
return conn.execute(
|
|
139
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (name,),
|
|
140
|
-
).fetchone() is not None
|
|
141
|
-
except sqlite3.Error:
|
|
142
|
-
return False
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def _fact_tokens(conn: sqlite3.Connection, fact_ids: list[str]) -> dict[str, set[str]]:
|
|
146
|
-
"""Content tokens per fact. Entities are folded in when the column exists,
|
|
147
|
-
because a memory's entities are what a later action is most likely to name.
|
|
148
|
-
"""
|
|
149
|
-
if not fact_ids or not _table_exists(conn, "atomic_facts"):
|
|
150
|
-
return {}
|
|
151
|
-
placeholders = ",".join("?" * len(fact_ids))
|
|
152
|
-
try:
|
|
153
|
-
rows = conn.execute(
|
|
154
|
-
f"SELECT fact_id, content, COALESCE(entities_json,'') " # noqa: S608
|
|
155
|
-
f"FROM atomic_facts WHERE fact_id IN ({placeholders})",
|
|
156
|
-
tuple(fact_ids),
|
|
157
|
-
).fetchall()
|
|
158
|
-
except sqlite3.Error:
|
|
159
|
-
return {}
|
|
160
|
-
|
|
161
|
-
out: dict[str, set[str]] = {}
|
|
162
|
-
for fact_id, content, entities_json in rows:
|
|
163
|
-
tokens = tokenize(content or "")
|
|
164
|
-
if entities_json:
|
|
165
|
-
try:
|
|
166
|
-
parsed = json.loads(entities_json)
|
|
167
|
-
except (ValueError, TypeError):
|
|
168
|
-
parsed = None
|
|
169
|
-
if isinstance(parsed, list):
|
|
170
|
-
for ent in parsed:
|
|
171
|
-
tokens |= tokenize(ent if isinstance(ent, str) else str(ent))
|
|
172
|
-
if tokens:
|
|
173
|
-
out[str(fact_id)] = tokens
|
|
174
|
-
return out
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def _following_events(
|
|
178
|
-
conn: sqlite3.Connection,
|
|
179
|
-
session_id: str,
|
|
180
|
-
profile_id: str,
|
|
181
|
-
recalled_at: datetime,
|
|
182
|
-
) -> list[tuple[str, str]]:
|
|
183
|
-
"""(tool_name, payload) for actions in this conversation after the recall.
|
|
184
|
-
|
|
185
|
-
Scoped to the conversation. Without that predicate a busy machine's
|
|
186
|
-
unrelated activity in the same five minutes would read as engagement.
|
|
187
|
-
"""
|
|
188
|
-
if not _table_exists(conn, "tool_events"):
|
|
189
|
-
return []
|
|
190
|
-
start = recalled_at.isoformat()
|
|
191
|
-
end = (recalled_at + timedelta(seconds=OBSERVATION_WINDOW_SEC)).isoformat()
|
|
192
|
-
try:
|
|
193
|
-
cols = {r[1] for r in conn.execute("PRAGMA table_info(tool_events)")}
|
|
194
|
-
except sqlite3.Error:
|
|
195
|
-
return []
|
|
196
|
-
if not {"session_id", "created_at", "tool_name"} <= cols:
|
|
197
|
-
return []
|
|
198
|
-
|
|
199
|
-
sql = (
|
|
200
|
-
"SELECT tool_name, COALESCE(input_summary,'') || ' ' || "
|
|
201
|
-
"COALESCE(output_summary,'') FROM tool_events "
|
|
202
|
-
"WHERE session_id = ? AND created_at > ? AND created_at <= ?"
|
|
203
|
-
)
|
|
204
|
-
params: tuple = (session_id, start, end)
|
|
205
|
-
if "profile_id" in cols:
|
|
206
|
-
sql += " AND (profile_id = ? OR profile_id IS NULL)"
|
|
207
|
-
params += (profile_id,)
|
|
208
|
-
sql += " ORDER BY created_at LIMIT 200"
|
|
209
|
-
try:
|
|
210
|
-
return [(str(r[0]), str(r[1])) for r in conn.execute(sql, params)]
|
|
211
|
-
except sqlite3.Error:
|
|
212
|
-
return []
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
#: A single word in common is coincidence, not evidence. Any two texts about
|
|
216
|
-
#: software share one token eventually, and containment makes that worse: a
|
|
217
|
-
#: memory that reduces to one content word scores a perfect 1.0 against every
|
|
218
|
-
#: payload containing it. Two independent tokens is the cheapest threshold that
|
|
219
|
-
#: distinguishes a shared subject from a shared word.
|
|
220
|
-
_MIN_OVERLAP_TOKENS = 2
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
def _overlap(fact_tokens: set[str], payload_tokens: set[str]) -> float:
|
|
224
|
-
"""Containment of the memory in the action, not symmetric Jaccard.
|
|
225
|
-
|
|
226
|
-
A tool payload is often far larger than a fact, and Jaccard would divide
|
|
227
|
-
that signal away precisely when the evidence is strongest.
|
|
228
|
-
"""
|
|
229
|
-
if not fact_tokens or not payload_tokens:
|
|
230
|
-
return 0.0
|
|
231
|
-
shared = fact_tokens & payload_tokens
|
|
232
|
-
if len(shared) < _MIN_OVERLAP_TOKENS:
|
|
233
|
-
return 0.0
|
|
234
|
-
return len(shared) / len(fact_tokens)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
def extract_features(
|
|
238
|
-
memory_conn: sqlite3.Connection,
|
|
239
|
-
*,
|
|
240
|
-
session_id: str,
|
|
241
|
-
profile_id: str,
|
|
242
|
-
fact_ids: list[str],
|
|
243
|
-
recalled_at: datetime,
|
|
244
|
-
requeried: bool = False,
|
|
245
|
-
marker_hit: bool = False,
|
|
246
|
-
) -> EngagementFeatures:
|
|
247
|
-
"""Observe what followed one recall. Never raises; returns empty on error."""
|
|
248
|
-
features = EngagementFeatures(
|
|
249
|
-
requeried=bool(requeried), marker_hit=bool(marker_hit),
|
|
250
|
-
)
|
|
251
|
-
try:
|
|
252
|
-
by_fact = _fact_tokens(memory_conn, [str(f) for f in fact_ids])
|
|
253
|
-
events = _following_events(memory_conn, session_id, profile_id, recalled_at)
|
|
254
|
-
except sqlite3.Error:
|
|
255
|
-
return features
|
|
256
|
-
|
|
257
|
-
features.action_count = len(events)
|
|
258
|
-
if not by_fact or not events:
|
|
259
|
-
return features
|
|
260
|
-
|
|
261
|
-
matched: set[str] = set()
|
|
262
|
-
for tool_name, payload in events:
|
|
263
|
-
payload_tokens = tokenize(payload)
|
|
264
|
-
if not payload_tokens:
|
|
265
|
-
continue
|
|
266
|
-
for fact_id, tokens in by_fact.items():
|
|
267
|
-
score = _overlap(tokens, payload_tokens)
|
|
268
|
-
if score <= 0.0:
|
|
269
|
-
continue
|
|
270
|
-
matched.add(fact_id)
|
|
271
|
-
features.peak_overlap = max(features.peak_overlap, score)
|
|
272
|
-
if tool_name in _ARTIFACT_TOOLS:
|
|
273
|
-
features.artifact_overlap = max(features.artifact_overlap, score)
|
|
274
|
-
if tool_name.endswith(("remember", "update_memory")):
|
|
275
|
-
features.followup_write_overlap = max(
|
|
276
|
-
features.followup_write_overlap, score,
|
|
277
|
-
)
|
|
278
|
-
features.matched_fact_ids = sorted(matched)
|
|
279
|
-
return features
|
|
@@ -1,309 +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 — LLD-03 §5.4
|
|
4
|
-
|
|
5
|
-
"""Bandit / LightGBM ensemble blender.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
D8 blend policy (``choose_ensemble``):
|
|
9
|
-
- 0..199 signals OR model is None → ``EnsembleWeights(1.0, 0.0)`` (bandit-only).
|
|
10
|
-
- 200..499 signals + model → ``EnsembleWeights(0.4, 0.6)`` (warm blend).
|
|
11
|
-
- 500+ signals + model → ``EnsembleWeights(0.2, 0.8)`` (mature).
|
|
12
|
-
|
|
13
|
-
Hard rules:
|
|
14
|
-
- E1: ``bandit + lgbm == 1.0`` — asserted at construction.
|
|
15
|
-
- E2: ``booster.predict`` called exactly ONCE per rerank (batched).
|
|
16
|
-
- E3: no predict call when ``lgbm_weight == 0.0`` or ``model is None``.
|
|
17
|
-
- E4: both score streams normalised to [0, 1] before blending.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import logging
|
|
23
|
-
import os
|
|
24
|
-
from dataclasses import dataclass
|
|
25
|
-
from typing import Any, Sequence
|
|
26
|
-
|
|
27
|
-
logger = logging.getLogger(__name__)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# Thresholds come from env for ops-time override; defaults match LLD-03 §10.
|
|
31
|
-
_MIN_SIGNALS = int(os.environ.get("SLM_ENSEMBLE_LGBM_MIN_SIGNALS", "200"))
|
|
32
|
-
_DOMINANT_SIGNALS = int(
|
|
33
|
-
os.environ.get("SLM_ENSEMBLE_DOMINANT_MIN_SIGNALS", "500")
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def _parse_blend(value: str, fallback: tuple[float, float]) -> tuple[float, float]:
|
|
38
|
-
"""Parse 'bandit:lgbm' env var into a (bandit, lgbm) tuple."""
|
|
39
|
-
try:
|
|
40
|
-
a_s, b_s = value.split(":", 1)
|
|
41
|
-
a, b = float(a_s), float(b_s)
|
|
42
|
-
if abs((a + b) - 1.0) > 1e-6:
|
|
43
|
-
return fallback
|
|
44
|
-
return (a, b)
|
|
45
|
-
except (ValueError, AttributeError):
|
|
46
|
-
return fallback
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_WARM = _parse_blend(
|
|
50
|
-
os.environ.get("SLM_ENSEMBLE_BLEND_WARM", "0.4:0.6"), (0.4, 0.6),
|
|
51
|
-
)
|
|
52
|
-
_MATURE = _parse_blend(
|
|
53
|
-
os.environ.get("SLM_ENSEMBLE_BLEND_MATURE", "0.2:0.8"), (0.2, 0.8),
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# ---------------------------------------------------------------------------
|
|
58
|
-
# EnsembleWeights
|
|
59
|
-
# ---------------------------------------------------------------------------
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@dataclass(frozen=True, slots=True)
|
|
63
|
-
class EnsembleWeights:
|
|
64
|
-
"""Blend weights for the bandit/LGBM ensemble.
|
|
65
|
-
|
|
66
|
-
E1: ``bandit + lgbm`` must equal 1.0 (±1e-6 float tolerance).
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
bandit: float
|
|
70
|
-
lgbm: float
|
|
71
|
-
|
|
72
|
-
def __post_init__(self) -> None:
|
|
73
|
-
total = self.bandit + self.lgbm
|
|
74
|
-
if abs(total - 1.0) > 1e-6:
|
|
75
|
-
raise AssertionError(
|
|
76
|
-
f"EnsembleWeights must sum to 1.0, got {total}"
|
|
77
|
-
)
|
|
78
|
-
if self.bandit < 0.0 or self.lgbm < 0.0:
|
|
79
|
-
raise AssertionError(
|
|
80
|
-
f"EnsembleWeights must be non-negative, got "
|
|
81
|
-
f"bandit={self.bandit}, lgbm={self.lgbm}"
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def choose_ensemble(
|
|
86
|
-
signal_count: int,
|
|
87
|
-
model: Any | None,
|
|
88
|
-
) -> EnsembleWeights:
|
|
89
|
-
"""Select bandit/LGBM blend per D8.
|
|
90
|
-
|
|
91
|
-
``model`` is typed ``Any`` to avoid importing ``ActiveModel`` at module
|
|
92
|
-
load; in practice it's an ``ActiveModel | None``. Only ``model is None``
|
|
93
|
-
is checked.
|
|
94
|
-
"""
|
|
95
|
-
try:
|
|
96
|
-
count = int(signal_count)
|
|
97
|
-
except (TypeError, ValueError):
|
|
98
|
-
count = 0
|
|
99
|
-
if model is None or count < _MIN_SIGNALS:
|
|
100
|
-
return EnsembleWeights(1.0, 0.0)
|
|
101
|
-
if count < _DOMINANT_SIGNALS:
|
|
102
|
-
return EnsembleWeights(_WARM[0], _WARM[1])
|
|
103
|
-
return EnsembleWeights(_MATURE[0], _MATURE[1])
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# ---------------------------------------------------------------------------
|
|
107
|
-
# Scoring helpers
|
|
108
|
-
# ---------------------------------------------------------------------------
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def _softmax_unit(scores: Sequence[float]) -> list[float]:
|
|
112
|
-
"""Normalise a score stream to [0, 1] via softmax, numerically stable.
|
|
113
|
-
|
|
114
|
-
Preserves ordering. Returns uniform 1/N when all scores are identical.
|
|
115
|
-
"""
|
|
116
|
-
if not scores:
|
|
117
|
-
return []
|
|
118
|
-
xs = list(scores)
|
|
119
|
-
n = len(xs)
|
|
120
|
-
m = max(xs)
|
|
121
|
-
# Subtract max for numerical stability before exp.
|
|
122
|
-
exps = []
|
|
123
|
-
for v in xs:
|
|
124
|
-
try:
|
|
125
|
-
exps.append(pow(2.718281828459045, v - m))
|
|
126
|
-
except OverflowError: # pragma: no cover — m subtraction avoids this
|
|
127
|
-
exps.append(0.0)
|
|
128
|
-
total = sum(exps)
|
|
129
|
-
if total <= 0.0: # pragma: no cover — defensive
|
|
130
|
-
return [1.0 / n] * n
|
|
131
|
-
return [e / total for e in exps]
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _apply_weights_score(candidate: Any, weights: dict[str, float]) -> float:
|
|
135
|
-
"""Compute a scalar bandit score for a candidate under the arm weights.
|
|
136
|
-
|
|
137
|
-
Input shape: candidate has either ``.channel_scores`` attr OR ``score``.
|
|
138
|
-
For v3.4.22 the bandit-only path simply uses the already-weighted ordering
|
|
139
|
-
from ``apply_channel_weights``; this helper only matters when we blend.
|
|
140
|
-
"""
|
|
141
|
-
# Prefer pre-weighted score on the object.
|
|
142
|
-
score = getattr(candidate, "score", None)
|
|
143
|
-
if score is None and isinstance(candidate, dict):
|
|
144
|
-
score = candidate.get("score")
|
|
145
|
-
if score is None:
|
|
146
|
-
# Fallback: sum channel contributions × weights.
|
|
147
|
-
cs = getattr(candidate, "channel_scores", None)
|
|
148
|
-
if cs is None and isinstance(candidate, dict):
|
|
149
|
-
cs = candidate.get("channel_scores", {}) or {}
|
|
150
|
-
cs = cs or {}
|
|
151
|
-
score = sum(
|
|
152
|
-
float(cs.get(name, 0.0)) * float(weights.get(name, 1.0))
|
|
153
|
-
for name in ("semantic", "bm25", "entity_graph", "temporal")
|
|
154
|
-
)
|
|
155
|
-
ce = None
|
|
156
|
-
if hasattr(candidate, "cross_encoder_score"):
|
|
157
|
-
ce = getattr(candidate, "cross_encoder_score", None)
|
|
158
|
-
elif isinstance(candidate, dict):
|
|
159
|
-
ce = candidate.get("cross_encoder_score")
|
|
160
|
-
if ce is not None:
|
|
161
|
-
score += float(ce) * float(
|
|
162
|
-
weights.get("cross_encoder_bias", 1.0)
|
|
163
|
-
)
|
|
164
|
-
try:
|
|
165
|
-
return float(score)
|
|
166
|
-
except (TypeError, ValueError):
|
|
167
|
-
return 0.0
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# ---------------------------------------------------------------------------
|
|
171
|
-
# ensemble_rerank
|
|
172
|
-
# ---------------------------------------------------------------------------
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def ensemble_rerank(
|
|
176
|
-
candidates: list[Any],
|
|
177
|
-
bandit_choice: Any,
|
|
178
|
-
model: Any | None,
|
|
179
|
-
weights: EnsembleWeights,
|
|
180
|
-
query_context: dict[str, Any],
|
|
181
|
-
) -> list[Any]:
|
|
182
|
-
"""Blend bandit + LGBM scores and reorder candidates.
|
|
183
|
-
|
|
184
|
-
E2: ``booster.predict`` called at most ONCE, via a single batched input.
|
|
185
|
-
E3: short-circuits when ``weights.lgbm == 0.0`` or ``model is None``.
|
|
186
|
-
E4: softmax-unit normalisation per stream before blending.
|
|
187
|
-
|
|
188
|
-
Never raises. On error (import / predict), returns input unchanged.
|
|
189
|
-
"""
|
|
190
|
-
if not candidates:
|
|
191
|
-
return candidates
|
|
192
|
-
|
|
193
|
-
# E3: short-circuit.
|
|
194
|
-
if weights.lgbm == 0.0 or model is None:
|
|
195
|
-
return list(candidates)
|
|
196
|
-
|
|
197
|
-
try:
|
|
198
|
-
import numpy as np # noqa: PLC0415 — optional heavy dep
|
|
199
|
-
except ImportError: # pragma: no cover — optional
|
|
200
|
-
logger.debug("ensemble_rerank: numpy unavailable; bandit-only path")
|
|
201
|
-
return list(candidates)
|
|
202
|
-
|
|
203
|
-
# Lazy import so the unit tests don't require lightgbm at import time.
|
|
204
|
-
try:
|
|
205
|
-
from superlocalmemory.learning.features import FeatureExtractor
|
|
206
|
-
except ImportError: # pragma: no cover — defensive
|
|
207
|
-
return list(candidates)
|
|
208
|
-
|
|
209
|
-
# Build batch feature matrix ONCE. PERF-v2-02: also stash a
|
|
210
|
-
# ``{fact_id: features_json}`` dict on ``query_context`` under the
|
|
211
|
-
# reserved key ``_precomputed_features_json`` so the downstream
|
|
212
|
-
# signal_worker (which would otherwise call ``FeatureExtractor.extract``
|
|
213
|
-
# again when recording signals) can reuse this work. No schema change;
|
|
214
|
-
# purely a caller-opt-in cache the signal writer probes.
|
|
215
|
-
try:
|
|
216
|
-
import json as _json # noqa: PLC0415 — local import keeps hot-path clean
|
|
217
|
-
|
|
218
|
-
rows = []
|
|
219
|
-
feats_cache: dict[str, str] = {}
|
|
220
|
-
for c in candidates:
|
|
221
|
-
result = _candidate_to_result(c)
|
|
222
|
-
fv = FeatureExtractor.extract(result, query_context)
|
|
223
|
-
rows.append(fv.to_list())
|
|
224
|
-
fid = getattr(c, "fact_id", None) or result.get("fact_id", "")
|
|
225
|
-
if fid:
|
|
226
|
-
feats_cache[fid] = _json.dumps(
|
|
227
|
-
fv.features, separators=(",", ":"),
|
|
228
|
-
)
|
|
229
|
-
X = np.asarray(rows, dtype=np.float32)
|
|
230
|
-
if isinstance(query_context, dict) and feats_cache:
|
|
231
|
-
# Merge into caller's dict; do not clobber a pre-existing cache.
|
|
232
|
-
existing = query_context.get("_precomputed_features_json") or {}
|
|
233
|
-
if isinstance(existing, dict):
|
|
234
|
-
merged = {**existing, **feats_cache}
|
|
235
|
-
query_context["_precomputed_features_json"] = merged
|
|
236
|
-
except Exception as exc:
|
|
237
|
-
logger.debug("ensemble_rerank: feature build failed: %s", exc)
|
|
238
|
-
return list(candidates)
|
|
239
|
-
|
|
240
|
-
# E2: single batched predict call.
|
|
241
|
-
booster = getattr(model, "booster", None)
|
|
242
|
-
if booster is None or not hasattr(booster, "predict"):
|
|
243
|
-
return list(candidates)
|
|
244
|
-
try:
|
|
245
|
-
lgbm_scores = booster.predict(X)
|
|
246
|
-
except Exception as exc:
|
|
247
|
-
logger.warning("ensemble_rerank: predict failed: %s", exc)
|
|
248
|
-
return list(candidates)
|
|
249
|
-
try:
|
|
250
|
-
lgbm_scores = list(map(float, lgbm_scores))
|
|
251
|
-
except (TypeError, ValueError): # pragma: no cover — defensive
|
|
252
|
-
return list(candidates)
|
|
253
|
-
|
|
254
|
-
arm_weights = (
|
|
255
|
-
bandit_choice.weights if hasattr(bandit_choice, "weights") else {}
|
|
256
|
-
)
|
|
257
|
-
bandit_scores = [
|
|
258
|
-
_apply_weights_score(c, arm_weights) for c in candidates
|
|
259
|
-
]
|
|
260
|
-
|
|
261
|
-
# E4: normalise each stream to [0, 1] via softmax before blending.
|
|
262
|
-
n_lgbm = _softmax_unit(lgbm_scores)
|
|
263
|
-
n_bandit = _softmax_unit(bandit_scores)
|
|
264
|
-
|
|
265
|
-
blended = [
|
|
266
|
-
weights.bandit * b + weights.lgbm * l
|
|
267
|
-
for b, l in zip(n_bandit, n_lgbm)
|
|
268
|
-
]
|
|
269
|
-
|
|
270
|
-
# Retain the model/policy utility for auditability without overwriting the
|
|
271
|
-
# public query-relative relevance score.
|
|
272
|
-
for candidate, utility in zip(candidates, blended):
|
|
273
|
-
if isinstance(candidate, dict):
|
|
274
|
-
candidate["ranking_score"] = float(utility)
|
|
275
|
-
else:
|
|
276
|
-
try:
|
|
277
|
-
candidate.ranking_score = float(utility)
|
|
278
|
-
except (AttributeError, TypeError):
|
|
279
|
-
pass
|
|
280
|
-
|
|
281
|
-
# Stable-sort descending so equal scores preserve original order.
|
|
282
|
-
indexed = list(enumerate(candidates))
|
|
283
|
-
indexed.sort(key=lambda pair: -blended[pair[0]])
|
|
284
|
-
return [c for _, c in indexed]
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
def _candidate_to_result(c: Any) -> dict[str, Any]:
|
|
288
|
-
"""Coerce a candidate (dict / dataclass / ORM row) to a feature result."""
|
|
289
|
-
if isinstance(c, dict):
|
|
290
|
-
return c
|
|
291
|
-
if hasattr(c, "to_result_dict") and callable(c.to_result_dict):
|
|
292
|
-
try:
|
|
293
|
-
return c.to_result_dict()
|
|
294
|
-
except Exception: # pragma: no cover — defensive
|
|
295
|
-
pass
|
|
296
|
-
# Last resort: assemble from common attributes.
|
|
297
|
-
return {
|
|
298
|
-
"fact_id": getattr(c, "fact_id", ""),
|
|
299
|
-
"score": getattr(c, "score", 0.0),
|
|
300
|
-
"channel_scores": getattr(c, "channel_scores", {}) or {},
|
|
301
|
-
"cross_encoder_score": getattr(c, "cross_encoder_score", None),
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
__all__ = (
|
|
306
|
-
"EnsembleWeights",
|
|
307
|
-
"choose_ensemble",
|
|
308
|
-
"ensemble_rerank",
|
|
309
|
-
)
|