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,465 +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
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3.3 -- Hopfield Associative Memory (6th of 6 Retrieval Channels).
|
|
6
|
-
|
|
7
|
-
Modern Continuous Hopfield Network retrieval channel based on
|
|
8
|
-
Ramsauer et al. (2020): "Hopfield Networks is All You Need".
|
|
9
|
-
|
|
10
|
-
Channel lineup (6 total): semantic, BM25, entity_graph, temporal,
|
|
11
|
-
spreading_activation, hopfield (this module).
|
|
12
|
-
|
|
13
|
-
The Hopfield channel excels at pattern completion for vague/noisy queries.
|
|
14
|
-
It operates on the same embedding space as the semantic channel but uses
|
|
15
|
-
an energy-based attention mechanism instead of cosine similarity.
|
|
16
|
-
|
|
17
|
-
Key features:
|
|
18
|
-
- Full memory matrix path for stores < 10K facts
|
|
19
|
-
- ANN pre-filter path for stores 10K-100K (VectorStore KNN -> Hopfield refinement)
|
|
20
|
-
- Skip path for stores > 100K (other 5 non-Hopfield channels are sufficient)
|
|
21
|
-
- TTL-based matrix cache to avoid rebuilding every query
|
|
22
|
-
- Returns [] on any error (HR-06)
|
|
23
|
-
|
|
24
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
25
|
-
License: AGPL-3.0-or-later
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
from __future__ import annotations
|
|
29
|
-
|
|
30
|
-
import logging
|
|
31
|
-
import threading
|
|
32
|
-
import time
|
|
33
|
-
from typing import Any
|
|
34
|
-
|
|
35
|
-
import numpy as np
|
|
36
|
-
|
|
37
|
-
from superlocalmemory.math.hopfield import HopfieldConfig, ModernHopfieldNetwork
|
|
38
|
-
from superlocalmemory.retrieval.scope_policy import filter_authorized_results
|
|
39
|
-
|
|
40
|
-
logger = logging.getLogger(__name__)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class HopfieldChannel:
|
|
44
|
-
"""6th of 6 retrieval channels: Modern Hopfield associative memory.
|
|
45
|
-
|
|
46
|
-
Implements the RetrievalChannel protocol::
|
|
47
|
-
|
|
48
|
-
def search(query, profile_id, top_k=50) -> list[tuple[str, float]]
|
|
49
|
-
|
|
50
|
-
The channel builds an in-memory matrix from all fact embeddings,
|
|
51
|
-
computes Hopfield attention scores (softmax of scaled dot products),
|
|
52
|
-
then ranks facts by similarity to the completed pattern.
|
|
53
|
-
|
|
54
|
-
Six-channel retrieval model: semantic, BM25, entity_graph, temporal,
|
|
55
|
-
spreading_activation, hopfield (this channel).
|
|
56
|
-
|
|
57
|
-
Routing logic (per LLD Section 2.2):
|
|
58
|
-
- n > skip_threshold (100K): return [] immediately
|
|
59
|
-
- n > prefilter_threshold (10K): ANN pre-filter + Hopfield on subset
|
|
60
|
-
- n <= prefilter_threshold: full matrix Hopfield
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
def __init__(
|
|
64
|
-
self,
|
|
65
|
-
db: Any,
|
|
66
|
-
vector_store: Any,
|
|
67
|
-
config: HopfieldConfig | None = None,
|
|
68
|
-
) -> None:
|
|
69
|
-
"""Initialize HopfieldChannel.
|
|
70
|
-
|
|
71
|
-
Args:
|
|
72
|
-
db: DatabaseManager with get_all_facts() and get_facts_by_ids().
|
|
73
|
-
vector_store: VectorStore with search() and count().
|
|
74
|
-
config: Hopfield configuration. Uses defaults if None.
|
|
75
|
-
"""
|
|
76
|
-
self._db = db
|
|
77
|
-
self._vector_store = vector_store
|
|
78
|
-
self._config = config or HopfieldConfig()
|
|
79
|
-
self._hopfield = ModernHopfieldNetwork(self._config)
|
|
80
|
-
self._cache_lock = threading.RLock()
|
|
81
|
-
|
|
82
|
-
# Memory matrix cache (per LLD Section 2.2, HR-09)
|
|
83
|
-
self._cached_matrix: np.ndarray | None = None
|
|
84
|
-
self._cached_fact_ids: list[str] = []
|
|
85
|
-
self._cached_profile: str = ""
|
|
86
|
-
self._cached_scope_key: tuple[str, bool, bool] | None = None
|
|
87
|
-
self._cached_count: int = 0
|
|
88
|
-
self._cache_timestamp: float = 0.0
|
|
89
|
-
|
|
90
|
-
# -- Public API (RetrievalChannel protocol) --------------------------------
|
|
91
|
-
|
|
92
|
-
def search(
|
|
93
|
-
self,
|
|
94
|
-
query: Any,
|
|
95
|
-
profile_id: str,
|
|
96
|
-
top_k: int = 50,
|
|
97
|
-
include_global: bool | None = None,
|
|
98
|
-
include_shared: bool | None = None,
|
|
99
|
-
) -> list[tuple[str, float]]:
|
|
100
|
-
"""Search for facts using Hopfield associative retrieval.
|
|
101
|
-
|
|
102
|
-
Args:
|
|
103
|
-
query: Query embedding (list[float] or np.ndarray).
|
|
104
|
-
profile_id: Scope search to this profile.
|
|
105
|
-
top_k: Maximum results to return.
|
|
106
|
-
include_global: Include global-scope facts. Falls back to the
|
|
107
|
-
instance attribute when not supplied.
|
|
108
|
-
include_shared: Include shared-scope facts. Same fallback.
|
|
109
|
-
|
|
110
|
-
Returns:
|
|
111
|
-
List of (fact_id, score) sorted by score descending.
|
|
112
|
-
Returns [] on any error (HR-06).
|
|
113
|
-
"""
|
|
114
|
-
# Step 1: Check enabled
|
|
115
|
-
if not self._config.enabled:
|
|
116
|
-
return []
|
|
117
|
-
|
|
118
|
-
if include_global is None:
|
|
119
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
120
|
-
if include_shared is None:
|
|
121
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
122
|
-
try:
|
|
123
|
-
with self._cache_lock:
|
|
124
|
-
return self._search_inner(
|
|
125
|
-
query,
|
|
126
|
-
profile_id,
|
|
127
|
-
top_k,
|
|
128
|
-
include_global=include_global,
|
|
129
|
-
include_shared=include_shared,
|
|
130
|
-
)
|
|
131
|
-
except Exception as exc:
|
|
132
|
-
# HR-06: Return [] on any error
|
|
133
|
-
logger.warning("Hopfield channel error: %s", exc)
|
|
134
|
-
return []
|
|
135
|
-
|
|
136
|
-
# -- Private implementation ------------------------------------------------
|
|
137
|
-
|
|
138
|
-
def _search_inner(
|
|
139
|
-
self,
|
|
140
|
-
query: Any,
|
|
141
|
-
profile_id: str,
|
|
142
|
-
top_k: int,
|
|
143
|
-
*,
|
|
144
|
-
include_global: bool = False,
|
|
145
|
-
include_shared: bool = False,
|
|
146
|
-
) -> list[tuple[str, float]]:
|
|
147
|
-
"""Core search logic, separated for clean error handling."""
|
|
148
|
-
# Step 2: Convert query to numpy
|
|
149
|
-
q_vec = np.array(query, dtype=np.float32)
|
|
150
|
-
|
|
151
|
-
# Step 3: Validate dimension
|
|
152
|
-
if q_vec.shape != (self._config.dimension,):
|
|
153
|
-
logger.debug(
|
|
154
|
-
"Hopfield dimension mismatch: query %s, expected (%d,)",
|
|
155
|
-
q_vec.shape, self._config.dimension,
|
|
156
|
-
)
|
|
157
|
-
return []
|
|
158
|
-
|
|
159
|
-
# Step 3b (AUDIT FIX G-MEDIUM-02): Check skip_threshold BEFORE loading matrix
|
|
160
|
-
try:
|
|
161
|
-
total_count = self._db.get_fact_count(
|
|
162
|
-
profile_id,
|
|
163
|
-
include_global=include_global,
|
|
164
|
-
include_shared=include_shared,
|
|
165
|
-
)
|
|
166
|
-
except (AttributeError, TypeError):
|
|
167
|
-
total_count = (
|
|
168
|
-
self._vector_store.count(profile_id)
|
|
169
|
-
if self._vector_store and getattr(self._vector_store, "available", False)
|
|
170
|
-
else 0
|
|
171
|
-
)
|
|
172
|
-
# Step 3c: Skip for very large stores
|
|
173
|
-
if total_count > self._config.skip_threshold:
|
|
174
|
-
logger.debug(
|
|
175
|
-
"Hopfield skipped: %d facts exceeds skip_threshold %d",
|
|
176
|
-
total_count, self._config.skip_threshold,
|
|
177
|
-
)
|
|
178
|
-
return []
|
|
179
|
-
|
|
180
|
-
# Step 4 (v3.5.0 FIX): route by the cheap total_count BEFORE building
|
|
181
|
-
# the full memory matrix. Previously _get_memory_matrix() loaded and
|
|
182
|
-
# normalized ALL embeddings (~6s at 17.5k facts) even when the prefilter
|
|
183
|
-
# path was taken — and that path builds its own ANN sub-matrix and never
|
|
184
|
-
# uses the full one. So the entire 6s build was wasted on large stores.
|
|
185
|
-
# Now the full matrix is built ONLY for small stores (<= prefilter_threshold).
|
|
186
|
-
vs_ok = bool(
|
|
187
|
-
self._vector_store
|
|
188
|
-
and getattr(self._vector_store, "available", False)
|
|
189
|
-
)
|
|
190
|
-
# v3.5.0 FIX: prefer the bounded ANN-prefilter path whenever a vector
|
|
191
|
-
# store is available and the corpus is larger than the candidate set.
|
|
192
|
-
# The full-matrix path loads & L2-normalizes EVERY embedding from SQLite
|
|
193
|
-
# (~6s at 17.5k facts), so it's only worth it for tiny stores or when no
|
|
194
|
-
# VS exists. Routing on prefilter_candidates (not prefilter_threshold)
|
|
195
|
-
# ensures the matrix is always bounded to ~prefilter_candidates rows.
|
|
196
|
-
if vs_ok and total_count > self._config.prefilter_candidates:
|
|
197
|
-
return self._search_with_prefilter(
|
|
198
|
-
q_vec,
|
|
199
|
-
profile_id,
|
|
200
|
-
[],
|
|
201
|
-
top_k,
|
|
202
|
-
include_global=include_global,
|
|
203
|
-
include_shared=include_shared,
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
# Tiny store (or no VS): build (cached) full matrix.
|
|
207
|
-
memory_matrix, fact_ids = self._get_memory_matrix(
|
|
208
|
-
profile_id,
|
|
209
|
-
include_global=include_global,
|
|
210
|
-
include_shared=include_shared,
|
|
211
|
-
)
|
|
212
|
-
if memory_matrix is None or len(fact_ids) == 0:
|
|
213
|
-
return []
|
|
214
|
-
if vs_ok and len(fact_ids) > self._config.prefilter_candidates:
|
|
215
|
-
return self._search_with_prefilter(
|
|
216
|
-
q_vec,
|
|
217
|
-
profile_id,
|
|
218
|
-
fact_ids,
|
|
219
|
-
top_k,
|
|
220
|
-
include_global=include_global,
|
|
221
|
-
include_shared=include_shared,
|
|
222
|
-
)
|
|
223
|
-
results = self._search_full_matrix(
|
|
224
|
-
q_vec, memory_matrix, fact_ids, top_k,
|
|
225
|
-
)
|
|
226
|
-
return filter_authorized_results(
|
|
227
|
-
self._db,
|
|
228
|
-
results,
|
|
229
|
-
profile_id,
|
|
230
|
-
include_global=include_global,
|
|
231
|
-
include_shared=include_shared,
|
|
232
|
-
)
|
|
233
|
-
|
|
234
|
-
def _search_full_matrix(
|
|
235
|
-
self,
|
|
236
|
-
query: np.ndarray,
|
|
237
|
-
memory_matrix: np.ndarray,
|
|
238
|
-
fact_ids: list[str],
|
|
239
|
-
top_k: int,
|
|
240
|
-
) -> list[tuple[str, float]]:
|
|
241
|
-
"""Full matrix Hopfield retrieval for stores <= prefilter_threshold.
|
|
242
|
-
|
|
243
|
-
Algorithm (LLD Section 2.2):
|
|
244
|
-
1. Compute Hopfield attention weights
|
|
245
|
-
2. Compute retrieved (completed) pattern via weighted sum
|
|
246
|
-
3. Normalize retrieved pattern
|
|
247
|
-
4. Score all stored patterns against the completed pattern
|
|
248
|
-
5. Return top-K by similarity
|
|
249
|
-
"""
|
|
250
|
-
# Step 1: Hopfield attention
|
|
251
|
-
attention = self._hopfield.attention_scores(query, memory_matrix)
|
|
252
|
-
|
|
253
|
-
# Step 2: Pattern completion
|
|
254
|
-
retrieved = memory_matrix.T @ attention # shape (d,)
|
|
255
|
-
|
|
256
|
-
# Step 3: Normalize
|
|
257
|
-
norm = float(np.linalg.norm(retrieved))
|
|
258
|
-
if norm > 1e-8:
|
|
259
|
-
retrieved = retrieved / norm
|
|
260
|
-
|
|
261
|
-
# Step 4: Similarity to all patterns
|
|
262
|
-
similarities = memory_matrix @ retrieved # shape (n,)
|
|
263
|
-
|
|
264
|
-
# Step 5: Top-K selection with stable tie-break on fact_id.
|
|
265
|
-
# argsort(-similarities) is score-only: equal similarities are ordered
|
|
266
|
-
# by row index, which tracks the order facts were loaded from the DB
|
|
267
|
-
# and varies between sessions. lexsort breaks ties on fact_id so the
|
|
268
|
-
# same query over the same store returns the same ranking every time.
|
|
269
|
-
id_arr = np.array(fact_ids, dtype=object)
|
|
270
|
-
order = np.lexsort((id_arr, -similarities)) # primary: -similarity, secondary: fact_id
|
|
271
|
-
top_indices = order[:top_k]
|
|
272
|
-
results: list[tuple[str, float]] = [
|
|
273
|
-
(fact_ids[int(i)], float(similarities[i]))
|
|
274
|
-
for i in top_indices
|
|
275
|
-
if similarities[i] > 0.0
|
|
276
|
-
]
|
|
277
|
-
|
|
278
|
-
return results
|
|
279
|
-
|
|
280
|
-
def _search_with_prefilter(
|
|
281
|
-
self,
|
|
282
|
-
query: np.ndarray,
|
|
283
|
-
profile_id: str,
|
|
284
|
-
all_fact_ids: list[str],
|
|
285
|
-
top_k: int,
|
|
286
|
-
*,
|
|
287
|
-
include_global: bool = False,
|
|
288
|
-
include_shared: bool = False,
|
|
289
|
-
) -> list[tuple[str, float]]:
|
|
290
|
-
"""Two-stage retrieval for large stores (>prefilter_threshold facts).
|
|
291
|
-
|
|
292
|
-
Stage 1: VectorStore KNN pre-filter to get candidate subset
|
|
293
|
-
Stage 2: Hopfield refinement on the small candidate set
|
|
294
|
-
|
|
295
|
-
Algorithm (LLD Section 2.2):
|
|
296
|
-
1. Get KNN candidates from VectorStore
|
|
297
|
-
2. Load candidate facts from DB
|
|
298
|
-
3. Build sub-matrix from candidate embeddings
|
|
299
|
-
4. Run full-matrix Hopfield on the sub-matrix
|
|
300
|
-
"""
|
|
301
|
-
# Stage 1: KNN pre-filter
|
|
302
|
-
if not self._vector_store or not getattr(self._vector_store, "available", False):
|
|
303
|
-
# No vector store available; fall back to full matrix
|
|
304
|
-
# (only reached if matrix was somehow loaded despite no VS)
|
|
305
|
-
return []
|
|
306
|
-
|
|
307
|
-
knn_results = self._vector_store.search(
|
|
308
|
-
query.tolist(),
|
|
309
|
-
top_k=self._config.prefilter_candidates,
|
|
310
|
-
profile_id=profile_id,
|
|
311
|
-
)
|
|
312
|
-
# The ANN index is owner-profile partitioned. Supplement it with
|
|
313
|
-
# opted-in cross-profile facts, then authorize the combined candidates
|
|
314
|
-
# through the canonical DB predicate below.
|
|
315
|
-
external_facts = self._db.get_external_visible_facts(
|
|
316
|
-
profile_id,
|
|
317
|
-
include_global=include_global,
|
|
318
|
-
include_shared=include_shared,
|
|
319
|
-
)
|
|
320
|
-
combined = {fact_id: score for fact_id, score in knn_results}
|
|
321
|
-
query_norm = float(np.linalg.norm(query))
|
|
322
|
-
for fact in external_facts:
|
|
323
|
-
embedding = getattr(fact, "embedding", None)
|
|
324
|
-
if embedding is None or len(embedding) != self._config.dimension:
|
|
325
|
-
continue
|
|
326
|
-
vector = np.array(embedding, dtype=np.float32)
|
|
327
|
-
denominator = query_norm * float(np.linalg.norm(vector))
|
|
328
|
-
if denominator <= 1e-8:
|
|
329
|
-
continue
|
|
330
|
-
score = (float(np.dot(query, vector) / denominator) + 1.0) / 2.0
|
|
331
|
-
combined[fact.fact_id] = max(combined.get(fact.fact_id, 0.0), score)
|
|
332
|
-
if not combined:
|
|
333
|
-
return []
|
|
334
|
-
|
|
335
|
-
# Stage 2: Load candidate facts
|
|
336
|
-
candidate_ids = list(combined)
|
|
337
|
-
candidates = self._db.get_facts_by_ids(
|
|
338
|
-
candidate_ids, profile_id,
|
|
339
|
-
include_global=include_global,
|
|
340
|
-
include_shared=include_shared,
|
|
341
|
-
)
|
|
342
|
-
if not candidates:
|
|
343
|
-
return []
|
|
344
|
-
|
|
345
|
-
# Stage 3: Build sub-matrix
|
|
346
|
-
sub_embeddings: list[np.ndarray] = []
|
|
347
|
-
sub_ids: list[str] = []
|
|
348
|
-
for fact in candidates:
|
|
349
|
-
emb = getattr(fact, "embedding", None)
|
|
350
|
-
if emb is not None and len(emb) == self._config.dimension:
|
|
351
|
-
sub_embeddings.append(np.array(emb, dtype=np.float32))
|
|
352
|
-
sub_ids.append(fact.fact_id)
|
|
353
|
-
|
|
354
|
-
if not sub_embeddings:
|
|
355
|
-
return []
|
|
356
|
-
|
|
357
|
-
sub_matrix = np.array(sub_embeddings, dtype=np.float32)
|
|
358
|
-
|
|
359
|
-
# HR-03: L2-normalize sub-matrix rows
|
|
360
|
-
norms = np.linalg.norm(sub_matrix, axis=1, keepdims=True)
|
|
361
|
-
norms = np.maximum(norms, 1e-8)
|
|
362
|
-
sub_matrix = sub_matrix / norms
|
|
363
|
-
|
|
364
|
-
# Stage 4: Hopfield on subset
|
|
365
|
-
results = self._search_full_matrix(query, sub_matrix, sub_ids, top_k)
|
|
366
|
-
return filter_authorized_results(
|
|
367
|
-
self._db,
|
|
368
|
-
results,
|
|
369
|
-
profile_id,
|
|
370
|
-
include_global=include_global,
|
|
371
|
-
include_shared=include_shared,
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
def _get_memory_matrix(
|
|
375
|
-
self,
|
|
376
|
-
profile_id: str,
|
|
377
|
-
*,
|
|
378
|
-
include_global: bool = False,
|
|
379
|
-
include_shared: bool = False,
|
|
380
|
-
) -> tuple[np.ndarray | None, list[str]]:
|
|
381
|
-
"""Build or retrieve cached memory matrix X (n x d).
|
|
382
|
-
|
|
383
|
-
The matrix is L2-normalized per row (HR-03) and cached
|
|
384
|
-
with a TTL (HR-09, default 60s).
|
|
385
|
-
|
|
386
|
-
Returns:
|
|
387
|
-
(memory_matrix, fact_ids) or (None, []) if no valid facts.
|
|
388
|
-
"""
|
|
389
|
-
# Step 1: Check cache validity
|
|
390
|
-
scope_key = (profile_id, bool(include_global), bool(include_shared))
|
|
391
|
-
try:
|
|
392
|
-
current_count = self._db.get_fact_count(
|
|
393
|
-
profile_id,
|
|
394
|
-
include_global=include_global,
|
|
395
|
-
include_shared=include_shared,
|
|
396
|
-
)
|
|
397
|
-
except (AttributeError, TypeError):
|
|
398
|
-
current_count = (
|
|
399
|
-
self._vector_store.count(profile_id)
|
|
400
|
-
if self._vector_store and getattr(self._vector_store, "available", False)
|
|
401
|
-
else 0
|
|
402
|
-
)
|
|
403
|
-
|
|
404
|
-
if (
|
|
405
|
-
self._cached_scope_key == scope_key
|
|
406
|
-
and self._cached_count == current_count
|
|
407
|
-
and self._cached_matrix is not None
|
|
408
|
-
and (time.monotonic() - self._cache_timestamp)
|
|
409
|
-
< self._config.cache_ttl_seconds
|
|
410
|
-
):
|
|
411
|
-
return (self._cached_matrix, self._cached_fact_ids)
|
|
412
|
-
|
|
413
|
-
# Step 2: Load facts (V3.3.12: cap to most recent 5000 to bound memory)
|
|
414
|
-
# memory-bounding-02: push the cap into SQL (LIMIT) so we don't
|
|
415
|
-
# deserialize the whole table just to slice it.
|
|
416
|
-
facts = self._db.get_all_facts(
|
|
417
|
-
profile_id, limit=5000,
|
|
418
|
-
include_global=include_global,
|
|
419
|
-
include_shared=include_shared,
|
|
420
|
-
)
|
|
421
|
-
if not facts:
|
|
422
|
-
return (None, [])
|
|
423
|
-
|
|
424
|
-
# Step 4: Filter facts with valid embeddings
|
|
425
|
-
valid: list[tuple[str, list[float]]] = []
|
|
426
|
-
for f in facts:
|
|
427
|
-
emb = getattr(f, "embedding", None)
|
|
428
|
-
if emb is not None and len(emb) == self._config.dimension:
|
|
429
|
-
valid.append((f.fact_id, emb))
|
|
430
|
-
|
|
431
|
-
if not valid:
|
|
432
|
-
return (None, [])
|
|
433
|
-
|
|
434
|
-
# Step 6: Build matrix
|
|
435
|
-
fact_ids = [fid for fid, _ in valid]
|
|
436
|
-
matrix = np.array(
|
|
437
|
-
[emb for _, emb in valid], dtype=np.float32,
|
|
438
|
-
) # shape (n, d)
|
|
439
|
-
|
|
440
|
-
# Step 7: HR-03 — L2 normalize each row
|
|
441
|
-
norms = np.linalg.norm(matrix, axis=1, keepdims=True)
|
|
442
|
-
norms = np.maximum(norms, 1e-8)
|
|
443
|
-
matrix = matrix / norms
|
|
444
|
-
|
|
445
|
-
# Step 8: Update cache
|
|
446
|
-
self._cached_matrix = matrix
|
|
447
|
-
self._cached_fact_ids = fact_ids
|
|
448
|
-
self._cached_profile = profile_id
|
|
449
|
-
self._cached_scope_key = scope_key
|
|
450
|
-
self._cached_count = current_count
|
|
451
|
-
self._cache_timestamp = time.monotonic()
|
|
452
|
-
|
|
453
|
-
return (matrix, fact_ids)
|
|
454
|
-
|
|
455
|
-
def invalidate_cache(self) -> None:
|
|
456
|
-
"""Clear the memory matrix cache.
|
|
457
|
-
|
|
458
|
-
Called after fact insertion/deletion to ensure
|
|
459
|
-
next search rebuilds with fresh data.
|
|
460
|
-
"""
|
|
461
|
-
self._cached_matrix = None
|
|
462
|
-
self._cached_fact_ids = []
|
|
463
|
-
self._cached_scope_key = None
|
|
464
|
-
self._cached_count = 0
|
|
465
|
-
self._cache_timestamp = 0.0
|
|
@@ -1,105 +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 — Profile Channel (Entity-Profile Retrieval).
|
|
6
|
-
|
|
7
|
-
Returns fact IDs from entity profiles — enables direct answers for
|
|
8
|
-
"What does Alice do?" style queries without full embedding search.
|
|
9
|
-
|
|
10
|
-
This is a SHORTCUT channel: if the query mentions a known entity,
|
|
11
|
-
the profile's accumulated fact IDs are injected directly into the
|
|
12
|
-
retrieval pool with high scores.
|
|
13
|
-
|
|
14
|
-
Competitor reference: EverMemOS profile synthesis (~+15-20% SH).
|
|
15
|
-
|
|
16
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
17
|
-
License: AGPL-3.0-or-later
|
|
18
|
-
"""
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import logging
|
|
22
|
-
import re
|
|
23
|
-
from typing import TYPE_CHECKING
|
|
24
|
-
|
|
25
|
-
if TYPE_CHECKING:
|
|
26
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
# Pattern for extracting potential entity names (capitalized multi-word)
|
|
31
|
-
_ENTITY_PATTERN = re.compile(r"\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\b")
|
|
32
|
-
|
|
33
|
-
# Common sentence starters to exclude from entity extraction
|
|
34
|
-
_SENTENCE_STARTERS = frozenset({
|
|
35
|
-
"What", "Where", "Who", "Which", "How", "When", "Does", "Did",
|
|
36
|
-
"Can", "Could", "Would", "Should", "Are", "Is", "Was", "Were",
|
|
37
|
-
"Has", "Have", "The", "Tell", "Please", "Do", "Why",
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class ProfileChannel:
|
|
42
|
-
"""Entity-profile-based retrieval for direct entity queries.
|
|
43
|
-
|
|
44
|
-
If the query mentions a known entity (by canonical name or alias),
|
|
45
|
-
the entity's profile fact IDs are returned with high base score.
|
|
46
|
-
|
|
47
|
-
Usage::
|
|
48
|
-
|
|
49
|
-
channel = ProfileChannel(db)
|
|
50
|
-
results = channel.search("What is Alice's job?", "default")
|
|
51
|
-
# returns [(fact_id_1, 0.95), (fact_id_2, 0.95), ...]
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
def __init__(self, db: DatabaseManager) -> None:
|
|
55
|
-
self._db = db
|
|
56
|
-
|
|
57
|
-
def search(
|
|
58
|
-
self,
|
|
59
|
-
query: str,
|
|
60
|
-
profile_id: str,
|
|
61
|
-
top_k: int = 10,
|
|
62
|
-
) -> list[tuple[str, float]]:
|
|
63
|
-
"""Search entity profiles for matching facts.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
query: User query text.
|
|
67
|
-
profile_id: Scope to this profile.
|
|
68
|
-
top_k: Maximum results to return.
|
|
69
|
-
|
|
70
|
-
Returns:
|
|
71
|
-
List of (fact_id, score) sorted by score descending.
|
|
72
|
-
"""
|
|
73
|
-
entities = self._extract_entity_names(query)
|
|
74
|
-
if not entities:
|
|
75
|
-
return []
|
|
76
|
-
|
|
77
|
-
results: list[tuple[str, float]] = []
|
|
78
|
-
seen: set[str] = set()
|
|
79
|
-
|
|
80
|
-
for name in entities:
|
|
81
|
-
entity = self._db.get_entity_by_name(name, profile_id)
|
|
82
|
-
if not entity:
|
|
83
|
-
continue
|
|
84
|
-
|
|
85
|
-
profiles = self._db.get_entity_profiles_by_entity(
|
|
86
|
-
entity.entity_id, profile_id,
|
|
87
|
-
)
|
|
88
|
-
for p in profiles:
|
|
89
|
-
for fid in p.fact_ids:
|
|
90
|
-
if fid not in seen:
|
|
91
|
-
seen.add(fid)
|
|
92
|
-
results.append((fid, 0.95))
|
|
93
|
-
|
|
94
|
-
results.sort(key=lambda x: (-x[1], x[0]))
|
|
95
|
-
return results[:top_k]
|
|
96
|
-
|
|
97
|
-
@staticmethod
|
|
98
|
-
def _extract_entity_names(query: str) -> list[str]:
|
|
99
|
-
"""Extract potential entity names from query text.
|
|
100
|
-
|
|
101
|
-
Returns capitalized words/phrases that aren't common
|
|
102
|
-
sentence starters.
|
|
103
|
-
"""
|
|
104
|
-
matches = _ENTITY_PATTERN.findall(query)
|
|
105
|
-
return [m for m in matches if m not in _SENTENCE_STARTERS]
|