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,203 +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
|
-
"""HTTP proxy that lets MCP processes use the daemon as their worker.
|
|
6
|
-
|
|
7
|
-
Without this, every MCP process (one per IDE) would spawn its own
|
|
8
|
-
``recall_worker`` subprocess through ``WorkerPool.shared()`` and load
|
|
9
|
-
the ONNX embedder into that subprocess. With N IDEs open the total
|
|
10
|
-
RSS was approximately N x 1.6 GB — the exact failure Path B was built
|
|
11
|
-
to avoid.
|
|
12
|
-
|
|
13
|
-
With this proxy, the MCP process opens an HTTP connection to the
|
|
14
|
-
single long-lived daemon (already running for dashboard / mesh /
|
|
15
|
-
health) and forwards ``recall`` and ``store`` calls there. Heavy
|
|
16
|
-
engine state exists in exactly one process: the daemon.
|
|
17
|
-
"""
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import logging
|
|
21
|
-
import urllib.parse
|
|
22
|
-
from typing import Any
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
_OPAQUE_UNAVAILABLE = "DAEMON_UNAVAILABLE: owned daemon is unavailable; retry later."
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def daemon_unavailable_error() -> str:
|
|
30
|
-
"""Return a one-line, *diagnosed* daemon-unavailable message.
|
|
31
|
-
|
|
32
|
-
The opaque wording this replaces described a stopped daemon, a recycled
|
|
33
|
-
PID, an unreachable port and an identity mismatch identically (issue #104).
|
|
34
|
-
Diagnosis is best effort: if it fails for any reason the caller still gets
|
|
35
|
-
the original, retryable message rather than an exception.
|
|
36
|
-
"""
|
|
37
|
-
try:
|
|
38
|
-
from superlocalmemory.cli.daemon import describe_daemon_unavailability
|
|
39
|
-
|
|
40
|
-
diagnosis = describe_daemon_unavailability()
|
|
41
|
-
return (
|
|
42
|
-
f"DAEMON_UNAVAILABLE ({diagnosis['reason']}): "
|
|
43
|
-
f"{diagnosis['message']} {diagnosis['hint']}"
|
|
44
|
-
)
|
|
45
|
-
except Exception: # noqa: BLE001 - diagnosis must never mask the failure
|
|
46
|
-
return _OPAQUE_UNAVAILABLE
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class DaemonPoolProxy:
|
|
50
|
-
""":class:`WorkerPool`-shaped facade that talks to the daemon over HTTP.
|
|
51
|
-
|
|
52
|
-
The shape matches ``WorkerPool.recall`` / ``WorkerPool.store`` so that
|
|
53
|
-
the existing pool adapter in ``mcp/_pool_adapter.py`` can swap between
|
|
54
|
-
a local subprocess pool and the daemon proxy without any adapter
|
|
55
|
-
change. Errors are returned as ``{"ok": False, "error": "..."}``
|
|
56
|
-
envelopes — the adapter is responsible for surfacing those.
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
def __init__(
|
|
60
|
-
self,
|
|
61
|
-
port: int | None,
|
|
62
|
-
*,
|
|
63
|
-
timeout_s: float = 30.0,
|
|
64
|
-
unavailable: bool = False,
|
|
65
|
-
) -> None:
|
|
66
|
-
# v3.4.59: 8s→30s — dense graph recall can exceed the old timeout.
|
|
67
|
-
self._port = port
|
|
68
|
-
self._timeout = timeout_s
|
|
69
|
-
self._unavailable = unavailable
|
|
70
|
-
|
|
71
|
-
@staticmethod
|
|
72
|
-
def _unavailable_response() -> dict[str, Any]:
|
|
73
|
-
return {
|
|
74
|
-
"ok": False,
|
|
75
|
-
"code": "DAEMON_UNAVAILABLE",
|
|
76
|
-
"retryable": True,
|
|
77
|
-
"error": daemon_unavailable_error(),
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
def recall(
|
|
81
|
-
self, query: str, limit: int = 10, session_id: str = "",
|
|
82
|
-
fast: bool | None = None,
|
|
83
|
-
include_global: bool | None = None,
|
|
84
|
-
include_shared: bool | None = None,
|
|
85
|
-
window: str | None = None,
|
|
86
|
-
as_of: str | None = None,
|
|
87
|
-
known_as_of: str | None = None,
|
|
88
|
-
valid_at: str | None = None,
|
|
89
|
-
include_unknown: bool = False,
|
|
90
|
-
) -> dict[str, Any]:
|
|
91
|
-
if self._unavailable:
|
|
92
|
-
return self._unavailable_response()
|
|
93
|
-
_params: dict[str, Any] = {
|
|
94
|
-
"q": query,
|
|
95
|
-
"limit": limit,
|
|
96
|
-
"session_id": session_id or "",
|
|
97
|
-
}
|
|
98
|
-
# v3.8.2 client-driven agentic: only send ``fast`` when the caller set it
|
|
99
|
-
# explicitly. Unset (None) lets the daemon resolve the configured
|
|
100
|
-
# client-driven-agentic default — the same way scope flags are handled.
|
|
101
|
-
if fast is not None:
|
|
102
|
-
_params["fast"] = "true" if fast else "false"
|
|
103
|
-
# v3.6.15 multi-scope: only send the scope flags when explicitly set, so
|
|
104
|
-
# an unset value lets the daemon resolve the configured default (shared
|
|
105
|
-
# is opt-in). "None" must NOT become the string "none" on the wire.
|
|
106
|
-
if include_global is not None:
|
|
107
|
-
_params["include_global"] = "true" if include_global else "false"
|
|
108
|
-
if include_shared is not None:
|
|
109
|
-
_params["include_shared"] = "true" if include_shared else "false"
|
|
110
|
-
if window:
|
|
111
|
-
_params["window"] = window
|
|
112
|
-
if as_of:
|
|
113
|
-
_params["as_of"] = as_of
|
|
114
|
-
if known_as_of:
|
|
115
|
-
_params["known_as_of"] = known_as_of
|
|
116
|
-
if valid_at:
|
|
117
|
-
_params["valid_at"] = valid_at
|
|
118
|
-
if include_unknown:
|
|
119
|
-
_params["include_unknown"] = "true"
|
|
120
|
-
params = urllib.parse.urlencode(_params)
|
|
121
|
-
try:
|
|
122
|
-
from superlocalmemory.cli.daemon import daemon_request
|
|
123
|
-
|
|
124
|
-
data = daemon_request(
|
|
125
|
-
"GET",
|
|
126
|
-
f"/recall?{params}",
|
|
127
|
-
timeout_seconds=self._timeout,
|
|
128
|
-
)
|
|
129
|
-
except Exception as exc:
|
|
130
|
-
logger.warning("daemon /recall failed: %s", exc)
|
|
131
|
-
return self._unavailable_response()
|
|
132
|
-
if not isinstance(data, dict):
|
|
133
|
-
return self._unavailable_response()
|
|
134
|
-
data.setdefault("ok", True)
|
|
135
|
-
return data
|
|
136
|
-
|
|
137
|
-
def store(
|
|
138
|
-
self, content: str, metadata: dict | None = None,
|
|
139
|
-
) -> dict[str, Any]:
|
|
140
|
-
if self._unavailable:
|
|
141
|
-
return self._unavailable_response()
|
|
142
|
-
tags = (metadata or {}).get("tags", "")
|
|
143
|
-
if isinstance(tags, (list, tuple, set)):
|
|
144
|
-
tags = ",".join(str(tag) for tag in tags)
|
|
145
|
-
body = {
|
|
146
|
-
"content": content,
|
|
147
|
-
"tags": tags,
|
|
148
|
-
"metadata": metadata or {},
|
|
149
|
-
"session_id": (metadata or {}).get("session_id", ""),
|
|
150
|
-
"idempotency_key": (metadata or {}).get("idempotency_key") or None,
|
|
151
|
-
"profile_id": (metadata or {}).get("profile_id", ""),
|
|
152
|
-
}
|
|
153
|
-
# One identity-aware daemon client owns descriptor validation,
|
|
154
|
-
# capability delivery, and exact-instance targeting. A raw urllib POST
|
|
155
|
-
# here previously became unauthenticated when /remember was hardened
|
|
156
|
-
# and could also attach to a stale/foreign port.
|
|
157
|
-
try:
|
|
158
|
-
from superlocalmemory.cli.daemon import DaemonConflict, daemon_request
|
|
159
|
-
except Exception as exc:
|
|
160
|
-
logger.warning("daemon client import failed: %s", exc)
|
|
161
|
-
return self._unavailable_response()
|
|
162
|
-
try:
|
|
163
|
-
data = daemon_request(
|
|
164
|
-
"POST",
|
|
165
|
-
"/remember",
|
|
166
|
-
body,
|
|
167
|
-
preserve_conflict=True,
|
|
168
|
-
)
|
|
169
|
-
except DaemonConflict as exc:
|
|
170
|
-
return {
|
|
171
|
-
"ok": False,
|
|
172
|
-
"code": "PROFILE_MISMATCH",
|
|
173
|
-
"retryable": False,
|
|
174
|
-
"error": str(exc),
|
|
175
|
-
}
|
|
176
|
-
except Exception as exc:
|
|
177
|
-
logger.warning("daemon /remember failed: %s", exc)
|
|
178
|
-
return self._unavailable_response()
|
|
179
|
-
if not isinstance(data, dict):
|
|
180
|
-
return self._unavailable_response()
|
|
181
|
-
data.setdefault("ok", True)
|
|
182
|
-
return data
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def choose_pool() -> Any:
|
|
186
|
-
"""Return the best available pool for this MCP process.
|
|
187
|
-
|
|
188
|
-
The daemon is the sole canonical writer. A bounded daemon auto-start is
|
|
189
|
-
attempted for first use; if it cannot become healthy, return a facade that
|
|
190
|
-
reports a retryable ``DAEMON_UNAVAILABLE`` envelope. Never construct a
|
|
191
|
-
process-local ``WorkerPool`` from an MCP client.
|
|
192
|
-
"""
|
|
193
|
-
try:
|
|
194
|
-
from superlocalmemory.cli.daemon import (
|
|
195
|
-
_get_port,
|
|
196
|
-
ensure_daemon,
|
|
197
|
-
is_daemon_running,
|
|
198
|
-
)
|
|
199
|
-
if is_daemon_running() or ensure_daemon():
|
|
200
|
-
return DaemonPoolProxy(port=_get_port())
|
|
201
|
-
except Exception as exc:
|
|
202
|
-
logger.warning("daemon probe or bounded start failed: %s", exc)
|
|
203
|
-
return DaemonPoolProxy(port=None, unavailable=True)
|
|
@@ -1,181 +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
|
-
"""MCP-side adapters onto the pool (daemon HTTP or local subprocess).
|
|
6
|
-
|
|
7
|
-
The pool returns plain dicts with an ``ok`` flag. Hooks
|
|
8
|
-
(``AutoRecall`` / ``AutoCapture``) expect a ``RecallResponse``-shaped
|
|
9
|
-
object and a list of fact ids. These adapters bridge the two.
|
|
10
|
-
|
|
11
|
-
On ``{"ok": False, "error": "..."}`` the adapters raise
|
|
12
|
-
:class:`PoolError` instead of silently returning empty results — worker
|
|
13
|
-
death must be distinguishable from "no memories" on the user side.
|
|
14
|
-
"""
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
import logging
|
|
18
|
-
from dataclasses import dataclass, field
|
|
19
|
-
from typing import Any
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@dataclass(frozen=True)
|
|
25
|
-
class PoolFact:
|
|
26
|
-
fact_id: str = ""
|
|
27
|
-
content: str = ""
|
|
28
|
-
memory_id: str = ""
|
|
29
|
-
created_at: str = ""
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@dataclass(frozen=True)
|
|
33
|
-
class PoolRecallItem:
|
|
34
|
-
fact: PoolFact = field(default_factory=PoolFact)
|
|
35
|
-
score: float = 0.0
|
|
36
|
-
confidence: float = 0.0
|
|
37
|
-
relevance_score: float = 0.0
|
|
38
|
-
ranking_score: float | None = None
|
|
39
|
-
memory_confidence: float = 0.0
|
|
40
|
-
rank_position: int = 0
|
|
41
|
-
trust_score: float = 0.0
|
|
42
|
-
channel_scores: dict[str, float] = field(default_factory=dict)
|
|
43
|
-
evidence_chain: list[Any] = field(default_factory=list)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@dataclass(frozen=True)
|
|
47
|
-
class PoolRecallResponse:
|
|
48
|
-
results: list[PoolRecallItem] = field(default_factory=list)
|
|
49
|
-
query_type: str = ""
|
|
50
|
-
retrieval_time_ms: float = 0.0
|
|
51
|
-
channel_weights: dict[str, float] = field(default_factory=dict)
|
|
52
|
-
total_candidates: int = 0
|
|
53
|
-
score_contract_version: str = "2"
|
|
54
|
-
calibration_status: str = "uncalibrated"
|
|
55
|
-
calibration_id: str | None = None
|
|
56
|
-
answer_confidence: float | None = None
|
|
57
|
-
abstained: bool = False
|
|
58
|
-
abstention_reason: str | None = None
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class PoolError(RuntimeError):
|
|
62
|
-
"""Raised when the pool returns an error envelope.
|
|
63
|
-
|
|
64
|
-
Callers that want the old silent-empty behaviour (e.g. hook paths
|
|
65
|
-
that must never break the user's session) catch this and log at
|
|
66
|
-
WARNING. Callers that want to surface the failure (e.g. dashboard
|
|
67
|
-
resources) let it propagate.
|
|
68
|
-
"""
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def _pool():
|
|
72
|
-
"""Lazy pool factory — prefers the daemon HTTP proxy.
|
|
73
|
-
|
|
74
|
-
Split out so tests can monkey-patch the factory without touching
|
|
75
|
-
the real ``WorkerPool.shared()`` singleton.
|
|
76
|
-
"""
|
|
77
|
-
from superlocalmemory.mcp._daemon_proxy import choose_pool
|
|
78
|
-
return choose_pool()
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def _unwrap_error(raw: Any, op: str) -> None:
|
|
82
|
-
"""Raise PoolError if the pool returned an ``{"ok": False}`` envelope."""
|
|
83
|
-
if isinstance(raw, dict) and raw.get("ok") is False:
|
|
84
|
-
reason = raw.get("error") or "pool returned ok=False"
|
|
85
|
-
raise PoolError(f"pool.{op} failed: {reason}")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def pool_recall(query: str, limit: int = 10, **kwargs: Any) -> PoolRecallResponse:
|
|
89
|
-
"""Call pool.recall and reshape its dict into a typed response.
|
|
90
|
-
|
|
91
|
-
Raises :class:`PoolError` on worker death or any non-ok envelope.
|
|
92
|
-
"""
|
|
93
|
-
# v3.6.15 multi-scope: forward the scope-visibility flags when the caller
|
|
94
|
-
# set them. ``None`` (the default) is passed through so the daemon/engine
|
|
95
|
-
# resolves the configured default — shared memory is opt-in, so omitting
|
|
96
|
-
# them keeps recall scoped to this profile only.
|
|
97
|
-
_recall_kwargs: dict[str, Any] = {
|
|
98
|
-
"query": query,
|
|
99
|
-
"limit": limit,
|
|
100
|
-
"session_id": str(kwargs.get("session_id") or ""),
|
|
101
|
-
# v3.8.2 client-driven agentic: pass ``fast`` through unchanged. None
|
|
102
|
-
# (unset) flows to the daemon/engine which resolves the configured
|
|
103
|
-
# client-driven-agentic default; an explicit bool always wins.
|
|
104
|
-
"fast": kwargs.get("fast", None),
|
|
105
|
-
}
|
|
106
|
-
if "include_global" in kwargs:
|
|
107
|
-
_recall_kwargs["include_global"] = kwargs["include_global"]
|
|
108
|
-
if "include_shared" in kwargs:
|
|
109
|
-
_recall_kwargs["include_shared"] = kwargs["include_shared"]
|
|
110
|
-
if kwargs.get("window"):
|
|
111
|
-
_recall_kwargs["window"] = kwargs["window"]
|
|
112
|
-
raw = _pool().recall(**_recall_kwargs)
|
|
113
|
-
_unwrap_error(raw, "recall")
|
|
114
|
-
items = raw.get("results", []) if isinstance(raw, dict) else []
|
|
115
|
-
results = [
|
|
116
|
-
PoolRecallItem(
|
|
117
|
-
fact=PoolFact(
|
|
118
|
-
fact_id=item.get("fact_id", ""),
|
|
119
|
-
content=item.get("content", ""),
|
|
120
|
-
memory_id=item.get("memory_id", ""),
|
|
121
|
-
created_at=item.get("created_at", "") or "",
|
|
122
|
-
),
|
|
123
|
-
score=float(item.get("score", 0.0)),
|
|
124
|
-
confidence=float(item.get("confidence", 0.0)),
|
|
125
|
-
relevance_score=float(item.get("relevance_score", item.get("score", 0.0))),
|
|
126
|
-
ranking_score=(
|
|
127
|
-
float(item["ranking_score"])
|
|
128
|
-
if item.get("ranking_score") is not None else None
|
|
129
|
-
),
|
|
130
|
-
memory_confidence=float(
|
|
131
|
-
item.get("memory_confidence", item.get("confidence", 0.0))
|
|
132
|
-
),
|
|
133
|
-
rank_position=int(item.get("rank_position", 0)),
|
|
134
|
-
trust_score=float(item.get("trust_score", 0.0)),
|
|
135
|
-
channel_scores=item.get("channel_scores", {}) or {},
|
|
136
|
-
evidence_chain=list(item.get("evidence_chain", []) or []),
|
|
137
|
-
)
|
|
138
|
-
for item in items
|
|
139
|
-
]
|
|
140
|
-
return PoolRecallResponse(
|
|
141
|
-
results=results,
|
|
142
|
-
query_type=raw.get("query_type", "") if isinstance(raw, dict) else "",
|
|
143
|
-
retrieval_time_ms=float(raw.get("retrieval_time_ms", 0.0))
|
|
144
|
-
if isinstance(raw, dict) else 0.0,
|
|
145
|
-
channel_weights=raw.get("channel_weights", {})
|
|
146
|
-
if isinstance(raw, dict) else {},
|
|
147
|
-
total_candidates=int(raw.get("total_candidates", 0))
|
|
148
|
-
if isinstance(raw, dict) else 0,
|
|
149
|
-
score_contract_version=str(raw.get("score_contract_version", "2"))
|
|
150
|
-
if isinstance(raw, dict) else "2",
|
|
151
|
-
calibration_status=str(raw.get("calibration_status", "uncalibrated"))
|
|
152
|
-
if isinstance(raw, dict) else "uncalibrated",
|
|
153
|
-
calibration_id=raw.get("calibration_id") if isinstance(raw, dict) else None,
|
|
154
|
-
answer_confidence=raw.get("answer_confidence") if isinstance(raw, dict) else None,
|
|
155
|
-
abstained=bool(raw.get("abstained", False)) if isinstance(raw, dict) else False,
|
|
156
|
-
abstention_reason=raw.get("abstention_reason") if isinstance(raw, dict) else None,
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def pool_store(content: str, metadata: dict | None = None) -> list[str]:
|
|
161
|
-
"""Call pool.store and return fact id list (or pending tracker).
|
|
162
|
-
|
|
163
|
-
v3.4.32: the daemon /remember endpoint is async by default — it
|
|
164
|
-
returns ``pending_id`` and queues the write. We surface this to
|
|
165
|
-
callers as ``["pending:<id>"]`` so they have a stable identifier
|
|
166
|
-
without blocking the remember on the embedder worker.
|
|
167
|
-
|
|
168
|
-
Legacy synchronous path (``?wait=true``) still returns real
|
|
169
|
-
``fact_ids``. Worker death raises :class:`PoolError`.
|
|
170
|
-
"""
|
|
171
|
-
raw = _pool().store(content=content, metadata=metadata or {})
|
|
172
|
-
_unwrap_error(raw, "store")
|
|
173
|
-
if not isinstance(raw, dict):
|
|
174
|
-
return []
|
|
175
|
-
fact_ids = raw.get("fact_ids")
|
|
176
|
-
if fact_ids:
|
|
177
|
-
return list(fact_ids)
|
|
178
|
-
pending_id = raw.get("pending_id")
|
|
179
|
-
if pending_id is not None:
|
|
180
|
-
return [f"pending:{pending_id}"]
|
|
181
|
-
return []
|
|
@@ -1,60 +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
|
-
"""Pure decision logic for the MCP stdin-EOF self-termination monitor.
|
|
6
|
-
|
|
7
|
-
Isolated here (no imports, no side effects) so the kqueue ``EV_EOF``
|
|
8
|
-
handling contract is unit-testable without importing the FastMCP server
|
|
9
|
-
module, which starts daemon threads and auto-starts the SLM daemon at
|
|
10
|
-
import time.
|
|
11
|
-
|
|
12
|
-
Background (v3.6.4 fix)
|
|
13
|
-
-----------------------
|
|
14
|
-
The stdin-EOF monitor (``superlocalmemory.mcp.server._stdin_eof_monitor``)
|
|
15
|
-
exists to reap orphaned ``slm mcp`` processes when an IDE/agent abandons the
|
|
16
|
-
stdio pipe without quitting. It registers ``EVFILT_READ | EV_EOF`` on stdin
|
|
17
|
-
and terminates the process when the write-end closes.
|
|
18
|
-
|
|
19
|
-
On macOS, ``EVFILT_READ`` reports ``EV_EOF`` *together with* still-readable
|
|
20
|
-
bytes (``ev.data > 0``) when the write-end is closed while a final request
|
|
21
|
-
is still buffered in the pipe. The original monitor exited on the EOF flag
|
|
22
|
-
alone — dropping that buffered request and tearing down a session that
|
|
23
|
-
still had a pending in-flight call. Under strict MCP hosts whose transport
|
|
24
|
-
half-closes stdin around reconnect/teardown, this surfaced as the server
|
|
25
|
-
self-terminating mid-request, which the host then logged as a keepalive
|
|
26
|
-
failure and respawned (observed against the Hermes agent).
|
|
27
|
-
|
|
28
|
-
The guard defers termination until the buffer is genuinely drained
|
|
29
|
-
(``ev.data <= 0``), letting the FastMCP reader consume the last request
|
|
30
|
-
first. Genuine disconnects (EOF with an empty buffer) still terminate
|
|
31
|
-
immediately — behaviour identical to before for the common case.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from __future__ import annotations
|
|
35
|
-
|
|
36
|
-
__all__ = ["eof_action"]
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def eof_action(flags: int, data: int, eof_flag: int) -> str:
|
|
40
|
-
"""Decide how the stdin-EOF monitor should react to one kqueue event.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
flags: ``kevent.flags`` bitmask returned by ``kqueue.control``.
|
|
44
|
-
data: ``kevent.data`` — for ``EVFILT_READ`` this is the number of
|
|
45
|
-
bytes still readable on the descriptor.
|
|
46
|
-
eof_flag: the platform ``select.KQ_EV_EOF`` constant (injected so
|
|
47
|
-
this function stays import-free and trivially testable).
|
|
48
|
-
|
|
49
|
-
Returns:
|
|
50
|
-
- ``"exit"`` — genuine end-of-stream: write-end closed and the
|
|
51
|
-
buffer is drained (``data <= 0``). Safe to self-terminate.
|
|
52
|
-
- ``"drain"`` — write-end closed but unread bytes remain
|
|
53
|
-
(``data > 0``). Must NOT terminate yet; let the reader consume
|
|
54
|
-
the buffered request first, otherwise it is silently dropped.
|
|
55
|
-
- ``"ignore"`` — no EOF on this event (ordinary readability or a
|
|
56
|
-
spurious wake); nothing to do.
|
|
57
|
-
"""
|
|
58
|
-
if not (flags & eof_flag):
|
|
59
|
-
return "ignore"
|
|
60
|
-
return "drain" if data > 0 else "exit"
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"""Per-HTTP-request agent ID resolution — ContextVar home.
|
|
2
|
-
|
|
3
|
-
Kept in a standalone module so both tools_core and tools_active can import
|
|
4
|
-
it without creating circular dependencies (server.py → tools_core → here,
|
|
5
|
-
and unified_daemon.py → here independently).
|
|
6
|
-
|
|
7
|
-
Priority chain (HTTP-first, stdio-fallback):
|
|
8
|
-
1. ContextVar set by _AgentIDExtractorASGI middleware from /mcp/{agent_id} URL path.
|
|
9
|
-
2. SLM_AGENT_ID environment variable (stdio transport legacy).
|
|
10
|
-
3. Hard-coded "mcp_client" sentinel.
|
|
11
|
-
"""
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import contextvars
|
|
15
|
-
import os
|
|
16
|
-
import re
|
|
17
|
-
|
|
18
|
-
# v3.6.12 (parity-1): default is "" (the "no agent routed" sentinel), NOT the
|
|
19
|
-
# user-visible "mcp_client". Sanitized agent ids are [A-Za-z0-9._-], so "" can
|
|
20
|
-
# never collide — a client that explicitly routes to /mcp/mcp_client is now
|
|
21
|
-
# distinguishable from a bare /mcp/ request with no agent segment.
|
|
22
|
-
_current_agent_id: contextvars.ContextVar[str] = contextvars.ContextVar(
|
|
23
|
-
"slm_agent_id", default=""
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
# Agent ids arrive from an untrusted URL path segment. They are ATTRIBUTION
|
|
27
|
-
# metadata, never an authenticated principal — but they reach loggers, the
|
|
28
|
-
# agent registry, and SQL-bound attribution columns, so we hard-restrict the
|
|
29
|
-
# charset at the single extraction chokepoint. This neutralises log-injection
|
|
30
|
-
# (CRLF / ANSI), oversized ids, and any path-ish characters in one place.
|
|
31
|
-
_AGENT_ID_SANITIZE = re.compile(r"[^A-Za-z0-9._-]")
|
|
32
|
-
_AGENT_ID_MAX_LEN = 64
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def sanitize_agent_id(raw: str) -> str:
|
|
36
|
-
"""Coerce an untrusted agent-id segment to a safe, bounded token."""
|
|
37
|
-
return _AGENT_ID_SANITIZE.sub("_", raw)[:_AGENT_ID_MAX_LEN]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def get_current_agent_id(env_fallback: bool = True) -> str:
|
|
41
|
-
"""Return the agent_id for the current asyncio task.
|
|
42
|
-
|
|
43
|
-
For HTTP transport the ASGI wrapper sets the ContextVar from the URL path
|
|
44
|
-
before the request reaches any MCP tool, so this returns the URL-derived id.
|
|
45
|
-
For stdio transport the ContextVar holds its default ("mcp_client") and we
|
|
46
|
-
fall through to the SLM_AGENT_ID env var instead.
|
|
47
|
-
"""
|
|
48
|
-
ctx_id = _current_agent_id.get()
|
|
49
|
-
if ctx_id:
|
|
50
|
-
return ctx_id # an explicitly-routed agent id (incl. "mcp_client")
|
|
51
|
-
if env_fallback:
|
|
52
|
-
return os.environ.get("SLM_AGENT_ID", "mcp_client")
|
|
53
|
-
return "mcp_client"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
class AgentIDExtractorASGI:
|
|
57
|
-
"""ASGI wrapper that maps ``/mcp/{agent_id}`` → the agent-id ContextVar.
|
|
58
|
-
|
|
59
|
-
Mounted at ``/mcp`` in unified_daemon. IMPORTANT: Starlette's ``Mount``
|
|
60
|
-
(≥0.35 / 1.x) does NOT strip the mount prefix from ``scope["path"]`` — it
|
|
61
|
-
records the prefix in ``scope["root_path"]`` and leaves ``path`` as the full
|
|
62
|
-
request path (e.g. ``/mcp/claude`` with ``root_path == "/mcp"``). So we
|
|
63
|
-
compute the mount-relative sub-path ourselves as ``path[len(root_path):]``.
|
|
64
|
-
|
|
65
|
-
Flow for ``POST /mcp/claude``:
|
|
66
|
-
sub-path ``/claude`` → agent id ``claude`` → set ContextVar → rewrite the
|
|
67
|
-
scope path to ``{root_path}/`` so the inner FastMCP app (Starlette, route
|
|
68
|
-
``/``) sees the same mount-relative ``/`` it sees for a bare ``/mcp/``.
|
|
69
|
-
|
|
70
|
-
Backward compatible: bare ``/mcp/`` has sub-path ``/`` → no agent segment →
|
|
71
|
-
the request passes through untouched and the ContextVar keeps its
|
|
72
|
-
``"mcp_client"`` default.
|
|
73
|
-
|
|
74
|
-
Per-request isolation is guaranteed by ContextVar + ``reset(token)`` in a
|
|
75
|
-
``finally``, so concurrent HTTP sessions never see each other's agent id.
|
|
76
|
-
"""
|
|
77
|
-
|
|
78
|
-
__slots__ = ("_app",)
|
|
79
|
-
|
|
80
|
-
def __init__(self, inner) -> None:
|
|
81
|
-
self._app = inner
|
|
82
|
-
|
|
83
|
-
async def __call__(self, scope, receive, send):
|
|
84
|
-
if scope.get("type") == "http":
|
|
85
|
-
root_path: str = scope.get("root_path", "")
|
|
86
|
-
full_path: str = scope.get("path", "/")
|
|
87
|
-
# Mount-relative sub-path (what comes AFTER /mcp). When a root_path
|
|
88
|
-
# is present the request path MUST start with it (Starlette Mount
|
|
89
|
-
# guarantees this); if it somehow does not, treat it as no-agent and
|
|
90
|
-
# pass through untouched rather than mis-parsing the full path.
|
|
91
|
-
if root_path:
|
|
92
|
-
if not full_path.startswith(root_path):
|
|
93
|
-
await self._app(scope, receive, send)
|
|
94
|
-
return
|
|
95
|
-
subpath = full_path[len(root_path):]
|
|
96
|
-
else:
|
|
97
|
-
subpath = full_path
|
|
98
|
-
first = subpath.lstrip("/").split("/")[0]
|
|
99
|
-
if first:
|
|
100
|
-
first = sanitize_agent_id(first)
|
|
101
|
-
token = _current_agent_id.set(first)
|
|
102
|
-
# Rewrite the path so the inner app sees the bare mount root,
|
|
103
|
-
# exactly as it would for a no-agent /mcp/ request.
|
|
104
|
-
new_full = (root_path + "/") if root_path else "/"
|
|
105
|
-
new_scope = {
|
|
106
|
-
**scope,
|
|
107
|
-
"path": new_full,
|
|
108
|
-
"raw_path": new_full.encode(),
|
|
109
|
-
}
|
|
110
|
-
try:
|
|
111
|
-
await self._app(new_scope, receive, send)
|
|
112
|
-
finally:
|
|
113
|
-
_current_agent_id.reset(token)
|
|
114
|
-
return
|
|
115
|
-
await self._app(scope, receive, send)
|