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,574 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4.22 — LLD-01 §4.1
|
|
4
|
-
|
|
5
|
-
"""Context cache — separate SQLite WAL DB, read-path <10 ms.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Two concerns in one module:
|
|
9
|
-
- Writer (``ContextCache``) — used by the daemon only. Owns pragmas,
|
|
10
|
-
schema bootstrap, install-binding row, LRU sweep.
|
|
11
|
-
- Reader (``read_entry_fast``) — used by the UserPromptSubmit hook.
|
|
12
|
-
Read-only SQLite URI, no pragmas, NEVER raises.
|
|
13
|
-
|
|
14
|
-
Hot-path contract (``read_entry_fast``):
|
|
15
|
-
- stdlib-only imports.
|
|
16
|
-
- Never raises: any exception → returns ``None`` (fail-open miss).
|
|
17
|
-
- Verifies install-binding HMAC to reject a DB at an env-var-hijacked
|
|
18
|
-
path.
|
|
19
|
-
- Applies TTL in SQL, not Python, to avoid fetching stale rows.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
from __future__ import annotations
|
|
23
|
-
|
|
24
|
-
import hashlib
|
|
25
|
-
import hmac
|
|
26
|
-
import json
|
|
27
|
-
import os
|
|
28
|
-
import secrets
|
|
29
|
-
import sqlite3
|
|
30
|
-
import time
|
|
31
|
-
from dataclasses import dataclass, field
|
|
32
|
-
from pathlib import Path
|
|
33
|
-
|
|
34
|
-
from superlocalmemory.core.security_primitives import (
|
|
35
|
-
PathTraversalError,
|
|
36
|
-
ensure_install_token,
|
|
37
|
-
redact_secrets,
|
|
38
|
-
safe_resolve,
|
|
39
|
-
)
|
|
40
|
-
from superlocalmemory.infra.data_root import DynamicStatePath, canonical_data_root
|
|
41
|
-
|
|
42
|
-
CACHE_DB_DEFAULT = DynamicStatePath("active_brain_cache.db")
|
|
43
|
-
INSTALL_TOKEN_DEFAULT = DynamicStatePath(".install_token")
|
|
44
|
-
|
|
45
|
-
TTL_SECONDS: int = 120
|
|
46
|
-
CLEANUP_HORIZON_SECONDS: int = 600
|
|
47
|
-
MAX_BYTES: int = 50 * 1024 * 1024
|
|
48
|
-
MAX_CONTENT_CHARS: int = 4000
|
|
49
|
-
SCHEMA_VERSION: str = "3.4.23"
|
|
50
|
-
|
|
51
|
-
_HMAC_MATERIAL: bytes = b"active_brain_cache"
|
|
52
|
-
_HMAC_HEX_LEN: int = 32
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@dataclass(frozen=True, slots=True)
|
|
56
|
-
class CacheEntry:
|
|
57
|
-
"""Single cache row. ``content`` is expected to be pre-redacted."""
|
|
58
|
-
|
|
59
|
-
session_id: str
|
|
60
|
-
topic_sig: str
|
|
61
|
-
content: str
|
|
62
|
-
fact_ids: list[str] = field(default_factory=list)
|
|
63
|
-
provenance: str = "tool_observation"
|
|
64
|
-
computed_at: int = 0
|
|
65
|
-
byte_size: int = 0
|
|
66
|
-
profile_id: str = "default"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def _active_profile_fallback(home: Path) -> str:
|
|
70
|
-
"""Resolve the active profile for the cache reader hot path (stdlib only,
|
|
71
|
-
never raises). Two profiles can share a session_id, so cached context MUST
|
|
72
|
-
be keyed by profile or one tenant reads another's context."""
|
|
73
|
-
try:
|
|
74
|
-
raw = (home / "profiles.json").read_text(encoding="utf-8")
|
|
75
|
-
return json.loads(raw).get("active_profile", "default") or "default"
|
|
76
|
-
except Exception:
|
|
77
|
-
return "default"
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
# ---------------------------------------------------------------------------
|
|
81
|
-
# Internal helpers
|
|
82
|
-
# ---------------------------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def _expected_binding_hmac(token: str) -> str:
|
|
86
|
-
"""Compute the HMAC-SHA256 first-32-hex value for the install token."""
|
|
87
|
-
return hmac.new(
|
|
88
|
-
token.encode("utf-8"), _HMAC_MATERIAL, hashlib.sha256,
|
|
89
|
-
).hexdigest()[:_HMAC_HEX_LEN]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def _read_install_token(home: Path) -> str | None:
|
|
93
|
-
"""Read the install token without creating it. Returns None if missing."""
|
|
94
|
-
token_path = home / ".install_token"
|
|
95
|
-
if not token_path.exists():
|
|
96
|
-
return None
|
|
97
|
-
try:
|
|
98
|
-
token = token_path.read_text(encoding="utf-8").strip()
|
|
99
|
-
except OSError: # pragma: no cover — disk-IO failure under contention
|
|
100
|
-
return None
|
|
101
|
-
return token or None
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def _ensure_install_token_at(home: Path) -> str:
|
|
105
|
-
"""Create/read the binding token for an explicit cache namespace.
|
|
106
|
-
|
|
107
|
-
The shared security primitive owns the canonical namespace. This bounded
|
|
108
|
-
variant preserves ``home_dir`` as a real override without mutating global
|
|
109
|
-
path state or routing an explicit cache through the canonical token.
|
|
110
|
-
"""
|
|
111
|
-
if home.resolve(strict=False) == canonical_data_root():
|
|
112
|
-
return ensure_install_token()
|
|
113
|
-
|
|
114
|
-
token_path = home / ".install_token"
|
|
115
|
-
try:
|
|
116
|
-
token = token_path.read_text(encoding="utf-8").strip()
|
|
117
|
-
except FileNotFoundError:
|
|
118
|
-
token = ""
|
|
119
|
-
if token:
|
|
120
|
-
return token
|
|
121
|
-
|
|
122
|
-
token = secrets.token_hex(32)
|
|
123
|
-
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
|
|
124
|
-
if hasattr(os, "O_NOFOLLOW"):
|
|
125
|
-
flags |= os.O_NOFOLLOW
|
|
126
|
-
try:
|
|
127
|
-
fd = os.open(str(token_path), flags, 0o600)
|
|
128
|
-
try:
|
|
129
|
-
os.write(fd, token.encode("utf-8"))
|
|
130
|
-
finally:
|
|
131
|
-
os.close(fd)
|
|
132
|
-
except FileExistsError:
|
|
133
|
-
existing = token_path.read_text(encoding="utf-8").strip()
|
|
134
|
-
if existing:
|
|
135
|
-
return existing
|
|
136
|
-
raise RuntimeError(f"install token is empty: {token_path}")
|
|
137
|
-
if os.name != "nt":
|
|
138
|
-
os.chmod(token_path, 0o600)
|
|
139
|
-
return token
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
# ---------------------------------------------------------------------------
|
|
143
|
-
# Writer (daemon-side)
|
|
144
|
-
# ---------------------------------------------------------------------------
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
class ContextCache:
|
|
148
|
-
"""Writer-side cache. One instance per daemon process.
|
|
149
|
-
|
|
150
|
-
Opens the DB with WAL + NORMAL sync + bounded mmap, bootstraps the
|
|
151
|
-
schema, and writes an install-bound HMAC into ``slm_meta`` so the
|
|
152
|
-
reader can reject a foreign DB pointed at via ``SLM_CACHE_DB``.
|
|
153
|
-
"""
|
|
154
|
-
|
|
155
|
-
def __init__(
|
|
156
|
-
self,
|
|
157
|
-
db_path: Path | None = None,
|
|
158
|
-
home_dir: Path | None = None,
|
|
159
|
-
) -> None:
|
|
160
|
-
self._home = Path(home_dir) if home_dir is not None else canonical_data_root()
|
|
161
|
-
self._home.mkdir(parents=True, exist_ok=True)
|
|
162
|
-
|
|
163
|
-
raw = db_path or (
|
|
164
|
-
Path(CACHE_DB_DEFAULT)
|
|
165
|
-
if home_dir is None
|
|
166
|
-
else self._home / "active_brain_cache.db"
|
|
167
|
-
)
|
|
168
|
-
self._db_path = safe_resolve(self._home, Path(raw).name) \
|
|
169
|
-
if Path(raw).parent == self._home else \
|
|
170
|
-
safe_resolve(self._home, raw)
|
|
171
|
-
|
|
172
|
-
self._write_conn = self._open_writer()
|
|
173
|
-
self._bootstrap_schema_and_meta()
|
|
174
|
-
|
|
175
|
-
# -- Open / bootstrap ---------------------------------------------------
|
|
176
|
-
|
|
177
|
-
def _open_writer(self) -> sqlite3.Connection:
|
|
178
|
-
# Pre-create the file with 0600 if it's missing, so sqlite inherits
|
|
179
|
-
# the restrictive mode instead of umask default.
|
|
180
|
-
if not self._db_path.exists():
|
|
181
|
-
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
|
|
182
|
-
if hasattr(os, "O_NOFOLLOW"):
|
|
183
|
-
flags |= os.O_NOFOLLOW
|
|
184
|
-
try:
|
|
185
|
-
fd = os.open(str(self._db_path), flags, 0o600)
|
|
186
|
-
os.close(fd)
|
|
187
|
-
except FileExistsError: # pragma: no cover — race on concurrent start
|
|
188
|
-
pass
|
|
189
|
-
# On POSIX, enforce mode in case an earlier process created it.
|
|
190
|
-
if os.name != "nt":
|
|
191
|
-
try:
|
|
192
|
-
os.chmod(self._db_path, 0o600)
|
|
193
|
-
except OSError: # pragma: no cover — remote FS without chmod
|
|
194
|
-
pass
|
|
195
|
-
|
|
196
|
-
conn = sqlite3.connect(
|
|
197
|
-
str(self._db_path), isolation_level=None, timeout=5.0,
|
|
198
|
-
)
|
|
199
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
200
|
-
conn.execute("PRAGMA synchronous=NORMAL")
|
|
201
|
-
conn.execute("PRAGMA temp_store=MEMORY")
|
|
202
|
-
conn.execute("PRAGMA cache_size=-32768")
|
|
203
|
-
conn.execute("PRAGMA busy_timeout=500")
|
|
204
|
-
# 64 MB writer mmap — reader opens with defaults to keep budget tight.
|
|
205
|
-
try:
|
|
206
|
-
conn.execute("PRAGMA mmap_size=67108864")
|
|
207
|
-
except sqlite3.Error: # pragma: no cover — some builds disable mmap
|
|
208
|
-
pass
|
|
209
|
-
return conn
|
|
210
|
-
|
|
211
|
-
def _bootstrap_schema_and_meta(self) -> None:
|
|
212
|
-
# Isolation: cached context is keyed by profile so two tenants sharing a
|
|
213
|
-
# session_id cannot read each other's context. Older cache files lack
|
|
214
|
-
# the profile_id column — the cache is ephemeral (120s TTL), so drop and
|
|
215
|
-
# recreate rather than run a rebuild migration.
|
|
216
|
-
try:
|
|
217
|
-
cols = {
|
|
218
|
-
r[1] for r in self._write_conn.execute(
|
|
219
|
-
"PRAGMA table_info(context_entries)"
|
|
220
|
-
).fetchall()
|
|
221
|
-
}
|
|
222
|
-
if cols and "profile_id" not in cols:
|
|
223
|
-
self._write_conn.execute("DROP TABLE context_entries")
|
|
224
|
-
except sqlite3.Error: # pragma: no cover — defensive
|
|
225
|
-
pass
|
|
226
|
-
self._write_conn.executescript(
|
|
227
|
-
"""
|
|
228
|
-
CREATE TABLE IF NOT EXISTS context_entries (
|
|
229
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
230
|
-
session_id TEXT NOT NULL,
|
|
231
|
-
topic_sig TEXT NOT NULL,
|
|
232
|
-
content TEXT NOT NULL,
|
|
233
|
-
fact_ids TEXT NOT NULL,
|
|
234
|
-
provenance TEXT NOT NULL DEFAULT 'tool_observation',
|
|
235
|
-
computed_at INTEGER NOT NULL,
|
|
236
|
-
byte_size INTEGER NOT NULL,
|
|
237
|
-
PRIMARY KEY (profile_id, session_id, topic_sig)
|
|
238
|
-
) WITHOUT ROWID;
|
|
239
|
-
|
|
240
|
-
CREATE INDEX IF NOT EXISTS idx_ctx_session_time
|
|
241
|
-
ON context_entries(profile_id, session_id, computed_at);
|
|
242
|
-
CREATE INDEX IF NOT EXISTS idx_ctx_time
|
|
243
|
-
ON context_entries(computed_at);
|
|
244
|
-
|
|
245
|
-
CREATE TABLE IF NOT EXISTS slm_meta (
|
|
246
|
-
key TEXT PRIMARY KEY,
|
|
247
|
-
value TEXT NOT NULL,
|
|
248
|
-
created_at INTEGER NOT NULL
|
|
249
|
-
);
|
|
250
|
-
"""
|
|
251
|
-
)
|
|
252
|
-
token = _ensure_install_token_at(self._home)
|
|
253
|
-
now = int(time.time())
|
|
254
|
-
self._write_conn.execute(
|
|
255
|
-
"INSERT OR IGNORE INTO slm_meta (key, value, created_at) "
|
|
256
|
-
"VALUES (?, ?, ?)",
|
|
257
|
-
("install_token_hmac", _expected_binding_hmac(token), now),
|
|
258
|
-
)
|
|
259
|
-
self._write_conn.execute(
|
|
260
|
-
"INSERT OR IGNORE INTO slm_meta (key, value, created_at) "
|
|
261
|
-
"VALUES (?, ?, ?)",
|
|
262
|
-
("schema_version", SCHEMA_VERSION, now),
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
# -- Write path ---------------------------------------------------------
|
|
266
|
-
|
|
267
|
-
def upsert(self, entry: CacheEntry) -> None:
|
|
268
|
-
"""Insert-or-replace a cache row.
|
|
269
|
-
|
|
270
|
-
Content is redacted (belt-and-suspenders — caller should have done
|
|
271
|
-
this already per LLD-07 §6.3) and truncated. Byte size is computed
|
|
272
|
-
here, not trusted from caller, so LRU accounting stays accurate.
|
|
273
|
-
Does NOT run LRU sweep inline (PERF-01-07) — that's a background
|
|
274
|
-
task on the daemon.
|
|
275
|
-
"""
|
|
276
|
-
# v3.6.12 (redact-1): scrub dashboard/cached content at HIGH aggression
|
|
277
|
-
# so Bearer/GitHub-PAT/Anthropic/OpenAI/GENERIC_KEY patterns are caught
|
|
278
|
-
# (the default 'normal' skipped them, leaking those shapes to the UI).
|
|
279
|
-
content = redact_secrets(entry.content, aggression="high")[:MAX_CONTENT_CHARS]
|
|
280
|
-
fact_ids_json = json.dumps(list(entry.fact_ids))
|
|
281
|
-
byte_size = (
|
|
282
|
-
len(content.encode("utf-8"))
|
|
283
|
-
+ len(fact_ids_json)
|
|
284
|
-
+ len(entry.session_id)
|
|
285
|
-
+ len(entry.topic_sig)
|
|
286
|
-
)
|
|
287
|
-
computed_at = entry.computed_at or int(time.time())
|
|
288
|
-
self._write_conn.execute(
|
|
289
|
-
"""
|
|
290
|
-
INSERT OR REPLACE INTO context_entries
|
|
291
|
-
(profile_id, session_id, topic_sig, content, fact_ids,
|
|
292
|
-
provenance, computed_at, byte_size)
|
|
293
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
294
|
-
""",
|
|
295
|
-
(entry.profile_id or "default", entry.session_id, entry.topic_sig,
|
|
296
|
-
content, fact_ids_json, entry.provenance, computed_at, byte_size),
|
|
297
|
-
)
|
|
298
|
-
|
|
299
|
-
# -- Cleanup ------------------------------------------------------------
|
|
300
|
-
|
|
301
|
-
def cleanup_session(
|
|
302
|
-
self, session_id: str, *, older_than: int = CLEANUP_HORIZON_SECONDS,
|
|
303
|
-
profile_id: str | None = None,
|
|
304
|
-
) -> int:
|
|
305
|
-
"""Delete rows for ``session_id`` older than ``older_than`` seconds.
|
|
306
|
-
|
|
307
|
-
When ``profile_id`` is given the delete is tenant-scoped so a cleanup on
|
|
308
|
-
a shared session_id cannot wipe another profile's cached context.
|
|
309
|
-
"""
|
|
310
|
-
cutoff = int(time.time()) - older_than
|
|
311
|
-
if profile_id is not None:
|
|
312
|
-
cur = self._write_conn.execute(
|
|
313
|
-
"DELETE FROM context_entries "
|
|
314
|
-
"WHERE profile_id=? AND session_id=? AND computed_at < ?",
|
|
315
|
-
(profile_id, session_id, cutoff),
|
|
316
|
-
)
|
|
317
|
-
else:
|
|
318
|
-
cur = self._write_conn.execute(
|
|
319
|
-
"DELETE FROM context_entries "
|
|
320
|
-
"WHERE session_id=? AND computed_at < ?",
|
|
321
|
-
(session_id, cutoff),
|
|
322
|
-
)
|
|
323
|
-
return cur.rowcount
|
|
324
|
-
|
|
325
|
-
def cleanup_global_lru(self) -> int:
|
|
326
|
-
"""Background sweep — runs every 60s in the daemon.
|
|
327
|
-
|
|
328
|
-
Two passes:
|
|
329
|
-
1. Time-based — delete rows older than ``CLEANUP_HORIZON_SECONDS``.
|
|
330
|
-
2. Byte-based — if total size still exceeds ``MAX_BYTES``, delete
|
|
331
|
-
oldest rows (by ``computed_at``) until total is <= 90% of cap.
|
|
332
|
-
Returns total deletions.
|
|
333
|
-
"""
|
|
334
|
-
cutoff = int(time.time()) - CLEANUP_HORIZON_SECONDS
|
|
335
|
-
cur = self._write_conn.execute(
|
|
336
|
-
"DELETE FROM context_entries WHERE computed_at < ?", (cutoff,),
|
|
337
|
-
)
|
|
338
|
-
deleted = cur.rowcount
|
|
339
|
-
|
|
340
|
-
total = self._write_conn.execute(
|
|
341
|
-
"SELECT COALESCE(SUM(byte_size), 0) FROM context_entries",
|
|
342
|
-
).fetchone()[0]
|
|
343
|
-
if total <= MAX_BYTES:
|
|
344
|
-
return deleted
|
|
345
|
-
|
|
346
|
-
target = int(MAX_BYTES * 0.9)
|
|
347
|
-
while total > target:
|
|
348
|
-
rows = self._write_conn.execute(
|
|
349
|
-
"SELECT profile_id, session_id, topic_sig, byte_size "
|
|
350
|
-
"FROM context_entries "
|
|
351
|
-
"ORDER BY computed_at ASC LIMIT 100",
|
|
352
|
-
).fetchall()
|
|
353
|
-
if not rows: # pragma: no cover — reached only if table empties mid-sweep
|
|
354
|
-
break
|
|
355
|
-
for pid, sess, sig, size in rows:
|
|
356
|
-
self._write_conn.execute(
|
|
357
|
-
"DELETE FROM context_entries "
|
|
358
|
-
"WHERE profile_id=? AND session_id=? AND topic_sig=?",
|
|
359
|
-
(pid, sess, sig),
|
|
360
|
-
)
|
|
361
|
-
deleted += 1
|
|
362
|
-
total -= size
|
|
363
|
-
if total <= target:
|
|
364
|
-
break
|
|
365
|
-
return deleted
|
|
366
|
-
|
|
367
|
-
def close(self) -> None:
|
|
368
|
-
try:
|
|
369
|
-
self._write_conn.close()
|
|
370
|
-
except sqlite3.Error: # pragma: no cover — defensive
|
|
371
|
-
pass
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
# ---------------------------------------------------------------------------
|
|
375
|
-
# Reader (hook-side hot path — NEVER raises)
|
|
376
|
-
# ---------------------------------------------------------------------------
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
def read_entry_fast(
|
|
380
|
-
session_id: str,
|
|
381
|
-
topic_sig: str,
|
|
382
|
-
*,
|
|
383
|
-
db_path: Path | None = None,
|
|
384
|
-
home_dir: Path | None = None,
|
|
385
|
-
profile_id: str | None = None,
|
|
386
|
-
require_current_admission: bool = False,
|
|
387
|
-
) -> CacheEntry | None:
|
|
388
|
-
"""Hot-path reader used by the UserPromptSubmit hook.
|
|
389
|
-
|
|
390
|
-
Contract (LLD-01 §4.1):
|
|
391
|
-
- NEVER raises. Any exception → returns ``None``.
|
|
392
|
-
- Returns ``None`` on miss, stale (TTL exceeded), missing DB, path
|
|
393
|
-
traversal attempt, or failed install-binding check.
|
|
394
|
-
- Opens the SQLite file read-only via ``?mode=ro`` URI.
|
|
395
|
-
- stdlib-only — no heavy imports, no daemon HTTP call.
|
|
396
|
-
"""
|
|
397
|
-
try:
|
|
398
|
-
home = Path(home_dir) if home_dir is not None else canonical_data_root()
|
|
399
|
-
if not home.exists():
|
|
400
|
-
return None
|
|
401
|
-
|
|
402
|
-
requested = db_path or Path(
|
|
403
|
-
os.environ.get("SLM_CACHE_DB")
|
|
404
|
-
or (
|
|
405
|
-
Path(CACHE_DB_DEFAULT)
|
|
406
|
-
if home_dir is None
|
|
407
|
-
else home / "active_brain_cache.db"
|
|
408
|
-
),
|
|
409
|
-
)
|
|
410
|
-
try:
|
|
411
|
-
resolved = safe_resolve(home, Path(requested).resolve())
|
|
412
|
-
except (PathTraversalError, OSError, ValueError):
|
|
413
|
-
return None
|
|
414
|
-
|
|
415
|
-
if not resolved.exists():
|
|
416
|
-
return None
|
|
417
|
-
|
|
418
|
-
token = _read_install_token(home)
|
|
419
|
-
if token is None:
|
|
420
|
-
return None
|
|
421
|
-
|
|
422
|
-
# Read-only URI connection. Short timeout so busy WAL doesn't stall
|
|
423
|
-
# the hot path.
|
|
424
|
-
conn = sqlite3.connect(
|
|
425
|
-
f"file:{resolved}?mode=ro", uri=True, timeout=0.5,
|
|
426
|
-
)
|
|
427
|
-
try:
|
|
428
|
-
# Verify install binding first — cheap SELECT.
|
|
429
|
-
row = conn.execute(
|
|
430
|
-
"SELECT value FROM slm_meta WHERE key='install_token_hmac'",
|
|
431
|
-
).fetchone()
|
|
432
|
-
if row is None:
|
|
433
|
-
return None
|
|
434
|
-
expected = _expected_binding_hmac(token)
|
|
435
|
-
if not hmac.compare_digest(row[0], expected):
|
|
436
|
-
return None
|
|
437
|
-
|
|
438
|
-
now = int(time.time())
|
|
439
|
-
# Scope to the active profile so a shared session_id cannot read
|
|
440
|
-
# another tenant's cached context.
|
|
441
|
-
pid = profile_id or _active_profile_fallback(home)
|
|
442
|
-
row = conn.execute(
|
|
443
|
-
"""
|
|
444
|
-
SELECT content, fact_ids, provenance, computed_at, byte_size
|
|
445
|
-
FROM context_entries
|
|
446
|
-
WHERE profile_id=? AND session_id=? AND topic_sig=?
|
|
447
|
-
AND computed_at > ?
|
|
448
|
-
""",
|
|
449
|
-
(pid, session_id, topic_sig, now - TTL_SECONDS),
|
|
450
|
-
).fetchone()
|
|
451
|
-
finally:
|
|
452
|
-
try:
|
|
453
|
-
conn.close()
|
|
454
|
-
except sqlite3.Error: # pragma: no cover — defensive
|
|
455
|
-
pass
|
|
456
|
-
|
|
457
|
-
if row is None:
|
|
458
|
-
return None
|
|
459
|
-
|
|
460
|
-
try:
|
|
461
|
-
fact_ids = json.loads(row[1])
|
|
462
|
-
if not isinstance(fact_ids, list):
|
|
463
|
-
fact_ids = []
|
|
464
|
-
except (ValueError, TypeError):
|
|
465
|
-
fact_ids = []
|
|
466
|
-
|
|
467
|
-
entry = CacheEntry(
|
|
468
|
-
session_id=session_id,
|
|
469
|
-
topic_sig=topic_sig,
|
|
470
|
-
content=row[0],
|
|
471
|
-
fact_ids=fact_ids,
|
|
472
|
-
provenance=row[2],
|
|
473
|
-
computed_at=int(row[3]),
|
|
474
|
-
byte_size=int(row[4]),
|
|
475
|
-
)
|
|
476
|
-
if require_current_admission and not _cache_fact_ids_are_current(home, entry.fact_ids):
|
|
477
|
-
return None
|
|
478
|
-
return entry
|
|
479
|
-
except Exception: # pragma: no cover — last-resort fail-open
|
|
480
|
-
return None
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
def _cache_fact_ids_are_current(home: Path, fact_ids: list[str]) -> bool:
|
|
484
|
-
"""Prove cached source IDs remain current without loading the engine.
|
|
485
|
-
|
|
486
|
-
This is a cache-hit-only backstop for review-gated corrections. It uses a
|
|
487
|
-
small read-only SQLite query and treats any unavailable or malformed memory
|
|
488
|
-
state as a cache miss. Normal recall remains the authority after a miss.
|
|
489
|
-
"""
|
|
490
|
-
if not fact_ids or not all(isinstance(fact_id, str) and fact_id for fact_id in fact_ids):
|
|
491
|
-
return False
|
|
492
|
-
memory_path = home / "memory.db"
|
|
493
|
-
if not memory_path.exists():
|
|
494
|
-
return False
|
|
495
|
-
try:
|
|
496
|
-
conn = sqlite3.connect(f"file:{memory_path}?mode=ro", uri=True, timeout=0.25)
|
|
497
|
-
try:
|
|
498
|
-
placeholders = ",".join("?" for _ in fact_ids)
|
|
499
|
-
tables = {
|
|
500
|
-
row[0]
|
|
501
|
-
for row in conn.execute(
|
|
502
|
-
"SELECT name FROM sqlite_master WHERE type='table' "
|
|
503
|
-
"AND name IN ('atomic_facts', 'fact_temporal_validity', 'correction_cases')"
|
|
504
|
-
)
|
|
505
|
-
}
|
|
506
|
-
if {"atomic_facts", "fact_temporal_validity"} - tables:
|
|
507
|
-
return False
|
|
508
|
-
correction_join = ""
|
|
509
|
-
correction_bad = "0"
|
|
510
|
-
if "correction_cases" in tables:
|
|
511
|
-
correction_join = (
|
|
512
|
-
" LEFT JOIN correction_cases cc ON cc.successor_fact_id=f.fact_id "
|
|
513
|
-
"AND cc.status IN ('proposed', 'rejected', 'rolled_back')"
|
|
514
|
-
)
|
|
515
|
-
correction_bad = "cc.successor_fact_id IS NOT NULL"
|
|
516
|
-
rows = conn.execute(
|
|
517
|
-
"SELECT f.fact_id, tv.system_expired_at, " + correction_bad + " AS correction_blocked "
|
|
518
|
-
"FROM atomic_facts f "
|
|
519
|
-
"LEFT JOIN fact_temporal_validity tv ON tv.fact_id=f.fact_id "
|
|
520
|
-
"AND tv.profile_id=f.profile_id "
|
|
521
|
-
+ correction_join
|
|
522
|
-
+ f" WHERE f.fact_id IN ({placeholders})",
|
|
523
|
-
tuple(fact_ids),
|
|
524
|
-
).fetchall()
|
|
525
|
-
finally:
|
|
526
|
-
conn.close()
|
|
527
|
-
except sqlite3.Error:
|
|
528
|
-
return False
|
|
529
|
-
found = {str(row[0]) for row in rows}
|
|
530
|
-
return (
|
|
531
|
-
found == set(fact_ids)
|
|
532
|
-
and all(row[1] is None and not bool(row[2]) for row in rows)
|
|
533
|
-
)
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
def purge_profile_from_cache_db(db_path: Path, profile_id: str) -> int:
|
|
537
|
-
"""Delete all ``context_entries`` rows for *profile_id* from a cache DB file.
|
|
538
|
-
|
|
539
|
-
Opens the file with a direct write connection (no URI, no read-only flag)
|
|
540
|
-
so it works even when the daemon is not running. Returns the number of rows
|
|
541
|
-
deleted. Never raises — any error returns 0 so callers can remain
|
|
542
|
-
fail-open.
|
|
543
|
-
"""
|
|
544
|
-
try:
|
|
545
|
-
if not Path(db_path).exists():
|
|
546
|
-
return 0
|
|
547
|
-
conn = sqlite3.connect(str(db_path), isolation_level=None, timeout=2.0)
|
|
548
|
-
try:
|
|
549
|
-
cur = conn.execute(
|
|
550
|
-
"DELETE FROM context_entries WHERE profile_id = ?",
|
|
551
|
-
(profile_id,),
|
|
552
|
-
)
|
|
553
|
-
return cur.rowcount
|
|
554
|
-
finally:
|
|
555
|
-
try:
|
|
556
|
-
conn.close()
|
|
557
|
-
except sqlite3.Error:
|
|
558
|
-
pass
|
|
559
|
-
except Exception:
|
|
560
|
-
return 0
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
__all__ = (
|
|
564
|
-
"CACHE_DB_DEFAULT",
|
|
565
|
-
"CLEANUP_HORIZON_SECONDS",
|
|
566
|
-
"CacheEntry",
|
|
567
|
-
"ContextCache",
|
|
568
|
-
"MAX_BYTES",
|
|
569
|
-
"MAX_CONTENT_CHARS",
|
|
570
|
-
"SCHEMA_VERSION",
|
|
571
|
-
"TTL_SECONDS",
|
|
572
|
-
"purge_profile_from_cache_db",
|
|
573
|
-
"read_entry_fast",
|
|
574
|
-
)
|