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,578 +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 §3.5 + §5.6
|
|
4
|
-
|
|
5
|
-
"""Proxy settlement for bandit plays (v3.4.22 only).
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Replaced in v3.4.22 by ``reward_from_outcomes.py`` — DO NOT extend this
|
|
9
|
-
module beyond the proxy window contract.
|
|
10
|
-
|
|
11
|
-
Policy (§3.5):
|
|
12
|
-
For each ``bandit_plays`` row where ``settled_at IS NULL`` and
|
|
13
|
-
``age(played_at) > 60 s``:
|
|
14
|
-
1. Read top-3 ``learning_signals.fact_id`` for the same query_id.
|
|
15
|
-
2. Search ``tool_events`` within +30 s of played_at, LIKE '%fact_id%'.
|
|
16
|
-
3. If hit → reward=1.0, kind='proxy_position'.
|
|
17
|
-
4. Else if ``_requery_detected`` (NFC topic sig match within 30 s) →
|
|
18
|
-
reward=0.0, kind='proxy_requery'.
|
|
19
|
-
5. Else if ``age(played_at) > 120 s`` → reward=0.5, kind='default'.
|
|
20
|
-
6. Else: skip (not yet settleable).
|
|
21
|
-
|
|
22
|
-
Hard rules:
|
|
23
|
-
- P1: settlement window 60–120 s.
|
|
24
|
-
- P2: requery uses NFC-normalised topic signature from LLD-01 §4.2.
|
|
25
|
-
- B6: never writes raw query text anywhere.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
from __future__ import annotations
|
|
29
|
-
|
|
30
|
-
import json
|
|
31
|
-
import logging
|
|
32
|
-
import sqlite3
|
|
33
|
-
from datetime import datetime, timedelta, timezone
|
|
34
|
-
from pathlib import Path
|
|
35
|
-
from typing import Any
|
|
36
|
-
|
|
37
|
-
from superlocalmemory.learning.engagement_features import (
|
|
38
|
-
EngagementFeatures,
|
|
39
|
-
extract_features,
|
|
40
|
-
)
|
|
41
|
-
from superlocalmemory.learning.reward_model import score
|
|
42
|
-
from superlocalmemory.core.topic_signature import compute_topic_signature
|
|
43
|
-
from superlocalmemory.learning.bandit import ContextualBandit
|
|
44
|
-
|
|
45
|
-
logger = logging.getLogger(__name__)
|
|
46
|
-
|
|
47
|
-
_MIN_AGE_SEC = 60
|
|
48
|
-
_MAX_AGE_SEC = 120
|
|
49
|
-
_EVIDENCE_WINDOW_SEC = 30
|
|
50
|
-
_REQUERY_WINDOW_SEC = 30
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _parse_iso(ts: str) -> datetime | None:
|
|
54
|
-
"""Parse a best-effort ISO timestamp → tz-aware datetime (UTC if naive)."""
|
|
55
|
-
if not ts:
|
|
56
|
-
return None
|
|
57
|
-
try:
|
|
58
|
-
dt = datetime.fromisoformat(ts)
|
|
59
|
-
except ValueError:
|
|
60
|
-
try:
|
|
61
|
-
dt = datetime.strptime(ts, "%Y-%m-%dT%H:%M:%S")
|
|
62
|
-
except ValueError:
|
|
63
|
-
return None
|
|
64
|
-
if dt.tzinfo is None:
|
|
65
|
-
dt = dt.replace(tzinfo=timezone.utc)
|
|
66
|
-
return dt
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def _open(db_path: Path) -> sqlite3.Connection | None:
|
|
70
|
-
try:
|
|
71
|
-
conn = sqlite3.connect(str(db_path), timeout=5.0)
|
|
72
|
-
conn.row_factory = sqlite3.Row
|
|
73
|
-
return conn
|
|
74
|
-
except sqlite3.Error as exc:
|
|
75
|
-
logger.debug("reward_proxy: open %s failed: %s", db_path, exc)
|
|
76
|
-
return None
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def _fetch_unsettled(
|
|
80
|
-
learning_conn: sqlite3.Connection,
|
|
81
|
-
profile_id: str,
|
|
82
|
-
now: datetime,
|
|
83
|
-
) -> list[sqlite3.Row]:
|
|
84
|
-
try:
|
|
85
|
-
# shown_fact_ids arrives with M044; the NULL alias keeps this working
|
|
86
|
-
# on a store where it has not run yet.
|
|
87
|
-
for columns in (
|
|
88
|
-
"play_id, query_id, played_at, stratum, shown_fact_ids",
|
|
89
|
-
"play_id, query_id, played_at, stratum, NULL AS shown_fact_ids",
|
|
90
|
-
):
|
|
91
|
-
try:
|
|
92
|
-
return learning_conn.execute(
|
|
93
|
-
f"SELECT {columns} FROM bandit_plays "
|
|
94
|
-
"WHERE profile_id = ? AND settled_at IS NULL "
|
|
95
|
-
"ORDER BY played_at ASC LIMIT 500",
|
|
96
|
-
(profile_id,),
|
|
97
|
-
).fetchall()
|
|
98
|
-
except sqlite3.Error:
|
|
99
|
-
continue
|
|
100
|
-
return []
|
|
101
|
-
except sqlite3.Error as exc:
|
|
102
|
-
logger.debug("reward_proxy: fetch_unsettled: %s", exc)
|
|
103
|
-
return []
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def _shown_fact_ids(
|
|
107
|
-
learning_conn: sqlite3.Connection,
|
|
108
|
-
play_id: int,
|
|
109
|
-
) -> list[str]:
|
|
110
|
-
"""The fact_ids this play recorded at recall time (M044), or [].
|
|
111
|
-
|
|
112
|
-
Preferred over the ``learning_signals`` lookup below because it does not
|
|
113
|
-
depend on the exposure enqueue, which is off because it wrote a row per
|
|
114
|
-
displayed memory per query and badly inflated the ranking-phase counter.
|
|
115
|
-
With no signals rows there is nothing to look for, so plays fell through to
|
|
116
|
-
the age-based default and arms stayed on their priors.
|
|
117
|
-
|
|
118
|
-
Returns [] on a store where M044 has not run — "no such column" is an
|
|
119
|
-
``sqlite3.Error`` and is caught, so an unmigrated install falls back to the
|
|
120
|
-
old lookup rather than losing settlement entirely.
|
|
121
|
-
"""
|
|
122
|
-
try:
|
|
123
|
-
row = learning_conn.execute(
|
|
124
|
-
"SELECT shown_fact_ids FROM bandit_plays WHERE play_id = ?",
|
|
125
|
-
(int(play_id),),
|
|
126
|
-
).fetchone()
|
|
127
|
-
except sqlite3.Error:
|
|
128
|
-
return []
|
|
129
|
-
raw = (row[0] if row else None) or ""
|
|
130
|
-
if not raw:
|
|
131
|
-
return []
|
|
132
|
-
try:
|
|
133
|
-
parsed = json.loads(raw)
|
|
134
|
-
except (TypeError, ValueError):
|
|
135
|
-
return []
|
|
136
|
-
if not isinstance(parsed, list):
|
|
137
|
-
return []
|
|
138
|
-
return [str(f) for f in parsed[:3] if f]
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def _top3_fact_ids(
|
|
142
|
-
learning_conn: sqlite3.Connection,
|
|
143
|
-
query_id: str,
|
|
144
|
-
) -> list[str]:
|
|
145
|
-
"""Return up to 3 fact_ids for this query_id ordered by position ASC.
|
|
146
|
-
|
|
147
|
-
Returns [] if learning_signals is missing or has no rows for this qid.
|
|
148
|
-
Kept as the fallback for plays written before M044 and for installs that
|
|
149
|
-
do run the exposure enqueue.
|
|
150
|
-
"""
|
|
151
|
-
try:
|
|
152
|
-
rows = learning_conn.execute(
|
|
153
|
-
"SELECT fact_id FROM learning_signals "
|
|
154
|
-
"WHERE query_id = ? AND position < 3 "
|
|
155
|
-
"ORDER BY position ASC LIMIT 3",
|
|
156
|
-
(query_id,),
|
|
157
|
-
).fetchall()
|
|
158
|
-
except sqlite3.Error:
|
|
159
|
-
return []
|
|
160
|
-
return [r[0] for r in rows if r and r[0]]
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def _tool_event_hit(
|
|
164
|
-
memory_conn: sqlite3.Connection,
|
|
165
|
-
played_at: datetime,
|
|
166
|
-
fact_ids: list[str],
|
|
167
|
-
profile_id: str | None = None,
|
|
168
|
-
) -> bool:
|
|
169
|
-
"""True iff any tool_events row references any fact_id within +30 s.
|
|
170
|
-
|
|
171
|
-
Tenant-scoped: without a profile predicate, one tenant's reward signal
|
|
172
|
-
would be reinforced by another tenant's tool events firing in the same
|
|
173
|
-
30 s window — cross-contaminated behavioral learning.
|
|
174
|
-
"""
|
|
175
|
-
if not fact_ids:
|
|
176
|
-
return False
|
|
177
|
-
start = played_at.isoformat(timespec="seconds")
|
|
178
|
-
end = (played_at + timedelta(seconds=_EVIDENCE_WINDOW_SEC)).isoformat(
|
|
179
|
-
timespec="seconds",
|
|
180
|
-
)
|
|
181
|
-
# tool_events schema varies by install; we check for the table first.
|
|
182
|
-
try:
|
|
183
|
-
tbl = memory_conn.execute(
|
|
184
|
-
"SELECT name FROM sqlite_master "
|
|
185
|
-
"WHERE type='table' AND name='tool_events'"
|
|
186
|
-
).fetchone()
|
|
187
|
-
if tbl is None:
|
|
188
|
-
return False
|
|
189
|
-
except sqlite3.Error:
|
|
190
|
-
return False
|
|
191
|
-
|
|
192
|
-
# E.2 (v3.4.22 perf): previously ran N separate LIKE '%fid%' scans,
|
|
193
|
-
# each doing a full table scan of ``tool_events`` inside the 30-second
|
|
194
|
-
# window. Instead, fetch the small window once and scan its payloads
|
|
195
|
-
# in Python — typically 0-few rows in a 30 s window, far cheaper than
|
|
196
|
-
# N LIKE passes against a growing table. Still O(rows_in_window * len(fact_ids))
|
|
197
|
-
# worst case but the constant factor is tiny (a substring check).
|
|
198
|
-
# Add the profile predicate only when tool_events actually has the column
|
|
199
|
-
# (schema varies by install).
|
|
200
|
-
scope_sql, scope_params = "", ()
|
|
201
|
-
if profile_id is not None:
|
|
202
|
-
try:
|
|
203
|
-
cols = {r[1] for r in memory_conn.execute(
|
|
204
|
-
"PRAGMA table_info(tool_events)").fetchall()}
|
|
205
|
-
if "profile_id" in cols:
|
|
206
|
-
scope_sql = " AND profile_id = ?"
|
|
207
|
-
scope_params = (profile_id,)
|
|
208
|
-
except sqlite3.Error:
|
|
209
|
-
pass
|
|
210
|
-
try:
|
|
211
|
-
candidate_rows = memory_conn.execute(
|
|
212
|
-
"SELECT payload_json FROM tool_events "
|
|
213
|
-
"WHERE occurred_at BETWEEN ? AND ? "
|
|
214
|
-
" AND payload_json IS NOT NULL" + scope_sql,
|
|
215
|
-
(start, end, *scope_params),
|
|
216
|
-
).fetchall()
|
|
217
|
-
except sqlite3.Error:
|
|
218
|
-
return False
|
|
219
|
-
if not candidate_rows:
|
|
220
|
-
return False
|
|
221
|
-
fid_list = [fid for fid in fact_ids if fid]
|
|
222
|
-
if not fid_list:
|
|
223
|
-
return False
|
|
224
|
-
for row in candidate_rows:
|
|
225
|
-
payload = row[0] or ""
|
|
226
|
-
for fid in fid_list:
|
|
227
|
-
if fid in payload:
|
|
228
|
-
return True
|
|
229
|
-
return False
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def _requery_detected(
|
|
233
|
-
memory_conn: sqlite3.Connection,
|
|
234
|
-
played_at: datetime,
|
|
235
|
-
query_id: str,
|
|
236
|
-
profile_id: str | None = None,
|
|
237
|
-
) -> bool:
|
|
238
|
-
"""True iff a follow-up query within 30 s has matching NFC topic sig.
|
|
239
|
-
|
|
240
|
-
Uses the same topic-signature algorithm as LLD-01 §4.2. The original
|
|
241
|
-
query text is NOT stored (B6) — we need the hash that was computed at
|
|
242
|
-
recall time. Two schemas cover this:
|
|
243
|
-
|
|
244
|
-
1. learning_signals.query_text_hash — populated by signal_worker.
|
|
245
|
-
2. Any requery logged as a tool_event with a topic-signature field.
|
|
246
|
-
|
|
247
|
-
We do (1). The window is the next 30 s after played_at.
|
|
248
|
-
"""
|
|
249
|
-
start = played_at.isoformat(timespec="seconds")
|
|
250
|
-
end = (played_at + timedelta(seconds=_REQUERY_WINDOW_SEC)).isoformat(
|
|
251
|
-
timespec="seconds",
|
|
252
|
-
)
|
|
253
|
-
# Look up the play's own query hash on memory_conn's learning-mirror IF
|
|
254
|
-
# it exists — otherwise skip quietly.
|
|
255
|
-
try:
|
|
256
|
-
tbl = memory_conn.execute(
|
|
257
|
-
"SELECT name FROM sqlite_master "
|
|
258
|
-
"WHERE type='table' AND name='tool_events'"
|
|
259
|
-
).fetchone()
|
|
260
|
-
except sqlite3.Error:
|
|
261
|
-
return False
|
|
262
|
-
if tbl is None:
|
|
263
|
-
return False
|
|
264
|
-
|
|
265
|
-
# Tenant scope (guarded — tool_events schema varies): without it, another
|
|
266
|
-
# profile's recall events in the same window count as this profile's
|
|
267
|
-
# requeries, corrupting reward attribution.
|
|
268
|
-
scope_sql, scope_params = "", ()
|
|
269
|
-
if profile_id is not None:
|
|
270
|
-
try:
|
|
271
|
-
cols = {r[1] for r in memory_conn.execute(
|
|
272
|
-
"PRAGMA table_info(tool_events)").fetchall()}
|
|
273
|
-
if "profile_id" in cols:
|
|
274
|
-
scope_sql = " AND profile_id = ?"
|
|
275
|
-
scope_params = (profile_id,)
|
|
276
|
-
except sqlite3.Error:
|
|
277
|
-
pass
|
|
278
|
-
|
|
279
|
-
# Read *query* text from tool_events payload for within-window events;
|
|
280
|
-
# compute topic sig on each, compare against the original query's sig.
|
|
281
|
-
try:
|
|
282
|
-
rows = memory_conn.execute(
|
|
283
|
-
"SELECT payload_json FROM tool_events "
|
|
284
|
-
"WHERE occurred_at > ? AND occurred_at <= ? "
|
|
285
|
-
" AND tool_name = 'recall'" + scope_sql + " LIMIT 20",
|
|
286
|
-
(start, end, *scope_params),
|
|
287
|
-
).fetchall()
|
|
288
|
-
except sqlite3.Error:
|
|
289
|
-
return False
|
|
290
|
-
if not rows:
|
|
291
|
-
return False
|
|
292
|
-
|
|
293
|
-
# We don't have the original query text on the bandit row (B6).
|
|
294
|
-
# The original is recoverable via tool_events at played_at (recall event).
|
|
295
|
-
try:
|
|
296
|
-
seed_row = memory_conn.execute(
|
|
297
|
-
"SELECT payload_json FROM tool_events "
|
|
298
|
-
"WHERE occurred_at <= ? AND tool_name = 'recall'" + scope_sql + " "
|
|
299
|
-
"ORDER BY occurred_at DESC LIMIT 1",
|
|
300
|
-
(played_at.isoformat(timespec="seconds"), *scope_params),
|
|
301
|
-
).fetchone()
|
|
302
|
-
except sqlite3.Error:
|
|
303
|
-
seed_row = None
|
|
304
|
-
seed_query = _extract_query(seed_row[0] if seed_row else None)
|
|
305
|
-
if not seed_query:
|
|
306
|
-
return False
|
|
307
|
-
# P2: NFC-normalised topic signature.
|
|
308
|
-
seed_sig = compute_topic_signature(seed_query)
|
|
309
|
-
for r in rows:
|
|
310
|
-
q = _extract_query(r[0])
|
|
311
|
-
if not q:
|
|
312
|
-
continue
|
|
313
|
-
if compute_topic_signature(q) == seed_sig:
|
|
314
|
-
return True
|
|
315
|
-
return False
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def _extract_query(payload_json: str | None) -> str:
|
|
319
|
-
"""Pull a ``query`` / ``text`` field out of a tool_events payload."""
|
|
320
|
-
if not payload_json:
|
|
321
|
-
return ""
|
|
322
|
-
try:
|
|
323
|
-
import json as _json
|
|
324
|
-
obj = _json.loads(payload_json)
|
|
325
|
-
except (ValueError, TypeError):
|
|
326
|
-
return ""
|
|
327
|
-
if not isinstance(obj, dict):
|
|
328
|
-
return ""
|
|
329
|
-
for key in ("query", "text", "prompt"):
|
|
330
|
-
v = obj.get(key)
|
|
331
|
-
if isinstance(v, str) and v:
|
|
332
|
-
return v
|
|
333
|
-
return ""
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
def _default_deadline(
|
|
337
|
-
learning_conn: sqlite3.Connection, play: sqlite3.Row,
|
|
338
|
-
) -> float:
|
|
339
|
-
"""Age in seconds at which this play may be defaulted to 0.5.
|
|
340
|
-
|
|
341
|
-
120 s for a play that recorded nothing — no evidence can ever arrive for
|
|
342
|
-
it, so holding it open buys nothing but an unsettled row.
|
|
343
|
-
|
|
344
|
-
Longer for a play that recorded which memories it showed (M044), because a
|
|
345
|
-
reported outcome CAN settle it and two minutes is not long enough for
|
|
346
|
-
anyone to decide whether an answer helped. Defaulting first would make the
|
|
347
|
-
neutral fallback win a race it should not be in — which is how 1,405
|
|
348
|
-
consecutive plays came to apply exactly 0.5.
|
|
349
|
-
"""
|
|
350
|
-
try:
|
|
351
|
-
from superlocalmemory.learning.reward_from_outcomes import GRACE_SEC
|
|
352
|
-
except Exception: # pragma: no cover — defensive
|
|
353
|
-
return float(_MAX_AGE_SEC)
|
|
354
|
-
try:
|
|
355
|
-
raw = play["shown_fact_ids"]
|
|
356
|
-
except (IndexError, KeyError):
|
|
357
|
-
return float(_MAX_AGE_SEC)
|
|
358
|
-
# PARSE, do not test the raw string. "[]" is truthy, so a play that recorded
|
|
359
|
-
# no memories used to buy the full grace window it could never use: nothing
|
|
360
|
-
# can overlap an empty set, so it stayed unsettled forever, and the
|
|
361
|
-
# retention sweep only removes SETTLED rows. Reproduced: "[]" returned
|
|
362
|
-
# 900 s where it should return 120 s.
|
|
363
|
-
try:
|
|
364
|
-
parsed = json.loads(raw) if raw else []
|
|
365
|
-
except (TypeError, ValueError):
|
|
366
|
-
parsed = []
|
|
367
|
-
has_evidence = bool(parsed) if isinstance(parsed, list) else False
|
|
368
|
-
return (
|
|
369
|
-
max(float(_MAX_AGE_SEC), GRACE_SEC) if has_evidence
|
|
370
|
-
else float(_MAX_AGE_SEC)
|
|
371
|
-
)
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
#: Once a play is older than this with nothing observed, it is closed without
|
|
375
|
-
#: touching the posterior. Leaving it open forever would make every settler
|
|
376
|
-
#: pass rescan it; settling it at a neutral value is what this module stopped
|
|
377
|
-
#: doing. Closed-and-unjudged is the third option that was missing.
|
|
378
|
-
_ABSTAIN_EXPIRY_SEC = 900
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
def _expire_play(learning_conn: sqlite3.Connection, play_id: int) -> bool:
|
|
382
|
-
"""Close a play without applying any reward.
|
|
383
|
-
|
|
384
|
-
The posterior is deliberately untouched: nothing was observed, so there is
|
|
385
|
-
nothing to learn, and a neutral update would shrink the arm's variance
|
|
386
|
-
around its prior and make it harder to move once evidence does arrive.
|
|
387
|
-
"""
|
|
388
|
-
try:
|
|
389
|
-
learning_conn.execute(
|
|
390
|
-
"UPDATE bandit_plays SET settled_at = ?, settlement_type = ? "
|
|
391
|
-
"WHERE play_id = ? AND settled_at IS NULL",
|
|
392
|
-
(datetime.now(timezone.utc).isoformat(), "unobserved", int(play_id)),
|
|
393
|
-
)
|
|
394
|
-
learning_conn.commit()
|
|
395
|
-
return True
|
|
396
|
-
except sqlite3.Error as exc:
|
|
397
|
-
logger.debug("reward_proxy: expire play %s: %s", play_id, exc)
|
|
398
|
-
return False
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
def _session_for_play(
|
|
402
|
-
memory_conn: sqlite3.Connection | None,
|
|
403
|
-
query_id: str,
|
|
404
|
-
played_at: datetime,
|
|
405
|
-
profile_id: str,
|
|
406
|
-
) -> str:
|
|
407
|
-
"""The conversation this play happened in, or "" when it cannot be named.
|
|
408
|
-
|
|
409
|
-
The play and its outcome ticket are minted with different uuids on the same
|
|
410
|
-
recall, so the query_id is tried first and a time-and-profile match is the
|
|
411
|
-
fallback. An empty answer means no observation is possible, which the
|
|
412
|
-
caller turns into an abstention rather than a guess.
|
|
413
|
-
"""
|
|
414
|
-
if memory_conn is None:
|
|
415
|
-
return ""
|
|
416
|
-
try:
|
|
417
|
-
row = memory_conn.execute(
|
|
418
|
-
"SELECT session_id FROM pending_outcomes WHERE recall_query_id = ? "
|
|
419
|
-
"LIMIT 1", (str(query_id),),
|
|
420
|
-
).fetchone()
|
|
421
|
-
if row and row[0]:
|
|
422
|
-
return str(row[0])
|
|
423
|
-
window_ms = 5000
|
|
424
|
-
centre = int(played_at.timestamp() * 1000)
|
|
425
|
-
row = memory_conn.execute(
|
|
426
|
-
"SELECT session_id FROM pending_outcomes "
|
|
427
|
-
"WHERE profile_id = ? AND created_at_ms BETWEEN ? AND ? "
|
|
428
|
-
"ORDER BY ABS(created_at_ms - ?) LIMIT 1",
|
|
429
|
-
(str(profile_id), centre - window_ms, centre + window_ms, centre),
|
|
430
|
-
).fetchone()
|
|
431
|
-
return str(row[0]) if row and row[0] else ""
|
|
432
|
-
except sqlite3.Error:
|
|
433
|
-
return ""
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
def _ips_for_play(
|
|
437
|
-
learning_conn: sqlite3.Connection, play_id: int, stratum: str, profile_id: str,
|
|
438
|
-
):
|
|
439
|
-
"""Inverse-propensity weight for this play against its stratum's arms."""
|
|
440
|
-
from superlocalmemory.learning.propensity import ips_weight
|
|
441
|
-
|
|
442
|
-
try:
|
|
443
|
-
row = learning_conn.execute(
|
|
444
|
-
"SELECT arm_id FROM bandit_plays WHERE play_id = ?", (int(play_id),),
|
|
445
|
-
).fetchone()
|
|
446
|
-
if not row or not row[0]:
|
|
447
|
-
return ips_weight(None, None)
|
|
448
|
-
arm_id = str(row[0])
|
|
449
|
-
rows = learning_conn.execute(
|
|
450
|
-
"SELECT arm_id, alpha, beta FROM bandit_arms "
|
|
451
|
-
"WHERE profile_id = ? AND stratum = ?",
|
|
452
|
-
(str(profile_id), str(stratum or "")),
|
|
453
|
-
).fetchall()
|
|
454
|
-
except sqlite3.Error:
|
|
455
|
-
return ips_weight(None, None)
|
|
456
|
-
|
|
457
|
-
mine, others = None, []
|
|
458
|
-
for candidate, alpha, beta in rows:
|
|
459
|
-
if str(candidate) == arm_id:
|
|
460
|
-
mine = (float(alpha), float(beta))
|
|
461
|
-
else:
|
|
462
|
-
others.append((float(alpha), float(beta)))
|
|
463
|
-
return ips_weight(mine, others)
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
def settle_stale_plays(
|
|
467
|
-
profile_id: str,
|
|
468
|
-
db_path: Path | str,
|
|
469
|
-
tool_events_db: Path | str,
|
|
470
|
-
*,
|
|
471
|
-
now: datetime | None = None,
|
|
472
|
-
bandit: ContextualBandit | None = None,
|
|
473
|
-
) -> int:
|
|
474
|
-
"""Settle every unsettled bandit play whose evidence window has passed.
|
|
475
|
-
|
|
476
|
-
Returns the number of plays settled. Never raises.
|
|
477
|
-
"""
|
|
478
|
-
current = now if now is not None else datetime.now(timezone.utc)
|
|
479
|
-
learning_conn = _open(Path(db_path))
|
|
480
|
-
if learning_conn is None:
|
|
481
|
-
return 0
|
|
482
|
-
|
|
483
|
-
# tool_events lives in memory.db; if missing, evidence lookups simply fail.
|
|
484
|
-
memory_conn = _open(Path(tool_events_db))
|
|
485
|
-
owns_bandit = bandit is None
|
|
486
|
-
if bandit is None:
|
|
487
|
-
bandit = ContextualBandit(Path(db_path), profile_id=str(profile_id))
|
|
488
|
-
|
|
489
|
-
settled = 0
|
|
490
|
-
try:
|
|
491
|
-
rows = _fetch_unsettled(learning_conn, str(profile_id), current)
|
|
492
|
-
for row in rows:
|
|
493
|
-
played = _parse_iso(row["played_at"])
|
|
494
|
-
if played is None:
|
|
495
|
-
continue
|
|
496
|
-
age = (current - played).total_seconds()
|
|
497
|
-
if age < _MIN_AGE_SEC:
|
|
498
|
-
continue # not yet settleable
|
|
499
|
-
|
|
500
|
-
# The play's own record first; the signals table only as a
|
|
501
|
-
# fallback for rows written before M044.
|
|
502
|
-
top3 = (
|
|
503
|
-
_shown_fact_ids(learning_conn, row["play_id"])
|
|
504
|
-
or _top3_fact_ids(learning_conn, row["query_id"])
|
|
505
|
-
)
|
|
506
|
-
# The ladder this replaces asked one question — did a recalled
|
|
507
|
-
# fact_id appear verbatim in a later tool event — and answered 0.5
|
|
508
|
-
# whenever it could not tell. Both halves failed: nothing makes an
|
|
509
|
-
# agent echo the marker, and 0.5 is not an absence of judgement but
|
|
510
|
-
# a confident one, tightening the posterior around its prior.
|
|
511
|
-
requeried = bool(
|
|
512
|
-
memory_conn is not None and _requery_detected(
|
|
513
|
-
memory_conn, played, row["query_id"],
|
|
514
|
-
profile_id=str(profile_id),
|
|
515
|
-
)
|
|
516
|
-
)
|
|
517
|
-
marker_hit = bool(
|
|
518
|
-
memory_conn is not None and _tool_event_hit(
|
|
519
|
-
memory_conn, played, top3, profile_id=str(profile_id),
|
|
520
|
-
)
|
|
521
|
-
)
|
|
522
|
-
session_id = _session_for_play(
|
|
523
|
-
memory_conn, str(row["query_id"] or ""), played, str(profile_id),
|
|
524
|
-
)
|
|
525
|
-
if memory_conn is not None and session_id:
|
|
526
|
-
features = extract_features(
|
|
527
|
-
memory_conn,
|
|
528
|
-
session_id=session_id,
|
|
529
|
-
profile_id=str(profile_id),
|
|
530
|
-
fact_ids=top3,
|
|
531
|
-
recalled_at=played,
|
|
532
|
-
requeried=requeried,
|
|
533
|
-
marker_hit=marker_hit,
|
|
534
|
-
)
|
|
535
|
-
else:
|
|
536
|
-
features = EngagementFeatures(
|
|
537
|
-
requeried=requeried, marker_hit=marker_hit,
|
|
538
|
-
)
|
|
539
|
-
|
|
540
|
-
decision = score(features)
|
|
541
|
-
if decision.reward is None:
|
|
542
|
-
# Nothing observed. Wait while the window is still open, then
|
|
543
|
-
# close the play unjudged rather than inventing a number.
|
|
544
|
-
if age > _ABSTAIN_EXPIRY_SEC:
|
|
545
|
-
_expire_play(learning_conn, int(row["play_id"]))
|
|
546
|
-
continue
|
|
547
|
-
|
|
548
|
-
estimate = _ips_for_play(
|
|
549
|
-
learning_conn, int(row["play_id"]),
|
|
550
|
-
str(row["stratum"] or ""), str(profile_id),
|
|
551
|
-
)
|
|
552
|
-
if bandit.update(
|
|
553
|
-
int(row["play_id"]), decision.reward,
|
|
554
|
-
kind=decision.kind, weight=estimate.weight,
|
|
555
|
-
):
|
|
556
|
-
settled += 1
|
|
557
|
-
finally:
|
|
558
|
-
try:
|
|
559
|
-
learning_conn.close()
|
|
560
|
-
except sqlite3.Error: # pragma: no cover
|
|
561
|
-
pass
|
|
562
|
-
if memory_conn is not None:
|
|
563
|
-
try:
|
|
564
|
-
memory_conn.close()
|
|
565
|
-
except sqlite3.Error: # pragma: no cover
|
|
566
|
-
pass
|
|
567
|
-
# v3.4.33: close the threadlocal bandit connection so pool threads
|
|
568
|
-
# from asyncio.to_thread don't leak file descriptors to learning.db.
|
|
569
|
-
try:
|
|
570
|
-
from superlocalmemory.learning.bandit import close_threadlocal_conn
|
|
571
|
-
close_threadlocal_conn()
|
|
572
|
-
except Exception: # pragma: no cover — defensive
|
|
573
|
-
pass
|
|
574
|
-
|
|
575
|
-
return settled
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
__all__ = ("settle_stale_plays",)
|