superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,515 +0,0 @@
|
|
|
1
|
-
"""Linearizable active-profile runtime state for the unified daemon."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
import os
|
|
7
|
-
import tempfile
|
|
8
|
-
import threading
|
|
9
|
-
import time as _time
|
|
10
|
-
from contextlib import contextmanager
|
|
11
|
-
from contextvars import ContextVar
|
|
12
|
-
from dataclasses import dataclass
|
|
13
|
-
from datetime import datetime, timezone
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Callable, Iterator
|
|
16
|
-
|
|
17
|
-
from superlocalmemory.infra.data_root import state_path
|
|
18
|
-
|
|
19
|
-
_RUNTIME_BIND_LOCK = threading.Lock()
|
|
20
|
-
_REQUEST_PROFILE: ContextVar[str | None] = ContextVar(
|
|
21
|
-
"slm_request_profile", default=None,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
# Maximum seconds to wait for in-flight operations to drain before a
|
|
25
|
-
# profile switch or engine reconfigure is aborted with HTTP 503.
|
|
26
|
-
# Tests can monkeypatch this module-level value to keep runs fast.
|
|
27
|
-
_DRAIN_TIMEOUT_SECS: float = 5.0
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class TransitionDrainTimeout(Exception):
|
|
31
|
-
"""Raised when in-flight operations do not drain within _DRAIN_TIMEOUT_SECS.
|
|
32
|
-
|
|
33
|
-
The caller (HTTP switch route) maps this to HTTP 503 so the client
|
|
34
|
-
receives a clear error instead of a silent hang. After the timeout,
|
|
35
|
-
`_transitioning` is always reset to False so the daemon stays responsive.
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def current_request_profile() -> str | None:
|
|
40
|
-
"""Return the immutable profile snapshot admitted for this request."""
|
|
41
|
-
return _REQUEST_PROFILE.get()
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@dataclass(frozen=True, slots=True)
|
|
45
|
-
class ProfileSnapshot:
|
|
46
|
-
"""One immutable active-profile generation."""
|
|
47
|
-
|
|
48
|
-
profile_id: str
|
|
49
|
-
generation: int
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class ProfileRuntime:
|
|
53
|
-
"""Coordinate profile-sensitive operations and exclusive transitions."""
|
|
54
|
-
|
|
55
|
-
def __init__(self, profile_id: str, *, generation: int = 0) -> None:
|
|
56
|
-
self._condition = threading.Condition(threading.Lock())
|
|
57
|
-
self._snapshot = ProfileSnapshot(profile_id, generation)
|
|
58
|
-
self._active_operations = 0
|
|
59
|
-
self._transitioning = False
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def snapshot(self) -> ProfileSnapshot:
|
|
63
|
-
with self._condition:
|
|
64
|
-
return self._snapshot
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def transitioning(self) -> bool:
|
|
68
|
-
with self._condition:
|
|
69
|
-
return self._transitioning
|
|
70
|
-
|
|
71
|
-
def acquire_operation(self) -> ProfileSnapshot:
|
|
72
|
-
"""Admit an operation only when no profile transition is active."""
|
|
73
|
-
with self._condition:
|
|
74
|
-
while self._transitioning:
|
|
75
|
-
self._condition.wait()
|
|
76
|
-
self._active_operations += 1
|
|
77
|
-
return self._snapshot
|
|
78
|
-
|
|
79
|
-
def _try_acquire_operation_nowait(self) -> ProfileSnapshot | None:
|
|
80
|
-
"""Non-blocking acquire: returns None immediately when a transition is pending.
|
|
81
|
-
|
|
82
|
-
Used by cooperative background maintenance tasks so they never block the
|
|
83
|
-
drain window of a pending profile switch.
|
|
84
|
-
"""
|
|
85
|
-
with self._condition:
|
|
86
|
-
if self._transitioning:
|
|
87
|
-
return None
|
|
88
|
-
self._active_operations += 1
|
|
89
|
-
return self._snapshot
|
|
90
|
-
|
|
91
|
-
def release_operation(self) -> None:
|
|
92
|
-
with self._condition:
|
|
93
|
-
if self._active_operations <= 0:
|
|
94
|
-
raise RuntimeError("profile runtime operation lease underflow")
|
|
95
|
-
self._active_operations -= 1
|
|
96
|
-
if self._active_operations == 0:
|
|
97
|
-
self._condition.notify_all()
|
|
98
|
-
|
|
99
|
-
@contextmanager
|
|
100
|
-
def operation(self) -> Iterator[ProfileSnapshot]:
|
|
101
|
-
snapshot = self.acquire_operation()
|
|
102
|
-
try:
|
|
103
|
-
yield snapshot
|
|
104
|
-
finally:
|
|
105
|
-
self.release_operation()
|
|
106
|
-
|
|
107
|
-
@contextmanager
|
|
108
|
-
def operation_nowait(self) -> Iterator[ProfileSnapshot | None]:
|
|
109
|
-
"""Cooperatively skip when a profile transition is pending.
|
|
110
|
-
|
|
111
|
-
Background maintenance tasks that do NOT mutate profile-scoped engine
|
|
112
|
-
state (cache warmup, health probes) MUST use this instead of
|
|
113
|
-
``operation()`` so they never hold the drain window hostage.
|
|
114
|
-
|
|
115
|
-
Yields ``None`` (preempted — skip this work cycle) when a switch is
|
|
116
|
-
already in progress. Yields a :class:`ProfileSnapshot` and holds the
|
|
117
|
-
lease normally when no transition is pending.
|
|
118
|
-
|
|
119
|
-
The caller is responsible for checking ``if snap is None: return``.
|
|
120
|
-
|
|
121
|
-
Unlike ``operation()``, this context manager never blocks — it either
|
|
122
|
-
admits immediately or preempts immediately.
|
|
123
|
-
"""
|
|
124
|
-
snapshot = self._try_acquire_operation_nowait()
|
|
125
|
-
acquired = snapshot is not None
|
|
126
|
-
try:
|
|
127
|
-
yield snapshot
|
|
128
|
-
finally:
|
|
129
|
-
if acquired:
|
|
130
|
-
self.release_operation()
|
|
131
|
-
|
|
132
|
-
def transition(
|
|
133
|
-
self,
|
|
134
|
-
target_profile: str,
|
|
135
|
-
commit: Callable[[ProfileSnapshot, str], None],
|
|
136
|
-
) -> ProfileSnapshot:
|
|
137
|
-
"""Drain admitted operations, commit, then publish a new generation.
|
|
138
|
-
|
|
139
|
-
Raises TransitionDrainTimeout if in-flight operations do not drain
|
|
140
|
-
within _DRAIN_TIMEOUT_SECS. The flag is always reset on timeout so
|
|
141
|
-
the daemon remains responsive (no permanent _transitioning=True wedge).
|
|
142
|
-
"""
|
|
143
|
-
deadline = _time.monotonic() + _DRAIN_TIMEOUT_SECS
|
|
144
|
-
with self._condition:
|
|
145
|
-
while self._transitioning:
|
|
146
|
-
self._condition.wait()
|
|
147
|
-
if target_profile == self._snapshot.profile_id:
|
|
148
|
-
return self._snapshot
|
|
149
|
-
self._transitioning = True
|
|
150
|
-
while self._active_operations > 0:
|
|
151
|
-
remaining = deadline - _time.monotonic()
|
|
152
|
-
if remaining <= 0:
|
|
153
|
-
# Reset before raising — never leave the daemon wedged.
|
|
154
|
-
self._transitioning = False
|
|
155
|
-
self._condition.notify_all()
|
|
156
|
-
raise TransitionDrainTimeout(
|
|
157
|
-
f"Profile switch to '{target_profile}' timed out after "
|
|
158
|
-
f"{_DRAIN_TIMEOUT_SECS:.0f}s: {self._active_operations} "
|
|
159
|
-
"in-flight operation(s) did not drain. "
|
|
160
|
-
"Try again when no active requests are in progress."
|
|
161
|
-
)
|
|
162
|
-
# Use short sleep slices so we react quickly to notifications
|
|
163
|
-
# and to timeout expiry without busy-spinning.
|
|
164
|
-
self._condition.wait(timeout=min(remaining, 0.25))
|
|
165
|
-
previous = self._snapshot
|
|
166
|
-
|
|
167
|
-
try:
|
|
168
|
-
commit(previous, target_profile)
|
|
169
|
-
except BaseException:
|
|
170
|
-
with self._condition:
|
|
171
|
-
self._transitioning = False
|
|
172
|
-
self._condition.notify_all()
|
|
173
|
-
raise
|
|
174
|
-
|
|
175
|
-
with self._condition:
|
|
176
|
-
self._snapshot = ProfileSnapshot(
|
|
177
|
-
profile_id=target_profile,
|
|
178
|
-
generation=previous.generation + 1,
|
|
179
|
-
)
|
|
180
|
-
self._transitioning = False
|
|
181
|
-
self._condition.notify_all()
|
|
182
|
-
return self._snapshot
|
|
183
|
-
|
|
184
|
-
def reconfigure(self, commit: Callable[[ProfileSnapshot], None]) -> ProfileSnapshot:
|
|
185
|
-
"""Run a same-profile engine transition behind the operation barrier.
|
|
186
|
-
|
|
187
|
-
Raises TransitionDrainTimeout if in-flight operations do not drain
|
|
188
|
-
within _DRAIN_TIMEOUT_SECS (same semantics as transition()).
|
|
189
|
-
"""
|
|
190
|
-
deadline = _time.monotonic() + _DRAIN_TIMEOUT_SECS
|
|
191
|
-
with self._condition:
|
|
192
|
-
while self._transitioning:
|
|
193
|
-
self._condition.wait()
|
|
194
|
-
self._transitioning = True
|
|
195
|
-
while self._active_operations > 0:
|
|
196
|
-
remaining = deadline - _time.monotonic()
|
|
197
|
-
if remaining <= 0:
|
|
198
|
-
self._transitioning = False
|
|
199
|
-
self._condition.notify_all()
|
|
200
|
-
raise TransitionDrainTimeout(
|
|
201
|
-
f"Engine reconfigure timed out after {_DRAIN_TIMEOUT_SECS:.0f}s: "
|
|
202
|
-
f"{self._active_operations} in-flight operation(s) did not drain."
|
|
203
|
-
)
|
|
204
|
-
self._condition.wait(timeout=min(remaining, 0.25))
|
|
205
|
-
snapshot = self._snapshot
|
|
206
|
-
|
|
207
|
-
try:
|
|
208
|
-
commit(snapshot)
|
|
209
|
-
except BaseException:
|
|
210
|
-
with self._condition:
|
|
211
|
-
self._transitioning = False
|
|
212
|
-
self._condition.notify_all()
|
|
213
|
-
raise
|
|
214
|
-
|
|
215
|
-
with self._condition:
|
|
216
|
-
self._transitioning = False
|
|
217
|
-
self._condition.notify_all()
|
|
218
|
-
return self._snapshot
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
@dataclass(slots=True)
|
|
222
|
-
class ActiveProfilePersistence:
|
|
223
|
-
"""Rollback handle for the two compatibility configuration stores."""
|
|
224
|
-
|
|
225
|
-
previous: dict[Path, bytes | None]
|
|
226
|
-
_rolled_back: bool = False
|
|
227
|
-
|
|
228
|
-
def rollback(self) -> None:
|
|
229
|
-
if self._rolled_back:
|
|
230
|
-
return
|
|
231
|
-
for path, content in self.previous.items():
|
|
232
|
-
if content is None:
|
|
233
|
-
path.unlink(missing_ok=True)
|
|
234
|
-
else:
|
|
235
|
-
_atomic_write_bytes(path, content)
|
|
236
|
-
self._rolled_back = True
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def _load_json_object(path: Path, *, default: dict) -> dict:
|
|
240
|
-
if not path.exists():
|
|
241
|
-
return dict(default)
|
|
242
|
-
value = json.loads(path.read_text(encoding="utf-8"))
|
|
243
|
-
if not isinstance(value, dict):
|
|
244
|
-
raise ValueError(f"{path.name} must contain a JSON object")
|
|
245
|
-
return value
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
def _atomic_write_bytes(path: Path, content: bytes) -> None:
|
|
249
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
250
|
-
fd, temporary = tempfile.mkstemp(
|
|
251
|
-
dir=str(path.parent),
|
|
252
|
-
prefix=f".{path.name}.",
|
|
253
|
-
suffix=".tmp",
|
|
254
|
-
)
|
|
255
|
-
temporary_path = Path(temporary)
|
|
256
|
-
try:
|
|
257
|
-
with os.fdopen(fd, "wb") as handle:
|
|
258
|
-
handle.write(content)
|
|
259
|
-
handle.flush()
|
|
260
|
-
os.fsync(handle.fileno())
|
|
261
|
-
os.replace(temporary_path, path)
|
|
262
|
-
except BaseException:
|
|
263
|
-
temporary_path.unlink(missing_ok=True)
|
|
264
|
-
raise
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
def _json_bytes(payload: dict) -> bytes:
|
|
268
|
-
return (json.dumps(payload, indent=2) + "\n").encode("utf-8")
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
def persist_active_profile(profile_id: str) -> ActiveProfilePersistence:
|
|
272
|
-
"""Atomically update config plus the legacy profiles cache, with rollback."""
|
|
273
|
-
config_path = Path(state_path("config.json"))
|
|
274
|
-
profiles_path = Path(state_path("profiles.json"))
|
|
275
|
-
paths = (config_path, profiles_path)
|
|
276
|
-
previous = {
|
|
277
|
-
path: path.read_bytes() if path.exists() else None
|
|
278
|
-
for path in paths
|
|
279
|
-
}
|
|
280
|
-
config = _load_json_object(config_path, default={})
|
|
281
|
-
profiles = _load_json_object(
|
|
282
|
-
profiles_path,
|
|
283
|
-
default={
|
|
284
|
-
"profiles": {
|
|
285
|
-
"default": {
|
|
286
|
-
"name": "default",
|
|
287
|
-
"description": "Default memory profile",
|
|
288
|
-
},
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
)
|
|
292
|
-
config["active_profile"] = profile_id
|
|
293
|
-
profiles["active_profile"] = profile_id
|
|
294
|
-
profile_catalog = profiles.get("profiles")
|
|
295
|
-
if isinstance(profile_catalog, dict):
|
|
296
|
-
selected = profile_catalog.get(profile_id)
|
|
297
|
-
if isinstance(selected, dict):
|
|
298
|
-
selected["last_used"] = datetime.now(timezone.utc).isoformat()
|
|
299
|
-
rollback = ActiveProfilePersistence(previous)
|
|
300
|
-
try:
|
|
301
|
-
_atomic_write_bytes(config_path, _json_bytes(config))
|
|
302
|
-
_atomic_write_bytes(profiles_path, _json_bytes(profiles))
|
|
303
|
-
except BaseException:
|
|
304
|
-
rollback.rollback()
|
|
305
|
-
raise
|
|
306
|
-
return rollback
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
def get_profile_runtime(app_state) -> ProfileRuntime:
|
|
310
|
-
"""Return the daemon runtime, lazily deriving its initial profile."""
|
|
311
|
-
runtime = getattr(app_state, "profile_runtime", None)
|
|
312
|
-
if runtime is not None:
|
|
313
|
-
return runtime
|
|
314
|
-
with _RUNTIME_BIND_LOCK:
|
|
315
|
-
runtime = getattr(app_state, "profile_runtime", None)
|
|
316
|
-
if runtime is not None:
|
|
317
|
-
return runtime
|
|
318
|
-
engine = getattr(app_state, "engine", None)
|
|
319
|
-
config = getattr(app_state, "config", None)
|
|
320
|
-
profile_id = (
|
|
321
|
-
getattr(engine, "profile_id", "")
|
|
322
|
-
or getattr(config, "active_profile", "")
|
|
323
|
-
or "default"
|
|
324
|
-
)
|
|
325
|
-
runtime = ProfileRuntime(str(profile_id))
|
|
326
|
-
app_state.profile_runtime = runtime
|
|
327
|
-
return runtime
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
def bind_profile_runtime(app_state, engine, config) -> ProfileRuntime:
|
|
331
|
-
"""Attach the authoritative runtime after daemon engine initialization."""
|
|
332
|
-
runtime = ProfileRuntime(str(engine.profile_id))
|
|
333
|
-
app_state.profile_runtime = runtime
|
|
334
|
-
app_state.engine = engine
|
|
335
|
-
app_state.config = config
|
|
336
|
-
return runtime
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
def commit_daemon_profile_switch(
|
|
340
|
-
app_state,
|
|
341
|
-
previous: ProfileSnapshot,
|
|
342
|
-
target_profile: str,
|
|
343
|
-
) -> None:
|
|
344
|
-
"""Persist and rebind a quiescent resident engine, rolling back on error."""
|
|
345
|
-
engine = getattr(app_state, "engine", None)
|
|
346
|
-
if engine is None:
|
|
347
|
-
raise RuntimeError("resident engine is unavailable")
|
|
348
|
-
rows = engine._db.execute(
|
|
349
|
-
"SELECT 1 FROM profiles WHERE profile_id = ?",
|
|
350
|
-
(target_profile,),
|
|
351
|
-
)
|
|
352
|
-
if not rows:
|
|
353
|
-
raise RuntimeError(
|
|
354
|
-
f"profile '{target_profile}' no longer exists at commit time"
|
|
355
|
-
)
|
|
356
|
-
app_config = getattr(app_state, "config", None)
|
|
357
|
-
engine_config = getattr(engine, "_config", None)
|
|
358
|
-
persistence = None
|
|
359
|
-
try:
|
|
360
|
-
# Requests are drained and runtime generation is not yet published.
|
|
361
|
-
# Rebind the in-memory engine first, then make compatibility files the
|
|
362
|
-
# final commit step so they can never lead daemon runtime truth.
|
|
363
|
-
engine.profile_id = target_profile
|
|
364
|
-
canonical_remember = getattr(
|
|
365
|
-
app_state,
|
|
366
|
-
"canonical_remember_runtime",
|
|
367
|
-
None,
|
|
368
|
-
)
|
|
369
|
-
if canonical_remember is not None:
|
|
370
|
-
canonical_remember.rebind_engine(engine)
|
|
371
|
-
if app_config is not None:
|
|
372
|
-
app_config.active_profile = target_profile
|
|
373
|
-
if engine_config is not None:
|
|
374
|
-
engine_config.active_profile = target_profile
|
|
375
|
-
persistence = persist_active_profile(target_profile)
|
|
376
|
-
except BaseException:
|
|
377
|
-
engine.profile_id = previous.profile_id
|
|
378
|
-
canonical_remember = getattr(
|
|
379
|
-
app_state,
|
|
380
|
-
"canonical_remember_runtime",
|
|
381
|
-
None,
|
|
382
|
-
)
|
|
383
|
-
if canonical_remember is not None:
|
|
384
|
-
canonical_remember.rebind_engine(engine)
|
|
385
|
-
if app_config is not None:
|
|
386
|
-
app_config.active_profile = previous.profile_id
|
|
387
|
-
if engine_config is not None:
|
|
388
|
-
engine_config.active_profile = previous.profile_id
|
|
389
|
-
if persistence is not None:
|
|
390
|
-
persistence.rollback()
|
|
391
|
-
raise
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
def reconfigure_daemon_engine(app_state, new_config, *, mode_change: bool) -> None:
|
|
395
|
-
"""Exclusively rebuild every daemon engine reference for a new config."""
|
|
396
|
-
callback = getattr(app_state, "reconfigure_engine", None)
|
|
397
|
-
if not callable(callback):
|
|
398
|
-
# Direct route/unit usage without a resident daemon retains the
|
|
399
|
-
# established persistence-only behavior.
|
|
400
|
-
new_config.save(mode_change=mode_change)
|
|
401
|
-
return
|
|
402
|
-
runtime = get_profile_runtime(app_state)
|
|
403
|
-
|
|
404
|
-
def _commit(snapshot: ProfileSnapshot) -> None:
|
|
405
|
-
# The candidate may have been loaded before a concurrent profile
|
|
406
|
-
# switch. Runtime truth always wins over that stale config snapshot.
|
|
407
|
-
new_config.active_profile = snapshot.profile_id
|
|
408
|
-
callback(new_config, mode_change=mode_change)
|
|
409
|
-
|
|
410
|
-
runtime.reconfigure(_commit)
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
class ProfileRuntimeMiddleware:
|
|
414
|
-
"""Hold an operation lease for each daemon HTTP request."""
|
|
415
|
-
|
|
416
|
-
def __init__(self, app, *, app_state) -> None:
|
|
417
|
-
self._app = app
|
|
418
|
-
self._app_state = app_state
|
|
419
|
-
|
|
420
|
-
@staticmethod
|
|
421
|
-
def _is_transition_request(path: str, method: str) -> bool:
|
|
422
|
-
profile_switch = (
|
|
423
|
-
path.startswith("/api/profiles/")
|
|
424
|
-
and path.endswith("/switch")
|
|
425
|
-
)
|
|
426
|
-
config_transition = method in {"POST", "PUT", "PATCH"} and path in {
|
|
427
|
-
"/api/v3/mode",
|
|
428
|
-
"/api/v3/mode/set",
|
|
429
|
-
"/api/v3/embedding/config",
|
|
430
|
-
"/api/v3/scope/config",
|
|
431
|
-
}
|
|
432
|
-
return profile_switch or config_transition
|
|
433
|
-
|
|
434
|
-
async def __call__(self, scope, receive, send) -> None:
|
|
435
|
-
if scope.get("type") != "http":
|
|
436
|
-
await self._app(scope, receive, send)
|
|
437
|
-
return
|
|
438
|
-
path = str(scope.get("path", ""))
|
|
439
|
-
method = str(scope.get("method", "GET")).upper()
|
|
440
|
-
# Mounted MCP tools proxy profile-sensitive work back through the
|
|
441
|
-
# canonical daemon routes. Leasing the outer MCP request would make an
|
|
442
|
-
# embedded switch wait on itself.
|
|
443
|
-
if path.startswith("/mcp") or self._is_transition_request(path, method):
|
|
444
|
-
await self._app(scope, receive, send)
|
|
445
|
-
return
|
|
446
|
-
|
|
447
|
-
import asyncio
|
|
448
|
-
|
|
449
|
-
runtime = get_profile_runtime(self._app_state)
|
|
450
|
-
acquire_task = asyncio.create_task(
|
|
451
|
-
asyncio.to_thread(runtime.acquire_operation)
|
|
452
|
-
)
|
|
453
|
-
try:
|
|
454
|
-
# Shield the worker so cancellation cannot strand a lease that the
|
|
455
|
-
# thread acquires after this coroutine has already unwound.
|
|
456
|
-
snapshot = await asyncio.shield(acquire_task)
|
|
457
|
-
except asyncio.CancelledError:
|
|
458
|
-
await acquire_task
|
|
459
|
-
runtime.release_operation()
|
|
460
|
-
raise
|
|
461
|
-
scope.setdefault("state", {})["profile_snapshot"] = snapshot
|
|
462
|
-
token = _REQUEST_PROFILE.set(snapshot.profile_id)
|
|
463
|
-
|
|
464
|
-
# The operation lease guards the SYNCHRONOUS route work that produces
|
|
465
|
-
# the response — not the streaming of its body. A long-lived SSE body
|
|
466
|
-
# would otherwise hold the lease for its whole lifetime and make every
|
|
467
|
-
# profile switch time out during drain (HTTP 503):
|
|
468
|
-
# * /events/stream runs `while True: await sleep(1)` FOREVER while a
|
|
469
|
-
# dashboard tab is open;
|
|
470
|
-
# * /api/v3/chat/stream streams LLM tokens for up to 120s.
|
|
471
|
-
# Release the lease the instant the response starts. By then the route
|
|
472
|
-
# handler has finished its engine work and returned its Response
|
|
473
|
-
# (FastAPI buffers normal responses before sending response.start).
|
|
474
|
-
# Streaming generators that still need the engine (chat recall) already
|
|
475
|
-
# re-acquire their own short-lived lease internally, and /events/stream
|
|
476
|
-
# only reads the EventBus DB — neither depends on this outer lease.
|
|
477
|
-
released = False
|
|
478
|
-
|
|
479
|
-
def _release_lease_once() -> None:
|
|
480
|
-
# Single-task coroutine chain — a plain flag is sufficient; the
|
|
481
|
-
# underlying release_operation() is lock-guarded and idempotent-safe
|
|
482
|
-
# only via this guard, so never call it twice.
|
|
483
|
-
nonlocal released
|
|
484
|
-
if not released:
|
|
485
|
-
released = True
|
|
486
|
-
runtime.release_operation()
|
|
487
|
-
|
|
488
|
-
async def _send(message) -> None:
|
|
489
|
-
if message.get("type") == "http.response.start":
|
|
490
|
-
_release_lease_once()
|
|
491
|
-
await send(message)
|
|
492
|
-
|
|
493
|
-
try:
|
|
494
|
-
await self._app(scope, receive, _send)
|
|
495
|
-
finally:
|
|
496
|
-
_REQUEST_PROFILE.reset(token)
|
|
497
|
-
# Safety net: a request that errors before emitting response.start
|
|
498
|
-
# (or an ASGI app that never sends one) must still release its lease.
|
|
499
|
-
# Release is lock-only and must not itself be cancellation-prone.
|
|
500
|
-
_release_lease_once()
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
__all__ = [
|
|
504
|
-
"ActiveProfilePersistence",
|
|
505
|
-
"ProfileRuntime",
|
|
506
|
-
"ProfileRuntimeMiddleware",
|
|
507
|
-
"ProfileSnapshot",
|
|
508
|
-
"TransitionDrainTimeout",
|
|
509
|
-
"bind_profile_runtime",
|
|
510
|
-
"commit_daemon_profile_switch",
|
|
511
|
-
"current_request_profile",
|
|
512
|
-
"get_profile_runtime",
|
|
513
|
-
"persist_active_profile",
|
|
514
|
-
"reconfigure_daemon_engine",
|
|
515
|
-
]
|