superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Settle a bandit play from an authenticated outcome.
|
|
5
|
-
|
|
6
|
-
WHY THIS FILE EXISTS
|
|
7
|
-
--------------------
|
|
8
|
-
``reward_proxy.py`` has said since v3.4.22:
|
|
9
|
-
|
|
10
|
-
Replaced in v3.4.22 by ``reward_from_outcomes.py`` — DO NOT extend this
|
|
11
|
-
module beyond the proxy window contract.
|
|
12
|
-
|
|
13
|
-
That file was never written. So the replacement never arrived, and the module
|
|
14
|
-
that tells you not to extend it remained the only settlement path — one that
|
|
15
|
-
cannot work. Measured, not inferred:
|
|
16
|
-
|
|
17
|
-
* ``reward_proxy._tool_event_hit`` selects ``payload_json`` from ``tool_events``
|
|
18
|
-
``WHERE occurred_at BETWEEN ? AND ?``. **Neither column exists** on that
|
|
19
|
-
table, on this install or in any DDL in the codebase. The query raises
|
|
20
|
-
``no such column: payload_json``, a bare ``except sqlite3.Error`` returns
|
|
21
|
-
False, and the "cited" branch of the ladder is therefore unreachable.
|
|
22
|
-
* Even with the names corrected there would be nothing to find: **0 of 2,002**
|
|
23
|
-
``tool_events`` rows on a live store contain a 16-hex token, let alone a
|
|
24
|
-
real ``fact_id``. That table records tool names and summaries, not the
|
|
25
|
-
memories a recall returned.
|
|
26
|
-
|
|
27
|
-
So every settlement fell through to the 120-second default of 0.5, which is
|
|
28
|
-
visible in the arms as an exact tie::
|
|
29
|
-
|
|
30
|
-
SUM(alpha) = SUM(beta) = 867.5 = 165 priors + 1,405 plays x 0.5
|
|
31
|
-
|
|
32
|
-
WHAT THIS USES INSTEAD
|
|
33
|
-
----------------------
|
|
34
|
-
``action_outcomes`` (memory.db, M006) — the table an *explicit* outcome report
|
|
35
|
-
already writes, with a reward the reporter chose:
|
|
36
|
-
``success=1.0 / failure=0.0 / partial=0.5``. That is an authenticated signal
|
|
37
|
-
about whether the memories helped, which is exactly what a play needs and what
|
|
38
|
-
an exposure is not.
|
|
39
|
-
|
|
40
|
-
It carries ``recall_query_id``, a join key straight to ``bandit_plays.query_id``.
|
|
41
|
-
**0 of 162 rows populate it** — the column was added and never written. This
|
|
42
|
-
module reads it when present, and otherwise falls back to overlap between the
|
|
43
|
-
outcome's ``fact_ids_json`` and the ``shown_fact_ids`` the play recorded (M044).
|
|
44
|
-
|
|
45
|
-
The fallback is the load-bearing path, not a nicety: recall does not return its
|
|
46
|
-
``query_id`` to the caller (``server/recall_serializer.py`` has no such field),
|
|
47
|
-
so no existing client *can* supply one. Overlap on the memories actually shown,
|
|
48
|
-
inside a time window, is the strongest link available without changing every
|
|
49
|
-
caller first.
|
|
50
|
-
|
|
51
|
-
THE GRACE WINDOW, AND WHY IT IS NOT 120 SECONDS
|
|
52
|
-
-----------------------------------------------
|
|
53
|
-
``reward_proxy`` defaults a play to 0.5 once it is 120 seconds old. A human or
|
|
54
|
-
an agent deciding whether a memory helped does not do so within two minutes, so
|
|
55
|
-
that deadline would claim every play before any real outcome arrived — the
|
|
56
|
-
default would win a race it should not be in.
|
|
57
|
-
|
|
58
|
-
A play that recorded ``shown_fact_ids`` therefore waits ``_GRACE_SEC`` (default
|
|
59
|
-
900) before it may be defaulted. A play with no recorded facts keeps the old
|
|
60
|
-
120-second behaviour, because nothing can ever settle it from evidence and
|
|
61
|
-
holding it open buys nothing.
|
|
62
|
-
|
|
63
|
-
NOTHING HERE FABRICATES A REWARD. If no outcome is reported, the play settles
|
|
64
|
-
neutral and is *labelled* ``default`` so it stays distinguishable from a
|
|
65
|
-
genuinely neutral outcome. Those two were indistinguishable before, which is why
|
|
66
|
-
this went unnoticed for months.
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
from __future__ import annotations
|
|
70
|
-
|
|
71
|
-
import json
|
|
72
|
-
import logging
|
|
73
|
-
import os
|
|
74
|
-
import sqlite3
|
|
75
|
-
from datetime import datetime, timedelta, timezone
|
|
76
|
-
from pathlib import Path
|
|
77
|
-
|
|
78
|
-
from superlocalmemory.learning.bandit import ContextualBandit
|
|
79
|
-
from superlocalmemory.learning.pcos import update_scores
|
|
80
|
-
|
|
81
|
-
logger = logging.getLogger(__name__)
|
|
82
|
-
|
|
83
|
-
__all__ = ["settle_from_outcomes", "GRACE_SEC", "SETTLEMENT_KIND"]
|
|
84
|
-
|
|
85
|
-
#: How long a play that recorded its shown memories waits for a reported
|
|
86
|
-
#: outcome before it may be defaulted. Deliberately far longer than the proxy's
|
|
87
|
-
#: 120 s: see the module docstring.
|
|
88
|
-
GRACE_SEC: float = float(os.environ.get("SLM_OUTCOME_GRACE_SEC", "900"))
|
|
89
|
-
|
|
90
|
-
#: How far after a play an outcome may arrive and still be attributed to it.
|
|
91
|
-
#: Same order as the grace window — an outcome reported later than this is about
|
|
92
|
-
#: something else.
|
|
93
|
-
_MATCH_WINDOW_SEC: float = GRACE_SEC
|
|
94
|
-
|
|
95
|
-
#: Written to ``bandit_plays.settlement_type``. A settlement that came from a
|
|
96
|
-
#: real report must never be mistaken for the neutral default.
|
|
97
|
-
SETTLEMENT_KIND = "outcome_reported"
|
|
98
|
-
|
|
99
|
-
_MAX_PLAYS_PER_PASS = 500
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def _parse_iso(ts: str | None) -> datetime | None:
|
|
103
|
-
if not ts:
|
|
104
|
-
return None
|
|
105
|
-
raw = str(ts).replace("Z", "+00:00")
|
|
106
|
-
try:
|
|
107
|
-
dt = datetime.fromisoformat(raw)
|
|
108
|
-
except ValueError:
|
|
109
|
-
return None
|
|
110
|
-
return dt if dt.tzinfo else dt.replace(tzinfo=timezone.utc)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _open(path: Path) -> sqlite3.Connection | None:
|
|
114
|
-
try:
|
|
115
|
-
conn = sqlite3.connect(str(path), timeout=5.0)
|
|
116
|
-
conn.row_factory = sqlite3.Row
|
|
117
|
-
return conn
|
|
118
|
-
except sqlite3.Error as exc:
|
|
119
|
-
logger.debug("reward_from_outcomes: open %s failed: %s", path, exc)
|
|
120
|
-
return None
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
def _shown(raw: object) -> set[str]:
|
|
124
|
-
"""``shown_fact_ids`` JSON -> set. Empty on anything unexpected."""
|
|
125
|
-
if not raw:
|
|
126
|
-
return set()
|
|
127
|
-
try:
|
|
128
|
-
parsed = json.loads(str(raw))
|
|
129
|
-
except (TypeError, ValueError):
|
|
130
|
-
return set()
|
|
131
|
-
if not isinstance(parsed, list):
|
|
132
|
-
return set()
|
|
133
|
-
return {str(f) for f in parsed if f}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def _unsettled_plays(
|
|
137
|
-
conn: sqlite3.Connection, profile_id: str,
|
|
138
|
-
) -> list[sqlite3.Row]:
|
|
139
|
-
"""Unsettled plays, oldest first. Degrades if M044 has not run."""
|
|
140
|
-
for columns in (
|
|
141
|
-
"play_id, query_id, played_at, shown_fact_ids",
|
|
142
|
-
"play_id, query_id, played_at, NULL AS shown_fact_ids",
|
|
143
|
-
):
|
|
144
|
-
try:
|
|
145
|
-
return conn.execute(
|
|
146
|
-
f"SELECT {columns} FROM bandit_plays "
|
|
147
|
-
"WHERE profile_id = ? AND settled_at IS NULL "
|
|
148
|
-
"ORDER BY played_at ASC LIMIT ?",
|
|
149
|
-
(str(profile_id), _MAX_PLAYS_PER_PASS),
|
|
150
|
-
).fetchall()
|
|
151
|
-
except sqlite3.Error as exc:
|
|
152
|
-
logger.debug("reward_from_outcomes: play fetch (%s): %s", columns, exc)
|
|
153
|
-
return []
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
def _candidate_outcomes(
|
|
157
|
-
conn: sqlite3.Connection, profile_id: str, since: datetime,
|
|
158
|
-
) -> list[dict]:
|
|
159
|
-
"""Reported outcomes from ``since`` onward, newest first.
|
|
160
|
-
|
|
161
|
-
Read once per pass rather than once per play: the window holds a handful of
|
|
162
|
-
rows in practice, and a per-play query would scan this table N times on the
|
|
163
|
-
settlement thread.
|
|
164
|
-
"""
|
|
165
|
-
try:
|
|
166
|
-
rows = conn.execute(
|
|
167
|
-
"SELECT outcome_id, fact_ids_json, outcome, reward, timestamp, "
|
|
168
|
-
" recall_query_id "
|
|
169
|
-
"FROM action_outcomes "
|
|
170
|
-
"WHERE profile_id = ? AND timestamp >= ? "
|
|
171
|
-
"ORDER BY timestamp DESC LIMIT 2000",
|
|
172
|
-
(str(profile_id), since.isoformat()),
|
|
173
|
-
).fetchall()
|
|
174
|
-
except sqlite3.Error as exc:
|
|
175
|
-
logger.debug("reward_from_outcomes: outcome fetch: %s", exc)
|
|
176
|
-
return []
|
|
177
|
-
|
|
178
|
-
out: list[dict] = []
|
|
179
|
-
for r in rows:
|
|
180
|
-
at = _parse_iso(r["timestamp"])
|
|
181
|
-
if at is None:
|
|
182
|
-
continue
|
|
183
|
-
try:
|
|
184
|
-
facts = json.loads(r["fact_ids_json"] or "[]")
|
|
185
|
-
except (TypeError, ValueError):
|
|
186
|
-
facts = []
|
|
187
|
-
if not isinstance(facts, list):
|
|
188
|
-
facts = []
|
|
189
|
-
try:
|
|
190
|
-
reward = float(r["reward"])
|
|
191
|
-
except (TypeError, ValueError):
|
|
192
|
-
continue
|
|
193
|
-
out.append({
|
|
194
|
-
"id": str(r["outcome_id"]),
|
|
195
|
-
"at": at,
|
|
196
|
-
"facts": {str(f) for f in facts if f},
|
|
197
|
-
"reward": max(0.0, min(1.0, reward)),
|
|
198
|
-
"query_id": str(r["recall_query_id"] or ""),
|
|
199
|
-
})
|
|
200
|
-
return out
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def _match(
|
|
204
|
-
play_at: datetime,
|
|
205
|
-
query_id: str,
|
|
206
|
-
shown: set[str],
|
|
207
|
-
outcomes: list[dict],
|
|
208
|
-
claimed: set[str],
|
|
209
|
-
) -> dict | None:
|
|
210
|
-
"""The one outcome attributable to this play, or None.
|
|
211
|
-
|
|
212
|
-
Returns the outcome itself rather than its reward, because the caller needs
|
|
213
|
-
to know WHICH memories that outcome named — see ``settle_from_outcomes``.
|
|
214
|
-
|
|
215
|
-
AN OUTCOME IS EVIDENCE ABOUT ONE RECALL, AND IS CONSUMED
|
|
216
|
-
-------------------------------------------------------
|
|
217
|
-
The first version of this matched an outcome against every unsettled play
|
|
218
|
-
whose shown memories intersected it, and never consumed it. Both audits
|
|
219
|
-
reproduced the consequence and it is severe: five recalls that happened to
|
|
220
|
-
display the same memory, plus one reported outcome, settled **five** plays
|
|
221
|
-
and moved five arms; twenty recalls settled twenty. One person saying "that
|
|
222
|
-
helped" became twenty pieces of evidence about twenty different retrieval
|
|
223
|
-
strategies, most of which had nothing to do with it.
|
|
224
|
-
|
|
225
|
-
It also inflated confidence. ``play_count`` is what
|
|
226
|
-
``pcos.confidence_weight`` reads, so the same fan-out could push a memory to
|
|
227
|
-
"proven" — full bonus — on a single judgement.
|
|
228
|
-
|
|
229
|
-
The effect on the learning claim is the part that matters: Thompson sampling
|
|
230
|
-
would be learning which memories were *nearby*, not which strategy helped.
|
|
231
|
-
That is how arms come off their prior and the ranker is still random.
|
|
232
|
-
|
|
233
|
-
So ``claimed`` carries the outcome ids already spent this pass, and an
|
|
234
|
-
outcome may be spent once. Plays are offered outcomes oldest-first, so the
|
|
235
|
-
recall that ran first gets the credit — the report is far more likely to be
|
|
236
|
-
about the answer the user actually saw.
|
|
237
|
-
|
|
238
|
-
THE EXACT PATH IS ALSO BOUNDED IN TIME. A ``recall_query_id`` is a stronger
|
|
239
|
-
statement of intent than overlap and is tried first, but it used to skip the
|
|
240
|
-
horizon check entirely: an outcome ten days later, naming completely
|
|
241
|
-
different memories, settled a long-closed play at reward 0.0. Reproduced.
|
|
242
|
-
Both paths now require the outcome to fall inside the window.
|
|
243
|
-
"""
|
|
244
|
-
horizon = play_at + timedelta(seconds=_MATCH_WINDOW_SEC)
|
|
245
|
-
|
|
246
|
-
def _in_window(o: dict) -> bool:
|
|
247
|
-
return play_at <= o["at"] <= horizon
|
|
248
|
-
|
|
249
|
-
def _first(candidates: list[dict]) -> dict | None:
|
|
250
|
-
fresh = [o for o in candidates if o["id"] not in claimed]
|
|
251
|
-
return min(fresh, key=lambda o: o["at"]) if fresh else None
|
|
252
|
-
|
|
253
|
-
if query_id:
|
|
254
|
-
exact = _first([
|
|
255
|
-
o for o in outcomes
|
|
256
|
-
if o["query_id"] and o["query_id"] == query_id and _in_window(o)
|
|
257
|
-
])
|
|
258
|
-
if exact is not None:
|
|
259
|
-
return exact
|
|
260
|
-
|
|
261
|
-
if not shown:
|
|
262
|
-
return None
|
|
263
|
-
return _first([
|
|
264
|
-
o for o in outcomes if _in_window(o) and (o["facts"] & shown)
|
|
265
|
-
])
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def settle_from_outcomes(
|
|
269
|
-
profile_id: str,
|
|
270
|
-
learning_db: Path | str,
|
|
271
|
-
memory_db: Path | str,
|
|
272
|
-
*,
|
|
273
|
-
now: datetime | None = None,
|
|
274
|
-
bandit: ContextualBandit | None = None,
|
|
275
|
-
) -> int:
|
|
276
|
-
"""Settle plays from reported outcomes. Returns the count. Never raises.
|
|
277
|
-
|
|
278
|
-
Run this BEFORE ``reward_proxy.settle_stale_plays`` on any pass. The proxy
|
|
279
|
-
defaults a play at 120 seconds; if it goes first it takes every play with
|
|
280
|
-
it and a reported outcome arriving at minute five finds nothing left to
|
|
281
|
-
settle.
|
|
282
|
-
"""
|
|
283
|
-
current = now or datetime.now(timezone.utc)
|
|
284
|
-
learning_conn = _open(Path(learning_db))
|
|
285
|
-
if learning_conn is None:
|
|
286
|
-
return 0
|
|
287
|
-
memory_conn = _open(Path(memory_db))
|
|
288
|
-
if memory_conn is None:
|
|
289
|
-
learning_conn.close()
|
|
290
|
-
return 0
|
|
291
|
-
|
|
292
|
-
owns_bandit = bandit is None
|
|
293
|
-
if bandit is None:
|
|
294
|
-
bandit = ContextualBandit(Path(learning_db), profile_id=str(profile_id))
|
|
295
|
-
|
|
296
|
-
settled = 0
|
|
297
|
-
try:
|
|
298
|
-
plays = _unsettled_plays(learning_conn, profile_id)
|
|
299
|
-
if not plays:
|
|
300
|
-
return 0
|
|
301
|
-
oldest = min(
|
|
302
|
-
(p for p in (_parse_iso(r["played_at"]) for r in plays)
|
|
303
|
-
if p is not None),
|
|
304
|
-
default=current,
|
|
305
|
-
)
|
|
306
|
-
outcomes = _candidate_outcomes(memory_conn, profile_id, oldest)
|
|
307
|
-
if not outcomes:
|
|
308
|
-
return 0
|
|
309
|
-
|
|
310
|
-
# Outcome ids spent this pass. An outcome is evidence about one recall.
|
|
311
|
-
claimed: set[str] = set()
|
|
312
|
-
|
|
313
|
-
for row in plays:
|
|
314
|
-
played = _parse_iso(row["played_at"])
|
|
315
|
-
if played is None:
|
|
316
|
-
continue
|
|
317
|
-
shown = _shown(row["shown_fact_ids"])
|
|
318
|
-
outcome = _match(
|
|
319
|
-
played, str(row["query_id"] or ""), shown, outcomes, claimed,
|
|
320
|
-
)
|
|
321
|
-
if outcome is None:
|
|
322
|
-
continue
|
|
323
|
-
if bandit.update(int(row["play_id"]), outcome["reward"],
|
|
324
|
-
kind=SETTLEMENT_KIND):
|
|
325
|
-
settled += 1
|
|
326
|
-
claimed.add(outcome["id"])
|
|
327
|
-
# Credit ONLY the memories the outcome actually named. Writing
|
|
328
|
-
# it to everything the play displayed spread one judgement
|
|
329
|
-
# across up to five memories: an outcome naming one of them
|
|
330
|
-
# moved all five to 0.55 with play_count 1. Co-displayed
|
|
331
|
-
# memories inherited credit, the bonus then lifted them, and
|
|
332
|
-
# they were shown again — the rich-get-richer path this was
|
|
333
|
-
# built to prevent, one hop removed.
|
|
334
|
-
judged = sorted(outcome["facts"] & shown) if shown else []
|
|
335
|
-
if judged:
|
|
336
|
-
try:
|
|
337
|
-
update_scores(
|
|
338
|
-
memory_conn, profile_id, judged, outcome["reward"],
|
|
339
|
-
)
|
|
340
|
-
memory_conn.commit()
|
|
341
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
342
|
-
logger.debug("pcos update skipped: %s", exc)
|
|
343
|
-
except sqlite3.Error as exc: # pragma: no cover — defensive
|
|
344
|
-
logger.warning("reward_from_outcomes: %s", exc)
|
|
345
|
-
finally:
|
|
346
|
-
for conn in (learning_conn, memory_conn):
|
|
347
|
-
try:
|
|
348
|
-
conn.close()
|
|
349
|
-
except sqlite3.Error: # pragma: no cover
|
|
350
|
-
pass
|
|
351
|
-
if owns_bandit:
|
|
352
|
-
try:
|
|
353
|
-
from superlocalmemory.learning.bandit import (
|
|
354
|
-
close_threadlocal_conn,
|
|
355
|
-
)
|
|
356
|
-
|
|
357
|
-
close_threadlocal_conn()
|
|
358
|
-
except Exception: # pragma: no cover — defensive
|
|
359
|
-
pass
|
|
360
|
-
if settled:
|
|
361
|
-
logger.info(
|
|
362
|
-
"reward_from_outcomes: settled %d play(s) from reported outcomes",
|
|
363
|
-
settled,
|
|
364
|
-
)
|
|
365
|
-
return settled
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Turn observed engagement into a reward, or into an honest refusal.
|
|
5
|
-
|
|
6
|
-
ABSTENTION IS THE POINT
|
|
7
|
-
-----------------------
|
|
8
|
-
The ladder this replaces always produced a number. When it saw nothing it
|
|
9
|
-
produced ``0.5``, and ``0.5`` is not neutral: ``alpha += 0.5`` with
|
|
10
|
-
``beta += 0.5`` holds a Beta posterior's mean at exactly 0.5 while shrinking
|
|
11
|
-
its variance, so each empty settlement makes an arm *more certain* it is
|
|
12
|
-
average and *less* movable by the evidence that finally arrives. Applied often
|
|
13
|
-
enough it does not merely fail to learn — it commits, with growing confidence,
|
|
14
|
-
to knowing nothing.
|
|
15
|
-
|
|
16
|
-
So this module returns ``None`` when nothing was observed. An unobserved recall
|
|
17
|
-
leaves the posterior untouched and free. Absence of evidence is recorded as
|
|
18
|
-
absence of evidence.
|
|
19
|
-
|
|
20
|
-
THE SCALE
|
|
21
|
-
---------
|
|
22
|
-
Positive evidence maps into ``(0.5, 1.0]``, a requery to ``0.0``, and nothing to
|
|
23
|
-
``None``. Nothing maps *to* 0.5, because that value is reserved for "no
|
|
24
|
-
information" and no observation carries that meaning: if it was worth
|
|
25
|
-
observing it was worth moving the posterior.
|
|
26
|
-
|
|
27
|
-
Weights are module constants and deliberately legible rather than fitted. There
|
|
28
|
-
is no ground-truth corpus of "was this memory actually useful" to fit against,
|
|
29
|
-
and inventing one from the system's own rankings would be the circularity
|
|
30
|
-
``propensity.py`` exists to break. They are a documented prior over evidence
|
|
31
|
-
strength; the *learning* happens in the posterior these rewards update, not in
|
|
32
|
-
the constants.
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
from __future__ import annotations
|
|
36
|
-
|
|
37
|
-
from dataclasses import dataclass
|
|
38
|
-
|
|
39
|
-
from superlocalmemory.learning.engagement_features import EngagementFeatures
|
|
40
|
-
|
|
41
|
-
__all__ = ["RewardDecision", "score", "REQUERY_REWARD"]
|
|
42
|
-
|
|
43
|
-
#: A question asked again is the one unambiguous statement that an answer did
|
|
44
|
-
#: not serve. It is the only hard zero available.
|
|
45
|
-
REQUERY_REWARD = 0.0
|
|
46
|
-
|
|
47
|
-
#: Evidence weights, strongest first.
|
|
48
|
-
#: - a memory whose content reaches a written artifact was used, not just read
|
|
49
|
-
#: - a follow-up memory overlapping it means the agent built on it
|
|
50
|
-
#: - appearing in any later action is real but weaker: the agent may have been
|
|
51
|
-
#: working on the subject regardless of what was recalled
|
|
52
|
-
_W_ARTIFACT = 0.50
|
|
53
|
-
_W_FOLLOWUP = 0.30
|
|
54
|
-
_W_PRESENCE = 0.20
|
|
55
|
-
|
|
56
|
-
#: Positive evidence starts just above the reserved no-information value, so
|
|
57
|
-
#: the weakest real observation still moves an arm up rather than nowhere.
|
|
58
|
-
_POSITIVE_FLOOR = 0.55
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@dataclass(frozen=True)
|
|
62
|
-
class RewardDecision:
|
|
63
|
-
"""A reward, or an abstention, with the reason attached.
|
|
64
|
-
|
|
65
|
-
``reward is None`` means do not update. ``kind`` names what was seen so a
|
|
66
|
-
settled play can be explained after the fact instead of being a bare float.
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
reward: float | None
|
|
70
|
-
kind: str
|
|
71
|
-
detail: str = ""
|
|
72
|
-
|
|
73
|
-
@property
|
|
74
|
-
def abstained(self) -> bool:
|
|
75
|
-
return self.reward is None
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def score(features: EngagementFeatures) -> RewardDecision:
|
|
79
|
-
"""Map observations to a reward in [0, 1], or abstain.
|
|
80
|
-
|
|
81
|
-
Never raises: a settler running over a month of rows must not stop on one
|
|
82
|
-
malformed observation.
|
|
83
|
-
"""
|
|
84
|
-
if features.marker_hit:
|
|
85
|
-
# The agent named the memory outright. Nothing makes it do this, so it
|
|
86
|
-
# is rare, but when it happens there is nothing to infer.
|
|
87
|
-
return RewardDecision(
|
|
88
|
-
reward=1.0,
|
|
89
|
-
kind="proxy_position",
|
|
90
|
-
detail="a recalled fact id appeared in a later tool event",
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
if features.requeried:
|
|
94
|
-
return RewardDecision(
|
|
95
|
-
reward=REQUERY_REWARD,
|
|
96
|
-
kind="proxy_requery",
|
|
97
|
-
detail="the same question was asked again inside the window",
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
if not features.observed:
|
|
101
|
-
return RewardDecision(
|
|
102
|
-
reward=None,
|
|
103
|
-
kind="unobserved",
|
|
104
|
-
detail=(
|
|
105
|
-
f"no engagement visible in {features.action_count} following "
|
|
106
|
-
"action(s); posterior left untouched"
|
|
107
|
-
),
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
artifact = _clamp(features.artifact_overlap)
|
|
111
|
-
followup = _clamp(features.followup_write_overlap)
|
|
112
|
-
presence = _clamp(features.peak_overlap)
|
|
113
|
-
|
|
114
|
-
strength = (
|
|
115
|
-
_W_ARTIFACT * artifact
|
|
116
|
-
+ _W_FOLLOWUP * followup
|
|
117
|
-
+ _W_PRESENCE * presence
|
|
118
|
-
)
|
|
119
|
-
# strength in [0, 1]; map onto (floor, 1.0].
|
|
120
|
-
reward = _POSITIVE_FLOOR + (1.0 - _POSITIVE_FLOOR) * _clamp(strength)
|
|
121
|
-
|
|
122
|
-
if artifact > 0.0:
|
|
123
|
-
kind = "artifact_overlap"
|
|
124
|
-
elif followup > 0.0:
|
|
125
|
-
kind = "followup_overlap"
|
|
126
|
-
else:
|
|
127
|
-
kind = "presence_overlap"
|
|
128
|
-
|
|
129
|
-
return RewardDecision(
|
|
130
|
-
reward=round(reward, 6),
|
|
131
|
-
kind=kind,
|
|
132
|
-
detail=(
|
|
133
|
-
f"artifact={artifact:.3f} followup={followup:.3f} "
|
|
134
|
-
f"presence={presence:.3f} on {len(features.matched_fact_ids)} fact(s)"
|
|
135
|
-
),
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def _clamp(value: float) -> float:
|
|
140
|
-
try:
|
|
141
|
-
v = float(value)
|
|
142
|
-
except (TypeError, ValueError):
|
|
143
|
-
return 0.0
|
|
144
|
-
return 0.0 if v < 0.0 else (1.0 if v > 1.0 else v)
|