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,828 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
3
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
4
|
-
# Part of Qualixar | Author: Varun Pratap Bhardwaj (qualixar.com | varunpratap.com)
|
|
5
|
-
"""
|
|
6
|
-
SourceQualityScorer -- Beta-binomial source quality scoring for V3 learning.
|
|
7
|
-
|
|
8
|
-
Each memory source (agent, URL, manual, etc.) gets a quality score based on
|
|
9
|
-
how often its memories are confirmed vs contradicted or ignored.
|
|
10
|
-
|
|
11
|
-
Scoring (Beta-Binomial with Laplace smoothing):
|
|
12
|
-
quality = (alpha + positives) / (alpha + beta + total)
|
|
13
|
-
|
|
14
|
-
With alpha=1, beta=1 (uniform prior):
|
|
15
|
-
- New source, 0 evidence -> 1/2 = 0.50
|
|
16
|
-
- 8 positive out of 10 -> 9/12 = 0.75
|
|
17
|
-
- 1 positive out of 10 -> 2/12 = 0.17
|
|
18
|
-
|
|
19
|
-
Storage:
|
|
20
|
-
Uses direct sqlite3 with a self-contained ``source_quality`` table.
|
|
21
|
-
NOT coupled to V3 DatabaseManager.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
from __future__ import annotations
|
|
25
|
-
|
|
26
|
-
import json
|
|
27
|
-
import logging
|
|
28
|
-
import math
|
|
29
|
-
import sqlite3
|
|
30
|
-
import threading
|
|
31
|
-
from datetime import datetime, timezone
|
|
32
|
-
from pathlib import Path
|
|
33
|
-
from typing import Any, Dict
|
|
34
|
-
|
|
35
|
-
logger = logging.getLogger("superlocalmemory.learning.source_quality")
|
|
36
|
-
|
|
37
|
-
# Beta-Binomial prior (Laplace / uniform)
|
|
38
|
-
_ALPHA = 1.0
|
|
39
|
-
_BETA = 1.0
|
|
40
|
-
|
|
41
|
-
# Default quality for unknown sources = alpha / (alpha + beta)
|
|
42
|
-
DEFAULT_QUALITY = _ALPHA / (_ALPHA + _BETA) # 0.5
|
|
43
|
-
|
|
44
|
-
_CREATE_TABLE = """
|
|
45
|
-
CREATE TABLE IF NOT EXISTS source_quality (
|
|
46
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
-
profile_id TEXT NOT NULL,
|
|
48
|
-
source_id TEXT NOT NULL,
|
|
49
|
-
alpha REAL NOT NULL DEFAULT 1.0,
|
|
50
|
-
beta REAL NOT NULL DEFAULT 1.0,
|
|
51
|
-
updated_at TEXT NOT NULL
|
|
52
|
-
)
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
_CREATE_UNIQUE = """
|
|
56
|
-
CREATE UNIQUE INDEX IF NOT EXISTS idx_sq_profile_source
|
|
57
|
-
ON source_quality (profile_id, source_id)
|
|
58
|
-
"""
|
|
59
|
-
|
|
60
|
-
_CREATE_OBSERVATIONS = """
|
|
61
|
-
CREATE TABLE IF NOT EXISTS source_quality_observations (
|
|
62
|
-
profile_id TEXT NOT NULL,
|
|
63
|
-
outcome_id TEXT NOT NULL,
|
|
64
|
-
source_id TEXT NOT NULL,
|
|
65
|
-
reward REAL NOT NULL,
|
|
66
|
-
observed_at TEXT NOT NULL,
|
|
67
|
-
PRIMARY KEY (profile_id, outcome_id, source_id)
|
|
68
|
-
)
|
|
69
|
-
"""
|
|
70
|
-
|
|
71
|
-
_CREATE_REPAIR_STATE = """
|
|
72
|
-
CREATE TABLE IF NOT EXISTS source_quality_repair_state (
|
|
73
|
-
profile_id TEXT PRIMARY KEY,
|
|
74
|
-
last_rowid INTEGER NOT NULL DEFAULT 0,
|
|
75
|
-
last_settled_at TEXT NOT NULL DEFAULT '',
|
|
76
|
-
last_outcome_id TEXT NOT NULL DEFAULT '',
|
|
77
|
-
updated_at TEXT NOT NULL
|
|
78
|
-
)
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
_MAX_FACTS_PER_OUTCOME = 100
|
|
82
|
-
_MAX_SOURCES_PER_OUTCOME = 100
|
|
83
|
-
_PROVENANCE_QUERY_CHUNK = 500
|
|
84
|
-
_SCHEMA_INIT_LOCK = threading.RLock()
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
class SourceQualityRepairUnavailable(RuntimeError):
|
|
88
|
-
"""A repair read failed transiently and must not be interpreted as EOF."""
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
def _utcnow_iso() -> str:
|
|
92
|
-
"""Return current UTC time as ISO-8601 string."""
|
|
93
|
-
return datetime.now(timezone.utc).isoformat()
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
class SourceQualityScorer:
|
|
97
|
-
"""
|
|
98
|
-
Beta-binomial source quality scoring.
|
|
99
|
-
|
|
100
|
-
Maintains per-(profile, source) alpha/beta parameters. Positive
|
|
101
|
-
outcomes increment alpha; negative outcomes increment beta.
|
|
102
|
-
Quality = alpha / (alpha + beta).
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
db_path: Path to the sqlite3 database file.
|
|
106
|
-
"""
|
|
107
|
-
|
|
108
|
-
def __init__(self, db_path: Path) -> None:
|
|
109
|
-
self._db_path = Path(db_path)
|
|
110
|
-
self._lock = threading.Lock()
|
|
111
|
-
self._ensure_schema()
|
|
112
|
-
|
|
113
|
-
# ------------------------------------------------------------------
|
|
114
|
-
# Schema
|
|
115
|
-
# ------------------------------------------------------------------
|
|
116
|
-
|
|
117
|
-
def _ensure_schema(self) -> None:
|
|
118
|
-
# Serialize scorer instances in this process before asking SQLite for
|
|
119
|
-
# its cross-process BEGIN IMMEDIATE lease. This prevents two startup
|
|
120
|
-
# threads from racing the journal-mode/schema bootstrap while SQLite's
|
|
121
|
-
# busy timeout protects the equivalent multi-process boundary.
|
|
122
|
-
with _SCHEMA_INIT_LOCK:
|
|
123
|
-
conn = self._connect()
|
|
124
|
-
try:
|
|
125
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
126
|
-
conn.execute(_CREATE_TABLE)
|
|
127
|
-
conn.execute(_CREATE_UNIQUE)
|
|
128
|
-
conn.execute(_CREATE_OBSERVATIONS)
|
|
129
|
-
conn.execute(_CREATE_REPAIR_STATE)
|
|
130
|
-
repair_columns = {
|
|
131
|
-
str(row["name"])
|
|
132
|
-
for row in conn.execute(
|
|
133
|
-
"PRAGMA table_info(source_quality_repair_state)"
|
|
134
|
-
).fetchall()
|
|
135
|
-
}
|
|
136
|
-
if "last_settled_at" not in repair_columns:
|
|
137
|
-
conn.execute(
|
|
138
|
-
"ALTER TABLE source_quality_repair_state "
|
|
139
|
-
"ADD COLUMN last_settled_at TEXT NOT NULL DEFAULT ''"
|
|
140
|
-
)
|
|
141
|
-
if "last_outcome_id" not in repair_columns:
|
|
142
|
-
conn.execute(
|
|
143
|
-
"ALTER TABLE source_quality_repair_state "
|
|
144
|
-
"ADD COLUMN last_outcome_id TEXT NOT NULL DEFAULT ''"
|
|
145
|
-
)
|
|
146
|
-
conn.commit()
|
|
147
|
-
except Exception:
|
|
148
|
-
conn.rollback()
|
|
149
|
-
raise
|
|
150
|
-
finally:
|
|
151
|
-
conn.close()
|
|
152
|
-
|
|
153
|
-
def _connect(self) -> sqlite3.Connection:
|
|
154
|
-
conn = sqlite3.connect(str(self._db_path), timeout=10)
|
|
155
|
-
# Install the busy handler before journal negotiation. On a fresh
|
|
156
|
-
# database, PRAGMA journal_mode itself may contend with another scorer.
|
|
157
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
158
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
159
|
-
conn.row_factory = sqlite3.Row
|
|
160
|
-
return conn
|
|
161
|
-
|
|
162
|
-
# ------------------------------------------------------------------
|
|
163
|
-
# Public API: record outcome
|
|
164
|
-
# ------------------------------------------------------------------
|
|
165
|
-
|
|
166
|
-
def record_outcome(
|
|
167
|
-
self,
|
|
168
|
-
profile_id: str,
|
|
169
|
-
source_id: str,
|
|
170
|
-
outcome: str,
|
|
171
|
-
) -> None:
|
|
172
|
-
"""
|
|
173
|
-
Record an observation for a source.
|
|
174
|
-
|
|
175
|
-
Args:
|
|
176
|
-
profile_id: Profile context.
|
|
177
|
-
source_id: Identifier of the source (agent name, URL, etc.).
|
|
178
|
-
outcome: ``"positive"`` or ``"negative"``.
|
|
179
|
-
|
|
180
|
-
Raises:
|
|
181
|
-
ValueError: If outcome is not ``"positive"`` or ``"negative"``.
|
|
182
|
-
"""
|
|
183
|
-
if outcome not in ("positive", "negative"):
|
|
184
|
-
raise ValueError(
|
|
185
|
-
f"outcome must be 'positive' or 'negative', got {outcome!r}"
|
|
186
|
-
)
|
|
187
|
-
if not profile_id or not source_id:
|
|
188
|
-
return
|
|
189
|
-
|
|
190
|
-
now = _utcnow_iso()
|
|
191
|
-
|
|
192
|
-
with self._lock:
|
|
193
|
-
conn = self._connect()
|
|
194
|
-
try:
|
|
195
|
-
# Ensure row exists (INSERT OR IGNORE with defaults)
|
|
196
|
-
conn.execute(
|
|
197
|
-
"INSERT OR IGNORE INTO source_quality "
|
|
198
|
-
"(profile_id, source_id, alpha, beta, updated_at) "
|
|
199
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
200
|
-
(profile_id, source_id, _ALPHA, _BETA, now),
|
|
201
|
-
)
|
|
202
|
-
|
|
203
|
-
# Update the appropriate parameter
|
|
204
|
-
if outcome == "positive":
|
|
205
|
-
conn.execute(
|
|
206
|
-
"UPDATE source_quality "
|
|
207
|
-
"SET alpha = alpha + 1.0, updated_at = ? "
|
|
208
|
-
"WHERE profile_id = ? AND source_id = ?",
|
|
209
|
-
(now, profile_id, source_id),
|
|
210
|
-
)
|
|
211
|
-
else:
|
|
212
|
-
conn.execute(
|
|
213
|
-
"UPDATE source_quality "
|
|
214
|
-
"SET beta = beta + 1.0, updated_at = ? "
|
|
215
|
-
"WHERE profile_id = ? AND source_id = ?",
|
|
216
|
-
(now, profile_id, source_id),
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
conn.commit()
|
|
220
|
-
finally:
|
|
221
|
-
conn.close()
|
|
222
|
-
|
|
223
|
-
def record_reward(
|
|
224
|
-
self,
|
|
225
|
-
profile_id: str,
|
|
226
|
-
outcome_id: str,
|
|
227
|
-
source_ids: list[str],
|
|
228
|
-
reward: float,
|
|
229
|
-
) -> int:
|
|
230
|
-
"""Apply one fractional Beta observation per unique source.
|
|
231
|
-
|
|
232
|
-
The observation ledger makes retries idempotent. A reward of 0.8
|
|
233
|
-
contributes ``+0.8`` to alpha and ``+0.2`` to beta rather than
|
|
234
|
-
inventing a binary success label.
|
|
235
|
-
"""
|
|
236
|
-
return self.record_rewards([
|
|
237
|
-
(profile_id, outcome_id, source_ids, reward),
|
|
238
|
-
])
|
|
239
|
-
|
|
240
|
-
def record_rewards(
|
|
241
|
-
self,
|
|
242
|
-
observations: list[tuple[str, str, list[str], float]],
|
|
243
|
-
) -> int:
|
|
244
|
-
"""Batch bounded reward observations in one learning-DB transaction."""
|
|
245
|
-
inserted = 0
|
|
246
|
-
now = _utcnow_iso()
|
|
247
|
-
with self._lock:
|
|
248
|
-
conn = self._connect()
|
|
249
|
-
try:
|
|
250
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
251
|
-
for profile_id, outcome_id, sources, raw_reward in observations:
|
|
252
|
-
if not profile_id or not outcome_id:
|
|
253
|
-
continue
|
|
254
|
-
numeric_reward = float(raw_reward)
|
|
255
|
-
if not math.isfinite(numeric_reward):
|
|
256
|
-
continue
|
|
257
|
-
reward = max(0.0, min(1.0, numeric_reward))
|
|
258
|
-
for source_id in sorted(set(sources))[
|
|
259
|
-
:_MAX_SOURCES_PER_OUTCOME
|
|
260
|
-
]:
|
|
261
|
-
if not source_id:
|
|
262
|
-
continue
|
|
263
|
-
cursor = conn.execute(
|
|
264
|
-
"INSERT OR IGNORE INTO source_quality_observations "
|
|
265
|
-
"(profile_id, outcome_id, source_id, reward, observed_at) "
|
|
266
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
267
|
-
(profile_id, outcome_id, source_id, reward, now),
|
|
268
|
-
)
|
|
269
|
-
if cursor.rowcount != 1:
|
|
270
|
-
continue
|
|
271
|
-
conn.execute(
|
|
272
|
-
"INSERT OR IGNORE INTO source_quality "
|
|
273
|
-
"(profile_id, source_id, alpha, beta, updated_at) "
|
|
274
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
275
|
-
(profile_id, source_id, _ALPHA, _BETA, now),
|
|
276
|
-
)
|
|
277
|
-
conn.execute(
|
|
278
|
-
"UPDATE source_quality SET "
|
|
279
|
-
"alpha = alpha + ?, beta = beta + ?, updated_at = ? "
|
|
280
|
-
"WHERE profile_id = ? AND source_id = ?",
|
|
281
|
-
(
|
|
282
|
-
reward, 1.0 - reward, now,
|
|
283
|
-
profile_id, source_id,
|
|
284
|
-
),
|
|
285
|
-
)
|
|
286
|
-
inserted += 1
|
|
287
|
-
conn.commit()
|
|
288
|
-
except Exception:
|
|
289
|
-
conn.rollback()
|
|
290
|
-
raise
|
|
291
|
-
finally:
|
|
292
|
-
conn.close()
|
|
293
|
-
return inserted
|
|
294
|
-
|
|
295
|
-
def get_repair_cursor(self, profile_id: str) -> int:
|
|
296
|
-
conn = self._connect()
|
|
297
|
-
try:
|
|
298
|
-
row = conn.execute(
|
|
299
|
-
"SELECT last_rowid FROM source_quality_repair_state "
|
|
300
|
-
"WHERE profile_id = ?",
|
|
301
|
-
(profile_id,),
|
|
302
|
-
).fetchone()
|
|
303
|
-
return int(row["last_rowid"] or 0) if row else 0
|
|
304
|
-
finally:
|
|
305
|
-
conn.close()
|
|
306
|
-
|
|
307
|
-
def set_repair_cursor(self, profile_id: str, rowid: int) -> None:
|
|
308
|
-
now = _utcnow_iso()
|
|
309
|
-
with self._lock:
|
|
310
|
-
conn = self._connect()
|
|
311
|
-
try:
|
|
312
|
-
conn.execute(
|
|
313
|
-
"INSERT INTO source_quality_repair_state "
|
|
314
|
-
"(profile_id, last_rowid, updated_at) VALUES (?, ?, ?) "
|
|
315
|
-
"ON CONFLICT(profile_id) DO UPDATE SET "
|
|
316
|
-
"last_rowid = excluded.last_rowid, "
|
|
317
|
-
"updated_at = excluded.updated_at",
|
|
318
|
-
(profile_id, int(rowid), now),
|
|
319
|
-
)
|
|
320
|
-
conn.commit()
|
|
321
|
-
finally:
|
|
322
|
-
conn.close()
|
|
323
|
-
|
|
324
|
-
def get_repair_position(self, profile_id: str) -> tuple[str, str]:
|
|
325
|
-
"""Return the durable settlement-order cursor for historical repair."""
|
|
326
|
-
conn = self._connect()
|
|
327
|
-
try:
|
|
328
|
-
row = conn.execute(
|
|
329
|
-
"SELECT last_settled_at, last_outcome_id "
|
|
330
|
-
"FROM source_quality_repair_state WHERE profile_id = ?",
|
|
331
|
-
(profile_id,),
|
|
332
|
-
).fetchone()
|
|
333
|
-
if row is None:
|
|
334
|
-
return ("", "")
|
|
335
|
-
return (
|
|
336
|
-
str(row["last_settled_at"] or ""),
|
|
337
|
-
str(row["last_outcome_id"] or ""),
|
|
338
|
-
)
|
|
339
|
-
finally:
|
|
340
|
-
conn.close()
|
|
341
|
-
|
|
342
|
-
def set_repair_position(
|
|
343
|
-
self,
|
|
344
|
-
profile_id: str,
|
|
345
|
-
settled_at: str,
|
|
346
|
-
outcome_id: str,
|
|
347
|
-
) -> None:
|
|
348
|
-
"""Advance repair by settlement order, not immutable insertion rowid."""
|
|
349
|
-
now = _utcnow_iso()
|
|
350
|
-
with self._lock:
|
|
351
|
-
conn = self._connect()
|
|
352
|
-
try:
|
|
353
|
-
conn.execute(
|
|
354
|
-
"INSERT INTO source_quality_repair_state "
|
|
355
|
-
"(profile_id,last_rowid,last_settled_at,last_outcome_id,"
|
|
356
|
-
"updated_at) VALUES (?,0,?,?,?) "
|
|
357
|
-
"ON CONFLICT(profile_id) DO UPDATE SET "
|
|
358
|
-
"last_settled_at=excluded.last_settled_at,"
|
|
359
|
-
"last_outcome_id=excluded.last_outcome_id,"
|
|
360
|
-
"updated_at=excluded.updated_at",
|
|
361
|
-
(profile_id, str(settled_at), str(outcome_id), now),
|
|
362
|
-
)
|
|
363
|
-
conn.commit()
|
|
364
|
-
finally:
|
|
365
|
-
conn.close()
|
|
366
|
-
|
|
367
|
-
# ------------------------------------------------------------------
|
|
368
|
-
# Public API: read quality
|
|
369
|
-
# ------------------------------------------------------------------
|
|
370
|
-
|
|
371
|
-
def get_quality(self, profile_id: str, source_id: str) -> float:
|
|
372
|
-
"""
|
|
373
|
-
Get the quality score for a specific source.
|
|
374
|
-
|
|
375
|
-
Returns the Beta-binomial posterior mean:
|
|
376
|
-
quality = alpha / (alpha + beta)
|
|
377
|
-
|
|
378
|
-
If the source has never been observed, returns the prior
|
|
379
|
-
mean (0.5).
|
|
380
|
-
|
|
381
|
-
Args:
|
|
382
|
-
profile_id: Profile context.
|
|
383
|
-
source_id: Source identifier.
|
|
384
|
-
|
|
385
|
-
Returns:
|
|
386
|
-
Quality score in [0.0, 1.0].
|
|
387
|
-
"""
|
|
388
|
-
conn = self._connect()
|
|
389
|
-
try:
|
|
390
|
-
row = conn.execute(
|
|
391
|
-
"SELECT alpha, beta FROM source_quality "
|
|
392
|
-
"WHERE profile_id = ? AND source_id = ?",
|
|
393
|
-
(profile_id, source_id),
|
|
394
|
-
).fetchone()
|
|
395
|
-
|
|
396
|
-
if row is None:
|
|
397
|
-
return DEFAULT_QUALITY
|
|
398
|
-
|
|
399
|
-
alpha = float(row["alpha"])
|
|
400
|
-
beta = float(row["beta"])
|
|
401
|
-
denom = alpha + beta
|
|
402
|
-
if denom <= 0:
|
|
403
|
-
return DEFAULT_QUALITY
|
|
404
|
-
return alpha / denom
|
|
405
|
-
finally:
|
|
406
|
-
conn.close()
|
|
407
|
-
|
|
408
|
-
def get_all_qualities(self, profile_id: str) -> Dict[str, float]:
|
|
409
|
-
"""
|
|
410
|
-
Get quality scores for all sources observed under a profile.
|
|
411
|
-
|
|
412
|
-
Args:
|
|
413
|
-
profile_id: Profile context.
|
|
414
|
-
|
|
415
|
-
Returns:
|
|
416
|
-
Dict mapping source_id -> quality score (0.0 to 1.0).
|
|
417
|
-
"""
|
|
418
|
-
conn = self._connect()
|
|
419
|
-
try:
|
|
420
|
-
rows = conn.execute(
|
|
421
|
-
"SELECT source_id, alpha, beta FROM source_quality "
|
|
422
|
-
"WHERE profile_id = ?",
|
|
423
|
-
(profile_id,),
|
|
424
|
-
).fetchall()
|
|
425
|
-
|
|
426
|
-
result: Dict[str, float] = {}
|
|
427
|
-
for r in rows:
|
|
428
|
-
alpha = float(r["alpha"])
|
|
429
|
-
beta = float(r["beta"])
|
|
430
|
-
denom = alpha + beta
|
|
431
|
-
score = alpha / denom if denom > 0 else DEFAULT_QUALITY
|
|
432
|
-
result[r["source_id"]] = score
|
|
433
|
-
return result
|
|
434
|
-
finally:
|
|
435
|
-
conn.close()
|
|
436
|
-
|
|
437
|
-
# ------------------------------------------------------------------
|
|
438
|
-
# Public API: diagnostics
|
|
439
|
-
# ------------------------------------------------------------------
|
|
440
|
-
|
|
441
|
-
def get_detailed(
|
|
442
|
-
self, profile_id: str, source_id: str,
|
|
443
|
-
) -> Dict[str, Any]:
|
|
444
|
-
"""
|
|
445
|
-
Get detailed quality information for a single source.
|
|
446
|
-
|
|
447
|
-
Returns:
|
|
448
|
-
Dict with alpha, beta, quality, updated_at.
|
|
449
|
-
Returns defaults if the source has not been observed.
|
|
450
|
-
"""
|
|
451
|
-
conn = self._connect()
|
|
452
|
-
try:
|
|
453
|
-
row = conn.execute(
|
|
454
|
-
"SELECT alpha, beta, updated_at FROM source_quality "
|
|
455
|
-
"WHERE profile_id = ? AND source_id = ?",
|
|
456
|
-
(profile_id, source_id),
|
|
457
|
-
).fetchone()
|
|
458
|
-
|
|
459
|
-
if row is None:
|
|
460
|
-
return {
|
|
461
|
-
"alpha": _ALPHA,
|
|
462
|
-
"beta": _BETA,
|
|
463
|
-
"quality": DEFAULT_QUALITY,
|
|
464
|
-
"updated_at": None,
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
alpha = float(row["alpha"])
|
|
468
|
-
beta = float(row["beta"])
|
|
469
|
-
denom = alpha + beta
|
|
470
|
-
return {
|
|
471
|
-
"alpha": alpha,
|
|
472
|
-
"beta": beta,
|
|
473
|
-
"quality": alpha / denom if denom > 0 else DEFAULT_QUALITY,
|
|
474
|
-
"updated_at": row["updated_at"],
|
|
475
|
-
}
|
|
476
|
-
finally:
|
|
477
|
-
conn.close()
|
|
478
|
-
|
|
479
|
-
def get_all_detailed(self, profile_id: str) -> Dict[str, Dict[str, Any]]:
|
|
480
|
-
"""
|
|
481
|
-
Get detailed quality data for all sources under a profile.
|
|
482
|
-
|
|
483
|
-
Returns:
|
|
484
|
-
Dict mapping source_id -> detail dict.
|
|
485
|
-
"""
|
|
486
|
-
conn = self._connect()
|
|
487
|
-
try:
|
|
488
|
-
rows = conn.execute(
|
|
489
|
-
"SELECT source_id, alpha, beta, updated_at "
|
|
490
|
-
"FROM source_quality WHERE profile_id = ? "
|
|
491
|
-
"ORDER BY (alpha / (alpha + beta)) DESC",
|
|
492
|
-
(profile_id,),
|
|
493
|
-
).fetchall()
|
|
494
|
-
|
|
495
|
-
result: Dict[str, Dict[str, Any]] = {}
|
|
496
|
-
for r in rows:
|
|
497
|
-
alpha = float(r["alpha"])
|
|
498
|
-
beta = float(r["beta"])
|
|
499
|
-
denom = alpha + beta
|
|
500
|
-
result[r["source_id"]] = {
|
|
501
|
-
"alpha": alpha,
|
|
502
|
-
"beta": beta,
|
|
503
|
-
"quality": alpha / denom if denom > 0 else DEFAULT_QUALITY,
|
|
504
|
-
"updated_at": r["updated_at"],
|
|
505
|
-
}
|
|
506
|
-
return result
|
|
507
|
-
finally:
|
|
508
|
-
conn.close()
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
def _source_key(row: sqlite3.Row) -> str:
|
|
512
|
-
source_type = str(row["source_type"] or "").strip()[:100]
|
|
513
|
-
actor = str(row["created_by"] or "").strip()
|
|
514
|
-
operation_or_legacy_source = str(row["source_id"] or "").strip()
|
|
515
|
-
# Canonical ingestion stores its unique operation UUID in source_id for
|
|
516
|
-
# lineage/idempotency and the stable trusted client in created_by. Quality
|
|
517
|
-
# must aggregate by the stable actor; operation IDs would create one
|
|
518
|
-
# single-observation "source" per remember call. Legacy provenance often
|
|
519
|
-
# has no actor, so retain its established source_id fallback.
|
|
520
|
-
identifier = (
|
|
521
|
-
actor
|
|
522
|
-
if actor and actor.lower() != "unknown"
|
|
523
|
-
else operation_or_legacy_source
|
|
524
|
-
)[:100]
|
|
525
|
-
if source_type and identifier:
|
|
526
|
-
return f"{source_type}:{identifier}"
|
|
527
|
-
if identifier:
|
|
528
|
-
return f"source:{identifier}"
|
|
529
|
-
return source_type
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
def _load_source_map(
|
|
533
|
-
memory_db_path: Path,
|
|
534
|
-
profile_id: str,
|
|
535
|
-
fact_ids: list[str],
|
|
536
|
-
*,
|
|
537
|
-
strict: bool = False,
|
|
538
|
-
) -> dict[str, set[str]]:
|
|
539
|
-
"""Read only the provenance needed by this bounded reward batch."""
|
|
540
|
-
unique_facts = list(dict.fromkeys(str(fid) for fid in fact_ids if fid))
|
|
541
|
-
if not unique_facts or not Path(memory_db_path).exists():
|
|
542
|
-
return {}
|
|
543
|
-
result: dict[str, set[str]] = {}
|
|
544
|
-
try:
|
|
545
|
-
conn = sqlite3.connect(
|
|
546
|
-
f"file:{Path(memory_db_path)}?mode=ro", uri=True, timeout=1.0,
|
|
547
|
-
)
|
|
548
|
-
conn.row_factory = sqlite3.Row
|
|
549
|
-
try:
|
|
550
|
-
columns = {
|
|
551
|
-
str(row["name"])
|
|
552
|
-
for row in conn.execute("PRAGMA table_info(provenance)")
|
|
553
|
-
}
|
|
554
|
-
required = {
|
|
555
|
-
"profile_id", "fact_id", "source_type",
|
|
556
|
-
"source_id", "created_by",
|
|
557
|
-
}
|
|
558
|
-
if not required.issubset(columns):
|
|
559
|
-
return {}
|
|
560
|
-
for start in range(0, len(unique_facts), _PROVENANCE_QUERY_CHUNK):
|
|
561
|
-
chunk = unique_facts[start:start + _PROVENANCE_QUERY_CHUNK]
|
|
562
|
-
placeholders = ",".join("?" for _ in chunk)
|
|
563
|
-
rows = conn.execute(
|
|
564
|
-
"SELECT DISTINCT fact_id, source_type, source_id, created_by "
|
|
565
|
-
"FROM provenance WHERE profile_id = ? "
|
|
566
|
-
f"AND fact_id IN ({placeholders})",
|
|
567
|
-
(profile_id, *chunk),
|
|
568
|
-
).fetchall()
|
|
569
|
-
for row in rows:
|
|
570
|
-
key = _source_key(row)
|
|
571
|
-
if key:
|
|
572
|
-
result.setdefault(str(row["fact_id"]), set()).add(key)
|
|
573
|
-
finally:
|
|
574
|
-
conn.close()
|
|
575
|
-
except sqlite3.Error as exc:
|
|
576
|
-
logger.debug("source provenance unavailable: %s", exc)
|
|
577
|
-
if strict:
|
|
578
|
-
raise SourceQualityRepairUnavailable(
|
|
579
|
-
"source provenance temporarily unavailable",
|
|
580
|
-
) from exc
|
|
581
|
-
return {}
|
|
582
|
-
return result
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
def update_source_quality_for_reward(
|
|
586
|
-
*,
|
|
587
|
-
memory_db_path: Path,
|
|
588
|
-
learning_db_path: Path,
|
|
589
|
-
profile_id: str,
|
|
590
|
-
outcome_id: str,
|
|
591
|
-
fact_ids: list[str],
|
|
592
|
-
reward: float,
|
|
593
|
-
) -> int:
|
|
594
|
-
"""Fail-soft online bridge from a finalized reward to real provenance."""
|
|
595
|
-
return update_source_quality_for_reward_batch(
|
|
596
|
-
memory_db_path=memory_db_path,
|
|
597
|
-
learning_db_path=learning_db_path,
|
|
598
|
-
rewards=[(profile_id, outcome_id, fact_ids, reward)],
|
|
599
|
-
)
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
def update_source_quality_for_reward_batch(
|
|
603
|
-
*,
|
|
604
|
-
memory_db_path: Path,
|
|
605
|
-
learning_db_path: Path,
|
|
606
|
-
rewards: list[tuple[str, str, list[str], float]],
|
|
607
|
-
) -> int:
|
|
608
|
-
"""Fail-soft bounded bridge for worker-finalized reward batches."""
|
|
609
|
-
try:
|
|
610
|
-
bounded_rewards = rewards[:1000]
|
|
611
|
-
normalized = []
|
|
612
|
-
for profile_id, outcome_id, fact_ids, reward in bounded_rewards:
|
|
613
|
-
bounded_facts = list(dict.fromkeys(fact_ids))[
|
|
614
|
-
:_MAX_FACTS_PER_OUTCOME
|
|
615
|
-
]
|
|
616
|
-
normalized.append((
|
|
617
|
-
profile_id, outcome_id, bounded_facts, float(reward),
|
|
618
|
-
))
|
|
619
|
-
if not normalized:
|
|
620
|
-
return 0
|
|
621
|
-
# Each reward batch is profile-homogeneous in current callers. Split
|
|
622
|
-
# defensively so provenance can never cross a profile boundary.
|
|
623
|
-
by_profile: dict[str, list[tuple[str, list[str], float]]] = {}
|
|
624
|
-
for profile_id, outcome_id, fact_ids, reward in normalized:
|
|
625
|
-
by_profile.setdefault(profile_id, []).append(
|
|
626
|
-
(outcome_id, fact_ids, reward),
|
|
627
|
-
)
|
|
628
|
-
scorer = SourceQualityScorer(Path(learning_db_path))
|
|
629
|
-
observations = []
|
|
630
|
-
for profile_id, profile_rewards in by_profile.items():
|
|
631
|
-
profile_facts = [
|
|
632
|
-
fact_id
|
|
633
|
-
for _, fact_ids, _ in profile_rewards
|
|
634
|
-
for fact_id in fact_ids
|
|
635
|
-
]
|
|
636
|
-
source_map = _load_source_map(
|
|
637
|
-
Path(memory_db_path), profile_id, profile_facts,
|
|
638
|
-
)
|
|
639
|
-
for outcome_id, fact_ids, reward in profile_rewards:
|
|
640
|
-
source_ids = sorted({
|
|
641
|
-
source
|
|
642
|
-
for fact_id in fact_ids
|
|
643
|
-
for source in source_map.get(fact_id, set())
|
|
644
|
-
})[:_MAX_SOURCES_PER_OUTCOME]
|
|
645
|
-
observations.append((
|
|
646
|
-
profile_id, outcome_id, source_ids, reward,
|
|
647
|
-
))
|
|
648
|
-
return scorer.record_rewards(observations)
|
|
649
|
-
except (OSError, sqlite3.Error, TypeError, ValueError) as exc:
|
|
650
|
-
logger.debug("source-quality reward update skipped: %s", exc)
|
|
651
|
-
return 0
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
def enumerate_source_quality_repair_profiles(
|
|
655
|
-
memory_db_path: Path,
|
|
656
|
-
) -> list[str]:
|
|
657
|
-
"""Return profiles with settled numeric outcomes eligible for repair."""
|
|
658
|
-
path = Path(memory_db_path)
|
|
659
|
-
if not path.exists():
|
|
660
|
-
return []
|
|
661
|
-
try:
|
|
662
|
-
conn = sqlite3.connect(
|
|
663
|
-
f"file:{path}?mode=ro", uri=True, timeout=1.0,
|
|
664
|
-
)
|
|
665
|
-
conn.row_factory = sqlite3.Row
|
|
666
|
-
try:
|
|
667
|
-
columns = {
|
|
668
|
-
str(row["name"])
|
|
669
|
-
for row in conn.execute("PRAGMA table_info(action_outcomes)")
|
|
670
|
-
}
|
|
671
|
-
required = {"profile_id", "reward", "settled"}
|
|
672
|
-
if not required.issubset(columns):
|
|
673
|
-
return []
|
|
674
|
-
rows = conn.execute(
|
|
675
|
-
"SELECT DISTINCT profile_id FROM action_outcomes "
|
|
676
|
-
"WHERE settled = 1 AND reward IS NOT NULL "
|
|
677
|
-
"AND typeof(reward) IN ('integer', 'real') "
|
|
678
|
-
"AND profile_id IS NOT NULL AND profile_id != '' "
|
|
679
|
-
"ORDER BY profile_id ASC",
|
|
680
|
-
).fetchall()
|
|
681
|
-
return [str(row["profile_id"]) for row in rows]
|
|
682
|
-
finally:
|
|
683
|
-
conn.close()
|
|
684
|
-
except sqlite3.Error as exc:
|
|
685
|
-
logger.debug("source-quality profile enumeration unavailable: %s", exc)
|
|
686
|
-
raise SourceQualityRepairUnavailable(
|
|
687
|
-
"repair profile enumeration temporarily unavailable",
|
|
688
|
-
) from exc
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
def _parse_repair_rows(
|
|
692
|
-
rows: list[sqlite3.Row],
|
|
693
|
-
) -> tuple[list[tuple[sqlite3.Row, list[str]]], list[str]]:
|
|
694
|
-
parsed: list[tuple[sqlite3.Row, list[str]]] = []
|
|
695
|
-
all_facts: list[str] = []
|
|
696
|
-
for row in rows:
|
|
697
|
-
try:
|
|
698
|
-
value = json.loads(str(row["fact_ids_json"] or "[]"))
|
|
699
|
-
fact_ids = (
|
|
700
|
-
[str(item) for item in value if item][:_MAX_FACTS_PER_OUTCOME]
|
|
701
|
-
if isinstance(value, list) else []
|
|
702
|
-
)
|
|
703
|
-
except (TypeError, ValueError, json.JSONDecodeError):
|
|
704
|
-
fact_ids = []
|
|
705
|
-
parsed.append((row, fact_ids))
|
|
706
|
-
all_facts.extend(fact_ids)
|
|
707
|
-
return parsed, all_facts
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
def _repair_observations(
|
|
711
|
-
profile_id: str,
|
|
712
|
-
parsed: list[tuple[sqlite3.Row, list[str]]],
|
|
713
|
-
source_map: dict[str, set[str]],
|
|
714
|
-
) -> list[tuple[str, str, list[str], float]]:
|
|
715
|
-
observations = []
|
|
716
|
-
for row, fact_ids in parsed:
|
|
717
|
-
sources = sorted({
|
|
718
|
-
source for fact_id in fact_ids
|
|
719
|
-
for source in source_map.get(fact_id, set())
|
|
720
|
-
})[:_MAX_SOURCES_PER_OUTCOME]
|
|
721
|
-
observations.append((
|
|
722
|
-
profile_id, str(row["outcome_id"]), sources, float(row["reward"]),
|
|
723
|
-
))
|
|
724
|
-
return observations
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
def repair_historical_source_quality(
|
|
728
|
-
memory_db_path: Path,
|
|
729
|
-
learning_db_path: Path,
|
|
730
|
-
profile_id: str,
|
|
731
|
-
*,
|
|
732
|
-
batch_size: int = 250,
|
|
733
|
-
max_batches: int = 4,
|
|
734
|
-
) -> dict[str, int | bool]:
|
|
735
|
-
"""Explicit, resumable historical repair; never invoked by API handlers.
|
|
736
|
-
|
|
737
|
-
Work is capped to 1,000 outcomes per call by default. The cursor advances
|
|
738
|
-
only after the idempotent observation ledger commits, so interruption can
|
|
739
|
-
replay safely without double-counting.
|
|
740
|
-
"""
|
|
741
|
-
safe_batch = max(1, min(1000, int(batch_size)))
|
|
742
|
-
safe_batches = max(1, min(100, int(max_batches)))
|
|
743
|
-
scorer = SourceQualityScorer(Path(learning_db_path))
|
|
744
|
-
scanned = 0
|
|
745
|
-
observations = 0
|
|
746
|
-
complete = False
|
|
747
|
-
for _ in range(safe_batches):
|
|
748
|
-
settled_cursor, outcome_cursor = scorer.get_repair_position(profile_id)
|
|
749
|
-
rows = _load_reward_repair_batch(
|
|
750
|
-
Path(memory_db_path),
|
|
751
|
-
profile_id,
|
|
752
|
-
settled_cursor,
|
|
753
|
-
outcome_cursor,
|
|
754
|
-
safe_batch,
|
|
755
|
-
)
|
|
756
|
-
if not rows:
|
|
757
|
-
complete = True
|
|
758
|
-
break
|
|
759
|
-
parsed, all_facts = _parse_repair_rows(rows)
|
|
760
|
-
source_map = _load_source_map(
|
|
761
|
-
Path(memory_db_path), profile_id, all_facts, strict=True,
|
|
762
|
-
)
|
|
763
|
-
batch_observations = _repair_observations(
|
|
764
|
-
profile_id, parsed, source_map,
|
|
765
|
-
)
|
|
766
|
-
observations += scorer.record_rewards(batch_observations)
|
|
767
|
-
scanned += len(rows)
|
|
768
|
-
scorer.set_repair_position(
|
|
769
|
-
profile_id,
|
|
770
|
-
str(rows[-1]["settled_key"] or ""),
|
|
771
|
-
str(rows[-1]["outcome_id"]),
|
|
772
|
-
)
|
|
773
|
-
return {
|
|
774
|
-
"scanned": scanned,
|
|
775
|
-
"observations": observations,
|
|
776
|
-
"complete": complete,
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
def _load_reward_repair_batch(
|
|
781
|
-
memory_db_path: Path,
|
|
782
|
-
profile_id: str,
|
|
783
|
-
after_settled_at: str,
|
|
784
|
-
after_outcome_id: str,
|
|
785
|
-
limit: int,
|
|
786
|
-
) -> list[sqlite3.Row]:
|
|
787
|
-
if not memory_db_path.exists():
|
|
788
|
-
return []
|
|
789
|
-
try:
|
|
790
|
-
conn = sqlite3.connect(
|
|
791
|
-
f"file:{memory_db_path}?mode=ro", uri=True, timeout=1.0,
|
|
792
|
-
)
|
|
793
|
-
conn.row_factory = sqlite3.Row
|
|
794
|
-
try:
|
|
795
|
-
columns = {
|
|
796
|
-
str(row["name"])
|
|
797
|
-
for row in conn.execute("PRAGMA table_info(action_outcomes)")
|
|
798
|
-
}
|
|
799
|
-
required = {
|
|
800
|
-
"outcome_id", "profile_id", "fact_ids_json",
|
|
801
|
-
"reward", "settled",
|
|
802
|
-
}
|
|
803
|
-
if not required.issubset(columns):
|
|
804
|
-
return []
|
|
805
|
-
return conn.execute(
|
|
806
|
-
"SELECT outcome_id, fact_ids_json, reward, "
|
|
807
|
-
"COALESCE(settled_at, '') AS settled_key "
|
|
808
|
-
"FROM action_outcomes WHERE profile_id = ? "
|
|
809
|
-
"AND settled = 1 AND reward IS NOT NULL "
|
|
810
|
-
"AND typeof(reward) IN ('integer', 'real') "
|
|
811
|
-
"AND (COALESCE(settled_at, '') > ? OR "
|
|
812
|
-
"(COALESCE(settled_at, '') = ? AND outcome_id > ?)) "
|
|
813
|
-
"ORDER BY COALESCE(settled_at, '') ASC, outcome_id ASC LIMIT ?",
|
|
814
|
-
(
|
|
815
|
-
profile_id,
|
|
816
|
-
str(after_settled_at),
|
|
817
|
-
str(after_settled_at),
|
|
818
|
-
str(after_outcome_id),
|
|
819
|
-
int(limit),
|
|
820
|
-
),
|
|
821
|
-
).fetchall()
|
|
822
|
-
finally:
|
|
823
|
-
conn.close()
|
|
824
|
-
except sqlite3.Error as exc:
|
|
825
|
-
logger.debug("source-quality repair unavailable: %s", exc)
|
|
826
|
-
raise SourceQualityRepairUnavailable(
|
|
827
|
-
"repair batch temporarily unavailable",
|
|
828
|
-
) from exc
|