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,63 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import threading
|
|
7
|
-
import time
|
|
8
|
-
|
|
9
|
-
_TTL_SECONDS = 300.0
|
|
10
|
-
# Sentinel epoch that can never equal a real generation (which is >= 0), so a
|
|
11
|
-
# conflicted key is always rejected by the fence.
|
|
12
|
-
_CONFLICT_EPOCH = -1
|
|
13
|
-
|
|
14
|
-
_lock = threading.RLock()
|
|
15
|
-
_epochs: dict[tuple[str, str], tuple[int, float]] = {}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def record_admission_epoch(profile_id: str, idempotency_key: str, epoch: int) -> None:
|
|
19
|
-
if not idempotency_key:
|
|
20
|
-
return
|
|
21
|
-
now = time.time()
|
|
22
|
-
with _lock:
|
|
23
|
-
_prune(now)
|
|
24
|
-
key = (profile_id, idempotency_key)
|
|
25
|
-
existing = _epochs.get(key)
|
|
26
|
-
if existing is not None and existing[0] not in (epoch, _CONFLICT_EPOCH):
|
|
27
|
-
# Two concurrent admits recorded different epochs for one key: fail
|
|
28
|
-
# closed so neither can satisfy the fence — both retry against the
|
|
29
|
-
# current binding rather than letting a stale epoch slip through.
|
|
30
|
-
_epochs[key] = (_CONFLICT_EPOCH, now)
|
|
31
|
-
else:
|
|
32
|
-
_epochs.setdefault(key, (epoch, now))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def admitted_epoch(profile_id: str, idempotency_key: str) -> int | None:
|
|
36
|
-
if not idempotency_key:
|
|
37
|
-
return None
|
|
38
|
-
now = time.time()
|
|
39
|
-
with _lock:
|
|
40
|
-
entry = _epochs.get((profile_id, idempotency_key))
|
|
41
|
-
if entry is None:
|
|
42
|
-
return None
|
|
43
|
-
epoch, ts = entry
|
|
44
|
-
if now - ts > _TTL_SECONDS:
|
|
45
|
-
_epochs.pop((profile_id, idempotency_key), None)
|
|
46
|
-
return None
|
|
47
|
-
return epoch
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def clear_admission_epoch(profile_id: str, idempotency_key: str) -> None:
|
|
51
|
-
if not idempotency_key:
|
|
52
|
-
return
|
|
53
|
-
with _lock:
|
|
54
|
-
_epochs.pop((profile_id, idempotency_key), None)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def _prune(now: float) -> None:
|
|
58
|
-
expired = [key for key, (_, ts) in _epochs.items() if now - ts > _TTL_SECONDS]
|
|
59
|
-
for key in expired:
|
|
60
|
-
_epochs.pop(key, None)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
__all__ = ["record_admission_epoch", "admitted_epoch", "clear_admission_epoch"]
|
|
@@ -1,236 +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
|
-
"""Forget the provenance of things that no longer exist.
|
|
6
|
-
|
|
7
|
-
`derivation_lineage` records where each derived object came from — which source
|
|
8
|
-
span produced this fact, this graph edge, this scene. Every ingestion operation
|
|
9
|
-
re-captures lineage for the objects present at that moment, so the table grows
|
|
10
|
-
with use, and nothing has ever deleted from it.
|
|
11
|
-
|
|
12
|
-
Measured on a real 447 MB store:
|
|
13
|
-
|
|
14
|
-
derivation_lineage 256,885 rows, 64 MB, plus 65 MB of indexes
|
|
15
|
-
... describing a graph edge
|
|
16
|
-
that no longer exists 100,581 rows — 39.2% of the table
|
|
17
|
-
growth ~9,000 rows/day, sustained
|
|
18
|
-
|
|
19
|
-
The graph is pruned. Its lineage was not, so the record of how a deleted edge
|
|
20
|
-
came to exist outlives the edge forever. Those rows answer no question: the
|
|
21
|
-
evidence bundle computes lineage coverage over the objects it exports, and an
|
|
22
|
-
object that is gone is not exported.
|
|
23
|
-
|
|
24
|
-
WHAT IS AND IS NOT DELETED
|
|
25
|
-
|
|
26
|
-
Only a row whose object is provably absent — the type is one this module knows
|
|
27
|
-
how to resolve, the table exists, and no row with that id is in it. An
|
|
28
|
-
unrecognised object type is left alone, because "I do not know what this
|
|
29
|
-
describes" is not evidence that it describes nothing.
|
|
30
|
-
|
|
31
|
-
There is deliberately no age rule. Lineage is what an audit reads to answer
|
|
32
|
-
"where did this come from", and a fact can be years old and still current.
|
|
33
|
-
Deleting provenance for something that still exists would be destroying the
|
|
34
|
-
answer while keeping the question.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
from __future__ import annotations
|
|
38
|
-
|
|
39
|
-
import logging
|
|
40
|
-
import sqlite3
|
|
41
|
-
from dataclasses import dataclass, field
|
|
42
|
-
|
|
43
|
-
logger = logging.getLogger(__name__)
|
|
44
|
-
|
|
45
|
-
__all__ = ["OBJECT_SOURCES", "LineagePruneReport", "count_orphan_lineage",
|
|
46
|
-
"prune_orphan_lineage"]
|
|
47
|
-
|
|
48
|
-
#: object_type -> (table holding it, column carrying its id).
|
|
49
|
-
#: Mirrors what ``core/derivation_lineage.capture_operation_lineage`` writes.
|
|
50
|
-
#: A type absent from this map is never deleted.
|
|
51
|
-
OBJECT_SOURCES: dict[str, tuple[str, str]] = {
|
|
52
|
-
"fact": ("atomic_facts", "fact_id"),
|
|
53
|
-
"graph_edge": ("graph_edges", "edge_id"),
|
|
54
|
-
"memory_scene": ("memory_scenes", "scene_id"),
|
|
55
|
-
"entity_summary": ("entity_profiles", "profile_entry_id"),
|
|
56
|
-
"index_bm25": ("bm25_tokens", "fact_id"),
|
|
57
|
-
"profile": ("profiles", "profile_id"),
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
#: Rows per transaction. Big enough that commit overhead vanishes, small enough
|
|
61
|
-
#: that an interrupted run has done most of its work and holds no long lock.
|
|
62
|
-
_BATCH = 2_000
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class _Rows:
|
|
66
|
-
"""Read and write through either a raw connection or the DatabaseManager.
|
|
67
|
-
|
|
68
|
-
The maintenance cycle holds a ``DatabaseManager``, whose lock serialises
|
|
69
|
-
every write; a migration or a test holds a plain ``sqlite3.Connection``.
|
|
70
|
-
Both are legitimate callers, and the difference is two method names.
|
|
71
|
-
"""
|
|
72
|
-
|
|
73
|
-
def __init__(self, db: object) -> None:
|
|
74
|
-
self._db = db
|
|
75
|
-
self._managed = hasattr(db, "transaction") and not isinstance(
|
|
76
|
-
db, sqlite3.Connection
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
def query(self, sql: str, params: tuple = ()) -> list:
|
|
80
|
-
rows = self._db.execute(sql, tuple(params))
|
|
81
|
-
return list(rows) if self._managed else rows.fetchall()
|
|
82
|
-
|
|
83
|
-
def write(self, sql: str, params: tuple = ()) -> None:
|
|
84
|
-
if self._managed:
|
|
85
|
-
with self._db.transaction():
|
|
86
|
-
self._db.execute(sql, tuple(params))
|
|
87
|
-
return
|
|
88
|
-
self._db.execute("BEGIN IMMEDIATE")
|
|
89
|
-
try:
|
|
90
|
-
self._db.execute(sql, tuple(params))
|
|
91
|
-
self._db.commit()
|
|
92
|
-
except Exception:
|
|
93
|
-
self._db.rollback()
|
|
94
|
-
raise
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
@dataclass(frozen=True)
|
|
98
|
-
class LineagePruneReport:
|
|
99
|
-
"""What was removed, by object type, and what was left alone."""
|
|
100
|
-
|
|
101
|
-
deleted: dict[str, int] = field(default_factory=dict)
|
|
102
|
-
skipped_types: tuple[str, ...] = ()
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def total(self) -> int:
|
|
106
|
-
return sum(self.deleted.values())
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def _table_exists(rows: _Rows, table: str) -> bool:
|
|
110
|
-
return bool(rows.query(
|
|
111
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
112
|
-
))
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def _resolvable(rows: _Rows) -> tuple[dict[str, tuple[str, str]], tuple[str, ...]]:
|
|
116
|
-
"""Split the types present in the table into resolvable and not."""
|
|
117
|
-
present = {
|
|
118
|
-
str(r[0]) for r in rows.query(
|
|
119
|
-
"SELECT DISTINCT object_type FROM derivation_lineage"
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
resolvable: dict[str, tuple[str, str]] = {}
|
|
123
|
-
skipped: list[str] = []
|
|
124
|
-
for object_type in sorted(present):
|
|
125
|
-
source = OBJECT_SOURCES.get(object_type)
|
|
126
|
-
if source is None or not _table_exists(rows, source[0]):
|
|
127
|
-
skipped.append(object_type)
|
|
128
|
-
continue
|
|
129
|
-
resolvable[object_type] = source
|
|
130
|
-
return resolvable, tuple(skipped)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
def count_orphan_lineage(
|
|
134
|
-
db: object, *, profile_id: str | None = None,
|
|
135
|
-
) -> LineagePruneReport:
|
|
136
|
-
"""How many rows describe something absent, without deleting anything."""
|
|
137
|
-
rows = _Rows(db)
|
|
138
|
-
if not _table_exists(rows, "derivation_lineage"):
|
|
139
|
-
return LineagePruneReport()
|
|
140
|
-
|
|
141
|
-
resolvable, skipped = _resolvable(rows)
|
|
142
|
-
counts: dict[str, int] = {}
|
|
143
|
-
for object_type, (table, column) in resolvable.items():
|
|
144
|
-
sql = (
|
|
145
|
-
"SELECT COUNT(*) FROM derivation_lineage d WHERE d.object_type = ? "
|
|
146
|
-
f"AND NOT EXISTS (SELECT 1 FROM {table} t WHERE t.{column} = d.object_id)"
|
|
147
|
-
)
|
|
148
|
-
params: list[object] = [object_type]
|
|
149
|
-
if profile_id is not None:
|
|
150
|
-
sql += " AND d.profile_id = ?"
|
|
151
|
-
params.append(profile_id)
|
|
152
|
-
count = int(rows.query(sql, tuple(params))[0][0])
|
|
153
|
-
if count:
|
|
154
|
-
counts[object_type] = count
|
|
155
|
-
return LineagePruneReport(counts, skipped)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def prune_orphan_lineage(
|
|
159
|
-
db: object,
|
|
160
|
-
*,
|
|
161
|
-
profile_id: str | None = None,
|
|
162
|
-
dry_run: bool = False,
|
|
163
|
-
) -> LineagePruneReport:
|
|
164
|
-
"""Delete lineage rows whose object is provably gone.
|
|
165
|
-
|
|
166
|
-
Batched and committed as it goes, so an interrupted run keeps the work it
|
|
167
|
-
already did and the next one continues. Nothing here reads a clock: what is
|
|
168
|
-
deleted depends only on what exists.
|
|
169
|
-
"""
|
|
170
|
-
rows = _Rows(db)
|
|
171
|
-
if not _table_exists(rows, "derivation_lineage"):
|
|
172
|
-
return LineagePruneReport()
|
|
173
|
-
|
|
174
|
-
report = count_orphan_lineage(db, profile_id=profile_id)
|
|
175
|
-
if dry_run or not report.total:
|
|
176
|
-
return report
|
|
177
|
-
|
|
178
|
-
resolvable, skipped = _resolvable(rows)
|
|
179
|
-
deleted: dict[str, int] = {}
|
|
180
|
-
|
|
181
|
-
for object_type, (table, column) in resolvable.items():
|
|
182
|
-
if object_type not in report.deleted:
|
|
183
|
-
continue
|
|
184
|
-
removed = 0
|
|
185
|
-
while True:
|
|
186
|
-
sql = (
|
|
187
|
-
"SELECT lineage_id FROM derivation_lineage d "
|
|
188
|
-
"WHERE d.object_type = ? "
|
|
189
|
-
f"AND NOT EXISTS (SELECT 1 FROM {table} t WHERE t.{column} = d.object_id)"
|
|
190
|
-
)
|
|
191
|
-
params: list[object] = [object_type]
|
|
192
|
-
if profile_id is not None:
|
|
193
|
-
sql += " AND d.profile_id = ?"
|
|
194
|
-
params.append(profile_id)
|
|
195
|
-
sql += f" LIMIT {_BATCH}"
|
|
196
|
-
|
|
197
|
-
ids = [r[0] for r in rows.query(sql, tuple(params))]
|
|
198
|
-
if not ids:
|
|
199
|
-
break
|
|
200
|
-
placeholders = ",".join("?" * len(ids))
|
|
201
|
-
# Re-check absence in the DELETE itself. Selecting orphans and then
|
|
202
|
-
# deleting them by id is a check-then-act: another process can
|
|
203
|
-
# recreate the object between the two statements, and the row would
|
|
204
|
-
# be deleted anyway. Repeating the predicate makes the decision and
|
|
205
|
-
# the deletion one statement.
|
|
206
|
-
delete_sql = (
|
|
207
|
-
f"DELETE FROM derivation_lineage WHERE lineage_id IN ({placeholders}) "
|
|
208
|
-
f"AND NOT EXISTS (SELECT 1 FROM {table} t "
|
|
209
|
-
f"WHERE t.{column} = derivation_lineage.object_id)"
|
|
210
|
-
)
|
|
211
|
-
rows.write(delete_sql, tuple(ids))
|
|
212
|
-
# Count what survived the re-check rather than what was offered.
|
|
213
|
-
still = rows.query(
|
|
214
|
-
f"SELECT COUNT(*) FROM derivation_lineage "
|
|
215
|
-
f"WHERE lineage_id IN ({placeholders})",
|
|
216
|
-
tuple(ids),
|
|
217
|
-
)
|
|
218
|
-
remaining_here = int(still[0][0]) if still else 0
|
|
219
|
-
removed += len(ids) - remaining_here
|
|
220
|
-
if remaining_here == len(ids):
|
|
221
|
-
# Every row in this batch was rescued by a concurrent writer.
|
|
222
|
-
# Another pass would select the same rows forever.
|
|
223
|
-
break
|
|
224
|
-
if removed:
|
|
225
|
-
deleted[object_type] = removed
|
|
226
|
-
logger.info(
|
|
227
|
-
"lineage retention: removed %d row(s) describing a %s that no "
|
|
228
|
-
"longer exists", removed, object_type,
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
if skipped:
|
|
232
|
-
logger.info(
|
|
233
|
-
"lineage retention: left %s alone — no table is known to hold them",
|
|
234
|
-
", ".join(skipped),
|
|
235
|
-
)
|
|
236
|
-
return LineagePruneReport(deleted, skipped)
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"""Canonical logical-edge projection shared by scale backends.
|
|
2
|
-
|
|
3
|
-
Legacy databases can contain multiple physical ``graph_edges`` rows for one
|
|
4
|
-
logical relationship. Current writes define identity as profile, source,
|
|
5
|
-
target, and edge type, retaining the strongest weight. Derived projections
|
|
6
|
-
must use that same contract without rewriting canonical SQLite history.
|
|
7
|
-
"""
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import sqlite3
|
|
11
|
-
from collections.abc import Iterator
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
_LOGICAL_EDGE_SELECT = """
|
|
15
|
-
SELECT
|
|
16
|
-
source_id,
|
|
17
|
-
target_id,
|
|
18
|
-
COALESCE(edge_type, 'related') AS edge_type,
|
|
19
|
-
MAX(COALESCE(weight, 1.0)) AS weight,
|
|
20
|
-
profile_id
|
|
21
|
-
FROM graph_edges
|
|
22
|
-
WHERE profile_id = ?
|
|
23
|
-
AND NOT EXISTS (
|
|
24
|
-
SELECT 1 FROM atomic_facts f
|
|
25
|
-
WHERE f.fact_id IN (graph_edges.source_id, graph_edges.target_id)
|
|
26
|
-
AND NOT ({visible})
|
|
27
|
-
)
|
|
28
|
-
GROUP BY profile_id, source_id, target_id, COALESCE(edge_type, 'related')
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _edge_select(conn: sqlite3.Connection) -> str:
|
|
33
|
-
"""The logical-edge query, with the withheld-endpoint exclusion resolved.
|
|
34
|
-
|
|
35
|
-
WHY AN EDGE WITH A WITHHELD ENDPOINT IS NOT A LOGICAL EDGE
|
|
36
|
-
----------------------------------------------------------
|
|
37
|
-
The retrieval channel this projection stands in for does not traverse them.
|
|
38
|
-
It loads ``graph_edges`` by scope and then prunes the result: "Edge scope
|
|
39
|
-
alone cannot authorize an endpoint. Prune both endpoints against the visible
|
|
40
|
-
fact corpus so denied facts cannot influence an allowed candidate indirectly
|
|
41
|
-
through propagation." Its entity map is filtered the same way, for a reason
|
|
42
|
-
it spells out — a withheld row carries its whole cluster's pooled entity
|
|
43
|
-
list, so it out-ranks real memories and then gets discarded at hydration,
|
|
44
|
-
spending the channel's budget on nothing.
|
|
45
|
-
|
|
46
|
-
The export predated that fix and kept the withheld endpoints. Measured on a
|
|
47
|
-
copy of the author's store: Cozo's bridge held 1,257 facts the store may not
|
|
48
|
-
return and its edges touched 805, and the graph search diverged from SQLite
|
|
49
|
-
on **every** query — three shadow checks, three mismatches. One query
|
|
50
|
-
returned 9 results against SQLite's 20, because withheld facts had taken the
|
|
51
|
-
top-k budget. The projection failed closed every time, so recall was correct
|
|
52
|
-
and the projection was dead weight.
|
|
53
|
-
|
|
54
|
-
The predicate is resolved against the passed connection because
|
|
55
|
-
``archive_status`` and ``quarantined`` each arrive with a migration and may
|
|
56
|
-
be absent on a store the engine has not opened.
|
|
57
|
-
"""
|
|
58
|
-
from superlocalmemory.storage.database import visible_fact_clause_for_connection
|
|
59
|
-
|
|
60
|
-
# The helper returns a leading-AND clause for appending; here it is needed as
|
|
61
|
-
# a standalone predicate, so strip the connective and default to "always
|
|
62
|
-
# visible" on a store that has neither column yet.
|
|
63
|
-
clause = visible_fact_clause_for_connection(conn, prefix="f").strip()
|
|
64
|
-
predicate = clause[4:].strip() if clause.upper().startswith("AND ") else clause
|
|
65
|
-
return _LOGICAL_EDGE_SELECT.format(visible=predicate or "1=1")
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def iter_logical_edges(
|
|
69
|
-
conn: sqlite3.Connection, profile_id: str
|
|
70
|
-
) -> Iterator[tuple[Any, ...]]:
|
|
71
|
-
"""Yield normalized graph edges in deterministic fingerprint order."""
|
|
72
|
-
return iter(
|
|
73
|
-
conn.execute(
|
|
74
|
-
_edge_select(conn) + " ORDER BY source_id, target_id, edge_type",
|
|
75
|
-
(profile_id,),
|
|
76
|
-
)
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def count_logical_edges(conn: sqlite3.Connection, profile_id: str) -> int:
|
|
81
|
-
"""Count relationships using the canonical logical identity."""
|
|
82
|
-
row = conn.execute(
|
|
83
|
-
"SELECT COUNT(*) FROM (" + _edge_select(conn) + ")",
|
|
84
|
-
(profile_id,),
|
|
85
|
-
).fetchone()
|
|
86
|
-
return int(row[0] if row else 0)
|
|
@@ -1,115 +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
|
|
4
|
-
|
|
5
|
-
"""Canonical short-lived WRITE / READ connections for memory.db.
|
|
6
|
-
|
|
7
|
-
Why this exists
|
|
8
|
-
---------------
|
|
9
|
-
memory.db is a WAL SQLite database with exactly one writer allowed at any
|
|
10
|
-
instant. Historically many subsystems opened their own bare
|
|
11
|
-
``sqlite3.connect(...)`` and wrote without any coordination, which produced
|
|
12
|
-
two failure modes under real multi-agent load:
|
|
13
|
-
|
|
14
|
-
1. **In-process races** — daemon worker threads racing each other at the WAL
|
|
15
|
-
layer, retrying ``SQLITE_BUSY`` until they time out.
|
|
16
|
-
2. **Cross-process races** — Claude Code hooks and the ``slm ingest`` CLI run
|
|
17
|
-
as *separate OS processes* and write memory.db directly. An in-process
|
|
18
|
-
``threading`` lock cannot serialise those; only SQLite's own
|
|
19
|
-
``PRAGMA busy_timeout`` makes them WAIT for the writer instead of erroring.
|
|
20
|
-
|
|
21
|
-
``memory_write()`` closes BOTH gaps with one helper that every writer uses:
|
|
22
|
-
|
|
23
|
-
* Acquires the process-level :func:`get_write_lock` (the OUTERMOST lock — see
|
|
24
|
-
``write_lock.py``) so in-process writers serialise cleanly with **no**
|
|
25
|
-
``SQLITE_BUSY`` spin.
|
|
26
|
-
* Opens the connection with ``PRAGMA busy_timeout`` so that a *different
|
|
27
|
-
process* (hook / CLI) writing at the same instant WAITS rather than failing.
|
|
28
|
-
* Commits on success, rolls back on error, always closes — a short critical
|
|
29
|
-
section.
|
|
30
|
-
|
|
31
|
-
The single hard rule for callers
|
|
32
|
-
---------------------------------
|
|
33
|
-
**Never hold this connection across a slow operation** — no embedding /
|
|
34
|
-
network call / large unbounded transaction inside the ``with`` block. Do the
|
|
35
|
-
slow work first, then open ``memory_write()`` only for the fast INSERT/UPDATE.
|
|
36
|
-
Holding the writer across a multi-second op is exactly what starves everyone
|
|
37
|
-
else (SQLITE_BUSY after retries). Batch large writes into bounded chunks that
|
|
38
|
-
each commit quickly.
|
|
39
|
-
|
|
40
|
-
Reads
|
|
41
|
-
-----
|
|
42
|
-
Use :func:`memory_read` for read-only access. WAL allows concurrent readers
|
|
43
|
-
without blocking the writer, so reads do NOT take the write lock. The helper
|
|
44
|
-
opens SQLite with ``mode=ro`` and ``PRAGMA query_only=ON``; it uses the
|
|
45
|
-
3.8.6 read-path budget of at most 250ms during a brief checkpoint window.
|
|
46
|
-
"""
|
|
47
|
-
from __future__ import annotations
|
|
48
|
-
|
|
49
|
-
import os
|
|
50
|
-
import sqlite3
|
|
51
|
-
from contextlib import contextmanager
|
|
52
|
-
from pathlib import Path
|
|
53
|
-
from typing import Generator
|
|
54
|
-
|
|
55
|
-
from superlocalmemory.storage.read_connection import ReadConnectionFactory
|
|
56
|
-
from superlocalmemory.storage.write_lock import get_write_lock
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def _busy_timeout_ms() -> int:
|
|
60
|
-
"""Busy-timeout in ms, env-overridable, matching DatabaseManager's default.
|
|
61
|
-
|
|
62
|
-
Kept in sync with ``storage/database.py::_BUSY_TIMEOUT_MS`` (env
|
|
63
|
-
``SLM_DB_BUSY_TIMEOUT_MS``, default 10_000) so every memory.db connection
|
|
64
|
-
in the process — and in hook/CLI child processes that import this — waits
|
|
65
|
-
the same amount for the single writer.
|
|
66
|
-
"""
|
|
67
|
-
try:
|
|
68
|
-
return max(0, int(os.environ.get("SLM_DB_BUSY_TIMEOUT_MS", "10000")))
|
|
69
|
-
except (TypeError, ValueError):
|
|
70
|
-
return 10000
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
@contextmanager
|
|
74
|
-
def memory_write(db_path: str | Path) -> Generator[sqlite3.Connection, None, None]:
|
|
75
|
-
"""Yield a serialised, busy-timeout-guarded WRITE connection to memory.db.
|
|
76
|
-
|
|
77
|
-
Acquires the process write lock (outermost), opens a short-lived
|
|
78
|
-
connection with ``busy_timeout``, commits on success / rolls back on
|
|
79
|
-
error, and always closes.
|
|
80
|
-
|
|
81
|
-
HARD RULE: keep the ``with`` block short — never embed / call the network /
|
|
82
|
-
run an unbounded transaction while holding it.
|
|
83
|
-
"""
|
|
84
|
-
ms = _busy_timeout_ms()
|
|
85
|
-
lock = get_write_lock(db_path)
|
|
86
|
-
with lock:
|
|
87
|
-
conn = sqlite3.connect(str(db_path), timeout=ms / 1000.0)
|
|
88
|
-
try:
|
|
89
|
-
conn.execute(f"PRAGMA busy_timeout={ms}")
|
|
90
|
-
conn.row_factory = sqlite3.Row
|
|
91
|
-
yield conn
|
|
92
|
-
conn.commit()
|
|
93
|
-
except Exception:
|
|
94
|
-
try:
|
|
95
|
-
conn.rollback()
|
|
96
|
-
except Exception:
|
|
97
|
-
pass
|
|
98
|
-
raise
|
|
99
|
-
finally:
|
|
100
|
-
conn.close()
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
@contextmanager
|
|
104
|
-
def memory_read(db_path: str | Path) -> Generator[sqlite3.Connection, None, None]:
|
|
105
|
-
"""Yield a physically read-only connection with no write lock.
|
|
106
|
-
|
|
107
|
-
WAL permits concurrent readers, so this deliberately does NOT take the
|
|
108
|
-
write lock. A 250ms bounded wait protects the query path from a brief
|
|
109
|
-
checkpoint without converting a dashboard recall into a long hang.
|
|
110
|
-
"""
|
|
111
|
-
with ReadConnectionFactory(db_path, timeout_ms=min(_busy_timeout_ms(), 250)).snapshot() as conn:
|
|
112
|
-
yield conn
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
__all__ = ["memory_write", "memory_read"]
|