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,98 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Which session ids name a conversation, and which were invented for one call.
|
|
5
|
-
|
|
6
|
-
TWO DIFFERENT JOBS, ONE STRING
|
|
7
|
-
------------------------------
|
|
8
|
-
A session id is used for two unrelated things:
|
|
9
|
-
|
|
10
|
-
1. **Bookkeeping.** A recall needs *some* handle so a downstream reference can be
|
|
11
|
-
traced back to it. Any unique string does. When a caller supplies none, the
|
|
12
|
-
HTTP and MCP fronts invent one — ``http:<milliseconds>`` per request, or
|
|
13
|
-
``mcp:<agent_id>`` per client.
|
|
14
|
-
|
|
15
|
-
2. **Continuity.** The working set carries what a conversation was recently
|
|
16
|
-
shown into its next turn. That needs an id that actually identifies a
|
|
17
|
-
conversation, because it decides what gets ranked higher.
|
|
18
|
-
|
|
19
|
-
An invented id is fine for the first and wrong for the second, and the two are
|
|
20
|
-
wrong in opposite directions:
|
|
21
|
-
|
|
22
|
-
* ``http:<ms>`` is unique per request, so every dashboard search registered a
|
|
23
|
-
new working set. Enough of them and the registry hits its cap and evicts the
|
|
24
|
-
least-recently-touched entry — which is a real conversation sitting idle
|
|
25
|
-
between turns. The next turn of that conversation is cold, with no error.
|
|
26
|
-
* ``mcp:<agent_id>`` is SHARED by every client that did not send an id, so two
|
|
27
|
-
unrelated clients pooled one seven-slot set and promoted each other's
|
|
28
|
-
memories.
|
|
29
|
-
|
|
30
|
-
Neither mattered while the parameter was ignored, which it was until continuity
|
|
31
|
-
was built on it. That is what made this easy to miss.
|
|
32
|
-
|
|
33
|
-
ONE DEFINITION
|
|
34
|
-
--------------
|
|
35
|
-
Both the creators and the reader use this module, so a new front cannot invent a
|
|
36
|
-
third prefix that continuity silently accepts. Two lists of the same thing is how
|
|
37
|
-
one ends up wrong.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
from __future__ import annotations
|
|
41
|
-
|
|
42
|
-
__all__ = [
|
|
43
|
-
"SYNTHETIC_PREFIXES",
|
|
44
|
-
"is_conversation",
|
|
45
|
-
"synthetic_session_id",
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
#: Prefixes marking an id that a front invented rather than received.
|
|
49
|
-
#:
|
|
50
|
-
#: The colon is deliberate: a real client id is a uuid or a hex string and does
|
|
51
|
-
#: not contain one, so a genuine id cannot be mistaken for an invented one.
|
|
52
|
-
#: ``engine:`` names the daemon process itself, not a caller. It is shared by
|
|
53
|
-
#: every client that reaches one daemon and changes on every restart, so it is
|
|
54
|
-
#: synthetic in exactly the way this module exists to catch: it was minted by
|
|
55
|
-
#: hand in ``core/engine.py`` rather than through ``synthetic_session_id``, and
|
|
56
|
-
#: so passed ``is_conversation`` for as long as it existed. While it did, every
|
|
57
|
-
#: recall that named no session filed its outcome under a process id that no
|
|
58
|
-
#: tool event could ever carry, and the reward pipeline had nothing to join on.
|
|
59
|
-
#: ``agent:`` and ``api:`` name the calling agent and the workspace, and are
|
|
60
|
-
#: shared by every request from either — ``agent:mcp_client`` alone held 24
|
|
61
|
-
#: outcomes from unrelated callers. Both were hand-minted in
|
|
62
|
-
#: ``server/routes/v3_api.py``, which is why neither was listed here.
|
|
63
|
-
SYNTHETIC_PREFIXES: tuple[str, ...] = (
|
|
64
|
-
"http:", "mcp:", "cli:", "probe:", "engine:", "agent:", "api:",
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def synthetic_session_id(kind: str, discriminator: str = "") -> str:
|
|
69
|
-
"""Build an id for bookkeeping that continuity will correctly ignore.
|
|
70
|
-
|
|
71
|
-
``kind`` names the front that invented it, so a log line says where an
|
|
72
|
-
unattributed recall came from.
|
|
73
|
-
"""
|
|
74
|
-
prefix = kind if kind.endswith(":") else f"{kind}:"
|
|
75
|
-
return f"{prefix}{discriminator}"
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def is_conversation(
|
|
79
|
-
session_id: str | None, profile_id: str | None = None,
|
|
80
|
-
) -> bool:
|
|
81
|
-
"""Whether this pair identifies a conversation across turns.
|
|
82
|
-
|
|
83
|
-
False for an empty id and for anything a front invented. Continuity engages
|
|
84
|
-
only when this is True, so the default for an unidentified caller is the
|
|
85
|
-
behaviour that existed before continuity: every recall starts cold.
|
|
86
|
-
|
|
87
|
-
``profile_id`` is checked too when given. The working set is keyed on both,
|
|
88
|
-
and an empty profile is not a profile: ``None`` and ``""`` would normalise to
|
|
89
|
-
the same key, so two unidentified callers sharing a session id would share
|
|
90
|
-
one set. Every caller in this codebase resolves a real profile before
|
|
91
|
-
reaching here, which is exactly why the aliasing would go unnoticed if it
|
|
92
|
-
ever stopped being true.
|
|
93
|
-
"""
|
|
94
|
-
if not session_id:
|
|
95
|
-
return False
|
|
96
|
-
if profile_id is not None and not profile_id:
|
|
97
|
-
return False
|
|
98
|
-
return not session_id.startswith(SYNTHETIC_PREFIXES)
|
|
@@ -1,319 +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 — Stage 8 SB-1 / Track A.3 (LLD-10)
|
|
4
|
-
|
|
5
|
-
"""Daemon-resident recall-time A/B router for LLD-10 shadow + rollback.
|
|
6
|
-
|
|
7
|
-
This module is the single seam that wires ``ShadowTest`` (pre-promotion)
|
|
8
|
-
and ``ModelRollback`` (post-promotion) into the live recall path. Before
|
|
9
|
-
this module existed (pre-v3.4.22 Stage 8 SB-1) both classes were
|
|
10
|
-
defined + unit-tested but had zero production callers in ``src/``.
|
|
11
|
-
|
|
12
|
-
Design constraints:
|
|
13
|
-
|
|
14
|
-
* Process-local state only — one ``ShadowRouter`` instance per
|
|
15
|
-
``(memory_db, learning_db, profile_id)`` tuple, held by the
|
|
16
|
-
daemon's in-process singleton cache.
|
|
17
|
-
* Deterministic A/B routing — ``route_query(qid)`` uses
|
|
18
|
-
``sha256(install_token + qid)`` so an attacker who controls
|
|
19
|
-
``qid`` still cannot bias the split without reading the install
|
|
20
|
-
token on disk (closes skeptic H-02 + H-03).
|
|
21
|
-
* Promotion and rollback are DELEGATED to the canonical helpers in
|
|
22
|
-
``learning/consolidation_worker`` and ``learning/model_rollback``.
|
|
23
|
-
The router never writes to ``learning_model_state`` directly.
|
|
24
|
-
* Fail-soft: any exception during recall-time ingestion is logged
|
|
25
|
-
and swallowed — we must not break the user's recall path.
|
|
26
|
-
|
|
27
|
-
References:
|
|
28
|
-
- LLD-00 §8 — two-phase shadow + auto-rollback.
|
|
29
|
-
- LLD-10 §4.1 — deterministic A/B routing.
|
|
30
|
-
- LLD-10 §5 — atomic BEGIN IMMEDIATE promotion + rollback.
|
|
31
|
-
- Stage 8 SB-1 — architect S8-ARC-C1, skeptic C-01/C-02/H-07.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from __future__ import annotations
|
|
35
|
-
|
|
36
|
-
import hashlib
|
|
37
|
-
import logging
|
|
38
|
-
import threading
|
|
39
|
-
from typing import Final
|
|
40
|
-
|
|
41
|
-
from superlocalmemory.core.security_primitives import ensure_install_token
|
|
42
|
-
from superlocalmemory.learning.model_rollback import ModelRollback
|
|
43
|
-
from superlocalmemory.learning.shadow_test import ShadowTest
|
|
44
|
-
|
|
45
|
-
logger = logging.getLogger(__name__)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# ---------------------------------------------------------------------------
|
|
49
|
-
# Arm vocabulary — externalised so hooks can grep-check.
|
|
50
|
-
# ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
ARM_BASELINE: Final[str] = "baseline"
|
|
53
|
-
ARM_CANDIDATE: Final[str] = "candidate"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
class ShadowRouter:
|
|
57
|
-
"""Per-profile A/B router + post-promotion watcher.
|
|
58
|
-
|
|
59
|
-
Not thread-safe for write state (`_shadow`, `_rollback`) — the daemon
|
|
60
|
-
calls ``on_recall_settled`` from a single recall-settled worker queue.
|
|
61
|
-
Reads (``route_query``) are safe under concurrency.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
def __init__(
|
|
65
|
-
self,
|
|
66
|
-
*,
|
|
67
|
-
memory_db: str,
|
|
68
|
-
learning_db: str,
|
|
69
|
-
profile_id: str,
|
|
70
|
-
) -> None:
|
|
71
|
-
self._memory_db = str(memory_db)
|
|
72
|
-
self._learning_db = str(learning_db)
|
|
73
|
-
self._profile_id = str(profile_id)
|
|
74
|
-
# Shadow pre-promotion accumulator (created lazily when a
|
|
75
|
-
# candidate is persisted).
|
|
76
|
-
self._shadow: ShadowTest | None = None
|
|
77
|
-
self._candidate_id: int | None = None
|
|
78
|
-
# S9-SKEP-11: pin the routing token at router creation.
|
|
79
|
-
# ``install_token`` rotation is a documented user action (SEC-M07
|
|
80
|
-
# ``slm escape-hatch rotate-token``) but must not flip the arm
|
|
81
|
-
# assignment of every in-flight query_id — that would silently
|
|
82
|
-
# mix baseline and candidate observations for the same qid and
|
|
83
|
-
# break the paired-t assumption. We snapshot the token once at
|
|
84
|
-
# init; subsequent rotations are picked up only when a new
|
|
85
|
-
# router is created (i.e. at daemon restart / candidate rotate).
|
|
86
|
-
try:
|
|
87
|
-
self._routing_token = ensure_install_token()
|
|
88
|
-
except Exception: # pragma: no cover — defensive
|
|
89
|
-
self._routing_token = ""
|
|
90
|
-
# Rollback post-promotion watcher (created when arm_post_promotion
|
|
91
|
-
# is called after a promote).
|
|
92
|
-
self._rollback: ModelRollback | None = None
|
|
93
|
-
# S9-W4 H-ARC-01: re-attach an existing candidate across daemon
|
|
94
|
-
# restart. The prior implementation lost the candidate_id on
|
|
95
|
-
# process exit — a 6-hour shadow test that had persisted a
|
|
96
|
-
# candidate an hour in would restart the observation window
|
|
97
|
-
# from zero on the next boot, extending the test indefinitely.
|
|
98
|
-
# Observations themselves do NOT survive restart (they live
|
|
99
|
-
# only in ``ShadowTest._active/_candidate`` lists and would
|
|
100
|
-
# require a new schema to persist durably); re-attaching the
|
|
101
|
-
# candidate_id is the minimum that keeps the A/B loop from
|
|
102
|
-
# silently stalling.
|
|
103
|
-
self._reattach_existing_candidate()
|
|
104
|
-
|
|
105
|
-
def _reattach_existing_candidate(self) -> None:
|
|
106
|
-
"""H-ARC-01: look up any ``is_candidate=1`` row for this profile
|
|
107
|
-
and restore ``self._candidate_id`` + a fresh ``ShadowTest``.
|
|
108
|
-
|
|
109
|
-
Fail-soft — on any DB error we leave the router empty and the
|
|
110
|
-
normal lazy-init path takes over as candidates land.
|
|
111
|
-
"""
|
|
112
|
-
try:
|
|
113
|
-
import sqlite3 as _sq
|
|
114
|
-
conn = _sq.connect(self._learning_db, timeout=2.0)
|
|
115
|
-
try:
|
|
116
|
-
row = conn.execute(
|
|
117
|
-
"SELECT id FROM learning_model_state "
|
|
118
|
-
"WHERE profile_id = ? AND is_candidate = 1 "
|
|
119
|
-
"LIMIT 1",
|
|
120
|
-
(self._profile_id,),
|
|
121
|
-
).fetchone()
|
|
122
|
-
finally:
|
|
123
|
-
conn.close()
|
|
124
|
-
except Exception:
|
|
125
|
-
return # learning.db or table missing — normal cold start.
|
|
126
|
-
if row and row[0] is not None:
|
|
127
|
-
cid = int(row[0])
|
|
128
|
-
self._candidate_id = cid
|
|
129
|
-
# Pass learning_db so ShadowTest reloads persisted paired
|
|
130
|
-
# observations from ``shadow_observations`` (M012).
|
|
131
|
-
self._shadow = ShadowTest(
|
|
132
|
-
profile_id=self._profile_id,
|
|
133
|
-
candidate_model_id=str(cid),
|
|
134
|
-
learning_db=self._learning_db,
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
# ------------------------------------------------------------------
|
|
138
|
-
# Routing
|
|
139
|
-
# ------------------------------------------------------------------
|
|
140
|
-
|
|
141
|
-
def route_query(self, query_id: str) -> str:
|
|
142
|
-
"""Return the arm for ``query_id``: ``'baseline'`` or ``'candidate'``.
|
|
143
|
-
|
|
144
|
-
Deterministic per ``(install_token, query_id)`` — survives
|
|
145
|
-
daemon restart. Install-token dependence closes the
|
|
146
|
-
attacker-picks-query-id bias vector (skeptic H-02).
|
|
147
|
-
|
|
148
|
-
S9-SKEP-11: uses ``self._routing_token`` (pinned at router
|
|
149
|
-
init) instead of a fresh ``ensure_install_token()`` per call,
|
|
150
|
-
so mid-test token rotation does not silently flip the arm of
|
|
151
|
-
every subsequent qid and mix the paired-t arms.
|
|
152
|
-
"""
|
|
153
|
-
digest = hashlib.sha256(
|
|
154
|
-
(self._routing_token + str(query_id)).encode("utf-8"),
|
|
155
|
-
).hexdigest()[:8]
|
|
156
|
-
return ARM_CANDIDATE if int(digest, 16) % 2 == 1 else ARM_BASELINE
|
|
157
|
-
|
|
158
|
-
# ------------------------------------------------------------------
|
|
159
|
-
# Pre-promotion accumulator
|
|
160
|
-
# ------------------------------------------------------------------
|
|
161
|
-
|
|
162
|
-
def attach_candidate(self, candidate_id: int) -> None:
|
|
163
|
-
"""Called after ``_persist_candidate`` writes a fresh candidate row.
|
|
164
|
-
Creates a new ``ShadowTest`` to collect paired recall results.
|
|
165
|
-
"""
|
|
166
|
-
self._candidate_id = int(candidate_id)
|
|
167
|
-
# Pass learning_db so new paired observations persist to
|
|
168
|
-
# ``shadow_observations`` (M012) for restart durability.
|
|
169
|
-
self._shadow = ShadowTest(
|
|
170
|
-
profile_id=self._profile_id,
|
|
171
|
-
candidate_model_id=str(candidate_id),
|
|
172
|
-
learning_db=self._learning_db,
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
# ------------------------------------------------------------------
|
|
176
|
-
# Post-promotion watcher
|
|
177
|
-
# ------------------------------------------------------------------
|
|
178
|
-
|
|
179
|
-
def arm_post_promotion_watch(self, *, baseline_ndcg: float) -> None:
|
|
180
|
-
"""Install a fresh ``ModelRollback`` observer for the 200-recall
|
|
181
|
-
post-promotion watch window."""
|
|
182
|
-
self._rollback = ModelRollback(
|
|
183
|
-
learning_db_path=self._learning_db,
|
|
184
|
-
profile_id=self._profile_id,
|
|
185
|
-
baseline_ndcg=float(baseline_ndcg),
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
# ------------------------------------------------------------------
|
|
189
|
-
# Recall-settled ingestion
|
|
190
|
-
# ------------------------------------------------------------------
|
|
191
|
-
|
|
192
|
-
def on_recall_settled(
|
|
193
|
-
self,
|
|
194
|
-
*,
|
|
195
|
-
query_id: str,
|
|
196
|
-
arm: str,
|
|
197
|
-
ndcg_at_10: float,
|
|
198
|
-
) -> None:
|
|
199
|
-
"""Feed one settled recall into whichever phase is active.
|
|
200
|
-
|
|
201
|
-
Precedence:
|
|
202
|
-
1. If a ShadowTest is active → record paired observation; on
|
|
203
|
-
``decide() == 'promote'`` fire the atomic promotion.
|
|
204
|
-
2. If a ModelRollback watch is active → record observation;
|
|
205
|
-
on ``should_rollback() is True`` fire execute_rollback.
|
|
206
|
-
|
|
207
|
-
Both phases may run for the same profile briefly if a promote
|
|
208
|
-
fires mid-batch; that is intentional — the first watch window
|
|
209
|
-
starts immediately on promotion.
|
|
210
|
-
"""
|
|
211
|
-
try:
|
|
212
|
-
if self._shadow is not None and self._candidate_id is not None:
|
|
213
|
-
# ShadowTest expects arm='active'|'candidate'. Our router
|
|
214
|
-
# uses 'baseline' as the externally-visible arm name.
|
|
215
|
-
st_arm = "active" if arm == ARM_BASELINE else "candidate"
|
|
216
|
-
self._shadow.record_recall_pair(
|
|
217
|
-
query_id=str(query_id), arm=st_arm,
|
|
218
|
-
ndcg_at_10=float(ndcg_at_10),
|
|
219
|
-
)
|
|
220
|
-
decision, _stats = self._shadow.decide()
|
|
221
|
-
if decision == "promote":
|
|
222
|
-
self._fire_promotion()
|
|
223
|
-
elif decision == "reject":
|
|
224
|
-
# Release the candidate reservation — a future
|
|
225
|
-
# _run_shadow_cycle may insert a new candidate.
|
|
226
|
-
self._shadow = None
|
|
227
|
-
self._candidate_id = None
|
|
228
|
-
|
|
229
|
-
if self._rollback is not None:
|
|
230
|
-
self._rollback.record_post_promotion(
|
|
231
|
-
query_id=str(query_id), ndcg_at_10=float(ndcg_at_10),
|
|
232
|
-
)
|
|
233
|
-
if self._rollback.should_rollback():
|
|
234
|
-
self._fire_rollback()
|
|
235
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
236
|
-
logger.debug("shadow_router on_recall_settled error: %s", exc)
|
|
237
|
-
|
|
238
|
-
# ------------------------------------------------------------------
|
|
239
|
-
# Internal: promotion + rollback triggers
|
|
240
|
-
# ------------------------------------------------------------------
|
|
241
|
-
|
|
242
|
-
def _fire_promotion(self) -> None:
|
|
243
|
-
"""Call the canonical ``_promote_candidate`` helper and reset
|
|
244
|
-
the shadow state so a new A/B cycle can start next retrain."""
|
|
245
|
-
if self._candidate_id is None:
|
|
246
|
-
return
|
|
247
|
-
try:
|
|
248
|
-
from superlocalmemory.learning.consolidation_worker import (
|
|
249
|
-
_promote_candidate,
|
|
250
|
-
)
|
|
251
|
-
_promote_candidate(
|
|
252
|
-
self._learning_db,
|
|
253
|
-
profile_id=self._profile_id,
|
|
254
|
-
candidate_id=int(self._candidate_id),
|
|
255
|
-
)
|
|
256
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
257
|
-
logger.warning("shadow_router promotion failed: %s", exc)
|
|
258
|
-
finally:
|
|
259
|
-
self._shadow = None
|
|
260
|
-
self._candidate_id = None
|
|
261
|
-
|
|
262
|
-
def _fire_rollback(self) -> None:
|
|
263
|
-
"""Call ``ModelRollback.execute_rollback`` and clear the watcher."""
|
|
264
|
-
try:
|
|
265
|
-
if self._rollback is not None:
|
|
266
|
-
self._rollback.execute_rollback(
|
|
267
|
-
reason="watch_window_regression",
|
|
268
|
-
)
|
|
269
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
270
|
-
logger.warning("shadow_router rollback failed: %s", exc)
|
|
271
|
-
finally:
|
|
272
|
-
self._rollback = None
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
# ---------------------------------------------------------------------------
|
|
276
|
-
# Process-local singleton cache — one ShadowRouter per (learning_db, profile).
|
|
277
|
-
# Thread-safe; keyed by a stable tuple so repeated factory calls reuse state.
|
|
278
|
-
# ---------------------------------------------------------------------------
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
_CACHE: dict[tuple[str, str, str], ShadowRouter] = {}
|
|
282
|
-
_CACHE_LOCK = threading.Lock()
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
def get_shadow_router(
|
|
286
|
-
*,
|
|
287
|
-
memory_db: str,
|
|
288
|
-
learning_db: str,
|
|
289
|
-
profile_id: str,
|
|
290
|
-
) -> ShadowRouter:
|
|
291
|
-
"""Factory — returns the process-local ``ShadowRouter`` for
|
|
292
|
-
``(memory_db, learning_db, profile_id)``, creating one on first call.
|
|
293
|
-
"""
|
|
294
|
-
key = (str(memory_db), str(learning_db), str(profile_id))
|
|
295
|
-
with _CACHE_LOCK:
|
|
296
|
-
router = _CACHE.get(key)
|
|
297
|
-
if router is None:
|
|
298
|
-
router = ShadowRouter(
|
|
299
|
-
memory_db=memory_db,
|
|
300
|
-
learning_db=learning_db,
|
|
301
|
-
profile_id=profile_id,
|
|
302
|
-
)
|
|
303
|
-
_CACHE[key] = router
|
|
304
|
-
return router
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
def reset_for_testing() -> None:
|
|
308
|
-
"""Clear the singleton cache — tests only."""
|
|
309
|
-
with _CACHE_LOCK:
|
|
310
|
-
_CACHE.clear()
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
__all__ = (
|
|
314
|
-
"ARM_BASELINE",
|
|
315
|
-
"ARM_CANDIDATE",
|
|
316
|
-
"ShadowRouter",
|
|
317
|
-
"get_shadow_router",
|
|
318
|
-
"reset_for_testing",
|
|
319
|
-
)
|
|
@@ -1,85 +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 — Stage 8 SB-5
|
|
4
|
-
|
|
5
|
-
"""Global kill-switch for SLM.
|
|
6
|
-
|
|
7
|
-
Two mechanisms, either disables the entire system cheaply:
|
|
8
|
-
|
|
9
|
-
1. File-marker: ``~/.superlocalmemory/.disabled`` — persistent across
|
|
10
|
-
reboots, survives daemon restarts, written by ``slm disable``.
|
|
11
|
-
2. Environment variable: ``SLM_DISABLE=1`` — per-process, useful for
|
|
12
|
-
CI, sandboxes, or "just for this shell" overrides.
|
|
13
|
-
|
|
14
|
-
Every hot-path entry point (hooks, MCP tools, recall pipeline, daemon
|
|
15
|
-
lifespan) calls :func:`is_disabled` first. Returns ``True`` ⇒ exit
|
|
16
|
-
quietly, no side effects.
|
|
17
|
-
|
|
18
|
-
Backward-compat: unset env + missing marker ⇒ ``False`` ⇒ normal
|
|
19
|
-
behaviour. Zero impact on the 18k live users who never touch it.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
from __future__ import annotations
|
|
23
|
-
|
|
24
|
-
import os
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
_MARKER_NAME = ".disabled"
|
|
29
|
-
_ENV_NAME = "SLM_DISABLE"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _slm_home() -> Path:
|
|
33
|
-
"""Return the canonical SLM runtime-state directory."""
|
|
34
|
-
from superlocalmemory.infra.data_root import canonical_data_root
|
|
35
|
-
return canonical_data_root()
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def marker_path() -> Path:
|
|
39
|
-
"""Where the persistent ``.disabled`` marker lives."""
|
|
40
|
-
return _slm_home() / _MARKER_NAME
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def is_disabled() -> bool:
|
|
44
|
-
"""Return True iff SLM should no-op everything.
|
|
45
|
-
|
|
46
|
-
Precedence: env var first (cheapest check), then file marker. Any
|
|
47
|
-
non-empty, non-"0", non-"false" value in the env counts as disabled.
|
|
48
|
-
"""
|
|
49
|
-
env = os.environ.get(_ENV_NAME, "").strip().lower()
|
|
50
|
-
if env and env not in ("0", "false", "no", "off"):
|
|
51
|
-
return True
|
|
52
|
-
try:
|
|
53
|
-
return marker_path().exists()
|
|
54
|
-
except OSError: # pragma: no cover — defensive against FS errors
|
|
55
|
-
return False
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def write_marker(reason: str = "") -> Path:
|
|
59
|
-
"""Create the disabled marker. Returns the path."""
|
|
60
|
-
home = _slm_home()
|
|
61
|
-
home.mkdir(parents=True, exist_ok=True)
|
|
62
|
-
path = home / _MARKER_NAME
|
|
63
|
-
payload = "disabled"
|
|
64
|
-
if reason:
|
|
65
|
-
payload = f"disabled: {reason}\n"
|
|
66
|
-
path.write_text(payload, encoding="utf-8")
|
|
67
|
-
return path
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def remove_marker() -> bool:
|
|
71
|
-
"""Remove the disabled marker. Returns True if removed, False if absent."""
|
|
72
|
-
path = marker_path()
|
|
73
|
-
try:
|
|
74
|
-
path.unlink()
|
|
75
|
-
return True
|
|
76
|
-
except FileNotFoundError:
|
|
77
|
-
return False
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
__all__ = (
|
|
81
|
-
"is_disabled",
|
|
82
|
-
"write_marker",
|
|
83
|
-
"remove_marker",
|
|
84
|
-
"marker_path",
|
|
85
|
-
)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""What "status" means, in one place, for every surface that answers it.
|
|
6
|
-
|
|
7
|
-
Three surfaces answered the same question — MCP ``get_status``, the HTTP
|
|
8
|
-
dashboard and ``slm status`` — and returned three different field sets. Two of
|
|
9
|
-
them omitted the graph counts, which are the numbers that say whether the graph
|
|
10
|
-
is healthy; one omitted the version, which is the first thing anyone asks for
|
|
11
|
-
in a bug report. Each carried its own copy of the same three COUNT queries.
|
|
12
|
-
|
|
13
|
-
This module holds the agreed field set and the queries behind it. A surface may
|
|
14
|
-
add fields of its own — the dashboard needs a display name for the mode, the
|
|
15
|
-
daemon needs its own pid and uptime — but it may not be missing one of these.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import sqlite3
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
|
|
23
|
-
#: Fields every status surface emits. A surface with extra fields is fine; a
|
|
24
|
-
#: surface missing one of these is a defect, and a test asserts it.
|
|
25
|
-
CANONICAL_STATUS_FIELDS: tuple[str, ...] = (
|
|
26
|
-
"mode",
|
|
27
|
-
"provider",
|
|
28
|
-
"profile",
|
|
29
|
-
"base_dir",
|
|
30
|
-
"db_path",
|
|
31
|
-
"db_size_mb",
|
|
32
|
-
"fact_count",
|
|
33
|
-
"entity_count",
|
|
34
|
-
"edge_count",
|
|
35
|
-
"profile_generation",
|
|
36
|
-
"version",
|
|
37
|
-
"projection_queue_depth",
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
#: The counts, and the one query each comes from. Profile-scoped without
|
|
41
|
-
#: exception — a count that ignores the active profile is a wrong answer on any
|
|
42
|
-
#: machine with more than one workspace.
|
|
43
|
-
#:
|
|
44
|
-
#: ``fact_count`` is completed at call time with the visibility predicate: it is
|
|
45
|
-
#: the number an owner reads as "how much do I remember", so soft-deleted and
|
|
46
|
-
#: withheld rows must not be in it. Counting them raw is how the dashboard came
|
|
47
|
-
#: to report 5,317 against 4,018 real memories on the author's store.
|
|
48
|
-
COUNT_QUERIES: dict[str, str] = {
|
|
49
|
-
"fact_count": "SELECT COUNT(*) FROM atomic_facts WHERE profile_id = ?",
|
|
50
|
-
"entity_count": "SELECT COUNT(*) FROM canonical_entities WHERE profile_id = ?",
|
|
51
|
-
"edge_count": "SELECT COUNT(*) FROM graph_edges WHERE profile_id = ?",
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def counts_from_sqlite(conn: sqlite3.Connection, profile_id: str) -> dict[str, int]:
|
|
56
|
-
"""Every count on the contract, from one connection.
|
|
57
|
-
|
|
58
|
-
A table that is not there yet — a store mid-migration, or one built before
|
|
59
|
-
the graph existed — reports zero rather than failing the whole status call.
|
|
60
|
-
A status endpoint that raises tells an operator nothing.
|
|
61
|
-
"""
|
|
62
|
-
from superlocalmemory.storage.database import visible_fact_clause_for_connection
|
|
63
|
-
|
|
64
|
-
counts: dict[str, int] = {}
|
|
65
|
-
for field, sql in COUNT_QUERIES.items():
|
|
66
|
-
if field == "fact_count":
|
|
67
|
-
sql += visible_fact_clause_for_connection(conn)
|
|
68
|
-
try:
|
|
69
|
-
row = conn.execute(sql, (profile_id,)).fetchone()
|
|
70
|
-
counts[field] = int(row[0]) if row else 0
|
|
71
|
-
except sqlite3.Error:
|
|
72
|
-
counts[field] = 0
|
|
73
|
-
return counts
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def projection_queue_depth(conn: sqlite3.Connection) -> int:
|
|
77
|
-
"""Facts stored but not yet carried into the graph and vector projections.
|
|
78
|
-
|
|
79
|
-
Zero is the healthy steady state. A number that does not fall means the
|
|
80
|
-
projections have stopped keeping up with the store, which is the one failure
|
|
81
|
-
that would otherwise be invisible: the memory is safely in SQLite, so
|
|
82
|
-
nothing errors, and it is simply missing from the graph until someone
|
|
83
|
-
notices recall got worse.
|
|
84
|
-
|
|
85
|
-
Deliberately NOT profile-scoped. The worker is one queue for the whole
|
|
86
|
-
store, and a projection stalled on another workspace's facts is still a
|
|
87
|
-
stalled projection. Scoping it per profile would let a status page report
|
|
88
|
-
zero while the drain was wedged.
|
|
89
|
-
"""
|
|
90
|
-
from superlocalmemory.storage.projection_outbox import DEPTH_SQL
|
|
91
|
-
|
|
92
|
-
try:
|
|
93
|
-
row = conn.execute(DEPTH_SQL).fetchone()
|
|
94
|
-
except sqlite3.Error:
|
|
95
|
-
# A store that predates the queue has nothing pending by definition.
|
|
96
|
-
return 0
|
|
97
|
-
return int(row[0]) if row else 0
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def store_size_mb(db_path: Path | str | None) -> float:
|
|
101
|
-
"""Size of the store on disk, or 0.0 when there is nothing to measure."""
|
|
102
|
-
if not db_path:
|
|
103
|
-
return 0.0
|
|
104
|
-
path = Path(db_path)
|
|
105
|
-
try:
|
|
106
|
-
return round(path.stat().st_size / (1024 * 1024), 2)
|
|
107
|
-
except OSError:
|
|
108
|
-
return 0.0
|