superlocalmemory 3.8.2__tar.gz → 3.8.4__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 (647) hide show
  1. {superlocalmemory-3.8.2/src/superlocalmemory.egg-info → superlocalmemory-3.8.4}/PKG-INFO +3 -3
  2. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/README.md +2 -2
  3. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/rules/AGENTS.md +1 -1
  4. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-cache/SKILL.md +1 -1
  5. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-compress/SKILL.md +1 -1
  6. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-graph/SKILL.md +1 -1
  7. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-recall/SKILL.md +1 -1
  8. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-remember/SKILL.md +1 -1
  9. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-session/SKILL.md +1 -1
  10. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-status/SKILL.md +1 -1
  11. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/pyproject.toml +1 -1
  12. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/__init__.py +1 -1
  13. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/access/rbac.py +68 -76
  14. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/commands.py +19 -0
  15. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/ingest_cmd.py +11 -1
  16. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/main.py +30 -0
  17. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/pending_store.py +39 -14
  18. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/config.py +58 -0
  19. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/consolidation_engine.py +79 -73
  20. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine.py +92 -11
  21. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/fact_consolidator.py +148 -30
  22. superlocalmemory-3.8.4/src/superlocalmemory/core/graph_pruner.py +818 -0
  23. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ingestion_command.py +160 -31
  24. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/maintenance_scheduler.py +25 -1
  25. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_pipeline.py +3 -0
  26. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/registry.py +5 -1
  27. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/remote_mode.py +3 -1
  28. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/scale_engine.py +41 -18
  29. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/store_pipeline.py +18 -4
  30. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entity_resolver.py +18 -11
  31. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/_outcome_common.py +9 -2
  32. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/adapter_base.py +58 -44
  33. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/ide_connector.py +26 -8
  34. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/portable_kit.py +105 -9
  35. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/prewarm_auth.py +21 -2
  36. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/auth_middleware.py +3 -1
  37. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/cloud_backup.py +26 -27
  38. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/event_bus.py +250 -88
  39. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_cycle.py +33 -16
  40. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/entity_compiler.py +148 -132
  41. superlocalmemory-3.8.4/src/superlocalmemory/learning/memory_merge.py +175 -0
  42. superlocalmemory-3.8.4/src/superlocalmemory/learning/reward_archive.py +218 -0
  43. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward_boost.py +40 -30
  44. superlocalmemory-3.8.4/src/superlocalmemory/mcp/http_transport.py +386 -0
  45. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/spreading_activation.py +20 -12
  46. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/vector_store.py +84 -69
  47. superlocalmemory-3.8.4/src/superlocalmemory/server/loopback.py +91 -0
  48. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/origin.py +9 -4
  49. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/backup.py +6 -2
  50. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/behavioral.py +6 -12
  51. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/compliance.py +20 -23
  52. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/config_api.py +83 -0
  53. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/helpers.py +24 -13
  54. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/memories.py +139 -91
  55. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/mesh.py +7 -2
  56. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/profiles.py +20 -21
  57. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/rbac.py +0 -1
  58. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/tiers.py +42 -30
  59. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/v3_api.py +67 -77
  60. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/unified_daemon.py +246 -39
  61. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/write_identity.py +22 -4
  62. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/database.py +75 -8
  63. superlocalmemory-3.8.4/src/superlocalmemory/storage/deferred_writes.py +153 -0
  64. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/embedding_migrator.py +19 -0
  65. superlocalmemory-3.8.4/src/superlocalmemory/storage/memory_write.py +119 -0
  66. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migration_runner.py +7 -0
  67. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +113 -78
  68. superlocalmemory-3.8.4/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +80 -0
  69. superlocalmemory-3.8.4/src/superlocalmemory/storage/write_lock.py +88 -0
  70. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/core.js +6 -1
  71. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4/src/superlocalmemory.egg-info}/PKG-INFO +3 -3
  72. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/SOURCES.txt +10 -2
  73. superlocalmemory-3.8.4/tests/test_audit_hardening_384.py +435 -0
  74. superlocalmemory-3.8.4/tests/test_graph_pruning_config.py +475 -0
  75. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_isolation_cycle3.py +8 -2
  76. superlocalmemory-3.8.4/tests/test_m031_startup_automigration.py +497 -0
  77. superlocalmemory-3.8.4/tests/test_write_lock_hardening.py +189 -0
  78. superlocalmemory-3.8.2/AUTHORS.md +0 -16
  79. superlocalmemory-3.8.2/src/superlocalmemory/core/graph_pruner.py +0 -421
  80. superlocalmemory-3.8.2/src/superlocalmemory/learning/memory_merge.py +0 -160
  81. superlocalmemory-3.8.2/src/superlocalmemory/learning/reward_archive.py +0 -210
  82. superlocalmemory-3.8.2/src/superlocalmemory/mcp/http_transport.py +0 -54
  83. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/LICENSE +0 -0
  84. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/NOTICE +0 -0
  85. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/setup.cfg +0 -0
  86. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/access/__init__.py +0 -0
  87. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/__init__.py +0 -0
  88. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  89. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/signer.py +0 -0
  90. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/watermark.py +0 -0
  91. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/__init__.py +0 -0
  92. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/_lazy_init.py +0 -0
  93. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/cache_cmd.py +0 -0
  94. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/compress_cmd.py +0 -0
  95. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/context_commands.py +0 -0
  96. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/daemon.py +0 -0
  97. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/db_migrate.py +0 -0
  98. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/diagnostics_cmd.py +0 -0
  99. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  100. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/evidence_cmd.py +0 -0
  101. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/help_cmd.py +0 -0
  102. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/json_output.py +0 -0
  103. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/loop_cmd.py +0 -0
  104. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/mesh_cmd.py +0 -0
  105. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  106. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
  107. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/optimize_constants.py +0 -0
  108. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/post_install.py +0 -0
  109. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
  110. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/scale_engine_cmd.py +0 -0
  111. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/service_installer.py +0 -0
  112. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  113. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/version_banner.py +0 -0
  114. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  115. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/__init__.py +0 -0
  116. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  117. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  118. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  119. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  120. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  121. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  122. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  123. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/changes.py +0 -0
  124. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/communities.py +0 -0
  125. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/config.py +0 -0
  126. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/database.py +0 -0
  127. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  128. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  129. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  130. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/flows.py +0 -0
  131. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  132. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  133. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  134. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/incremental.py +0 -0
  135. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/models.py +0 -0
  136. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/parser.py +0 -0
  137. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/resolver.py +0 -0
  138. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/search.py +0 -0
  139. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/service.py +0 -0
  140. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/watcher.py +0 -0
  141. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/__init__.py +0 -0
  142. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/abac.py +0 -0
  143. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/audit.py +0 -0
  144. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  145. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/gdpr.py +0 -0
  146. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  147. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/retention.py +0 -0
  148. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/scheduler.py +0 -0
  149. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/__init__.py +0 -0
  150. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
  151. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/block_hygiene.py +0 -0
  152. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/clock_monitor.py +0 -0
  153. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/community_summary.py +0 -0
  154. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/component_healer.py +0 -0
  155. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/component_registry.py +0 -0
  156. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/context_cache.py +0 -0
  157. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/db_pool.py +0 -0
  158. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/derivation_lineage.py +0 -0
  159. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/embedding_worker.py +0 -0
  160. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/embeddings.py +0 -0
  161. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  162. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_ingestion.py +0 -0
  163. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_lock.py +0 -0
  164. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_wiring.py +0 -0
  165. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/entity_community.py +0 -0
  166. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/error_catalog.py +0 -0
  167. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/error_envelope.py +0 -0
  168. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/evidence_bundle.py +0 -0
  169. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/file_lock.py +0 -0
  170. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  171. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/health_monitor.py +0 -0
  172. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/hooks.py +0 -0
  173. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ingest_gate.py +0 -0
  174. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/injection.py +0 -0
  175. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/key_expander.py +0 -0
  176. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/lifecycle_state.py +0 -0
  177. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  178. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/maintenance.py +0 -0
  179. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
  180. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/modes.py +0 -0
  181. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/mutations.py +0 -0
  182. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  183. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/pii.py +0 -0
  184. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/platform_utils.py +0 -0
  185. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/priority_queue.py +0 -0
  186. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/profiles.py +0 -0
  187. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/progressive_abstraction.py +0 -0
  188. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/pruning_engine.py +0 -0
  189. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/queue_consumer.py +0 -0
  190. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  191. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ram_lock.py +0 -0
  192. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/rate_limit.py +0 -0
  193. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_gate.py +0 -0
  194. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_queue.py +0 -0
  195. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_worker.py +0 -0
  196. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/reranker_worker.py +0 -0
  197. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/safe_fs.py +0 -0
  198. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/score_contract.py +0 -0
  199. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/security_primitives.py +0 -0
  200. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/shadow_router.py +0 -0
  201. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/slm_disabled.py +0 -0
  202. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/slmignore.py +0 -0
  203. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/summarizer.py +0 -0
  204. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/tier_manager.py +0 -0
  205. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/topic_signature.py +0 -0
  206. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/worker_pool.py +0 -0
  207. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/__init__.py +0 -0
  208. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  209. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  210. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  211. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  212. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/__init__.py +0 -0
  213. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  214. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  215. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/consolidator.py +0 -0
  216. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/context_generator.py +0 -0
  217. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/emotional.py +0 -0
  218. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entity_reflexion.py +0 -0
  219. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  220. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  221. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/foresight.py +0 -0
  222. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  223. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  224. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  225. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  226. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  227. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  228. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/type_router.py +0 -0
  229. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evaluation/__init__.py +0 -0
  230. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evaluation/calibration.py +0 -0
  231. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/__init__.py +0 -0
  232. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  233. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/budget.py +0 -0
  234. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  235. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  236. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/model_selection.py +0 -0
  237. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  238. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  239. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/triggers.py +0 -0
  240. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/types.py +0 -0
  241. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/graph/__init__.py +0 -0
  242. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  243. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/__init__.py +0 -0
  244. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  245. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  246. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  247. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  248. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  249. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  250. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
  251. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  252. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/codex_assets.py +0 -0
  253. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/codex_hooks.py +0 -0
  254. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/context_payload.py +0 -0
  255. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  256. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  257. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  258. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  259. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  260. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/memory_protocol.py +0 -0
  261. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  262. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  263. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  264. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/session_registry.py +0 -0
  265. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  266. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  267. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  268. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  269. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  270. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/__init__.py +0 -0
  271. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/backup.py +0 -0
  272. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/cache_manager.py +0 -0
  273. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/daemon_identity.py +0 -0
  274. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/data_root.py +0 -0
  275. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  276. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/local_diagnostics.py +0 -0
  277. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/pid_manager.py +0 -0
  278. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/process_reaper.py +0 -0
  279. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  280. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  281. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/__init__.py +0 -0
  282. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  283. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  284. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  285. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/credentials.py +0 -0
  286. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  287. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/parsers.py +0 -0
  288. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  289. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/__init__.py +0 -0
  290. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/adaptive.py +0 -0
  291. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  292. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  293. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bandit.py +0 -0
  294. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  295. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/behavioral.py +0 -0
  296. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bootstrap.py +0 -0
  297. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  298. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  299. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/cross_project.py +0 -0
  300. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/database.py +0 -0
  301. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  302. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/engagement.py +0 -0
  303. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ensemble.py +0 -0
  304. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  305. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/features.py +0 -0
  306. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/feedback.py +0 -0
  307. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  308. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  309. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/labeler.py +0 -0
  310. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  311. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
  312. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/model_cache.py +0 -0
  313. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/model_rollback.py +0 -0
  314. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  315. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/outcomes.py +0 -0
  316. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  317. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  318. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/project_context.py +0 -0
  319. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  320. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker.py +0 -0
  321. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_common.py +0 -0
  322. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  323. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  324. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward.py +0 -0
  325. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  326. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/shadow_test.py +0 -0
  327. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/signal_worker.py +0 -0
  328. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/signals.py +0 -0
  329. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  330. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/source_quality.py +0 -0
  331. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/trigram_index.py +0 -0
  332. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/workflows.py +0 -0
  333. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/llm/__init__.py +0 -0
  334. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/llm/backbone.py +0 -0
  335. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/__init__.py +0 -0
  336. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/budget.py +0 -0
  337. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/engine.py +0 -0
  338. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/ledger.py +0 -0
  339. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/models.py +0 -0
  340. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/rules.py +0 -0
  341. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/__init__.py +0 -0
  342. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  343. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/fisher.py +0 -0
  344. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  345. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/hopfield.py +0 -0
  346. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/langevin.py +0 -0
  347. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/polar_quant.py +0 -0
  348. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/qjl.py +0 -0
  349. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/sheaf.py +0 -0
  350. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/turbo_quant.py +0 -0
  351. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/__init__.py +0 -0
  352. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  353. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  354. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_stdin_guard.py +0 -0
  355. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/agent_context.py +0 -0
  356. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/cli_fallback.py +0 -0
  357. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/profiles.py +0 -0
  358. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/resources.py +0 -0
  359. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/server.py +0 -0
  360. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/shared.py +0 -0
  361. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools.py +0 -0
  362. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_active.py +0 -0
  363. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  364. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_context.py +0 -0
  365. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_core.py +0 -0
  366. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  367. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  368. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_loops.py +0 -0
  369. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  370. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_optimize.py +0 -0
  371. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  372. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  373. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  374. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/__init__.py +0 -0
  375. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/broker.py +0 -0
  376. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  377. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/migrations/__init__.py +0 -0
  378. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  379. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/NOTICE +0 -0
  380. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/__init__.py +0 -0
  381. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
  382. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
  383. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
  384. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
  385. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
  386. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
  387. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
  388. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
  389. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
  390. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/exact.py +0 -0
  391. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
  392. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
  393. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/manager.py +0 -0
  394. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
  395. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
  396. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
  397. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/align.py +0 -0
  398. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
  399. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
  400. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/router.py +0 -0
  401. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/__init__.py +0 -0
  402. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/defaults.py +0 -0
  403. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/schema.py +0 -0
  404. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/store.py +0 -0
  405. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
  406. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
  407. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
  408. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
  409. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
  410. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
  411. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
  412. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
  413. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/capture.py +0 -0
  414. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
  415. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
  416. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
  417. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/server.py +0 -0
  418. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -0
  419. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
  420. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/db.py +0 -0
  421. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/schema.py +0 -0
  422. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/__init__.py +0 -0
  423. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  424. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  425. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  426. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  427. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  428. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/__init__.py +0 -0
  429. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/agentic.py +0 -0
  430. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  431. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  432. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  433. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  434. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/engine.py +0 -0
  435. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  436. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  437. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/fusion.py +0 -0
  438. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  439. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  440. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  441. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/reranker.py +0 -0
  442. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/scope_policy.py +0 -0
  443. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  444. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/strategy.py +0 -0
  445. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  446. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_frame.py +0 -0
  447. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -0
  448. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/time_window.py +0 -0
  449. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/__init__.py +0 -0
  450. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/api.py +0 -0
  451. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/bandit_loops.py +0 -0
  452. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/config_file.py +0 -0
  453. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  454. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  455. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/profile_runtime.py +0 -0
  456. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/rbac_enforce.py +0 -0
  457. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/recall_health.py +0 -0
  458. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/recall_serializer.py +0 -0
  459. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/route_mutations.py +0 -0
  460. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/__init__.py +0 -0
  461. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/abstraction.py +0 -0
  462. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/adapters.py +0 -0
  463. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/agents.py +0 -0
  464. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/brain.py +0 -0
  465. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/chat.py +0 -0
  466. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/data_io.py +0 -0
  467. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/entity.py +0 -0
  468. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/events.py +0 -0
  469. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/evolution.py +0 -0
  470. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ingest.py +0 -0
  471. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/insights.py +0 -0
  472. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/learning.py +0 -0
  473. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/learning_telemetry.py +0 -0
  474. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  475. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/optimize.py +0 -0
  476. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  477. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ratelimit.py +0 -0
  478. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/stats.py +0 -0
  479. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/timeline.py +0 -0
  480. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/token.py +0 -0
  481. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ws.py +0 -0
  482. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/security_middleware.py +0 -0
  483. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/ui.py +0 -0
  484. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/__init__.py +0 -0
  485. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/access_control.py +0 -0
  486. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/access_log.py +0 -0
  487. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/logical_edges.py +0 -0
  488. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migration_v33.py +0 -0
  489. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  490. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  491. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  492. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  493. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  494. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  495. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  496. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  497. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  498. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  499. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  500. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  501. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  502. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
  503. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -0
  504. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -0
  505. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -0
  506. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -0
  507. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -0
  508. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -0
  509. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -0
  510. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -0
  511. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -0
  512. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -0
  513. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -0
  514. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -0
  515. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -0
  516. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -0
  517. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  518. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations.py +0 -0
  519. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/models.py +0 -0
  520. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/quantized_store.py +0 -0
  521. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema.py +0 -0
  522. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  523. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v32.py +0 -0
  524. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  525. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  526. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v343.py +0 -0
  527. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v345.py +0 -0
  528. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v347.py +0 -0
  529. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/sqlite_vectors.py +0 -0
  530. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  531. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/__init__.py +0 -0
  532. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/gate.py +0 -0
  533. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/provenance.py +0 -0
  534. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/scorer.py +0 -0
  535. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/signals.py +0 -0
  536. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -0
  537. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/assets/slm-icon.svg +0 -0
  538. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/brain.css +0 -0
  539. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/design-system.css +0 -0
  540. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  541. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  542. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/od-bridge.css +0 -0
  543. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/favicon.svg +0 -0
  544. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/index.html +0 -0
  545. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/agents.js +0 -0
  546. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  547. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/brain.js +0 -0
  548. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/clusters.js +0 -0
  549. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/compliance.js +0 -0
  550. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  551. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/event-delegation.js +0 -0
  552. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/events.js +0 -0
  553. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  554. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/feedback.js +0 -0
  555. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  556. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  557. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  558. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  559. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/init.js +0 -0
  560. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  561. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  562. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/math-health.js +0 -0
  563. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memories.js +0 -0
  564. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  565. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  566. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/modal.js +0 -0
  567. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  568. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  569. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  570. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  571. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  572. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  573. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-agents.js +0 -0
  574. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-auth-gate.js +0 -0
  575. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-backup.js +0 -0
  576. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-brain.js +0 -0
  577. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-components.js +0 -0
  578. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-entities.js +0 -0
  579. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-graph.js +0 -0
  580. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-health.js +0 -0
  581. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-mcp.js +0 -0
  582. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-memories.js +0 -0
  583. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-mesh.js +0 -0
  584. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-operations.js +0 -0
  585. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-optimize.js +0 -0
  586. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-settings.js +0 -0
  587. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-shell.js +0 -0
  588. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-skills.js +0 -0
  589. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-team.js +0 -0
  590. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/optimize.js +0 -0
  591. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/profiles.js +0 -0
  592. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  593. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  594. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/search.js +0 -0
  595. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/settings.js +0 -0
  596. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/timeline.js +0 -0
  597. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  598. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  599. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  600. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  601. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  602. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  603. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  604. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  605. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  606. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  607. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  608. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  609. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  610. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/vector/__init__.py +0 -0
  611. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  612. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  613. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  614. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/requires.txt +0 -0
  615. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  616. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_auto_hooks.py +0 -0
  617. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_before_web_hook.py +0 -0
  618. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_behavioral_full.py +0 -0
  619. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_claude_hooks.py +0 -0
  620. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_core.py +0 -0
  621. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_json.py +0 -0
  622. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_v33.py +0 -0
  623. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_compliance_full.py +0 -0
  624. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_config_system.py +0 -0
  625. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_dashboard_preserve_embedding.py +0 -0
  626. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_engine_hooks.py +0 -0
  627. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_event_bus.py +0 -0
  628. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_features.py +0 -0
  629. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_final_locomo_mini.py +0 -0
  630. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_graph_integrity.py +0 -0
  631. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_hook_handlers.py +0 -0
  632. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_ide_connector.py +0 -0
  633. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_infra.py +0 -0
  634. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_injection.py +0 -0
  635. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_learning_advanced.py +0 -0
  636. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_learning_collectors.py +0 -0
  637. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_llm_provider.py +0 -0
  638. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_mcp_server.py +0 -0
  639. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_migration.py +0 -0
  640. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_mode_switch_preservation.py +0 -0
  641. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_post_install.py +0 -0
  642. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_ranker.py +0 -0
  643. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_resource_lifecycle.py +0 -0
  644. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_topic_shift_hook.py +0 -0
  645. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_trust_full.py +0 -0
  646. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_v3_api.py +0 -0
  647. {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_version_consistency.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.8.2
3
+ Version: 3.8.4
4
4
  Summary: Local-first agent memory with auditable hybrid retrieval
5
5
  Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -106,10 +106,10 @@ Dynamic: license-file
106
106
  </picture>
107
107
  </p>
108
108
 
109
- <h1 align="center">SuperLocalMemory V3.8.2</h1>
109
+ <h1 align="center">SuperLocalMemory V3.8.4</h1>
110
110
  <p align="center"><strong>Enterprise-grade, local-first memory for AI agents and teams.</strong><br/>
111
111
  <em>A persistent, auditable long-term brain for your agents that runs on your own infrastructure — with multi-workspace isolation, role-based access, and GDPR + EU AI Act governance controls built in.</em></p>
112
- <p align="center"><code>v3.8.2</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
112
+ <p align="center"><code>v3.8.4</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
113
113
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
114
114
  <p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
115
115
 
@@ -5,10 +5,10 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V3.8.2</h1>
8
+ <h1 align="center">SuperLocalMemory V3.8.4</h1>
9
9
  <p align="center"><strong>Enterprise-grade, local-first memory for AI agents and teams.</strong><br/>
10
10
  <em>A persistent, auditable long-term brain for your agents that runs on your own infrastructure — with multi-workspace isolation, role-based access, and GDPR + EU AI Act governance controls built in.</em></p>
11
- <p align="center"><code>v3.8.2</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
11
+ <p align="center"><code>v3.8.4</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
12
12
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
13
13
  <p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
14
14
 
@@ -128,4 +128,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
128
128
  - **slm-optimize-advisor** — context compression and KV cache
129
129
  - **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
130
130
 
131
- SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later
131
+ SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
@@ -145,4 +145,4 @@ These subcommands control daemon-level cache settings. They do not read or write
145
145
 
146
146
  ---
147
147
 
148
- SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
@@ -311,4 +311,4 @@ profile. See `slm-profile` for the full profile switching workflow.
311
311
 
312
312
  ---
313
313
 
314
- SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later
314
+ SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
@@ -236,4 +236,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
236
236
 
237
237
  ---
238
238
 
239
- *SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later*
239
+ *SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later*
@@ -238,4 +238,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
238
238
 
239
239
  ---
240
240
 
241
- *SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later*
241
+ *SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later*
@@ -227,4 +227,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
227
227
 
228
228
  ---
229
229
 
230
- *SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later*
230
+ *SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later*
@@ -163,4 +163,4 @@ multi-profile setup. To switch the active profile, see `slm-profile`.
163
163
 
164
164
  ---
165
165
 
166
- SuperLocalMemory v3.8.2 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.8.2"
3
+ version = "3.8.4"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "3.8.2"
35
+ __version__ = "3.8.4"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -32,6 +32,7 @@ from __future__ import annotations
32
32
  import hashlib
33
33
  import hmac
34
34
  import logging
35
+ import os
35
36
  import secrets
36
37
  import sqlite3
37
38
  import uuid
@@ -39,9 +40,14 @@ from datetime import datetime, timedelta, timezone
39
40
  from enum import Enum
40
41
  from pathlib import Path
41
42
 
43
+ from superlocalmemory.storage.memory_write import memory_write
44
+
42
45
  logger = logging.getLogger("superlocalmemory.access.rbac")
43
46
 
44
- _BUSY_TIMEOUT_MS = 4000
47
+ # Match the daemon's default (SLM_DB_BUSY_TIMEOUT_MS, default 10 000 ms).
48
+ # Reads use this via _conn(); writes go through memory_write() which reads the
49
+ # same env var internally, so in-process writers never see SQLITE_BUSY.
50
+ _BUSY_TIMEOUT_MS: int = max(0, int(os.environ.get("SLM_DB_BUSY_TIMEOUT_MS", "10000")))
45
51
  _SESSION_TTL_HOURS = 12
46
52
 
47
53
  # scrypt cost parameters (OWASP-recommended interactive-login range).
@@ -155,16 +161,15 @@ class RbacEngine:
155
161
  raise RbacError("Username is required.")
156
162
  pw_hash = _hash_password(password)
157
163
  user_id = _uid()
158
- conn = self._conn()
159
- try:
164
+ # memory_write: process write lock + busy_timeout.
165
+ with memory_write(self._db_path) as conn:
160
166
  # The UNIQUE(username) constraint is the source of truth; the SELECT
161
167
  # is a fast path. Two concurrent creates can both pass the SELECT, so
162
168
  # the loser's INSERT hits the constraint — convert that to RbacError
163
169
  # (409) instead of leaking a raw IntegrityError as a 500.
164
- exists = conn.execute(
170
+ if conn.execute(
165
171
  "SELECT 1 FROM rbac_users WHERE username=?", (username,)
166
- ).fetchone()
167
- if exists:
172
+ ).fetchone():
168
173
  raise RbacError(f"User '{username}' already exists.")
169
174
  try:
170
175
  conn.execute(
@@ -174,19 +179,15 @@ class RbacEngine:
174
179
  (user_id, username, display_name or username, pw_hash,
175
180
  _now(), created_by),
176
181
  )
177
- conn.commit()
178
182
  except sqlite3.IntegrityError:
179
183
  raise RbacError(f"User '{username}' already exists.")
180
- finally:
181
- conn.close()
182
184
  logger.info("RBAC: created user '%s' (%s)", username, user_id)
183
185
  return {"user_id": user_id, "username": username,
184
186
  "display_name": display_name or username, "status": "active"}
185
187
 
186
188
  def set_password(self, user_id: str, password: str) -> None:
187
189
  pw_hash = _hash_password(password)
188
- conn = self._conn()
189
- try:
190
+ with memory_write(self._db_path) as conn:
190
191
  cur = conn.execute(
191
192
  "UPDATE rbac_users SET password_hash=? WHERE user_id=?",
192
193
  (pw_hash, user_id),
@@ -195,15 +196,11 @@ class RbacEngine:
195
196
  raise RbacError("User not found.")
196
197
  # A password change invalidates every existing session.
197
198
  conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
198
- conn.commit()
199
- finally:
200
- conn.close()
201
199
 
202
200
  def set_status(self, user_id: str, status: str) -> None:
203
201
  if status not in ("active", "disabled"):
204
202
  raise RbacError("status must be 'active' or 'disabled'.")
205
- conn = self._conn()
206
- try:
203
+ with memory_write(self._db_path) as conn:
207
204
  cur = conn.execute(
208
205
  "UPDATE rbac_users SET status=? WHERE user_id=?", (status, user_id)
209
206
  )
@@ -211,21 +208,14 @@ class RbacEngine:
211
208
  raise RbacError("User not found.")
212
209
  if status == "disabled":
213
210
  conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
214
- conn.commit()
215
- finally:
216
- conn.close()
217
211
 
218
212
  def delete_user(self, user_id: str) -> None:
219
- conn = self._conn()
220
- try:
213
+ with memory_write(self._db_path) as conn:
221
214
  conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
222
215
  conn.execute("DELETE FROM rbac_memberships WHERE user_id=?", (user_id,))
223
216
  cur = conn.execute("DELETE FROM rbac_users WHERE user_id=?", (user_id,))
224
217
  if cur.rowcount == 0:
225
218
  raise RbacError("User not found.")
226
- conn.commit()
227
- finally:
228
- conn.close()
229
219
 
230
220
  def get_user(self, user_id: str) -> dict | None:
231
221
  conn = self._conn()
@@ -277,25 +267,35 @@ class RbacEngine:
277
267
  raw = secrets.token_urlsafe(32)
278
268
  now = datetime.now(timezone.utc)
279
269
  expires = (now + timedelta(hours=ttl_hours)).isoformat()
280
- conn = self._conn()
281
- try:
270
+ with memory_write(self._db_path) as conn:
282
271
  conn.execute(
283
272
  "INSERT INTO rbac_sessions (token_hash, user_id, created_at, "
284
273
  "expires_at, last_seen) VALUES (?, ?, ?, ?, ?)",
285
274
  (_hash_token(raw), user_id, now.isoformat(), expires, now.isoformat()),
286
275
  )
287
- conn.commit()
288
- finally:
289
- conn.close()
290
276
  return raw
291
277
 
292
278
  def resolve_session(self, raw_token: str) -> dict | None:
293
279
  """Return the active user for a session token, or None if invalid /
294
- expired / disabled. Updates last_seen. Constant-time by hash lookup."""
280
+ expired / disabled. Updates last_seen. Constant-time by hash lookup.
281
+
282
+ Concurrency design
283
+ ------------------
284
+ Phase 1 (read): WAL allows concurrent readers without blocking the
285
+ writer — ``_conn()`` with ``busy_timeout`` only. The write lock is
286
+ NOT taken here so a burst of concurrent requests doesn't serialise
287
+ through the single writer on every call.
288
+
289
+ Phase 2 (conditional write): only if the session is expired/stale.
290
+ ``memory_write()`` is opened AFTER the read connection is closed
291
+ (lock-ordering invariant: get_write_lock is outermost).
292
+ """
295
293
  if not raw_token:
296
294
  return None
297
295
  token_hash = _hash_token(raw_token)
298
296
  now = datetime.now(timezone.utc)
297
+
298
+ # -- Phase 1: read-only lookup ----------------------------------------
299
299
  conn = self._conn()
300
300
  try:
301
301
  row = conn.execute(
@@ -310,48 +310,52 @@ class RbacEngine:
310
310
  expired = datetime.fromisoformat(row["expires_at"]) <= now
311
311
  except ValueError:
312
312
  expired = True
313
- if expired or row["status"] != "active":
314
- conn.execute("DELETE FROM rbac_sessions WHERE token_hash=?", (token_hash,))
315
- conn.commit()
316
- return None
317
- # Debounce last_seen: only write when it is stale (>60s), so a burst
318
- # of authenticated requests does not serialize through the single
319
- # SQLite writer on every call.
313
+ row_status = row["status"]
314
+ row_last_seen = row["last_seen"]
315
+ user_dict = {
316
+ "user_id": row["user_id"],
317
+ "username": row["username"],
318
+ "display_name": row["display_name"],
319
+ }
320
+ finally:
321
+ conn.close()
322
+
323
+ # -- Phase 2: write if needed (read conn closed above) ----------------
324
+ if expired or row_status != "active":
325
+ with memory_write(self._db_path) as wconn:
326
+ wconn.execute(
327
+ "DELETE FROM rbac_sessions WHERE token_hash=?", (token_hash,)
328
+ )
329
+ return None
330
+
331
+ # Debounce last_seen: only write when stale (>60 s), so a burst of
332
+ # authenticated requests does not serialise through the writer every call.
333
+ stale = True
334
+ try:
335
+ stale = (now - datetime.fromisoformat(row_last_seen)).total_seconds() > 60
336
+ except (ValueError, TypeError, KeyError):
320
337
  stale = True
321
- try:
322
- stale = (now - datetime.fromisoformat(row["last_seen"])).total_seconds() > 60
323
- except (ValueError, TypeError, KeyError):
324
- stale = True
325
- if stale:
326
- conn.execute(
338
+ if stale:
339
+ with memory_write(self._db_path) as wconn:
340
+ wconn.execute(
327
341
  "UPDATE rbac_sessions SET last_seen=? WHERE token_hash=?",
328
342
  (now.isoformat(), token_hash),
329
343
  )
330
- conn.commit()
331
- return {"user_id": row["user_id"], "username": row["username"],
332
- "display_name": row["display_name"]}
333
- finally:
334
- conn.close()
344
+ return user_dict
335
345
 
336
346
  def revoke_session(self, raw_token: str) -> None:
337
- conn = self._conn()
338
- try:
339
- conn.execute("DELETE FROM rbac_sessions WHERE token_hash=?",
340
- (_hash_token(raw_token),))
341
- conn.commit()
342
- finally:
343
- conn.close()
347
+ with memory_write(self._db_path) as conn:
348
+ conn.execute(
349
+ "DELETE FROM rbac_sessions WHERE token_hash=?",
350
+ (_hash_token(raw_token),),
351
+ )
344
352
 
345
353
  def purge_expired_sessions(self) -> int:
346
- conn = self._conn()
347
- try:
354
+ with memory_write(self._db_path) as conn:
348
355
  cur = conn.execute(
349
356
  "DELETE FROM rbac_sessions WHERE expires_at <= ?", (_now(),)
350
357
  )
351
- conn.commit()
352
- return cur.rowcount or 0
353
- finally:
354
- conn.close()
358
+ return cur.rowcount or 0
355
359
 
356
360
  # -- memberships ------------------------------------------------------
357
361
 
@@ -361,8 +365,7 @@ class RbacEngine:
361
365
  role_enum = Role(role)
362
366
  except ValueError:
363
367
  raise RbacError(f"Invalid role '{role}'. Use admin/member/viewer.")
364
- conn = self._conn()
365
- try:
368
+ with memory_write(self._db_path) as conn:
366
369
  if not conn.execute(
367
370
  "SELECT 1 FROM rbac_users WHERE user_id=?", (user_id,)
368
371
  ).fetchone():
@@ -374,21 +377,14 @@ class RbacEngine:
374
377
  "added_at=excluded.added_at, added_by=excluded.added_by",
375
378
  (profile_id, user_id, role_enum.value, _now(), added_by),
376
379
  )
377
- conn.commit()
378
- finally:
379
- conn.close()
380
380
  return {"profile_id": profile_id, "user_id": user_id, "role": role_enum.value}
381
381
 
382
382
  def remove_membership(self, profile_id: str, user_id: str) -> None:
383
- conn = self._conn()
384
- try:
383
+ with memory_write(self._db_path) as conn:
385
384
  conn.execute(
386
385
  "DELETE FROM rbac_memberships WHERE profile_id=? AND user_id=?",
387
386
  (profile_id, user_id),
388
387
  )
389
- conn.commit()
390
- finally:
391
- conn.close()
392
388
 
393
389
  def get_role(self, user_id: str, profile_id: str) -> Role | None:
394
390
  conn = self._conn()
@@ -442,16 +438,12 @@ class RbacEngine:
442
438
  conn.close()
443
439
 
444
440
  def set_policy(self, key: str, value: str) -> None:
445
- conn = self._conn()
446
- try:
441
+ with memory_write(self._db_path) as conn:
447
442
  conn.execute(
448
443
  "INSERT INTO rbac_settings (key, value) VALUES (?, ?) "
449
444
  "ON CONFLICT(key) DO UPDATE SET value=excluded.value",
450
445
  (key, value),
451
446
  )
452
- conn.commit()
453
- finally:
454
- conn.close()
455
447
 
456
448
  def require_login(self) -> bool:
457
449
  """Company mode: mutations require a valid user session (no owner
@@ -1135,6 +1135,9 @@ def cmd_connect(args: Namespace) -> None:
1135
1135
  if ide_arg in IDE_MATRIX:
1136
1136
  here = getattr(args, "here", False)
1137
1137
  profile = getattr(args, "profile", None)
1138
+ transport = getattr(args, "transport", "stdio")
1139
+ daemon_port = getattr(args, "daemon_port", 8765)
1140
+ verify = getattr(args, "verify", False)
1138
1141
  project = None
1139
1142
  if here:
1140
1143
  import pathlib
@@ -1148,8 +1151,24 @@ def cmd_connect(args: Namespace) -> None:
1148
1151
  profile=profile,
1149
1152
  agents_md_source=_agents_md_source_factory(),
1150
1153
  dry_run=getattr(args, "dry_run", False),
1154
+ transport=transport,
1155
+ daemon_port=daemon_port,
1151
1156
  )
1152
1157
 
1158
+ # --verify: probe daemon health after writing
1159
+ if verify and transport in ("http", "http-mcp-remote") and not result.get("error"):
1160
+ from superlocalmemory.hooks.portable_kit import _check_daemon_health
1161
+ reachable = _check_daemon_health(daemon_port)
1162
+ if reachable:
1163
+ print(f"[verify] Daemon reachable at http://127.0.0.1:{daemon_port}/api/v3/health")
1164
+ else:
1165
+ print(
1166
+ f"[verify] Warning: daemon NOT reachable at "
1167
+ f"http://127.0.0.1:{daemon_port}/api/v3/health. "
1168
+ f"Run `slm serve start` to start it.",
1169
+ file=sys.stderr,
1170
+ )
1171
+
1153
1172
  if not result.get("error") and not getattr(args, "dry_run", False):
1154
1173
  from superlocalmemory.infra.local_diagnostics import record_operation
1155
1174
 
@@ -281,15 +281,25 @@ def _write_tool_events(events: list[dict]) -> int:
281
281
 
282
282
  v3.4.10: Preserves input_summary, output_summary, and project_path
283
283
  from enriched sources (ECC observations, enriched hook).
284
+
285
+ Concurrency note
286
+ ----------------
287
+ ``slm ingest`` is a SEPARATE OS process — the daemon's threading.RLock
288
+ write-lock cannot help here. PRAGMA busy_timeout is the only cross-process
289
+ lever: it makes SQLite WAIT for the single writer (daemon / hook) to finish
290
+ instead of immediately raising SQLITE_BUSY. The ``timeout`` kwarg to
291
+ sqlite3.connect is the Python-level retry budget (same duration).
284
292
  """
285
293
  db_path = Path(MEMORY_DB)
286
294
  if not db_path.exists():
287
295
  return 0
288
296
 
289
- conn = sqlite3.connect(str(db_path), timeout=10)
297
+ _busy_ms = 10_000
298
+ conn = sqlite3.connect(str(db_path), timeout=_busy_ms / 1000.0)
290
299
  count = 0
291
300
 
292
301
  try:
302
+ conn.execute(f"PRAGMA busy_timeout={_busy_ms}")
293
303
  for ev in events:
294
304
  try:
295
305
  conn.execute(
@@ -252,6 +252,36 @@ def main() -> None:
252
252
  "--dry-run", action="store_true", dest="dry_run", default=False,
253
253
  help="Show what would be written without making changes",
254
254
  )
255
+ # Workstream C — transport flexibility (3.8.4)
256
+ connect_p.add_argument(
257
+ "--transport",
258
+ choices=["stdio", "http", "http-mcp-remote"],
259
+ default="stdio",
260
+ dest="transport",
261
+ help=(
262
+ "MCP transport to write into the IDE config. "
263
+ "stdio (default, zero regression) | "
264
+ "http (native Streamable-HTTP, requires SLM daemon) | "
265
+ "http-mcp-remote (stdio bridge via mcp-remote for stdio-only clients)"
266
+ ),
267
+ )
268
+ connect_p.add_argument(
269
+ "--port",
270
+ type=int,
271
+ default=8765,
272
+ dest="daemon_port",
273
+ help="SLM daemon port for http/http-mcp-remote transport (default: 8765)",
274
+ )
275
+ connect_p.add_argument(
276
+ "--verify",
277
+ action="store_true",
278
+ default=False,
279
+ dest="verify",
280
+ help=(
281
+ "After writing the config, probe the daemon health endpoint to confirm "
282
+ "the transport is reachable (only meaningful for --transport http)"
283
+ ),
284
+ )
255
285
 
256
286
  migrate_p = sub.add_parser("migrate", help="Migrate data from V2 to V3 schema")
257
287
  migrate_p.add_argument(
@@ -40,6 +40,13 @@ _MAX_RETRIES = 3
40
40
  _STUCK_DAYS = 7
41
41
  _MAX_RETRY_DELAY_SECONDS = 3600
42
42
 
43
+ # Fix F: hard cap on pending.db retries. After this many failed attempts the
44
+ # item transitions to status='dead_letter' (next_retry_at=NULL) so it is
45
+ # permanently excluded from the work queue. Value chosen to survive transient
46
+ # engine unavailability (12h at 30-min drain intervals) while still providing
47
+ # a definitive signal for genuinely poisoned content.
48
+ _MAX_RETRY_COUNT: int = 20
49
+
43
50
  _SCHEMA = """
44
51
  CREATE TABLE IF NOT EXISTS pending_memories (
45
52
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -180,9 +187,17 @@ def mark_done(row_id: int, base_dir: Path | None = None) -> None:
180
187
  def mark_failed(row_id: int, error: str, base_dir: Path | None = None) -> None:
181
188
  """Mark a pending memory as failed with error message.
182
189
 
183
- Unprocessed evidence is never deleted or terminally hidden. Failures stay
184
- pending with bounded exponential backoff; M018 idempotency makes repeated
185
- replay safe once the canonical operation has been created.
190
+ Fix F: when the retry counter reaches _MAX_RETRY_COUNT the item transitions
191
+ to ``status='dead_letter'`` with ``next_retry_at=NULL``. Dead-lettered
192
+ items are excluded from the work queue (``get_pending`` filters
193
+ ``status='pending'``) and are not resurrected by the startup
194
+ ``UPDATE…WHERE status='failed'`` sweep (which targets only 'failed', not
195
+ 'dead_letter'). This gives operators a stable, inspectable record of
196
+ genuinely poisoned content instead of an infinite retry loop.
197
+
198
+ Below the cap, failures stay pending with bounded exponential backoff;
199
+ M018 idempotency makes repeated replay safe once the canonical operation
200
+ has been created.
186
201
  """
187
202
  conn = _get_db(base_dir)
188
203
  try:
@@ -193,17 +208,27 @@ def mark_failed(row_id: int, error: str, base_dir: Path | None = None) -> None:
193
208
  if row is None:
194
209
  return
195
210
  next_count = int(row[0] or 0) + 1
196
- delay = 0 if next_count == 1 else min(
197
- 2 ** min(next_count - 1, 12),
198
- _MAX_RETRY_DELAY_SECONDS,
199
- )
200
- conn.execute(
201
- "UPDATE pending_memories SET error = ?, "
202
- "retry_count = retry_count + 1, "
203
- "status = 'pending', next_retry_at = ? "
204
- "WHERE id = ?",
205
- (error, time.time() + delay, row_id),
206
- )
211
+ if next_count >= _MAX_RETRY_COUNT:
212
+ # Fix F: permanently exclude from work queue — dead-letter.
213
+ conn.execute(
214
+ "UPDATE pending_memories SET error = ?, "
215
+ "retry_count = retry_count + 1, "
216
+ "status = 'dead_letter', next_retry_at = NULL "
217
+ "WHERE id = ?",
218
+ (error, row_id),
219
+ )
220
+ else:
221
+ delay = 0 if next_count == 1 else min(
222
+ 2 ** min(next_count - 1, 12),
223
+ _MAX_RETRY_DELAY_SECONDS,
224
+ )
225
+ conn.execute(
226
+ "UPDATE pending_memories SET error = ?, "
227
+ "retry_count = retry_count + 1, "
228
+ "status = 'pending', next_retry_at = ? "
229
+ "WHERE id = ?",
230
+ (error, time.time() + delay, row_id),
231
+ )
207
232
  conn.commit()
208
233
  finally:
209
234
  conn.close()
@@ -960,6 +960,29 @@ class HealthConfig:
960
960
  enable_structured_logging: bool = True
961
961
 
962
962
 
963
+ # ---------------------------------------------------------------------------
964
+ # Graph Pruning Config (Workstream G — #84)
965
+ # ---------------------------------------------------------------------------
966
+
967
+ @dataclass
968
+ class GraphPruningConfig:
969
+ """Graph thinning parameters. Exposed via dashboard + CLI.
970
+
971
+ Defaults reproduce the previous hard-coded behaviour so existing
972
+ deployments see zero behavioural change after upgrade.
973
+ """
974
+
975
+ #: Maximum in- or out-degree per node. Maps to the legacy module-level
976
+ #: ``_MAX_DEGREE_PER_NODE = 100`` in graph_pruner.py.
977
+ max_degree_per_node: int = 100
978
+ #: Discard edges with weight strictly below this floor.
979
+ #: 0.0 = no floor (current behaviour, always-safe default).
980
+ min_edge_weight: float = 0.0
981
+ #: Master kill-switch for all graph pruning. ``False`` skips the entire
982
+ #: prune step (useful for debugging graph bloat).
983
+ enabled: bool = True
984
+
985
+
963
986
  # ---------------------------------------------------------------------------
964
987
  # Master Config
965
988
  # ---------------------------------------------------------------------------
@@ -1010,6 +1033,8 @@ class SLMConfig:
1010
1033
  scale_engine_state: str = "local_core" # local_core | prepared | verified | promoted
1011
1034
  evolution: EvolutionConfig = field(default_factory=EvolutionConfig)
1012
1035
  health: HealthConfig = field(default_factory=HealthConfig)
1036
+ # v3.8.4-G: Graph thinning parameters (#84)
1037
+ graph_pruning: GraphPruningConfig = field(default_factory=GraphPruningConfig)
1013
1038
 
1014
1039
  # v3.4.3: Daemon configuration
1015
1040
  daemon_idle_timeout: int = 0 # 0 = 24/7 (no auto-kill). >0 = seconds before auto-kill.
@@ -1174,6 +1199,31 @@ class SLMConfig:
1174
1199
  if k in HealthConfig.__dataclass_fields__
1175
1200
  })
1176
1201
 
1202
+ # v3.8.4-G: Graph pruning config (#84) — additive, no migration needed.
1203
+ # Old configs without this section silently fall back to GraphPruningConfig()
1204
+ # defaults, which reproduce the existing _MAX_DEGREE_PER_NODE=100 behaviour.
1205
+ gp_raw = data.get("graph_pruning", {})
1206
+ if gp_raw:
1207
+ try:
1208
+ gp_kwargs = {
1209
+ k: v for k, v in gp_raw.items()
1210
+ if k in GraphPruningConfig.__dataclass_fields__
1211
+ }
1212
+ gp = GraphPruningConfig(**gp_kwargs)
1213
+ # Validate and clamp out-of-range values
1214
+ max_deg = gp.max_degree_per_node if gp.max_degree_per_node >= 1 else 100
1215
+ min_w = max(0.0, min(1.0, gp.min_edge_weight))
1216
+ config.graph_pruning = GraphPruningConfig(
1217
+ max_degree_per_node=max_deg,
1218
+ min_edge_weight=min_w,
1219
+ enabled=gp.enabled,
1220
+ )
1221
+ except (ValueError, TypeError) as exc:
1222
+ logger.warning(
1223
+ "graph_pruning config invalid (%s) — using defaults", exc
1224
+ )
1225
+ config.graph_pruning = GraphPruningConfig()
1226
+
1177
1227
  # V3.4.65: Injection config (additive — defaults if missing from JSON)
1178
1228
  inj = data.get("injection", {}) or {}
1179
1229
  config.injection = InjectionConfig(
@@ -1329,6 +1379,14 @@ class SLMConfig:
1329
1379
  # Multi-scope memory: behaviour defaults
1330
1380
  data["scope"] = self.scope.as_dict()
1331
1381
 
1382
+ # v3.8.4-G: Persist graph pruning config (#84).
1383
+ # Always written — additive key, never overwrites unrelated sections.
1384
+ data["graph_pruning"] = {
1385
+ "max_degree_per_node": self.graph_pruning.max_degree_per_node,
1386
+ "min_edge_weight": self.graph_pruning.min_edge_weight,
1387
+ "enabled": self.graph_pruning.enabled,
1388
+ }
1389
+
1332
1390
  # Preserve existing V3.3 config sections that aren't in for_mode()
1333
1391
  for key in ("forgetting", "quantization", "sagq", "embedding_signature", "auto_invoke"):
1334
1392
  if key in existing: