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,616 +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
|
-
"""SYNAPSE spreading activation -- 5th retrieval channel.
|
|
6
|
-
|
|
7
|
-
SYNAPSE (arXiv 2601.02744) 5-step algorithm adapted for SLM.
|
|
8
|
-
Pure math -- no LLM calls at query time. With M=7, T=3 the
|
|
9
|
-
computation is ~21 neighbor lookups (<5ms on SQLite with indexes).
|
|
10
|
-
|
|
11
|
-
Reads BOTH graph_edges + association_edges via UNION query (Rule 13).
|
|
12
|
-
Registered as 5th channel via ChannelRegistry (needs_embedding=True).
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
License: AGPL-3.0-or-later
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import hashlib
|
|
21
|
-
import logging
|
|
22
|
-
import math
|
|
23
|
-
from dataclasses import dataclass
|
|
24
|
-
from typing import Any
|
|
25
|
-
|
|
26
|
-
import numpy as np
|
|
27
|
-
|
|
28
|
-
from superlocalmemory.retrieval.scope_policy import (
|
|
29
|
-
authorized_fact_ids,
|
|
30
|
-
filter_authorized_results,
|
|
31
|
-
)
|
|
32
|
-
from superlocalmemory.storage.database import _scope_where
|
|
33
|
-
from superlocalmemory.storage.models import _new_id
|
|
34
|
-
|
|
35
|
-
logger = logging.getLogger(__name__)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# ---------------------------------------------------------------------------
|
|
39
|
-
# Configuration (frozen dataclass, Rule 10)
|
|
40
|
-
# ---------------------------------------------------------------------------
|
|
41
|
-
|
|
42
|
-
@dataclass(frozen=True)
|
|
43
|
-
class SpreadingActivationConfig:
|
|
44
|
-
"""Configuration for SYNAPSE spreading activation.
|
|
45
|
-
|
|
46
|
-
All hyperparameters from the SYNAPSE paper (arXiv 2601.02744).
|
|
47
|
-
SYNAPSE tuned on 384d (all-MiniLM-L6-v2). SLM uses 768d
|
|
48
|
-
(nomic-embed-text). Phase 3 calibration test verifies convergence.
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
alpha: float = 1.0 # Seed scaling factor
|
|
52
|
-
delta: float = 0.5 # Node retention / self-decay per iteration
|
|
53
|
-
spreading_factor: float = 0.8 # S: energy diffusion rate
|
|
54
|
-
# V3.3.20: Recalibrated for SLM graph density (254K edges, 768d).
|
|
55
|
-
# V3.4.40 (2026-05-09): graph grew to 960K edges. top_m=20 caused 5.5s recalls.
|
|
56
|
-
# Reduced to 10 (compromise between SYNAPSE default 7 and the dense-graph 20).
|
|
57
|
-
# SYNAPSE defaults (theta=0.5, top_m=7) were for 384d sparse graphs.
|
|
58
|
-
theta: float = 0.2 # Activation threshold for sigmoid (was 0.5)
|
|
59
|
-
top_m: int = 10 # Lateral inhibition: max active nodes (was 20, then 7 originally)
|
|
60
|
-
max_iterations: int = 3 # T: propagation depth
|
|
61
|
-
tau_gate: float = 0.05 # FOK confidence gate (was 0.12)
|
|
62
|
-
enabled: bool = True # Ships enabled by default
|
|
63
|
-
# V3.4.40 (2026-05-09): per-node neighbor fan-out clamp.
|
|
64
|
-
# Hub nodes in dense graphs (5K+ edges) caused unbounded work per expansion.
|
|
65
|
-
# v3.4.52: reduced from 100 to 30 — GAM (ICLR 2026) shows that with
|
|
66
|
-
# covering indexes on weight DESC, 30 well-ranked neighbors provides
|
|
67
|
-
# sufficient spreading signal. Combined with streaming merge (SQLite 3.45+),
|
|
68
|
-
# this brings SpreadingActivation from 4.2s to ~60ms.
|
|
69
|
-
max_neighbors_per_node: int = 30
|
|
70
|
-
# v3.4.1: Graph intelligence integration
|
|
71
|
-
use_pagerank_bias: bool = False # Multiply propagation by target PageRank
|
|
72
|
-
community_boost: float = 0.0 # Boost same-community nodes (0.0 = disabled)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# ---------------------------------------------------------------------------
|
|
76
|
-
# SpreadingActivation Channel
|
|
77
|
-
# ---------------------------------------------------------------------------
|
|
78
|
-
|
|
79
|
-
class SpreadingActivation:
|
|
80
|
-
"""SYNAPSE 5-step spreading activation as 5th retrieval channel.
|
|
81
|
-
|
|
82
|
-
Algorithm:
|
|
83
|
-
Step 1: Initialization with ALPHA seed scaling
|
|
84
|
-
Step 2: Propagation with fan effect (out-degree normalization)
|
|
85
|
-
Step 3: Lateral inhibition (top-M=7 pruning)
|
|
86
|
-
Step 4: Nonlinear sigmoid gating
|
|
87
|
-
Step 5: Iterate T=3 times, then FOK gate
|
|
88
|
-
|
|
89
|
-
Registered as 5th channel via ChannelRegistry (Rule 07).
|
|
90
|
-
Reads BOTH graph_edges + association_edges via UNION query (Rule 13).
|
|
91
|
-
"""
|
|
92
|
-
|
|
93
|
-
def __init__(
|
|
94
|
-
self,
|
|
95
|
-
db: Any,
|
|
96
|
-
vector_store: Any | None,
|
|
97
|
-
config: SpreadingActivationConfig | None = None,
|
|
98
|
-
) -> None:
|
|
99
|
-
self._db = db
|
|
100
|
-
self._vector_store = vector_store
|
|
101
|
-
self._config = config or SpreadingActivationConfig()
|
|
102
|
-
# v3.4.1: Graph intelligence caches (loaded lazily per profile)
|
|
103
|
-
self._pr_cache: dict[str, float] = {}
|
|
104
|
-
self._pr_profile: str = ""
|
|
105
|
-
self._comm_cache: dict[str, int | None] = {}
|
|
106
|
-
self._comm_profile: str = ""
|
|
107
|
-
|
|
108
|
-
def search(
|
|
109
|
-
self,
|
|
110
|
-
query: Any,
|
|
111
|
-
profile_id: str = "",
|
|
112
|
-
top_k: int = 7,
|
|
113
|
-
include_global: bool | None = None,
|
|
114
|
-
include_shared: bool | None = None,
|
|
115
|
-
) -> list[tuple[str, float]]:
|
|
116
|
-
"""Channel-compatible interface: (query, top_k) -> [(fact_id, score)].
|
|
117
|
-
|
|
118
|
-
Matches ANNSearchable protocol (Rule 07).
|
|
119
|
-
|
|
120
|
-
Args:
|
|
121
|
-
include_global: Include global-scope facts. Falls back to the
|
|
122
|
-
instance attribute when not supplied.
|
|
123
|
-
include_shared: Include shared-scope facts. Same fallback.
|
|
124
|
-
"""
|
|
125
|
-
if not self._config.enabled:
|
|
126
|
-
return []
|
|
127
|
-
|
|
128
|
-
if include_global is None:
|
|
129
|
-
include_global = bool(getattr(self, "include_global", False))
|
|
130
|
-
if include_shared is None:
|
|
131
|
-
include_shared = bool(getattr(self, "include_shared", False))
|
|
132
|
-
try:
|
|
133
|
-
# Step 0: Get seed nodes from VectorStore KNN
|
|
134
|
-
seed_results = self._seed_search(
|
|
135
|
-
query,
|
|
136
|
-
profile_id,
|
|
137
|
-
include_global=include_global,
|
|
138
|
-
include_shared=include_shared,
|
|
139
|
-
)
|
|
140
|
-
# Owner-partitioned vector indexes cannot discover opted-in peers.
|
|
141
|
-
# Add visible external embeddings with the same cosine seed signal.
|
|
142
|
-
# v3.8.2 perf: external (global/shared) facts only matter for a
|
|
143
|
-
# cross-scope read. For the default personal scope this query always
|
|
144
|
-
# returns [] — skip it to remove a per-recall DB round-trip.
|
|
145
|
-
external_facts: list = []
|
|
146
|
-
if include_global or include_shared:
|
|
147
|
-
try:
|
|
148
|
-
external_facts = self._db.get_external_visible_facts(
|
|
149
|
-
profile_id,
|
|
150
|
-
include_global=include_global,
|
|
151
|
-
include_shared=include_shared,
|
|
152
|
-
)
|
|
153
|
-
except Exception:
|
|
154
|
-
external_facts = []
|
|
155
|
-
q_vec = np.array(query, dtype=np.float32)
|
|
156
|
-
q_norm = float(np.linalg.norm(q_vec))
|
|
157
|
-
combined = {fact_id: score for fact_id, score in seed_results}
|
|
158
|
-
for fact in external_facts:
|
|
159
|
-
embedding = getattr(fact, "embedding", None)
|
|
160
|
-
if embedding is None:
|
|
161
|
-
continue
|
|
162
|
-
fact_vec = np.array(embedding, dtype=np.float32)
|
|
163
|
-
if fact_vec.shape != q_vec.shape:
|
|
164
|
-
continue
|
|
165
|
-
denominator = q_norm * float(np.linalg.norm(fact_vec))
|
|
166
|
-
if denominator <= 1e-8:
|
|
167
|
-
continue
|
|
168
|
-
score = (float(np.dot(q_vec, fact_vec) / denominator) + 1.0) / 2.0
|
|
169
|
-
combined[fact.fact_id] = max(combined.get(fact.fact_id, 0.0), score)
|
|
170
|
-
# v3.8.2 perf: seeds come from this profile's own vector index /
|
|
171
|
-
# get_all_facts(profile_id), so for personal scope they are already
|
|
172
|
-
# authorized. Only re-authorize when a cross-scope read merged in
|
|
173
|
-
# global/shared candidates. filter_authorized_results below remains the
|
|
174
|
-
# security net on the returned set.
|
|
175
|
-
if include_global or include_shared:
|
|
176
|
-
allowed_seeds = authorized_fact_ids(
|
|
177
|
-
self._db,
|
|
178
|
-
combined,
|
|
179
|
-
profile_id,
|
|
180
|
-
include_global=include_global,
|
|
181
|
-
include_shared=include_shared,
|
|
182
|
-
)
|
|
183
|
-
seed_results = [
|
|
184
|
-
(fact_id, score)
|
|
185
|
-
for fact_id, score in combined.items()
|
|
186
|
-
if fact_id in allowed_seeds
|
|
187
|
-
]
|
|
188
|
-
else:
|
|
189
|
-
seed_results = list(combined.items())
|
|
190
|
-
if not seed_results:
|
|
191
|
-
return []
|
|
192
|
-
|
|
193
|
-
# Check cache first
|
|
194
|
-
query_hash = self._compute_query_hash(
|
|
195
|
-
query,
|
|
196
|
-
profile_id,
|
|
197
|
-
include_global=include_global,
|
|
198
|
-
include_shared=include_shared,
|
|
199
|
-
)
|
|
200
|
-
cached = self._get_cached_results(query_hash, profile_id)
|
|
201
|
-
if cached:
|
|
202
|
-
# v3.8.2 perf: cached activations were produced from this profile's
|
|
203
|
-
# own propagation; personal-scope hits need no re-authorization.
|
|
204
|
-
# Cross-scope hits still pass the fail-closed filter.
|
|
205
|
-
if include_global or include_shared:
|
|
206
|
-
return filter_authorized_results(
|
|
207
|
-
self._db,
|
|
208
|
-
cached,
|
|
209
|
-
profile_id,
|
|
210
|
-
include_global=include_global,
|
|
211
|
-
include_shared=include_shared,
|
|
212
|
-
)[:top_k]
|
|
213
|
-
return cached[:top_k]
|
|
214
|
-
|
|
215
|
-
# Run 5-step spreading activation
|
|
216
|
-
activations = self._propagate(
|
|
217
|
-
seed_results,
|
|
218
|
-
profile_id,
|
|
219
|
-
include_global=include_global,
|
|
220
|
-
include_shared=include_shared,
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
# FOK gating
|
|
224
|
-
if not self._fok_check(activations):
|
|
225
|
-
return []
|
|
226
|
-
|
|
227
|
-
# Cache results — DEFERRED so recall stays READ-ONLY on its hot
|
|
228
|
-
# path. This is a perf cache for FUTURE recalls, not needed to
|
|
229
|
-
# return the current results.
|
|
230
|
-
from superlocalmemory.storage.deferred_writes import submit_background
|
|
231
|
-
submit_background(
|
|
232
|
-
lambda: self._cache_results(query_hash, profile_id, activations)
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
# Return top-K sorted by activation
|
|
236
|
-
results = sorted(
|
|
237
|
-
activations.items(), key=lambda x: (-x[1], x[0]),
|
|
238
|
-
)
|
|
239
|
-
return filter_authorized_results(
|
|
240
|
-
self._db,
|
|
241
|
-
results,
|
|
242
|
-
profile_id,
|
|
243
|
-
include_global=include_global,
|
|
244
|
-
include_shared=include_shared,
|
|
245
|
-
)[:top_k]
|
|
246
|
-
|
|
247
|
-
except Exception as exc:
|
|
248
|
-
logger.warning(
|
|
249
|
-
"SpreadingActivation.search failed for profile %s: %s",
|
|
250
|
-
profile_id, exc,
|
|
251
|
-
)
|
|
252
|
-
return []
|
|
253
|
-
|
|
254
|
-
def _seed_search(
|
|
255
|
-
self,
|
|
256
|
-
query: Any,
|
|
257
|
-
profile_id: str,
|
|
258
|
-
*,
|
|
259
|
-
include_global: bool,
|
|
260
|
-
include_shared: bool,
|
|
261
|
-
) -> list[tuple[str, float]]:
|
|
262
|
-
"""Return bounded semantic graph seeds from vec0 or canonical SQLite.
|
|
263
|
-
|
|
264
|
-
sqlite-vec is an acceleration projection, not a prerequisite for the
|
|
265
|
-
graph retrieval layer. When it is unavailable on a platform, use the
|
|
266
|
-
canonical stored embeddings and the same cosine signal as the
|
|
267
|
-
cross-profile supplement below. This keeps spreading activation
|
|
268
|
-
present and truthful rather than silently removing a retrieval layer.
|
|
269
|
-
"""
|
|
270
|
-
if self._vector_store is not None and getattr(
|
|
271
|
-
self._vector_store, "available", False,
|
|
272
|
-
):
|
|
273
|
-
return self._vector_store.search(
|
|
274
|
-
query, top_k=self._config.top_m, profile_id=profile_id,
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
q_vec = np.array(query, dtype=np.float32)
|
|
278
|
-
q_norm = float(np.linalg.norm(q_vec))
|
|
279
|
-
if q_norm <= 1e-8:
|
|
280
|
-
return []
|
|
281
|
-
facts = self._db.get_all_facts(
|
|
282
|
-
profile_id,
|
|
283
|
-
include_global=include_global,
|
|
284
|
-
include_shared=include_shared,
|
|
285
|
-
)
|
|
286
|
-
scored: list[tuple[str, float]] = []
|
|
287
|
-
for fact in facts:
|
|
288
|
-
embedding = getattr(fact, "embedding", None)
|
|
289
|
-
if embedding is None:
|
|
290
|
-
continue
|
|
291
|
-
fact_vec = np.array(embedding, dtype=np.float32)
|
|
292
|
-
if fact_vec.shape != q_vec.shape:
|
|
293
|
-
continue
|
|
294
|
-
denominator = q_norm * float(np.linalg.norm(fact_vec))
|
|
295
|
-
if denominator <= 1e-8:
|
|
296
|
-
continue
|
|
297
|
-
score = (float(np.dot(q_vec, fact_vec) / denominator) + 1.0) / 2.0
|
|
298
|
-
scored.append((fact.fact_id, score))
|
|
299
|
-
return sorted(scored, key=lambda item: (-item[1], item[0]))[:self._config.top_m]
|
|
300
|
-
|
|
301
|
-
def _propagate(
|
|
302
|
-
self,
|
|
303
|
-
seeds: list[tuple[str, float]],
|
|
304
|
-
profile_id: str,
|
|
305
|
-
*,
|
|
306
|
-
include_global: bool = False,
|
|
307
|
-
include_shared: bool = False,
|
|
308
|
-
) -> dict[str, float]:
|
|
309
|
-
"""Execute the 5-step SYNAPSE algorithm.
|
|
310
|
-
|
|
311
|
-
Step 1: a_i^(0) = alpha * sim(h_i, h_q) for seeds, 0 otherwise
|
|
312
|
-
Step 2: u_i^(t+1) = delta * a_i^(t) + S * SUM(w_ji/deg(j) * a_j^(t))
|
|
313
|
-
Step 3: Lateral inhibition -- keep top-M=7 only
|
|
314
|
-
Step 4: sigmoid(u - theta)
|
|
315
|
-
Step 5: Iterate T=3 times
|
|
316
|
-
"""
|
|
317
|
-
cfg = self._config
|
|
318
|
-
|
|
319
|
-
# Step 1: Initialization
|
|
320
|
-
activations: dict[str, float] = {}
|
|
321
|
-
for fact_id, similarity in seeds:
|
|
322
|
-
activations[fact_id] = cfg.alpha * similarity
|
|
323
|
-
|
|
324
|
-
# Cache neighbor lookups and out-degrees across iterations — same node
|
|
325
|
-
# often survives multiple rounds via self-retention (delta=0.5);
|
|
326
|
-
# caching here cuts ~80% of SQL queries vs per-iteration re-query.
|
|
327
|
-
degree_cache: dict[str, int] = {}
|
|
328
|
-
neighbor_cache: dict[str, list] = {}
|
|
329
|
-
|
|
330
|
-
# Steps 2-4, repeated T times
|
|
331
|
-
for _iteration in range(cfg.max_iterations):
|
|
332
|
-
new_activations: dict[str, float] = {}
|
|
333
|
-
|
|
334
|
-
for node_id, activation in activations.items():
|
|
335
|
-
if activation < 0.001:
|
|
336
|
-
continue
|
|
337
|
-
|
|
338
|
-
# Get neighbors from BOTH tables (Rule 13) — cached per node.
|
|
339
|
-
# v3.8.2 perf-fix: _get_unified_neighbors already filters edges by
|
|
340
|
-
# the scope predicate (graph_edges via _scope_where; association_edges
|
|
341
|
-
# by profile_id), so for the default personal scope the returned
|
|
342
|
-
# neighbors are inherently authorized. The per-node re-authorization
|
|
343
|
-
# (2 DB round-trips/node, ~30–60 per recall — the primary 3.8 latency
|
|
344
|
-
# regression) is only required when a cross-scope read can surface
|
|
345
|
-
# global/shared neighbors. filter_authorized_results() on the returned
|
|
346
|
-
# set remains the security net for every scope.
|
|
347
|
-
if node_id not in neighbor_cache:
|
|
348
|
-
raw_neighbors = self._get_unified_neighbors(
|
|
349
|
-
node_id,
|
|
350
|
-
profile_id,
|
|
351
|
-
include_global=include_global,
|
|
352
|
-
include_shared=include_shared,
|
|
353
|
-
)
|
|
354
|
-
if include_global or include_shared:
|
|
355
|
-
allowed_neighbors = authorized_fact_ids(
|
|
356
|
-
self._db,
|
|
357
|
-
(neighbor_id for neighbor_id, _weight in raw_neighbors),
|
|
358
|
-
profile_id,
|
|
359
|
-
include_global=include_global,
|
|
360
|
-
include_shared=include_shared,
|
|
361
|
-
)
|
|
362
|
-
neighbor_cache[node_id] = [
|
|
363
|
-
item for item in raw_neighbors
|
|
364
|
-
if item[0] in allowed_neighbors
|
|
365
|
-
]
|
|
366
|
-
else:
|
|
367
|
-
neighbor_cache[node_id] = raw_neighbors
|
|
368
|
-
neighbors = neighbor_cache[node_id]
|
|
369
|
-
|
|
370
|
-
# Out-degree for fan effect normalization
|
|
371
|
-
if node_id not in degree_cache:
|
|
372
|
-
degree_cache[node_id] = max(len(neighbors), 1)
|
|
373
|
-
out_degree = degree_cache[node_id]
|
|
374
|
-
|
|
375
|
-
# Step 2: Propagation with fan effect
|
|
376
|
-
for neighbor_id, edge_weight in neighbors:
|
|
377
|
-
spread = (
|
|
378
|
-
cfg.spreading_factor
|
|
379
|
-
* (edge_weight / out_degree)
|
|
380
|
-
* activation
|
|
381
|
-
)
|
|
382
|
-
new_activations[neighbor_id] = (
|
|
383
|
-
new_activations.get(neighbor_id, 0.0) + spread
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
# Add self-retention (delta * current activation)
|
|
387
|
-
for node_id, activation in activations.items():
|
|
388
|
-
new_activations[node_id] = (
|
|
389
|
-
new_activations.get(node_id, 0.0) + cfg.delta * activation
|
|
390
|
-
)
|
|
391
|
-
|
|
392
|
-
# Step 3: Lateral inhibition -- keep only top-M
|
|
393
|
-
sorted_nodes = sorted(
|
|
394
|
-
new_activations.items(), key=lambda x: (-x[1], x[0]),
|
|
395
|
-
)
|
|
396
|
-
top_m_nodes = sorted_nodes[: cfg.top_m]
|
|
397
|
-
|
|
398
|
-
# Step 4: Nonlinear activation (sigmoid with threshold shift)
|
|
399
|
-
activations = {}
|
|
400
|
-
for node_id, raw_activation in top_m_nodes:
|
|
401
|
-
gated = 1.0 / (1.0 + math.exp(-(raw_activation - cfg.theta)))
|
|
402
|
-
activations[node_id] = gated
|
|
403
|
-
|
|
404
|
-
return activations
|
|
405
|
-
|
|
406
|
-
def _get_unified_neighbors(
|
|
407
|
-
self,
|
|
408
|
-
node_id: str,
|
|
409
|
-
profile_id: str,
|
|
410
|
-
*,
|
|
411
|
-
include_global: bool = False,
|
|
412
|
-
include_shared: bool = False,
|
|
413
|
-
) -> list[tuple[str, float]]:
|
|
414
|
-
"""Get neighbors from BOTH graph_edges and association_edges.
|
|
415
|
-
|
|
416
|
-
Uses bidirectional UNION query (Section 4 of LLD).
|
|
417
|
-
|
|
418
|
-
V3.4.40 (2026-05-09): clamps fan-out to top
|
|
419
|
-
``max_neighbors_per_node`` by weight. Without this clamp, hub nodes
|
|
420
|
-
with thousands of neighbors caused 5.5s recalls. Bounded fan-out
|
|
421
|
-
matches SYNAPSE's original sparse-graph assumption while preserving
|
|
422
|
-
the highest-signal edges.
|
|
423
|
-
"""
|
|
424
|
-
try:
|
|
425
|
-
# v3.4.59: LIMIT pushed inside each UNION branch so SQLite can use
|
|
426
|
-
# idx_edges_source_weight / idx_edges_target_weight and stop after
|
|
427
|
-
# max_neighbors_per_node rows per branch instead of materializing
|
|
428
|
-
# all 2.1M edges then sorting. Each branch wrapped in SELECT * FROM (...)
|
|
429
|
-
# because SQLite requires parentheses for ORDER BY+LIMIT in compound SELECTs.
|
|
430
|
-
lim = self._config.max_neighbors_per_node
|
|
431
|
-
graph_where, graph_params = _scope_where(
|
|
432
|
-
profile_id,
|
|
433
|
-
include_global=include_global,
|
|
434
|
-
include_shared=include_shared,
|
|
435
|
-
prefix="ge",
|
|
436
|
-
)
|
|
437
|
-
# association_edges has no scope/shared_with columns in the current
|
|
438
|
-
# schema, so it remains owner-profile-only. Endpoint authorization
|
|
439
|
-
# below still prevents a private candidate from entering results.
|
|
440
|
-
assoc_where = "ae.profile_id = ?"
|
|
441
|
-
assoc_params = [profile_id]
|
|
442
|
-
rows = self._db.execute(
|
|
443
|
-
f"""
|
|
444
|
-
SELECT neighbor_id, weight FROM (
|
|
445
|
-
SELECT * FROM (
|
|
446
|
-
SELECT target_id AS neighbor_id, weight FROM graph_edges AS ge
|
|
447
|
-
WHERE source_id = ? AND {graph_where}
|
|
448
|
-
ORDER BY weight DESC, target_id ASC LIMIT ?
|
|
449
|
-
)
|
|
450
|
-
UNION ALL
|
|
451
|
-
SELECT * FROM (
|
|
452
|
-
SELECT target_fact_id AS neighbor_id, weight
|
|
453
|
-
FROM association_edges AS ae
|
|
454
|
-
WHERE source_fact_id = ? AND {assoc_where}
|
|
455
|
-
ORDER BY weight DESC, target_fact_id ASC LIMIT ?
|
|
456
|
-
)
|
|
457
|
-
UNION ALL
|
|
458
|
-
SELECT * FROM (
|
|
459
|
-
SELECT source_id AS neighbor_id, weight FROM graph_edges AS ge
|
|
460
|
-
WHERE target_id = ? AND {graph_where}
|
|
461
|
-
ORDER BY weight DESC, source_id ASC LIMIT ?
|
|
462
|
-
)
|
|
463
|
-
UNION ALL
|
|
464
|
-
SELECT * FROM (
|
|
465
|
-
SELECT source_fact_id AS neighbor_id, weight
|
|
466
|
-
FROM association_edges AS ae
|
|
467
|
-
WHERE target_fact_id = ? AND {assoc_where}
|
|
468
|
-
ORDER BY weight DESC, source_fact_id ASC LIMIT ?
|
|
469
|
-
)
|
|
470
|
-
)
|
|
471
|
-
ORDER BY weight DESC, neighbor_id ASC
|
|
472
|
-
LIMIT ?
|
|
473
|
-
""",
|
|
474
|
-
(
|
|
475
|
-
node_id, *graph_params, lim,
|
|
476
|
-
node_id, *assoc_params, lim,
|
|
477
|
-
node_id, *graph_params, lim,
|
|
478
|
-
node_id, *assoc_params, lim,
|
|
479
|
-
lim,
|
|
480
|
-
),
|
|
481
|
-
)
|
|
482
|
-
return [
|
|
483
|
-
(dict(r)["neighbor_id"], dict(r)["weight"]) for r in rows
|
|
484
|
-
]
|
|
485
|
-
except Exception as exc:
|
|
486
|
-
logger.debug(
|
|
487
|
-
"SpreadingActivation: UNION query failed for node %s "
|
|
488
|
-
"profile %s: %s",
|
|
489
|
-
node_id, profile_id, exc,
|
|
490
|
-
)
|
|
491
|
-
return []
|
|
492
|
-
|
|
493
|
-
def _fok_check(self, activations: dict[str, float]) -> bool:
|
|
494
|
-
"""Feeling-of-Knowing gate.
|
|
495
|
-
|
|
496
|
-
If max activation < tau_gate (0.12), reject results as noise.
|
|
497
|
-
"""
|
|
498
|
-
if not activations:
|
|
499
|
-
return False
|
|
500
|
-
return max(activations.values()) >= self._config.tau_gate
|
|
501
|
-
|
|
502
|
-
def _compute_query_hash(
|
|
503
|
-
self,
|
|
504
|
-
query: Any,
|
|
505
|
-
profile_id: str,
|
|
506
|
-
*,
|
|
507
|
-
include_global: bool = False,
|
|
508
|
-
include_shared: bool = False,
|
|
509
|
-
) -> str:
|
|
510
|
-
"""Deterministic hash for cache key."""
|
|
511
|
-
scope_bytes = f"|g={int(include_global)}|s={int(include_shared)}".encode()
|
|
512
|
-
if isinstance(query, np.ndarray):
|
|
513
|
-
data = query.tobytes() + profile_id.encode() + scope_bytes
|
|
514
|
-
elif isinstance(query, list):
|
|
515
|
-
data = (
|
|
516
|
-
np.array(query, dtype=np.float32).tobytes()
|
|
517
|
-
+ profile_id.encode()
|
|
518
|
-
+ scope_bytes
|
|
519
|
-
)
|
|
520
|
-
else:
|
|
521
|
-
data = str(query).encode() + profile_id.encode() + scope_bytes
|
|
522
|
-
return hashlib.sha256(data).hexdigest()[:16]
|
|
523
|
-
|
|
524
|
-
def _get_cached_results(
|
|
525
|
-
self, query_hash: str, profile_id: str,
|
|
526
|
-
) -> list[tuple[str, float]] | None:
|
|
527
|
-
"""Check activation_cache for recent results."""
|
|
528
|
-
try:
|
|
529
|
-
rows = self._db.execute(
|
|
530
|
-
"SELECT node_id, activation_value FROM activation_cache "
|
|
531
|
-
"WHERE profile_id = ? AND query_hash = ? "
|
|
532
|
-
"AND expires_at > datetime('now') "
|
|
533
|
-
"ORDER BY activation_value DESC",
|
|
534
|
-
(profile_id, query_hash),
|
|
535
|
-
)
|
|
536
|
-
if not rows:
|
|
537
|
-
return None
|
|
538
|
-
return [
|
|
539
|
-
(dict(r)["node_id"], dict(r)["activation_value"])
|
|
540
|
-
for r in rows
|
|
541
|
-
]
|
|
542
|
-
except Exception:
|
|
543
|
-
return None
|
|
544
|
-
|
|
545
|
-
def _cache_results(
|
|
546
|
-
self,
|
|
547
|
-
query_hash: str,
|
|
548
|
-
profile_id: str,
|
|
549
|
-
activations: dict[str, float],
|
|
550
|
-
) -> None:
|
|
551
|
-
"""Store results in activation_cache with 1-hour TTL."""
|
|
552
|
-
try:
|
|
553
|
-
# One transaction => ONE write-lock acquisition for the whole
|
|
554
|
-
# activation cache, instead of N separately-locked writes.
|
|
555
|
-
with self._db.transaction():
|
|
556
|
-
for node_id, value in activations.items():
|
|
557
|
-
self._db.execute(
|
|
558
|
-
"INSERT OR REPLACE INTO activation_cache "
|
|
559
|
-
"(cache_id, profile_id, query_hash, node_id, "
|
|
560
|
-
" activation_value, iteration, created_at, expires_at) "
|
|
561
|
-
"VALUES (?, ?, ?, ?, ?, ?, datetime('now'), "
|
|
562
|
-
"datetime('now', '+1 hour'))",
|
|
563
|
-
(_new_id(), profile_id, query_hash, node_id, value,
|
|
564
|
-
self._config.max_iterations),
|
|
565
|
-
)
|
|
566
|
-
except Exception as exc:
|
|
567
|
-
logger.debug("Cache write failed: %s", exc)
|
|
568
|
-
|
|
569
|
-
def cleanup_expired_cache(self) -> int:
|
|
570
|
-
"""Delete expired cache entries. Called by maintenance."""
|
|
571
|
-
try:
|
|
572
|
-
result = self._db.execute(
|
|
573
|
-
"DELETE FROM activation_cache "
|
|
574
|
-
"WHERE expires_at < datetime('now')",
|
|
575
|
-
(),
|
|
576
|
-
)
|
|
577
|
-
return len(result) if result else 0
|
|
578
|
-
except Exception:
|
|
579
|
-
return 0
|
|
580
|
-
|
|
581
|
-
# ── v3.4.1: Graph Intelligence Helpers ────────────────────────
|
|
582
|
-
|
|
583
|
-
def _load_graph_metrics_cache(self, profile_id: str) -> None:
|
|
584
|
-
"""Load PageRank + community data in a single SQL query.
|
|
585
|
-
|
|
586
|
-
Called lazily on first _get_pagerank() or _get_community() call.
|
|
587
|
-
Populates both _pr_cache and _comm_cache.
|
|
588
|
-
"""
|
|
589
|
-
if self._pr_profile == profile_id and self._pr_cache:
|
|
590
|
-
return # Already loaded for this profile
|
|
591
|
-
self._pr_cache = {}
|
|
592
|
-
self._pr_profile = profile_id
|
|
593
|
-
self._comm_cache = {}
|
|
594
|
-
self._comm_profile = profile_id
|
|
595
|
-
try:
|
|
596
|
-
rows = self._db.execute(
|
|
597
|
-
"SELECT fact_id, pagerank_score, community_id "
|
|
598
|
-
"FROM fact_importance WHERE profile_id = ?",
|
|
599
|
-
(profile_id,),
|
|
600
|
-
)
|
|
601
|
-
for r in rows:
|
|
602
|
-
d = dict(r)
|
|
603
|
-
self._pr_cache[d["fact_id"]] = float(d.get("pagerank_score", 0) or 0)
|
|
604
|
-
self._comm_cache[d["fact_id"]] = d.get("community_id")
|
|
605
|
-
except Exception:
|
|
606
|
-
pass
|
|
607
|
-
|
|
608
|
-
def _get_pagerank(self, fact_id: str, profile_id: str) -> float:
|
|
609
|
-
"""Look up PageRank score from fact_importance. Cached per profile."""
|
|
610
|
-
self._load_graph_metrics_cache(profile_id)
|
|
611
|
-
return self._pr_cache.get(fact_id, 0.0)
|
|
612
|
-
|
|
613
|
-
def _get_community(self, fact_id: str, profile_id: str) -> int | None:
|
|
614
|
-
"""Look up community_id from fact_importance. Shares unified cache."""
|
|
615
|
-
self._load_graph_metrics_cache(profile_id)
|
|
616
|
-
return self._comm_cache.get(fact_id)
|