superlocalmemory 3.4.57__tar.gz → 3.5.0__tar.gz

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.
Files changed (471) hide show
  1. {superlocalmemory-3.4.57/src/superlocalmemory.egg-info → superlocalmemory-3.5.0}/PKG-INFO +4 -2
  2. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/pyproject.toml +5 -2
  3. superlocalmemory-3.5.0/src/superlocalmemory/__init__.py +65 -0
  4. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/commands.py +80 -33
  5. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/daemon.py +14 -1
  6. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/main.py +1 -1
  7. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/backend_orchestrator.py +19 -13
  8. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/config.py +137 -47
  9. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/graph_pruner.py +92 -2
  10. superlocalmemory-3.5.0/src/superlocalmemory/core/injection.py +351 -0
  11. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/recall_pipeline.py +29 -0
  12. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/store_pipeline.py +13 -0
  13. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/graph_builder.py +32 -8
  14. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/auto_recall_hook.py +50 -26
  15. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/before_web_hook.py +3 -2
  16. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/user_prompt_hook.py +5 -2
  17. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/ranker_retrain_legacy.py +9 -1
  18. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/ranker_retrain_online.py +11 -1
  19. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/_daemon_proxy.py +1 -1
  20. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_active.py +130 -9
  21. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_context.py +18 -4
  22. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/bm25_channel.py +50 -0
  23. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/engine.py +43 -9
  24. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/hopfield_channel.py +22 -9
  25. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/spreading_activation.py +27 -7
  26. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/temporal_channel.py +10 -1
  27. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/memories.py +43 -12
  28. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/v3_api.py +40 -25
  29. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/unified_daemon.py +110 -0
  30. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/database.py +47 -0
  31. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migration_runner.py +4 -0
  32. superlocalmemory-3.5.0/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +40 -0
  33. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/__init__.py +1 -0
  34. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/models.py +3 -0
  35. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0/src/superlocalmemory.egg-info}/PKG-INFO +4 -2
  36. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory.egg-info/SOURCES.txt +3 -0
  37. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory.egg-info/requires.txt +4 -1
  38. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_before_web_hook.py +1 -1
  39. superlocalmemory-3.5.0/tests/test_injection.py +424 -0
  40. superlocalmemory-3.4.57/src/superlocalmemory/__init__.py +0 -40
  41. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/AUTHORS.md +0 -0
  42. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/LICENSE +0 -0
  43. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/NOTICE +0 -0
  44. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/README.md +0 -0
  45. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/setup.cfg +0 -0
  46. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/attribution/__init__.py +0 -0
  47. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  48. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/attribution/signer.py +0 -0
  49. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/attribution/watermark.py +0 -0
  50. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/__init__.py +0 -0
  51. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/context_commands.py +0 -0
  52. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/db_migrate.py +0 -0
  53. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  54. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  55. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  56. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/json_output.py +0 -0
  57. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  58. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/pending_store.py +0 -0
  59. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/post_install.py +0 -0
  60. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/service_installer.py +0 -0
  61. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  62. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/version_banner.py +0 -0
  63. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  64. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/__init__.py +0 -0
  65. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  66. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  67. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  68. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  69. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  70. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  71. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  72. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/changes.py +0 -0
  73. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/communities.py +0 -0
  74. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/config.py +0 -0
  75. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/database.py +0 -0
  76. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  77. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  78. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  79. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/flows.py +0 -0
  80. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  81. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  82. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  83. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/incremental.py +0 -0
  84. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/models.py +0 -0
  85. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/parser.py +0 -0
  86. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/resolver.py +0 -0
  87. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/search.py +0 -0
  88. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/service.py +0 -0
  89. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/code_graph/watcher.py +0 -0
  90. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/__init__.py +0 -0
  91. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/abac.py +0 -0
  92. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/audit.py +0 -0
  93. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  94. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/gdpr.py +0 -0
  95. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  96. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/retention.py +0 -0
  97. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/compliance/scheduler.py +0 -0
  98. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/__init__.py +0 -0
  99. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/clock_monitor.py +0 -0
  100. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/consolidation_engine.py +0 -0
  101. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/context_cache.py +0 -0
  102. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/db_pool.py +0 -0
  103. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/embedding_worker.py +0 -0
  104. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/embeddings.py +0 -0
  105. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/engine.py +0 -0
  106. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  107. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/engine_lock.py +0 -0
  108. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/engine_wiring.py +0 -0
  109. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/error_catalog.py +0 -0
  110. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/error_envelope.py +0 -0
  111. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  112. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/file_lock.py +0 -0
  113. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  114. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/health_monitor.py +0 -0
  115. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/hooks.py +0 -0
  116. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  117. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/maintenance.py +0 -0
  118. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
  119. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/modes.py +0 -0
  120. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  121. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/platform_utils.py +0 -0
  122. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/priority_queue.py +0 -0
  123. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/profiles.py +0 -0
  124. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/pruning_engine.py +0 -0
  125. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/queue_consumer.py +0 -0
  126. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  127. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/ram_lock.py +0 -0
  128. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/rate_limit.py +0 -0
  129. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/recall_gate.py +0 -0
  130. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/recall_queue.py +0 -0
  131. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/recall_worker.py +0 -0
  132. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/registry.py +0 -0
  133. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/reranker_worker.py +0 -0
  134. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/safe_fs.py +0 -0
  135. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/security_primitives.py +0 -0
  136. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/shadow_router.py +0 -0
  137. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/slm_disabled.py +0 -0
  138. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/slmignore.py +0 -0
  139. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/summarizer.py +0 -0
  140. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/tier_manager.py +0 -0
  141. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/topic_signature.py +0 -0
  142. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/core/worker_pool.py +0 -0
  143. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/dynamics/__init__.py +0 -0
  144. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  145. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  146. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  147. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  148. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/__init__.py +0 -0
  149. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  150. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  151. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/consolidator.py +0 -0
  152. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/context_generator.py +0 -0
  153. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/emotional.py +0 -0
  154. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  155. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  156. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  157. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/foresight.py +0 -0
  158. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  159. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  160. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  161. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  162. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  163. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/encoding/type_router.py +0 -0
  164. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/__init__.py +0 -0
  165. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  166. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/budget.py +0 -0
  167. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  168. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  169. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  170. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  171. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/triggers.py +0 -0
  172. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/evolution/types.py +0 -0
  173. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/graph/__init__.py +0 -0
  174. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  175. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/__init__.py +0 -0
  176. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  177. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  178. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  179. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  180. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  181. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  182. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  183. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  184. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/context_payload.py +0 -0
  185. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  186. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  187. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  188. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  189. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  190. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  191. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  192. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  193. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  194. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  195. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/session_registry.py +0 -0
  196. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  197. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  198. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  199. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  200. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/__init__.py +0 -0
  201. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  202. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/backup.py +0 -0
  203. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/cache_manager.py +0 -0
  204. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  205. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/event_bus.py +0 -0
  206. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  207. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/pid_manager.py +0 -0
  208. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/process_reaper.py +0 -0
  209. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  210. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  211. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/__init__.py +0 -0
  212. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  213. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  214. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  215. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/credentials.py +0 -0
  216. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  217. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/parsers.py +0 -0
  218. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  219. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/__init__.py +0 -0
  220. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/adaptive.py +0 -0
  221. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  222. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  223. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/bandit.py +0 -0
  224. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  225. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/behavioral.py +0 -0
  226. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  227. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/bootstrap.py +0 -0
  228. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  229. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  230. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  231. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/cross_project.py +0 -0
  232. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/database.py +0 -0
  233. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  234. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/engagement.py +0 -0
  235. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/ensemble.py +0 -0
  236. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  237. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  238. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/features.py +0 -0
  239. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/feedback.py +0 -0
  240. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  241. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  242. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/labeler.py +0 -0
  243. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  244. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/memory_merge.py +0 -0
  245. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/model_cache.py +0 -0
  246. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/model_rollback.py +0 -0
  247. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  248. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/outcomes.py +0 -0
  249. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  250. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  251. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/project_context.py +0 -0
  252. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  253. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/ranker.py +0 -0
  254. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/ranker_common.py +0 -0
  255. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/reward.py +0 -0
  256. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/reward_archive.py +0 -0
  257. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/reward_boost.py +0 -0
  258. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  259. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/shadow_test.py +0 -0
  260. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/signal_worker.py +0 -0
  261. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/signals.py +0 -0
  262. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  263. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/source_quality.py +0 -0
  264. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/trigram_index.py +0 -0
  265. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/learning/workflows.py +0 -0
  266. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/llm/__init__.py +0 -0
  267. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/llm/backbone.py +0 -0
  268. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/__init__.py +0 -0
  269. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  270. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/fisher.py +0 -0
  271. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  272. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/hopfield.py +0 -0
  273. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/langevin.py +0 -0
  274. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/polar_quant.py +0 -0
  275. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/qjl.py +0 -0
  276. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/sheaf.py +0 -0
  277. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/math/turbo_quant.py +0 -0
  278. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/__init__.py +0 -0
  279. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  280. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/resources.py +0 -0
  281. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/server.py +0 -0
  282. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/shared.py +0 -0
  283. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools.py +0 -0
  284. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  285. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_core.py +0 -0
  286. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  287. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  288. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  289. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  290. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  291. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  292. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mesh/__init__.py +0 -0
  293. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mesh/broker.py +0 -0
  294. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  295. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/migrations/__init__.py +0 -0
  296. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  297. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/__init__.py +0 -0
  298. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  299. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  300. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  301. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  302. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  303. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/__init__.py +0 -0
  304. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/agentic.py +0 -0
  305. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  306. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  307. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  308. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  309. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  310. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/fusion.py +0 -0
  311. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  312. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  313. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/reranker.py +0 -0
  314. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  315. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/strategy.py +0 -0
  316. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  317. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/__init__.py +0 -0
  318. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/api.py +0 -0
  319. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/bandit_loops.py +0 -0
  320. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  321. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  322. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/__init__.py +0 -0
  323. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/adapters.py +0 -0
  324. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/agents.py +0 -0
  325. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/backup.py +0 -0
  326. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  327. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/brain.py +0 -0
  328. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/chat.py +0 -0
  329. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/compliance.py +0 -0
  330. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/data_io.py +0 -0
  331. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/entity.py +0 -0
  332. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/events.py +0 -0
  333. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/evolution.py +0 -0
  334. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/helpers.py +0 -0
  335. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/ingest.py +0 -0
  336. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/insights.py +0 -0
  337. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/learning.py +0 -0
  338. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  339. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/mesh.py +0 -0
  340. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  341. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/profiles.py +0 -0
  342. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/stats.py +0 -0
  343. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/tiers.py +0 -0
  344. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/timeline.py +0 -0
  345. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/token.py +0 -0
  346. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/routes/ws.py +0 -0
  347. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/security_middleware.py +0 -0
  348. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/server/ui.py +0 -0
  349. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  350. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  351. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  352. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  353. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  354. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  355. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  356. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/__init__.py +0 -0
  357. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/access_control.py +0 -0
  358. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/access_log.py +0 -0
  359. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  360. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migration_v33.py +0 -0
  361. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  362. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  363. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  364. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  365. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  366. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  367. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  368. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  369. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  370. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  371. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  372. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  373. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  374. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/migrations.py +0 -0
  375. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/quantized_store.py +0 -0
  376. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema.py +0 -0
  377. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  378. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v32.py +0 -0
  379. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  380. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  381. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v343.py +0 -0
  382. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v345.py +0 -0
  383. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/schema_v347.py +0 -0
  384. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  385. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/trust/__init__.py +0 -0
  386. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/trust/gate.py +0 -0
  387. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/trust/provenance.py +0 -0
  388. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/trust/scorer.py +0 -0
  389. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/trust/signals.py +0 -0
  390. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/css/brain.css +0 -0
  391. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  392. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  393. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/index.html +0 -0
  394. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/agents.js +0 -0
  395. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  396. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/brain.js +0 -0
  397. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/clusters.js +0 -0
  398. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/compliance.js +0 -0
  399. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/core.js +0 -0
  400. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  401. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/events.js +0 -0
  402. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  403. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/feedback.js +0 -0
  404. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  405. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  406. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  407. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  408. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/init.js +0 -0
  409. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  410. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  411. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/math-health.js +0 -0
  412. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/memories.js +0 -0
  413. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  414. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  415. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/modal.js +0 -0
  416. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  417. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  418. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  419. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  420. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  421. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  422. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/profiles.js +0 -0
  423. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  424. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  425. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/search.js +0 -0
  426. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/settings.js +0 -0
  427. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/timeline.js +0 -0
  428. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  429. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  430. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  431. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  432. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  433. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  434. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  435. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  436. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  437. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  438. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  439. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  440. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  441. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/vector/__init__.py +0 -0
  442. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  443. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  444. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  445. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  446. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_auto_hooks.py +0 -0
  447. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_behavioral_full.py +0 -0
  448. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_claude_hooks.py +0 -0
  449. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_cli.py +0 -0
  450. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_cli_json.py +0 -0
  451. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_cli_v33.py +0 -0
  452. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_compliance_full.py +0 -0
  453. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_config_system.py +0 -0
  454. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_engine_hooks.py +0 -0
  455. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_event_bus.py +0 -0
  456. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_features.py +0 -0
  457. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_final_locomo_mini.py +0 -0
  458. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_hook_handlers.py +0 -0
  459. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_ide_connector.py +0 -0
  460. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_infra.py +0 -0
  461. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_learning_advanced.py +0 -0
  462. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_learning_collectors.py +0 -0
  463. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_llm_provider.py +0 -0
  464. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_mcp_server.py +0 -0
  465. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_migration.py +0 -0
  466. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_mode_switch_preservation.py +0 -0
  467. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_post_install.py +0 -0
  468. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_ranker.py +0 -0
  469. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_topic_shift_hook.py +0 -0
  470. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_trust_full.py +0 -0
  471. {superlocalmemory-3.4.57 → superlocalmemory-3.5.0}/tests/test_v3_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.4.57
3
+ Version: 3.5.0
4
4
  Summary: Information-geometric agent memory with mathematical guarantees
5
5
  Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
6
6
  License: AGPL-3.0-or-later
@@ -69,6 +69,8 @@ Provides-Extra: ui
69
69
  Requires-Dist: fastapi[all]>=0.135.1; extra == "ui"
70
70
  Requires-Dist: uvicorn>=0.42.0; extra == "ui"
71
71
  Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "ui"
72
+ Provides-Extra: injection
73
+ Requires-Dist: tiktoken>=0.8.0; extra == "injection"
72
74
  Provides-Extra: learning
73
75
  Requires-Dist: lightgbm>=4.0.0; extra == "learning"
74
76
  Provides-Extra: performance
@@ -79,7 +81,7 @@ Requires-Dist: google-auth-oauthlib>=1.2.0; extra == "ingestion"
79
81
  Requires-Dist: google-api-python-client>=2.100.0; extra == "ingestion"
80
82
  Requires-Dist: icalendar>=6.0.0; extra == "ingestion"
81
83
  Provides-Extra: full
82
- Requires-Dist: superlocalmemory[ingestion,learning,performance,search,ui]; extra == "full"
84
+ Requires-Dist: superlocalmemory[ingestion,injection,learning,performance,search,ui]; extra == "full"
83
85
  Provides-Extra: dev
84
86
  Requires-Dist: pytest>=8.0; extra == "dev"
85
87
  Requires-Dist: pytest-cov>=4.1; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.4.57"
3
+ version = "3.5.0"
4
4
  description = "Information-geometric agent memory with mathematical guarantees"
5
5
  readme = "README.md"
6
6
  license = {text = "AGPL-3.0-or-later"}
@@ -89,6 +89,9 @@ ui = [
89
89
  "uvicorn>=0.42.0",
90
90
  "python-multipart>=0.0.6,<1.0.0",
91
91
  ]
92
+ injection = [
93
+ "tiktoken>=0.8.0",
94
+ ]
92
95
  learning = [
93
96
  "lightgbm>=4.0.0",
94
97
  ]
@@ -102,7 +105,7 @@ ingestion = [
102
105
  "icalendar>=6.0.0",
103
106
  ]
104
107
  full = [
105
- "superlocalmemory[search,ui,learning,performance,ingestion]",
108
+ "superlocalmemory[search,ui,learning,performance,ingestion,injection]",
106
109
  ]
107
110
  dev = [
108
111
  "pytest>=8.0",
@@ -0,0 +1,65 @@
1
+ """SuperLocalMemory — information-geometric agent memory."""
2
+
3
+ import os
4
+
5
+ # --- OpenMP multi-library guard (permanent fix, v3.4.58) -------------------
6
+ # SLM ships with torch, scikit-learn, and lightgbm — each bundles its own
7
+ # libomp.dylib on macOS ARM (Apple Silicon). When all three are loaded in the
8
+ # same process, the Intel OpenMP runtime detects duplicate libraries and either
9
+ # (a) emits OMP: Error #15 and aborts, or (b) crashes with SIGSEGV in
10
+ # __kmp_suspend_initialize_thread (address 0x580 — null thread-struct deref)
11
+ # when LightGBM's parallel fork tries to coordinate with PyTorch's thread pool.
12
+ #
13
+ # KMP_DUPLICATE_LIB_OK=TRUE tells the runtime to elect one master instance
14
+ # and continue rather than abort. This is the upstream-recommended workaround
15
+ # for mixed-dependency environments (PyTorch docs, scikit-learn FAQ, LightGBM
16
+ # issue #3877). Use unconditional assignment — not setdefault — so user env
17
+ # cannot accidentally disable this safety net by setting it to FALSE.
18
+ #
19
+ # OMP_NUM_THREADS=2 caps the maximum thread count before any C library reads
20
+ # it. With ≤2 threads the problematic parallel fork path in LightGBM's
21
+ # DatasetLoader::ConstructFromSampleData is avoided on all observed crash
22
+ # configurations. SLM datasets are small (50–5 000 rows); 2 threads gives
23
+ # ~90% of the performance of max-core training at zero crash risk.
24
+ # Users who need more threads can set SLM_LGBM_THREADS=N to override
25
+ # the per-call cap in ranker_retrain_online.py.
26
+ os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
27
+ if "OMP_NUM_THREADS" not in os.environ:
28
+ os.environ["OMP_NUM_THREADS"] = "2"
29
+ # ---------------------------------------------------------------------------
30
+
31
+ __version__ = "3.4.64"
32
+
33
+ _REQUIRED_VERSIONS = {
34
+ "sentence_transformers": "5.3.0",
35
+ "onnxruntime": "1.24.4",
36
+ }
37
+
38
+
39
+ def _check_critical_deps() -> None:
40
+ """Warn if embedding-critical packages have wrong versions."""
41
+ import warnings
42
+ for mod_name, expected in _REQUIRED_VERSIONS.items():
43
+ try:
44
+ mod = __import__(mod_name)
45
+ actual = getattr(mod, "__version__", None)
46
+ if actual and actual != expected:
47
+ warnings.warn(
48
+ f"SuperLocalMemory requires {mod_name}=={expected} but "
49
+ f"{actual} is installed. This causes memory blow-up on "
50
+ f"Apple Silicon. Fix: pip install {mod_name}=={expected}",
51
+ stacklevel=2,
52
+ )
53
+ except ImportError:
54
+ pass
55
+
56
+
57
+ # Only run the dep check when a full (non-LIGHT) engine is in use.
58
+ # The MCP server runs in LIGHT mode — importing onnxruntime here
59
+ # breaks the LIGHT engine contract (ONNX_LOADED must stay False).
60
+ # Skip when SLM_SKIP_DEP_CHECK=1 or SLM_DISABLE_WARMUP_SIDE_EFFECTS=1.
61
+ if not (
62
+ os.environ.get("SLM_SKIP_DEP_CHECK") == "1"
63
+ or os.environ.get("SLM_DISABLE_WARMUP_SIDE_EFFECTS") == "1"
64
+ ):
65
+ _check_critical_deps()
@@ -2067,14 +2067,18 @@ def cmd_session_context(args: Namespace) -> None:
2067
2067
  This ensures the SessionStart hook completes within its 15s timeout even
2068
2068
  when Ollama requires a 60s+ cold start. The fast path returns:
2069
2069
  - Core Memory blocks (always-on context)
2070
- - Recent high-importance memories (last 7 days)
2070
+ - Recent high-importance memories (last N days)
2071
2071
  - Session summary from last session
2072
2072
  Falls back to the full engine path only if --full is passed explicitly.
2073
+
2074
+ v3.4.65: uses shared injection formatter (render_context) for identical
2075
+ output across MCP and CLI surfaces. --json flag returns structured JSON.
2073
2076
  """
2074
2077
  import sqlite3
2075
2078
  from pathlib import Path
2076
2079
  from superlocalmemory.core.config import SLMConfig
2077
2080
 
2081
+ use_json = getattr(args, "json", False)
2078
2082
  use_full = getattr(args, "full", False)
2079
2083
 
2080
2084
  if use_full:
@@ -2093,13 +2097,21 @@ def cmd_session_context(args: Namespace) -> None:
2093
2097
  query=getattr(args, "query", "") or "recent decisions and important context",
2094
2098
  )
2095
2099
  if context:
2096
- print(context)
2100
+ if use_json:
2101
+ from superlocalmemory.cli.json_output import json_print
2102
+ json_print("session-context", data={"context": context}, next_actions=[
2103
+ {"command": "slm recall --json <query>", "description": "Search memories"},
2104
+ ])
2105
+ else:
2106
+ print(context)
2097
2107
  except Exception as exc:
2098
2108
  logger.debug("session-context (full) failed: %s", exc)
2099
2109
  return
2100
2110
 
2101
2111
  # ── FAST PATH: direct SQLite, no engine, <500ms ──────────────
2102
2112
  try:
2113
+ from superlocalmemory.core.injection import InjectableMemory, render_context
2114
+
2103
2115
  config = SLMConfig.load()
2104
2116
  db_path = config.base_dir / "memory.db"
2105
2117
  if not db_path.exists():
@@ -2108,78 +2120,113 @@ def cmd_session_context(args: Namespace) -> None:
2108
2120
  pid = config.active_profile
2109
2121
  conn = sqlite3.connect(str(db_path))
2110
2122
  conn.row_factory = sqlite3.Row
2111
- sections = []
2112
2123
 
2113
- # 1. Core Memory blocks (compiled high-value context)
2124
+ # Collect facts for injection same queries as pre-v3.4.65 but
2125
+ # mapped into InjectableMemory for the shared formatter.
2126
+ inj_mems: list[InjectableMemory] = []
2127
+
2128
+ # Core Memory blocks (compiled high-value context)
2114
2129
  try:
2115
- rows = conn.execute(
2130
+ cm_rows = conn.execute(
2116
2131
  "SELECT block_type, content FROM core_memory_blocks "
2117
2132
  "WHERE profile_id = ? ORDER BY block_type",
2118
2133
  (pid,),
2119
2134
  ).fetchall()
2120
- if rows:
2121
- blocks = [f"[{r['block_type']}] {r['content']}" for r in rows]
2122
- sections.append("## Core Memory\n" + "\n".join(blocks))
2135
+ for r in cm_rows:
2136
+ content = f"[{r['block_type']}] {r['content']}"
2137
+ inj_mems.append(InjectableMemory(
2138
+ content=content, score=1.0, fact_id="",
2139
+ importance=1.0, access_count=10,
2140
+ pinned=True,
2141
+ ))
2123
2142
  except sqlite3.OperationalError:
2124
2143
  pass
2125
2144
 
2126
- # 2. Recent important memories — age gate from --max-age-days (default 30)
2145
+ # Recent important memories — age gate from --max-age-days (default 30)
2127
2146
  max_age = getattr(args, "max_age_days", 30)
2128
2147
  age_clause = (
2129
2148
  f"AND created_at >= datetime('now', '-{int(max_age)} days') "
2130
2149
  if max_age > 0 else ""
2131
2150
  )
2132
2151
  try:
2133
- rows = conn.execute(
2134
- "SELECT content, fact_type, created_at FROM atomic_facts "
2152
+ fact_rows = conn.execute(
2153
+ "SELECT fact_id, content, importance, access_count, fact_type FROM atomic_facts "
2135
2154
  "WHERE profile_id = ? "
2136
2155
  f"{age_clause}"
2137
2156
  "AND lifecycle = 'active' "
2138
2157
  "ORDER BY importance DESC, created_at DESC LIMIT 10",
2139
2158
  (pid,),
2140
2159
  ).fetchall()
2141
- if rows:
2142
- items = []
2143
- for r in rows:
2144
- content = r["content"][:200]
2145
- items.append(f"- [{r['fact_type'] or 'fact'}] {content}")
2146
- sections.append("## Recent Context (7 days)\n" + "\n".join(items))
2160
+ for r in fact_rows:
2161
+ inj_mems.append(InjectableMemory(
2162
+ content=r["content"],
2163
+ score=r["importance"] or 0.5,
2164
+ fact_id=r["fact_id"],
2165
+ importance=r["importance"] or 0.0,
2166
+ access_count=r["access_count"] or 0,
2167
+ ))
2147
2168
  except sqlite3.OperationalError:
2148
2169
  pass
2149
2170
 
2150
- # 3. Session markers (last session summary)
2171
+ # Session markers (last session summary)
2151
2172
  try:
2152
- rows = conn.execute(
2153
- "SELECT content, created_at FROM atomic_facts "
2173
+ sess_rows = conn.execute(
2174
+ "SELECT fact_id, content, importance, access_count FROM atomic_facts "
2154
2175
  "WHERE profile_id = ? AND content LIKE 'Session%' "
2155
2176
  "ORDER BY created_at DESC LIMIT 3",
2156
2177
  (pid,),
2157
2178
  ).fetchall()
2158
- if rows:
2159
- items = [f"- {r['content'][:150]}" for r in rows]
2160
- sections.append("## Recent Sessions\n" + "\n".join(items))
2179
+ for r in sess_rows:
2180
+ inj_mems.append(InjectableMemory(
2181
+ content=r["content"],
2182
+ score=r["importance"] or 0.3,
2183
+ fact_id=r["fact_id"],
2184
+ importance=r["importance"] or 0.0,
2185
+ access_count=r["access_count"] or 0,
2186
+ ))
2161
2187
  except sqlite3.OperationalError:
2162
2188
  pass
2163
2189
 
2164
- # 4. V3.3 Soft prompts (auto-learned patterns)
2190
+ conn.close()
2191
+
2192
+ if not inj_mems:
2193
+ return
2194
+
2195
+ # V3.3 Soft prompts (auto-learned patterns) — append as high-importance
2165
2196
  try:
2166
- rows = conn.execute(
2197
+ conn2 = sqlite3.connect(str(db_path))
2198
+ conn2.row_factory = sqlite3.Row
2199
+ sp_rows = conn2.execute(
2167
2200
  "SELECT category, content FROM soft_prompt_templates "
2168
2201
  "WHERE profile_id = ? AND active = 1 "
2169
2202
  "ORDER BY confidence DESC LIMIT 5",
2170
2203
  (pid,),
2171
2204
  ).fetchall()
2172
- if rows:
2173
- items = [f"- [{r['category']}] {r['content'][:150]}" for r in rows]
2174
- sections.append("## Learned Patterns\n" + "\n".join(items))
2175
- except sqlite3.OperationalError:
2205
+ conn2.close()
2206
+ for r in sp_rows:
2207
+ inj_mems.append(InjectableMemory(
2208
+ content=f"[{r['category']}] {r['content']}",
2209
+ score=0.7, fact_id="",
2210
+ importance=0.7, access_count=5,
2211
+ ))
2212
+ except Exception:
2176
2213
  pass
2177
2214
 
2178
- conn.close()
2215
+ cfg_inj = getattr(config, "injection", None)
2216
+ context = render_context(inj_mems, mode=config.mode.value.upper(), cfg=cfg_inj, wrap=True)
2217
+ if context:
2218
+ if use_json:
2219
+ from superlocalmemory.cli.json_output import json_print
2220
+ json_print("session-context", data={
2221
+ "context": context,
2222
+ "memory_count": len(inj_mems),
2223
+ "mode": config.mode.value.upper(),
2224
+ }, next_actions=[
2225
+ {"command": "slm recall --json <query>", "description": "Search memories"},
2226
+ ])
2227
+ else:
2228
+ print(context)
2179
2229
 
2180
- if sections:
2181
- header = f"# SLM Session Context — {config.active_profile}"
2182
- print(header + "\n\n" + "\n\n".join(sections))
2183
2230
  except Exception as exc:
2184
2231
  logger.debug("session-context (fast) failed: %s", exc)
2185
2232
 
@@ -171,6 +171,17 @@ def _start_daemon_subprocess() -> bool:
171
171
  else:
172
172
  kwargs["start_new_session"] = True
173
173
 
174
+ # v3.4.60: Force OMP_NUM_THREADS=1 in daemon env BEFORE Python imports
175
+ # numpy/torch/lightgbm. Setting it in __init__.py is too late on M5 Pro —
176
+ # by the time superlocalmemory.__init__ runs, libomp has already been
177
+ # initialized by an earlier import, causing the SIGSEGV at
178
+ # __kmp_suspend_initialize_thread when lightgbm forks its worker pool.
179
+ # Forcing serial OpenMP eliminates the parallel barrier race entirely.
180
+ daemon_env = os.environ.copy()
181
+ daemon_env["OMP_NUM_THREADS"] = "1"
182
+ daemon_env["KMP_DUPLICATE_LIB_OK"] = "TRUE"
183
+ kwargs["env"] = daemon_env
184
+
174
185
  with open(log_file, "a") as lf:
175
186
  proc = subprocess.Popen(cmd, stdout=lf, stderr=lf, **kwargs)
176
187
 
@@ -523,8 +534,10 @@ class DaemonHandler(BaseHTTPRequestHandler):
523
534
  session_id = f"http:{int(_t.time() * 1000)}"
524
535
 
525
536
  engine = _get_engine()
537
+ raw_fast = params.get("fast", ["false"])[0]
538
+ fast = raw_fast.lower() in ("true", "1")
526
539
  response = engine.recall(
527
- query, limit=limit, session_id=session_id,
540
+ query, limit=limit, session_id=session_id, fast=fast,
528
541
  )
529
542
  # Return the same field shape as recall_worker._handle_recall,
530
543
  # so MCP processes that proxy through the daemon get recall_trace-
@@ -136,7 +136,7 @@ def main() -> None:
136
136
 
137
137
  mode_p = sub.add_parser("mode", help="Get or set operating mode (a/b/c)")
138
138
  mode_p.add_argument(
139
- "value", nargs="?", choices=["a", "b", "c"], help="Mode to set",
139
+ "value", nargs="?", choices=["a", "b", "c", "A", "B", "C"], help="Mode to set",
140
140
  )
141
141
  mode_p.add_argument("--json", action="store_true", help="Output structured JSON (agent-native)")
142
142
 
@@ -62,7 +62,7 @@ class BackendOrchestrator:
62
62
  def __init__(self, config: SLMConfig, db: DatabaseManager) -> None:
63
63
  self._config = config
64
64
  self._db = db
65
- self._data_dir = Path(config.data_dir)
65
+ self._data_dir = Path(getattr(config, "data_dir", None) or config.base_dir)
66
66
  self._cozo: Any = None
67
67
  self._lancedb: Any = None
68
68
  self._tiers: Any = None
@@ -236,22 +236,28 @@ class BackendOrchestrator:
236
236
  # ------------------------------------------------------------------
237
237
 
238
238
  def _detect_cozo(self) -> bool:
239
- if self._config.get("graph_backend") == "sqlite":
240
- return False
241
- try:
242
- import pycozo # noqa: F401
243
- return True
244
- except ImportError:
239
+ gb = getattr(self._config, "graph_backend", "auto") or "auto"
240
+ if gb == "sqlite":
245
241
  return False
242
+ if gb in ("auto", "cozo"):
243
+ try:
244
+ import pycozo # noqa: F401
245
+ return True
246
+ except ImportError:
247
+ return False
248
+ return False
246
249
 
247
250
  def _detect_lancedb(self) -> bool:
248
- if self._config.get("vector_backend") == "sqlite-vec":
249
- return False
250
- try:
251
- import lancedb # noqa: F401
252
- return True
253
- except ImportError:
251
+ vb = getattr(self._config, "vector_backend", "auto") or "auto"
252
+ if vb == "sqlite-vec":
254
253
  return False
254
+ if vb in ("auto", "lancedb"):
255
+ try:
256
+ import lancedb # noqa: F401
257
+ return True
258
+ except ImportError:
259
+ return False
260
+ return False
255
261
 
256
262
  # ------------------------------------------------------------------
257
263
  # Internal: Init
@@ -233,6 +233,50 @@ class MathConfig:
233
233
  # Rate-Distortion (production only, disabled for benchmarks)
234
234
 
235
235
 
236
+ # ---------------------------------------------------------------------------
237
+ # Context Injection (v3.4.65)
238
+ # ---------------------------------------------------------------------------
239
+
240
+ @dataclass(frozen=True)
241
+ class InjectionConfig:
242
+ """Context-injection budgets & framing (v3.4.65).
243
+
244
+ Single source of truth for what reaches the agent at session_init,
245
+ prestage_context, and the recall hooks. Replaces scattered char caps.
246
+
247
+ Budgets are in *estimated tokens* (chars/4 heuristic; see
248
+ core/injection.estimate_tokens). Mode-aware: A=fast/cheap, C=rich.
249
+ """
250
+ enabled: bool = True
251
+
252
+ # Mode-aware TOTAL budget (core block + recall), in estimated tokens.
253
+ total_budget_tokens_a: int = 2000
254
+ total_budget_tokens_b: int = 4000
255
+ total_budget_tokens_c: int = 8000
256
+
257
+ # Per-memory ceiling (estimated tokens). Whole-memory inclusion until
258
+ # the total budget is hit; this only clamps a single oversized memory.
259
+ per_memory_max_tokens: int = 600
260
+
261
+ # Core Memory Block (Letta pattern).
262
+ core_block_enabled: bool = True
263
+ core_block_max_facts: int = 5
264
+ core_block_max_tokens: int = 1000
265
+ core_block_importance_min: float = 0.8
266
+ core_block_min_access_count: int = 2
267
+
268
+ # Lost-in-the-middle: place strongest at top & bottom edges.
269
+ edge_ordering: bool = True
270
+
271
+ # Trust framing. False (shipped) = cautious "reference only" wrapper.
272
+ # True (Varun personal) = clean "memory context" framing.
273
+ # redact_secrets ALWAYS runs regardless.
274
+ trust_first_party: bool = False
275
+
276
+ # prestage_context response byte cap (was hardcoded 16 KB).
277
+ prestage_max_response_bytes: int = 64 * 1024
278
+
279
+
236
280
  # ---------------------------------------------------------------------------
237
281
  # Master Config
238
282
  # ---------------------------------------------------------------------------
@@ -613,6 +657,10 @@ class SLMConfig:
613
657
  parameterization: ParameterizationConfig = field(
614
658
  default_factory=ParameterizationConfig,
615
659
  )
660
+ injection: InjectionConfig = field(default_factory=InjectionConfig)
661
+ # v3.5.0: scaling backends — "sqlite" / "cozo" / "auto" / "lancedb" / "sqlite-vec" / "auto".
662
+ graph_backend: str = "auto" # "auto" = cozo if pycozo installed, else sqlite
663
+ vector_backend: str = "auto" # "auto" = lancedb if installed, else sqlite-vec
616
664
  evolution: EvolutionConfig = field(default_factory=EvolutionConfig)
617
665
 
618
666
  # v3.4.3: Daemon configuration
@@ -701,6 +749,24 @@ class SLMConfig:
701
749
  if k in EvolutionConfig.__dataclass_fields__
702
750
  })
703
751
 
752
+ # V3.4.65: Injection config (additive — defaults if missing from JSON)
753
+ inj = data.get("injection", {}) or {}
754
+ config.injection = InjectionConfig(
755
+ enabled=bool(inj.get("enabled", True)),
756
+ total_budget_tokens_a=int(inj.get("total_budget_tokens_a", 2000)),
757
+ total_budget_tokens_b=int(inj.get("total_budget_tokens_b", 4000)),
758
+ total_budget_tokens_c=int(inj.get("total_budget_tokens_c", 8000)),
759
+ per_memory_max_tokens=int(inj.get("per_memory_max_tokens", 600)),
760
+ core_block_enabled=bool(inj.get("core_block_enabled", True)),
761
+ core_block_max_facts=int(inj.get("core_block_max_facts", 5)),
762
+ core_block_max_tokens=int(inj.get("core_block_max_tokens", 1000)),
763
+ core_block_importance_min=float(inj.get("core_block_importance_min", 0.8)),
764
+ core_block_min_access_count=int(inj.get("core_block_min_access_count", 2)),
765
+ edge_ordering=bool(inj.get("edge_ordering", True)),
766
+ trust_first_party=bool(inj.get("trust_first_party", False)),
767
+ prestage_max_response_bytes=int(inj.get("prestage_max_response_bytes", 64 * 1024)),
768
+ )
769
+
704
770
  return config
705
771
 
706
772
  def save(
@@ -775,6 +841,23 @@ class SLMConfig:
775
841
  "max_evolutions_per_cycle": self.evolution.max_evolutions_per_cycle,
776
842
  }
777
843
 
844
+ # V3.4.65: Persist injection config
845
+ data["injection"] = {
846
+ "enabled": self.injection.enabled,
847
+ "total_budget_tokens_a": self.injection.total_budget_tokens_a,
848
+ "total_budget_tokens_b": self.injection.total_budget_tokens_b,
849
+ "total_budget_tokens_c": self.injection.total_budget_tokens_c,
850
+ "per_memory_max_tokens": self.injection.per_memory_max_tokens,
851
+ "core_block_enabled": self.injection.core_block_enabled,
852
+ "core_block_max_facts": self.injection.core_block_max_facts,
853
+ "core_block_max_tokens": self.injection.core_block_max_tokens,
854
+ "core_block_importance_min": self.injection.core_block_importance_min,
855
+ "core_block_min_access_count": self.injection.core_block_min_access_count,
856
+ "edge_ordering": self.injection.edge_ordering,
857
+ "trust_first_party": self.injection.trust_first_party,
858
+ "prestage_max_response_bytes": self.injection.prestage_max_response_bytes,
859
+ }
860
+
778
861
  # Preserve existing V3.3 config sections that aren't in for_mode()
779
862
  for key in ("forgetting", "quantization", "sagq", "embedding_signature", "auto_invoke"):
780
863
  if key in existing:
@@ -1000,80 +1083,87 @@ class SLMConfig:
1000
1083
  new_mode: str,
1001
1084
  base_dir: Path | None = None,
1002
1085
  ) -> "SLMConfig":
1003
- """Switch to a different mode, preserving the old mode's config.
1004
-
1005
- v3.4.54: Saves the current config as ``mode_{old}.json``, then
1006
- loads ``mode_{new}.json`` (or creates it from defaults if it
1007
- doesn't exist). Writes ``current_mode`` and persists the new
1008
- active config as ``config.json`` for backward compatibility
1009
- with tooling that reads it directly.
1086
+ """Switch to a different mode, preserving ALL non-mode settings.
1087
+
1088
+ v3.4.58 fix: Only ``config.mode`` changes. The previous implementation
1089
+ called ``for_mode()`` (which resets embedding/LLM/retrieval to mode
1090
+ defaults) whenever the target mode's per-mode file didn't exist.
1091
+ This silently clobbered custom embeddings, endpoints, and LLM config.
1092
+
1093
+ Correct behavior:
1094
+ - Load the current (old) config from config.json.
1095
+ - Save it to mode_{old}.json for the 3-mode system.
1096
+ - If mode_{new}.json exists, load it (user had a prior config for that mode).
1097
+ - If mode_{new}.json does NOT exist: start from the OLD config, change
1098
+ only the mode field. This preserves embedding, retrieval, forgetting, etc.
1099
+ - Exception: if user has NO LLM provider AND is switching to B/C, populate
1100
+ sensible LLM defaults so the daemon doesn't start dead.
1101
+ - Write the result to config.json (backward compat) and current_mode.
1010
1102
 
1011
1103
  Returns the new active config.
1012
1104
  """
1105
+ import copy
1106
+ import dataclasses
1107
+
1013
1108
  from superlocalmemory.storage.models import Mode as _M
1014
1109
  _base = base_dir or DEFAULT_BASE_DIR
1015
1110
  _base.mkdir(parents=True, exist_ok=True)
1016
1111
 
1017
1112
  old_config = cls.load(_base / "config.json")
1018
1113
  old_mode = old_config.mode.value.lower()
1019
-
1020
1114
  new_mode_val = _M(new_mode.lower())
1021
1115
 
1022
- # 1. Save current config to its per-mode file (unless already
1023
- # matched — prevents overwriting user customizations)
1116
+ # 1. Save current config to its per-mode file (preserve customizations)
1024
1117
  if old_mode != new_mode.lower():
1025
1118
  old_path = cls._mode_config_path(_base, old_config.mode)
1026
1119
  old_config.save(old_path)
1027
1120
 
1028
- # 2. Try to load the target mode's saved config.
1121
+ # 2. Determine new config:
1122
+ # a) mode_{new}.json exists → user had prior config for this mode, use it
1123
+ # b) otherwise → copy old config, change only mode
1029
1124
  new_path = cls._mode_config_path(_base, new_mode_val)
1030
- need_migration = False
1031
1125
  if new_path.exists():
1032
1126
  try:
1033
1127
  new_config = cls.load(new_path)
1034
- # Ensure the loaded config actually has the right mode
1035
1128
  if new_config.mode != new_mode_val:
1036
- new_config = cls.for_mode(new_mode_val, base_dir=_base)
1129
+ # Corrupt/mismatched mode file — rebuild preserving old values
1130
+ new_config = copy.copy(old_config)
1131
+ new_config.mode = new_mode_val
1037
1132
  except Exception:
1038
- new_config = cls.for_mode(new_mode_val, base_dir=_base)
1133
+ new_config = copy.copy(old_config)
1134
+ new_config.mode = new_mode_val
1039
1135
  else:
1040
- # First time switching to this mode: try migrating from
1041
- # legacy config.json if it was already in this mode
1042
- legacy = _base / "config.json"
1043
- if legacy.exists():
1044
- try:
1045
- import json
1046
- _data = json.loads(legacy.read_text(encoding="utf-8"))
1047
- _legacy_mode = _data.get("mode", "").lower()
1048
- if _legacy_mode == new_mode.lower():
1049
- # config.json IS this mode — use it directly
1050
- new_config = cls.load(legacy)
1051
- need_migration = True
1052
- else:
1053
- new_config = cls.for_mode(new_mode_val, base_dir=_base)
1054
- except Exception:
1055
- new_config = cls.for_mode(new_mode_val, base_dir=_base)
1056
- else:
1057
- new_config = cls.for_mode(new_mode_val, base_dir=_base)
1136
+ # First time switching to this mode: start from old config, change mode only.
1137
+ # Use dataclasses.replace() to produce a new frozen-compatible object.
1138
+ new_config = dataclasses.replace(old_config, mode=new_mode_val)
1139
+
1140
+ # 3. LLM default population — ONLY if user has no provider AND switching to B/C.
1141
+ # Never overwrites an existing provider.
1142
+ if new_mode_val in (_M.B, _M.C) and not new_config.llm.provider:
1143
+ if new_mode_val == _M.B:
1144
+ new_config = dataclasses.replace(
1145
+ new_config,
1146
+ llm=LLMConfig(
1147
+ provider="ollama",
1148
+ model="llama3.2",
1149
+ api_base="http://localhost:11434",
1150
+ ),
1151
+ )
1152
+ else: # Mode C
1153
+ new_config = dataclasses.replace(
1154
+ new_config,
1155
+ llm=LLMConfig(
1156
+ provider="openrouter",
1157
+ model="anthropic/claude-sonnet-4",
1158
+ ),
1159
+ )
1058
1160
 
1059
- # 3. Save as active config.json (backward compat)
1161
+ # 4. Save as active config.json (backward compat)
1060
1162
  new_config.save(_base / "config.json", mode_change=True)
1061
1163
 
1062
- # 4. Write current_mode
1164
+ # 5. Write current_mode
1063
1165
  cls.write_current_mode(new_mode, _base)
1064
1166
 
1065
- # 5. On first migration, also save mode_a.json and mode_c.json
1066
- # so users have a complete set
1067
- if need_migration:
1068
- for _m in (_M.A, _M.B, _M.C):
1069
- _mp = cls._mode_config_path(_base, _m)
1070
- if not _mp.exists():
1071
- try:
1072
- _mc = cls.for_mode(_m, base_dir=_base)
1073
- _mc.save(_mp)
1074
- except Exception:
1075
- pass
1076
-
1077
1167
  return new_config
1078
1168
 
1079
1169
  @classmethod