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,638 +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 — Semantic Retrieval Channel.
|
|
6
|
-
|
|
7
|
-
Fisher-aware semantic search: uses Fisher-Rao geodesic distance when
|
|
8
|
-
variance data is available, falls back to cosine similarity otherwise.
|
|
9
|
-
|
|
10
|
-
The Fisher distance is meaningful when memories accumulate evidence
|
|
11
|
-
(repeated confirmation narrows variance). For fresh benchmark data
|
|
12
|
-
where all variances are identical, Fisher distance degenerates to a
|
|
13
|
-
monotonic transform of Euclidean distance — same ranking as cosine.
|
|
14
|
-
|
|
15
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
16
|
-
License: AGPL-3.0-or-later
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import logging
|
|
22
|
-
import math
|
|
23
|
-
from typing import TYPE_CHECKING, Any
|
|
24
|
-
|
|
25
|
-
import numpy as np
|
|
26
|
-
|
|
27
|
-
if TYPE_CHECKING:
|
|
28
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
29
|
-
from superlocalmemory.storage.models import AtomicFact
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
|
-
#: How often the Lance projection is checked against the index it replaces: one
|
|
34
|
-
#: in this many searches. A comparison costs a second full search, so checking
|
|
35
|
-
#: every one doubled the channel, and a projection that has genuinely diverged is
|
|
36
|
-
#: caught inside this many queries either way.
|
|
37
|
-
SCALE_SHADOW_SAMPLE_EVERY = 50
|
|
38
|
-
|
|
39
|
-
# Minimum variance floor to prevent division-by-zero in Fisher distance
|
|
40
|
-
_VARIANCE_FLOOR: float = 1e-6
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class _LanceCandidateSource:
|
|
44
|
-
"""Adapt the promoted Lance projection to the existing candidate contract."""
|
|
45
|
-
|
|
46
|
-
available = True
|
|
47
|
-
|
|
48
|
-
def __init__(self, backend: Any) -> None:
|
|
49
|
-
self._backend = backend
|
|
50
|
-
|
|
51
|
-
def search(self, query_embedding: list[float], *, top_k: int, profile_id: str) -> list[tuple[str, float]]:
|
|
52
|
-
return self._backend.similarity_search(
|
|
53
|
-
query_embedding, top_k=top_k, profile_id=profile_id,
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def _cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
|
|
58
|
-
"""Cosine similarity in [-1, 1]. Returns 0.0 on zero vectors."""
|
|
59
|
-
norm_a = np.linalg.norm(a)
|
|
60
|
-
norm_b = np.linalg.norm(b)
|
|
61
|
-
if norm_a < _VARIANCE_FLOOR or norm_b < _VARIANCE_FLOOR:
|
|
62
|
-
return 0.0
|
|
63
|
-
return float(np.dot(a, b) / (norm_a * norm_b))
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def _fisher_rao_similarity(
|
|
67
|
-
mu_q: np.ndarray,
|
|
68
|
-
mu_f: np.ndarray,
|
|
69
|
-
var_f: np.ndarray,
|
|
70
|
-
temperature: float = 15.0,
|
|
71
|
-
) -> float:
|
|
72
|
-
"""Fisher-Rao geodesic similarity on diagonal Gaussian manifold.
|
|
73
|
-
|
|
74
|
-
d_FR^2 = sum_i [ (mu_q_i - mu_f_i)^2 / max(var_f_i, eps) ]
|
|
75
|
-
similarity = exp(-d_FR^2 / temperature)
|
|
76
|
-
|
|
77
|
-
When all variances are equal, this is equivalent to a scaled
|
|
78
|
-
Euclidean distance — same ranking as cosine on normalized vectors.
|
|
79
|
-
The advantage appears when variances differ across memories.
|
|
80
|
-
"""
|
|
81
|
-
diff = mu_q - mu_f
|
|
82
|
-
var_safe = np.maximum(var_f, _VARIANCE_FLOOR)
|
|
83
|
-
d_sq = float(np.sum(diff * diff / var_safe))
|
|
84
|
-
return math.exp(-d_sq / temperature)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
class SemanticChannel:
|
|
88
|
-
"""Dense semantic retrieval via embedding similarity.
|
|
89
|
-
|
|
90
|
-
Scans all facts for a profile. Uses a GRADUATED Fisher-Rao ramp:
|
|
91
|
-
fresh facts (low access_count) use cosine, frequently-accessed facts
|
|
92
|
-
transition to Fisher-Rao distance for uncertainty-aware similarity.
|
|
93
|
-
|
|
94
|
-
V3.2: VectorStore KNN fast path when available, falls back to full scan.
|
|
95
|
-
|
|
96
|
-
Graduated ramp: weight = min(1.2, access_count / 10 * 1.2)
|
|
97
|
-
Final sim = fisher_weight * fisher_sim + (1 - fisher_weight) * cosine_sim
|
|
98
|
-
"""
|
|
99
|
-
|
|
100
|
-
def __init__(
|
|
101
|
-
self,
|
|
102
|
-
db: DatabaseManager,
|
|
103
|
-
fisher_temperature: float = 15.0,
|
|
104
|
-
embedder: object | None = None,
|
|
105
|
-
fisher_mode: str = "simplified",
|
|
106
|
-
vector_store: Any | None = None,
|
|
107
|
-
quantization_aware_search: Any | None = None,
|
|
108
|
-
) -> None:
|
|
109
|
-
self._db = db
|
|
110
|
-
self._temperature = fisher_temperature
|
|
111
|
-
self._embedder = embedder
|
|
112
|
-
self._fisher_mode = fisher_mode if fisher_mode in ("simplified", "full") else "simplified"
|
|
113
|
-
# Lazily instantiated full metric (avoids import cost when not needed)
|
|
114
|
-
self._full_metric: object | None = None
|
|
115
|
-
# V3.3.26: Lazily instantiated FRQAD metric for mixed-precision scoring
|
|
116
|
-
self._frqad_metric: object | None = None
|
|
117
|
-
self._vector_store = vector_store
|
|
118
|
-
self._scale_vector_backend: Any | None = None
|
|
119
|
-
self._scale_shadow_checks = 0
|
|
120
|
-
self._scale_shadow_mismatches = 0
|
|
121
|
-
self._scale_shadow_errors = 0
|
|
122
|
-
self._scale_searches = 0
|
|
123
|
-
# V3.3.19: TurboQuant 3-tier search (stateless, optional)
|
|
124
|
-
self._qas = quantization_aware_search
|
|
125
|
-
|
|
126
|
-
def search(
|
|
127
|
-
self,
|
|
128
|
-
query_embedding: list[float],
|
|
129
|
-
profile_id: str,
|
|
130
|
-
top_k: int = 50,
|
|
131
|
-
include_global: bool | None = None,
|
|
132
|
-
include_shared: bool | None = None,
|
|
133
|
-
) -> list[tuple[str, float]]:
|
|
134
|
-
"""Search for semantically similar facts.
|
|
135
|
-
|
|
136
|
-
Uses VectorStore KNN if available, otherwise full-table scan.
|
|
137
|
-
Fisher-Rao scoring preserved as post-KNN secondary signal.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
query_embedding: Dense vector for the query.
|
|
141
|
-
profile_id: Scope to this profile.
|
|
142
|
-
top_k: Maximum results to return.
|
|
143
|
-
include_global: Include global-scope facts. Defaults to the
|
|
144
|
-
``include_global`` instance attribute when not supplied,
|
|
145
|
-
preserving backward compatibility for callers that still
|
|
146
|
-
set the attribute directly.
|
|
147
|
-
include_shared: Include shared-scope facts. Same fallback.
|
|
148
|
-
|
|
149
|
-
Returns:
|
|
150
|
-
List of (fact_id, score) sorted by score descending.
|
|
151
|
-
Score is in [0, 1] range.
|
|
152
|
-
"""
|
|
153
|
-
# Resolve scope flags: explicit param takes priority; fall back to the
|
|
154
|
-
# legacy attribute-based path so existing callers keep working.
|
|
155
|
-
if include_global is None:
|
|
156
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
157
|
-
if include_shared is None:
|
|
158
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
159
|
-
|
|
160
|
-
if not query_embedding:
|
|
161
|
-
return []
|
|
162
|
-
|
|
163
|
-
q_vec = np.array(query_embedding, dtype=np.float32)
|
|
164
|
-
|
|
165
|
-
# Lance is a derived projection. It is never an authorization source
|
|
166
|
-
# and it never silently replaces the canonical sqlite-vec path: every
|
|
167
|
-
# promoted query is shadowed and falls back if the result *membership*
|
|
168
|
-
# differs. Order differences within the same fact set are tolerated —
|
|
169
|
-
# float-score ties would otherwise force a fallback on every query,
|
|
170
|
-
# leaving the promoted backend permanently unused. Once membership
|
|
171
|
-
# matches, the projected backend's own ranking is authoritative.
|
|
172
|
-
if (
|
|
173
|
-
self._scale_vector_backend is not None
|
|
174
|
-
and not include_global
|
|
175
|
-
and not include_shared
|
|
176
|
-
):
|
|
177
|
-
self._scale_searches += 1
|
|
178
|
-
# Shadowing SAMPLES rather than running on every query. Comparing
|
|
179
|
-
# means running both engines, and they cost the same -- 18.3 ms
|
|
180
|
-
# against 18.7 ms over 5,324 vectors -- so shadowing every search
|
|
181
|
-
# doubled this channel for an answer already known to match.
|
|
182
|
-
# Verified on a copy of the author's store: 18 checks, 0 mismatches.
|
|
183
|
-
#
|
|
184
|
-
# What guarantees the projection is not this comparison. It is the
|
|
185
|
-
# outbox, which commits the intent to project in the same SQLite
|
|
186
|
-
# transaction as the memory, plus a parity gate holding the
|
|
187
|
-
# projection to the index it stands in for. A per-query re-run of the
|
|
188
|
-
# canonical path is a development instrument, and leaving one in
|
|
189
|
-
# production is how a permanent 2x cost gets mistaken for safety.
|
|
190
|
-
sampled = (self._scale_searches % SCALE_SHADOW_SAMPLE_EVERY) == 1
|
|
191
|
-
try:
|
|
192
|
-
projected = self._search_via_lance(
|
|
193
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
194
|
-
include_global=include_global, include_shared=include_shared,
|
|
195
|
-
)
|
|
196
|
-
except Exception as exc:
|
|
197
|
-
# The Cozo path this mirrors has always caught its failures; this
|
|
198
|
-
# one did not, so a Lance error propagated out of recall instead
|
|
199
|
-
# of degrading to the index that was still sitting there.
|
|
200
|
-
self._scale_shadow_errors += 1
|
|
201
|
-
logger.warning("Lance semantic projection failed, using SQLite: %s", exc)
|
|
202
|
-
return self._search_without_lance(
|
|
203
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
204
|
-
include_global=include_global, include_shared=include_shared,
|
|
205
|
-
)
|
|
206
|
-
if not sampled:
|
|
207
|
-
return projected
|
|
208
|
-
canonical = self._search_without_lance(
|
|
209
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
210
|
-
include_global=include_global, include_shared=include_shared,
|
|
211
|
-
)
|
|
212
|
-
self._scale_shadow_checks += 1
|
|
213
|
-
if {fid for fid, _ in projected} == {fid for fid, _ in canonical}:
|
|
214
|
-
return projected
|
|
215
|
-
self._scale_shadow_mismatches += 1
|
|
216
|
-
logger.warning(
|
|
217
|
-
"Lance semantic projection diverged from SQLite on sampled check "
|
|
218
|
-
"%d of %d searches; using SQLite",
|
|
219
|
-
self._scale_shadow_checks, self._scale_searches,
|
|
220
|
-
)
|
|
221
|
-
return canonical
|
|
222
|
-
|
|
223
|
-
# --- FAST PATH: sqlite-vec KNN ---
|
|
224
|
-
if self._vector_store and self._vector_store.available:
|
|
225
|
-
results = self._search_via_vector_store(
|
|
226
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
227
|
-
include_global=include_global, include_shared=include_shared,
|
|
228
|
-
)
|
|
229
|
-
if results: # If vec0 returned results, use them
|
|
230
|
-
return results
|
|
231
|
-
# If vec0 is empty (cold start), fall through to full scan
|
|
232
|
-
|
|
233
|
-
# --- FALLBACK: full-table scan (original code, unchanged) ---
|
|
234
|
-
return self._search_full_scan(
|
|
235
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
236
|
-
include_global=include_global, include_shared=include_shared,
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
def set_scale_vector_backend(self, backend: Any | None) -> None:
|
|
240
|
-
"""Attach a parity-verified Lance projection without replacing SQLite."""
|
|
241
|
-
self._scale_vector_backend = backend
|
|
242
|
-
|
|
243
|
-
def scale_projection_telemetry(self) -> dict[str, int]:
|
|
244
|
-
return {
|
|
245
|
-
"searches": self._scale_searches,
|
|
246
|
-
"shadow_checks": self._scale_shadow_checks,
|
|
247
|
-
"shadow_mismatches": self._scale_shadow_mismatches,
|
|
248
|
-
"shadow_errors": self._scale_shadow_errors,
|
|
249
|
-
"sample_every": SCALE_SHADOW_SAMPLE_EVERY,
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
def _search_via_lance(
|
|
253
|
-
self,
|
|
254
|
-
query_embedding: list[float],
|
|
255
|
-
q_vec: np.ndarray,
|
|
256
|
-
profile_id: str,
|
|
257
|
-
top_k: int,
|
|
258
|
-
include_global: bool | None = None,
|
|
259
|
-
include_shared: bool | None = None,
|
|
260
|
-
) -> list[tuple[str, float]]:
|
|
261
|
-
if include_global is None:
|
|
262
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
263
|
-
if include_shared is None:
|
|
264
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
265
|
-
original_store, original_qas = self._vector_store, self._qas
|
|
266
|
-
try:
|
|
267
|
-
self._vector_store = _LanceCandidateSource(self._scale_vector_backend)
|
|
268
|
-
# QAS indexes SQLite/quantized records and cannot represent Lance.
|
|
269
|
-
self._qas = None
|
|
270
|
-
return self._search_via_vector_store(
|
|
271
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
272
|
-
include_global=include_global, include_shared=include_shared,
|
|
273
|
-
)
|
|
274
|
-
except Exception as exc:
|
|
275
|
-
logger.warning("Lance semantic projection failed closed to SQLite: %s", exc)
|
|
276
|
-
return []
|
|
277
|
-
finally:
|
|
278
|
-
self._vector_store, self._qas = original_store, original_qas
|
|
279
|
-
|
|
280
|
-
def _search_without_lance(
|
|
281
|
-
self,
|
|
282
|
-
query_embedding: list[float],
|
|
283
|
-
q_vec: np.ndarray,
|
|
284
|
-
profile_id: str,
|
|
285
|
-
top_k: int,
|
|
286
|
-
include_global: bool | None = None,
|
|
287
|
-
include_shared: bool | None = None,
|
|
288
|
-
) -> list[tuple[str, float]]:
|
|
289
|
-
if include_global is None:
|
|
290
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
291
|
-
if include_shared is None:
|
|
292
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
293
|
-
backend, self._scale_vector_backend = self._scale_vector_backend, None
|
|
294
|
-
try:
|
|
295
|
-
if self._vector_store and self._vector_store.available:
|
|
296
|
-
results = self._search_via_vector_store(
|
|
297
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
298
|
-
include_global=include_global, include_shared=include_shared,
|
|
299
|
-
)
|
|
300
|
-
if results:
|
|
301
|
-
return results
|
|
302
|
-
return self._search_full_scan(
|
|
303
|
-
query_embedding, q_vec, profile_id, top_k,
|
|
304
|
-
include_global=include_global, include_shared=include_shared,
|
|
305
|
-
)
|
|
306
|
-
finally:
|
|
307
|
-
self._scale_vector_backend = backend
|
|
308
|
-
|
|
309
|
-
def _search_via_vector_store(
|
|
310
|
-
self,
|
|
311
|
-
query_embedding: list[float],
|
|
312
|
-
q_vec: np.ndarray,
|
|
313
|
-
profile_id: str,
|
|
314
|
-
top_k: int,
|
|
315
|
-
include_global: bool | None = None,
|
|
316
|
-
include_shared: bool | None = None,
|
|
317
|
-
) -> list[tuple[str, float]]:
|
|
318
|
-
"""KNN via VectorStore (or QAS 3-tier), then Fisher-Rao re-scoring."""
|
|
319
|
-
if include_global is None:
|
|
320
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
321
|
-
if include_shared is None:
|
|
322
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
323
|
-
# V3.3.19: Try TurboQuant 3-tier search first (float32 + int8 + polar)
|
|
324
|
-
if self._qas is not None:
|
|
325
|
-
try:
|
|
326
|
-
knn_results = self._qas.search(
|
|
327
|
-
query_embedding=q_vec, profile_id=profile_id,
|
|
328
|
-
top_k=top_k * 2,
|
|
329
|
-
)
|
|
330
|
-
except Exception:
|
|
331
|
-
knn_results = []
|
|
332
|
-
# Fall through to VectorStore if QAS returned nothing
|
|
333
|
-
if not knn_results:
|
|
334
|
-
knn_results = self._vector_store.search(
|
|
335
|
-
query_embedding, top_k=top_k * 2, profile_id=profile_id,
|
|
336
|
-
)
|
|
337
|
-
else:
|
|
338
|
-
# Step 1: Fast KNN -- get 2x top_k candidates for Fisher re-ranking
|
|
339
|
-
knn_results = self._vector_store.search(
|
|
340
|
-
query_embedding, top_k=top_k * 2, profile_id=profile_id,
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
# M-01: Normalize KNN scores to [0.5, 1.0] via (score + 1.0) / 2.0 so
|
|
344
|
-
# they are on the same scale as full-scan scores computed from
|
|
345
|
-
# (_cosine_similarity(q, f) + 1.0) / 2.0 in the external_scores path.
|
|
346
|
-
# vector_store.search() clips at 0 (max(0, cosine)), which maps [–1,1]
|
|
347
|
-
# to [0,1]; the canonical formula maps to [0.5, 1.0] for positives.
|
|
348
|
-
# Both are [0,1] but different scales — without this normalization KNN
|
|
349
|
-
# scores are systematically lower and external facts always win max().
|
|
350
|
-
knn_results = [(fid, (score + 1.0) / 2.0) for fid, score in knn_results]
|
|
351
|
-
|
|
352
|
-
# The vector index is partitioned by owner profile. An opted-in global
|
|
353
|
-
# or authorized shared fact owned by another profile cannot enter the
|
|
354
|
-
# local KNN candidate set, so merge the bounded cross-profile visible
|
|
355
|
-
# supplement using the same canonical DB scope predicate as fallback.
|
|
356
|
-
external_facts = self._db.get_external_visible_facts(
|
|
357
|
-
profile_id,
|
|
358
|
-
include_global=include_global,
|
|
359
|
-
include_shared=include_shared,
|
|
360
|
-
)
|
|
361
|
-
external_scores: list[tuple[str, float]] = []
|
|
362
|
-
for fact in external_facts:
|
|
363
|
-
if fact.embedding is None:
|
|
364
|
-
continue
|
|
365
|
-
fact_vec = np.array(fact.embedding, dtype=np.float32)
|
|
366
|
-
if fact_vec.shape != q_vec.shape:
|
|
367
|
-
continue
|
|
368
|
-
score = (_cosine_similarity(q_vec, fact_vec) + 1.0) / 2.0
|
|
369
|
-
if score > 0.05:
|
|
370
|
-
external_scores.append((fact.fact_id, score))
|
|
371
|
-
|
|
372
|
-
if external_scores:
|
|
373
|
-
combined = {fid: score for fid, score in knn_results}
|
|
374
|
-
for fact_id, score in external_scores:
|
|
375
|
-
combined[fact_id] = max(combined.get(fact_id, 0.0), score)
|
|
376
|
-
knn_results = sorted(
|
|
377
|
-
combined.items(), key=lambda item: (-item[1], item[0]),
|
|
378
|
-
)[:top_k * 2]
|
|
379
|
-
if not knn_results:
|
|
380
|
-
return [] # Caller falls through to full scan
|
|
381
|
-
|
|
382
|
-
# Step 2: Load only the candidate facts (NOT all facts)
|
|
383
|
-
candidate_ids = [fid for fid, _ in knn_results]
|
|
384
|
-
knn_scores = {fid: score for fid, score in knn_results}
|
|
385
|
-
facts = self._db.get_facts_by_ids(
|
|
386
|
-
candidate_ids, profile_id,
|
|
387
|
-
include_global=include_global,
|
|
388
|
-
include_shared=include_shared,
|
|
389
|
-
)
|
|
390
|
-
|
|
391
|
-
if not facts:
|
|
392
|
-
# The vector/QAS indexes are candidate sources, never an
|
|
393
|
-
# authorization source. Returning their raw IDs here leaked an
|
|
394
|
-
# owner-private fact precisely when canonical scope filtering
|
|
395
|
-
# rejected the entire candidate set. Empty means "no authorized
|
|
396
|
-
# fast-path hits" so the caller may use the scoped full scan.
|
|
397
|
-
return []
|
|
398
|
-
|
|
399
|
-
# Step 3: Fisher-Rao re-scoring on the subset
|
|
400
|
-
q_mean: np.ndarray | None = None
|
|
401
|
-
q_var: np.ndarray | None = None
|
|
402
|
-
if self._embedder and hasattr(self._embedder, 'compute_fisher_params'):
|
|
403
|
-
qm, qv = self._embedder.compute_fisher_params(query_embedding)
|
|
404
|
-
q_mean = np.array(qm, dtype=np.float32)
|
|
405
|
-
q_var = np.array(qv, dtype=np.float32)
|
|
406
|
-
|
|
407
|
-
scored: list[tuple[str, float]] = []
|
|
408
|
-
for fact in facts:
|
|
409
|
-
# C2-ret H-01: recompute the final cosine from the canonical
|
|
410
|
-
# full-precision embedding using the SAME formula as the full-scan
|
|
411
|
-
# fallback, so the fast path is observationally equivalent — identical
|
|
412
|
-
# score MAGNITUDES, not merely identical rankings. The KNN/vector-store
|
|
413
|
-
# score is a candidate-SELECTION signal only (it decides which facts
|
|
414
|
-
# are Fisher-rescored), never the final magnitude; trusting it here
|
|
415
|
-
# leaked the vector store's negative-cosine clamp into public scores.
|
|
416
|
-
# When a candidate carries no usable embedding (index-only rows), fall
|
|
417
|
-
# back to the normalized KNN score, preserving the M-01 contract.
|
|
418
|
-
f_vec: np.ndarray | None = None
|
|
419
|
-
if fact.embedding is not None:
|
|
420
|
-
candidate = np.array(fact.embedding, dtype=np.float32)
|
|
421
|
-
if candidate.shape == q_vec.shape:
|
|
422
|
-
f_vec = candidate
|
|
423
|
-
|
|
424
|
-
if f_vec is not None:
|
|
425
|
-
cos_sim = (_cosine_similarity(q_vec, f_vec) + 1.0) / 2.0
|
|
426
|
-
else:
|
|
427
|
-
cos_sim = knn_scores.get(fact.fact_id, 0.0)
|
|
428
|
-
|
|
429
|
-
fisher_weight = self._fisher_weight(fact.access_count)
|
|
430
|
-
|
|
431
|
-
if (fisher_weight > 0.01
|
|
432
|
-
and fact.fisher_variance is not None
|
|
433
|
-
and f_vec is not None
|
|
434
|
-
and len(fact.fisher_variance) == len(q_vec)):
|
|
435
|
-
var_vec = np.array(fact.fisher_variance, dtype=np.float32)
|
|
436
|
-
f_sim = self._compute_fisher_sim(
|
|
437
|
-
q_vec, f_vec, var_vec, fact, q_mean, q_var,
|
|
438
|
-
)
|
|
439
|
-
sim = fisher_weight * f_sim + (1.0 - fisher_weight) * cos_sim
|
|
440
|
-
else:
|
|
441
|
-
sim = cos_sim
|
|
442
|
-
|
|
443
|
-
if sim > 0.05:
|
|
444
|
-
scored.append((fact.fact_id, sim))
|
|
445
|
-
|
|
446
|
-
scored.sort(key=lambda x: (-x[1], x[0]))
|
|
447
|
-
return scored[:top_k]
|
|
448
|
-
|
|
449
|
-
def _search_full_scan(
|
|
450
|
-
self,
|
|
451
|
-
query_embedding: list[float],
|
|
452
|
-
q_vec: np.ndarray,
|
|
453
|
-
profile_id: str,
|
|
454
|
-
top_k: int,
|
|
455
|
-
include_global: bool | None = None,
|
|
456
|
-
include_shared: bool | None = None,
|
|
457
|
-
) -> list[tuple[str, float]]:
|
|
458
|
-
"""Original full-table-scan search. Used as fallback when VectorStore
|
|
459
|
-
is unavailable or empty (cold start).
|
|
460
|
-
"""
|
|
461
|
-
if include_global is None:
|
|
462
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
463
|
-
if include_shared is None:
|
|
464
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
465
|
-
# Compute query Fisher params for Bayesian comparison (F45 fix)
|
|
466
|
-
q_mean: np.ndarray | None = None
|
|
467
|
-
q_var: np.ndarray | None = None
|
|
468
|
-
if self._embedder and hasattr(self._embedder, 'compute_fisher_params'):
|
|
469
|
-
qm, qv = self._embedder.compute_fisher_params(query_embedding)
|
|
470
|
-
q_mean = np.array(qm, dtype=np.float32)
|
|
471
|
-
q_var = np.array(qv, dtype=np.float32)
|
|
472
|
-
|
|
473
|
-
facts = self._db.get_all_facts(
|
|
474
|
-
profile_id,
|
|
475
|
-
include_global=include_global,
|
|
476
|
-
include_shared=include_shared,
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
scored: list[tuple[str, float]] = []
|
|
480
|
-
for fact in facts:
|
|
481
|
-
if fact.embedding is None:
|
|
482
|
-
continue
|
|
483
|
-
|
|
484
|
-
f_vec = np.array(fact.embedding, dtype=np.float32)
|
|
485
|
-
if f_vec.shape != q_vec.shape:
|
|
486
|
-
continue
|
|
487
|
-
|
|
488
|
-
# Cosine baseline (always computed)
|
|
489
|
-
cos_sim = (_cosine_similarity(q_vec, f_vec) + 1.0) / 2.0
|
|
490
|
-
|
|
491
|
-
# The weighting contract is identical to the sqlite-vec path.
|
|
492
|
-
fisher_weight = self._fisher_weight(fact.access_count)
|
|
493
|
-
|
|
494
|
-
if (fisher_weight > 0.01
|
|
495
|
-
and fact.fisher_variance is not None
|
|
496
|
-
and len(fact.fisher_variance) == len(q_vec)):
|
|
497
|
-
var_vec = np.array(fact.fisher_variance, dtype=np.float32)
|
|
498
|
-
f_sim = self._compute_fisher_sim(
|
|
499
|
-
q_vec, f_vec, var_vec, fact, q_mean, q_var,
|
|
500
|
-
)
|
|
501
|
-
sim = fisher_weight * f_sim + (1.0 - fisher_weight) * cos_sim
|
|
502
|
-
else:
|
|
503
|
-
sim = cos_sim
|
|
504
|
-
|
|
505
|
-
if sim > 0.05:
|
|
506
|
-
scored.append((fact.fact_id, sim))
|
|
507
|
-
|
|
508
|
-
scored.sort(key=lambda x: (-x[1], x[0]))
|
|
509
|
-
return scored[:top_k]
|
|
510
|
-
|
|
511
|
-
@staticmethod
|
|
512
|
-
def _fisher_weight(access_count: int | None) -> float:
|
|
513
|
-
"""Canonical Fisher blend shared by every semantic candidate path."""
|
|
514
|
-
graduated = (access_count or 0) / 10.0 * 1.2
|
|
515
|
-
# A small floor keeps Fisher variance active for new facts. The cap
|
|
516
|
-
# prevents the blend from extrapolating beyond its two score inputs.
|
|
517
|
-
return min(1.0, max(0.15, graduated))
|
|
518
|
-
|
|
519
|
-
# ------------------------------------------------------------------
|
|
520
|
-
# Fisher similarity dispatch
|
|
521
|
-
# ------------------------------------------------------------------
|
|
522
|
-
|
|
523
|
-
def _compute_fisher_sim(
|
|
524
|
-
self,
|
|
525
|
-
q_vec: np.ndarray,
|
|
526
|
-
f_vec: np.ndarray,
|
|
527
|
-
var_vec: np.ndarray,
|
|
528
|
-
fact: AtomicFact,
|
|
529
|
-
q_mean: np.ndarray | None,
|
|
530
|
-
q_var: np.ndarray | None,
|
|
531
|
-
) -> float:
|
|
532
|
-
"""Compute Fisher-Rao similarity using simplified, full, or FRQAD metric.
|
|
533
|
-
|
|
534
|
-
Simplified (default): Mahalanobis-like distance using only fact variance.
|
|
535
|
-
Full: Atkinson-Mitchell geodesic via FisherRaoMetric.similarity().
|
|
536
|
-
FRQAD: V3.3.26 — quantization-aware distance via FRQADMetric when
|
|
537
|
-
the fact has a non-32-bit embedding (mixed precision).
|
|
538
|
-
|
|
539
|
-
Falls back to simplified if full/FRQAD cannot be applied.
|
|
540
|
-
"""
|
|
541
|
-
# V3.3.26: FRQAD for mixed-precision facts
|
|
542
|
-
fact_bw = getattr(fact, "bit_width", 32) or 32
|
|
543
|
-
if fact_bw < 32 and q_mean is not None and q_var is not None:
|
|
544
|
-
return self._compute_frqad_sim(
|
|
545
|
-
q_mean, q_var, 32, f_vec, var_vec, fact_bw, fact,
|
|
546
|
-
)
|
|
547
|
-
|
|
548
|
-
if self._fisher_mode == "full":
|
|
549
|
-
return self._compute_full_fisher_sim(
|
|
550
|
-
q_vec, f_vec, var_vec, fact, q_mean, q_var,
|
|
551
|
-
)
|
|
552
|
-
return _fisher_rao_similarity(q_vec, f_vec, var_vec, self._temperature)
|
|
553
|
-
|
|
554
|
-
def _compute_frqad_sim(
|
|
555
|
-
self,
|
|
556
|
-
q_mean: np.ndarray,
|
|
557
|
-
q_var: np.ndarray,
|
|
558
|
-
q_bw: int,
|
|
559
|
-
f_mean: np.ndarray,
|
|
560
|
-
f_var: np.ndarray,
|
|
561
|
-
f_bw: int,
|
|
562
|
-
fact: AtomicFact,
|
|
563
|
-
) -> float:
|
|
564
|
-
"""FRQAD: quantization-aware Fisher-Rao similarity (Paper 3, C1).
|
|
565
|
-
|
|
566
|
-
Uses variance inflation: sigma_eff = sigma * (32/bw)^kappa
|
|
567
|
-
to penalize lower-precision embeddings on the statistical manifold.
|
|
568
|
-
"""
|
|
569
|
-
frqad = self._get_frqad_metric()
|
|
570
|
-
if frqad is None:
|
|
571
|
-
return _fisher_rao_similarity(q_mean, f_mean, f_var, self._temperature)
|
|
572
|
-
try:
|
|
573
|
-
return frqad.similarity(
|
|
574
|
-
q_mean, q_var, q_bw,
|
|
575
|
-
f_mean, f_var, f_bw,
|
|
576
|
-
)
|
|
577
|
-
except (ValueError, FloatingPointError):
|
|
578
|
-
logger.debug("FRQAD raised; falling back to simplified Fisher-Rao")
|
|
579
|
-
return _fisher_rao_similarity(q_mean, f_mean, f_var, self._temperature)
|
|
580
|
-
|
|
581
|
-
def _get_frqad_metric(self) -> object | None:
|
|
582
|
-
"""Lazy-load FRQADMetric to avoid import-time cost."""
|
|
583
|
-
if self._frqad_metric is None:
|
|
584
|
-
try:
|
|
585
|
-
from superlocalmemory.math.fisher import FisherRaoMetric
|
|
586
|
-
from superlocalmemory.math.fisher_quantized import FRQADConfig, FRQADMetric
|
|
587
|
-
base = FisherRaoMetric(temperature=self._temperature)
|
|
588
|
-
self._frqad_metric = FRQADMetric(base, FRQADConfig())
|
|
589
|
-
except Exception:
|
|
590
|
-
logger.debug("FRQAD metric unavailable; mixed-precision scoring disabled")
|
|
591
|
-
return None
|
|
592
|
-
return self._frqad_metric
|
|
593
|
-
|
|
594
|
-
def _compute_full_fisher_sim(
|
|
595
|
-
self,
|
|
596
|
-
q_vec: np.ndarray,
|
|
597
|
-
f_vec: np.ndarray,
|
|
598
|
-
var_vec: np.ndarray,
|
|
599
|
-
fact: AtomicFact,
|
|
600
|
-
q_mean: np.ndarray | None,
|
|
601
|
-
q_var: np.ndarray | None,
|
|
602
|
-
) -> float:
|
|
603
|
-
"""Full Atkinson-Mitchell geodesic via FisherRaoMetric.
|
|
604
|
-
|
|
605
|
-
Requires fisher_mean on the fact AND query variance. If either is
|
|
606
|
-
missing, falls back to the simplified local computation so that
|
|
607
|
-
the graduated ramp still produces a score.
|
|
608
|
-
"""
|
|
609
|
-
# Need fact fisher_mean for the full metric
|
|
610
|
-
fact_mean = fact.fisher_mean
|
|
611
|
-
if fact_mean is None or len(fact_mean) != len(f_vec):
|
|
612
|
-
# No stored mean — fall back to simplified
|
|
613
|
-
return _fisher_rao_similarity(q_vec, f_vec, var_vec, self._temperature)
|
|
614
|
-
|
|
615
|
-
# Need query variance for the full metric
|
|
616
|
-
if q_mean is None or q_var is None:
|
|
617
|
-
return _fisher_rao_similarity(q_vec, f_vec, var_vec, self._temperature)
|
|
618
|
-
|
|
619
|
-
if len(q_mean) != len(fact_mean) or len(q_var) != len(var_vec):
|
|
620
|
-
return _fisher_rao_similarity(q_vec, f_vec, var_vec, self._temperature)
|
|
621
|
-
|
|
622
|
-
metric = self._get_full_metric()
|
|
623
|
-
try:
|
|
624
|
-
return metric.similarity(
|
|
625
|
-
q_mean.tolist(), q_var.tolist(),
|
|
626
|
-
list(fact_mean), list(var_vec),
|
|
627
|
-
)
|
|
628
|
-
except (ValueError, FloatingPointError):
|
|
629
|
-
# Numerical issue — fall back gracefully
|
|
630
|
-
logger.debug("Full Fisher metric raised; falling back to simplified")
|
|
631
|
-
return _fisher_rao_similarity(q_vec, f_vec, var_vec, self._temperature)
|
|
632
|
-
|
|
633
|
-
def _get_full_metric(self) -> "FisherRaoMetric": # noqa: F821
|
|
634
|
-
"""Lazy-load FisherRaoMetric to avoid import-time cost."""
|
|
635
|
-
if self._full_metric is None:
|
|
636
|
-
from superlocalmemory.math.fisher import FisherRaoMetric
|
|
637
|
-
self._full_metric = FisherRaoMetric(temperature=self._temperature)
|
|
638
|
-
return self._full_metric # type: ignore[return-value]
|