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,316 +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.4.22
|
|
4
|
-
|
|
5
|
-
"""Legacy ``learning_feedback`` row migration — data movement only.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Hard rule H15 (LLD-06 §10): this module MUST NOT contain any schema
|
|
9
|
-
DDL. All schema definitions live in
|
|
10
|
-
``src/superlocalmemory/storage/migrations/`` modules. This file is
|
|
11
|
-
data-copy only — the tables it reads from and writes into are created
|
|
12
|
-
by the LLD-07 runner before this runs.
|
|
13
|
-
|
|
14
|
-
S8-ARC-01 fix: the earlier stub always returned ``copied=0`` while the
|
|
15
|
-
``/api/v3/brain`` endpoint surfaced the pre-existing ``learning_feedback``
|
|
16
|
-
row count as ``legacy_migrated_count`` — a silent integrity lie. This
|
|
17
|
-
implementation does the real row copy and is idempotent (guarded by a
|
|
18
|
-
``migration_log`` sentinel row under the name ``LEG001_feedback_to_signals``).
|
|
19
|
-
D5 (keep ``learning_feedback`` for one release) still holds — this
|
|
20
|
-
migration does NOT delete from ``learning_feedback``; it only inserts
|
|
21
|
-
into ``learning_signals`` + ``learning_features``.
|
|
22
|
-
"""
|
|
23
|
-
from __future__ import annotations
|
|
24
|
-
|
|
25
|
-
import json
|
|
26
|
-
import logging
|
|
27
|
-
import sqlite3
|
|
28
|
-
from datetime import datetime, timezone
|
|
29
|
-
from pathlib import Path
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
|
-
# Marker used in migration_log to signal the data-copy has run.
|
|
34
|
-
MIGRATION_NAME = "LEG001_feedback_to_signals"
|
|
35
|
-
|
|
36
|
-
# Batch size for the row copy. 500 keeps the single transaction short
|
|
37
|
-
# enough that any concurrent SQLite reader only sees brief locks, while
|
|
38
|
-
# still amortising the per-row overhead.
|
|
39
|
-
_COPY_BATCH_SIZE = 500
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def legacy_query_id(feedback_row_id: int | str) -> str:
|
|
43
|
-
"""Return the canonical ``learning_signals.query_id`` for a feedback row.
|
|
44
|
-
|
|
45
|
-
One explicit-feedback event has exactly ONE canonical identity, whichever
|
|
46
|
-
path writes it: this batch migration, or ``FeedbackCollector`` writing the
|
|
47
|
-
canonical pair eagerly at feedback time. Both derive the id from the
|
|
48
|
-
``learning_feedback`` row id through this function, which is what lets the
|
|
49
|
-
migration recognise — and skip — rows already carried forward. Without a
|
|
50
|
-
shared identity the two writers would double-count the same event into the
|
|
51
|
-
store that gates the ranking phase.
|
|
52
|
-
"""
|
|
53
|
-
return f"legacy:{feedback_row_id}"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def migrate_legacy_feedback(
|
|
57
|
-
learning_db: Path,
|
|
58
|
-
*,
|
|
59
|
-
dry_run: bool = False,
|
|
60
|
-
) -> dict:
|
|
61
|
-
"""Copy ``learning_feedback`` rows forward into LLD-02 tables.
|
|
62
|
-
|
|
63
|
-
Policy (LLD-07 §5 + D5 + D9):
|
|
64
|
-
* Idempotent: if ``migration_log`` already has ``LEG001_feedback_to_signals``
|
|
65
|
-
with status 'complete', returns a stats dict with ``already_done=True``.
|
|
66
|
-
* Preserves the original ``learning_feedback`` table (D5 — one release).
|
|
67
|
-
* Flags synthetic rows: ``learning_features.is_synthetic=1`` so the
|
|
68
|
-
LightGBM trainer in ``consolidation_worker._retrain_ranker`` can
|
|
69
|
-
exclude them from training (``WHERE is_synthetic=0``).
|
|
70
|
-
* Never raises; any sqlite3 error collapses into ``failed=N`` and a
|
|
71
|
-
WARN log so the daemon lifespan can continue.
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
``{"copied": int, "skipped": int, "failed": int,
|
|
75
|
-
"already_done": bool, "details": {...}}``
|
|
76
|
-
"""
|
|
77
|
-
stats = {
|
|
78
|
-
"copied": 0, "skipped": 0, "failed": 0,
|
|
79
|
-
"already_done": False,
|
|
80
|
-
"details": {"name": MIGRATION_NAME, "dry_run": dry_run},
|
|
81
|
-
}
|
|
82
|
-
if not learning_db.exists():
|
|
83
|
-
stats["details"]["reason"] = "db_missing"
|
|
84
|
-
return stats
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
conn = sqlite3.connect(str(learning_db), isolation_level=None, timeout=10.0)
|
|
88
|
-
conn.row_factory = sqlite3.Row
|
|
89
|
-
except sqlite3.Error as exc:
|
|
90
|
-
logger.warning("legacy migration: open failed: %s", exc)
|
|
91
|
-
stats["failed"] = 1
|
|
92
|
-
stats["details"]["reason"] = f"open_failed:{type(exc).__name__}"
|
|
93
|
-
return stats
|
|
94
|
-
|
|
95
|
-
try:
|
|
96
|
-
# Every required table must exist. If any is missing we defer to
|
|
97
|
-
# the migration runner (LLD-07 M001/M003) and record a skip.
|
|
98
|
-
if not _tables_exist(conn, ("migration_log", "learning_feedback",
|
|
99
|
-
"learning_signals", "learning_features")):
|
|
100
|
-
stats["details"]["reason"] = "required_tables_missing"
|
|
101
|
-
return stats
|
|
102
|
-
|
|
103
|
-
if _already_complete(conn, MIGRATION_NAME):
|
|
104
|
-
stats["already_done"] = True
|
|
105
|
-
stats["details"]["reason"] = "migration_log_complete"
|
|
106
|
-
return stats
|
|
107
|
-
|
|
108
|
-
# Row count of candidates up front so the stats dict can report
|
|
109
|
-
# progress even under a dry_run.
|
|
110
|
-
total = _count_feedback(conn)
|
|
111
|
-
stats["details"]["source_rows"] = total
|
|
112
|
-
if total == 0:
|
|
113
|
-
_record_migration(conn, MIGRATION_NAME,
|
|
114
|
-
status="complete", rows_affected=0,
|
|
115
|
-
dry_run=dry_run)
|
|
116
|
-
return stats
|
|
117
|
-
|
|
118
|
-
if dry_run:
|
|
119
|
-
stats["details"]["reason"] = "dry_run_noop"
|
|
120
|
-
stats["skipped"] = total
|
|
121
|
-
return stats
|
|
122
|
-
|
|
123
|
-
copied, failed = _copy_rows(conn)
|
|
124
|
-
stats["copied"] = copied
|
|
125
|
-
stats["failed"] = failed
|
|
126
|
-
_record_migration(conn, MIGRATION_NAME,
|
|
127
|
-
status="complete" if failed == 0 else "partial",
|
|
128
|
-
rows_affected=copied, dry_run=False)
|
|
129
|
-
return stats
|
|
130
|
-
finally:
|
|
131
|
-
try:
|
|
132
|
-
conn.close()
|
|
133
|
-
except sqlite3.Error: # pragma: no cover — defensive close
|
|
134
|
-
pass
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
# ---------------------------------------------------------------------------
|
|
138
|
-
# Helpers — parameterised SQL only; no DDL here per H15.
|
|
139
|
-
# ---------------------------------------------------------------------------
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def _tables_exist(conn: sqlite3.Connection, names: tuple[str, ...]) -> bool:
|
|
143
|
-
rows = conn.execute(
|
|
144
|
-
"SELECT name FROM sqlite_master WHERE type='table' AND name IN "
|
|
145
|
-
"(" + ",".join("?" * len(names)) + ")",
|
|
146
|
-
names,
|
|
147
|
-
).fetchall()
|
|
148
|
-
return len(rows) == len(names)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def _already_complete(conn: sqlite3.Connection, name: str) -> bool:
|
|
152
|
-
row = conn.execute(
|
|
153
|
-
"SELECT status FROM migration_log WHERE name = ?",
|
|
154
|
-
(name,),
|
|
155
|
-
).fetchone()
|
|
156
|
-
return row is not None and str(row[0]).lower() == "complete"
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def _count_feedback(conn: sqlite3.Connection) -> int:
|
|
160
|
-
row = conn.execute(
|
|
161
|
-
"SELECT COUNT(*) FROM learning_feedback",
|
|
162
|
-
).fetchone()
|
|
163
|
-
return int(row[0]) if row else 0
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
def _copy_rows(conn: sqlite3.Connection) -> tuple[int, int]:
|
|
167
|
-
"""Copy all ``learning_feedback`` rows forward.
|
|
168
|
-
|
|
169
|
-
Returns ``(copied, failed)``. Does not raise. Commits per batch so
|
|
170
|
-
a later failure still leaves the earlier batches durable.
|
|
171
|
-
|
|
172
|
-
Rows whose canonical ``query_id`` is already present in
|
|
173
|
-
``learning_signals`` are skipped rather than copied a second time.
|
|
174
|
-
``FeedbackCollector`` writes the canonical pair at feedback time, so on
|
|
175
|
-
any install where this migration has not yet been sentinel-marked the
|
|
176
|
-
newest rows are already carried forward; copying them again would
|
|
177
|
-
inflate the very counter that gates the ranking phase.
|
|
178
|
-
"""
|
|
179
|
-
copied = 0
|
|
180
|
-
failed = 0
|
|
181
|
-
offset = 0
|
|
182
|
-
already_present = _existing_legacy_query_ids(conn)
|
|
183
|
-
while True:
|
|
184
|
-
try:
|
|
185
|
-
batch = conn.execute(
|
|
186
|
-
"SELECT id, profile_id, query_hash, fact_id, "
|
|
187
|
-
" signal_type, signal_value, created_at "
|
|
188
|
-
"FROM learning_feedback "
|
|
189
|
-
"ORDER BY id LIMIT ? OFFSET ?",
|
|
190
|
-
(_COPY_BATCH_SIZE, offset),
|
|
191
|
-
).fetchall()
|
|
192
|
-
except sqlite3.Error as exc:
|
|
193
|
-
logger.warning("legacy migration: batch read failed: %s", exc)
|
|
194
|
-
failed += 1
|
|
195
|
-
break
|
|
196
|
-
if not batch:
|
|
197
|
-
break
|
|
198
|
-
|
|
199
|
-
try:
|
|
200
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
201
|
-
for row in batch:
|
|
202
|
-
if legacy_query_id(row["id"]) in already_present:
|
|
203
|
-
continue
|
|
204
|
-
try:
|
|
205
|
-
_copy_single_row(conn, row)
|
|
206
|
-
copied += 1
|
|
207
|
-
except sqlite3.Error as exc:
|
|
208
|
-
logger.debug("legacy migration: row %s failed: %s",
|
|
209
|
-
row[0], exc)
|
|
210
|
-
failed += 1
|
|
211
|
-
conn.execute("COMMIT")
|
|
212
|
-
except sqlite3.Error as exc:
|
|
213
|
-
logger.warning("legacy migration: batch commit failed: %s", exc)
|
|
214
|
-
try:
|
|
215
|
-
conn.execute("ROLLBACK")
|
|
216
|
-
except sqlite3.Error: # pragma: no cover
|
|
217
|
-
pass
|
|
218
|
-
failed += len(batch)
|
|
219
|
-
offset += len(batch)
|
|
220
|
-
|
|
221
|
-
return copied, failed
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
def _existing_legacy_query_ids(conn: sqlite3.Connection) -> set[str]:
|
|
225
|
-
"""Return every ``legacy:`` query_id already present in learning_signals.
|
|
226
|
-
|
|
227
|
-
Read once up front: a per-row EXISTS probe over a signals table that grows
|
|
228
|
-
to tens of thousands of rows turns an O(n) copy into O(n*m).
|
|
229
|
-
"""
|
|
230
|
-
try:
|
|
231
|
-
rows = conn.execute(
|
|
232
|
-
"SELECT DISTINCT query_id FROM learning_signals "
|
|
233
|
-
"WHERE query_id LIKE 'legacy:%'",
|
|
234
|
-
).fetchall()
|
|
235
|
-
except sqlite3.Error as exc:
|
|
236
|
-
logger.warning("legacy migration: dedupe probe failed: %s", exc)
|
|
237
|
-
return set()
|
|
238
|
-
return {str(row[0]) for row in rows}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
def _copy_single_row(conn: sqlite3.Connection, row: sqlite3.Row) -> None:
|
|
242
|
-
"""Insert one legacy row into learning_signals + learning_features.
|
|
243
|
-
|
|
244
|
-
Synthetic features are minimal (position from the legacy row if present,
|
|
245
|
-
zeros elsewhere). The LightGBM trainer filters these out via
|
|
246
|
-
``is_synthetic=0``; the bandit/heuristic layer can still learn from
|
|
247
|
-
signal counts.
|
|
248
|
-
|
|
249
|
-
Note: ``learning_feedback.query_hash`` is already a privacy-hashed
|
|
250
|
-
digest (LLD-02 §4.1 S2), so we copy it forward as-is. Padding to
|
|
251
|
-
32 chars keeps a stable shape when upstream hashes are shorter.
|
|
252
|
-
"""
|
|
253
|
-
stored_hash = str(row["query_hash"] or "")
|
|
254
|
-
# Keep the hash at 32 hex chars for shape-stability with fresh signals.
|
|
255
|
-
query_hash = (stored_hash + ("0" * 32))[:32]
|
|
256
|
-
created_at = str(row["created_at"] or
|
|
257
|
-
datetime.now(timezone.utc).isoformat(timespec="seconds"))
|
|
258
|
-
profile_id = str(row["profile_id"] or "default")
|
|
259
|
-
fact_id = str(row["fact_id"] or "")
|
|
260
|
-
query_id = legacy_query_id(row["id"])
|
|
261
|
-
|
|
262
|
-
# Insert the signal row. ``signal_type='legacy_feedback'`` marks it
|
|
263
|
-
# clearly so consumers (dashboard, labeler) can treat it correctly.
|
|
264
|
-
cur = conn.execute(
|
|
265
|
-
"INSERT INTO learning_signals "
|
|
266
|
-
"(profile_id, query, fact_id, signal_type, value, created_at, "
|
|
267
|
-
" query_id, query_text_hash, position, channel_scores, cross_encoder) "
|
|
268
|
-
"VALUES (?, '', ?, 'legacy_feedback', ?, ?, ?, ?, 0, '{}', NULL)",
|
|
269
|
-
(profile_id, fact_id,
|
|
270
|
-
float(row["signal_value"] or 1.0),
|
|
271
|
-
created_at, query_id, query_hash),
|
|
272
|
-
)
|
|
273
|
-
sid = cur.lastrowid
|
|
274
|
-
|
|
275
|
-
# Synthetic 20-dim feature vector (zeros). The real FEATURE_NAMES
|
|
276
|
-
# come from ``learning.features`` at training time; we don't import
|
|
277
|
-
# it here to keep this module boot-order-independent.
|
|
278
|
-
conn.execute(
|
|
279
|
-
"INSERT INTO learning_features "
|
|
280
|
-
"(profile_id, query_id, fact_id, features_json, label, created_at, "
|
|
281
|
-
" signal_id, is_synthetic) "
|
|
282
|
-
"VALUES (?, ?, ?, '{}', 0.0, ?, ?, 1)",
|
|
283
|
-
(profile_id, query_id, fact_id, created_at, sid),
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
def _record_migration(
|
|
288
|
-
conn: sqlite3.Connection,
|
|
289
|
-
name: str,
|
|
290
|
-
*,
|
|
291
|
-
status: str,
|
|
292
|
-
rows_affected: int,
|
|
293
|
-
dry_run: bool,
|
|
294
|
-
) -> None:
|
|
295
|
-
"""Record migration status in ``migration_log``. No DDL here (H15).
|
|
296
|
-
|
|
297
|
-
The ``migration_log`` schema uses ``applied_at`` + ``ddl_sha256``
|
|
298
|
-
(see storage/migrations/M003_migration_log.py). This is a data-only
|
|
299
|
-
migration, so ``ddl_sha256`` is the empty string — the sentinel row
|
|
300
|
-
is for idempotency, not schema-drift detection.
|
|
301
|
-
"""
|
|
302
|
-
applied_at = datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
303
|
-
if dry_run:
|
|
304
|
-
return
|
|
305
|
-
try:
|
|
306
|
-
conn.execute(
|
|
307
|
-
"INSERT OR REPLACE INTO migration_log "
|
|
308
|
-
"(name, applied_at, ddl_sha256, rows_affected, status) "
|
|
309
|
-
"VALUES (?, ?, '', ?, ?)",
|
|
310
|
-
(name, applied_at, rows_affected, status),
|
|
311
|
-
)
|
|
312
|
-
except sqlite3.Error as exc:
|
|
313
|
-
logger.warning("legacy migration: log record failed: %s", exc)
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
__all__ = ("migrate_legacy_feedback", "MIGRATION_NAME", "legacy_query_id")
|
|
@@ -1,236 +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
|
-
"""Isolated LightGBM work (retrain + consolidation) — OpenMP-crash guard.
|
|
6
|
-
|
|
7
|
-
**Why this exists** — the unified daemon serves the HTTP API in-process and,
|
|
8
|
-
by then, has already loaded PyTorch's OpenMP runtime (``torch/lib/libomp.dylib``)
|
|
9
|
-
with *warm* worker threads (the cross-encoder reranker + embedding warm-up at
|
|
10
|
-
startup). Any code path that imports ``lightgbm`` in that same process loads a
|
|
11
|
-
*second* OpenMP runtime — the Homebrew ``libomp.dylib`` that
|
|
12
|
-
``lib_lightgbm.dylib`` links against — which corrupts the shared ``__kmp``
|
|
13
|
-
global state and SIGSEGVs a pre-existing torch OMP worker thread. That
|
|
14
|
-
hard-crashes the whole daemon (observed on macOS / Apple Silicon;
|
|
15
|
-
``DiagnosticReports/Python-*.ips`` shows ``libomp.dylib __kmp_launch_worker``).
|
|
16
|
-
|
|
17
|
-
Two in-daemon entry points reach LightGBM training:
|
|
18
|
-
* ``POST /api/learning/retrain`` → legacy ``_retrain_ranker_impl``;
|
|
19
|
-
* ``POST /api/v3/learning/consolidate`` → ``ConsolidationWorker.run`` whose
|
|
20
|
-
step 5 trains via the online ``_run_shadow_cycle`` (active model) or the
|
|
21
|
-
legacy cold-start path.
|
|
22
|
-
|
|
23
|
-
Both are funnelled through this module so LightGBM only ever trains in a
|
|
24
|
-
**fresh subprocess** that never runs a torch tensor op — torch's OMP pool stays
|
|
25
|
-
dormant there and lightgbm's runtime is the only active one. The mechanism
|
|
26
|
-
mirrors the existing ``embedding_worker`` / ``reranker_worker`` isolation.
|
|
27
|
-
|
|
28
|
-
Spawned via :func:`run_retrain_isolated` / :func:`run_consolidation_isolated`,
|
|
29
|
-
which use a ``python -c`` bootstrap that imports lightgbm BEFORE the
|
|
30
|
-
``superlocalmemory`` package. That ordering is load-bearing: importing the
|
|
31
|
-
package transitively pulls in torch, and torch-OMP-first-then-lightgbm is
|
|
32
|
-
exactly the sequence that segfaults. A plain ``python -m
|
|
33
|
-
superlocalmemory.learning.lightgbm_subprocess`` would run the package
|
|
34
|
-
``__init__`` (torch) first and crash — do not invoke it that way.
|
|
35
|
-
|
|
36
|
-
The child emits a single JSON line on stdout — ``{"error": str|null, ...}`` —
|
|
37
|
-
plus a task payload (``trained`` for retrain, ``stats`` for consolidate).
|
|
38
|
-
Exit 0 = ran to completion; non-zero = handled failure. Either way the parent
|
|
39
|
-
(the daemon) keeps running.
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
from __future__ import annotations
|
|
43
|
-
|
|
44
|
-
import argparse
|
|
45
|
-
import json
|
|
46
|
-
import logging
|
|
47
|
-
import subprocess
|
|
48
|
-
import sys
|
|
49
|
-
from pathlib import Path
|
|
50
|
-
|
|
51
|
-
logger = logging.getLogger(__name__)
|
|
52
|
-
|
|
53
|
-
# Wall-clock ceilings. A retrain is 50 boosting rounds on ≤2000 rows (seconds);
|
|
54
|
-
# a full consolidation cycle also decays/dedups/mines/graph-analyses, so it
|
|
55
|
-
# gets more headroom.
|
|
56
|
-
RETRAIN_TIMEOUT_SEC = 300
|
|
57
|
-
CONSOLIDATE_TIMEOUT_SEC = 600
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
# ---------------------------------------------------------------------------
|
|
61
|
-
# Child-side task implementations (run in the isolated subprocess).
|
|
62
|
-
# ---------------------------------------------------------------------------
|
|
63
|
-
|
|
64
|
-
def _retrain(learning_db: str, profile_id: str, *, include_synthetic: bool) -> bool:
|
|
65
|
-
"""Legacy ranker retrain in this (lightgbm-first) process. Returns trained."""
|
|
66
|
-
import lightgbm # noqa: F401 (import-order side effect is intentional)
|
|
67
|
-
|
|
68
|
-
from superlocalmemory.learning.ranker_retrain_legacy import (
|
|
69
|
-
_retrain_ranker_impl,
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
return bool(
|
|
73
|
-
_retrain_ranker_impl(
|
|
74
|
-
learning_db, profile_id, include_synthetic=include_synthetic,
|
|
75
|
-
)
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def _consolidate(
|
|
80
|
-
memory_db: str, learning_db: str, profile_id: str, *, dry_run: bool,
|
|
81
|
-
) -> dict:
|
|
82
|
-
"""Full consolidation cycle (incl. step-5 LightGBM training). Returns stats."""
|
|
83
|
-
import lightgbm # noqa: F401 (import-order side effect is intentional)
|
|
84
|
-
|
|
85
|
-
from superlocalmemory.learning.consolidation_worker import (
|
|
86
|
-
ConsolidationWorker,
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
worker = ConsolidationWorker(memory_db, learning_db)
|
|
90
|
-
return worker.run(profile_id, dry_run=dry_run)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def _emit(obj: dict) -> None:
|
|
94
|
-
"""Write the verdict as a single JSON line (default=str for safety)."""
|
|
95
|
-
sys.stdout.write(json.dumps(obj, default=str) + "\n")
|
|
96
|
-
sys.stdout.flush()
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def main(argv: list[str] | None = None) -> int:
|
|
100
|
-
parser = argparse.ArgumentParser(prog="slm-lightgbm-subprocess")
|
|
101
|
-
parser.add_argument("--task", choices=["retrain", "consolidate"], default="retrain")
|
|
102
|
-
parser.add_argument("--learning-db", required=True)
|
|
103
|
-
parser.add_argument("--memory-db")
|
|
104
|
-
parser.add_argument("--profile", default="default")
|
|
105
|
-
parser.add_argument("--include-synthetic", action="store_true")
|
|
106
|
-
parser.add_argument("--dry-run", action="store_true")
|
|
107
|
-
args = parser.parse_args(argv)
|
|
108
|
-
|
|
109
|
-
result: dict = {"error": None}
|
|
110
|
-
try:
|
|
111
|
-
if args.task == "retrain":
|
|
112
|
-
result["trained"] = _retrain(
|
|
113
|
-
args.learning_db, args.profile,
|
|
114
|
-
include_synthetic=args.include_synthetic,
|
|
115
|
-
)
|
|
116
|
-
else:
|
|
117
|
-
if not args.memory_db:
|
|
118
|
-
raise ValueError("--memory-db is required for the consolidate task")
|
|
119
|
-
result["stats"] = _consolidate(
|
|
120
|
-
args.memory_db, args.learning_db, args.profile,
|
|
121
|
-
dry_run=args.dry_run,
|
|
122
|
-
)
|
|
123
|
-
except Exception as exc: # noqa: BLE001
|
|
124
|
-
result["error"] = f"{type(exc).__name__}: {exc}"
|
|
125
|
-
_emit(result)
|
|
126
|
-
return 1
|
|
127
|
-
|
|
128
|
-
_emit(result)
|
|
129
|
-
return 0
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
# ---------------------------------------------------------------------------
|
|
133
|
-
# Caller-side helpers — spawn the child in an isolated process.
|
|
134
|
-
# ---------------------------------------------------------------------------
|
|
135
|
-
|
|
136
|
-
def _run_isolated(task_args: list[str], *, timeout_sec: int) -> dict:
|
|
137
|
-
"""Spawn the child with lightgbm imported first; return its JSON verdict.
|
|
138
|
-
|
|
139
|
-
Never raises for the expected failure modes (non-zero exit, timeout,
|
|
140
|
-
native crash with no JSON) — encodes them in an ``error`` key so the
|
|
141
|
-
calling daemon stays up no matter what.
|
|
142
|
-
"""
|
|
143
|
-
# The leading ``import lightgbm`` is load-bearing: it must run BEFORE the
|
|
144
|
-
# superlocalmemory package (which transitively imports torch). ``-c`` is
|
|
145
|
-
# the only way to guarantee that ordering — ``-m superlocalmemory.…`` runs
|
|
146
|
-
# the package __init__ (torch) first and would reintroduce the crash.
|
|
147
|
-
bootstrap = (
|
|
148
|
-
"import lightgbm; "
|
|
149
|
-
"from superlocalmemory.learning.lightgbm_subprocess import main; "
|
|
150
|
-
"raise SystemExit(main())"
|
|
151
|
-
)
|
|
152
|
-
cmd = [sys.executable, "-c", bootstrap, *task_args]
|
|
153
|
-
|
|
154
|
-
try:
|
|
155
|
-
proc = subprocess.run(
|
|
156
|
-
cmd,
|
|
157
|
-
capture_output=True,
|
|
158
|
-
text=True,
|
|
159
|
-
timeout=timeout_sec,
|
|
160
|
-
check=False,
|
|
161
|
-
)
|
|
162
|
-
except subprocess.TimeoutExpired:
|
|
163
|
-
return {"error": f"timed out after {timeout_sec}s"}
|
|
164
|
-
except Exception as exc: # noqa: BLE001
|
|
165
|
-
return {"error": f"spawn failed: {exc}"}
|
|
166
|
-
|
|
167
|
-
# The verdict is the last JSON line on stdout. Parse defensively — a native
|
|
168
|
-
# crash in the child would leave no JSON, which we surface plainly.
|
|
169
|
-
for line in reversed((proc.stdout or "").splitlines()):
|
|
170
|
-
line = line.strip()
|
|
171
|
-
if not line:
|
|
172
|
-
continue
|
|
173
|
-
try:
|
|
174
|
-
return json.loads(line)
|
|
175
|
-
except ValueError:
|
|
176
|
-
continue
|
|
177
|
-
|
|
178
|
-
tail = (proc.stderr or "").strip()[-500:]
|
|
179
|
-
return {
|
|
180
|
-
"error": (
|
|
181
|
-
f"subprocess produced no verdict (exit={proc.returncode}). "
|
|
182
|
-
f"stderr tail: {tail}"
|
|
183
|
-
),
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def run_retrain_isolated(
|
|
188
|
-
learning_db: str | Path,
|
|
189
|
-
profile_id: str,
|
|
190
|
-
*,
|
|
191
|
-
include_synthetic: bool = False,
|
|
192
|
-
timeout_sec: int = RETRAIN_TIMEOUT_SEC,
|
|
193
|
-
) -> dict:
|
|
194
|
-
"""Train the ranker in a subprocess. Returns ``{"trained": bool, "error": ...}``."""
|
|
195
|
-
args = [
|
|
196
|
-
"--task", "retrain",
|
|
197
|
-
"--learning-db", str(learning_db),
|
|
198
|
-
"--profile", profile_id,
|
|
199
|
-
]
|
|
200
|
-
if include_synthetic:
|
|
201
|
-
args.append("--include-synthetic")
|
|
202
|
-
verdict = _run_isolated(args, timeout_sec=timeout_sec)
|
|
203
|
-
verdict.setdefault("trained", False)
|
|
204
|
-
verdict.setdefault("error", None)
|
|
205
|
-
return verdict
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
def run_consolidation_isolated(
|
|
209
|
-
memory_db: str | Path,
|
|
210
|
-
learning_db: str | Path,
|
|
211
|
-
profile_id: str,
|
|
212
|
-
*,
|
|
213
|
-
dry_run: bool = False,
|
|
214
|
-
timeout_sec: int = CONSOLIDATE_TIMEOUT_SEC,
|
|
215
|
-
) -> dict:
|
|
216
|
-
"""Run the full consolidation cycle in a subprocess (its step-5 training
|
|
217
|
-
would otherwise crash the torch-warm daemon).
|
|
218
|
-
|
|
219
|
-
Returns ``{"stats": dict|None, "error": str|None}``.
|
|
220
|
-
"""
|
|
221
|
-
args = [
|
|
222
|
-
"--task", "consolidate",
|
|
223
|
-
"--memory-db", str(memory_db),
|
|
224
|
-
"--learning-db", str(learning_db),
|
|
225
|
-
"--profile", profile_id,
|
|
226
|
-
]
|
|
227
|
-
if dry_run:
|
|
228
|
-
args.append("--dry-run")
|
|
229
|
-
verdict = _run_isolated(args, timeout_sec=timeout_sec)
|
|
230
|
-
verdict.setdefault("stats", None)
|
|
231
|
-
verdict.setdefault("error", None)
|
|
232
|
-
return verdict
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if __name__ == "__main__":
|
|
236
|
-
raise SystemExit(main())
|