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,646 +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
|
-
"""Zero-Cost Learning Signals — mathematical learning without LLM tokens.
|
|
6
|
-
|
|
7
|
-
Four signal types that improve retrieval quality over time:
|
|
8
|
-
|
|
9
|
-
1. Entropy Gap — Surprising content gets deeper indexing.
|
|
10
|
-
2. Co-Retrieval — Memories retrieved together strengthen graph edges.
|
|
11
|
-
3. Channel Credit — Track which retrieval channel works for which query type.
|
|
12
|
-
4. Confidence Lifecycle — Boost on access, decay over time.
|
|
13
|
-
|
|
14
|
-
All signals are computed locally with zero LLM cost.
|
|
15
|
-
Inspired by: Nemori (entropy), A-Mem (link evolution), RMM (citation feedback).
|
|
16
|
-
|
|
17
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import hashlib
|
|
23
|
-
import json
|
|
24
|
-
import logging
|
|
25
|
-
import math
|
|
26
|
-
import queue
|
|
27
|
-
import sqlite3
|
|
28
|
-
import threading
|
|
29
|
-
from dataclasses import dataclass, field
|
|
30
|
-
from datetime import datetime, timezone
|
|
31
|
-
from pathlib import Path
|
|
32
|
-
from typing import Any
|
|
33
|
-
|
|
34
|
-
logger = logging.getLogger(__name__)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# ===========================================================================
|
|
38
|
-
# LLD-02 §4.1 — SignalBatch + enqueue + record_signal_batch
|
|
39
|
-
# ===========================================================================
|
|
40
|
-
#
|
|
41
|
-
# These module-level helpers are the v3.4.22 signal pipeline. The class
|
|
42
|
-
# ``LearningSignals`` below stays in place for v3.4.20 compatibility (D5);
|
|
43
|
-
# new writers go through ``enqueue`` / ``record_signal_batch``.
|
|
44
|
-
# ---------------------------------------------------------------------------
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@dataclass(frozen=True)
|
|
48
|
-
class SignalCandidate:
|
|
49
|
-
"""One candidate returned by the retrieval pipeline for signal recording.
|
|
50
|
-
|
|
51
|
-
Immutable (frozen=True). Carries the minimum needed to write both a
|
|
52
|
-
``learning_signals`` row and a ``learning_features`` row in a single TX.
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
fact_id: str
|
|
56
|
-
channel_scores: dict[str, float] = field(default_factory=dict)
|
|
57
|
-
cross_encoder_score: float | None = None
|
|
58
|
-
# Full result dict — used by FeatureExtractor.extract(); kept lazily so we
|
|
59
|
-
# only serialise features at drain time, not enqueue time.
|
|
60
|
-
result_dict: dict[str, Any] = field(default_factory=dict)
|
|
61
|
-
|
|
62
|
-
def to_result_dict(self) -> dict[str, Any]:
|
|
63
|
-
"""Return a result dict suitable for ``FeatureExtractor.extract()``.
|
|
64
|
-
|
|
65
|
-
Includes channel_scores and cross_encoder_score. Callers can override
|
|
66
|
-
by placing richer fields in ``result_dict`` at construction time.
|
|
67
|
-
"""
|
|
68
|
-
merged: dict[str, Any] = {"fact_id": self.fact_id}
|
|
69
|
-
if self.channel_scores:
|
|
70
|
-
merged["channel_scores"] = dict(self.channel_scores)
|
|
71
|
-
if self.cross_encoder_score is not None:
|
|
72
|
-
merged["cross_encoder_score"] = self.cross_encoder_score
|
|
73
|
-
# Caller-provided fields override defaults.
|
|
74
|
-
merged.update(self.result_dict)
|
|
75
|
-
return merged
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@dataclass(frozen=True)
|
|
79
|
-
class SignalBatch:
|
|
80
|
-
"""One recall's worth of signal rows. Enqueued onto the worker."""
|
|
81
|
-
|
|
82
|
-
profile_id: str
|
|
83
|
-
query_id: str
|
|
84
|
-
query_text: str
|
|
85
|
-
candidates: tuple[SignalCandidate, ...] = field(default_factory=tuple)
|
|
86
|
-
query_context: dict[str, Any] = field(default_factory=dict)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# Module-level bounded queue — one per process. Sized per LLD-02 §9
|
|
90
|
-
# ``SLM_SIGNAL_QUEUE_MAX`` (default 5000). Readers are the signal_worker.
|
|
91
|
-
_QUEUE_MAX: int = 5000
|
|
92
|
-
_Q: "queue.Queue[SignalBatch]" = queue.Queue(maxsize=_QUEUE_MAX)
|
|
93
|
-
|
|
94
|
-
# Observability counters — module-level so tests can reset/inspect.
|
|
95
|
-
_counters: dict[str, int] = {
|
|
96
|
-
"signal_dropped_total": 0,
|
|
97
|
-
"signal_enqueued_total": 0,
|
|
98
|
-
"enqueue_failed_total": 0,
|
|
99
|
-
"signal_drop_on_flush_total": 0,
|
|
100
|
-
}
|
|
101
|
-
_counters_lock = threading.Lock()
|
|
102
|
-
|
|
103
|
-
# Throttle drop-warning logging to once per 60 seconds (LLD-02 §4.2).
|
|
104
|
-
_last_drop_log_ts: list[float] = [0.0]
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def _bump(counter: str, n: int = 1) -> None:
|
|
108
|
-
with _counters_lock:
|
|
109
|
-
_counters[counter] = _counters.get(counter, 0) + n
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
# S8-ARC-03 (v3.4.22): public producer/consumer contract. ``signal_worker``
|
|
113
|
-
# used to reach through ``signals._Q`` and ``signals._bump`` by name,
|
|
114
|
-
# which made the private-by-convention boundary the actual test seam
|
|
115
|
-
# too. These wrappers are the sanctioned surface; ``_Q`` / ``_bump`` stay
|
|
116
|
-
# internal, and test-only helpers live on the ``_testing`` submodule.
|
|
117
|
-
def get_queue() -> "queue.Queue[SignalBatch]":
|
|
118
|
-
"""Return the module-level producer queue (shared across threads)."""
|
|
119
|
-
import sys as _sys
|
|
120
|
-
# Tests may monkeypatch _Q by attribute — resolve dynamically.
|
|
121
|
-
return getattr(_sys.modules[__name__], "_Q", None) or _Q
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def bump_counter(counter: str, n: int = 1) -> None:
|
|
125
|
-
"""Public counter increment (identical semantics to internal ``_bump``)."""
|
|
126
|
-
_bump(counter, n)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def get_counters() -> dict[str, int]:
|
|
130
|
-
"""Return a snapshot of signal pipeline counters."""
|
|
131
|
-
with _counters_lock:
|
|
132
|
-
return dict(_counters)
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def reset_counters() -> None:
|
|
136
|
-
"""Reset counters to zero — TEST-ONLY helper."""
|
|
137
|
-
with _counters_lock:
|
|
138
|
-
for k in _counters:
|
|
139
|
-
_counters[k] = 0
|
|
140
|
-
_last_drop_log_ts[0] = 0.0
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def _drain_queue_for_tests() -> None:
|
|
144
|
-
"""Drain the module queue — TEST-ONLY.
|
|
145
|
-
|
|
146
|
-
Swallows AttributeError so test harnesses that swap in a minimal
|
|
147
|
-
stub queue (e.g. exploding-queue fixtures) can still clean up.
|
|
148
|
-
"""
|
|
149
|
-
while True:
|
|
150
|
-
try:
|
|
151
|
-
_Q.get_nowait()
|
|
152
|
-
except queue.Empty:
|
|
153
|
-
return
|
|
154
|
-
except AttributeError:
|
|
155
|
-
return
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def queue_size() -> int:
|
|
159
|
-
"""Return current queue depth — used by worker + tests."""
|
|
160
|
-
import sys as _sys
|
|
161
|
-
q = getattr(_sys.modules[__name__], "_Q", None) or _Q
|
|
162
|
-
return q.qsize()
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def _hash_query(query_text: str) -> str:
|
|
166
|
-
"""Compute ``query_text_hash`` per LLD-02 §4.1.
|
|
167
|
-
|
|
168
|
-
Lowercased, stripped, SHA-256 truncated to 32 hex chars. Stored in the
|
|
169
|
-
``learning_signals.query_text_hash`` column. The raw ``query`` column
|
|
170
|
-
MUST stay empty (S2 privacy rule).
|
|
171
|
-
"""
|
|
172
|
-
normalised = (query_text or "").lower().strip().encode("utf-8")
|
|
173
|
-
return hashlib.sha256(normalised).hexdigest()[:32]
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def enqueue(batch: SignalBatch) -> None:
|
|
177
|
-
"""Non-blocking enqueue of a SignalBatch.
|
|
178
|
-
|
|
179
|
-
Hot-path-safe: never raises, never blocks longer than a ``put_nowait``.
|
|
180
|
-
Drops with a counter bump if the queue is full (SW2).
|
|
181
|
-
Wraps ``queue.put_nowait`` exceptions (RP1 — never propagate).
|
|
182
|
-
"""
|
|
183
|
-
import sys as _sys
|
|
184
|
-
import time as _time
|
|
185
|
-
|
|
186
|
-
if batch is None or not isinstance(batch, SignalBatch):
|
|
187
|
-
_bump("enqueue_failed_total")
|
|
188
|
-
return
|
|
189
|
-
|
|
190
|
-
# Resolve the queue through the module to honour monkeypatches in tests
|
|
191
|
-
# and future runtime reconfig. This is cheap — one dict lookup.
|
|
192
|
-
q = getattr(_sys.modules[__name__], "_Q", None) or _Q
|
|
193
|
-
|
|
194
|
-
try:
|
|
195
|
-
q.put_nowait(batch)
|
|
196
|
-
except queue.Full:
|
|
197
|
-
_bump("signal_dropped_total")
|
|
198
|
-
now = _time.monotonic()
|
|
199
|
-
if now - _last_drop_log_ts[0] >= 60.0:
|
|
200
|
-
_last_drop_log_ts[0] = now
|
|
201
|
-
logger.warning(
|
|
202
|
-
"signal queue full; dropped batch (total dropped=%d)",
|
|
203
|
-
get_counters()["signal_dropped_total"],
|
|
204
|
-
)
|
|
205
|
-
return
|
|
206
|
-
except Exception as exc: # pragma: no cover — defensive; never propagate.
|
|
207
|
-
_bump("enqueue_failed_total")
|
|
208
|
-
logger.debug("enqueue failed: %s", exc)
|
|
209
|
-
return
|
|
210
|
-
|
|
211
|
-
_bump("signal_enqueued_total")
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
def enqueue_shown_flip(query_id: str, fact_id: str, shown: bool) -> None:
|
|
215
|
-
"""Record whether a candidate was shown to the user.
|
|
216
|
-
|
|
217
|
-
LLD-02 §4.9 — replaces the old fake-positive ``recall_hit`` emission.
|
|
218
|
-
Updates ``learning_signals.signal_type`` to ``'shown'`` (or
|
|
219
|
-
``'not_shown'``) for an existing candidate row. Non-blocking;
|
|
220
|
-
defers the actual UPDATE to the signal_worker via a sentinel batch.
|
|
221
|
-
"""
|
|
222
|
-
# Use a zero-candidate batch carrying the flip in ``query_context``.
|
|
223
|
-
batch = SignalBatch(
|
|
224
|
-
profile_id="",
|
|
225
|
-
query_id=query_id,
|
|
226
|
-
query_text="",
|
|
227
|
-
candidates=(),
|
|
228
|
-
query_context={
|
|
229
|
-
"_shown_flip": {"fact_id": fact_id, "shown": bool(shown)},
|
|
230
|
-
},
|
|
231
|
-
)
|
|
232
|
-
enqueue(batch)
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
def _apply_shown_flip(conn: sqlite3.Connection, batch: SignalBatch) -> None:
|
|
236
|
-
"""Apply a shown-flip sentinel batch (see enqueue_shown_flip).
|
|
237
|
-
|
|
238
|
-
Updates the signal_type of matching ``(query_id, fact_id)`` rows.
|
|
239
|
-
Never invents reward data (S2 / M1 honesty rule).
|
|
240
|
-
"""
|
|
241
|
-
flip = batch.query_context.get("_shown_flip") or {}
|
|
242
|
-
fact_id = flip.get("fact_id")
|
|
243
|
-
shown = bool(flip.get("shown", False))
|
|
244
|
-
if not fact_id or not batch.query_id:
|
|
245
|
-
return
|
|
246
|
-
new_type = "shown" if shown else "not_shown"
|
|
247
|
-
conn.execute(
|
|
248
|
-
"UPDATE learning_signals SET signal_type = ? "
|
|
249
|
-
"WHERE query_id = ? AND fact_id = ?",
|
|
250
|
-
(new_type, batch.query_id, fact_id),
|
|
251
|
-
)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
def record_signal_batch(
|
|
255
|
-
conn: sqlite3.Connection, batch: SignalBatch,
|
|
256
|
-
) -> list[int]:
|
|
257
|
-
"""Synchronous write path used by the signal_worker drain.
|
|
258
|
-
|
|
259
|
-
Atomic (S1): signals+features INSERTs inside a single ``with conn:`` TX.
|
|
260
|
-
Privacy (S2): stores only ``query_text_hash``; ``query`` column is empty.
|
|
261
|
-
Handles the empty-candidate case (S3): returns ``[]`` with no side effect.
|
|
262
|
-
|
|
263
|
-
Args:
|
|
264
|
-
conn: sqlite3.Connection already configured (WAL, busy_timeout).
|
|
265
|
-
The caller owns the lifecycle.
|
|
266
|
-
batch: A ``SignalBatch``; if it carries a ``_shown_flip`` sentinel
|
|
267
|
-
the UPDATE path runs instead of the INSERT path.
|
|
268
|
-
|
|
269
|
-
Returns:
|
|
270
|
-
List of inserted ``learning_signals.id`` values in insert order.
|
|
271
|
-
Empty list if no candidates were present.
|
|
272
|
-
"""
|
|
273
|
-
# Shown-flip path — LLD-02 §4.9.
|
|
274
|
-
if batch.query_context and "_shown_flip" in batch.query_context:
|
|
275
|
-
with conn: # implicit BEGIN/COMMIT
|
|
276
|
-
_apply_shown_flip(conn, batch)
|
|
277
|
-
return []
|
|
278
|
-
|
|
279
|
-
if not batch.candidates:
|
|
280
|
-
return []
|
|
281
|
-
|
|
282
|
-
# Import lazily — avoids a circular import at module load time.
|
|
283
|
-
from superlocalmemory.learning.features import FeatureExtractor
|
|
284
|
-
|
|
285
|
-
query_hash = _hash_query(batch.query_text)
|
|
286
|
-
now_iso = datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
287
|
-
signal_ids: list[int] = []
|
|
288
|
-
|
|
289
|
-
with conn: # BEGIN ... COMMIT on success, ROLLBACK on exception (S1).
|
|
290
|
-
for i, cand in enumerate(batch.candidates):
|
|
291
|
-
cur = conn.execute(
|
|
292
|
-
"INSERT INTO learning_signals "
|
|
293
|
-
"(profile_id, query, fact_id, signal_type, value, created_at, "
|
|
294
|
-
" query_id, query_text_hash, position, channel_scores, "
|
|
295
|
-
" cross_encoder) "
|
|
296
|
-
"VALUES (?, '', ?, ?, 1.0, ?, ?, ?, ?, ?, ?)",
|
|
297
|
-
(
|
|
298
|
-
batch.profile_id,
|
|
299
|
-
cand.fact_id,
|
|
300
|
-
"candidate",
|
|
301
|
-
now_iso,
|
|
302
|
-
batch.query_id,
|
|
303
|
-
query_hash,
|
|
304
|
-
i,
|
|
305
|
-
json.dumps(cand.channel_scores, separators=(",", ":")),
|
|
306
|
-
cand.cross_encoder_score,
|
|
307
|
-
),
|
|
308
|
-
)
|
|
309
|
-
sid = cur.lastrowid
|
|
310
|
-
if sid is None: # pragma: no cover — should not occur.
|
|
311
|
-
raise sqlite3.OperationalError("no lastrowid from signal insert")
|
|
312
|
-
|
|
313
|
-
# PERF-v2-02: if ensemble_rerank already built features for this
|
|
314
|
-
# candidate (during the hot path), reuse them instead of calling
|
|
315
|
-
# FeatureExtractor.extract a second time. The reranker stashes a
|
|
316
|
-
# {fact_id: features_json_str} dict under a reserved key on
|
|
317
|
-
# ``query_context``. Cache miss falls through to extract.
|
|
318
|
-
fv_cache = batch.query_context.get(
|
|
319
|
-
"_precomputed_features_json", None,
|
|
320
|
-
) if isinstance(batch.query_context, dict) else None
|
|
321
|
-
features_json_str: str
|
|
322
|
-
if isinstance(fv_cache, dict) and cand.fact_id in fv_cache:
|
|
323
|
-
raw = fv_cache[cand.fact_id]
|
|
324
|
-
features_json_str = raw if isinstance(raw, str) \
|
|
325
|
-
else json.dumps(raw, separators=(",", ":"))
|
|
326
|
-
else:
|
|
327
|
-
fv = FeatureExtractor.extract(
|
|
328
|
-
cand.to_result_dict(), batch.query_context,
|
|
329
|
-
).features
|
|
330
|
-
features_json_str = json.dumps(fv, separators=(",", ":"))
|
|
331
|
-
# label column is NOT NULL REAL → use 0.0 sentinel (unlabeled).
|
|
332
|
-
# Real label comes from labeler.label_for_row at training time.
|
|
333
|
-
conn.execute(
|
|
334
|
-
"INSERT INTO learning_features "
|
|
335
|
-
"(profile_id, query_id, fact_id, features_json, label, "
|
|
336
|
-
" created_at, signal_id, is_synthetic) "
|
|
337
|
-
"VALUES (?, ?, ?, ?, 0.0, ?, ?, 0)",
|
|
338
|
-
(
|
|
339
|
-
batch.profile_id,
|
|
340
|
-
batch.query_id,
|
|
341
|
-
cand.fact_id,
|
|
342
|
-
features_json_str,
|
|
343
|
-
now_iso,
|
|
344
|
-
sid,
|
|
345
|
-
),
|
|
346
|
-
)
|
|
347
|
-
signal_ids.append(sid)
|
|
348
|
-
|
|
349
|
-
return signal_ids
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
class LearningSignals:
|
|
353
|
-
"""Compute and apply zero-cost learning signals.
|
|
354
|
-
|
|
355
|
-
Uses the main memory.db via direct sqlite3 (no engine dependency).
|
|
356
|
-
Thread-safe via lock.
|
|
357
|
-
"""
|
|
358
|
-
|
|
359
|
-
def __init__(self, db_path: str | Path) -> None:
|
|
360
|
-
self._db_path = str(db_path)
|
|
361
|
-
self._lock = threading.Lock()
|
|
362
|
-
self._ensure_tables()
|
|
363
|
-
|
|
364
|
-
# ------------------------------------------------------------------
|
|
365
|
-
# Schema
|
|
366
|
-
# ------------------------------------------------------------------
|
|
367
|
-
|
|
368
|
-
def _ensure_tables(self) -> None:
|
|
369
|
-
"""Create learning signal tables if they don't exist."""
|
|
370
|
-
with self._lock:
|
|
371
|
-
conn = self._connect()
|
|
372
|
-
try:
|
|
373
|
-
conn.execute(
|
|
374
|
-
"CREATE TABLE IF NOT EXISTS channel_credits ("
|
|
375
|
-
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
376
|
-
"profile_id TEXT NOT NULL, "
|
|
377
|
-
"query_type TEXT NOT NULL, "
|
|
378
|
-
"channel TEXT NOT NULL, "
|
|
379
|
-
"hits INTEGER DEFAULT 0, "
|
|
380
|
-
"total INTEGER DEFAULT 0, "
|
|
381
|
-
"updated_at TEXT NOT NULL)"
|
|
382
|
-
)
|
|
383
|
-
conn.execute(
|
|
384
|
-
"CREATE UNIQUE INDEX IF NOT EXISTS idx_channel_credit_unique "
|
|
385
|
-
"ON channel_credits(profile_id, query_type, channel)"
|
|
386
|
-
)
|
|
387
|
-
conn.execute(
|
|
388
|
-
"CREATE TABLE IF NOT EXISTS co_retrieval_edges ("
|
|
389
|
-
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
390
|
-
"profile_id TEXT NOT NULL, "
|
|
391
|
-
"fact_id_a TEXT NOT NULL, "
|
|
392
|
-
"fact_id_b TEXT NOT NULL, "
|
|
393
|
-
"co_count INTEGER DEFAULT 1, "
|
|
394
|
-
"updated_at TEXT NOT NULL)"
|
|
395
|
-
)
|
|
396
|
-
conn.execute(
|
|
397
|
-
"CREATE UNIQUE INDEX IF NOT EXISTS idx_co_retrieval_unique "
|
|
398
|
-
"ON co_retrieval_edges(profile_id, fact_id_a, fact_id_b)"
|
|
399
|
-
)
|
|
400
|
-
conn.commit()
|
|
401
|
-
finally:
|
|
402
|
-
conn.close()
|
|
403
|
-
|
|
404
|
-
def _connect(self) -> sqlite3.Connection:
|
|
405
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
406
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
407
|
-
conn.execute("PRAGMA busy_timeout=5000")
|
|
408
|
-
conn.row_factory = sqlite3.Row
|
|
409
|
-
return conn
|
|
410
|
-
|
|
411
|
-
# ------------------------------------------------------------------
|
|
412
|
-
# Signal 1: Entropy Gap (store-time)
|
|
413
|
-
# ------------------------------------------------------------------
|
|
414
|
-
|
|
415
|
-
@staticmethod
|
|
416
|
-
def compute_entropy_gap(
|
|
417
|
-
new_embedding: list[float],
|
|
418
|
-
cluster_embeddings: list[list[float]],
|
|
419
|
-
) -> float:
|
|
420
|
-
"""Compute how surprising new content is relative to existing cluster.
|
|
421
|
-
|
|
422
|
-
High gap = surprising content = should get deeper indexing.
|
|
423
|
-
Low gap = redundant content = standard indexing.
|
|
424
|
-
|
|
425
|
-
Returns a value in [0.0, 1.0]. >0.7 is 'surprising'.
|
|
426
|
-
"""
|
|
427
|
-
if not cluster_embeddings or not new_embedding:
|
|
428
|
-
return 0.5 # neutral when no comparison available
|
|
429
|
-
|
|
430
|
-
similarities = []
|
|
431
|
-
for existing in cluster_embeddings:
|
|
432
|
-
sim = _cosine_sim(new_embedding, existing)
|
|
433
|
-
similarities.append(sim)
|
|
434
|
-
|
|
435
|
-
avg_sim = sum(similarities) / len(similarities)
|
|
436
|
-
gap = max(0.0, min(1.0, 1.0 - avg_sim))
|
|
437
|
-
return gap
|
|
438
|
-
|
|
439
|
-
# ------------------------------------------------------------------
|
|
440
|
-
# Signal 2: Co-Retrieval (recall-time)
|
|
441
|
-
# ------------------------------------------------------------------
|
|
442
|
-
|
|
443
|
-
def record_co_retrieval(
|
|
444
|
-
self, profile_id: str, fact_ids: list[str],
|
|
445
|
-
) -> int:
|
|
446
|
-
"""Record that these facts were co-retrieved.
|
|
447
|
-
|
|
448
|
-
All pairs of facts in the result set get their co-retrieval
|
|
449
|
-
count incremented. This strengthens implicit graph edges.
|
|
450
|
-
"""
|
|
451
|
-
if len(fact_ids) < 2:
|
|
452
|
-
return 0
|
|
453
|
-
|
|
454
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
455
|
-
pairs = []
|
|
456
|
-
for i in range(len(fact_ids)):
|
|
457
|
-
for j in range(i + 1, min(len(fact_ids), i + 5)):
|
|
458
|
-
a, b = sorted([fact_ids[i], fact_ids[j]])
|
|
459
|
-
pairs.append((profile_id, a, b, now))
|
|
460
|
-
|
|
461
|
-
if not pairs:
|
|
462
|
-
return 0
|
|
463
|
-
|
|
464
|
-
with self._lock:
|
|
465
|
-
conn = self._connect()
|
|
466
|
-
try:
|
|
467
|
-
for pid, a, b, ts in pairs:
|
|
468
|
-
conn.execute(
|
|
469
|
-
"INSERT INTO co_retrieval_edges "
|
|
470
|
-
"(profile_id, fact_id_a, fact_id_b, co_count, updated_at) "
|
|
471
|
-
"VALUES (?, ?, ?, 1, ?) "
|
|
472
|
-
"ON CONFLICT(profile_id, fact_id_a, fact_id_b) "
|
|
473
|
-
"DO UPDATE SET co_count = co_count + 1, updated_at = ?",
|
|
474
|
-
(pid, a, b, ts, ts),
|
|
475
|
-
)
|
|
476
|
-
conn.commit()
|
|
477
|
-
return len(pairs)
|
|
478
|
-
finally:
|
|
479
|
-
conn.close()
|
|
480
|
-
|
|
481
|
-
def get_co_retrieval_boost(
|
|
482
|
-
self, profile_id: str, fact_id: str, top_k: int = 5,
|
|
483
|
-
) -> list[dict]:
|
|
484
|
-
"""Get top co-retrieved facts for boosting."""
|
|
485
|
-
with self._lock:
|
|
486
|
-
conn = self._connect()
|
|
487
|
-
try:
|
|
488
|
-
rows = conn.execute(
|
|
489
|
-
"SELECT fact_id_a, fact_id_b, co_count FROM co_retrieval_edges "
|
|
490
|
-
"WHERE profile_id = ? AND (fact_id_a = ? OR fact_id_b = ?) "
|
|
491
|
-
"ORDER BY co_count DESC LIMIT ?",
|
|
492
|
-
(profile_id, fact_id, fact_id, top_k),
|
|
493
|
-
).fetchall()
|
|
494
|
-
results = []
|
|
495
|
-
for r in rows:
|
|
496
|
-
d = dict(r)
|
|
497
|
-
other = d["fact_id_b"] if d["fact_id_a"] == fact_id else d["fact_id_a"]
|
|
498
|
-
results.append({"fact_id": other, "co_count": d["co_count"]})
|
|
499
|
-
return results
|
|
500
|
-
finally:
|
|
501
|
-
conn.close()
|
|
502
|
-
|
|
503
|
-
# ------------------------------------------------------------------
|
|
504
|
-
# Signal 3: Channel Credit (recall-time)
|
|
505
|
-
# ------------------------------------------------------------------
|
|
506
|
-
|
|
507
|
-
def credit_channel(
|
|
508
|
-
self, profile_id: str, query_type: str, channel: str, hit: bool,
|
|
509
|
-
) -> None:
|
|
510
|
-
"""Credit a retrieval channel for a hit or miss."""
|
|
511
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
512
|
-
with self._lock:
|
|
513
|
-
conn = self._connect()
|
|
514
|
-
try:
|
|
515
|
-
hit_val = 1 if hit else 0
|
|
516
|
-
conn.execute(
|
|
517
|
-
"INSERT INTO channel_credits "
|
|
518
|
-
"(profile_id, query_type, channel, hits, total, updated_at) "
|
|
519
|
-
"VALUES (?, ?, ?, ?, 1, ?) "
|
|
520
|
-
"ON CONFLICT(profile_id, query_type, channel) "
|
|
521
|
-
"DO UPDATE SET hits = hits + ?, total = total + 1, updated_at = ?",
|
|
522
|
-
(profile_id, query_type, channel, hit_val, now, hit_val, now),
|
|
523
|
-
)
|
|
524
|
-
conn.commit()
|
|
525
|
-
finally:
|
|
526
|
-
conn.close()
|
|
527
|
-
|
|
528
|
-
def get_channel_weights(
|
|
529
|
-
self, profile_id: str, query_type: str,
|
|
530
|
-
) -> dict[str, float]:
|
|
531
|
-
"""Get learned channel weights for a query type.
|
|
532
|
-
|
|
533
|
-
Returns weight multipliers based on historical hit rates.
|
|
534
|
-
"""
|
|
535
|
-
with self._lock:
|
|
536
|
-
conn = self._connect()
|
|
537
|
-
try:
|
|
538
|
-
rows = conn.execute(
|
|
539
|
-
"SELECT channel, hits, total FROM channel_credits "
|
|
540
|
-
"WHERE profile_id = ? AND query_type = ? AND total >= 5",
|
|
541
|
-
(profile_id, query_type),
|
|
542
|
-
).fetchall()
|
|
543
|
-
if not rows:
|
|
544
|
-
return {}
|
|
545
|
-
weights = {}
|
|
546
|
-
for r in rows:
|
|
547
|
-
d = dict(r)
|
|
548
|
-
rate = d["hits"] / max(d["total"], 1)
|
|
549
|
-
weights[d["channel"]] = 0.7 + (rate * 0.8)
|
|
550
|
-
return weights
|
|
551
|
-
finally:
|
|
552
|
-
conn.close()
|
|
553
|
-
|
|
554
|
-
# ------------------------------------------------------------------
|
|
555
|
-
# Signal 4: Confidence Lifecycle (store + recall time)
|
|
556
|
-
# ------------------------------------------------------------------
|
|
557
|
-
|
|
558
|
-
@staticmethod
|
|
559
|
-
def boost_confidence(db_path: str, fact_id: str, amount: float = 0.02) -> None:
|
|
560
|
-
"""Boost a fact's confidence on access. Capped at 1.0."""
|
|
561
|
-
try:
|
|
562
|
-
conn = sqlite3.connect(db_path, timeout=10)
|
|
563
|
-
conn.execute("PRAGMA busy_timeout=5000")
|
|
564
|
-
conn.execute(
|
|
565
|
-
"UPDATE atomic_facts SET confidence = MIN(1.0, confidence + ?) "
|
|
566
|
-
"WHERE fact_id = ?",
|
|
567
|
-
(amount, fact_id),
|
|
568
|
-
)
|
|
569
|
-
conn.execute(
|
|
570
|
-
"UPDATE atomic_facts SET access_count = access_count + 1 "
|
|
571
|
-
"WHERE fact_id = ?",
|
|
572
|
-
(fact_id,),
|
|
573
|
-
)
|
|
574
|
-
conn.commit()
|
|
575
|
-
conn.close()
|
|
576
|
-
except Exception:
|
|
577
|
-
pass
|
|
578
|
-
|
|
579
|
-
@staticmethod
|
|
580
|
-
def decay_confidence(db_path: str, profile_id: str, rate: float = 0.001) -> int:
|
|
581
|
-
"""Decay confidence on unused facts. Floor: 0.1."""
|
|
582
|
-
try:
|
|
583
|
-
conn = sqlite3.connect(db_path, timeout=10)
|
|
584
|
-
conn.execute("PRAGMA busy_timeout=5000")
|
|
585
|
-
cursor = conn.execute(
|
|
586
|
-
"UPDATE atomic_facts SET confidence = MAX(0.1, confidence - ?) "
|
|
587
|
-
"WHERE profile_id = ? AND access_count = 0 "
|
|
588
|
-
"AND created_at < datetime('now', '-7 days')",
|
|
589
|
-
(rate, profile_id),
|
|
590
|
-
)
|
|
591
|
-
conn.commit()
|
|
592
|
-
affected = cursor.rowcount
|
|
593
|
-
conn.close()
|
|
594
|
-
return affected
|
|
595
|
-
except Exception:
|
|
596
|
-
return 0
|
|
597
|
-
|
|
598
|
-
# ------------------------------------------------------------------
|
|
599
|
-
# Stats
|
|
600
|
-
# ------------------------------------------------------------------
|
|
601
|
-
|
|
602
|
-
def get_signal_stats(self, profile_id: str) -> dict:
|
|
603
|
-
"""Get learning signal statistics for dashboard."""
|
|
604
|
-
with self._lock:
|
|
605
|
-
conn = self._connect()
|
|
606
|
-
try:
|
|
607
|
-
co_rows = conn.execute(
|
|
608
|
-
"SELECT COUNT(*) AS c, COALESCE(SUM(co_count), 0) AS total "
|
|
609
|
-
"FROM co_retrieval_edges WHERE profile_id = ?",
|
|
610
|
-
(profile_id,),
|
|
611
|
-
).fetchone()
|
|
612
|
-
co = dict(co_rows) if co_rows else {"c": 0, "total": 0}
|
|
613
|
-
|
|
614
|
-
ch_rows = conn.execute(
|
|
615
|
-
"SELECT channel, hits, total FROM channel_credits "
|
|
616
|
-
"WHERE profile_id = ? ORDER BY total DESC",
|
|
617
|
-
(profile_id,),
|
|
618
|
-
).fetchall()
|
|
619
|
-
channels = {
|
|
620
|
-
dict(r)["channel"]: {
|
|
621
|
-
"hits": dict(r)["hits"],
|
|
622
|
-
"total": dict(r)["total"],
|
|
623
|
-
"rate": round(dict(r)["hits"] / max(dict(r)["total"], 1), 3),
|
|
624
|
-
}
|
|
625
|
-
for r in ch_rows
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
return {
|
|
629
|
-
"co_retrieval_edges": co["c"],
|
|
630
|
-
"co_retrieval_events": co["total"],
|
|
631
|
-
"channel_performance": channels,
|
|
632
|
-
}
|
|
633
|
-
finally:
|
|
634
|
-
conn.close()
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
def _cosine_sim(a: list[float], b: list[float]) -> float:
|
|
638
|
-
"""Cosine similarity between two vectors."""
|
|
639
|
-
if len(a) != len(b) or not a:
|
|
640
|
-
return 0.0
|
|
641
|
-
dot = sum(x * y for x, y in zip(a, b))
|
|
642
|
-
norm_a = math.sqrt(sum(x * x for x in a))
|
|
643
|
-
norm_b = math.sqrt(sum(x * x for x in b))
|
|
644
|
-
if norm_a < 1e-10 or norm_b < 1e-10:
|
|
645
|
-
return 0.0
|
|
646
|
-
return dot / (norm_a * norm_b)
|