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,698 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3 — Learning Database.
|
|
6
|
-
|
|
7
|
-
Persistent storage for the adaptive ranker: feedback signals, feature
|
|
8
|
-
vectors, engagement metrics, and serialized model state. Uses direct
|
|
9
|
-
sqlite3 connections (independent of V3 DatabaseManager) for isolation.
|
|
10
|
-
|
|
11
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import json
|
|
17
|
-
import logging
|
|
18
|
-
import sqlite3
|
|
19
|
-
import threading
|
|
20
|
-
from datetime import datetime, timezone
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
from typing import Any, Optional, Union
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
_SCHEMA = """
|
|
27
|
-
CREATE TABLE IF NOT EXISTS learning_signals (
|
|
28
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
29
|
-
profile_id TEXT NOT NULL,
|
|
30
|
-
query TEXT NOT NULL,
|
|
31
|
-
fact_id TEXT NOT NULL,
|
|
32
|
-
signal_type TEXT NOT NULL,
|
|
33
|
-
value REAL DEFAULT 1.0,
|
|
34
|
-
created_at TEXT NOT NULL
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
CREATE INDEX IF NOT EXISTS idx_signals_profile
|
|
38
|
-
ON learning_signals(profile_id);
|
|
39
|
-
CREATE INDEX IF NOT EXISTS idx_signals_fact
|
|
40
|
-
ON learning_signals(fact_id);
|
|
41
|
-
|
|
42
|
-
CREATE TABLE IF NOT EXISTS learning_features (
|
|
43
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
44
|
-
profile_id TEXT NOT NULL,
|
|
45
|
-
query_id TEXT NOT NULL,
|
|
46
|
-
fact_id TEXT NOT NULL,
|
|
47
|
-
features_json TEXT NOT NULL,
|
|
48
|
-
label REAL NOT NULL,
|
|
49
|
-
created_at TEXT NOT NULL
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
CREATE INDEX IF NOT EXISTS idx_features_profile
|
|
53
|
-
ON learning_features(profile_id);
|
|
54
|
-
|
|
55
|
-
CREATE TABLE IF NOT EXISTS learning_model_state (
|
|
56
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
-
profile_id TEXT NOT NULL UNIQUE,
|
|
58
|
-
state_bytes BLOB NOT NULL,
|
|
59
|
-
updated_at TEXT NOT NULL
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
CREATE TABLE IF NOT EXISTS engagement_metrics (
|
|
63
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
64
|
-
profile_id TEXT NOT NULL,
|
|
65
|
-
metric_type TEXT NOT NULL,
|
|
66
|
-
value REAL NOT NULL DEFAULT 0,
|
|
67
|
-
updated_at TEXT NOT NULL
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
CREATE INDEX IF NOT EXISTS idx_engagement_profile_metric
|
|
71
|
-
ON engagement_metrics(profile_id, metric_type);
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
from superlocalmemory.learning.signal_kinds import FEEDBACK_ONLY_SQL
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class LearningDatabase:
|
|
80
|
-
"""Persistent storage for the adaptive ranker's training pipeline.
|
|
81
|
-
|
|
82
|
-
Owns its own sqlite3 connection — independent of the main DB manager.
|
|
83
|
-
Thread-safe writes via a lock. WAL mode for concurrent reads.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
db_path: Path to the learning SQLite database file.
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
def __init__(self, db_path: Union[str, Path]) -> None:
|
|
90
|
-
self._db_path = str(db_path)
|
|
91
|
-
self._lock = threading.Lock()
|
|
92
|
-
self._init_schema()
|
|
93
|
-
|
|
94
|
-
@property
|
|
95
|
-
def path(self) -> str:
|
|
96
|
-
"""Read-only path to the learning SQLite database.
|
|
97
|
-
|
|
98
|
-
S8-ARC-02 (v3.4.22): public alternative to the underscore-private
|
|
99
|
-
``_db_path``. Callers that need a raw connection for specialised
|
|
100
|
-
read patterns should prefer :meth:`ro_connection` over building
|
|
101
|
-
one themselves so WAL + busy_timeout pragmas are consistent.
|
|
102
|
-
"""
|
|
103
|
-
return self._db_path
|
|
104
|
-
|
|
105
|
-
def ro_connection(self, *, timeout: float = 5.0) -> sqlite3.Connection:
|
|
106
|
-
"""Return a read-only-shaped connection with WAL/timeout pragmas set.
|
|
107
|
-
|
|
108
|
-
Callers outside this class previously opened raw
|
|
109
|
-
``sqlite3.connect(lrn_db._db_path, ...)`` connections without the
|
|
110
|
-
WAL/busy_timeout pragmas, making them vulnerable to ``database is
|
|
111
|
-
locked`` errors under concurrent writer activity. This helper
|
|
112
|
-
produces a configured connection they can use instead.
|
|
113
|
-
"""
|
|
114
|
-
conn = sqlite3.connect(self._db_path, timeout=timeout)
|
|
115
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
116
|
-
conn.execute("PRAGMA busy_timeout=5000")
|
|
117
|
-
conn.row_factory = sqlite3.Row
|
|
118
|
-
return conn
|
|
119
|
-
|
|
120
|
-
def _connect(self) -> sqlite3.Connection:
|
|
121
|
-
"""Create a configured connection to the learning database."""
|
|
122
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
123
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
124
|
-
conn.execute("PRAGMA busy_timeout=5000")
|
|
125
|
-
conn.row_factory = sqlite3.Row
|
|
126
|
-
return conn
|
|
127
|
-
|
|
128
|
-
def _init_schema(self) -> None:
|
|
129
|
-
"""Create tables and indexes if they do not exist."""
|
|
130
|
-
conn = self._connect()
|
|
131
|
-
try:
|
|
132
|
-
conn.executescript(_SCHEMA)
|
|
133
|
-
conn.commit()
|
|
134
|
-
finally:
|
|
135
|
-
conn.close()
|
|
136
|
-
|
|
137
|
-
@staticmethod
|
|
138
|
-
def _now() -> str:
|
|
139
|
-
return datetime.now(timezone.utc).isoformat()
|
|
140
|
-
|
|
141
|
-
def store_signal(
|
|
142
|
-
self,
|
|
143
|
-
profile_id: str,
|
|
144
|
-
query: str,
|
|
145
|
-
fact_id: str,
|
|
146
|
-
signal_type: str,
|
|
147
|
-
value: float = 1.0,
|
|
148
|
-
) -> int:
|
|
149
|
-
"""Record a feedback signal (e.g. recall_hit, recall_miss).
|
|
150
|
-
|
|
151
|
-
Args:
|
|
152
|
-
profile_id: Owning profile.
|
|
153
|
-
query: The user query that produced this signal.
|
|
154
|
-
fact_id: The fact that was matched (or missed).
|
|
155
|
-
signal_type: Label for the signal kind.
|
|
156
|
-
value: Numeric value (1.0 = strong positive, 0.0 = negative).
|
|
157
|
-
|
|
158
|
-
Returns:
|
|
159
|
-
Row ID of the inserted signal.
|
|
160
|
-
"""
|
|
161
|
-
with self._lock:
|
|
162
|
-
conn = self._connect()
|
|
163
|
-
try:
|
|
164
|
-
cur = conn.execute(
|
|
165
|
-
"INSERT INTO learning_signals "
|
|
166
|
-
"(profile_id, query, fact_id, signal_type, value, created_at) "
|
|
167
|
-
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
168
|
-
(profile_id, query, fact_id, signal_type, value, self._now()),
|
|
169
|
-
)
|
|
170
|
-
conn.commit()
|
|
171
|
-
return cur.lastrowid # type: ignore[return-value]
|
|
172
|
-
except sqlite3.Error as exc:
|
|
173
|
-
conn.rollback()
|
|
174
|
-
logger.error("store_signal failed: %s", exc)
|
|
175
|
-
raise
|
|
176
|
-
finally:
|
|
177
|
-
conn.close()
|
|
178
|
-
|
|
179
|
-
def get_signal_count(self, profile_id: str) -> int:
|
|
180
|
-
"""Count feedback signals for a profile.
|
|
181
|
-
|
|
182
|
-
Used to determine the adaptive ranker phase:
|
|
183
|
-
phase 1 (<20 signals) = defaults, phase 2 (20-200) = heuristic,
|
|
184
|
-
phase 3 (>200) = LightGBM.
|
|
185
|
-
"""
|
|
186
|
-
conn = self._connect()
|
|
187
|
-
try:
|
|
188
|
-
row = conn.execute(
|
|
189
|
-
"SELECT COUNT(*) AS cnt FROM learning_signals "
|
|
190
|
-
f"WHERE profile_id = ?{FEEDBACK_ONLY_SQL}",
|
|
191
|
-
(profile_id,),
|
|
192
|
-
).fetchone()
|
|
193
|
-
return int(row["cnt"]) if row else 0
|
|
194
|
-
finally:
|
|
195
|
-
conn.close()
|
|
196
|
-
|
|
197
|
-
def store_features(
|
|
198
|
-
self,
|
|
199
|
-
profile_id: str,
|
|
200
|
-
query_id: str,
|
|
201
|
-
fact_id: str,
|
|
202
|
-
features: dict[str, float],
|
|
203
|
-
label: float,
|
|
204
|
-
) -> int:
|
|
205
|
-
"""Store a labeled feature vector for LightGBM training.
|
|
206
|
-
|
|
207
|
-
Args:
|
|
208
|
-
profile_id: Owning profile.
|
|
209
|
-
query_id: Identifier for the query (hash or UUID).
|
|
210
|
-
fact_id: Identifier for the candidate fact.
|
|
211
|
-
features: Feature dict (e.g. semantic_score, bm25_score, ...).
|
|
212
|
-
label: Relevance label (1.0 = relevant, 0.0 = irrelevant).
|
|
213
|
-
|
|
214
|
-
Returns:
|
|
215
|
-
Row ID of the inserted record.
|
|
216
|
-
"""
|
|
217
|
-
features_json = json.dumps(features, sort_keys=True)
|
|
218
|
-
with self._lock:
|
|
219
|
-
conn = self._connect()
|
|
220
|
-
try:
|
|
221
|
-
cur = conn.execute(
|
|
222
|
-
"INSERT INTO learning_features "
|
|
223
|
-
"(profile_id, query_id, fact_id, features_json, label, created_at) "
|
|
224
|
-
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
225
|
-
(profile_id, query_id, fact_id, features_json, label, self._now()),
|
|
226
|
-
)
|
|
227
|
-
conn.commit()
|
|
228
|
-
return cur.lastrowid # type: ignore[return-value]
|
|
229
|
-
except sqlite3.Error as exc:
|
|
230
|
-
conn.rollback()
|
|
231
|
-
logger.error("store_features failed: %s", exc)
|
|
232
|
-
raise
|
|
233
|
-
finally:
|
|
234
|
-
conn.close()
|
|
235
|
-
|
|
236
|
-
def get_training_data(self, profile_id: str, limit: int = 5000) -> list[dict[str, Any]]:
|
|
237
|
-
"""Retrieve labeled feature vectors for model training.
|
|
238
|
-
|
|
239
|
-
Returns newest examples first. Each dict contains:
|
|
240
|
-
query_id, fact_id, features (dict), label, created_at.
|
|
241
|
-
"""
|
|
242
|
-
conn = self._connect()
|
|
243
|
-
try:
|
|
244
|
-
rows = conn.execute(
|
|
245
|
-
"SELECT query_id, fact_id, features_json, label, created_at "
|
|
246
|
-
"FROM learning_features WHERE profile_id = ? "
|
|
247
|
-
"ORDER BY created_at DESC LIMIT ?",
|
|
248
|
-
(profile_id, limit),
|
|
249
|
-
).fetchall()
|
|
250
|
-
results: list[dict[str, Any]] = []
|
|
251
|
-
for row in rows:
|
|
252
|
-
d = dict(row)
|
|
253
|
-
d["features"] = json.loads(d.pop("features_json"))
|
|
254
|
-
results.append(d)
|
|
255
|
-
return results
|
|
256
|
-
finally:
|
|
257
|
-
conn.close()
|
|
258
|
-
|
|
259
|
-
def store_model_state(self, profile_id: str, state_bytes: bytes) -> None:
|
|
260
|
-
"""Persist serialized model weights for a profile.
|
|
261
|
-
|
|
262
|
-
Uses INSERT OR REPLACE so only one state row per profile exists.
|
|
263
|
-
|
|
264
|
-
Args:
|
|
265
|
-
profile_id: Owning profile.
|
|
266
|
-
state_bytes: Serialized model bytes (from joblib or similar).
|
|
267
|
-
"""
|
|
268
|
-
with self._lock:
|
|
269
|
-
conn = self._connect()
|
|
270
|
-
try:
|
|
271
|
-
conn.execute(
|
|
272
|
-
"INSERT INTO learning_model_state "
|
|
273
|
-
"(profile_id, state_bytes, updated_at) "
|
|
274
|
-
"VALUES (?, ?, ?) "
|
|
275
|
-
"ON CONFLICT(profile_id) DO UPDATE SET "
|
|
276
|
-
"state_bytes = excluded.state_bytes, "
|
|
277
|
-
"updated_at = excluded.updated_at",
|
|
278
|
-
(profile_id, state_bytes, self._now()),
|
|
279
|
-
)
|
|
280
|
-
conn.commit()
|
|
281
|
-
except sqlite3.Error as exc:
|
|
282
|
-
conn.rollback()
|
|
283
|
-
logger.error("store_model_state failed: %s", exc)
|
|
284
|
-
raise
|
|
285
|
-
finally:
|
|
286
|
-
conn.close()
|
|
287
|
-
|
|
288
|
-
def load_model_state(self, profile_id: str) -> Optional[bytes]:
|
|
289
|
-
"""Load serialized model weights for a profile.
|
|
290
|
-
|
|
291
|
-
Returns:
|
|
292
|
-
The stored bytes, or None if no model has been persisted.
|
|
293
|
-
"""
|
|
294
|
-
conn = self._connect()
|
|
295
|
-
try:
|
|
296
|
-
row = conn.execute(
|
|
297
|
-
"SELECT state_bytes FROM learning_model_state WHERE profile_id = ?",
|
|
298
|
-
(profile_id,),
|
|
299
|
-
).fetchone()
|
|
300
|
-
return bytes(row["state_bytes"]) if row else None
|
|
301
|
-
finally:
|
|
302
|
-
conn.close()
|
|
303
|
-
|
|
304
|
-
def record_engagement(
|
|
305
|
-
self,
|
|
306
|
-
profile_id: str,
|
|
307
|
-
metric_type: str,
|
|
308
|
-
value: float = 1.0,
|
|
309
|
-
) -> None:
|
|
310
|
-
"""Increment (or create) an engagement counter.
|
|
311
|
-
|
|
312
|
-
Examples of metric_type: recall_count, store_count,
|
|
313
|
-
search_count, feedback_count.
|
|
314
|
-
|
|
315
|
-
Args:
|
|
316
|
-
profile_id: Owning profile.
|
|
317
|
-
metric_type: The metric name.
|
|
318
|
-
value: Amount to add (default 1).
|
|
319
|
-
"""
|
|
320
|
-
with self._lock:
|
|
321
|
-
conn = self._connect()
|
|
322
|
-
try:
|
|
323
|
-
existing = conn.execute(
|
|
324
|
-
"SELECT id, value FROM engagement_metrics "
|
|
325
|
-
"WHERE profile_id = ? AND metric_type = ?",
|
|
326
|
-
(profile_id, metric_type),
|
|
327
|
-
).fetchone()
|
|
328
|
-
|
|
329
|
-
if existing:
|
|
330
|
-
new_value = float(existing["value"]) + value
|
|
331
|
-
conn.execute(
|
|
332
|
-
"UPDATE engagement_metrics SET value = ?, updated_at = ? WHERE id = ?",
|
|
333
|
-
(new_value, self._now(), existing["id"]),
|
|
334
|
-
)
|
|
335
|
-
else:
|
|
336
|
-
conn.execute(
|
|
337
|
-
"INSERT INTO engagement_metrics "
|
|
338
|
-
"(profile_id, metric_type, value, updated_at) "
|
|
339
|
-
"VALUES (?, ?, ?, ?)",
|
|
340
|
-
(profile_id, metric_type, value, self._now()),
|
|
341
|
-
)
|
|
342
|
-
conn.commit()
|
|
343
|
-
except sqlite3.Error as exc:
|
|
344
|
-
conn.rollback()
|
|
345
|
-
logger.error("record_engagement failed: %s", exc)
|
|
346
|
-
raise
|
|
347
|
-
finally:
|
|
348
|
-
conn.close()
|
|
349
|
-
|
|
350
|
-
def get_engagement_stats(self, profile_id: str) -> dict[str, float]:
|
|
351
|
-
"""Get all engagement counters for a profile.
|
|
352
|
-
|
|
353
|
-
Returns:
|
|
354
|
-
Dict mapping metric_type to cumulative value.
|
|
355
|
-
Empty dict if no engagement data exists.
|
|
356
|
-
"""
|
|
357
|
-
conn = self._connect()
|
|
358
|
-
try:
|
|
359
|
-
rows = conn.execute(
|
|
360
|
-
"SELECT metric_type, value FROM engagement_metrics WHERE profile_id = ?",
|
|
361
|
-
(profile_id,),
|
|
362
|
-
).fetchall()
|
|
363
|
-
return {row["metric_type"]: float(row["value"]) for row in rows}
|
|
364
|
-
finally:
|
|
365
|
-
conn.close()
|
|
366
|
-
|
|
367
|
-
# ------------------------------------------------------------------
|
|
368
|
-
# LLD-02 §4.8 — v3.4.22 writer surface
|
|
369
|
-
# ------------------------------------------------------------------
|
|
370
|
-
|
|
371
|
-
def count_signals(self, profile_id: str) -> int:
|
|
372
|
-
"""Count FEEDBACK rows in ``learning_signals`` for ``profile_id``.
|
|
373
|
-
|
|
374
|
-
Used by ``_compute_ranker_phase`` + consolidation_worker training
|
|
375
|
-
gate. Pure SELECT — thread-safe without lock.
|
|
376
|
-
|
|
377
|
-
Exposure rows are excluded. This counted every row until 4.1.0, which
|
|
378
|
-
on a live store meant 5,352 instead of 2 — a 2,675x inflation that
|
|
379
|
-
held the ranker in Phase 3 on two feedback events. See
|
|
380
|
-
``learning/signal_kinds.py`` for why the predicate excludes exposures
|
|
381
|
-
rather than naming feedback kinds.
|
|
382
|
-
"""
|
|
383
|
-
conn = self._connect()
|
|
384
|
-
try:
|
|
385
|
-
row = conn.execute(
|
|
386
|
-
"SELECT COUNT(*) AS cnt FROM learning_signals "
|
|
387
|
-
f"WHERE profile_id = ?{FEEDBACK_ONLY_SQL}",
|
|
388
|
-
(profile_id,),
|
|
389
|
-
).fetchone()
|
|
390
|
-
return int(row["cnt"]) if row else 0
|
|
391
|
-
finally:
|
|
392
|
-
conn.close()
|
|
393
|
-
|
|
394
|
-
def persist_model(
|
|
395
|
-
self,
|
|
396
|
-
*,
|
|
397
|
-
profile_id: str,
|
|
398
|
-
state_bytes: bytes,
|
|
399
|
-
bytes_sha256: str,
|
|
400
|
-
feature_names: list[str],
|
|
401
|
-
trained_on_count: int,
|
|
402
|
-
metrics: dict,
|
|
403
|
-
model_version: str = "3.4.23",
|
|
404
|
-
) -> int:
|
|
405
|
-
"""Persist a newly trained model and flip the active flag.
|
|
406
|
-
|
|
407
|
-
LLD-02 §4.8 — single TX:
|
|
408
|
-
1. UPDATE existing active row → is_active = 0.
|
|
409
|
-
2. INSERT new row with is_active = 1.
|
|
410
|
-
|
|
411
|
-
Requires M002 (columns ``bytes_sha256``, ``feature_names``,
|
|
412
|
-
``metrics_json``, ``trained_on_count``, ``is_active``). Raises if
|
|
413
|
-
M002 hasn't been applied.
|
|
414
|
-
|
|
415
|
-
Returns the new row id.
|
|
416
|
-
"""
|
|
417
|
-
if not isinstance(state_bytes, (bytes, bytearray)):
|
|
418
|
-
raise TypeError("state_bytes must be bytes")
|
|
419
|
-
if not bytes_sha256 or len(bytes_sha256) != 64:
|
|
420
|
-
raise ValueError("bytes_sha256 must be 64 hex chars")
|
|
421
|
-
names_json = json.dumps(list(feature_names), separators=(",", ":"))
|
|
422
|
-
metrics_json = json.dumps(dict(metrics), separators=(",", ":"))
|
|
423
|
-
now = self._now()
|
|
424
|
-
|
|
425
|
-
with self._lock:
|
|
426
|
-
conn = self._connect()
|
|
427
|
-
try:
|
|
428
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
429
|
-
conn.execute(
|
|
430
|
-
"UPDATE learning_model_state "
|
|
431
|
-
"SET is_active = 0 "
|
|
432
|
-
"WHERE profile_id = ? AND is_active = 1",
|
|
433
|
-
(profile_id,),
|
|
434
|
-
)
|
|
435
|
-
cur = conn.execute(
|
|
436
|
-
"INSERT INTO learning_model_state "
|
|
437
|
-
"(profile_id, model_version, state_bytes, bytes_sha256, "
|
|
438
|
-
" trained_on_count, feature_names, metrics_json, "
|
|
439
|
-
" is_active, trained_at, updated_at) "
|
|
440
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?)",
|
|
441
|
-
(
|
|
442
|
-
profile_id,
|
|
443
|
-
model_version,
|
|
444
|
-
bytes(state_bytes),
|
|
445
|
-
bytes_sha256.lower(),
|
|
446
|
-
int(trained_on_count),
|
|
447
|
-
names_json,
|
|
448
|
-
metrics_json,
|
|
449
|
-
now,
|
|
450
|
-
now,
|
|
451
|
-
),
|
|
452
|
-
)
|
|
453
|
-
conn.commit()
|
|
454
|
-
return int(cur.lastrowid or 0)
|
|
455
|
-
except sqlite3.Error as exc:
|
|
456
|
-
conn.rollback()
|
|
457
|
-
logger.error("persist_model failed: %s", exc)
|
|
458
|
-
raise
|
|
459
|
-
finally:
|
|
460
|
-
conn.close()
|
|
461
|
-
|
|
462
|
-
def load_active_model(self, profile_id: str) -> Optional[dict]:
|
|
463
|
-
"""Return the active model row as a dict, or ``None`` if none.
|
|
464
|
-
|
|
465
|
-
Post-M002 schema. Keys: ``state_bytes``, ``bytes_sha256``,
|
|
466
|
-
``feature_names`` (JSON str), ``trained_at``, ``model_version``.
|
|
467
|
-
"""
|
|
468
|
-
conn = self._connect()
|
|
469
|
-
try:
|
|
470
|
-
row = conn.execute(
|
|
471
|
-
"SELECT state_bytes, bytes_sha256, feature_names, trained_at, "
|
|
472
|
-
" model_version "
|
|
473
|
-
"FROM learning_model_state "
|
|
474
|
-
"WHERE profile_id = ? AND is_active = 1 "
|
|
475
|
-
"LIMIT 1",
|
|
476
|
-
(profile_id,),
|
|
477
|
-
).fetchone()
|
|
478
|
-
if row is None:
|
|
479
|
-
return None
|
|
480
|
-
return {
|
|
481
|
-
"state_bytes": bytes(row["state_bytes"]),
|
|
482
|
-
"bytes_sha256": row["bytes_sha256"],
|
|
483
|
-
"feature_names": row["feature_names"],
|
|
484
|
-
"trained_at": row["trained_at"],
|
|
485
|
-
"model_version": row["model_version"],
|
|
486
|
-
}
|
|
487
|
-
except sqlite3.Error as exc:
|
|
488
|
-
logger.error("load_active_model failed: %s", exc)
|
|
489
|
-
return None
|
|
490
|
-
finally:
|
|
491
|
-
conn.close()
|
|
492
|
-
|
|
493
|
-
# --- training-row fetch (version-gated on M006) --------------------
|
|
494
|
-
|
|
495
|
-
_SQL_POSITION_ONLY = (
|
|
496
|
-
"SELECT s.id AS signal_id, s.query_id, s.fact_id, s.position, "
|
|
497
|
-
" s.created_at, f.features_json, NULL AS outcome_reward "
|
|
498
|
-
"FROM learning_signals s "
|
|
499
|
-
"JOIN learning_features f "
|
|
500
|
-
" ON f.signal_id = s.id AND f.profile_id = s.profile_id "
|
|
501
|
-
"WHERE s.profile_id = ? "
|
|
502
|
-
" AND s.signal_type IN ('candidate', 'shown', 'legacy_feedback') "
|
|
503
|
-
" AND f.is_synthetic = 0 "
|
|
504
|
-
"ORDER BY s.created_at DESC "
|
|
505
|
-
"LIMIT ?"
|
|
506
|
-
)
|
|
507
|
-
|
|
508
|
-
_SQL_WITH_OUTCOMES = (
|
|
509
|
-
"SELECT s.id AS signal_id, s.query_id, s.fact_id, s.position, "
|
|
510
|
-
" s.created_at, f.features_json, o.reward AS outcome_reward "
|
|
511
|
-
"FROM learning_signals s "
|
|
512
|
-
"JOIN learning_features f "
|
|
513
|
-
" ON f.signal_id = s.id AND f.profile_id = s.profile_id "
|
|
514
|
-
"LEFT JOIN action_outcomes o "
|
|
515
|
-
" ON o.recall_query_id = s.query_id AND o.settled = 1 "
|
|
516
|
-
"WHERE s.profile_id = ? "
|
|
517
|
-
" AND s.signal_type IN ('candidate', 'shown', 'legacy_feedback') "
|
|
518
|
-
" AND f.is_synthetic = 0 "
|
|
519
|
-
" AND (o.settled IS NULL OR "
|
|
520
|
-
" (julianday('now') - julianday(o.settled_at)) * 86400.0 >= ?) "
|
|
521
|
-
"ORDER BY s.created_at DESC "
|
|
522
|
-
"LIMIT ?"
|
|
523
|
-
)
|
|
524
|
-
|
|
525
|
-
def _migration_applied(self, name: str) -> bool:
|
|
526
|
-
"""Return True if ``name`` is recorded complete in migration_log.
|
|
527
|
-
|
|
528
|
-
M006 (action_outcomes.reward) lands in v3.4.22. When absent, we
|
|
529
|
-
fall back to the position-only training query.
|
|
530
|
-
"""
|
|
531
|
-
conn = self._connect()
|
|
532
|
-
try:
|
|
533
|
-
row = conn.execute(
|
|
534
|
-
"SELECT status FROM migration_log WHERE name = ?",
|
|
535
|
-
(name,),
|
|
536
|
-
).fetchone()
|
|
537
|
-
except sqlite3.Error:
|
|
538
|
-
return False
|
|
539
|
-
finally:
|
|
540
|
-
conn.close()
|
|
541
|
-
if row is None:
|
|
542
|
-
return False
|
|
543
|
-
return row["status"] == "complete"
|
|
544
|
-
|
|
545
|
-
def fetch_training_examples(
|
|
546
|
-
self,
|
|
547
|
-
*,
|
|
548
|
-
profile_id: str,
|
|
549
|
-
limit: int = 2000,
|
|
550
|
-
min_outcome_age_sec: int = 60,
|
|
551
|
-
include_synthetic: bool = False,
|
|
552
|
-
) -> list[dict]:
|
|
553
|
-
"""Fetch training rows for LightGBM lambdarank training.
|
|
554
|
-
|
|
555
|
-
Version-gated on M006: without the ``reward`` column we return rows
|
|
556
|
-
with ``outcome_reward = None`` and the labeler falls through to the
|
|
557
|
-
position proxy (§4.7).
|
|
558
|
-
|
|
559
|
-
When ``include_synthetic`` is True, migrated legacy rows (with
|
|
560
|
-
``learning_features.is_synthetic=1``) are included. The default
|
|
561
|
-
(False) preserves Stage 8 D9 — synthetic rows excluded unless the
|
|
562
|
-
caller opts in explicitly. The UI exposes this via the
|
|
563
|
-
"Migrate legacy data" flow so users consciously choose to let their
|
|
564
|
-
pre-v3.4.22 feedback bootstrap the model.
|
|
565
|
-
|
|
566
|
-
Returns rows sorted newest-first; the caller is expected to regroup
|
|
567
|
-
by ``query_id`` before training.
|
|
568
|
-
"""
|
|
569
|
-
m006_applied = self._migration_applied("M006_action_outcomes_reward")
|
|
570
|
-
sql = self._SQL_WITH_OUTCOMES if m006_applied else self._SQL_POSITION_ONLY
|
|
571
|
-
if include_synthetic:
|
|
572
|
-
# Drop the synthetic-filter clause verbatim. Safe because the
|
|
573
|
-
# surrounding clauses already reference ``f.`` so removing this
|
|
574
|
-
# one keeps the SQL grammatically valid.
|
|
575
|
-
sql = sql.replace(" AND f.is_synthetic = 0 ", " ")
|
|
576
|
-
params: tuple
|
|
577
|
-
if m006_applied:
|
|
578
|
-
params = (profile_id, int(min_outcome_age_sec), int(limit))
|
|
579
|
-
else:
|
|
580
|
-
params = (profile_id, int(limit))
|
|
581
|
-
conn = self._connect()
|
|
582
|
-
try:
|
|
583
|
-
try:
|
|
584
|
-
rows = conn.execute(sql, params).fetchall()
|
|
585
|
-
except sqlite3.Error as exc:
|
|
586
|
-
logger.warning(
|
|
587
|
-
"fetch_training_examples failed (m006=%s): %s",
|
|
588
|
-
m006_applied,
|
|
589
|
-
exc,
|
|
590
|
-
)
|
|
591
|
-
return []
|
|
592
|
-
out: list[dict] = []
|
|
593
|
-
for row in rows:
|
|
594
|
-
d = dict(row)
|
|
595
|
-
try:
|
|
596
|
-
d["features"] = json.loads(d.pop("features_json") or "{}")
|
|
597
|
-
except (ValueError, TypeError):
|
|
598
|
-
d["features"] = {}
|
|
599
|
-
out.append(d)
|
|
600
|
-
return out
|
|
601
|
-
finally:
|
|
602
|
-
conn.close()
|
|
603
|
-
|
|
604
|
-
def reset(self, profile_id: Optional[str] = None) -> None:
|
|
605
|
-
"""Delete learning data. GDPR Article 17 handler.
|
|
606
|
-
|
|
607
|
-
Args:
|
|
608
|
-
profile_id: If provided, only erase data for that profile.
|
|
609
|
-
If None, erase ALL learning data.
|
|
610
|
-
"""
|
|
611
|
-
if profile_id:
|
|
612
|
-
from superlocalmemory.storage.agent_experience import purge_profile_receipts
|
|
613
|
-
|
|
614
|
-
purge_profile_receipts(self._db_path, profile_id, close_profile=False)
|
|
615
|
-
with self._lock:
|
|
616
|
-
conn = self._connect()
|
|
617
|
-
try:
|
|
618
|
-
tables = [
|
|
619
|
-
"learning_signals",
|
|
620
|
-
"learning_features",
|
|
621
|
-
"learning_model_state",
|
|
622
|
-
"engagement_metrics",
|
|
623
|
-
# bandit_plays holds shown_fact_ids — the identifiers of the
|
|
624
|
-
# memories a person was actually shown — and bandit_arms is
|
|
625
|
-
# a derived behavioural profile. Both are personal data and
|
|
626
|
-
# neither was erased: this list was hardcoded, so
|
|
627
|
-
# forget_profile() reported success and left a row reading
|
|
628
|
-
# ["alice-private-memory-1", ...] in place. Reproduced
|
|
629
|
-
# before fixing.
|
|
630
|
-
#
|
|
631
|
-
# The retention sweep is not a substitute. It deletes only
|
|
632
|
-
# SETTLED plays older than the horizon, so an unsettled row
|
|
633
|
-
# would have survived indefinitely.
|
|
634
|
-
"bandit_plays",
|
|
635
|
-
"bandit_arms",
|
|
636
|
-
]
|
|
637
|
-
receipt_tables = {
|
|
638
|
-
row[0]
|
|
639
|
-
for row in conn.execute(
|
|
640
|
-
"SELECT name FROM sqlite_master WHERE type='table' "
|
|
641
|
-
"AND name IN ('agent_experiences', 'cognitive_turn_receipts', "
|
|
642
|
-
"'external_evidence_receipts', 'execution_learning_receipts', "
|
|
643
|
-
"'execution_learning_events')"
|
|
644
|
-
)
|
|
645
|
-
}
|
|
646
|
-
if profile_id is None:
|
|
647
|
-
tables.extend(sorted(receipt_tables))
|
|
648
|
-
present = {
|
|
649
|
-
row[0] for row in conn.execute(
|
|
650
|
-
"SELECT name FROM sqlite_master WHERE type='table'"
|
|
651
|
-
)
|
|
652
|
-
}
|
|
653
|
-
for table in tables:
|
|
654
|
-
# A store predating any of these tables must not abort the
|
|
655
|
-
# erasure of the rest — an Article 17 request that fails
|
|
656
|
-
# halfway is worse than one that skips an absent table.
|
|
657
|
-
if table not in present:
|
|
658
|
-
continue
|
|
659
|
-
if profile_id:
|
|
660
|
-
conn.execute(
|
|
661
|
-
f"DELETE FROM {table} WHERE profile_id = ?",
|
|
662
|
-
(profile_id,),
|
|
663
|
-
)
|
|
664
|
-
else:
|
|
665
|
-
conn.execute(f"DELETE FROM {table}")
|
|
666
|
-
conn.commit()
|
|
667
|
-
# The in-process ranking counter holds this profile's recent
|
|
668
|
-
# winners. Ephemeral, but an erasure must not leave them in a
|
|
669
|
-
# live process for the rest of its lifetime.
|
|
670
|
-
try:
|
|
671
|
-
from superlocalmemory.learning.pcos import RECENT_TOPS
|
|
672
|
-
|
|
673
|
-
RECENT_TOPS.forget(profile_id or "")
|
|
674
|
-
except Exception: # pragma: no cover — advisory
|
|
675
|
-
pass
|
|
676
|
-
# The per-session working set is this profile's data too.
|
|
677
|
-
# Cleared here as well as in the compliance path, because this
|
|
678
|
-
# is reached directly — by the transaction owners and by tests —
|
|
679
|
-
# and a residue left behind goes on biasing any later session
|
|
680
|
-
# that reuses one of the erased profile's session ids.
|
|
681
|
-
try:
|
|
682
|
-
from superlocalmemory.core.working_memory import (
|
|
683
|
-
discard_profile,
|
|
684
|
-
)
|
|
685
|
-
|
|
686
|
-
discard_profile(profile_id or "")
|
|
687
|
-
except Exception: # pragma: no cover — never block an erasure
|
|
688
|
-
pass
|
|
689
|
-
logger.info(
|
|
690
|
-
"Learning data reset%s",
|
|
691
|
-
f" for profile {profile_id}" if profile_id else " (all)",
|
|
692
|
-
)
|
|
693
|
-
except sqlite3.Error as exc:
|
|
694
|
-
conn.rollback()
|
|
695
|
-
logger.error("reset failed: %s", exc)
|
|
696
|
-
raise
|
|
697
|
-
finally:
|
|
698
|
-
conn.close()
|