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,346 +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 queue that makes a cross-engine projection write impossible to lose.
|
|
6
|
-
|
|
7
|
-
The graph lives in CozoDB (RocksDB underneath) and the vectors in LanceDB. Both
|
|
8
|
-
are separate storage engines from SQLite, so no transaction can span them and
|
|
9
|
-
there is no two-phase commit to reach for. The obvious sequence — commit the
|
|
10
|
-
fact, then write the projection — has a window in the middle. A process killed
|
|
11
|
-
inside that window leaves a memory that exists in SQLite, is absent from the
|
|
12
|
-
graph, and is therefore unrecallable, with nothing anywhere recording that it
|
|
13
|
-
happened.
|
|
14
|
-
|
|
15
|
-
This module is the transactional-outbox side of the answer. A row naming the
|
|
16
|
-
fact is written **inside the same SQLite transaction as the fact itself**, so
|
|
17
|
-
the intent to project is exactly as durable as the fact. A worker later claims
|
|
18
|
-
the row, applies it to Cozo and Lance, and only then deletes it. Killed at any
|
|
19
|
-
point, the row is still there and the work is retried.
|
|
20
|
-
|
|
21
|
-
WHAT THE ROW CARRIES, AND WHY IT IS SO THIN
|
|
22
|
-
-------------------------------------------
|
|
23
|
-
Only a fact id, a profile, and an intent. Not the entities, not the edges, not
|
|
24
|
-
the embedding. The drain re-reads the fact's current state from SQLite at the
|
|
25
|
-
moment it projects.
|
|
26
|
-
|
|
27
|
-
That choice buys idempotency for free. Replaying a row can only ever write the
|
|
28
|
-
present truth, so a retry after a crash, a double delivery, and an intent that
|
|
29
|
-
was superseded three times while queued all converge on the same correct
|
|
30
|
-
projection. Serialising a snapshot into the row instead would mean replaying
|
|
31
|
-
stale state over fresh state — the classic outbox bug.
|
|
32
|
-
|
|
33
|
-
WHY THE PRIMARY KEY IS THE FACT ID
|
|
34
|
-
----------------------------------
|
|
35
|
-
It coalesces. Ten writes to one fact are one unit of work, because the drain
|
|
36
|
-
re-derives everything anyway. It also puts a hard ceiling on the table:
|
|
37
|
-
**at most one row per fact, so the queue can never exceed the store.** That is
|
|
38
|
-
what makes it safe to queue unconditionally on a machine where no projection
|
|
39
|
-
has been built yet — the backlog is bounded by the fact count and is precisely
|
|
40
|
-
the set of facts a future migration needs to project.
|
|
41
|
-
|
|
42
|
-
LATEST INTENT WINS
|
|
43
|
-
------------------
|
|
44
|
-
``op`` is replaced on conflict rather than appended, so a delete queued after an
|
|
45
|
-
upsert leaves one row saying ``delete``. A queue that kept both would depend on
|
|
46
|
-
draining them in order to avoid resurrecting a forgotten memory; this one cannot
|
|
47
|
-
get that wrong because there is only ever one intent to read.
|
|
48
|
-
|
|
49
|
-
``revision`` IS A CONCURRENCY TOKEN, NOT A COUNTER
|
|
50
|
-
--------------------------------------------------
|
|
51
|
-
The drain claims a row, spends time in Cozo, then clears it. A write landing in
|
|
52
|
-
that gap must not be discarded. So every enqueue bumps ``revision``, and the
|
|
53
|
-
clear is conditional on the revision the drain claimed. If it moved, the delete
|
|
54
|
-
matches nothing and the new intent stays queued. A timestamp would not do:
|
|
55
|
-
two enqueues inside one clock tick would be indistinguishable.
|
|
56
|
-
|
|
57
|
-
FAILURE POLICY
|
|
58
|
-
--------------
|
|
59
|
-
``enqueue`` is allowed to raise, and the caller's transaction then rolls back
|
|
60
|
-
the fact along with it. That is deliberate: this is a durability mechanism, and
|
|
61
|
-
a durability mechanism that silently degrades to best-effort is the defect it
|
|
62
|
-
exists to remove. The one expected absence — a store old enough not to have the
|
|
63
|
-
table — is answered by :func:`is_available` rather than by an exception, so an
|
|
64
|
-
un-migrated store keeps working and simply queues nothing.
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
from __future__ import annotations
|
|
68
|
-
|
|
69
|
-
import sqlite3
|
|
70
|
-
from datetime import datetime, timezone
|
|
71
|
-
from typing import Any
|
|
72
|
-
|
|
73
|
-
#: The table. Deliberately un-indexed beyond its primary key: the drain reads
|
|
74
|
-
#: it in (attempts, revision) order, and no secondary index serves that, while
|
|
75
|
-
#: every index costs another B-tree write on a path that runs on every store.
|
|
76
|
-
#: The table is bounded by the fact count and its steady-state depth is zero, so
|
|
77
|
-
#: a scan of it is a scan of nothing.
|
|
78
|
-
#:
|
|
79
|
-
#: Applied by ``schema.create_all_tables``, which the engine runs on every init
|
|
80
|
-
#: — so an upgraded store gains the queue on first open with no migration and no
|
|
81
|
-
#: manual step. There is deliberately NO migration for it: a migration can be
|
|
82
|
-
#: skipped, deferred or fail, and if this table is absent then facts silently
|
|
83
|
-
#: stop being projected. The invariant must not be contingent on a pass that can
|
|
84
|
-
#: not run.
|
|
85
|
-
DDL = """
|
|
86
|
-
CREATE TABLE IF NOT EXISTS projection_outbox (
|
|
87
|
-
fact_id TEXT PRIMARY KEY,
|
|
88
|
-
profile_id TEXT NOT NULL,
|
|
89
|
-
op TEXT NOT NULL DEFAULT 'upsert',
|
|
90
|
-
revision INTEGER NOT NULL DEFAULT 1,
|
|
91
|
-
enqueued_at TEXT NOT NULL,
|
|
92
|
-
attempts INTEGER NOT NULL DEFAULT 0,
|
|
93
|
-
last_error TEXT
|
|
94
|
-
);
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
TABLE = "projection_outbox"
|
|
98
|
-
|
|
99
|
-
#: The depth query, as a constant, because two surfaces need it against two
|
|
100
|
-
#: different kinds of connection and a second copy is how two surfaces come to
|
|
101
|
-
#: disagree about one number.
|
|
102
|
-
DEPTH_SQL = "SELECT COUNT(*) FROM projection_outbox"
|
|
103
|
-
|
|
104
|
-
OP_UPSERT = "upsert"
|
|
105
|
-
OP_DELETE = "delete"
|
|
106
|
-
|
|
107
|
-
#: The fact columns a projection is derived from. An update touching none of
|
|
108
|
-
#: these changes nothing Cozo or Lance holds, so it must not queue work.
|
|
109
|
-
#:
|
|
110
|
-
#: ``access_count`` is the one that matters here: recall bumps it on every hit,
|
|
111
|
-
#: so queueing on any update at all would put one row per returned memory per
|
|
112
|
-
#: recall onto the drain worker — a self-inflicted denial of service for a
|
|
113
|
-
#: column neither projection stores.
|
|
114
|
-
PROJECTED_FACT_COLUMNS = frozenset({
|
|
115
|
-
"embedding",
|
|
116
|
-
"lifecycle",
|
|
117
|
-
"canonical_entities_json",
|
|
118
|
-
"canonical_entities",
|
|
119
|
-
"profile_id",
|
|
120
|
-
"scope",
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
_AVAILABILITY_ATTR = "_projection_outbox_available"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def _now() -> str:
|
|
127
|
-
return datetime.now(timezone.utc).isoformat()
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
# ---------------------------------------------------------------------------
|
|
131
|
-
# Availability
|
|
132
|
-
# ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
def is_available(db: Any) -> bool:
|
|
135
|
-
"""Whether this store has an outbox to queue into.
|
|
136
|
-
|
|
137
|
-
Cached on the manager after the first look. The table is created at engine
|
|
138
|
-
init before any fact can be stored, so it cannot appear or vanish part-way
|
|
139
|
-
through a process in a way that matters; paying a ``sqlite_master`` lookup
|
|
140
|
-
on every single write to prove that again would be the more expensive
|
|
141
|
-
mistake.
|
|
142
|
-
"""
|
|
143
|
-
cached = getattr(db, _AVAILABILITY_ATTR, None)
|
|
144
|
-
if cached is not None:
|
|
145
|
-
return bool(cached)
|
|
146
|
-
try:
|
|
147
|
-
rows = db.execute(
|
|
148
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (TABLE,),
|
|
149
|
-
)
|
|
150
|
-
present = bool(rows)
|
|
151
|
-
except sqlite3.Error:
|
|
152
|
-
present = False
|
|
153
|
-
setattr(db, _AVAILABILITY_ATTR, present)
|
|
154
|
-
return present
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def forget_availability(db: Any) -> None:
|
|
158
|
-
"""Drop the cached answer, so the next call looks again.
|
|
159
|
-
|
|
160
|
-
For the migration that creates the table on a manager already in use, and
|
|
161
|
-
for tests that remove it to exercise the un-migrated path.
|
|
162
|
-
"""
|
|
163
|
-
if hasattr(db, _AVAILABILITY_ATTR):
|
|
164
|
-
delattr(db, _AVAILABILITY_ATTR)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
# ---------------------------------------------------------------------------
|
|
168
|
-
# Enqueue — runs inside the caller's transaction
|
|
169
|
-
# ---------------------------------------------------------------------------
|
|
170
|
-
|
|
171
|
-
def enqueue(db: Any, fact_id: str, profile_id: str, op: str = OP_UPSERT) -> None:
|
|
172
|
-
"""Queue one fact to be projected, in the caller's transaction.
|
|
173
|
-
|
|
174
|
-
Silent no-op when there is no table (see :func:`is_available`) or when the
|
|
175
|
-
fact id is empty — an empty id names nothing and would give the drain a row
|
|
176
|
-
it can never resolve.
|
|
177
|
-
"""
|
|
178
|
-
if not fact_id or not is_available(db):
|
|
179
|
-
return
|
|
180
|
-
db.execute(
|
|
181
|
-
"""INSERT INTO projection_outbox
|
|
182
|
-
(fact_id, profile_id, op, revision, enqueued_at, attempts, last_error)
|
|
183
|
-
VALUES (?, ?, ?, 1, ?, 0, NULL)
|
|
184
|
-
ON CONFLICT(fact_id) DO UPDATE SET
|
|
185
|
-
op = excluded.op,
|
|
186
|
-
profile_id = excluded.profile_id,
|
|
187
|
-
revision = projection_outbox.revision + 1,
|
|
188
|
-
enqueued_at = excluded.enqueued_at,
|
|
189
|
-
attempts = 0,
|
|
190
|
-
last_error = NULL""",
|
|
191
|
-
(fact_id, profile_id or "default", op, _now()),
|
|
192
|
-
)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
def enqueue_many(
|
|
196
|
-
db: Any, fact_ids: object, profile_id: str, op: str = OP_UPSERT,
|
|
197
|
-
) -> None:
|
|
198
|
-
"""Queue several facts. Duplicates in the input collapse to one row each."""
|
|
199
|
-
if not is_available(db):
|
|
200
|
-
return
|
|
201
|
-
for fact_id in dict.fromkeys(fact_ids):
|
|
202
|
-
enqueue(db, fact_id, profile_id, op)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
def resolve_profile(db: Any, fact_id: str) -> str | None:
|
|
206
|
-
"""Which tenant a fact belongs to, for a caller that was not told.
|
|
207
|
-
|
|
208
|
-
The drain never reads ``profile_id`` off the row — it re-reads the fact. The
|
|
209
|
-
column exists for one reason: erasure finds a tenant's tables by looking for
|
|
210
|
-
a ``profile_id`` column, so a row carrying the wrong tenant is a fact id
|
|
211
|
-
that survives that tenant's erasure. Anyone tempted to drop the column as
|
|
212
|
-
unused should read that sentence twice.
|
|
213
|
-
|
|
214
|
-
Falls back to an existing row's tenant so a re-queue by a caller with less
|
|
215
|
-
information cannot overwrite a correct answer with a guess.
|
|
216
|
-
"""
|
|
217
|
-
for sql in (
|
|
218
|
-
"SELECT profile_id FROM atomic_facts WHERE fact_id = ?",
|
|
219
|
-
"SELECT profile_id FROM projection_outbox WHERE fact_id = ?",
|
|
220
|
-
):
|
|
221
|
-
try:
|
|
222
|
-
rows = db.execute(sql, (fact_id,))
|
|
223
|
-
except sqlite3.Error:
|
|
224
|
-
continue
|
|
225
|
-
if rows:
|
|
226
|
-
found = dict(rows[0]).get("profile_id")
|
|
227
|
-
if found:
|
|
228
|
-
return str(found)
|
|
229
|
-
return None
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def enqueue_for_fact(db: Any, fact_id: str, op: str = OP_UPSERT) -> None:
|
|
233
|
-
"""Queue a fact whose tenant the caller does not know."""
|
|
234
|
-
if not fact_id or not is_available(db):
|
|
235
|
-
return
|
|
236
|
-
enqueue(db, fact_id, resolve_profile(db, fact_id) or "default", op)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
# ---------------------------------------------------------------------------
|
|
240
|
-
# Drain
|
|
241
|
-
# ---------------------------------------------------------------------------
|
|
242
|
-
|
|
243
|
-
def claim_batch(db: Any, limit: int = 200) -> list[dict[str, Any]]:
|
|
244
|
-
"""The next rows to project, oldest intent first.
|
|
245
|
-
|
|
246
|
-
Claiming does not mark or lock anything. The row stays visible and stays
|
|
247
|
-
queued until :func:`resolve` clears it, so a worker that dies mid-batch
|
|
248
|
-
costs a repeat of work that is idempotent by construction — which is
|
|
249
|
-
cheaper and far easier to reason about than a lease that can expire while
|
|
250
|
-
its holder is still alive.
|
|
251
|
-
"""
|
|
252
|
-
if not is_available(db):
|
|
253
|
-
return []
|
|
254
|
-
rows = db.execute(
|
|
255
|
-
"SELECT fact_id, profile_id, op, revision, attempts, enqueued_at "
|
|
256
|
-
"FROM projection_outbox ORDER BY attempts, revision LIMIT ?",
|
|
257
|
-
(int(limit),),
|
|
258
|
-
)
|
|
259
|
-
return [dict(r) for r in rows]
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
def resolve(db: Any, fact_id: str, revision: int) -> bool:
|
|
263
|
-
"""Clear a row the projections have accepted. Returns whether it cleared.
|
|
264
|
-
|
|
265
|
-
``False`` means the fact was written again while this projection was in
|
|
266
|
-
flight, so a newer intent is queued and must not be discarded. The caller
|
|
267
|
-
does not need to do anything about it — the next drain picks it up.
|
|
268
|
-
"""
|
|
269
|
-
if not is_available(db):
|
|
270
|
-
return False
|
|
271
|
-
db.execute(
|
|
272
|
-
"DELETE FROM projection_outbox WHERE fact_id = ? AND revision = ?",
|
|
273
|
-
(fact_id, int(revision)),
|
|
274
|
-
)
|
|
275
|
-
remaining = db.execute(
|
|
276
|
-
"SELECT 1 FROM projection_outbox WHERE fact_id = ? AND revision = ?",
|
|
277
|
-
(fact_id, int(revision)),
|
|
278
|
-
)
|
|
279
|
-
return not remaining
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
def record_failure(db: Any, fact_id: str, error: str) -> int:
|
|
283
|
-
"""Count a failed attempt and keep the row. Returns the new attempt count.
|
|
284
|
-
|
|
285
|
-
The row surviving is the whole point: a projection that cannot be written
|
|
286
|
-
stays visible in :func:`depth` instead of disappearing into a debug log.
|
|
287
|
-
"""
|
|
288
|
-
if not is_available(db):
|
|
289
|
-
return 0
|
|
290
|
-
db.execute(
|
|
291
|
-
"UPDATE projection_outbox SET attempts = attempts + 1, last_error = ? "
|
|
292
|
-
"WHERE fact_id = ?",
|
|
293
|
-
(str(error)[:500], fact_id),
|
|
294
|
-
)
|
|
295
|
-
rows = db.execute(
|
|
296
|
-
"SELECT attempts FROM projection_outbox WHERE fact_id = ?", (fact_id,),
|
|
297
|
-
)
|
|
298
|
-
return int(dict(rows[0])["attempts"]) if rows else 0
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
# ---------------------------------------------------------------------------
|
|
302
|
-
# Health
|
|
303
|
-
# ---------------------------------------------------------------------------
|
|
304
|
-
|
|
305
|
-
def depth(db: Any) -> int:
|
|
306
|
-
"""How many facts are queued and not yet projected.
|
|
307
|
-
|
|
308
|
-
Zero is the healthy steady state. A number that does not fall is a
|
|
309
|
-
projection that has stopped keeping up, which is the failure this whole
|
|
310
|
-
mechanism exists to make visible rather than silent.
|
|
311
|
-
"""
|
|
312
|
-
if not is_available(db):
|
|
313
|
-
return 0
|
|
314
|
-
try:
|
|
315
|
-
rows = db.execute(f"{DEPTH_SQL} /* depth */")
|
|
316
|
-
except sqlite3.Error:
|
|
317
|
-
return 0
|
|
318
|
-
return int(tuple(rows[0])[0]) if rows else 0
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
def stalled_count(db: Any, min_attempts: int = 3) -> int:
|
|
322
|
-
"""Queued facts that have already failed to project ``min_attempts`` times.
|
|
323
|
-
|
|
324
|
-
Depth alone cannot tell a busy queue from a stuck one. This can: a row with
|
|
325
|
-
attempts on it has been tried and refused, so any non-zero answer here is a
|
|
326
|
-
defect with a fact id attached to it.
|
|
327
|
-
"""
|
|
328
|
-
if not is_available(db):
|
|
329
|
-
return 0
|
|
330
|
-
try:
|
|
331
|
-
rows = db.execute(
|
|
332
|
-
"SELECT COUNT(*) AS n FROM projection_outbox WHERE attempts >= ?",
|
|
333
|
-
(int(min_attempts),),
|
|
334
|
-
)
|
|
335
|
-
except sqlite3.Error:
|
|
336
|
-
return 0
|
|
337
|
-
return int(dict(rows[0])["n"]) if rows else 0
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
def health(db: Any) -> dict[str, Any]:
|
|
341
|
-
"""The outbox as a status surface reads it."""
|
|
342
|
-
return {
|
|
343
|
-
"available": is_available(db),
|
|
344
|
-
"depth": depth(db),
|
|
345
|
-
"stalled": stalled_count(db),
|
|
346
|
-
}
|
|
@@ -1,280 +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
|
-
"""Quantized embedding storage and retrieval.
|
|
6
|
-
|
|
7
|
-
Manages polar_embeddings and embedding_quantization_metadata tables.
|
|
8
|
-
Bridges PolarQuantEncoder/QJLEncoder to SQLite persistence.
|
|
9
|
-
|
|
10
|
-
HR-05: All SQL uses parameterized queries.
|
|
11
|
-
HR-06: BLOB columns use Python bytes, not base64.
|
|
12
|
-
HR-07: QJL is optional -- system works without it.
|
|
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 logging
|
|
21
|
-
from typing import TYPE_CHECKING
|
|
22
|
-
|
|
23
|
-
import numpy as np
|
|
24
|
-
from numpy.typing import NDArray
|
|
25
|
-
|
|
26
|
-
from superlocalmemory.core.config import QuantizationConfig
|
|
27
|
-
from superlocalmemory.math.polar_quant import PolarQuantEncoder, QuantizedEmbedding
|
|
28
|
-
from superlocalmemory.math.qjl import QJLEncoder
|
|
29
|
-
|
|
30
|
-
if TYPE_CHECKING:
|
|
31
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
32
|
-
|
|
33
|
-
logger = logging.getLogger(__name__)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
# ---------------------------------------------------------------------------
|
|
37
|
-
# Quantization level names
|
|
38
|
-
# ---------------------------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
_BW_TO_LEVEL: dict[int, str] = {
|
|
41
|
-
32: "float32",
|
|
42
|
-
8: "int8",
|
|
43
|
-
4: "polar4",
|
|
44
|
-
2: "polar2",
|
|
45
|
-
0: "deleted",
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class QuantizedEmbeddingStore:
|
|
50
|
-
"""CRUD for quantized polar embeddings with optional QJL correction.
|
|
51
|
-
|
|
52
|
-
Uses two tables:
|
|
53
|
-
- polar_embeddings: stores angle indices, radius, QJL bits
|
|
54
|
-
- embedding_quantization_metadata: tracks quantization state per fact
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
__slots__ = ("_db", "_polar", "_qjl", "_config")
|
|
58
|
-
|
|
59
|
-
def __init__(
|
|
60
|
-
self,
|
|
61
|
-
db: DatabaseManager,
|
|
62
|
-
polar: PolarQuantEncoder,
|
|
63
|
-
qjl: QJLEncoder | None,
|
|
64
|
-
config: QuantizationConfig,
|
|
65
|
-
) -> None:
|
|
66
|
-
self._db = db
|
|
67
|
-
self._polar = polar
|
|
68
|
-
self._qjl = qjl
|
|
69
|
-
self._config = config
|
|
70
|
-
|
|
71
|
-
# -- CRUD: polar_embeddings --------------------------------------------
|
|
72
|
-
|
|
73
|
-
def store(
|
|
74
|
-
self, fact_id: str, profile_id: str, qe: QuantizedEmbedding,
|
|
75
|
-
) -> bool:
|
|
76
|
-
"""UPSERT a quantized embedding into polar_embeddings.
|
|
77
|
-
|
|
78
|
-
Also updates embedding_quantization_metadata.
|
|
79
|
-
Returns True on success, False on error.
|
|
80
|
-
"""
|
|
81
|
-
try:
|
|
82
|
-
# UPSERT polar embedding (HR-05: parameterized)
|
|
83
|
-
self._db.execute(
|
|
84
|
-
"INSERT INTO polar_embeddings "
|
|
85
|
-
"(fact_id, profile_id, radius, angle_indices, qjl_bits, bit_width, created_at) "
|
|
86
|
-
"VALUES (?, ?, ?, ?, ?, ?, datetime('now')) "
|
|
87
|
-
"ON CONFLICT(fact_id) DO UPDATE SET "
|
|
88
|
-
" radius = excluded.radius, "
|
|
89
|
-
" angle_indices = excluded.angle_indices, "
|
|
90
|
-
" qjl_bits = excluded.qjl_bits, "
|
|
91
|
-
" bit_width = excluded.bit_width",
|
|
92
|
-
(fact_id, profile_id, qe.radius, qe.angle_indices,
|
|
93
|
-
qe.qjl_bits, qe.bit_width),
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
# UPSERT quantization metadata
|
|
97
|
-
level = _BW_TO_LEVEL.get(qe.bit_width, "float32")
|
|
98
|
-
compressed_size = len(qe.angle_indices)
|
|
99
|
-
if qe.qjl_bits:
|
|
100
|
-
compressed_size += len(qe.qjl_bits)
|
|
101
|
-
|
|
102
|
-
self._db.execute(
|
|
103
|
-
"INSERT INTO embedding_quantization_metadata "
|
|
104
|
-
"(fact_id, profile_id, quantization_level, bit_width, "
|
|
105
|
-
" compressed_size_bytes, created_at) "
|
|
106
|
-
"VALUES (?, ?, ?, ?, ?, datetime('now')) "
|
|
107
|
-
"ON CONFLICT(fact_id) DO UPDATE SET "
|
|
108
|
-
" quantization_level = excluded.quantization_level, "
|
|
109
|
-
" bit_width = excluded.bit_width, "
|
|
110
|
-
" compressed_size_bytes = excluded.compressed_size_bytes",
|
|
111
|
-
(fact_id, profile_id, level, qe.bit_width, compressed_size),
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
return True
|
|
115
|
-
except Exception as exc:
|
|
116
|
-
logger.error("store failed for fact_id=%s: %s", fact_id, exc)
|
|
117
|
-
return False
|
|
118
|
-
|
|
119
|
-
def load(
|
|
120
|
-
self, fact_id: str, profile_id: str,
|
|
121
|
-
) -> QuantizedEmbedding | None:
|
|
122
|
-
"""Load a quantized embedding by fact_id and profile_id.
|
|
123
|
-
|
|
124
|
-
Returns None if not found.
|
|
125
|
-
"""
|
|
126
|
-
try:
|
|
127
|
-
rows = self._db.execute(
|
|
128
|
-
"SELECT radius, angle_indices, qjl_bits, bit_width "
|
|
129
|
-
"FROM polar_embeddings "
|
|
130
|
-
"WHERE fact_id = ? AND profile_id = ?",
|
|
131
|
-
(fact_id, profile_id),
|
|
132
|
-
)
|
|
133
|
-
if not rows:
|
|
134
|
-
return None
|
|
135
|
-
|
|
136
|
-
row = dict(rows[0])
|
|
137
|
-
return QuantizedEmbedding(
|
|
138
|
-
fact_id=fact_id,
|
|
139
|
-
radius=float(row["radius"]),
|
|
140
|
-
angle_indices=bytes(row["angle_indices"]),
|
|
141
|
-
bit_width=int(row["bit_width"]),
|
|
142
|
-
qjl_bits=bytes(row["qjl_bits"]) if row["qjl_bits"] else None,
|
|
143
|
-
)
|
|
144
|
-
except Exception as exc:
|
|
145
|
-
logger.error("load failed for fact_id=%s: %s", fact_id, exc)
|
|
146
|
-
return None
|
|
147
|
-
|
|
148
|
-
def search(
|
|
149
|
-
self,
|
|
150
|
-
query_embedding: NDArray,
|
|
151
|
-
profile_id: str,
|
|
152
|
-
top_k: int = 50,
|
|
153
|
-
*,
|
|
154
|
-
bit_widths: tuple[int, ...] | None = None,
|
|
155
|
-
) -> list[tuple[str, float]]:
|
|
156
|
-
"""Search polar embeddings for a profile.
|
|
157
|
-
|
|
158
|
-
Pre-filters by lifecycle_zone (excludes 'forgotten').
|
|
159
|
-
``bit_widths`` selects a persisted precision tier; ``None`` preserves
|
|
160
|
-
the legacy all-quantized-row behavior.
|
|
161
|
-
Returns [(fact_id, similarity)] sorted descending.
|
|
162
|
-
"""
|
|
163
|
-
if bit_widths is not None and not bit_widths:
|
|
164
|
-
return []
|
|
165
|
-
try:
|
|
166
|
-
width_clause = ""
|
|
167
|
-
params: list[object] = [profile_id]
|
|
168
|
-
if bit_widths is not None:
|
|
169
|
-
widths = tuple(int(width) for width in bit_widths)
|
|
170
|
-
width_clause = (
|
|
171
|
-
" AND pe.bit_width IN ("
|
|
172
|
-
+ ",".join("?" for _ in widths)
|
|
173
|
-
+ ")"
|
|
174
|
-
)
|
|
175
|
-
params.extend(widths)
|
|
176
|
-
rows = self._db.execute(
|
|
177
|
-
"SELECT pe.fact_id, pe.radius, pe.angle_indices, "
|
|
178
|
-
" pe.qjl_bits, pe.bit_width "
|
|
179
|
-
"FROM polar_embeddings pe "
|
|
180
|
-
"JOIN fact_retention fr "
|
|
181
|
-
" ON pe.fact_id = fr.fact_id AND fr.profile_id = pe.profile_id "
|
|
182
|
-
"WHERE pe.profile_id = ? "
|
|
183
|
-
" AND fr.lifecycle_zone NOT IN ('forgotten')"
|
|
184
|
-
+ width_clause,
|
|
185
|
-
tuple(params),
|
|
186
|
-
)
|
|
187
|
-
except Exception as exc:
|
|
188
|
-
logger.error("search query failed: %s", exc)
|
|
189
|
-
return []
|
|
190
|
-
|
|
191
|
-
if not rows:
|
|
192
|
-
return []
|
|
193
|
-
|
|
194
|
-
# Build QuantizedEmbedding objects and compute similarities
|
|
195
|
-
results: list[tuple[str, float]] = []
|
|
196
|
-
for row in rows:
|
|
197
|
-
d = dict(row)
|
|
198
|
-
qe = QuantizedEmbedding(
|
|
199
|
-
fact_id=d["fact_id"],
|
|
200
|
-
radius=float(d["radius"]),
|
|
201
|
-
angle_indices=bytes(d["angle_indices"]),
|
|
202
|
-
bit_width=int(d["bit_width"]),
|
|
203
|
-
qjl_bits=bytes(d["qjl_bits"]) if d["qjl_bits"] else None,
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
sim = self._polar.approximate_similarity(query_embedding, qe)
|
|
207
|
-
|
|
208
|
-
# QJL correction (HR-07: optional)
|
|
209
|
-
if qe.qjl_bits and self._qjl:
|
|
210
|
-
correction = self._qjl.estimate_correction(
|
|
211
|
-
query_embedding, qe.qjl_bits,
|
|
212
|
-
)
|
|
213
|
-
sim += correction
|
|
214
|
-
|
|
215
|
-
results.append((qe.fact_id, sim))
|
|
216
|
-
|
|
217
|
-
# Sort by descending similarity; use fact_id as the tie-break so that
|
|
218
|
-
# two facts with identical approximate similarity always return in the
|
|
219
|
-
# same order regardless of SQLite storage layout or insertion sequence.
|
|
220
|
-
results.sort(key=lambda x: (-x[1], x[0]))
|
|
221
|
-
return results[:top_k]
|
|
222
|
-
|
|
223
|
-
# -- Compression helpers -----------------------------------------------
|
|
224
|
-
|
|
225
|
-
def compress_fact(
|
|
226
|
-
self,
|
|
227
|
-
fact_id: str,
|
|
228
|
-
profile_id: str,
|
|
229
|
-
original_embedding: NDArray,
|
|
230
|
-
target_bit_width: int,
|
|
231
|
-
) -> bool:
|
|
232
|
-
"""Quantize an embedding and store it.
|
|
233
|
-
|
|
234
|
-
For bit_width <= 4, also computes QJL residual correction
|
|
235
|
-
(if QJL encoder is available).
|
|
236
|
-
|
|
237
|
-
Returns True on success.
|
|
238
|
-
"""
|
|
239
|
-
try:
|
|
240
|
-
qe = self._polar.encode(original_embedding, target_bit_width)
|
|
241
|
-
|
|
242
|
-
# QJL residual for low bit-widths (HR-07: optional)
|
|
243
|
-
qjl_bits: bytes | None = None
|
|
244
|
-
if target_bit_width <= 4 and self._qjl:
|
|
245
|
-
decoded = self._polar.decode(qe)
|
|
246
|
-
residual = original_embedding - decoded
|
|
247
|
-
qjl_bits = self._qjl.encode_residual(residual)
|
|
248
|
-
|
|
249
|
-
# Build final QuantizedEmbedding with fact_id and QJL bits
|
|
250
|
-
qe_final = QuantizedEmbedding(
|
|
251
|
-
fact_id=fact_id,
|
|
252
|
-
radius=qe.radius,
|
|
253
|
-
angle_indices=qe.angle_indices,
|
|
254
|
-
bit_width=qe.bit_width,
|
|
255
|
-
qjl_bits=qjl_bits,
|
|
256
|
-
)
|
|
257
|
-
|
|
258
|
-
return self.store(fact_id, profile_id, qe_final)
|
|
259
|
-
except Exception as exc:
|
|
260
|
-
logger.error(
|
|
261
|
-
"compress_fact failed for fact_id=%s: %s", fact_id, exc,
|
|
262
|
-
)
|
|
263
|
-
return False
|
|
264
|
-
|
|
265
|
-
def batch_compress(
|
|
266
|
-
self,
|
|
267
|
-
fact_ids: list[str],
|
|
268
|
-
profile_id: str,
|
|
269
|
-
embeddings: dict[str, NDArray],
|
|
270
|
-
target_bit_width: int,
|
|
271
|
-
) -> int:
|
|
272
|
-
"""Compress a batch of facts. Returns count of successful compressions."""
|
|
273
|
-
count = 0
|
|
274
|
-
for fact_id in fact_ids:
|
|
275
|
-
if fact_id in embeddings:
|
|
276
|
-
if self.compress_fact(
|
|
277
|
-
fact_id, profile_id, embeddings[fact_id], target_bit_width,
|
|
278
|
-
):
|
|
279
|
-
count += 1
|
|
280
|
-
return count
|