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,214 +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
|
-
"""Distributed / LAN deployment mode — the single ``SLM_REMOTE`` switch.
|
|
6
|
-
|
|
7
|
-
SuperLocalMemory historically assumes every dashboard browser, MCP client,
|
|
8
|
-
and API caller lives on ``127.0.0.1``. That assumption breaks three things
|
|
9
|
-
for users who deploy SLM on a server and reach it across a LAN (issue #39):
|
|
10
|
-
|
|
11
|
-
1. ``/internal/token`` refuses any non-loopback client → Brain page can't
|
|
12
|
-
fetch the install token → "Couldn't load Brain".
|
|
13
|
-
2. The MCP Streamable-HTTP transport is **stateful** — every call must
|
|
14
|
-
replay the ``Mcp-Session-Id`` from the ``initialize`` handshake. A
|
|
15
|
-
gateway/hub that forwards a tool call without replaying it gets
|
|
16
|
-
``-32600 Session not found``.
|
|
17
|
-
3. Dashboard CSRF origin checks only accept loopback origins.
|
|
18
|
-
|
|
19
|
-
``SLM_REMOTE=1`` flips all three assumptions at once, **default OFF** so the
|
|
20
|
-
loopback-only security posture is unchanged for the 99% local case. LAN
|
|
21
|
-
access is still gated by an explicit IP allowlist (``SLM_MCP_ALLOWED_HOSTS``)
|
|
22
|
-
— remote mode alone does not throw the doors open.
|
|
23
|
-
|
|
24
|
-
Granular overrides (each implied by ``SLM_REMOTE=1`` but usable alone):
|
|
25
|
-
* ``SLM_MCP_STATELESS=1`` — stateless MCP transport only (gateway fix),
|
|
26
|
-
without opening the dashboard token endpoint.
|
|
27
|
-
|
|
28
|
-
Security note (WORSTCASE): stateless MCP drops per-session isolation, and
|
|
29
|
-
serving the install token to a LAN host lets any allowlisted machine read
|
|
30
|
-
the brain. Keep the allowlist specific (never blanket ``*`` unless the
|
|
31
|
-
network is fully trusted) — see ``docs/distributed-deployment.md``.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from __future__ import annotations
|
|
35
|
-
|
|
36
|
-
import ipaddress
|
|
37
|
-
import os
|
|
38
|
-
|
|
39
|
-
_TRUTHY = frozenset({"1", "true", "yes", "on"})
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _is_truthy(value: str | None) -> bool:
|
|
43
|
-
return bool(value) and value.strip().lower() in _TRUTHY
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def is_remote_mode() -> bool:
|
|
47
|
-
"""True iff ``SLM_REMOTE`` opts this daemon into LAN/distributed mode."""
|
|
48
|
-
return _is_truthy(os.environ.get("SLM_REMOTE"))
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def mcp_stateless() -> bool:
|
|
52
|
-
"""True iff the MCP Streamable-HTTP transport should run fully stateless.
|
|
53
|
-
|
|
54
|
-
**Default is True** (mcp 2.0.0 fully-stateless contract). Stateless mode
|
|
55
|
-
lets any gateway/hub forward ``tools/call`` without replaying the
|
|
56
|
-
``Mcp-Session-Id`` handshake (issue #39 Issue 3) and is required for
|
|
57
|
-
``Client(mode="auto")`` discover probes to stay connection-safe.
|
|
58
|
-
|
|
59
|
-
Opt-out: set ``SLM_MCP_STATEFUL=1`` to force stateful Streamable-HTTP
|
|
60
|
-
(session IDs; event store still unused unless the caller passes one).
|
|
61
|
-
``SLM_REMOTE`` / ``SLM_MCP_STATELESS`` remain recognized as positive
|
|
62
|
-
signals but are no longer required — the default is already stateless.
|
|
63
|
-
|
|
64
|
-
Application-level ``session_init`` / ``close_session`` are orthogonal
|
|
65
|
-
(session_id is a string parameter persisted in the memories table).
|
|
66
|
-
"""
|
|
67
|
-
if _is_truthy(os.environ.get("SLM_MCP_STATEFUL")):
|
|
68
|
-
return False
|
|
69
|
-
# Explicit SLM_MCP_STATELESS=0/false still honoured as opt-out when set.
|
|
70
|
-
raw = os.environ.get("SLM_MCP_STATELESS")
|
|
71
|
-
if raw is not None and raw.strip() != "":
|
|
72
|
-
return _is_truthy(raw)
|
|
73
|
-
return True
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def _allowlist_entries() -> list[str]:
|
|
77
|
-
"""Trusted-client allowlist, from ``SLM_MCP_ALLOWED_HOSTS``.
|
|
78
|
-
|
|
79
|
-
Reuses the existing LAN allowlist the user already sets for MCP DNS-rebinding
|
|
80
|
-
protection so there is ONE place to configure trusted hosts. Entries are
|
|
81
|
-
comma-separated and may be: ``*`` (any), an exact IP, a CIDR block
|
|
82
|
-
(``192.168.1.0/24``), or a prefix wildcard (``192.168.*``). A trailing
|
|
83
|
-
``:port`` / ``:*`` (host-header style) is ignored for client-IP matching.
|
|
84
|
-
"""
|
|
85
|
-
raw = os.environ.get("SLM_MCP_ALLOWED_HOSTS", "").strip()
|
|
86
|
-
return [e.strip() for e in raw.split(",") if e.strip()]
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def _strip_port(entry: str) -> str:
|
|
90
|
-
"""Drop a trailing ``:port`` / ``:*`` host-header suffix.
|
|
91
|
-
|
|
92
|
-
Handles plain ``host[:port]`` and CIDR ``a.b.c.d/n[:port]`` (v3.6.12 lan-1:
|
|
93
|
-
a CIDR written with a host-header port suffix used to fail ip_network() and
|
|
94
|
-
silently deny ALL clients). Bracketless IPv6 literals (≥2 colons, no '/')
|
|
95
|
-
are left untouched.
|
|
96
|
-
"""
|
|
97
|
-
e = entry.strip()
|
|
98
|
-
if "/" in e:
|
|
99
|
-
# CIDR — strip anything after the network prefix (a stray :port/:*)
|
|
100
|
-
return e.partition(":")[0]
|
|
101
|
-
if e.count(":") == 1: # host:port or host:* (IPv4 / hostname)
|
|
102
|
-
return e.split(":", 1)[0]
|
|
103
|
-
return e
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def _host_matches(entry: str, client_host: str, client_ip) -> bool:
|
|
107
|
-
host = _strip_port(entry).strip()
|
|
108
|
-
if not host:
|
|
109
|
-
return False
|
|
110
|
-
if host == "*":
|
|
111
|
-
return True
|
|
112
|
-
if "/" in host and client_ip is not None:
|
|
113
|
-
try:
|
|
114
|
-
return client_ip in ipaddress.ip_network(host, strict=False)
|
|
115
|
-
except ValueError:
|
|
116
|
-
return False
|
|
117
|
-
if host.endswith("*"):
|
|
118
|
-
# STRING prefix match (not CIDR). client_host is always the numeric
|
|
119
|
-
# socket peer IP (never a resolvable hostname), and a dotted prefix like
|
|
120
|
-
# "192.168." rejects "192.1680.x". Prefer CIDR (192.168.0.0/16) for
|
|
121
|
-
# unambiguous network matching; wildcards are a convenience.
|
|
122
|
-
return client_host.startswith(host[:-1])
|
|
123
|
-
return host == client_host
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def is_lan_client_allowed(client_host: str) -> bool:
|
|
127
|
-
"""True iff remote mode is ON and ``client_host`` is in the trusted allowlist.
|
|
128
|
-
|
|
129
|
-
Loopback is handled separately by callers — this governs *non*-loopback LAN
|
|
130
|
-
clients only. Returns False whenever remote mode is off or the allowlist is
|
|
131
|
-
empty, so the default posture stays loopback-only.
|
|
132
|
-
"""
|
|
133
|
-
if not is_remote_mode() or not client_host:
|
|
134
|
-
return False
|
|
135
|
-
entries = _allowlist_entries()
|
|
136
|
-
if not entries:
|
|
137
|
-
return False
|
|
138
|
-
try:
|
|
139
|
-
client_ip = ipaddress.ip_address(client_host)
|
|
140
|
-
except ValueError:
|
|
141
|
-
client_ip = None
|
|
142
|
-
return any(_host_matches(e, client_host, client_ip) for e in entries)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def is_remote_origin_allowed(origin: str) -> bool:
|
|
146
|
-
"""True iff remote mode is ON and ``origin``'s host is in the allowlist.
|
|
147
|
-
|
|
148
|
-
``origin`` is a full URL (``http://192.168.50.144:8765``). Empty origin is
|
|
149
|
-
not this function's concern (loopback callers handle that). Used to relax
|
|
150
|
-
the dashboard CSRF origin guard for trusted LAN dashboards.
|
|
151
|
-
"""
|
|
152
|
-
if not is_remote_mode() or not origin:
|
|
153
|
-
return False
|
|
154
|
-
# Extract host from scheme://host[:port]
|
|
155
|
-
rest = origin.split("://", 1)[-1]
|
|
156
|
-
host = rest.split("/", 1)[0]
|
|
157
|
-
# Strip a trailing :port (IPv4/hostname); leave bracketed IPv6 alone.
|
|
158
|
-
if host.startswith("["):
|
|
159
|
-
host = host.split("]", 1)[0].lstrip("[")
|
|
160
|
-
elif host.count(":") == 1:
|
|
161
|
-
host = host.split(":", 1)[0]
|
|
162
|
-
return is_lan_client_allowed(host)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def _env_int(name: str, default: int) -> int:
|
|
166
|
-
"""Read a positive int from env, falling back to ``default`` on any error."""
|
|
167
|
-
raw = os.environ.get(name, "").strip()
|
|
168
|
-
if not raw:
|
|
169
|
-
return default
|
|
170
|
-
try:
|
|
171
|
-
val = int(raw)
|
|
172
|
-
except ValueError:
|
|
173
|
-
return default
|
|
174
|
-
return val if val > 0 else default
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def rate_limit_config() -> tuple[int, int, int]:
|
|
178
|
-
"""(write_max, read_max, window_seconds) for the dashboard rate limiter.
|
|
179
|
-
|
|
180
|
-
Issue #40 Issue 3: the limiter was hardcoded (30 writes / 120 reads per 60s)
|
|
181
|
-
with no way to raise it for distributed/LAN debugging, so a remote browser
|
|
182
|
-
that retried a failing Brain load hit ``429 Too Many Requests``. These are
|
|
183
|
-
now tunable via ``SLM_RATE_LIMIT_WRITE`` / ``SLM_RATE_LIMIT_READ`` /
|
|
184
|
-
``SLM_RATE_LIMIT_WINDOW`` (defaults unchanged for the local case).
|
|
185
|
-
"""
|
|
186
|
-
write_max = _env_int("SLM_RATE_LIMIT_WRITE", 30)
|
|
187
|
-
read_max = _env_int("SLM_RATE_LIMIT_READ", 120)
|
|
188
|
-
window = _env_int("SLM_RATE_LIMIT_WINDOW", 60)
|
|
189
|
-
return write_max, read_max, window
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def is_rate_limit_exempt(client_host: str) -> bool:
|
|
193
|
-
"""True iff ``client_host`` should bypass the dashboard rate limiter.
|
|
194
|
-
|
|
195
|
-
Loopback is always exempt (the dashboard polls itself rapidly). In remote
|
|
196
|
-
mode, an allowlisted LAN client is the user's own remote browser doing the
|
|
197
|
-
same rapid reads, so it is exempt too — otherwise normal dashboard polling
|
|
198
|
-
trips the limiter (issue #40 Issue 3).
|
|
199
|
-
"""
|
|
200
|
-
from superlocalmemory.server.loopback import is_loopback as _is_loopback_host
|
|
201
|
-
|
|
202
|
-
if _is_loopback_host(client_host):
|
|
203
|
-
return True
|
|
204
|
-
return is_lan_client_allowed(client_host)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
__all__ = (
|
|
208
|
-
"is_remote_mode",
|
|
209
|
-
"mcp_stateless",
|
|
210
|
-
"is_lan_client_allowed",
|
|
211
|
-
"is_remote_origin_allowed",
|
|
212
|
-
"rate_limit_config",
|
|
213
|
-
"is_rate_limit_exempt",
|
|
214
|
-
)
|
|
@@ -1,338 +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
|
-
"""Subprocess reranker worker — isolates PyTorch/ONNX from main process.
|
|
6
|
-
|
|
7
|
-
Same pattern as embedding_worker.py. The main process stays at ~60 MB.
|
|
8
|
-
All cross-encoder model memory lives in this worker subprocess.
|
|
9
|
-
|
|
10
|
-
Protocol (JSON over stdin/stdout):
|
|
11
|
-
Request: {"cmd": "rerank", "query": "...", "documents": ["...", ...]}
|
|
12
|
-
Response: {"ok": true, "scores": [0.95, 0.32, ...]}
|
|
13
|
-
|
|
14
|
-
Request: {"cmd": "score", "query": "...", "document": "..."}
|
|
15
|
-
Response: {"ok": true, "score": 0.87}
|
|
16
|
-
|
|
17
|
-
Request: {"cmd": "ping"}
|
|
18
|
-
Response: {"ok": true, "backend": "onnx", "model": "..."}
|
|
19
|
-
|
|
20
|
-
Request: {"cmd": "quit"}
|
|
21
|
-
(worker exits)
|
|
22
|
-
|
|
23
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
import json
|
|
29
|
-
import os
|
|
30
|
-
import platform
|
|
31
|
-
import signal
|
|
32
|
-
import struct
|
|
33
|
-
import sys
|
|
34
|
-
|
|
35
|
-
# Force CPU BEFORE any torch import
|
|
36
|
-
os.environ["CUDA_VISIBLE_DEVICES"] = ""
|
|
37
|
-
os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"] = "0.0"
|
|
38
|
-
os.environ["PYTORCH_MPS_MEM_LIMIT"] = "0"
|
|
39
|
-
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
|
|
40
|
-
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
|
41
|
-
os.environ["TORCH_DEVICE"] = "cpu"
|
|
42
|
-
# V3.3.17: Disable CoreML EP for ONNX Runtime. CoreML compiles execution
|
|
43
|
-
# plans that consume 3-5GB on ARM64 Mac. CPU EP is ~500MB and fast enough.
|
|
44
|
-
os.environ["ORT_DISABLE_COREML"] = "1"
|
|
45
|
-
|
|
46
|
-
# SIGTERM bridge for Docker/systemd
|
|
47
|
-
if sys.platform != "win32":
|
|
48
|
-
signal.signal(signal.SIGTERM, lambda *_: sys.exit(0))
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _start_parent_watchdog() -> None:
|
|
52
|
-
"""Monitor parent process — self-terminate if parent dies.
|
|
53
|
-
|
|
54
|
-
V3.4.24: Delegates to platform_utils.start_parent_watchdog().
|
|
55
|
-
"""
|
|
56
|
-
from superlocalmemory.core.platform_utils import start_parent_watchdog
|
|
57
|
-
start_parent_watchdog()
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _detect_onnx_variant(model_name: str = "") -> str:
|
|
61
|
-
"""Auto-detect the best ONNX model variant for the current platform.
|
|
62
|
-
|
|
63
|
-
V3.4.2: Supports both legacy ms-marco-MiniLM (platform-specific quantized)
|
|
64
|
-
and new gte-modernbert-base (int8/uint8 quantized). Falls back to generic
|
|
65
|
-
model.onnx if platform-specific variant unavailable.
|
|
66
|
-
"""
|
|
67
|
-
arch = platform.machine().lower()
|
|
68
|
-
is_64bit = struct.calcsize("P") * 8 == 64
|
|
69
|
-
|
|
70
|
-
# Legacy ms-marco-MiniLM models have platform-specific quantized variants
|
|
71
|
-
if "ms-marco" in model_name or "MiniLM" in model_name:
|
|
72
|
-
if sys.platform == "darwin" and arch in ("arm64", "aarch64"):
|
|
73
|
-
return "onnx/model_qint8_arm64.onnx"
|
|
74
|
-
if arch in ("x86_64", "amd64") and is_64bit:
|
|
75
|
-
return "onnx/model_quint8_avx2.onnx"
|
|
76
|
-
return "onnx/model.onnx"
|
|
77
|
-
|
|
78
|
-
# gte-modernbert-base and other modern models: int8 for ARM64, uint8 for x86
|
|
79
|
-
if sys.platform == "darwin" and arch in ("arm64", "aarch64"):
|
|
80
|
-
return "onnx/model_int8.onnx"
|
|
81
|
-
if arch in ("x86_64", "amd64") and is_64bit:
|
|
82
|
-
return "onnx/model_uint8.onnx"
|
|
83
|
-
return "onnx/model.onnx"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _worker_main() -> None:
|
|
87
|
-
"""Main loop: read JSON requests from stdin, write responses to stdout."""
|
|
88
|
-
_start_parent_watchdog()
|
|
89
|
-
from superlocalmemory.core.platform_utils import get_rss_mb
|
|
90
|
-
|
|
91
|
-
model = None
|
|
92
|
-
active_backend = ""
|
|
93
|
-
model_name = ""
|
|
94
|
-
|
|
95
|
-
for line in sys.stdin:
|
|
96
|
-
line = line.strip()
|
|
97
|
-
if not line:
|
|
98
|
-
continue
|
|
99
|
-
try:
|
|
100
|
-
req = json.loads(line)
|
|
101
|
-
except json.JSONDecodeError:
|
|
102
|
-
_respond({"ok": False, "error": "Invalid JSON"})
|
|
103
|
-
continue
|
|
104
|
-
|
|
105
|
-
cmd = req.get("cmd", "")
|
|
106
|
-
|
|
107
|
-
if cmd == "quit":
|
|
108
|
-
break
|
|
109
|
-
|
|
110
|
-
if cmd == "ping":
|
|
111
|
-
_respond({
|
|
112
|
-
"ok": True,
|
|
113
|
-
"loaded": model is not None,
|
|
114
|
-
"backend": active_backend,
|
|
115
|
-
"model": model_name,
|
|
116
|
-
})
|
|
117
|
-
continue
|
|
118
|
-
|
|
119
|
-
if cmd == "load":
|
|
120
|
-
name = req.get("model_name", "cross-encoder/ms-marco-MiniLM-L-12-v2")
|
|
121
|
-
backend = req.get("backend", "onnx")
|
|
122
|
-
model, active_backend, model_name, load_error = _load_model(
|
|
123
|
-
name, backend,
|
|
124
|
-
)
|
|
125
|
-
# V3.3.16: Run real inference to trigger ONNX CoreML JIT compilation.
|
|
126
|
-
# Without this, first real rerank call triggers 30-60s compilation
|
|
127
|
-
# that exceeds the caller's timeout, killing the worker.
|
|
128
|
-
warmup_ok = False
|
|
129
|
-
if model is not None:
|
|
130
|
-
try:
|
|
131
|
-
# Use 60 pairs (realistic batch size) to trigger CoreML
|
|
132
|
-
# compilation for the actual workload. 3 pairs compiled a
|
|
133
|
-
# different execution plan that got recompiled on 60 pairs.
|
|
134
|
-
dummy_pairs = [
|
|
135
|
-
(f"What happened to person {i}?", f"Person {i} went to location {i} and did activity {i} last summer with friends.")
|
|
136
|
-
for i in range(60)
|
|
137
|
-
]
|
|
138
|
-
try:
|
|
139
|
-
import torch
|
|
140
|
-
with torch.inference_mode():
|
|
141
|
-
_scores = model.predict(dummy_pairs)
|
|
142
|
-
except ImportError:
|
|
143
|
-
_scores = model.predict(dummy_pairs)
|
|
144
|
-
warmup_ok = True
|
|
145
|
-
except Exception:
|
|
146
|
-
pass
|
|
147
|
-
_respond({
|
|
148
|
-
"ok": model is not None,
|
|
149
|
-
"backend": active_backend,
|
|
150
|
-
"model": model_name,
|
|
151
|
-
"warmup_inference": warmup_ok,
|
|
152
|
-
# Carries the real reason to the parent so the warmup log can
|
|
153
|
-
# print it instead of a generic timeout message (issue #103).
|
|
154
|
-
"error": load_error,
|
|
155
|
-
})
|
|
156
|
-
continue
|
|
157
|
-
|
|
158
|
-
if cmd == "rerank":
|
|
159
|
-
query = req.get("query", "")
|
|
160
|
-
documents = req.get("documents", [])
|
|
161
|
-
if not query or not documents:
|
|
162
|
-
_respond({"ok": False, "error": "Missing query or documents"})
|
|
163
|
-
continue
|
|
164
|
-
if model is None:
|
|
165
|
-
# Auto-load with defaults
|
|
166
|
-
name = req.get("model_name", "cross-encoder/ms-marco-MiniLM-L-12-v2")
|
|
167
|
-
backend = req.get("backend", "onnx")
|
|
168
|
-
model, active_backend, model_name, load_error = _load_model(
|
|
169
|
-
name, backend,
|
|
170
|
-
)
|
|
171
|
-
if model is None:
|
|
172
|
-
_respond({
|
|
173
|
-
"ok": False,
|
|
174
|
-
"error": load_error or "Model load failed",
|
|
175
|
-
})
|
|
176
|
-
continue
|
|
177
|
-
try:
|
|
178
|
-
pairs = [(query, doc) for doc in documents]
|
|
179
|
-
try:
|
|
180
|
-
import torch
|
|
181
|
-
with torch.inference_mode():
|
|
182
|
-
scores = model.predict(pairs)
|
|
183
|
-
except ImportError:
|
|
184
|
-
scores = model.predict(pairs)
|
|
185
|
-
_respond({
|
|
186
|
-
"ok": True,
|
|
187
|
-
"scores": [float(s) for s in scores],
|
|
188
|
-
})
|
|
189
|
-
except Exception as exc:
|
|
190
|
-
_respond({"ok": False, "error": str(exc)})
|
|
191
|
-
|
|
192
|
-
# V3.3.16: RSS watchdog — V3.4.24: cross-platform via platform_utils.
|
|
193
|
-
rss_mb = get_rss_mb()
|
|
194
|
-
if rss_mb > 0 and rss_mb > 2500:
|
|
195
|
-
sys.exit(0)
|
|
196
|
-
|
|
197
|
-
continue
|
|
198
|
-
|
|
199
|
-
if cmd == "score":
|
|
200
|
-
query = req.get("query", "")
|
|
201
|
-
document = req.get("document", "")
|
|
202
|
-
if not query or not document:
|
|
203
|
-
_respond({"ok": False, "error": "Missing query or document"})
|
|
204
|
-
continue
|
|
205
|
-
if model is None:
|
|
206
|
-
name = req.get("model_name", "cross-encoder/ms-marco-MiniLM-L-12-v2")
|
|
207
|
-
backend = req.get("backend", "onnx")
|
|
208
|
-
model, active_backend, model_name, load_error = _load_model(
|
|
209
|
-
name, backend,
|
|
210
|
-
)
|
|
211
|
-
if model is None:
|
|
212
|
-
_respond({
|
|
213
|
-
"ok": False,
|
|
214
|
-
"error": load_error or "Model load failed",
|
|
215
|
-
})
|
|
216
|
-
continue
|
|
217
|
-
try:
|
|
218
|
-
try:
|
|
219
|
-
import torch
|
|
220
|
-
with torch.inference_mode():
|
|
221
|
-
scores = model.predict([(query, document)])
|
|
222
|
-
except ImportError:
|
|
223
|
-
scores = model.predict([(query, document)])
|
|
224
|
-
_respond({"ok": True, "score": float(scores[0])})
|
|
225
|
-
except Exception as exc:
|
|
226
|
-
_respond({"ok": False, "error": str(exc)})
|
|
227
|
-
continue
|
|
228
|
-
|
|
229
|
-
_respond({"ok": False, "error": f"Unknown command: {cmd}"})
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
_KNOWN_BACKENDS = ("onnx", "", "pytorch", "torch")
|
|
233
|
-
# Backends this worker can never serve — they are handled over HTTP by
|
|
234
|
-
# superlocalmemory.retrieval.remote_reranker in the parent process (#105).
|
|
235
|
-
# Duplicated as a literal on purpose: this module runs as a bare subprocess
|
|
236
|
-
# and must not import the retrieval package (or, transitively, httpx).
|
|
237
|
-
_REMOTE_BACKENDS = ("openai", "remote")
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def _load_model(
|
|
241
|
-
name: str, backend: str,
|
|
242
|
-
) -> tuple:
|
|
243
|
-
"""Load cross-encoder model. Returns (model, backend_name, model_name, error).
|
|
244
|
-
|
|
245
|
-
V3.3.13: sentence-transformers 5.x+ supports backend='onnx' for
|
|
246
|
-
CrossEncoder. We use a 3-tier fallback chain:
|
|
247
|
-
|
|
248
|
-
1. ONNX + platform-quantized model (fastest, ~200MB, 2.4ms/pair)
|
|
249
|
-
2. ONNX + generic model (fast, auto-exported on first use)
|
|
250
|
-
3. PyTorch (always works, ~500MB, 6ms/pair)
|
|
251
|
-
|
|
252
|
-
Cross-platform:
|
|
253
|
-
Mac ARM64 → model_qint8_arm64.onnx
|
|
254
|
-
x86_64 → model_quint8_avx2.onnx
|
|
255
|
-
Fallback → model.onnx (generic)
|
|
256
|
-
"""
|
|
257
|
-
# v3.8.11 (issue #103): an unrecognised backend used to fall through to
|
|
258
|
-
# the PyTorch tier and fail there with a confusing model-load error. A
|
|
259
|
-
# user who set backend="openai" expecting a remote reranker got five
|
|
260
|
-
# silent failures and no hint that the value meant nothing. Name it.
|
|
261
|
-
#
|
|
262
|
-
# v3.8.12 (issue #105): remote reranking now EXISTS, but it is served in
|
|
263
|
-
# the parent process — this worker holds torch/ONNX and cannot forward an
|
|
264
|
-
# HTTP request. Reaching here with a remote backend means the parent
|
|
265
|
-
# routed wrong (or a caller drove the worker directly), so the message
|
|
266
|
-
# points at the config keys that select the remote path.
|
|
267
|
-
if backend in _REMOTE_BACKENDS:
|
|
268
|
-
return None, "", "", (
|
|
269
|
-
f"unknown backend {backend!r} for the LOCAL reranker worker. "
|
|
270
|
-
f"{backend!r} selects the remote reranker, which runs in the "
|
|
271
|
-
f"parent process — set retrieval.cross_encoder_endpoint (e.g. "
|
|
272
|
-
f"\"http://127.0.0.1:8041/v1/rerank\") so SuperLocalMemory routes "
|
|
273
|
-
f"reranking over HTTP instead of spawning this worker."
|
|
274
|
-
)
|
|
275
|
-
if backend not in _KNOWN_BACKENDS:
|
|
276
|
-
return None, "", "", (
|
|
277
|
-
f"unknown backend {backend!r}; supported values are 'onnx' or ''"
|
|
278
|
-
f" (PyTorch) for local reranking, or 'openai'/'remote' with "
|
|
279
|
-
f"retrieval.cross_encoder_endpoint set for a remote "
|
|
280
|
-
f"OpenAI-compatible /v1/rerank endpoint."
|
|
281
|
-
)
|
|
282
|
-
|
|
283
|
-
tier_errors: list[str] = []
|
|
284
|
-
try:
|
|
285
|
-
from sentence_transformers import CrossEncoder
|
|
286
|
-
|
|
287
|
-
if backend == "onnx":
|
|
288
|
-
# Tier 1: Platform-specific quantized ONNX (fastest)
|
|
289
|
-
try:
|
|
290
|
-
onnx_file = _detect_onnx_variant(name)
|
|
291
|
-
m = CrossEncoder(
|
|
292
|
-
name, backend="onnx",
|
|
293
|
-
model_kwargs={"file_name": onnx_file},
|
|
294
|
-
)
|
|
295
|
-
return m, f"onnx-quantized({onnx_file})", name, ""
|
|
296
|
-
except Exception as exc:
|
|
297
|
-
tier_errors.append(f"onnx-quantized: {exc}")
|
|
298
|
-
|
|
299
|
-
# Tier 2: Generic ONNX (auto-exported by optimum)
|
|
300
|
-
try:
|
|
301
|
-
m = CrossEncoder(name, backend="onnx")
|
|
302
|
-
return m, "onnx", name, ""
|
|
303
|
-
except Exception as exc:
|
|
304
|
-
tier_errors.append(f"onnx: {exc}")
|
|
305
|
-
|
|
306
|
-
# Tier 3: PyTorch (always works, no ONNX dependency needed)
|
|
307
|
-
m = CrossEncoder(name)
|
|
308
|
-
return m, "pytorch", name, ""
|
|
309
|
-
except ImportError as exc:
|
|
310
|
-
# Previously indistinguishable from a bad model name.
|
|
311
|
-
return None, "", "", (
|
|
312
|
-
f"sentence-transformers is not installed ({exc}); "
|
|
313
|
-
f"install it or set retrieval.use_cross_encoder=false"
|
|
314
|
-
)
|
|
315
|
-
except Exception as exc:
|
|
316
|
-
tier_errors.append(f"pytorch: {exc}")
|
|
317
|
-
# Every tier's real error, propagated instead of discarded. Before
|
|
318
|
-
# 3.8.11 this returned (None, "", "") and the operator saw only a
|
|
319
|
-
# generic "did not confirm ready" line from the parent process.
|
|
320
|
-
return None, "", "", (
|
|
321
|
-
f"could not load cross-encoder model {name!r} "
|
|
322
|
-
f"(backend={backend or 'pytorch'}): " + "; ".join(tier_errors)
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
def _respond(data: dict) -> None:
|
|
327
|
-
"""Write JSON response to stdout, flush immediately."""
|
|
328
|
-
sys.stdout.write(json.dumps(data) + "\n")
|
|
329
|
-
sys.stdout.flush()
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
if __name__ == "__main__":
|
|
333
|
-
try:
|
|
334
|
-
_worker_main()
|
|
335
|
-
except KeyboardInterrupt:
|
|
336
|
-
# V3.3.13: Windows CI sends KeyboardInterrupt on test completion.
|
|
337
|
-
# Exit cleanly instead of printing a traceback that fails CI.
|
|
338
|
-
sys.exit(0)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Filesystem safety helpers for SQLite DB open paths.
|
|
6
|
-
|
|
7
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import os
|
|
13
|
-
import sqlite3
|
|
14
|
-
import stat
|
|
15
|
-
import sys
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class SafeFsError(RuntimeError):
|
|
20
|
-
"""Raised when a data-directory or DB-open precondition fails."""
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
_FORBIDDEN_COMPONENTS = (
|
|
24
|
-
"iCloud Drive", "Mobile Documents", "CloudDocs",
|
|
25
|
-
"Dropbox", "Google Drive", "OneDrive", "Box Sync",
|
|
26
|
-
# macOS 13+ canonical cloud-storage mount point. Every modern
|
|
27
|
-
# Dropbox / OneDrive / Google Drive / Box install on macOS routes
|
|
28
|
-
# through here, bypassing the brand-name checks above.
|
|
29
|
-
"Library/CloudStorage",
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def validate_data_dir(path: Path) -> None:
|
|
34
|
-
"""Refuse paths that live under a cloud-sync folder.
|
|
35
|
-
|
|
36
|
-
Cloud-synced directories silently corrupt SQLite WAL files.
|
|
37
|
-
"""
|
|
38
|
-
resolved = str(path.resolve())
|
|
39
|
-
lowered = resolved.lower()
|
|
40
|
-
for comp in _FORBIDDEN_COMPONENTS:
|
|
41
|
-
if comp.lower() in lowered:
|
|
42
|
-
raise SafeFsError(
|
|
43
|
-
f"SLM data directory {resolved} appears to live under "
|
|
44
|
-
f"{comp!r} — cloud-synced folders are not supported "
|
|
45
|
-
f"(SQLite WAL corrupts silently on replication). "
|
|
46
|
-
f"Set SLM_DATA_DIR to a local path such as "
|
|
47
|
-
f"{Path.home()}/.slm-local"
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _ensure_parent_0700(path: Path) -> None:
|
|
52
|
-
parent = path.parent
|
|
53
|
-
if not parent.exists():
|
|
54
|
-
parent.mkdir(parents=True, exist_ok=True)
|
|
55
|
-
if sys.platform == "win32":
|
|
56
|
-
return
|
|
57
|
-
st = parent.stat()
|
|
58
|
-
if st.st_uid != os.getuid():
|
|
59
|
-
raise SafeFsError(
|
|
60
|
-
f"{parent} is not owned by current user (uid={os.getuid()})"
|
|
61
|
-
)
|
|
62
|
-
if (st.st_mode & 0o077) != 0:
|
|
63
|
-
os.chmod(parent, 0o700)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def _safe_open_db(path: Path) -> sqlite3.Connection:
|
|
67
|
-
"""Open a SQLite DB with TOCTOU-tight symlink protection.
|
|
68
|
-
|
|
69
|
-
Pattern:
|
|
70
|
-
1. Enforce parent directory 0700.
|
|
71
|
-
2. lstat the DB path; refuse if it's already a symlink.
|
|
72
|
-
3. Open with O_NOFOLLOW to catch a last-moment swap.
|
|
73
|
-
4. fstat and compare inode with the pre-open lstat.
|
|
74
|
-
5. Close the fd and let sqlite3.connect reopen by path so WAL
|
|
75
|
-
and SHM sibling files can be created naturally.
|
|
76
|
-
"""
|
|
77
|
-
_ensure_parent_0700(path)
|
|
78
|
-
if sys.platform != "win32":
|
|
79
|
-
if path.exists():
|
|
80
|
-
pre_st = os.lstat(str(path))
|
|
81
|
-
if stat.S_ISLNK(pre_st.st_mode):
|
|
82
|
-
raise SafeFsError(f"{path} is a symlink — refused")
|
|
83
|
-
if pre_st.st_uid != os.getuid():
|
|
84
|
-
raise SafeFsError(f"{path} not owned by current user")
|
|
85
|
-
if (pre_st.st_mode & 0o077) != 0:
|
|
86
|
-
os.chmod(str(path), 0o600)
|
|
87
|
-
else:
|
|
88
|
-
pre_st = None
|
|
89
|
-
try:
|
|
90
|
-
flags = os.O_RDWR | os.O_CREAT | os.O_NOFOLLOW
|
|
91
|
-
fd = os.open(str(path), flags, 0o600)
|
|
92
|
-
except OSError as exc:
|
|
93
|
-
raise SafeFsError(f"Cannot safely open {path}: {exc}") from exc
|
|
94
|
-
try:
|
|
95
|
-
post_st = os.fstat(fd)
|
|
96
|
-
if pre_st is not None and (
|
|
97
|
-
(pre_st.st_ino, pre_st.st_dev)
|
|
98
|
-
!= (post_st.st_ino, post_st.st_dev)
|
|
99
|
-
):
|
|
100
|
-
raise SafeFsError(
|
|
101
|
-
f"{path} changed between lstat and open — refused"
|
|
102
|
-
)
|
|
103
|
-
finally:
|
|
104
|
-
os.close(fd)
|
|
105
|
-
conn = sqlite3.connect(
|
|
106
|
-
str(path), isolation_level=None, timeout=5.0, check_same_thread=False,
|
|
107
|
-
)
|
|
108
|
-
return conn
|