superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,380 +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
|
-
"""The worker that carries queued facts into CozoDB and LanceDB.
|
|
6
|
-
|
|
7
|
-
One writer, one direction: SQLite is canonical, the projections are derived, and
|
|
8
|
-
this is the only thing that writes them during normal operation. Making it the
|
|
9
|
-
sole writer is what removes the class of bug this replaced — a projection write
|
|
10
|
-
attempted inline on the store path, on whichever thread happened to be storing,
|
|
11
|
-
with its failure swallowed into a debug log.
|
|
12
|
-
|
|
13
|
-
WHAT IT PROJECTS IS WHAT RECALL CAN RETURN
|
|
14
|
-
------------------------------------------
|
|
15
|
-
Not "lifecycle in (active, warm)", which is what the inline sync used. That
|
|
16
|
-
predicate was wrong twice over: it dropped ``cold``, which is a live tier that
|
|
17
|
-
recall answers from, and it never withdrew a fact that had since been archived,
|
|
18
|
-
leaving forgotten memories offered as candidates.
|
|
19
|
-
|
|
20
|
-
The filter is ``visible_fact_clause()`` — the same predicate every read path
|
|
21
|
-
uses to decide whether a row may be shown as a memory at all. Deriving the
|
|
22
|
-
projection from that clause means the two cannot drift.
|
|
23
|
-
|
|
24
|
-
BUT VISIBILITY GOVERNS CANDIDACY, NOT ADJACENCY
|
|
25
|
-
-----------------------------------------------
|
|
26
|
-
The SQLite channel does not treat those as one thing, and neither may this. Its
|
|
27
|
-
entity map filters on visibility — a withheld row must never enter it, because
|
|
28
|
-
it carries its whole cluster's pooled entity list and out-ranks real memories.
|
|
29
|
-
Its edge walk filters on scope alone, with no visibility predicate, so it
|
|
30
|
-
traverses edges into withheld and archived facts and lets hydration drop them at
|
|
31
|
-
the end.
|
|
32
|
-
|
|
33
|
-
So a hidden fact loses its entity bridge and its vector and KEEPS its edges. An
|
|
34
|
-
earlier version of this module deleted the edges too, and on a real store that
|
|
35
|
-
left 32 visible facts with a smaller adjacency here than in SQLite — every
|
|
36
|
-
missing endpoint quarantined. A graph that answers differently from the walk it
|
|
37
|
-
replaces is not a projection of it.
|
|
38
|
-
|
|
39
|
-
FAILURE IS LOUD
|
|
40
|
-
---------------
|
|
41
|
-
A projection write that raises leaves its row queued with the attempt counted
|
|
42
|
-
and the error recorded. Nothing is dropped, and the queue depth is a health
|
|
43
|
-
metric, so a projection that has stopped keeping up is visible instead of
|
|
44
|
-
silent. That is the entire point of the mechanism and it is why nothing in this
|
|
45
|
-
module catches an exception and continues as though it had not happened.
|
|
46
|
-
|
|
47
|
-
AFTER A BULK IMPORT, THE QUEUE IS NOT CLEARED — IT IS DRAINED
|
|
48
|
-
-------------------------------------------------------------
|
|
49
|
-
A promotion builds the whole projection from SQLite in one pass, which satisfies
|
|
50
|
-
every row queued before it started. Deleting those rows on that basis would need
|
|
51
|
-
a watermark: a timestamp taken before the import read its snapshot, with
|
|
52
|
-
everything older discarded. That is one off-by-one away from throwing out a
|
|
53
|
-
projection nobody will ever write again, in the exact mechanism whose only job
|
|
54
|
-
is to make that impossible.
|
|
55
|
-
|
|
56
|
-
So nothing is discarded. The worker re-projects the backlog, which is idempotent
|
|
57
|
-
and lands on the same graph. It costs the import's work once more, in the
|
|
58
|
-
background, off the hot path — a price worth paying for a rule with no edge case
|
|
59
|
-
in it. Queue depth right after a promotion is therefore high and falling, which
|
|
60
|
-
is the truth; ``stalled`` is the number that indicates trouble.
|
|
61
|
-
|
|
62
|
-
A ROW THAT KEEPS FAILING MUST NOT BLOCK THE ONES BEHIND IT
|
|
63
|
-
----------------------------------------------------------
|
|
64
|
-
The queue is claimed in ``attempts, revision`` order, so a fact whose
|
|
65
|
-
projection is genuinely impossible — a malformed embedding, an id Cozo refuses
|
|
66
|
-
— sinks to the back after its first failure and healthy work continues past it.
|
|
67
|
-
Ordering by revision alone would let one poisoned row starve every fact behind
|
|
68
|
-
it, which is the failure mode that makes queues look like outages.
|
|
69
|
-
"""
|
|
70
|
-
|
|
71
|
-
from __future__ import annotations
|
|
72
|
-
|
|
73
|
-
import logging
|
|
74
|
-
import threading
|
|
75
|
-
from dataclasses import dataclass, field
|
|
76
|
-
from typing import Any, Callable
|
|
77
|
-
|
|
78
|
-
from superlocalmemory.storage import projection_outbox
|
|
79
|
-
|
|
80
|
-
logger = logging.getLogger(__name__)
|
|
81
|
-
|
|
82
|
-
#: Rows per pass. Large enough that a backlog clears in few passes, small enough
|
|
83
|
-
#: that a pass cannot hold the drain thread past a shutdown request for long.
|
|
84
|
-
DEFAULT_BATCH = 200
|
|
85
|
-
|
|
86
|
-
#: How long the worker waits before looking again when nothing woke it. A store
|
|
87
|
-
#: signals the worker directly, so this is only the safety net for an enqueue
|
|
88
|
-
#: that arrived from another process — a CLI write, or a second daemon.
|
|
89
|
-
IDLE_INTERVAL_SECONDS = 2.0
|
|
90
|
-
|
|
91
|
-
#: Attempts after which a row is reported at warning level rather than debug.
|
|
92
|
-
#: It keeps being retried; the change is that it stops being quiet about it.
|
|
93
|
-
LOUD_AFTER_ATTEMPTS = 3
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@dataclass
|
|
97
|
-
class DrainResult:
|
|
98
|
-
"""What one pass did. Every field is a number an operator can act on."""
|
|
99
|
-
|
|
100
|
-
projected: int = 0
|
|
101
|
-
removed: int = 0
|
|
102
|
-
failed: int = 0
|
|
103
|
-
skipped: int = 0
|
|
104
|
-
superseded: int = 0
|
|
105
|
-
errors: list[str] = field(default_factory=list)
|
|
106
|
-
|
|
107
|
-
@property
|
|
108
|
-
def handled(self) -> int:
|
|
109
|
-
return self.projected + self.removed + self.skipped + self.superseded
|
|
110
|
-
|
|
111
|
-
def as_dict(self) -> dict[str, Any]:
|
|
112
|
-
return {
|
|
113
|
-
"projected": self.projected,
|
|
114
|
-
"removed": self.removed,
|
|
115
|
-
"failed": self.failed,
|
|
116
|
-
"skipped": self.skipped,
|
|
117
|
-
"superseded": self.superseded,
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
class ProjectionDrain:
|
|
122
|
-
"""Applies queued facts to the graph and vector projections.
|
|
123
|
-
|
|
124
|
-
Takes accessors rather than backends so it always sees the current ones: a
|
|
125
|
-
promotion or a rollback swaps them underneath a long-lived worker, and a
|
|
126
|
-
reference captured at construction would keep writing into the store that
|
|
127
|
-
was just replaced.
|
|
128
|
-
"""
|
|
129
|
-
|
|
130
|
-
def __init__(
|
|
131
|
-
self,
|
|
132
|
-
db: Any,
|
|
133
|
-
graph_backend: Callable[[], Any],
|
|
134
|
-
vector_backend: Callable[[], Any],
|
|
135
|
-
) -> None:
|
|
136
|
-
self._db = db
|
|
137
|
-
self._graph = graph_backend
|
|
138
|
-
self._vector = vector_backend
|
|
139
|
-
self._wake = threading.Event()
|
|
140
|
-
self._stop = threading.Event()
|
|
141
|
-
self._thread: threading.Thread | None = None
|
|
142
|
-
self._pass_lock = threading.Lock()
|
|
143
|
-
|
|
144
|
-
# ------------------------------------------------------------------
|
|
145
|
-
# Lifecycle
|
|
146
|
-
# ------------------------------------------------------------------
|
|
147
|
-
|
|
148
|
-
def start(self) -> bool:
|
|
149
|
-
"""Begin draining in the background. Idempotent."""
|
|
150
|
-
if self._thread is not None and self._thread.is_alive():
|
|
151
|
-
return False
|
|
152
|
-
self._stop.clear()
|
|
153
|
-
self._thread = threading.Thread(
|
|
154
|
-
target=self._run, name="slm-projection-drain", daemon=True,
|
|
155
|
-
)
|
|
156
|
-
self._thread.start()
|
|
157
|
-
logger.info("projection drain started")
|
|
158
|
-
return True
|
|
159
|
-
|
|
160
|
-
def stop(self, timeout: float = 5.0) -> None:
|
|
161
|
-
"""Ask the worker to finish its pass and exit."""
|
|
162
|
-
self._stop.set()
|
|
163
|
-
self._wake.set()
|
|
164
|
-
thread = self._thread
|
|
165
|
-
if thread is not None and thread.is_alive():
|
|
166
|
-
thread.join(timeout=timeout)
|
|
167
|
-
self._thread = None
|
|
168
|
-
|
|
169
|
-
@property
|
|
170
|
-
def running(self) -> bool:
|
|
171
|
-
return self._thread is not None and self._thread.is_alive()
|
|
172
|
-
|
|
173
|
-
def notify(self) -> None:
|
|
174
|
-
"""Tell the worker there is something to do.
|
|
175
|
-
|
|
176
|
-
Called after a store commits. Cheap enough to call on every write, and
|
|
177
|
-
it is what keeps the gap between "remembered" and "in the graph" at
|
|
178
|
-
milliseconds instead of the idle interval.
|
|
179
|
-
"""
|
|
180
|
-
self._wake.set()
|
|
181
|
-
|
|
182
|
-
def _run(self) -> None:
|
|
183
|
-
while not self._stop.is_set():
|
|
184
|
-
self._wake.wait(timeout=IDLE_INTERVAL_SECONDS)
|
|
185
|
-
self._wake.clear()
|
|
186
|
-
if self._stop.is_set():
|
|
187
|
-
break
|
|
188
|
-
try:
|
|
189
|
-
# Keep going while a pass is filling its batch: a backlog
|
|
190
|
-
# should drain continuously rather than one batch per tick.
|
|
191
|
-
while not self._stop.is_set():
|
|
192
|
-
result = self.drain_once()
|
|
193
|
-
if result.handled + result.failed < DEFAULT_BATCH:
|
|
194
|
-
break
|
|
195
|
-
except Exception as exc: # pragma: no cover - worker must not die
|
|
196
|
-
# A worker that exits on an unexpected error would leave the
|
|
197
|
-
# queue growing with nothing draining it and no thread left to
|
|
198
|
-
# report why. Log it and stay alive; the rows are still queued.
|
|
199
|
-
logger.error("projection drain pass failed: %s", exc, exc_info=True)
|
|
200
|
-
logger.info("projection drain stopped")
|
|
201
|
-
|
|
202
|
-
# ------------------------------------------------------------------
|
|
203
|
-
# One pass
|
|
204
|
-
# ------------------------------------------------------------------
|
|
205
|
-
|
|
206
|
-
def drain_once(self, limit: int = DEFAULT_BATCH) -> DrainResult:
|
|
207
|
-
"""Apply up to ``limit`` queued facts. Safe to call directly.
|
|
208
|
-
|
|
209
|
-
Returns without touching a row when no projection is open. The rows are
|
|
210
|
-
the pending work for whenever one is, and discarding them would be
|
|
211
|
-
throwing away the only record of which facts still need projecting.
|
|
212
|
-
"""
|
|
213
|
-
result = DrainResult()
|
|
214
|
-
graph, vector = self._graph(), self._vector()
|
|
215
|
-
if graph is None and vector is None:
|
|
216
|
-
return result
|
|
217
|
-
|
|
218
|
-
with self._pass_lock:
|
|
219
|
-
for row in projection_outbox.claim_batch(self._db, limit=limit):
|
|
220
|
-
self._apply_row(row, graph, vector, result)
|
|
221
|
-
return result
|
|
222
|
-
|
|
223
|
-
def _apply_row(
|
|
224
|
-
self, row: dict[str, Any], graph: Any, vector: Any, result: DrainResult,
|
|
225
|
-
) -> None:
|
|
226
|
-
fact_id = row["fact_id"]
|
|
227
|
-
revision = row["revision"]
|
|
228
|
-
try:
|
|
229
|
-
if row["op"] == projection_outbox.OP_DELETE:
|
|
230
|
-
self._remove(fact_id, graph, vector)
|
|
231
|
-
outcome = "removed"
|
|
232
|
-
else:
|
|
233
|
-
outcome = self._project(fact_id, graph, vector)
|
|
234
|
-
except Exception as exc:
|
|
235
|
-
attempts = projection_outbox.record_failure(self._db, fact_id, str(exc))
|
|
236
|
-
result.failed += 1
|
|
237
|
-
result.errors.append(f"{fact_id[:12]}: {exc}")
|
|
238
|
-
log = logger.warning if attempts >= LOUD_AFTER_ATTEMPTS else logger.debug
|
|
239
|
-
log(
|
|
240
|
-
"projection failed for %s after %d attempt(s): %s",
|
|
241
|
-
fact_id[:12], attempts, exc,
|
|
242
|
-
)
|
|
243
|
-
return
|
|
244
|
-
|
|
245
|
-
if projection_outbox.resolve(self._db, fact_id, revision):
|
|
246
|
-
setattr(result, outcome, getattr(result, outcome) + 1)
|
|
247
|
-
else:
|
|
248
|
-
# The fact was written again while this projection was in flight,
|
|
249
|
-
# so a newer intent is queued. Counting it as done would report
|
|
250
|
-
# work that still has to happen.
|
|
251
|
-
result.superseded += 1
|
|
252
|
-
|
|
253
|
-
# ------------------------------------------------------------------
|
|
254
|
-
# The projections themselves
|
|
255
|
-
# ------------------------------------------------------------------
|
|
256
|
-
|
|
257
|
-
def _project(self, fact_id: str, graph: Any, vector: Any) -> str:
|
|
258
|
-
"""Bring one fact's projection up to date. Returns the outcome name."""
|
|
259
|
-
state = self._visibility(fact_id)
|
|
260
|
-
if state == "absent":
|
|
261
|
-
# An entity id, or a fact hard-deleted since it was queued. There
|
|
262
|
-
# is nothing to project and nothing to remove.
|
|
263
|
-
return "skipped"
|
|
264
|
-
if state == "hidden":
|
|
265
|
-
# Archived or withheld. It must stop being offered as a candidate —
|
|
266
|
-
# but its EDGES stay. The SQLite entity map filters on visibility
|
|
267
|
-
# and its edge walk does not, so deleting a hidden fact's edges
|
|
268
|
-
# would leave every visible fact that neighboured it with a smaller
|
|
269
|
-
# adjacency here than in SQLite, and the two graphs would answer
|
|
270
|
-
# differently. Measured on a real store before this was split: 32
|
|
271
|
-
# visible facts had lost edges, every missing endpoint quarantined.
|
|
272
|
-
self._remove(fact_id, graph, vector)
|
|
273
|
-
return "removed"
|
|
274
|
-
|
|
275
|
-
fact = self._db.get_fact(fact_id)
|
|
276
|
-
if fact is None:
|
|
277
|
-
return "skipped"
|
|
278
|
-
if graph is not None:
|
|
279
|
-
self._project_graph(fact, graph)
|
|
280
|
-
if vector is not None:
|
|
281
|
-
self._project_vector(fact, vector)
|
|
282
|
-
return "projected"
|
|
283
|
-
|
|
284
|
-
def _visibility(self, fact_id: str) -> str:
|
|
285
|
-
"""``visible``, ``hidden`` or ``absent`` for one id."""
|
|
286
|
-
rows = self._db.execute(
|
|
287
|
-
"SELECT 1 FROM atomic_facts WHERE fact_id = ?", (fact_id,),
|
|
288
|
-
)
|
|
289
|
-
if not rows:
|
|
290
|
-
return "absent"
|
|
291
|
-
visible = self._db.execute(
|
|
292
|
-
"SELECT 1 FROM atomic_facts WHERE fact_id = ?"
|
|
293
|
-
+ self._db.visible_fact_clause(),
|
|
294
|
-
(fact_id,),
|
|
295
|
-
)
|
|
296
|
-
return "visible" if visible else "hidden"
|
|
297
|
-
|
|
298
|
-
def _project_graph(self, fact: Any, graph: Any) -> None:
|
|
299
|
-
"""Replace this fact's node, entity bridge and edges in the graph.
|
|
300
|
-
|
|
301
|
-
``remove_fact`` first, so a re-projection cannot leave an entity link
|
|
302
|
-
or an edge that SQLite no longer has. Replace-then-write is what makes
|
|
303
|
-
a replay idempotent.
|
|
304
|
-
"""
|
|
305
|
-
profile_id = getattr(fact, "profile_id", "default") or "default"
|
|
306
|
-
graph.remove_fact(fact.fact_id)
|
|
307
|
-
entities = list(getattr(fact, "canonical_entities", []) or [])
|
|
308
|
-
for entity_id in entities:
|
|
309
|
-
rows = self._db.execute(
|
|
310
|
-
"SELECT canonical_name, entity_type, fact_count FROM canonical_entities "
|
|
311
|
-
"WHERE entity_id = ? AND profile_id = ?",
|
|
312
|
-
(entity_id, profile_id),
|
|
313
|
-
)
|
|
314
|
-
if not rows:
|
|
315
|
-
continue
|
|
316
|
-
entity = dict(rows[0])
|
|
317
|
-
graph.add_entity(
|
|
318
|
-
entity_id,
|
|
319
|
-
entity.get("canonical_name") or entity_id,
|
|
320
|
-
entity.get("entity_type") or "concept",
|
|
321
|
-
{"fact_count": int(entity.get("fact_count") or 0)},
|
|
322
|
-
profile_id,
|
|
323
|
-
)
|
|
324
|
-
graph.add_fact_entities(fact.fact_id, entities, profile_id)
|
|
325
|
-
for row in self._db.execute(
|
|
326
|
-
"SELECT source_id, target_id, edge_type, weight FROM graph_edges "
|
|
327
|
-
"WHERE profile_id = ? AND (source_id = ? OR target_id = ?)",
|
|
328
|
-
(profile_id, fact.fact_id, fact.fact_id),
|
|
329
|
-
):
|
|
330
|
-
edge = dict(row)
|
|
331
|
-
graph.add_edge(
|
|
332
|
-
edge["source_id"], edge["target_id"],
|
|
333
|
-
edge.get("edge_type") or "related",
|
|
334
|
-
float(edge.get("weight") or 1.0), profile_id=profile_id,
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
def _project_vector(self, fact: Any, vector: Any) -> None:
|
|
338
|
-
"""Write this fact's embedding to the vector store.
|
|
339
|
-
|
|
340
|
-
A fact with no embedding yet is not an error: ingestion is
|
|
341
|
-
queryable-first, so the vector arrives with enrichment and the update
|
|
342
|
-
that writes it queues the fact again.
|
|
343
|
-
"""
|
|
344
|
-
embedding = getattr(fact, "embedding", None)
|
|
345
|
-
if not embedding:
|
|
346
|
-
return
|
|
347
|
-
lifecycle = getattr(fact, "lifecycle", None)
|
|
348
|
-
tier = getattr(lifecycle, "value", lifecycle) or "active"
|
|
349
|
-
vector.add_vectors(
|
|
350
|
-
[fact.fact_id], [embedding], [tier],
|
|
351
|
-
getattr(fact, "profile_id", "default") or "default",
|
|
352
|
-
)
|
|
353
|
-
|
|
354
|
-
def _remove(self, fact_id: str, graph: Any, vector: Any) -> None:
|
|
355
|
-
"""Take one fact out of both projections entirely, edges included.
|
|
356
|
-
|
|
357
|
-
For a fact that is genuinely gone. Its edges go too, because a hard
|
|
358
|
-
delete cascades them out of SQLite as well, so keeping them here would
|
|
359
|
-
be the projection holding an adjacency the store no longer has.
|
|
360
|
-
"""
|
|
361
|
-
if graph is not None:
|
|
362
|
-
graph.remove_fact(fact_id)
|
|
363
|
-
if vector is not None:
|
|
364
|
-
vector.remove_vector(fact_id)
|
|
365
|
-
|
|
366
|
-
def _withdraw_candidacy(self, fact_id: str, graph: Any, vector: Any) -> None:
|
|
367
|
-
"""Stop offering a fact, without changing the graph's shape.
|
|
368
|
-
|
|
369
|
-
For a fact that still exists but may no longer be returned. It leaves
|
|
370
|
-
the entity bridge and the vector — the two things that put a fact into a
|
|
371
|
-
result set — and leaves its edges alone, because those are still in
|
|
372
|
-
``graph_edges`` and the walk this projection replaces still follows them.
|
|
373
|
-
"""
|
|
374
|
-
if graph is not None:
|
|
375
|
-
withdraw = getattr(graph, "remove_fact_candidacy", None)
|
|
376
|
-
# A backend without the narrower call is better served by the full
|
|
377
|
-
# removal than by silently leaving a withheld fact recallable.
|
|
378
|
-
(withdraw or graph.remove_fact)(fact_id)
|
|
379
|
-
if vector is not None:
|
|
380
|
-
vector.remove_vector(fact_id)
|
|
@@ -1,168 +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
|
-
"""Queue consumer — background loop that drains recall_queue.db.
|
|
6
|
-
|
|
7
|
-
Polls the recall queue for pending jobs, claims them atomically,
|
|
8
|
-
routes through pool.recall() (NEVER engine directly), and writes
|
|
9
|
-
results back. Runs as a daemon thread inside the SLM daemon process.
|
|
10
|
-
|
|
11
|
-
MEMORY SAFETY: This module must NEVER import MemoryEngine. All recall
|
|
12
|
-
goes through WorkerPool which manages the recall_worker subprocess.
|
|
13
|
-
The engine lives only in that subprocess — not in this process.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from __future__ import annotations
|
|
17
|
-
|
|
18
|
-
import json
|
|
19
|
-
import logging
|
|
20
|
-
import threading
|
|
21
|
-
import time
|
|
22
|
-
from typing import Any, Protocol
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
_MAX_RECEIVES = 3
|
|
27
|
-
_HIGH_PRIORITY = "high"
|
|
28
|
-
_LOW_PRIORITY = "low"
|
|
29
|
-
|
|
30
|
-
_POLL_BACKOFF_START_S = 0.02
|
|
31
|
-
_POLL_BACKOFF_MAX_S = 1.0
|
|
32
|
-
_POLL_BACKOFF_FACTOR = 1.5
|
|
33
|
-
_CLEANUP_INTERVAL_ITERATIONS = 500
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class RecallPoolProtocol(Protocol):
|
|
37
|
-
def recall(self, query: str, limit: int = 10, session_id: str = "") -> dict: ...
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class QueueConsumer:
|
|
41
|
-
"""Drains recall_queue.db by routing jobs through WorkerPool.
|
|
42
|
-
|
|
43
|
-
Lifecycle: start() begins a daemon thread that polls the queue.
|
|
44
|
-
stop() signals the thread to exit and joins it.
|
|
45
|
-
|
|
46
|
-
The consumer claims one job at a time (sequential processing).
|
|
47
|
-
Concurrency comes from the queue dedup — 5 identical requests
|
|
48
|
-
become 1 execution, 5 results.
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
def __init__(
|
|
52
|
-
self,
|
|
53
|
-
queue: Any,
|
|
54
|
-
pool: RecallPoolProtocol,
|
|
55
|
-
max_receives: int = _MAX_RECEIVES,
|
|
56
|
-
) -> None:
|
|
57
|
-
self._queue = queue
|
|
58
|
-
self._pool = pool
|
|
59
|
-
self._max_receives = max_receives
|
|
60
|
-
self._running = False
|
|
61
|
-
self._stop_event = threading.Event()
|
|
62
|
-
self._thread: threading.Thread | None = None
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def running(self) -> bool:
|
|
66
|
-
return self._running
|
|
67
|
-
|
|
68
|
-
def start(self) -> None:
|
|
69
|
-
if self._running:
|
|
70
|
-
return
|
|
71
|
-
self._stop_event.clear()
|
|
72
|
-
self._running = True
|
|
73
|
-
self._thread = threading.Thread(
|
|
74
|
-
target=self._poll_loop,
|
|
75
|
-
daemon=True,
|
|
76
|
-
name="slm-queue-consumer",
|
|
77
|
-
)
|
|
78
|
-
self._thread.start()
|
|
79
|
-
logger.info("QueueConsumer started")
|
|
80
|
-
|
|
81
|
-
def stop(self) -> None:
|
|
82
|
-
if not self._running:
|
|
83
|
-
return
|
|
84
|
-
self._stop_event.set()
|
|
85
|
-
self._running = False
|
|
86
|
-
if self._thread is not None:
|
|
87
|
-
self._thread.join(timeout=5.0)
|
|
88
|
-
self._thread = None
|
|
89
|
-
logger.info("QueueConsumer stopped")
|
|
90
|
-
|
|
91
|
-
def _poll_loop(self) -> None:
|
|
92
|
-
backoff = _POLL_BACKOFF_START_S
|
|
93
|
-
iteration = 0
|
|
94
|
-
|
|
95
|
-
while not self._stop_event.is_set():
|
|
96
|
-
processed = self._try_claim_and_process(_HIGH_PRIORITY)
|
|
97
|
-
if not processed:
|
|
98
|
-
processed = self._try_claim_and_process(_LOW_PRIORITY)
|
|
99
|
-
|
|
100
|
-
if processed:
|
|
101
|
-
backoff = _POLL_BACKOFF_START_S
|
|
102
|
-
else:
|
|
103
|
-
self._stop_event.wait(timeout=backoff)
|
|
104
|
-
backoff = min(backoff * _POLL_BACKOFF_FACTOR, _POLL_BACKOFF_MAX_S)
|
|
105
|
-
|
|
106
|
-
iteration += 1
|
|
107
|
-
if iteration % _CLEANUP_INTERVAL_ITERATIONS == 0:
|
|
108
|
-
self._cleanup_completed()
|
|
109
|
-
|
|
110
|
-
def _try_claim_and_process(self, priority: str) -> bool:
|
|
111
|
-
try:
|
|
112
|
-
claimed = self._queue.claim_pending(
|
|
113
|
-
priority=priority,
|
|
114
|
-
stall_timeout_s=25.0,
|
|
115
|
-
)
|
|
116
|
-
except Exception as exc:
|
|
117
|
-
logger.warning("Queue claim failed: %s", exc)
|
|
118
|
-
return False
|
|
119
|
-
|
|
120
|
-
if claimed is None:
|
|
121
|
-
return False
|
|
122
|
-
|
|
123
|
-
request_id = claimed["request_id"]
|
|
124
|
-
received = claimed["received"]
|
|
125
|
-
query = claimed.get("query", "")
|
|
126
|
-
limit_n = claimed.get("limit_n", 10)
|
|
127
|
-
session_id = claimed.get("session_id", "")
|
|
128
|
-
|
|
129
|
-
if received >= self._max_receives:
|
|
130
|
-
try:
|
|
131
|
-
self._queue.mark_dead_letter(
|
|
132
|
-
request_id, reason="max_receives_exceeded",
|
|
133
|
-
)
|
|
134
|
-
except Exception as exc:
|
|
135
|
-
logger.warning("DLQ mark failed for %s: %s", request_id, exc)
|
|
136
|
-
return True
|
|
137
|
-
|
|
138
|
-
result_json = self._execute_recall(query, limit_n, session_id)
|
|
139
|
-
|
|
140
|
-
try:
|
|
141
|
-
n = self._queue.complete(
|
|
142
|
-
request_id, received=received, result_json=result_json,
|
|
143
|
-
)
|
|
144
|
-
if n == 0:
|
|
145
|
-
logger.info("Fenced out on complete: %s (received=%d)", request_id, received)
|
|
146
|
-
except Exception as exc:
|
|
147
|
-
logger.warning("Queue complete failed for %s: %s", request_id, exc)
|
|
148
|
-
|
|
149
|
-
return True
|
|
150
|
-
|
|
151
|
-
def _cleanup_completed(self) -> None:
|
|
152
|
-
try:
|
|
153
|
-
self._queue._conn.execute(
|
|
154
|
-
"DELETE FROM recall_requests "
|
|
155
|
-
"WHERE (completed = 1 OR cancelled = 1 OR dead_letter = 1) "
|
|
156
|
-
"AND created_at < ?",
|
|
157
|
-
(time.time() - 3600,),
|
|
158
|
-
)
|
|
159
|
-
except Exception as exc:
|
|
160
|
-
logger.debug("Queue cleanup failed: %s", exc)
|
|
161
|
-
|
|
162
|
-
def _execute_recall(self, query: str, limit: int, session_id: str) -> str:
|
|
163
|
-
try:
|
|
164
|
-
result = self._pool.recall(query, limit=limit, session_id=session_id)
|
|
165
|
-
return json.dumps(result, default=str)
|
|
166
|
-
except Exception as exc:
|
|
167
|
-
logger.warning("pool.recall failed: %s", exc)
|
|
168
|
-
return json.dumps({"ok": False, "error": "recall_failed"})
|