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,429 +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
|
-
"""SLM Mesh MCP Tools — P2P agent communication via the unified daemon.
|
|
6
|
-
|
|
7
|
-
v3.4.4: These tools ship WITH SuperLocalMemory, no separate slm-mesh install needed.
|
|
8
|
-
End users get full mesh functionality from `pip install superlocalmemory`.
|
|
9
|
-
|
|
10
|
-
All tools communicate with the daemon's Python mesh broker on port 8765.
|
|
11
|
-
Auto-heartbeat keeps the session alive as long as the MCP server is running.
|
|
12
|
-
|
|
13
|
-
8 tools: mesh_summary, mesh_peers, mesh_send, mesh_inbox,
|
|
14
|
-
mesh_state, mesh_lock, mesh_events, mesh_status
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import asyncio
|
|
20
|
-
import logging
|
|
21
|
-
import os
|
|
22
|
-
import threading
|
|
23
|
-
import time
|
|
24
|
-
import uuid
|
|
25
|
-
from typing import Callable
|
|
26
|
-
|
|
27
|
-
from mcp.types import ToolAnnotations
|
|
28
|
-
|
|
29
|
-
from superlocalmemory.core.admission import admits
|
|
30
|
-
from superlocalmemory.core.operation_request import OperationKind
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# ---------------------------------------------------------------------------
|
|
36
|
-
# M03: Simple circuit breaker for mesh_send
|
|
37
|
-
# ---------------------------------------------------------------------------
|
|
38
|
-
# Prevents runaway retries (~30s stall) when the daemon is dead.
|
|
39
|
-
# State machine: CLOSED → OPEN (after 3 consecutive failures)
|
|
40
|
-
# OPEN → HALF_OPEN (after 60s cooldown)
|
|
41
|
-
# HALF_OPEN → CLOSED (on one successful probe)
|
|
42
|
-
# HALF_OPEN → OPEN (on probe failure)
|
|
43
|
-
|
|
44
|
-
_CB_FAILURE_THRESHOLD = 3
|
|
45
|
-
_CB_COOLDOWN_SECONDS = 60
|
|
46
|
-
|
|
47
|
-
# Client-side mesh message cap (mirrors the broker's MAX_MESSAGE_SIZE).
|
|
48
|
-
MAX_MESSAGE_SIZE = 4096
|
|
49
|
-
|
|
50
|
-
_CB_STATE_CLOSED = "closed"
|
|
51
|
-
_CB_STATE_OPEN = "open"
|
|
52
|
-
_CB_STATE_HALF_OPEN = "half_open"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class _SendCircuitBreaker:
|
|
56
|
-
"""Thread-safe circuit breaker scoped to mesh_send daemon calls."""
|
|
57
|
-
|
|
58
|
-
def __init__(self) -> None:
|
|
59
|
-
self._lock = threading.Lock()
|
|
60
|
-
self._state: str = _CB_STATE_CLOSED
|
|
61
|
-
self._failure_count: int = 0
|
|
62
|
-
self._opened_at: float = 0.0
|
|
63
|
-
|
|
64
|
-
def reset(self) -> None:
|
|
65
|
-
"""Reset to CLOSED; used by tests for isolation."""
|
|
66
|
-
with self._lock:
|
|
67
|
-
self._state = _CB_STATE_CLOSED
|
|
68
|
-
self._failure_count = 0
|
|
69
|
-
self._opened_at = 0.0
|
|
70
|
-
|
|
71
|
-
def is_open(self) -> bool:
|
|
72
|
-
with self._lock:
|
|
73
|
-
if self._state == _CB_STATE_OPEN:
|
|
74
|
-
if time.monotonic() - self._opened_at >= _CB_COOLDOWN_SECONDS:
|
|
75
|
-
self._state = _CB_STATE_HALF_OPEN
|
|
76
|
-
return False # allow one probe
|
|
77
|
-
return True
|
|
78
|
-
return False
|
|
79
|
-
|
|
80
|
-
def allow_request(self) -> bool:
|
|
81
|
-
"""Return True if the call should proceed; False if circuit is OPEN.
|
|
82
|
-
|
|
83
|
-
State transitions inside the lock prevent concurrent probe races:
|
|
84
|
-
- CLOSED → allow
|
|
85
|
-
- OPEN (cooldown not elapsed) → block
|
|
86
|
-
- OPEN (cooldown elapsed) → transition to HALF_OPEN, allow one probe,
|
|
87
|
-
and immediately re-enter OPEN so any concurrent call is blocked until
|
|
88
|
-
the probe result comes in via record_success / record_failure.
|
|
89
|
-
- HALF_OPEN → block (probe already dispatched and not yet resolved)
|
|
90
|
-
"""
|
|
91
|
-
with self._lock:
|
|
92
|
-
if self._state == _CB_STATE_CLOSED:
|
|
93
|
-
return True
|
|
94
|
-
if self._state == _CB_STATE_OPEN:
|
|
95
|
-
if time.monotonic() - self._opened_at >= _CB_COOLDOWN_SECONDS:
|
|
96
|
-
# Grant exactly one probe by briefly entering HALF_OPEN then
|
|
97
|
-
# going back to OPEN. Subsequent callers are blocked until
|
|
98
|
-
# record_success or record_failure resolves the probe.
|
|
99
|
-
self._state = _CB_STATE_HALF_OPEN
|
|
100
|
-
return True
|
|
101
|
-
return False
|
|
102
|
-
# HALF_OPEN: probe is in flight — block until resolved
|
|
103
|
-
return False
|
|
104
|
-
|
|
105
|
-
def record_success(self) -> None:
|
|
106
|
-
with self._lock:
|
|
107
|
-
self._state = _CB_STATE_CLOSED
|
|
108
|
-
self._failure_count = 0
|
|
109
|
-
|
|
110
|
-
def record_failure(self) -> None:
|
|
111
|
-
with self._lock:
|
|
112
|
-
if self._state == _CB_STATE_HALF_OPEN:
|
|
113
|
-
# Probe failed — reopen immediately
|
|
114
|
-
self._state = _CB_STATE_OPEN
|
|
115
|
-
self._opened_at = time.monotonic()
|
|
116
|
-
return
|
|
117
|
-
self._failure_count += 1
|
|
118
|
-
if self._failure_count >= _CB_FAILURE_THRESHOLD:
|
|
119
|
-
self._state = _CB_STATE_OPEN
|
|
120
|
-
self._opened_at = time.monotonic()
|
|
121
|
-
logger.warning(
|
|
122
|
-
"mesh_send circuit breaker OPEN after %d consecutive failures; "
|
|
123
|
-
"fast-failing for %ds",
|
|
124
|
-
self._failure_count,
|
|
125
|
-
_CB_COOLDOWN_SECONDS,
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
_SEND_CIRCUIT = _SendCircuitBreaker()
|
|
130
|
-
|
|
131
|
-
# Unique peer ID for this MCP server session
|
|
132
|
-
_PEER_ID = str(uuid.uuid4())[:12]
|
|
133
|
-
_SESSION_SUMMARY = ""
|
|
134
|
-
_PROJECT_PATH = "" # v3.4.6: detected from cwd or CLAUDE_PROJECT_DIR
|
|
135
|
-
_HEARTBEAT_INTERVAL = 25 # seconds (broker marks stale at 30s, dead at 60s)
|
|
136
|
-
_HEARTBEAT_THREAD: threading.Thread | None = None
|
|
137
|
-
_REGISTERED = False
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
def _detect_project_path() -> str:
|
|
141
|
-
"""Detect current project path from env or cwd."""
|
|
142
|
-
return (
|
|
143
|
-
os.environ.get("CLAUDE_PROJECT_DIR")
|
|
144
|
-
or os.environ.get("PROJECT_PATH")
|
|
145
|
-
or os.getcwd()
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
def _mesh_request(method: str, path: str, body: dict | None = None) -> dict | None:
|
|
150
|
-
"""Send an exact-instance, capability-authenticated mesh request."""
|
|
151
|
-
try:
|
|
152
|
-
from superlocalmemory.cli.daemon import daemon_request
|
|
153
|
-
|
|
154
|
-
return daemon_request(method, f"/mesh{path}", body)
|
|
155
|
-
except Exception as exc:
|
|
156
|
-
logger.debug("Mesh request failed: %s %s — %s", method, path, exc)
|
|
157
|
-
return None
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def _ensure_registered() -> None:
|
|
161
|
-
"""Register this session with the mesh broker if not already."""
|
|
162
|
-
global _REGISTERED, _PROJECT_PATH, _PEER_ID
|
|
163
|
-
if _REGISTERED:
|
|
164
|
-
return
|
|
165
|
-
|
|
166
|
-
_PROJECT_PATH = _detect_project_path()
|
|
167
|
-
result = _mesh_request("POST", "/register", {
|
|
168
|
-
"peer_id": _PEER_ID,
|
|
169
|
-
"session_id": os.environ.get("CLAUDE_SESSION_ID", _PEER_ID),
|
|
170
|
-
"summary": _SESSION_SUMMARY or "SLM MCP session",
|
|
171
|
-
"project_path": _PROJECT_PATH,
|
|
172
|
-
# Peer identity is the canonical SLM_AGENT_ID (same var memory
|
|
173
|
-
# attribution uses), so Antigravity/Hermes/Cursor/etc. show as
|
|
174
|
-
# themselves instead of collapsing to "claude_code". Fall back to the
|
|
175
|
-
# legacy CLAUDE_AGENT_TYPE, then a generic default.
|
|
176
|
-
"agent_type": (
|
|
177
|
-
os.environ.get("SLM_AGENT_ID")
|
|
178
|
-
or os.environ.get("CLAUDE_AGENT_TYPE")
|
|
179
|
-
or "claude_code"
|
|
180
|
-
),
|
|
181
|
-
})
|
|
182
|
-
if result:
|
|
183
|
-
# v3.6.12 (mesh-1): the broker mints its OWN peer_id (RegisterRequest has
|
|
184
|
-
# no peer_id field, so our body value is dropped by pydantic). Adopt the
|
|
185
|
-
# broker's id BEFORE starting the heartbeat, otherwise heartbeat/send/
|
|
186
|
-
# inbox all target a non-existent peer → 404s and the session is reaped.
|
|
187
|
-
_PEER_ID = result.get("peer_id", _PEER_ID)
|
|
188
|
-
_REGISTERED = True
|
|
189
|
-
_start_heartbeat()
|
|
190
|
-
pending = result.get("pending_messages", 0)
|
|
191
|
-
if pending > 0:
|
|
192
|
-
logger.info("Mesh: %d pending messages waiting", pending)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
def _start_heartbeat() -> None:
|
|
196
|
-
"""Background thread that sends heartbeat to keep session alive."""
|
|
197
|
-
global _HEARTBEAT_THREAD
|
|
198
|
-
if _HEARTBEAT_THREAD is not None:
|
|
199
|
-
return
|
|
200
|
-
|
|
201
|
-
def heartbeat_loop():
|
|
202
|
-
while True:
|
|
203
|
-
time.sleep(_HEARTBEAT_INTERVAL)
|
|
204
|
-
try:
|
|
205
|
-
_mesh_request("POST", "/heartbeat", {"peer_id": _PEER_ID})
|
|
206
|
-
except Exception:
|
|
207
|
-
pass
|
|
208
|
-
|
|
209
|
-
_HEARTBEAT_THREAD = threading.Thread(target=heartbeat_loop, daemon=True, name="mesh-heartbeat")
|
|
210
|
-
_HEARTBEAT_THREAD.start()
|
|
211
|
-
logger.info("Mesh heartbeat started (peer_id=%s, interval=%ds)", _PEER_ID, _HEARTBEAT_INTERVAL)
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
def auto_register_mesh() -> None:
|
|
215
|
-
"""Called from server.py warmup to register this session immediately.
|
|
216
|
-
|
|
217
|
-
v3.4.6: Sessions register at MCP startup, not lazily on first tool call.
|
|
218
|
-
This ensures every Claude session is visible on the mesh from the start.
|
|
219
|
-
"""
|
|
220
|
-
_ensure_registered()
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
def register_mesh_tools(server, get_engine: Callable) -> None:
|
|
224
|
-
"""Register all 8 mesh MCP tools."""
|
|
225
|
-
|
|
226
|
-
@server.tool()
|
|
227
|
-
@admits(OperationKind.MESH_SEND)
|
|
228
|
-
async def mesh_summary(summary: str = "") -> dict:
|
|
229
|
-
"""Register this session and describe what you're working on.
|
|
230
|
-
|
|
231
|
-
Call this at the start of every session. Other agents can see your summary
|
|
232
|
-
and send you messages. The session stays alive via automatic heartbeat.
|
|
233
|
-
v3.4.6: Sessions auto-register at MCP startup, but calling this updates
|
|
234
|
-
the summary so other sessions know what you're doing.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
summary: What this session is working on (e.g. "Fixing auth bug in api.py")
|
|
238
|
-
"""
|
|
239
|
-
global _SESSION_SUMMARY
|
|
240
|
-
_SESSION_SUMMARY = summary or "Active session"
|
|
241
|
-
|
|
242
|
-
await asyncio.to_thread(_ensure_registered)
|
|
243
|
-
|
|
244
|
-
# Update summary
|
|
245
|
-
result = await asyncio.to_thread(
|
|
246
|
-
_mesh_request, "POST", "/summary",
|
|
247
|
-
{"peer_id": _PEER_ID, "summary": _SESSION_SUMMARY},
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
return {
|
|
251
|
-
"peer_id": _PEER_ID,
|
|
252
|
-
"summary": _SESSION_SUMMARY,
|
|
253
|
-
"project_path": _PROJECT_PATH,
|
|
254
|
-
"registered": _REGISTERED,
|
|
255
|
-
"heartbeat_active": _HEARTBEAT_THREAD is not None and _HEARTBEAT_THREAD.is_alive(),
|
|
256
|
-
"broker_response": result,
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
@server.tool(annotations=ToolAnnotations(readOnlyHint=True))
|
|
260
|
-
async def mesh_peers() -> dict:
|
|
261
|
-
"""List all active peer sessions on this machine.
|
|
262
|
-
|
|
263
|
-
Shows other Claude Code, Cursor, or AI agent sessions that are
|
|
264
|
-
connected to the same SLM mesh network.
|
|
265
|
-
"""
|
|
266
|
-
await asyncio.to_thread(_ensure_registered)
|
|
267
|
-
result = await asyncio.to_thread(_mesh_request, "GET", "/peers")
|
|
268
|
-
peers = (result or {}).get("peers", [])
|
|
269
|
-
return {
|
|
270
|
-
"peers": peers,
|
|
271
|
-
"count": len(peers),
|
|
272
|
-
"my_peer_id": _PEER_ID,
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
@server.tool()
|
|
276
|
-
@admits(OperationKind.MESH_SEND)
|
|
277
|
-
async def mesh_send(to: str, message: str) -> dict:
|
|
278
|
-
"""Send a message to another peer session, broadcast, or project.
|
|
279
|
-
|
|
280
|
-
Args:
|
|
281
|
-
to: Target — one of:
|
|
282
|
-
- A peer_id from mesh_peers (direct message)
|
|
283
|
-
- "broadcast" (all active + future sessions within 48h)
|
|
284
|
-
- "project:/path/to/dir" (all sessions in that project directory)
|
|
285
|
-
message: The message content (max 4KB — use file paths for large data)
|
|
286
|
-
"""
|
|
287
|
-
# Enforce the documented 4KB notification cap client-side too (the
|
|
288
|
-
# broker also caps, but fail fast without a round-trip).
|
|
289
|
-
if len(message.encode("utf-8")) > MAX_MESSAGE_SIZE:
|
|
290
|
-
return {"ok": False, "error": (
|
|
291
|
-
f"message too large (max {MAX_MESSAGE_SIZE} bytes) — "
|
|
292
|
-
"reference a file path instead")}
|
|
293
|
-
# M03: circuit breaker — fast-fail if daemon is repeatedly unreachable
|
|
294
|
-
if not _SEND_CIRCUIT.allow_request():
|
|
295
|
-
return {
|
|
296
|
-
"ok": False,
|
|
297
|
-
"error": (
|
|
298
|
-
"mesh_send circuit open: daemon unreachable after repeated failures. "
|
|
299
|
-
f"Retrying in {_CB_COOLDOWN_SECONDS}s."
|
|
300
|
-
),
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
await asyncio.to_thread(_ensure_registered)
|
|
304
|
-
result = await asyncio.to_thread(
|
|
305
|
-
_mesh_request, "POST", "/send",
|
|
306
|
-
{"from_peer": _PEER_ID, "to_peer": to, "content": message},
|
|
307
|
-
)
|
|
308
|
-
# Circuit tracks daemon-unreachable (None) only — not valid broker errors
|
|
309
|
-
# like "recipient not found", which are application-level, not failures.
|
|
310
|
-
if result is None:
|
|
311
|
-
_SEND_CIRCUIT.record_failure()
|
|
312
|
-
return {"ok": False, "error": "Failed to send message"}
|
|
313
|
-
_SEND_CIRCUIT.record_success()
|
|
314
|
-
return result
|
|
315
|
-
|
|
316
|
-
@server.tool()
|
|
317
|
-
@admits(OperationKind.MESH_SEND)
|
|
318
|
-
async def mesh_inbox() -> dict:
|
|
319
|
-
"""Read messages sent to this session.
|
|
320
|
-
|
|
321
|
-
Returns unread messages: direct + broadcast + project-targeted.
|
|
322
|
-
Broadcast/project messages are delivered to ALL matching sessions.
|
|
323
|
-
Messages auto-expire after 48 hours.
|
|
324
|
-
"""
|
|
325
|
-
await asyncio.to_thread(_ensure_registered)
|
|
326
|
-
from urllib.parse import quote
|
|
327
|
-
project = _PROJECT_PATH or _detect_project_path()
|
|
328
|
-
messages = await asyncio.to_thread(
|
|
329
|
-
_mesh_request, "GET",
|
|
330
|
-
f"/inbox/{_PEER_ID}?project_path={quote(project, safe='')}",
|
|
331
|
-
)
|
|
332
|
-
msg_list = (messages or {}).get("messages", [])
|
|
333
|
-
# Auto-mark unread messages as read. v3.6.12 (failopen-2): use .get("id")
|
|
334
|
-
# — a malformed broker message without an "id" key used to raise KeyError
|
|
335
|
-
# out to the agent, violating the never-raise contract.
|
|
336
|
-
unread_ids = [m["id"] for m in msg_list
|
|
337
|
-
if not m.get("read") and m.get("id") is not None]
|
|
338
|
-
if unread_ids:
|
|
339
|
-
await asyncio.to_thread(
|
|
340
|
-
_mesh_request, "POST", f"/inbox/{_PEER_ID}/read",
|
|
341
|
-
{"message_ids": unread_ids},
|
|
342
|
-
)
|
|
343
|
-
return {
|
|
344
|
-
"messages": msg_list,
|
|
345
|
-
"count": len(msg_list),
|
|
346
|
-
"unread": len(unread_ids),
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
@server.tool()
|
|
350
|
-
@admits(OperationKind.MESH_SEND)
|
|
351
|
-
async def mesh_state(key: str = "", value: str = "", action: str = "get") -> dict:
|
|
352
|
-
"""Get or set shared state across all sessions.
|
|
353
|
-
|
|
354
|
-
Shared state is visible to authenticated peers. Use it for non-secret
|
|
355
|
-
coordination metadata such as feature flags and task assignments.
|
|
356
|
-
Credentials, tokens, passwords, and API keys are rejected.
|
|
357
|
-
|
|
358
|
-
Args:
|
|
359
|
-
key: State key name
|
|
360
|
-
value: Value to set (only for action="set")
|
|
361
|
-
action: "get" (read all or one key), "set" (write a key)
|
|
362
|
-
"""
|
|
363
|
-
await asyncio.to_thread(_ensure_registered)
|
|
364
|
-
|
|
365
|
-
if action == "set" and key:
|
|
366
|
-
result = await asyncio.to_thread(
|
|
367
|
-
_mesh_request, "POST", "/state",
|
|
368
|
-
{"key": key, "value": value, "set_by": _PEER_ID},
|
|
369
|
-
)
|
|
370
|
-
return result or {"ok": False, "error": "Failed to set state"}
|
|
371
|
-
|
|
372
|
-
if key:
|
|
373
|
-
result = await asyncio.to_thread(_mesh_request, "GET", f"/state/{key}")
|
|
374
|
-
return result or {"key": key, "value": None}
|
|
375
|
-
|
|
376
|
-
result = await asyncio.to_thread(_mesh_request, "GET", "/state")
|
|
377
|
-
return result or {"state": {}}
|
|
378
|
-
|
|
379
|
-
@server.tool()
|
|
380
|
-
@admits(OperationKind.MESH_LOCK)
|
|
381
|
-
async def mesh_lock(
|
|
382
|
-
file_path: str,
|
|
383
|
-
action: str = "query",
|
|
384
|
-
) -> dict:
|
|
385
|
-
"""Manage file locks across sessions.
|
|
386
|
-
|
|
387
|
-
Before editing a shared file, check if another session has it locked.
|
|
388
|
-
|
|
389
|
-
Args:
|
|
390
|
-
file_path: Absolute path to the file
|
|
391
|
-
action: "query" (check lock), "acquire" (lock file), "release" (unlock)
|
|
392
|
-
"""
|
|
393
|
-
# Require a non-empty absolute path; a relative/blank path is ambiguous
|
|
394
|
-
# and lets a caller probe arbitrary strings via the coordination store.
|
|
395
|
-
if not file_path or not (
|
|
396
|
-
file_path.startswith("/")
|
|
397
|
-
or (len(file_path) >= 3 and file_path[1] == ":")
|
|
398
|
-
):
|
|
399
|
-
return {"ok": False, "error": "file_path must be a non-empty absolute path"}
|
|
400
|
-
await asyncio.to_thread(_ensure_registered)
|
|
401
|
-
result = await asyncio.to_thread(
|
|
402
|
-
_mesh_request, "POST", "/lock",
|
|
403
|
-
{"file_path": file_path, "action": action, "locked_by": _PEER_ID},
|
|
404
|
-
)
|
|
405
|
-
return result or {"ok": False, "error": "Lock operation failed"}
|
|
406
|
-
|
|
407
|
-
@server.tool(annotations=ToolAnnotations(readOnlyHint=True))
|
|
408
|
-
async def mesh_events() -> dict:
|
|
409
|
-
"""Get recent mesh events (peer joins, leaves, messages, state changes).
|
|
410
|
-
|
|
411
|
-
Shows the activity log of the mesh network.
|
|
412
|
-
"""
|
|
413
|
-
result = await asyncio.to_thread(_mesh_request, "GET", "/events")
|
|
414
|
-
return result or {"events": []}
|
|
415
|
-
|
|
416
|
-
@server.tool(annotations=ToolAnnotations(readOnlyHint=True))
|
|
417
|
-
async def mesh_status() -> dict:
|
|
418
|
-
"""Get mesh broker health and statistics.
|
|
419
|
-
|
|
420
|
-
Shows broker uptime, peer count, and connection status.
|
|
421
|
-
"""
|
|
422
|
-
result = await asyncio.to_thread(_mesh_request, "GET", "/status")
|
|
423
|
-
if result:
|
|
424
|
-
result["my_peer_id"] = _PEER_ID
|
|
425
|
-
result["heartbeat_active"] = _HEARTBEAT_THREAD is not None and _HEARTBEAT_THREAD.is_alive()
|
|
426
|
-
return result or {
|
|
427
|
-
"broker_up": False,
|
|
428
|
-
"error": "Cannot reach mesh broker. Is the daemon running? (slm serve start)",
|
|
429
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V4 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Operational Recovery & Admin Remediation MCP tools (2 tools).
|
|
6
|
-
|
|
7
|
-
list_failed_operations — Surface dead-letter, degraded, and exhausted ops.
|
|
8
|
-
resolve_operation — Admin retry/force-reconcile/cancel for stuck ops.
|
|
9
|
-
|
|
10
|
-
RBAC: both tools require OWNER or ADMIN role (OPS_INSPECT / OPS_RESOLVE policy).
|
|
11
|
-
|
|
12
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
import logging
|
|
18
|
-
from typing import Callable
|
|
19
|
-
|
|
20
|
-
from mcp.types import ToolAnnotations
|
|
21
|
-
|
|
22
|
-
from superlocalmemory.core.admission import admits
|
|
23
|
-
from superlocalmemory.core.operation_request import OperationKind
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
|
-
|
|
27
|
-
_VALID_ACTIONS = frozenset({"retry", "force_reconcile", "cancel"})
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def register_ops_tools(server, get_engine: Callable) -> None:
|
|
31
|
-
"""Register operational-recovery MCP tools on *server*."""
|
|
32
|
-
|
|
33
|
-
# ------------------------------------------------------------------
|
|
34
|
-
# 1. list_failed_operations — surface all stuck/failed/degraded ops
|
|
35
|
-
# ------------------------------------------------------------------
|
|
36
|
-
@server.tool(annotations=ToolAnnotations(readOnlyHint=True))
|
|
37
|
-
@admits(OperationKind.OPS_INSPECT)
|
|
38
|
-
async def list_failed_operations(
|
|
39
|
-
profile_id: str = "",
|
|
40
|
-
) -> dict:
|
|
41
|
-
"""List all failed, stuck, or degraded memory operations.
|
|
42
|
-
|
|
43
|
-
Returns three categories of troubled operations:
|
|
44
|
-
- dead_letter: ingestion ops that exhausted all automatic retries.
|
|
45
|
-
- degraded_manifests: completion records where some projections failed.
|
|
46
|
-
- exhausted_obligations: graph/projection tasks that could not apply.
|
|
47
|
-
|
|
48
|
-
An admin can then call resolve_operation to retry, force-reconcile, or
|
|
49
|
-
cancel each entry. Non-technical users see these in the dashboard
|
|
50
|
-
Operations & Health panel.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
profile_id: Filter to a specific profile (empty = all profiles).
|
|
54
|
-
"""
|
|
55
|
-
try:
|
|
56
|
-
engine = get_engine()
|
|
57
|
-
db_path = getattr(getattr(engine, "_config", None), "db_path", None)
|
|
58
|
-
if db_path is None:
|
|
59
|
-
from superlocalmemory.infra.data_root import state_path
|
|
60
|
-
db_path = state_path("memory.db")
|
|
61
|
-
|
|
62
|
-
from superlocalmemory.core.ops_remediation import (
|
|
63
|
-
list_failed_operations as _list,
|
|
64
|
-
)
|
|
65
|
-
result = _list(db_path, profile_id=profile_id or None)
|
|
66
|
-
return {"success": True, **result}
|
|
67
|
-
except Exception as exc:
|
|
68
|
-
logger.exception("list_failed_operations tool failed")
|
|
69
|
-
return {"success": False, "error": str(exc)}
|
|
70
|
-
|
|
71
|
-
# ------------------------------------------------------------------
|
|
72
|
-
# 2. resolve_operation — admin remediation: retry / force / cancel
|
|
73
|
-
# ------------------------------------------------------------------
|
|
74
|
-
@server.tool(annotations=ToolAnnotations(destructiveHint=True))
|
|
75
|
-
@admits(OperationKind.OPS_RESOLVE)
|
|
76
|
-
async def resolve_operation(
|
|
77
|
-
operation_id: str,
|
|
78
|
-
action: str,
|
|
79
|
-
) -> dict:
|
|
80
|
-
"""Resolve a stuck, failed, or degraded operation.
|
|
81
|
-
|
|
82
|
-
Performs one of three remediation actions:
|
|
83
|
-
- retry: Re-queue the dead-letter entry for ingestion.
|
|
84
|
-
- force_reconcile: Force projection obligations to re-apply now.
|
|
85
|
-
- cancel: Remove the entry from failure surfaces permanently.
|
|
86
|
-
|
|
87
|
-
After a cancel, the entry no longer appears in list_failed_operations.
|
|
88
|
-
After retry/force_reconcile, results depend on whether the underlying
|
|
89
|
-
issue (e.g. missing embedding model) is now resolved.
|
|
90
|
-
|
|
91
|
-
Args:
|
|
92
|
-
operation_id: The operation_id string shown in list_failed_operations.
|
|
93
|
-
action: One of: retry, force_reconcile, cancel.
|
|
94
|
-
"""
|
|
95
|
-
if action not in _VALID_ACTIONS:
|
|
96
|
-
return {
|
|
97
|
-
"success": False,
|
|
98
|
-
"error": f"invalid action '{action}': must be one of {sorted(_VALID_ACTIONS)}",
|
|
99
|
-
}
|
|
100
|
-
try:
|
|
101
|
-
engine = get_engine()
|
|
102
|
-
db_path = getattr(getattr(engine, "_config", None), "db_path", None)
|
|
103
|
-
if db_path is None:
|
|
104
|
-
from superlocalmemory.infra.data_root import state_path
|
|
105
|
-
db_path = state_path("memory.db")
|
|
106
|
-
|
|
107
|
-
from superlocalmemory.core.ops_remediation import (
|
|
108
|
-
resolve_operation as _resolve,
|
|
109
|
-
)
|
|
110
|
-
return _resolve(db_path, engine, operation_id, action)
|
|
111
|
-
except ValueError as exc:
|
|
112
|
-
return {"success": False, "error": str(exc)}
|
|
113
|
-
except Exception as exc:
|
|
114
|
-
logger.exception("resolve_operation tool failed op=%s action=%s", operation_id, action)
|
|
115
|
-
return {"success": False, "error": str(exc)}
|