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,423 +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 V4 | https://qualixar.com
|
|
4
|
-
|
|
5
|
-
"""Backup erasure obligation ledger — GDPR Art.17 backup residue tracking.
|
|
6
|
-
|
|
7
|
-
After Art.17 erasure the live stores are clean, but rotating backup snapshots
|
|
8
|
-
still hold the erased personal data. This module tracks ``outstanding
|
|
9
|
-
obligations`` — one per (profile_id, snapshot_path) pair — so that:
|
|
10
|
-
|
|
11
|
-
1. The erasure receipt accurately declares completeness as FALSE while any
|
|
12
|
-
snapshot still contains the data (C1 gap closure).
|
|
13
|
-
|
|
14
|
-
2. A restore that would resurrect erased data is intercepted and the profile
|
|
15
|
-
data re-erased from the restored store before any caller can read it
|
|
16
|
-
(restore-replay invariant).
|
|
17
|
-
|
|
18
|
-
3. Obligations age out automatically when a snapshot exceeds the configured
|
|
19
|
-
retention window, keeping the ledger finite.
|
|
20
|
-
|
|
21
|
-
IMPORTANT: backup_obligations.db is intentionally NOT in MANAGED_DATABASES
|
|
22
|
-
and is therefore never backed up itself. This prevents a restore from loading
|
|
23
|
-
stale obligation state.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
import logging
|
|
29
|
-
import sqlite3
|
|
30
|
-
import time
|
|
31
|
-
import uuid
|
|
32
|
-
from pathlib import Path
|
|
33
|
-
|
|
34
|
-
logger = logging.getLogger("superlocalmemory.infra.backup_obligations")
|
|
35
|
-
|
|
36
|
-
_OBLIGATION_DB_NAME = "backup_obligations.db"
|
|
37
|
-
|
|
38
|
-
_DDL = """
|
|
39
|
-
CREATE TABLE IF NOT EXISTS backup_obligations (
|
|
40
|
-
obligation_id TEXT PRIMARY KEY,
|
|
41
|
-
profile_id TEXT NOT NULL,
|
|
42
|
-
erasure_id TEXT NOT NULL,
|
|
43
|
-
snapshot_path TEXT NOT NULL,
|
|
44
|
-
snapshot_epoch INTEGER NOT NULL,
|
|
45
|
-
retention_days INTEGER NOT NULL DEFAULT 90,
|
|
46
|
-
recorded_at REAL NOT NULL,
|
|
47
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
48
|
-
discharged_at REAL,
|
|
49
|
-
discharge_reason TEXT
|
|
50
|
-
);
|
|
51
|
-
CREATE INDEX IF NOT EXISTS idx_bko_profile
|
|
52
|
-
ON backup_obligations(profile_id, status);
|
|
53
|
-
CREATE INDEX IF NOT EXISTS idx_bko_snapshot
|
|
54
|
-
ON backup_obligations(snapshot_path, status);
|
|
55
|
-
CREATE INDEX IF NOT EXISTS idx_bko_erasure
|
|
56
|
-
ON backup_obligations(erasure_id);
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class BackupObligationStore:
|
|
61
|
-
"""Persistent ledger of outstanding erasure obligations against snapshots.
|
|
62
|
-
|
|
63
|
-
An obligation is created for each backup snapshot that was found to contain
|
|
64
|
-
data for a profile that has since been Art.17-erased from the live stores.
|
|
65
|
-
The obligation is discharged when:
|
|
66
|
-
* The snapshot ages past the configured retention window (auto-discharge).
|
|
67
|
-
* The snapshot is restored and the profile data is re-erased during
|
|
68
|
-
restore-replay (explicit discharge).
|
|
69
|
-
|
|
70
|
-
The store lives at ``<data_root>/backup_obligations.db``. It is a plain
|
|
71
|
-
SQLite file that is NOT in MANAGED_DATABASES and therefore never appears
|
|
72
|
-
inside a backup set.
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
def __init__(self, data_root: Path) -> None:
|
|
76
|
-
self._db_path = Path(data_root) / _OBLIGATION_DB_NAME
|
|
77
|
-
self._ensure_schema()
|
|
78
|
-
|
|
79
|
-
# ------------------------------------------------------------------
|
|
80
|
-
# Schema
|
|
81
|
-
# ------------------------------------------------------------------
|
|
82
|
-
|
|
83
|
-
def _connect(self) -> sqlite3.Connection:
|
|
84
|
-
conn = sqlite3.connect(str(self._db_path))
|
|
85
|
-
conn.row_factory = sqlite3.Row
|
|
86
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
87
|
-
conn.execute("PRAGMA foreign_keys=ON")
|
|
88
|
-
conn.execute("PRAGMA synchronous=NORMAL")
|
|
89
|
-
return conn
|
|
90
|
-
|
|
91
|
-
def _ensure_schema(self) -> None:
|
|
92
|
-
try:
|
|
93
|
-
with self._connect() as conn:
|
|
94
|
-
for stmt in _DDL.strip().split(";"):
|
|
95
|
-
stmt = stmt.strip()
|
|
96
|
-
if stmt:
|
|
97
|
-
conn.execute(stmt)
|
|
98
|
-
conn.commit()
|
|
99
|
-
except Exception as exc: # noqa: BLE001
|
|
100
|
-
logger.warning("BackupObligationStore: schema init failed: %s", exc)
|
|
101
|
-
|
|
102
|
-
# ------------------------------------------------------------------
|
|
103
|
-
# Write path
|
|
104
|
-
# ------------------------------------------------------------------
|
|
105
|
-
|
|
106
|
-
def record(
|
|
107
|
-
self,
|
|
108
|
-
profile_id: str,
|
|
109
|
-
erasure_id: str,
|
|
110
|
-
snapshot_path: str,
|
|
111
|
-
snapshot_epoch: int,
|
|
112
|
-
retention_days: int = 90,
|
|
113
|
-
) -> str:
|
|
114
|
-
"""Record one outstanding obligation. Returns the obligation_id."""
|
|
115
|
-
oid = uuid.uuid4().hex
|
|
116
|
-
try:
|
|
117
|
-
with self._connect() as conn:
|
|
118
|
-
conn.execute(
|
|
119
|
-
"INSERT OR IGNORE INTO backup_obligations "
|
|
120
|
-
"(obligation_id, profile_id, erasure_id, snapshot_path, "
|
|
121
|
-
" snapshot_epoch, retention_days, recorded_at, status) "
|
|
122
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')",
|
|
123
|
-
(
|
|
124
|
-
oid, profile_id, erasure_id, str(snapshot_path),
|
|
125
|
-
int(snapshot_epoch), int(retention_days), time.time(),
|
|
126
|
-
),
|
|
127
|
-
)
|
|
128
|
-
conn.commit()
|
|
129
|
-
except Exception as exc: # noqa: BLE001
|
|
130
|
-
logger.warning("BackupObligationStore.record failed: %s", exc)
|
|
131
|
-
return oid
|
|
132
|
-
|
|
133
|
-
def discharge(self, obligation_id: str, reason: str) -> None:
|
|
134
|
-
"""Mark a single obligation as discharged."""
|
|
135
|
-
try:
|
|
136
|
-
with self._connect() as conn:
|
|
137
|
-
conn.execute(
|
|
138
|
-
"UPDATE backup_obligations "
|
|
139
|
-
"SET status='discharged', discharged_at=?, discharge_reason=? "
|
|
140
|
-
"WHERE obligation_id=?",
|
|
141
|
-
(time.time(), reason, obligation_id),
|
|
142
|
-
)
|
|
143
|
-
conn.commit()
|
|
144
|
-
except Exception as exc: # noqa: BLE001
|
|
145
|
-
logger.warning("BackupObligationStore.discharge failed: %s", exc)
|
|
146
|
-
|
|
147
|
-
def discharge_for_snapshot(self, snapshot_path: str, reason: str) -> int:
|
|
148
|
-
"""Discharge ALL pending obligations for a snapshot path. Returns count."""
|
|
149
|
-
try:
|
|
150
|
-
with self._connect() as conn:
|
|
151
|
-
cur = conn.execute(
|
|
152
|
-
"UPDATE backup_obligations "
|
|
153
|
-
"SET status='discharged', discharged_at=?, discharge_reason=? "
|
|
154
|
-
"WHERE snapshot_path=? AND status='pending'",
|
|
155
|
-
(time.time(), reason, str(snapshot_path)),
|
|
156
|
-
)
|
|
157
|
-
conn.commit()
|
|
158
|
-
return cur.rowcount
|
|
159
|
-
except Exception as exc: # noqa: BLE001
|
|
160
|
-
logger.warning("BackupObligationStore.discharge_for_snapshot: %s", exc)
|
|
161
|
-
return 0
|
|
162
|
-
|
|
163
|
-
# ------------------------------------------------------------------
|
|
164
|
-
# Read path
|
|
165
|
-
# ------------------------------------------------------------------
|
|
166
|
-
|
|
167
|
-
def _discharge_aged_out(self) -> int:
|
|
168
|
-
"""Auto-discharge obligations whose snapshot has aged past retention."""
|
|
169
|
-
try:
|
|
170
|
-
with self._connect() as conn:
|
|
171
|
-
now = time.time()
|
|
172
|
-
cur = conn.execute(
|
|
173
|
-
"UPDATE backup_obligations "
|
|
174
|
-
"SET status='discharged', discharged_at=?, "
|
|
175
|
-
" discharge_reason='snapshot_aged_out' "
|
|
176
|
-
"WHERE status='pending' "
|
|
177
|
-
" AND (snapshot_epoch + retention_days * 86400) < ?",
|
|
178
|
-
(now, now),
|
|
179
|
-
)
|
|
180
|
-
conn.commit()
|
|
181
|
-
return cur.rowcount
|
|
182
|
-
except Exception as exc: # noqa: BLE001
|
|
183
|
-
logger.warning("BackupObligationStore._discharge_aged_out: %s", exc)
|
|
184
|
-
return 0
|
|
185
|
-
|
|
186
|
-
def count_pending(self, profile_id: str) -> int:
|
|
187
|
-
"""Count pending obligations for *profile_id* (auto-discharges aged-out first).
|
|
188
|
-
|
|
189
|
-
Fail-closed: if the store is unreadable, returns 1 to block completeness.
|
|
190
|
-
"""
|
|
191
|
-
self._discharge_aged_out()
|
|
192
|
-
try:
|
|
193
|
-
with self._connect() as conn:
|
|
194
|
-
row = conn.execute(
|
|
195
|
-
"SELECT COUNT(*) FROM backup_obligations "
|
|
196
|
-
"WHERE profile_id=? AND status='pending'",
|
|
197
|
-
(profile_id,),
|
|
198
|
-
).fetchone()
|
|
199
|
-
return int(row[0]) if row else 0
|
|
200
|
-
except Exception as exc: # noqa: BLE001
|
|
201
|
-
logger.warning(
|
|
202
|
-
"BackupObligationStore.count_pending failed: %s — "
|
|
203
|
-
"returning 1 to block completeness claim",
|
|
204
|
-
exc,
|
|
205
|
-
)
|
|
206
|
-
return 1 # fail-closed
|
|
207
|
-
|
|
208
|
-
def list_pending_for_snapshot(self, snapshot_path: str) -> list[dict]:
|
|
209
|
-
"""Return all pending obligations for *snapshot_path*."""
|
|
210
|
-
try:
|
|
211
|
-
with self._connect() as conn:
|
|
212
|
-
rows = conn.execute(
|
|
213
|
-
"SELECT * FROM backup_obligations "
|
|
214
|
-
"WHERE snapshot_path=? AND status='pending'",
|
|
215
|
-
(str(snapshot_path),),
|
|
216
|
-
).fetchall()
|
|
217
|
-
return [dict(r) for r in rows]
|
|
218
|
-
except Exception as exc: # noqa: BLE001
|
|
219
|
-
logger.warning("BackupObligationStore.list_pending_for_snapshot: %s", exc)
|
|
220
|
-
return []
|
|
221
|
-
|
|
222
|
-
def list_pending_for_profile(self, profile_id: str) -> list[dict]:
|
|
223
|
-
"""Return all pending obligations for *profile_id* (auto-discharges first)."""
|
|
224
|
-
self._discharge_aged_out()
|
|
225
|
-
try:
|
|
226
|
-
with self._connect() as conn:
|
|
227
|
-
rows = conn.execute(
|
|
228
|
-
"SELECT * FROM backup_obligations "
|
|
229
|
-
"WHERE profile_id=? AND status='pending'",
|
|
230
|
-
(profile_id,),
|
|
231
|
-
).fetchall()
|
|
232
|
-
return [dict(r) for r in rows]
|
|
233
|
-
except Exception as exc: # noqa: BLE001
|
|
234
|
-
logger.warning("BackupObligationStore.list_pending_for_profile: %s", exc)
|
|
235
|
-
return []
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
# ---------------------------------------------------------------------------
|
|
239
|
-
# Snapshot helpers (used by gdpr.py and backup.py)
|
|
240
|
-
# ---------------------------------------------------------------------------
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
def scan_backup_snapshots_for_profile(
|
|
244
|
-
backup_dir: Path,
|
|
245
|
-
profile_id: str,
|
|
246
|
-
) -> list[tuple[str, int]]:
|
|
247
|
-
"""Scan *backup_dir* for snapshots containing *profile_id*'s data.
|
|
248
|
-
|
|
249
|
-
Returns a list of (snapshot_path_str, epoch) tuples. Handles both legacy
|
|
250
|
-
per-file backups (``*.db`` files) and new-style BackupCoordinator sets
|
|
251
|
-
(``backup_XXXX/`` directories containing a ``manifest.json``).
|
|
252
|
-
"""
|
|
253
|
-
backup_dir = Path(backup_dir)
|
|
254
|
-
results: list[tuple[str, int]] = []
|
|
255
|
-
|
|
256
|
-
if not backup_dir.exists():
|
|
257
|
-
return results
|
|
258
|
-
|
|
259
|
-
# New-style backup sets: backup_XXXX/ directories with manifest.json.
|
|
260
|
-
# Record obligation at the set-directory level (one obligation per set).
|
|
261
|
-
for candidate in sorted(backup_dir.iterdir()):
|
|
262
|
-
if not candidate.is_dir() or not (candidate / "manifest.json").exists():
|
|
263
|
-
continue
|
|
264
|
-
hit = False
|
|
265
|
-
for db_file in candidate.glob("*.db"):
|
|
266
|
-
if _snapshot_db_contains_profile(db_file, profile_id):
|
|
267
|
-
hit = True
|
|
268
|
-
break
|
|
269
|
-
if hit:
|
|
270
|
-
epoch = int(candidate.stat().st_mtime)
|
|
271
|
-
results.append((str(candidate), epoch))
|
|
272
|
-
|
|
273
|
-
# Legacy per-file backups: ``memory-YYYYMMDD-HHMMSS.db``, etc.
|
|
274
|
-
for db_file in sorted(backup_dir.glob("*.db")):
|
|
275
|
-
if db_file.name.startswith("."):
|
|
276
|
-
continue
|
|
277
|
-
if _snapshot_db_contains_profile(db_file, profile_id):
|
|
278
|
-
epoch = int(db_file.stat().st_mtime)
|
|
279
|
-
results.append((str(db_file), epoch))
|
|
280
|
-
|
|
281
|
-
return results
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
def _snapshot_db_contains_profile(db_path: Path, profile_id: str) -> bool:
|
|
285
|
-
"""Return True if the SQLite file at *db_path* contains rows for *profile_id*.
|
|
286
|
-
|
|
287
|
-
Opens read-only (immutable) to avoid side-effects. Returns False on any
|
|
288
|
-
error so an unreadable snapshot does not block erasure; caller logs the
|
|
289
|
-
warning separately.
|
|
290
|
-
"""
|
|
291
|
-
try:
|
|
292
|
-
uri = f"file:{db_path}?mode=ro"
|
|
293
|
-
conn = sqlite3.connect(uri, uri=True, timeout=5)
|
|
294
|
-
try:
|
|
295
|
-
tables = {
|
|
296
|
-
row[0]
|
|
297
|
-
for row in conn.execute(
|
|
298
|
-
"SELECT name FROM sqlite_master WHERE type='table'"
|
|
299
|
-
).fetchall()
|
|
300
|
-
}
|
|
301
|
-
for table in ("profiles", "atomic_facts", "memories", "graph_nodes"):
|
|
302
|
-
if table not in tables:
|
|
303
|
-
continue
|
|
304
|
-
cols = {
|
|
305
|
-
row[1]
|
|
306
|
-
for row in conn.execute(f"PRAGMA table_info({table})").fetchall()
|
|
307
|
-
}
|
|
308
|
-
if "profile_id" not in cols:
|
|
309
|
-
# graph_nodes has no profile_id — flag unconditionally as personal
|
|
310
|
-
if table == "graph_nodes":
|
|
311
|
-
row = conn.execute(
|
|
312
|
-
"SELECT 1 FROM graph_nodes LIMIT 1"
|
|
313
|
-
).fetchone()
|
|
314
|
-
if row is not None:
|
|
315
|
-
return True
|
|
316
|
-
continue
|
|
317
|
-
row = conn.execute(
|
|
318
|
-
f"SELECT 1 FROM {table} WHERE profile_id=? LIMIT 1",
|
|
319
|
-
(profile_id,),
|
|
320
|
-
).fetchone()
|
|
321
|
-
if row is not None:
|
|
322
|
-
return True
|
|
323
|
-
finally:
|
|
324
|
-
conn.close()
|
|
325
|
-
except Exception as exc: # noqa: BLE001
|
|
326
|
-
logger.warning(
|
|
327
|
-
"_snapshot_db_contains_profile: error reading %s: %s — treating as clean",
|
|
328
|
-
db_path.name, exc,
|
|
329
|
-
)
|
|
330
|
-
return False
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def erase_profile_from_snapshot(db_path: Path, profile_id: str) -> dict[str, int]:
|
|
334
|
-
"""Delete all *profile_id* rows from a snapshot SQLite file.
|
|
335
|
-
|
|
336
|
-
Used during restore-replay. Raises on any fatal error so the caller can
|
|
337
|
-
refuse to mark the restore complete when personal data cannot be purged.
|
|
338
|
-
"""
|
|
339
|
-
deleted: dict[str, int] = {}
|
|
340
|
-
# isolation_level=None → autocommit so VACUUM can run outside any transaction.
|
|
341
|
-
conn = sqlite3.connect(str(db_path))
|
|
342
|
-
conn.isolation_level = None
|
|
343
|
-
try:
|
|
344
|
-
conn.execute("PRAGMA foreign_keys=OFF")
|
|
345
|
-
tables = [
|
|
346
|
-
row[0]
|
|
347
|
-
for row in conn.execute(
|
|
348
|
-
"SELECT name FROM sqlite_master WHERE type='table'"
|
|
349
|
-
).fetchall()
|
|
350
|
-
if not row[0].startswith("sqlite_")
|
|
351
|
-
]
|
|
352
|
-
conn.execute("BEGIN")
|
|
353
|
-
for table in tables:
|
|
354
|
-
cols = {
|
|
355
|
-
row[1]
|
|
356
|
-
for row in conn.execute(f"PRAGMA table_info({table})").fetchall()
|
|
357
|
-
}
|
|
358
|
-
if "profile_id" not in cols:
|
|
359
|
-
continue
|
|
360
|
-
cur = conn.execute(
|
|
361
|
-
f"DELETE FROM {table} WHERE profile_id=?", (profile_id,)
|
|
362
|
-
)
|
|
363
|
-
if cur.rowcount:
|
|
364
|
-
deleted[table] = cur.rowcount
|
|
365
|
-
conn.execute("PRAGMA foreign_keys=ON")
|
|
366
|
-
conn.execute("COMMIT")
|
|
367
|
-
# VACUUM must run in autocommit (no active transaction).
|
|
368
|
-
conn.execute("VACUUM")
|
|
369
|
-
except Exception:
|
|
370
|
-
try:
|
|
371
|
-
conn.execute("ROLLBACK")
|
|
372
|
-
except Exception: # noqa: BLE001
|
|
373
|
-
pass
|
|
374
|
-
conn.close()
|
|
375
|
-
raise
|
|
376
|
-
else:
|
|
377
|
-
conn.close()
|
|
378
|
-
return deleted
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
def erase_code_graph_from_snapshot(db_path: Path) -> dict[str, int]:
|
|
382
|
-
"""Wipe all tables from a code_graph.db snapshot (no profile_id column).
|
|
383
|
-
|
|
384
|
-
The code graph is installation-level personal data (repo paths, symbol
|
|
385
|
-
names). On erasure or restore-replay the entire graph is cleared.
|
|
386
|
-
"""
|
|
387
|
-
deleted: dict[str, int] = {}
|
|
388
|
-
if not db_path.exists():
|
|
389
|
-
return deleted
|
|
390
|
-
conn = sqlite3.connect(str(db_path))
|
|
391
|
-
conn.isolation_level = None # autocommit so VACUUM runs outside any transaction
|
|
392
|
-
try:
|
|
393
|
-
conn.execute("PRAGMA foreign_keys=OFF")
|
|
394
|
-
tables = [
|
|
395
|
-
row[0]
|
|
396
|
-
for row in conn.execute(
|
|
397
|
-
"SELECT name FROM sqlite_master WHERE type='table' "
|
|
398
|
-
"AND name NOT LIKE 'sqlite_%'"
|
|
399
|
-
).fetchall()
|
|
400
|
-
]
|
|
401
|
-
conn.execute("BEGIN")
|
|
402
|
-
for table in tables:
|
|
403
|
-
# Skip FTS virtual tables — deleting the base table handles them
|
|
404
|
-
if table.endswith(("_fts", "_fts_data", "_fts_idx", "_fts_content",
|
|
405
|
-
"_fts_docsize", "_fts_config")):
|
|
406
|
-
continue
|
|
407
|
-
cur = conn.execute(f"DELETE FROM {table}")
|
|
408
|
-
if cur.rowcount:
|
|
409
|
-
deleted[table] = cur.rowcount
|
|
410
|
-
conn.execute("PRAGMA foreign_keys=ON")
|
|
411
|
-
conn.execute("COMMIT")
|
|
412
|
-
# VACUUM must run in autocommit (no active transaction).
|
|
413
|
-
conn.execute("VACUUM")
|
|
414
|
-
except Exception:
|
|
415
|
-
try:
|
|
416
|
-
conn.execute("ROLLBACK")
|
|
417
|
-
except Exception: # noqa: BLE001
|
|
418
|
-
pass
|
|
419
|
-
conn.close()
|
|
420
|
-
raise
|
|
421
|
-
else:
|
|
422
|
-
conn.close()
|
|
423
|
-
return deleted
|
|
@@ -1,267 +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
|
-
"""LRU cache with optional TTL for search-result caching.
|
|
5
|
-
|
|
6
|
-
Key features:
|
|
7
|
-
* O(1) get / set via ``OrderedDict``
|
|
8
|
-
* Time-to-live expiry per entry
|
|
9
|
-
* Size-based eviction (LRU)
|
|
10
|
-
* Optional thread safety
|
|
11
|
-
* Hit / miss / eviction statistics
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import hashlib
|
|
15
|
-
import json
|
|
16
|
-
import logging
|
|
17
|
-
import time
|
|
18
|
-
from collections import OrderedDict
|
|
19
|
-
from threading import RLock
|
|
20
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger("superlocalmemory.cache")
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class CacheEntry:
|
|
26
|
-
"""Single cache entry with metadata."""
|
|
27
|
-
|
|
28
|
-
__slots__ = ["value", "timestamp", "access_count", "size_estimate"]
|
|
29
|
-
|
|
30
|
-
def __init__(self, value: Any, size_estimate: int = 0) -> None:
|
|
31
|
-
self.value = value
|
|
32
|
-
self.timestamp = time.time()
|
|
33
|
-
self.access_count = 0
|
|
34
|
-
self.size_estimate = size_estimate
|
|
35
|
-
|
|
36
|
-
def is_expired(self, ttl_seconds: Optional[float]) -> bool:
|
|
37
|
-
"""Return ``True`` when the entry has exceeded *ttl_seconds*."""
|
|
38
|
-
if ttl_seconds is None:
|
|
39
|
-
return False
|
|
40
|
-
return (time.time() - self.timestamp) > ttl_seconds
|
|
41
|
-
|
|
42
|
-
def mark_accessed(self) -> None:
|
|
43
|
-
"""Increment access counter."""
|
|
44
|
-
self.access_count += 1
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class CacheManager:
|
|
48
|
-
"""LRU cache manager with TTL support.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
max_size: Maximum number of entries before LRU eviction.
|
|
52
|
-
ttl_seconds: Per-entry time-to-live (``None`` = never expire).
|
|
53
|
-
thread_safe: Wrap operations in a reentrant lock.
|
|
54
|
-
"""
|
|
55
|
-
|
|
56
|
-
def __init__(
|
|
57
|
-
self,
|
|
58
|
-
max_size: int = 100,
|
|
59
|
-
ttl_seconds: Optional[float] = 300,
|
|
60
|
-
thread_safe: bool = False,
|
|
61
|
-
) -> None:
|
|
62
|
-
self.max_size = max(1, max_size)
|
|
63
|
-
self.ttl_seconds = ttl_seconds
|
|
64
|
-
self.thread_safe = thread_safe
|
|
65
|
-
|
|
66
|
-
self._cache: OrderedDict[str, CacheEntry] = OrderedDict()
|
|
67
|
-
self._lock: Optional[RLock] = RLock() if thread_safe else None
|
|
68
|
-
|
|
69
|
-
# Statistics
|
|
70
|
-
self._hits = 0
|
|
71
|
-
self._misses = 0
|
|
72
|
-
self._evictions = 0
|
|
73
|
-
self._total_size_estimate = 0
|
|
74
|
-
|
|
75
|
-
# ------------------------------------------------------------------
|
|
76
|
-
# Key helpers
|
|
77
|
-
# ------------------------------------------------------------------
|
|
78
|
-
|
|
79
|
-
@staticmethod
|
|
80
|
-
def _hash_key(query: str, **kwargs: Any) -> str:
|
|
81
|
-
"""Deterministic cache key from *query* + keyword args."""
|
|
82
|
-
key_data = {"query": query, **kwargs}
|
|
83
|
-
key_str = json.dumps(key_data, sort_keys=True)
|
|
84
|
-
return hashlib.sha256(key_str.encode()).hexdigest()[:16]
|
|
85
|
-
|
|
86
|
-
@staticmethod
|
|
87
|
-
def _estimate_size(value: Any) -> int:
|
|
88
|
-
"""Rough byte-size estimate for analytics."""
|
|
89
|
-
try:
|
|
90
|
-
if isinstance(value, list):
|
|
91
|
-
return len(value) * 100
|
|
92
|
-
return len(json.dumps(value, default=str))
|
|
93
|
-
except Exception:
|
|
94
|
-
return 1000
|
|
95
|
-
|
|
96
|
-
# ------------------------------------------------------------------
|
|
97
|
-
# Core API (simple key-based)
|
|
98
|
-
# ------------------------------------------------------------------
|
|
99
|
-
|
|
100
|
-
def set(self, key: str, value: Any) -> None:
|
|
101
|
-
"""Store *value* under a plain string *key*.
|
|
102
|
-
|
|
103
|
-
This is the simple interface expected by the test suite.
|
|
104
|
-
"""
|
|
105
|
-
self._put_internal(key, value)
|
|
106
|
-
|
|
107
|
-
def get(self, key: str, **kwargs: Any) -> Optional[Any]:
|
|
108
|
-
"""Retrieve value by plain string *key*.
|
|
109
|
-
|
|
110
|
-
Returns ``None`` on cache miss or expiry.
|
|
111
|
-
"""
|
|
112
|
-
if kwargs:
|
|
113
|
-
key = self._hash_key(key, **kwargs)
|
|
114
|
-
return self._get_internal(key)
|
|
115
|
-
|
|
116
|
-
# ------------------------------------------------------------------
|
|
117
|
-
# Query-oriented API (hashed keys)
|
|
118
|
-
# ------------------------------------------------------------------
|
|
119
|
-
|
|
120
|
-
def put(self, query: str, value: Any, **kwargs: Any) -> None:
|
|
121
|
-
"""Store *value* keyed by the hash of *query* + *kwargs*."""
|
|
122
|
-
hashed = self._hash_key(query, **kwargs)
|
|
123
|
-
self._put_internal(hashed, value)
|
|
124
|
-
|
|
125
|
-
def get_by_query(self, query: str, **kwargs: Any) -> Optional[Any]:
|
|
126
|
-
"""Retrieve value keyed by the hash of *query* + *kwargs*."""
|
|
127
|
-
hashed = self._hash_key(query, **kwargs)
|
|
128
|
-
return self._get_internal(hashed)
|
|
129
|
-
|
|
130
|
-
# ------------------------------------------------------------------
|
|
131
|
-
# Internal get / put (shared logic)
|
|
132
|
-
# ------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
def _get_internal(self, key: str) -> Optional[Any]:
|
|
135
|
-
if self._lock:
|
|
136
|
-
self._lock.acquire()
|
|
137
|
-
try:
|
|
138
|
-
if key not in self._cache:
|
|
139
|
-
self._misses += 1
|
|
140
|
-
return None
|
|
141
|
-
|
|
142
|
-
entry = self._cache[key]
|
|
143
|
-
|
|
144
|
-
if entry.is_expired(self.ttl_seconds):
|
|
145
|
-
del self._cache[key]
|
|
146
|
-
self._total_size_estimate -= entry.size_estimate
|
|
147
|
-
self._misses += 1
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
self._cache.move_to_end(key)
|
|
151
|
-
entry.mark_accessed()
|
|
152
|
-
self._hits += 1
|
|
153
|
-
return entry.value
|
|
154
|
-
finally:
|
|
155
|
-
if self._lock:
|
|
156
|
-
self._lock.release()
|
|
157
|
-
|
|
158
|
-
def _put_internal(self, key: str, value: Any) -> None:
|
|
159
|
-
size_estimate = self._estimate_size(value)
|
|
160
|
-
|
|
161
|
-
if self._lock:
|
|
162
|
-
self._lock.acquire()
|
|
163
|
-
try:
|
|
164
|
-
if key in self._cache:
|
|
165
|
-
old = self._cache[key]
|
|
166
|
-
self._total_size_estimate -= old.size_estimate
|
|
167
|
-
del self._cache[key]
|
|
168
|
-
|
|
169
|
-
if len(self._cache) >= self.max_size:
|
|
170
|
-
_, evicted = self._cache.popitem(last=False)
|
|
171
|
-
self._total_size_estimate -= evicted.size_estimate
|
|
172
|
-
self._evictions += 1
|
|
173
|
-
|
|
174
|
-
self._cache[key] = CacheEntry(value, size_estimate)
|
|
175
|
-
self._total_size_estimate += size_estimate
|
|
176
|
-
finally:
|
|
177
|
-
if self._lock:
|
|
178
|
-
self._lock.release()
|
|
179
|
-
|
|
180
|
-
# ------------------------------------------------------------------
|
|
181
|
-
# Maintenance
|
|
182
|
-
# ------------------------------------------------------------------
|
|
183
|
-
|
|
184
|
-
def invalidate(self, query: str, **kwargs: Any) -> bool:
|
|
185
|
-
"""Remove entry for *query*. Returns ``True`` if it existed."""
|
|
186
|
-
key = self._hash_key(query, **kwargs)
|
|
187
|
-
if self._lock:
|
|
188
|
-
self._lock.acquire()
|
|
189
|
-
try:
|
|
190
|
-
if key in self._cache:
|
|
191
|
-
entry = self._cache.pop(key)
|
|
192
|
-
self._total_size_estimate -= entry.size_estimate
|
|
193
|
-
return True
|
|
194
|
-
return False
|
|
195
|
-
finally:
|
|
196
|
-
if self._lock:
|
|
197
|
-
self._lock.release()
|
|
198
|
-
|
|
199
|
-
def clear(self) -> None:
|
|
200
|
-
"""Remove all entries."""
|
|
201
|
-
if self._lock:
|
|
202
|
-
self._lock.acquire()
|
|
203
|
-
try:
|
|
204
|
-
self._cache.clear()
|
|
205
|
-
self._total_size_estimate = 0
|
|
206
|
-
finally:
|
|
207
|
-
if self._lock:
|
|
208
|
-
self._lock.release()
|
|
209
|
-
|
|
210
|
-
def evict_expired(self) -> int:
|
|
211
|
-
"""Manually remove all expired entries. Returns count removed."""
|
|
212
|
-
if self.ttl_seconds is None:
|
|
213
|
-
return 0
|
|
214
|
-
if self._lock:
|
|
215
|
-
self._lock.acquire()
|
|
216
|
-
try:
|
|
217
|
-
expired = [
|
|
218
|
-
k for k, e in self._cache.items()
|
|
219
|
-
if e.is_expired(self.ttl_seconds)
|
|
220
|
-
]
|
|
221
|
-
for k in expired:
|
|
222
|
-
entry = self._cache.pop(k)
|
|
223
|
-
self._total_size_estimate -= entry.size_estimate
|
|
224
|
-
return len(expired)
|
|
225
|
-
finally:
|
|
226
|
-
if self._lock:
|
|
227
|
-
self._lock.release()
|
|
228
|
-
|
|
229
|
-
# ------------------------------------------------------------------
|
|
230
|
-
# Stats
|
|
231
|
-
# ------------------------------------------------------------------
|
|
232
|
-
|
|
233
|
-
def get_stats(self) -> Dict[str, Any]:
|
|
234
|
-
"""Return cache statistics snapshot."""
|
|
235
|
-
total = self._hits + self._misses
|
|
236
|
-
hit_rate = self._hits / total if total > 0 else 0.0
|
|
237
|
-
|
|
238
|
-
avg_access = 0.0
|
|
239
|
-
if self._cache:
|
|
240
|
-
avg_access = sum(e.access_count for e in self._cache.values()) / len(self._cache)
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
"max_size": self.max_size,
|
|
244
|
-
"current_size": len(self._cache),
|
|
245
|
-
"ttl_seconds": self.ttl_seconds,
|
|
246
|
-
"hits": self._hits,
|
|
247
|
-
"misses": self._misses,
|
|
248
|
-
"hit_rate": hit_rate,
|
|
249
|
-
"evictions": self._evictions,
|
|
250
|
-
"total_size_estimate_kb": self._total_size_estimate / 1024,
|
|
251
|
-
"avg_access_count": avg_access,
|
|
252
|
-
"thread_safe": self.thread_safe,
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
def get_top_queries(self, limit: int = 10) -> List[Tuple[str, int]]:
|
|
256
|
-
"""Return the *limit* most-accessed cache keys."""
|
|
257
|
-
if self._lock:
|
|
258
|
-
self._lock.acquire()
|
|
259
|
-
try:
|
|
260
|
-
items = [
|
|
261
|
-
(k, e.access_count) for k, e in self._cache.items()
|
|
262
|
-
]
|
|
263
|
-
items.sort(key=lambda x: x[1], reverse=True)
|
|
264
|
-
return items[:limit]
|
|
265
|
-
finally:
|
|
266
|
-
if self._lock:
|
|
267
|
-
self._lock.release()
|