superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,517 +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 — FastAPI routes for P2P agent communication.
|
|
6
|
-
|
|
7
|
-
Mounted at /mesh/* in the unified daemon. Uses MeshBroker for all operations.
|
|
8
|
-
|
|
9
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import re
|
|
15
|
-
from datetime import datetime, timedelta, timezone
|
|
16
|
-
|
|
17
|
-
from fastapi import APIRouter, HTTPException, Request
|
|
18
|
-
from pydantic import BaseModel
|
|
19
|
-
|
|
20
|
-
router = APIRouter(prefix="/mesh", tags=["mesh"])
|
|
21
|
-
|
|
22
|
-
_LOOPBACK_HOSTS = frozenset({"127.0.0.1", "::1", "localhost"})
|
|
23
|
-
_STALE_AFTER = timedelta(minutes=5)
|
|
24
|
-
_EXPIRE_AFTER = timedelta(minutes=30)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# -- Request models --
|
|
28
|
-
|
|
29
|
-
class RegisterRequest(BaseModel):
|
|
30
|
-
session_id: str
|
|
31
|
-
summary: str = ""
|
|
32
|
-
host: str = "127.0.0.1"
|
|
33
|
-
port: int = 0
|
|
34
|
-
project_path: str = ""
|
|
35
|
-
agent_type: str = "unknown"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class DeregisterRequest(BaseModel):
|
|
39
|
-
peer_id: str
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class HeartbeatRequest(BaseModel):
|
|
43
|
-
peer_id: str
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class SummaryRequest(BaseModel):
|
|
47
|
-
peer_id: str
|
|
48
|
-
summary: str
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class SendRequest(BaseModel):
|
|
52
|
-
from_peer: str = ""
|
|
53
|
-
to: str = ""
|
|
54
|
-
to_peer: str = "" # v3.4.6: accept both 'to' and 'to_peer' for compatibility
|
|
55
|
-
content: str
|
|
56
|
-
type: str = "text"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class ReadRequest(BaseModel):
|
|
60
|
-
message_ids: list[int]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class StateSetRequest(BaseModel):
|
|
64
|
-
key: str
|
|
65
|
-
value: str
|
|
66
|
-
set_by: str
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class LockRequest(BaseModel):
|
|
70
|
-
file_path: str
|
|
71
|
-
locked_by: str
|
|
72
|
-
action: str # acquire, release, query
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# -- Helpers --
|
|
76
|
-
|
|
77
|
-
def _get_broker(request: Request):
|
|
78
|
-
broker = getattr(request.app.state, 'mesh_broker', None)
|
|
79
|
-
if broker is None:
|
|
80
|
-
raise HTTPException(503, detail="Mesh broker not initialized")
|
|
81
|
-
# Check if mesh is enabled
|
|
82
|
-
config = getattr(request.app.state, 'config', None)
|
|
83
|
-
if config and not getattr(config, 'mesh_enabled', True):
|
|
84
|
-
raise HTTPException(503, detail="Mesh disabled in config")
|
|
85
|
-
# v3.6.12 (mesh-1 security): SLM_MESH_SHARED_SECRET was read by the broker but
|
|
86
|
-
# never verified on inbound mesh HTTP calls. When a secret is configured,
|
|
87
|
-
# require it (constant-time) from NON-loopback callers via X-Mesh-Secret.
|
|
88
|
-
# The local MCP client always calls over loopback and is exempt, so this is
|
|
89
|
-
# zero-change for single-machine use and closes the LAN mesh auth bypass.
|
|
90
|
-
secret = getattr(broker, "_shared_secret", None)
|
|
91
|
-
if secret:
|
|
92
|
-
client_host = request.client.host if request.client else ""
|
|
93
|
-
from superlocalmemory.server.loopback import is_loopback as _is_loopback_host
|
|
94
|
-
|
|
95
|
-
if not _is_loopback_host(client_host):
|
|
96
|
-
import hmac
|
|
97
|
-
|
|
98
|
-
from superlocalmemory.core.security_primitives import verify_install_token
|
|
99
|
-
|
|
100
|
-
# Path 1: install token — dashboard/browser callers hold this and
|
|
101
|
-
# should not need the mesh secret exposed in JS.
|
|
102
|
-
install_token = request.headers.get("x-install-token", "")
|
|
103
|
-
if install_token and verify_install_token(install_token):
|
|
104
|
-
return broker
|
|
105
|
-
|
|
106
|
-
# Path 2: mesh secret — remote agents / remote_sync.py / LAN peers.
|
|
107
|
-
# Accept X-Mesh-Secret (legacy v3.6.12 header) OR
|
|
108
|
-
# Authorization: Bearer <secret> (RFC 7617 canonical form).
|
|
109
|
-
presented = (
|
|
110
|
-
request.headers.get("x-mesh-secret")
|
|
111
|
-
or request.headers.get("authorization", "").removeprefix("Bearer ").strip()
|
|
112
|
-
)
|
|
113
|
-
if not presented or not hmac.compare_digest(presented, secret):
|
|
114
|
-
raise HTTPException(401, detail="invalid or missing credential")
|
|
115
|
-
# TEST-1/SEC: When a fleet secret is configured, it is the primary auth
|
|
116
|
-
# mechanism. Loopback callers are trusted by transport and need no further
|
|
117
|
-
# proof. Only fall through to require_write_actor when NO secret is configured
|
|
118
|
-
# (install-token-only, single-machine mode).
|
|
119
|
-
return broker
|
|
120
|
-
|
|
121
|
-
# Loopback is a transport property, not an identity. Every mesh read and
|
|
122
|
-
# write must prove the install/API/process capability because peer inboxes,
|
|
123
|
-
# coordination state, and project paths can be sensitive.
|
|
124
|
-
from superlocalmemory.server.write_identity import require_write_actor
|
|
125
|
-
|
|
126
|
-
require_write_actor(
|
|
127
|
-
request,
|
|
128
|
-
getattr(request.app.state, "daemon_descriptor", None),
|
|
129
|
-
actor_kind="mesh-route",
|
|
130
|
-
)
|
|
131
|
-
return broker
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _active_profile() -> str:
|
|
135
|
-
"""Resolve the tenant (profile) for this mesh request.
|
|
136
|
-
|
|
137
|
-
The mesh is a per-tenant coordination bus: peers, messages, shared state,
|
|
138
|
-
and locks are all scoped to the active profile so one tenant never sees
|
|
139
|
-
another's coordination traffic. Resolved from the request ContextVar set by
|
|
140
|
-
ProfileRuntimeMiddleware (falls back to the configured active profile).
|
|
141
|
-
"""
|
|
142
|
-
from superlocalmemory.server.routes.helpers import get_active_profile
|
|
143
|
-
|
|
144
|
-
return get_active_profile()
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
_SECRET_KEY = re.compile(
|
|
148
|
-
r"(?:^|[_\-.])(api[_\-.]?key|secret|token|password|credential)(?:$|[_\-.])",
|
|
149
|
-
re.IGNORECASE,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def _reject_secret_state(key: str, value: str) -> None:
|
|
154
|
-
"""Refuse secret material in the plaintext coordination store."""
|
|
155
|
-
from superlocalmemory.core.security_primitives import redact_secrets
|
|
156
|
-
|
|
157
|
-
if _SECRET_KEY.search(key) or redact_secrets(value) != value:
|
|
158
|
-
raise HTTPException(
|
|
159
|
-
422,
|
|
160
|
-
detail="Mesh state is coordination metadata; secret values are prohibited",
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
# -- Routes --
|
|
165
|
-
|
|
166
|
-
@router.post("/register")
|
|
167
|
-
def register(req: RegisterRequest, request: Request):
|
|
168
|
-
broker = _get_broker(request)
|
|
169
|
-
if not req.session_id:
|
|
170
|
-
raise HTTPException(400, detail="session_id required")
|
|
171
|
-
return broker.register_peer(
|
|
172
|
-
req.session_id, req.summary, req.host, req.port,
|
|
173
|
-
req.project_path, req.agent_type, profile_id=_active_profile(),
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
@router.post("/deregister")
|
|
178
|
-
def deregister(req: DeregisterRequest, request: Request):
|
|
179
|
-
broker = _get_broker(request)
|
|
180
|
-
result = broker.deregister_peer(req.peer_id, profile_id=_active_profile())
|
|
181
|
-
if not result.get("ok"):
|
|
182
|
-
raise HTTPException(404, detail=result.get("error", "peer not found"))
|
|
183
|
-
return result
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
def _peer_activity_counts(request: Request, session_ids: list[str]) -> dict:
|
|
187
|
-
"""Per-session {tool_count, memory_count} for the active profile.
|
|
188
|
-
|
|
189
|
-
Each mesh peer IS an agent session, so its activity is the tool events it
|
|
190
|
-
logged and the memories it contributed under the current profile. Batched
|
|
191
|
-
to a single grouped query per table. Fail-soft: returns {} on any error so
|
|
192
|
-
the peer list still renders.
|
|
193
|
-
"""
|
|
194
|
-
if not session_ids:
|
|
195
|
-
return {}
|
|
196
|
-
try:
|
|
197
|
-
from superlocalmemory.server.routes.helpers import (
|
|
198
|
-
get_active_profile,
|
|
199
|
-
get_engine_lazy,
|
|
200
|
-
)
|
|
201
|
-
engine = get_engine_lazy(request.app.state)
|
|
202
|
-
if engine is None:
|
|
203
|
-
return {}
|
|
204
|
-
profile = get_active_profile()
|
|
205
|
-
placeholders = ",".join("?" * len(session_ids))
|
|
206
|
-
params = [profile, *session_ids]
|
|
207
|
-
counts: dict[str, dict] = {sid: {"tool_count": 0, "memory_count": 0}
|
|
208
|
-
for sid in session_ids}
|
|
209
|
-
for table, key in (("tool_events", "tool_count"),
|
|
210
|
-
("memories", "memory_count")):
|
|
211
|
-
try:
|
|
212
|
-
rows = engine._db.execute(
|
|
213
|
-
f"SELECT session_id, COUNT(*) AS n FROM {table} "
|
|
214
|
-
f"WHERE profile_id = ? AND session_id IN ({placeholders}) "
|
|
215
|
-
"GROUP BY session_id",
|
|
216
|
-
tuple(params),
|
|
217
|
-
)
|
|
218
|
-
for r in rows:
|
|
219
|
-
d = dict(r)
|
|
220
|
-
sid = d.get("session_id")
|
|
221
|
-
if sid in counts:
|
|
222
|
-
counts[sid][key] = d.get("n", 0)
|
|
223
|
-
except Exception:
|
|
224
|
-
continue
|
|
225
|
-
return counts
|
|
226
|
-
except Exception:
|
|
227
|
-
return {}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def _parse_heartbeat(value: object) -> datetime | None:
|
|
231
|
-
"""Parse a stored heartbeat as UTC without trusting malformed values."""
|
|
232
|
-
if not isinstance(value, str) or not value:
|
|
233
|
-
return None
|
|
234
|
-
try:
|
|
235
|
-
parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
236
|
-
except ValueError:
|
|
237
|
-
return None
|
|
238
|
-
if parsed.tzinfo is None:
|
|
239
|
-
return parsed.replace(tzinfo=timezone.utc)
|
|
240
|
-
return parsed.astimezone(timezone.utc)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
def _mesh_read_model(records: list[dict]) -> tuple[list[dict], list[dict]]:
|
|
244
|
-
"""Return bounded remote peers and local sessions with read-time liveness.
|
|
245
|
-
|
|
246
|
-
The broker persists local agent sessions in ``mesh_peers`` for messaging.
|
|
247
|
-
That storage detail must not make them look like remote mesh neighbours in
|
|
248
|
-
the dashboard. Classification is read-only so an ordinary dashboard GET
|
|
249
|
-
neither mutates a live database nor waits for the five-minute cleanup loop.
|
|
250
|
-
"""
|
|
251
|
-
now = datetime.now(timezone.utc)
|
|
252
|
-
remote: list[dict] = []
|
|
253
|
-
local: list[dict] = []
|
|
254
|
-
for record in records:
|
|
255
|
-
heartbeat = _parse_heartbeat(record.get("last_heartbeat"))
|
|
256
|
-
if heartbeat is None:
|
|
257
|
-
continue
|
|
258
|
-
age = now - heartbeat
|
|
259
|
-
if age >= _EXPIRE_AFTER:
|
|
260
|
-
continue
|
|
261
|
-
stale_at = heartbeat + _STALE_AFTER
|
|
262
|
-
expires_at = heartbeat + _EXPIRE_AFTER
|
|
263
|
-
status = "active" if age < _STALE_AFTER else "stale"
|
|
264
|
-
normalized = {
|
|
265
|
-
**record,
|
|
266
|
-
"status": status,
|
|
267
|
-
"stale_at": stale_at.isoformat(),
|
|
268
|
-
"expires_at": expires_at.isoformat(),
|
|
269
|
-
}
|
|
270
|
-
# display-only — not an auth decision; is_loopback() handles IPv4-mapped forms
|
|
271
|
-
# such as "::ffff:127.0.0.1" that _LOOPBACK_HOSTS misses.
|
|
272
|
-
from superlocalmemory.server.loopback import is_loopback as _is_loopback
|
|
273
|
-
if _is_loopback(str(record.get("host") or "").lower()):
|
|
274
|
-
local.append(normalized)
|
|
275
|
-
else:
|
|
276
|
-
remote.append(normalized)
|
|
277
|
-
return remote, local
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
def _mesh_counts(remote: list[dict], local: list[dict]) -> dict:
|
|
281
|
-
"""Expose active counts separately while retaining the legacy total key."""
|
|
282
|
-
active_remote = sum(peer["status"] == "active" for peer in remote)
|
|
283
|
-
active_local = sum(session["status"] == "active" for session in local)
|
|
284
|
-
return {
|
|
285
|
-
"peer_count": active_remote + active_local,
|
|
286
|
-
"active_peer_count": active_remote + active_local,
|
|
287
|
-
"remote_peer_count": active_remote,
|
|
288
|
-
"local_session_count": active_local,
|
|
289
|
-
"stale_peer_count": sum(peer["status"] == "stale" for peer in remote),
|
|
290
|
-
"stale_local_session_count": sum(session["status"] == "stale" for session in local),
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
@router.get("/peers")
|
|
295
|
-
def peers(request: Request, view: str = "all"):
|
|
296
|
-
broker = _get_broker(request)
|
|
297
|
-
if view not in {"all", "remote", "local"}:
|
|
298
|
-
raise HTTPException(422, detail="view must be all, remote, or local")
|
|
299
|
-
remote_peers, local_sessions = _mesh_read_model(
|
|
300
|
-
broker.list_all_peers(_active_profile()),
|
|
301
|
-
)
|
|
302
|
-
peer_list = (
|
|
303
|
-
remote_peers if view == "remote" else
|
|
304
|
-
local_sessions if view == "local" else
|
|
305
|
-
[*remote_peers, *local_sessions]
|
|
306
|
-
)
|
|
307
|
-
session_ids = [p.get("session_id") for p in peer_list if p.get("session_id")]
|
|
308
|
-
counts = _peer_activity_counts(request, session_ids)
|
|
309
|
-
enriched = []
|
|
310
|
-
for p in peer_list:
|
|
311
|
-
c = counts.get(p.get("session_id"), {})
|
|
312
|
-
enriched.append({
|
|
313
|
-
**p,
|
|
314
|
-
"tool_count": c.get("tool_count", 0),
|
|
315
|
-
"memory_count": c.get("memory_count", 0),
|
|
316
|
-
})
|
|
317
|
-
return {
|
|
318
|
-
"peers": enriched,
|
|
319
|
-
"remote_peers": remote_peers,
|
|
320
|
-
"local_sessions": local_sessions,
|
|
321
|
-
"view": view,
|
|
322
|
-
**_mesh_counts(remote_peers, local_sessions),
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
@router.post("/heartbeat")
|
|
327
|
-
def heartbeat(req: HeartbeatRequest, request: Request):
|
|
328
|
-
"""Update peer liveness without blocking the daemon's async event loop."""
|
|
329
|
-
broker = _get_broker(request)
|
|
330
|
-
result = broker.heartbeat(req.peer_id, profile_id=_active_profile())
|
|
331
|
-
if not result.get("ok"):
|
|
332
|
-
raise HTTPException(404, detail=result.get("error", "peer not found"))
|
|
333
|
-
return result
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
@router.post("/summary")
|
|
337
|
-
def summary(req: SummaryRequest, request: Request):
|
|
338
|
-
broker = _get_broker(request)
|
|
339
|
-
result = broker.update_summary(req.peer_id, req.summary,
|
|
340
|
-
profile_id=_active_profile())
|
|
341
|
-
if not result.get("ok"):
|
|
342
|
-
raise HTTPException(404, detail=result.get("error", "peer not found"))
|
|
343
|
-
return result
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
@router.post("/send")
|
|
347
|
-
def send(req: SendRequest, request: Request):
|
|
348
|
-
broker = _get_broker(request)
|
|
349
|
-
to_target = req.to_peer or req.to # v3.4.6: accept both field names
|
|
350
|
-
if not to_target:
|
|
351
|
-
raise HTTPException(400, detail="'to' or 'to_peer' required")
|
|
352
|
-
profile = _active_profile()
|
|
353
|
-
|
|
354
|
-
# 3a-1 + 3a-2: Apply signature verification and admission gate for non-loopback.
|
|
355
|
-
client_host = request.client.host if request.client else "127.0.0.1"
|
|
356
|
-
from superlocalmemory.server.loopback import is_loopback as _is_loopback_host
|
|
357
|
-
_is_lb = _is_loopback_host(client_host)
|
|
358
|
-
|
|
359
|
-
if not _is_lb:
|
|
360
|
-
from superlocalmemory.mesh.broker_security import (
|
|
361
|
-
check_mesh_message_signature,
|
|
362
|
-
is_strict_identity,
|
|
363
|
-
)
|
|
364
|
-
config = getattr(request.app.state, "config", None)
|
|
365
|
-
strict = is_strict_identity(config)
|
|
366
|
-
fleet_secret = getattr(broker, "_shared_secret", None)
|
|
367
|
-
|
|
368
|
-
# SEC-4 (hardened): identity resolution per mode.
|
|
369
|
-
# - COMPAT (default): fleet secret verifies (or unsigned legacy accepted).
|
|
370
|
-
# - STRICT: the sender MUST be a registered peer with its own per-peer key.
|
|
371
|
-
# There is NO fleet-secret fallback in strict mode — unregistered
|
|
372
|
-
# from_peer, a NULL peer_key, or a DB error all FAIL CLOSED. (The old
|
|
373
|
-
# fleet fallback was an impersonation escape hatch: any fleet-secret
|
|
374
|
-
# holder could claim an unregistered/legacy from_peer.)
|
|
375
|
-
verify_secret = fleet_secret
|
|
376
|
-
if strict:
|
|
377
|
-
if not req.from_peer:
|
|
378
|
-
raise HTTPException(401, detail="strict identity: from_peer required")
|
|
379
|
-
import sqlite3 as _sqlite3
|
|
380
|
-
try:
|
|
381
|
-
_conn = _sqlite3.connect(broker._db_path, timeout=3)
|
|
382
|
-
_conn.row_factory = _sqlite3.Row
|
|
383
|
-
_row = _conn.execute(
|
|
384
|
-
"SELECT peer_key FROM mesh_peers WHERE peer_id=? LIMIT 1",
|
|
385
|
-
(req.from_peer,),
|
|
386
|
-
).fetchone()
|
|
387
|
-
_conn.close()
|
|
388
|
-
except _sqlite3.Error:
|
|
389
|
-
raise HTTPException(503, detail="strict identity: peer key lookup failed")
|
|
390
|
-
if not _row or not _row["peer_key"]:
|
|
391
|
-
raise HTTPException(
|
|
392
|
-
401,
|
|
393
|
-
detail="strict identity: from_peer is not a registered peer with a per-peer key",
|
|
394
|
-
)
|
|
395
|
-
verify_secret = str(_row["peer_key"])
|
|
396
|
-
|
|
397
|
-
sig_err = check_mesh_message_signature(
|
|
398
|
-
verify_secret,
|
|
399
|
-
req.from_peer,
|
|
400
|
-
to_target,
|
|
401
|
-
req.content,
|
|
402
|
-
request.headers.get("x-mesh-sig"),
|
|
403
|
-
request.headers.get("x-mesh-nonce"),
|
|
404
|
-
request.headers.get("x-mesh-ts"),
|
|
405
|
-
is_loopback=False,
|
|
406
|
-
strict=strict,
|
|
407
|
-
)
|
|
408
|
-
if sig_err is not None:
|
|
409
|
-
raise HTTPException(401, detail=sig_err.get("error", "signature error"))
|
|
410
|
-
|
|
411
|
-
# Admission gate parity (closes the P1 bypass for inbound remote send).
|
|
412
|
-
try:
|
|
413
|
-
from superlocalmemory.core.admission import (
|
|
414
|
-
AdmissionDenied,
|
|
415
|
-
admit,
|
|
416
|
-
resolve_actor,
|
|
417
|
-
)
|
|
418
|
-
from superlocalmemory.core.actor_context import Transport
|
|
419
|
-
from superlocalmemory.core.operation_request import OperationKind
|
|
420
|
-
except ImportError:
|
|
421
|
-
AdmissionDenied = None # type: ignore[assignment,misc]
|
|
422
|
-
|
|
423
|
-
if AdmissionDenied is not None:
|
|
424
|
-
try:
|
|
425
|
-
actor = resolve_actor(Transport.HTTP, client_host=client_host)
|
|
426
|
-
admit(OperationKind.MESH_SEND, actor)
|
|
427
|
-
except AdmissionDenied as exc:
|
|
428
|
-
raise HTTPException(403, detail=str(exc))
|
|
429
|
-
|
|
430
|
-
# This sync FastAPI route already runs in the worker thread pool, so the
|
|
431
|
-
# broker's SQLite retries and optional remote HTTP delivery cannot block
|
|
432
|
-
# the daemon event loop.
|
|
433
|
-
result = broker.send_message(
|
|
434
|
-
req.from_peer, to_target, req.content, req.type, "", profile,
|
|
435
|
-
)
|
|
436
|
-
if not result.get("ok"):
|
|
437
|
-
status = 413 if "too large" in result.get("error", "") else 404
|
|
438
|
-
raise HTTPException(status, detail=result.get("error", ""))
|
|
439
|
-
return result
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
@router.get("/inbox/{peer_id}")
|
|
443
|
-
def inbox(peer_id: str, request: Request, project_path: str = ""):
|
|
444
|
-
broker = _get_broker(request)
|
|
445
|
-
return {"messages": broker.get_inbox(peer_id, project_path,
|
|
446
|
-
profile_id=_active_profile())}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
@router.post("/inbox/{peer_id}/read")
|
|
450
|
-
def mark_read(peer_id: str, req: ReadRequest, request: Request):
|
|
451
|
-
broker = _get_broker(request)
|
|
452
|
-
return broker.mark_read(peer_id, req.message_ids,
|
|
453
|
-
profile_id=_active_profile())
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
@router.get("/pending/{peer_id}")
|
|
457
|
-
def pending(peer_id: str, request: Request, project_path: str = ""):
|
|
458
|
-
"""Get pending broadcast/project messages for this peer."""
|
|
459
|
-
broker = _get_broker(request)
|
|
460
|
-
messages = broker.get_pending(peer_id, project_path,
|
|
461
|
-
profile_id=_active_profile())
|
|
462
|
-
return {"messages": messages, "count": len(messages)}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
@router.get("/state")
|
|
466
|
-
def state_all(request: Request):
|
|
467
|
-
broker = _get_broker(request)
|
|
468
|
-
return {"state": broker.get_state(profile_id=_active_profile())}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
@router.post("/state")
|
|
472
|
-
def state_set(req: StateSetRequest, request: Request):
|
|
473
|
-
broker = _get_broker(request)
|
|
474
|
-
if not req.key:
|
|
475
|
-
raise HTTPException(400, detail="key required")
|
|
476
|
-
_reject_secret_state(req.key, req.value)
|
|
477
|
-
return broker.set_state(req.key, req.value, req.set_by,
|
|
478
|
-
profile_id=_active_profile())
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
@router.get("/state/{key}")
|
|
482
|
-
def state_get(key: str, request: Request):
|
|
483
|
-
broker = _get_broker(request)
|
|
484
|
-
result = broker.get_state_key(key, profile_id=_active_profile())
|
|
485
|
-
if result is None:
|
|
486
|
-
raise HTTPException(404, detail="key not found")
|
|
487
|
-
return result
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
@router.post("/lock")
|
|
491
|
-
def lock(req: LockRequest, request: Request):
|
|
492
|
-
broker = _get_broker(request)
|
|
493
|
-
if not req.file_path or not req.locked_by:
|
|
494
|
-
raise HTTPException(400, detail="file_path and locked_by required")
|
|
495
|
-
if req.action not in ("acquire", "release", "query"):
|
|
496
|
-
raise HTTPException(400, detail="action must be acquire, release, or query")
|
|
497
|
-
return broker.lock_action(req.file_path, req.locked_by, req.action,
|
|
498
|
-
profile_id=_active_profile())
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
@router.get("/events")
|
|
502
|
-
def events(request: Request):
|
|
503
|
-
broker = _get_broker(request)
|
|
504
|
-
return {"events": broker.get_events(profile_id=_active_profile())}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
@router.get("/status")
|
|
508
|
-
def status(request: Request):
|
|
509
|
-
broker = _get_broker(request)
|
|
510
|
-
broker_status = broker.get_status(profile_id=_active_profile())
|
|
511
|
-
remote_peers, local_sessions = _mesh_read_model(
|
|
512
|
-
broker.list_all_peers(_active_profile()),
|
|
513
|
-
)
|
|
514
|
-
return {
|
|
515
|
-
**broker_status,
|
|
516
|
-
**_mesh_counts(remote_peers, local_sessions),
|
|
517
|
-
}
|
|
@@ -1,54 +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
|
-
"""SLM Mesh — lock-delta HTTP route (3c-2).
|
|
6
|
-
|
|
7
|
-
Exposes ``GET /mesh/lock/delta`` so remote peers can fetch this node's
|
|
8
|
-
live advisory locks for convergence via ``LockCoordinator.resolve()``.
|
|
9
|
-
|
|
10
|
-
Auth and broker resolution mirror ``routes/mesh.py``.
|
|
11
|
-
Do NOT mount this router directly — the delivery lead wires it via
|
|
12
|
-
``app.include_router(mesh_lock_routes.router)``.
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
from fastapi import APIRouter, Request
|
|
20
|
-
|
|
21
|
-
from superlocalmemory.mesh.lock_protocol import LockCoordinator
|
|
22
|
-
from superlocalmemory.mesh.node_identity import get_node_id
|
|
23
|
-
from superlocalmemory.server.routes.mesh import _get_broker
|
|
24
|
-
from superlocalmemory.server.routes.helpers import get_active_profile
|
|
25
|
-
|
|
26
|
-
router = APIRouter(prefix="/mesh/lock", tags=["mesh-lock"])
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@router.get("/delta")
|
|
30
|
-
def lock_delta(
|
|
31
|
-
profile: str = "",
|
|
32
|
-
request: Request = None, # type: ignore[assignment]
|
|
33
|
-
) -> dict:
|
|
34
|
-
"""Return this node's live advisory locks for a given tenant profile.
|
|
35
|
-
|
|
36
|
-
The response is designed for consumption by a remote peer's
|
|
37
|
-
``LockCoordinator.resolve()`` call: it includes the raw lock records
|
|
38
|
-
plus the local ``node_id`` so the remote can apply the total-order
|
|
39
|
-
``(fencing_token, node_id)`` comparison without a separate handshake.
|
|
40
|
-
|
|
41
|
-
Query params:
|
|
42
|
-
profile: Tenant profile id. Falls back to the active profile
|
|
43
|
-
from the request context var when omitted or blank.
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
``{"locks": [...], "node_id": "<hex>"}``
|
|
47
|
-
``locks`` is the output of ``LockCoordinator.local_lock_delta()``.
|
|
48
|
-
"""
|
|
49
|
-
broker = _get_broker(request)
|
|
50
|
-
profile_id: str = profile.strip() or get_active_profile()
|
|
51
|
-
coordinator = LockCoordinator(broker)
|
|
52
|
-
locks = coordinator.local_lock_delta(profile_id)
|
|
53
|
-
node_id = get_node_id(broker._db_path)
|
|
54
|
-
return {"locks": locks, "node_id": node_id}
|
|
@@ -1,63 +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
|
-
"""SLM Mesh — state-sync delta endpoint (3c-1).
|
|
6
|
-
|
|
7
|
-
Exposes a single GET route that returns the local ``mesh_state`` rows whose
|
|
8
|
-
revision exceeds ``since``, suitable for pull-based LWW convergence.
|
|
9
|
-
|
|
10
|
-
Mounted by the delivery lead (unified_daemon.py) via ``include_router``.
|
|
11
|
-
Auth, broker access, and profile resolution all mirror ``routes/mesh.py``
|
|
12
|
-
exactly — no new patterns are introduced.
|
|
13
|
-
|
|
14
|
-
Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
from fastapi import APIRouter, Request
|
|
20
|
-
|
|
21
|
-
from superlocalmemory.mesh.state_sync import StateSyncer
|
|
22
|
-
|
|
23
|
-
# Re-use auth + broker helpers verbatim from the main mesh module so that
|
|
24
|
-
# security properties (shared-secret, loopback trust, write-identity) apply
|
|
25
|
-
# identically to this new endpoint.
|
|
26
|
-
from superlocalmemory.server.routes.mesh import _active_profile, _get_broker
|
|
27
|
-
|
|
28
|
-
router = APIRouter(prefix="/mesh", tags=["mesh-state-sync"])
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@router.get("/state/delta")
|
|
32
|
-
def state_delta(
|
|
33
|
-
request: Request,
|
|
34
|
-
profile: str = "",
|
|
35
|
-
since: int = 0,
|
|
36
|
-
) -> dict:
|
|
37
|
-
"""Return local mesh_state rows with revision > ``since`` for LWW sync.
|
|
38
|
-
|
|
39
|
-
Query parameters
|
|
40
|
-
----------------
|
|
41
|
-
profile : str, optional
|
|
42
|
-
Tenant profile id. Defaults to the currently active profile when
|
|
43
|
-
omitted or empty.
|
|
44
|
-
since : int, optional
|
|
45
|
-
Only rows whose ``revision`` strictly exceeds this value are returned.
|
|
46
|
-
Pass ``0`` (default) to retrieve all rows.
|
|
47
|
-
|
|
48
|
-
Response
|
|
49
|
-
--------
|
|
50
|
-
``{"entries": [...], "node_id": "<local_node_id>"}``
|
|
51
|
-
|
|
52
|
-
Each entry carries ``{key, value, set_by, updated_at, revision, node_id}``
|
|
53
|
-
where ``node_id`` is the effective origin node (resolved from
|
|
54
|
-
``origin_node`` column; BC rows with ``origin_node=''`` resolve to the
|
|
55
|
-
local node's id).
|
|
56
|
-
"""
|
|
57
|
-
broker = _get_broker(request)
|
|
58
|
-
resolved_profile = profile if profile else _active_profile()
|
|
59
|
-
syncer = StateSyncer(broker)
|
|
60
|
-
return {
|
|
61
|
-
"entries": syncer.local_delta(resolved_profile, since),
|
|
62
|
-
"node_id": syncer._node_id,
|
|
63
|
-
}
|