atmem 2.3.7b2__tar.gz → 2.3.8__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 (679) hide show
  1. {atmem-2.3.7b2/atmem.egg-info → atmem-2.3.8}/PKG-INFO +50 -18
  2. {atmem-2.3.7b2 → atmem-2.3.8}/README.md +41 -16
  3. atmem-2.3.8/atmem/adapters/hermes/__init__.py +5 -0
  4. atmem-2.3.8/atmem/adapters/hermes/assets/plugin_entry.py +85 -0
  5. atmem-2.3.8/atmem/adapters/hermes/binding.py +215 -0
  6. atmem-2.3.8/atmem/adapters/hermes/client.py +179 -0
  7. atmem-2.3.8/atmem/adapters/hermes/package.py +17 -0
  8. atmem-2.3.8/atmem/adapters/hermes/provider.py +404 -0
  9. atmem-2.3.8/atmem/adapters/hermes/service.py +525 -0
  10. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/atflows_service.py +2 -0
  11. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/__init__.py +6 -0
  12. atmem-2.3.8/atmem/benchmark/attribution.py +514 -0
  13. atmem-2.3.8/atmem/benchmark/contracts.py +703 -0
  14. atmem-2.3.8/atmem/benchmark/finalization.py +180 -0
  15. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/cli.py +420 -16
  16. atmem-2.3.8/atmem/context_engine/__init__.py +43 -0
  17. atmem-2.3.8/atmem/context_engine/contracts.py +624 -0
  18. atmem-2.3.8/atmem/context_engine/coverage.py +56 -0
  19. atmem-2.3.8/atmem/context_engine/formation.py +881 -0
  20. atmem-2.3.8/atmem/context_engine/navigator.py +187 -0
  21. atmem-2.3.8/atmem/context_engine/packing.py +287 -0
  22. atmem-2.3.8/atmem/context_engine/planner.py +560 -0
  23. atmem-2.3.8/atmem/context_engine/pools.py +24 -0
  24. atmem-2.3.8/atmem/context_engine/profiles.py +104 -0
  25. atmem-2.3.8/atmem/context_engine/retrieval.py +1293 -0
  26. atmem-2.3.8/atmem/context_engine/service.py +337 -0
  27. atmem-2.3.8/atmem/context_engine/sufficiency.py +114 -0
  28. atmem-2.3.8/atmem/continuity/__init__.py +5 -0
  29. atmem-2.3.8/atmem/continuity/client.py +256 -0
  30. atmem-2.3.8/atmem/continuity/example.py +56 -0
  31. atmem-2.3.8/atmem/continuity/integrations.py +112 -0
  32. atmem-2.3.8/atmem/continuity/langgraph_example.py +88 -0
  33. atmem-2.3.8/atmem/continuity/service.py +408 -0
  34. atmem-2.3.8/atmem/continuity/tools.py +108 -0
  35. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/__init__.py +53 -0
  36. atmem-2.3.8/atmem/contracts/continuity-event-v1.json +28 -0
  37. atmem-2.3.8/atmem/contracts/models.py +852 -0
  38. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.css +9 -0
  39. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.html +24 -7
  40. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.js +63 -15
  41. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/blackbox.py +9 -0
  42. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/compat.py +6 -0
  43. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/manager.py +519 -53
  44. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/openclaw_native.py +2 -2
  45. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/state.py +2 -1
  46. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/store.py +80 -0
  47. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/verify.py +25 -1
  48. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/web.py +103 -1
  49. atmem-2.3.8/atmem/core/keys.py +603 -0
  50. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/storage.py +25 -7
  51. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/dashboard_daemon.py +5 -3
  52. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/models.py +5 -0
  53. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/service.py +40 -1
  54. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/store.py +52 -13
  55. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/__init__.py +26 -0
  56. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/context.py +5 -6
  57. atmem-2.3.8/atmem/extract/formation.py +848 -0
  58. atmem-2.3.8/atmem/extract/models.py +679 -0
  59. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/review.py +88 -50
  60. atmem-2.3.8/atmem/extract/structured_projection.py +99 -0
  61. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/validation.py +276 -8
  62. atmem-2.3.8/atmem/hermes_install.py +881 -0
  63. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/service.py +2 -1
  64. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/mcp/server.py +115 -2
  65. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/memory.py +1872 -53
  66. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/openclaw_install.py +1 -1
  67. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/__init__.py +21 -0
  68. atmem-2.3.8/atmem/retrieve/assemble.py +712 -0
  69. atmem-2.3.8/atmem/retrieve/expand.py +124 -0
  70. atmem-2.3.8/atmem/retrieve/hybrid.py +658 -0
  71. atmem-2.3.8/atmem/retrieve/intent.py +621 -0
  72. atmem-2.3.8/atmem/retrieve/profiles.py +56 -0
  73. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/rank.py +1 -0
  74. atmem-2.3.8/atmem/retrieve/sufficiency.py +401 -0
  75. atmem-2.3.8/atmem/schemas/v1/episode-ingest.json +45 -0
  76. atmem-2.3.8/atmem/schemas/v1/evidence-neighborhood.json +16 -0
  77. atmem-2.3.8/atmem/schemas/v1/formation-receipt.json +27 -0
  78. atmem-2.3.8/atmem/schemas/v1/information-need.json +34 -0
  79. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-proposal.json +7 -1
  80. atmem-2.3.8/atmem/schemas/v1/retrieval-budget.json +18 -0
  81. atmem-2.3.8/atmem/schemas/v1/retrieval-stage-event.json +34 -0
  82. atmem-2.3.8/atmem/schemas/v1/sufficiency-decision.json +15 -0
  83. atmem-2.3.8/atmem/schemas/v2/context-package.json +23 -0
  84. atmem-2.3.8/atmem/schemas/v2/context-request.json +15 -0
  85. atmem-2.3.8/atmem/schemas/v2/memory-unit.json +46 -0
  86. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/index.py +12 -0
  87. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/application.py +108 -0
  88. atmem-2.3.8/atmem/service/household.py +71 -0
  89. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/sqlite.py +2473 -47
  90. {atmem-2.3.7b2 → atmem-2.3.8/atmem.egg-info}/PKG-INFO +50 -18
  91. {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/SOURCES.txt +98 -0
  92. {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/requires.txt +9 -1
  93. {atmem-2.3.7b2 → atmem-2.3.8}/docs/benchmarks.md +24 -0
  94. atmem-2.3.8/docs/continuity.md +249 -0
  95. {atmem-2.3.7b2 → atmem-2.3.8}/docs/http-api.md +66 -0
  96. {atmem-2.3.7b2 → atmem-2.3.8}/docs/integration-guide.md +1 -0
  97. {atmem-2.3.7b2 → atmem-2.3.8}/docs/release-roadmap.md +150 -5
  98. atmem-2.3.8/docs/releases/v2.3.7-to-v2.3.8-technical-report.md +93 -0
  99. atmem-2.3.8/docs/releases/v2.3.7.md +117 -0
  100. atmem-2.3.8/docs/releases/v2.3.8.md +128 -0
  101. atmem-2.3.8/docs/releases/v2.3.8b2.md +56 -0
  102. atmem-2.3.8/docs/releases/v2.3.8b3.md +29 -0
  103. atmem-2.3.8/docs/releases/v2.3.8b4.md +32 -0
  104. atmem-2.3.8/docs/releases/v2.3.8b5.md +33 -0
  105. atmem-2.3.8/docs/releases/v2.3.8b6.md +68 -0
  106. {atmem-2.3.7b2 → atmem-2.3.8}/docs/saas-integration.md +12 -5
  107. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/atbot.md +1 -1
  108. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/atflows.md +21 -3
  109. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/cli.md +3 -3
  110. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/getting-started.md +1 -1
  111. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/index.md +8 -0
  112. atmem-2.3.8/docs/website/integrations/hermes.md +49 -0
  113. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/integrations.md +4 -2
  114. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/manifest.json +5 -1
  115. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/portfolio.md +1 -1
  116. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/releases.md +19 -4
  117. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/troubleshooting.md +2 -2
  118. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/README.md +2 -2
  119. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/openclaw.plugin.json +1 -1
  120. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/package-lock.json +2 -2
  121. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/package.json +2 -2
  122. atmem-2.3.8/integrations/openclaw/test/fixtures/hook-context/2026.9.6.json +409 -0
  123. atmem-2.3.8/integrations/openclaw/test/fixtures/hook-context/2026.9.9.json +413 -0
  124. atmem-2.3.8/integrations/openclaw/test/hook-context-parser.mjs +36 -0
  125. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/lib/hook-context-shape.mjs +31 -9
  126. {atmem-2.3.7b2 → atmem-2.3.8}/pyproject.toml +13 -3
  127. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_auditability.py +100 -0
  128. atmem-2.3.8/tests/test_benchmark_attribution.py +474 -0
  129. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_runner.py +11 -0
  130. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_blackbox.py +6 -1
  131. atmem-2.3.8/tests/test_context_assembler_v2.py +605 -0
  132. atmem-2.3.8/tests/test_context_engine_contracts.py +270 -0
  133. atmem-2.3.8/tests/test_context_engine_formation.py +346 -0
  134. atmem-2.3.8/tests/test_context_engine_governance.py +433 -0
  135. atmem-2.3.8/tests/test_context_engine_migration.py +152 -0
  136. atmem-2.3.8/tests/test_context_engine_navigation.py +90 -0
  137. atmem-2.3.8/tests/test_context_engine_performance.py +303 -0
  138. atmem-2.3.8/tests/test_context_engine_retrieval.py +1316 -0
  139. atmem-2.3.8/tests/test_continuity_http.py +120 -0
  140. atmem-2.3.8/tests/test_continuity_integration.py +134 -0
  141. atmem-2.3.8/tests/test_continuity_product.py +313 -0
  142. atmem-2.3.8/tests/test_continuity_tools.py +42 -0
  143. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_plane.py +2 -1
  144. atmem-2.3.8/tests/test_control_store_process_lock.py +137 -0
  145. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_verify.py +50 -0
  146. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_dashboard.py +11 -0
  147. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_context.py +2 -2
  148. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_documentation.py +2 -2
  149. atmem-2.3.8/tests/test_encryption.py +452 -0
  150. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_evidence_protection.py +2 -0
  151. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_proposals.py +115 -0
  152. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_generic_control.py +74 -0
  153. atmem-2.3.8/tests/test_hermes_authority.py +428 -0
  154. atmem-2.3.8/tests/test_hermes_binding.py +129 -0
  155. atmem-2.3.8/tests/test_hermes_install.py +365 -0
  156. atmem-2.3.8/tests/test_hermes_native.py +92 -0
  157. atmem-2.3.8/tests/test_hermes_packaging.py +120 -0
  158. atmem-2.3.8/tests/test_hermes_provider.py +184 -0
  159. atmem-2.3.8/tests/test_hermes_upstream_contract.py +152 -0
  160. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_http_api.py +31 -0
  161. atmem-2.3.8/tests/test_installed_benchmark_product.py +52 -0
  162. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_mcp.py +20 -0
  163. atmem-2.3.8/tests/test_memory_formation.py +1191 -0
  164. atmem-2.3.8/tests/test_official_benchmark_adapters.py +1719 -0
  165. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding_services.py +25 -9
  166. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_control.py +33 -0
  167. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_production_benchmarks.py +44 -0
  168. atmem-2.3.8/tests/test_reference_parity.py +254 -0
  169. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_release_metadata.py +4 -1
  170. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_adapter_conformance.py +27 -0
  171. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_candidate_union.py +230 -26
  172. atmem-2.3.8/tests/test_retrieval_cli.py +78 -0
  173. atmem-2.3.8/tests/test_retrieval_intent.py +70 -0
  174. atmem-2.3.8/tests/test_retrieval_quality_contracts.py +595 -0
  175. atmem-2.3.8/tests/test_retrieval_quality_protocol.py +534 -0
  176. atmem-2.3.8/tests/test_retrieval_query_plan.py +199 -0
  177. atmem-2.3.8/tests/test_retrieval_sufficiency.py +284 -0
  178. atmem-2.3.8/tests/test_typed_memory_persistence.py +536 -0
  179. atmem-2.3.8/tests/test_windows_atomic_startup.py +44 -0
  180. atmem-2.3.8/tools/install_local_wheels.py +22 -0
  181. atmem-2.3.8/tools/run_installed_encryption_tests.py +42 -0
  182. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_atflows_handoff.py +1 -1
  183. atmem-2.3.8/tools/smoke_installed_encryption.py +102 -0
  184. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_installed_package.py +1 -1
  185. atmem-2.3.8/tools/smoke_installed_retrieval.py +37 -0
  186. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_upgrade_from_2_1.py +9 -4
  187. atmem-2.3.7b2/atmem/benchmark/contracts.py +0 -143
  188. atmem-2.3.7b2/atmem/contracts/models.py +0 -308
  189. atmem-2.3.7b2/atmem/core/keys.py +0 -131
  190. atmem-2.3.7b2/atmem/extract/models.py +0 -151
  191. atmem-2.3.7b2/atmem/retrieve/hybrid.py +0 -159
  192. atmem-2.3.7b2/tests/test_encryption.py +0 -108
  193. {atmem-2.3.7b2 → atmem-2.3.8}/LICENSE +0 -0
  194. {atmem-2.3.7b2 → atmem-2.3.8}/MANIFEST.in +0 -0
  195. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/__init__.py +0 -0
  196. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/__init__.py +0 -0
  197. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/base.py +0 -0
  198. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/callbacks.py +0 -0
  199. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/crewai.py +0 -0
  200. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/evidence_profiles.py +0 -0
  201. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/google_adk.py +0 -0
  202. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/langgraph.py +0 -0
  203. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/microsoft_agent.py +0 -0
  204. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/openai_agents.py +0 -0
  205. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/pydantic_ai.py +0 -0
  206. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/smolagents.py +0 -0
  207. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/deterministic-v1.json +0 -0
  208. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/mem0-head-to-head-2.3.3b1-v1.json +0 -0
  209. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
  210. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/retrieval-calibration-v1.json +0 -0
  211. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/retrieval-heldout-v1.json +0 -0
  212. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/task-state-v1.json +0 -0
  213. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/thresholds-v1.json +0 -0
  214. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/external.py +0 -0
  215. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/profiles.py +0 -0
  216. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/retrieval.py +0 -0
  217. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/runner.py +0 -0
  218. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/bun_runtime.py +0 -0
  219. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/client.py +0 -0
  220. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/execution.py +0 -0
  221. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/task_state.py +0 -0
  222. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/versions.py +0 -0
  223. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/__init__.py +0 -0
  224. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/atmem.jpg +0 -0
  225. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/atbot_companion.py +0 -0
  226. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/atbot_service.py +0 -0
  227. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/evidence.py +0 -0
  228. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/explain.py +0 -0
  229. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/hosts.py +0 -0
  230. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/jev_service.py +0 -0
  231. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/models.py +0 -0
  232. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/openclaw_topology.py +0 -0
  233. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/query_expansion.py +0 -0
  234. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/server.py +0 -0
  235. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/topology.py +0 -0
  236. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/ui.py +0 -0
  237. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/__init__.py +0 -0
  238. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/canonical.py +0 -0
  239. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/fact_keys.py +0 -0
  240. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/policy.py +0 -0
  241. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/time.py +0 -0
  242. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/__init__.py +0 -0
  243. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/canonical.py +0 -0
  244. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/client.py +0 -0
  245. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/config.py +0 -0
  246. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/contracts.py +0 -0
  247. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/service.py +0 -0
  248. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/transport.py +0 -0
  249. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/validation.py +0 -0
  250. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/durability.py +0 -0
  251. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/__init__.py +0 -0
  252. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/accounts.py +0 -0
  253. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/crypto.py +0 -0
  254. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/__init__.py +0 -0
  255. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/coverage.py +0 -0
  256. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/events.py +0 -0
  257. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/projection.py +0 -0
  258. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/retention.py +0 -0
  259. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/status.py +0 -0
  260. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/classify.py +0 -0
  261. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/rules.py +0 -0
  262. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/__init__.py +0 -0
  263. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/identity.py +0 -0
  264. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/maintenance.py +0 -0
  265. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/models.py +0 -0
  266. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/store.py +0 -0
  267. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/traverse.py +0 -0
  268. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/__init__.py +0 -0
  269. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/artifacts.py +0 -0
  270. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/layout.py +0 -0
  271. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/__init__.py +0 -0
  272. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/models.py +0 -0
  273. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/service.py +0 -0
  274. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/store.py +0 -0
  275. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/incidents/__init__.py +0 -0
  276. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/incidents/detect.py +0 -0
  277. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/integrations/__init__.py +0 -0
  278. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/integrations/atflows.py +0 -0
  279. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/__init__.py +0 -0
  280. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/export.py +0 -0
  281. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/importer.py +0 -0
  282. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/mem0.py +0 -0
  283. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/models.py +0 -0
  284. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/plan.py +0 -0
  285. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/__init__.py +0 -0
  286. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/attestation.py +0 -0
  287. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/models.py +0 -0
  288. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/registry.py +0 -0
  289. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/report.py +0 -0
  290. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/verdict.py +0 -0
  291. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/investigate.py +0 -0
  292. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/__init__.py +0 -0
  293. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/invalidation.py +0 -0
  294. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/maintenance.py +0 -0
  295. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/models.py +0 -0
  296. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/policy.py +0 -0
  297. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/service.py +0 -0
  298. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/locking.py +0 -0
  299. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/maintenance.py +0 -0
  300. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/mcp/__init__.py +0 -0
  301. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/__init__.py +0 -0
  302. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/access.py +0 -0
  303. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/index.py +0 -0
  304. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/invalidation.py +0 -0
  305. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/models.py +0 -0
  306. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/processors.py +0 -0
  307. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/service.py +0 -0
  308. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/onboarding.py +0 -0
  309. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/onboarding_verify.py +0 -0
  310. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/processes.py +0 -0
  311. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/__init__.py +0 -0
  312. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/langgraph.py +0 -0
  313. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/lifecycle.py +0 -0
  314. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/loading.py +0 -0
  315. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/mem0.py +0 -0
  316. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/models.py +0 -0
  317. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/pydantic_ai.py +0 -0
  318. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/runtime.py +0 -0
  319. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/server.py +0 -0
  320. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/signing.py +0 -0
  321. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/worker.py +0 -0
  322. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/cache.py +0 -0
  323. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/calibration-v1.json +0 -0
  324. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/calibration.py +0 -0
  325. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/fusion.py +0 -0
  326. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/graph.py +0 -0
  327. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/graph_signal.py +0 -0
  328. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/models.py +0 -0
  329. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/signals.py +0 -0
  330. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/support.py +0 -0
  331. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/__init__.py +0 -0
  332. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/admin-audit.json +0 -0
  333. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
  334. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
  335. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/capabilities.json +0 -0
  336. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/context-package.json +0 -0
  337. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/graph-path.json +0 -0
  338. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-lifecycle-request.json +0 -0
  339. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-observation-request.json +0 -0
  340. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-proposal-request.json +0 -0
  341. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/invariant-registry.json +0 -0
  342. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/media-observation.json +0 -0
  343. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-archive.json +0 -0
  344. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-lifecycle.json +0 -0
  345. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/onboarding-state.json +0 -0
  346. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/recall-request.json +0 -0
  347. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/retrieval-decision.json +0 -0
  348. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/scope.json +0 -0
  349. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/semantic-health.json +0 -0
  350. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-job.json +0 -0
  351. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-key.json +0 -0
  352. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-principal.json +0 -0
  353. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/source-capture.json +0 -0
  354. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-context-package.json +0 -0
  355. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-profile.json +0 -0
  356. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-session-binding.json +0 -0
  357. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-start-request.json +0 -0
  358. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-state-proposal.json +0 -0
  359. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-state.json +0 -0
  360. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-transition-decision.json +0 -0
  361. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/unified-health.json +0 -0
  362. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/__init__.py +0 -0
  363. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/health.py +0 -0
  364. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/models.json +0 -0
  365. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/pgvector.py +0 -0
  366. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/providers.py +0 -0
  367. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/qdrant.py +0 -0
  368. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/__init__.py +0 -0
  369. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/admin_audit.py +0 -0
  370. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/auth.py +0 -0
  371. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/cache_policy.py +0 -0
  372. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/config.py +0 -0
  373. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/jobs.py +0 -0
  374. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/observability.py +0 -0
  375. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/recovery.py +0 -0
  376. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/repositories.py +0 -0
  377. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/__init__.py +0 -0
  378. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/executions.py +0 -0
  379. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/__init__.py +0 -0
  380. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/health.py +0 -0
  381. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/postgres.py +0 -0
  382. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/__init__.py +0 -0
  383. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/binding.py +0 -0
  384. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/context.py +0 -0
  385. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/enablement.py +0 -0
  386. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/enforcement.py +0 -0
  387. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/governance.py +0 -0
  388. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/guards.py +0 -0
  389. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/host_boundary.py +0 -0
  390. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/models.py +0 -0
  391. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/observability.py +0 -0
  392. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/policy.py +0 -0
  393. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/profiles.py +0 -0
  394. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/provenance.py +0 -0
  395. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/service.py +0 -0
  396. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/telemetry/__init__.py +0 -0
  397. {atmem-2.3.7b2 → atmem-2.3.8}/atmem/telemetry/retrieval.py +0 -0
  398. {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/dependency_links.txt +0 -0
  399. {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/entry_points.txt +0 -0
  400. {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/top_level.txt +0 -0
  401. {atmem-2.3.7b2 → atmem-2.3.8}/docs/agent-blackbox.md +0 -0
  402. {atmem-2.3.7b2 → atmem-2.3.8}/docs/atbot-release.md +0 -0
  403. {atmem-2.3.7b2 → atmem-2.3.8}/docs/audit-log-spec.md +0 -0
  404. {atmem-2.3.7b2 → atmem-2.3.8}/docs/audit-search.md +0 -0
  405. {atmem-2.3.7b2 → atmem-2.3.8}/docs/auditing-guide.md +0 -0
  406. {atmem-2.3.7b2 → atmem-2.3.8}/docs/benchmarks/memory-integrity.md +0 -0
  407. {atmem-2.3.7b2 → atmem-2.3.8}/docs/capabilities.json +0 -0
  408. {atmem-2.3.7b2 → atmem-2.3.8}/docs/context-provider-adapters.md +0 -0
  409. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
  410. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
  411. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
  412. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
  413. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
  414. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1.md +0 -0
  415. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
  416. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
  417. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-request-auth-v1.json +0 -0
  418. {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-request-auth-v1.md +0 -0
  419. {atmem-2.3.7b2 → atmem-2.3.8}/docs/control-plane.md +0 -0
  420. {atmem-2.3.7b2 → atmem-2.3.8}/docs/current-status.md +0 -0
  421. {atmem-2.3.7b2 → atmem-2.3.8}/docs/dashboard-design-language.md +0 -0
  422. {atmem-2.3.7b2 → atmem-2.3.8}/docs/data-storage-and-backup.md +0 -0
  423. {atmem-2.3.7b2 → atmem-2.3.8}/docs/delegated-context-provider.md +0 -0
  424. {atmem-2.3.7b2 → atmem-2.3.8}/docs/entity-relationship-memory.md +0 -0
  425. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/benchmark-deterministic-v1.json +0 -0
  426. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
  427. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
  428. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/http.md +0 -0
  429. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/langgraph.md +0 -0
  430. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/openclaw.md +0 -0
  431. {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/pydantic-ai.md +0 -0
  432. {atmem-2.3.7b2 → atmem-2.3.8}/docs/framework-adapters.md +0 -0
  433. {atmem-2.3.7b2 → atmem-2.3.8}/docs/generic-adapter.md +0 -0
  434. {atmem-2.3.7b2 → atmem-2.3.8}/docs/governed-task-state.md +0 -0
  435. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T043658Z-740c5c89d63c-host-compatibility.md +0 -0
  436. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.json +0 -0
  437. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.md +0 -0
  438. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T055300Z-04a063ce1e7b-publication.md +0 -0
  439. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260910-storizon-published-2.2.6.md +0 -0
  440. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260909-progress-card-observations.md +0 -0
  441. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260909-selective-context-and-precise-time.md +0 -0
  442. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260912-m0-investigation-preview.md +0 -0
  443. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260912-release-candidate-correctness-hardening.md +0 -0
  444. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/021/20260912-m0-findings-ui.md +0 -0
  445. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/022/20260909-dashboard-usability.md +0 -0
  446. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/026/20260920T094307Z-85c2ae2-atflows-b2.md +0 -0
  447. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/026/20260920T105859Z-atmem-234-stable.md +0 -0
  448. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/028/20260913-encrypted-evidence-access.md +0 -0
  449. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/029/2026-09-13-local-user-management.md +0 -0
  450. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/030/2026-09-13-portable-home.md +0 -0
  451. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/baseline.md +0 -0
  452. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/consistency-audit.md +0 -0
  453. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-benchmark.md +0 -0
  454. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-calibration.json +0 -0
  455. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-review.md +0 -0
  456. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-calibration-four-profile.json +0 -0
  457. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-calibration.json +0 -0
  458. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-nomination.md +0 -0
  459. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/matched-v2.md +0 -0
  460. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/numpy-benchmark.md +0 -0
  461. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/numpy-review.md +0 -0
  462. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/profiling.md +0 -0
  463. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/release-2.3.3.md +0 -0
  464. {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/README.md +0 -0
  465. {atmem-2.3.7b2 → atmem-2.3.8}/docs/invariants.md +0 -0
  466. {atmem-2.3.7b2 → atmem-2.3.8}/docs/memory-extraction.md +0 -0
  467. {atmem-2.3.7b2 → atmem-2.3.8}/docs/memory-interchange.md +0 -0
  468. {atmem-2.3.7b2 → atmem-2.3.8}/docs/multimodal-observations.md +0 -0
  469. {atmem-2.3.7b2 → atmem-2.3.8}/docs/onboarding.md +0 -0
  470. {atmem-2.3.7b2 → atmem-2.3.8}/docs/openclaw-setup.md +0 -0
  471. {atmem-2.3.7b2 → atmem-2.3.8}/docs/production-service.md +0 -0
  472. {atmem-2.3.7b2 → atmem-2.3.8}/docs/release-coordination.md +0 -0
  473. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v1.0.0.md +0 -0
  474. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.0.0.md +0 -0
  475. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.0.1.md +0 -0
  476. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.1.0.md +0 -0
  477. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.0.md +0 -0
  478. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.1.md +0 -0
  479. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.2.md +0 -0
  480. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.3.md +0 -0
  481. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.4.md +0 -0
  482. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.5.md +0 -0
  483. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6.md +0 -0
  484. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b1.md +0 -0
  485. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b10.md +0 -0
  486. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b11.md +0 -0
  487. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b2.md +0 -0
  488. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b3.md +0 -0
  489. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b4.md +0 -0
  490. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b5.md +0 -0
  491. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b8.md +0 -0
  492. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b9.md +0 -0
  493. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.0.md +0 -0
  494. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.0b1.md +0 -0
  495. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.1.md +0 -0
  496. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.2.md +0 -0
  497. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.3.md +0 -0
  498. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4.md +0 -0
  499. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4b1.md +0 -0
  500. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4b2.md +0 -0
  501. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.5.md +0 -0
  502. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.6.md +0 -0
  503. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.6b1.md +0 -0
  504. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.7b1.md +0 -0
  505. {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.7b2.md +0 -0
  506. {atmem-2.3.7b2 → atmem-2.3.8}/docs/retrieval-quality.md +0 -0
  507. {atmem-2.3.7b2 → atmem-2.3.8}/docs/security/production-threat-model.md +0 -0
  508. {atmem-2.3.7b2 → atmem-2.3.8}/docs/semantic-search.md +0 -0
  509. {atmem-2.3.7b2 → atmem-2.3.8}/docs/spec-kit.md +0 -0
  510. {atmem-2.3.7b2 → atmem-2.3.8}/docs/storage-performance.md +0 -0
  511. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/dashboard.md +0 -0
  512. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/evidence.md +0 -0
  513. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/examples.md +0 -0
  514. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/mcp.md +0 -0
  515. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/python.md +0 -0
  516. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/reference.md +0 -0
  517. {atmem-2.3.7b2 → atmem-2.3.8}/docs/website-contributing.md +0 -0
  518. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/index.ts +0 -0
  519. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/delegated-identity.ts +0 -0
  520. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/execution-spool.ts +0 -0
  521. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/rpc-client.ts +0 -0
  522. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/setup.ts +0 -0
  523. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/task-tools.ts +0 -0
  524. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-errors.ts +0 -0
  525. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-observations.ts +0 -0
  526. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-result-comparison.ts +0 -0
  527. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/types.ts +0 -0
  528. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/blackbox-diagnostics.mjs +0 -0
  529. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/dashboard-live.mjs +0 -0
  530. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
  531. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-identity.mjs +0 -0
  532. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-journey.mjs +0 -0
  533. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/execution-spool.mjs +0 -0
  534. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.7.1-2.json +0 -0
  535. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.8.1.json +0 -0
  536. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.2.json +0 -0
  537. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.3.json +0 -0
  538. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.4.json +0 -0
  539. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.5.json +0 -0
  540. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/hook-context-compat.mjs +0 -0
  541. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/hooks.mjs +0 -0
  542. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/lib/record-hook-context.mjs +0 -0
  543. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/manifest.mjs +0 -0
  544. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/setup.mjs +0 -0
  545. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/smoke.mjs +0 -0
  546. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/task-journey.mjs +0 -0
  547. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/task-tools.mjs +0 -0
  548. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/tool-observations.mjs +0 -0
  549. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/tool-result-comparison.mjs +0 -0
  550. {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/tsconfig.json +0 -0
  551. {atmem-2.3.7b2 → atmem-2.3.8}/setup.cfg +0 -0
  552. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_contracts.py +0 -0
  553. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_idempotency.py +0 -0
  554. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_upgrade.py +0 -0
  555. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atbot_companion.py +0 -0
  556. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atbot_service.py +0 -0
  557. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atflows_review.py +0 -0
  558. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_cli.py +0 -0
  559. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_contracts.py +0 -0
  560. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_external.py +0 -0
  561. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_memory_integrity_contracts.py +0 -0
  562. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_bun_runtime.py +0 -0
  563. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_cli.py +0 -0
  564. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_cli_guidance.py +0 -0
  565. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_contracts_v1.py +0 -0
  566. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_evidence.py +0 -0
  567. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_dashboard_daemon.py +0 -0
  568. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_control.py +0 -0
  569. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_transport.py +0 -0
  570. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_durability.py +0 -0
  571. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_execution_capture.py +0 -0
  572. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_execution_identity.py +0 -0
  573. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract.py +0 -0
  574. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_contracts.py +0 -0
  575. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_upgrade.py +0 -0
  576. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_feature_surfaces.py +0 -0
  577. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_forget_verification.py +0 -0
  578. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapter_conformance.py +0 -0
  579. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapter_packaging.py +0 -0
  580. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapters.py +0 -0
  581. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_delegated_adapters.py +0 -0
  582. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph.py +0 -0
  583. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_aliases.py +0 -0
  584. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_lifecycle.py +0 -0
  585. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_quality.py +0 -0
  586. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_home.py +0 -0
  587. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_host_adapter.py +0 -0
  588. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_incident_resolution.py +0 -0
  589. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_interchange.py +0 -0
  590. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_jev_lab.py +0 -0
  591. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_jev_service.py +0 -0
  592. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_langgraph_provider.py +0 -0
  593. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_layers.py +0 -0
  594. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_lifecycle.py +0 -0
  595. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_lifecycle_migration.py +0 -0
  596. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_local_identity.py +0 -0
  597. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_locking.py +0 -0
  598. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_maintenance.py +0 -0
  599. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_governance.py +0 -0
  600. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_observations.py +0 -0
  601. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_packaging.py +0 -0
  602. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_mem0_provider.py +0 -0
  603. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_memory.py +0 -0
  604. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding.py +0 -0
  605. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding_recovery.py +0 -0
  606. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_compat.py +0 -0
  607. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_install.py +0 -0
  608. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_topology.py +0 -0
  609. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_policy.py +0 -0
  610. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_processes.py +0 -0
  611. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_cli.py +0 -0
  612. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_integration.py +0 -0
  613. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_packaging.py +0 -0
  614. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_performance.py +0 -0
  615. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_runtime.py +0 -0
  616. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_server.py +0 -0
  617. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_pydantic_provider.py +0 -0
  618. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_recall_evidence.py +0 -0
  619. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_restore_receipt.py +0 -0
  620. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_benchmark.py +0 -0
  621. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_cache.py +0 -0
  622. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_graph_fusion.py +0 -0
  623. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_quality.py +0 -0
  624. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_signals_and_cache.py +0 -0
  625. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieve.py +0 -0
  626. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_sdk_packaging.py +0 -0
  627. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_health.py +0 -0
  628. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_matrix_cache.py +0 -0
  629. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_parity.py +0 -0
  630. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_policy_invalidation.py +0 -0
  631. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_profiles.py +0 -0
  632. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_rebuild.py +0 -0
  633. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_schema.py +0 -0
  634. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_search.py +0 -0
  635. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_setup.py +0 -0
  636. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_spec_task_inventory.py +0 -0
  637. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_storage_packaging.py +0 -0
  638. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_store_transactions.py +0 -0
  639. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_supporting_evidence.py +0 -0
  640. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_adapters.py +0 -0
  641. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_atbot.py +0 -0
  642. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_benchmark.py +0 -0
  643. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_binding.py +0 -0
  644. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_cli.py +0 -0
  645. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_clock.py +0 -0
  646. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_context.py +0 -0
  647. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_contracts.py +0 -0
  648. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_dashboard.py +0 -0
  649. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_deletion.py +0 -0
  650. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_expiry.py +0 -0
  651. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_governance.py +0 -0
  652. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_guards.py +0 -0
  653. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_host_boundary.py +0 -0
  654. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_host_contracts.py +0 -0
  655. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_observability.py +0 -0
  656. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_performance.py +0 -0
  657. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_policy.py +0 -0
  658. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_prerequisites.py +0 -0
  659. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_schemas.py +0 -0
  660. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_service.py +0 -0
  661. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_session_binding.py +0 -0
  662. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_store.py +0 -0
  663. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_tamper.py +0 -0
  664. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_upgrade.py +0 -0
  665. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_walking_skeleton.py +0 -0
  666. {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_website_docs.py +0 -0
  667. {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_core_hybrid.py +0 -0
  668. {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_numpy_cache.py +0 -0
  669. {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_storage.py +0 -0
  670. {atmem-2.3.7b2 → atmem-2.3.8}/tools/check_invariants.py +0 -0
  671. {atmem-2.3.7b2 → atmem-2.3.8}/tools/check_spec_tasks.py +0 -0
  672. {atmem-2.3.7b2 → atmem-2.3.8}/tools/release_metadata.py +0 -0
  673. {atmem-2.3.7b2 → atmem-2.3.8}/tools/run_longmemeval_retrieval.py +0 -0
  674. {atmem-2.3.7b2 → atmem-2.3.8}/tools/run_mem0_openclaw_live.py +0 -0
  675. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_atflows_delegated.py +0 -0
  676. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_delegated_package.py +0 -0
  677. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_delegated_transport.py +0 -0
  678. {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_mem0_roleplay.py +0 -0
  679. {atmem-2.3.7b2 → atmem-2.3.8}/tools/verify_audit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmem
3
- Version: 2.3.7b2
3
+ Version: 2.3.8
4
4
  Summary: Host-neutral Agent Black Box and reversible memory control plane.
5
5
  Author-email: Javad Taghia <taghia.javad@gmail.com>
6
6
  Maintainer-email: Aetna / AtMem <aetna000@gmail.com>
@@ -25,16 +25,23 @@ Requires-Python: >=3.10
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: atmem-atbot==0.1.0
28
- Requires-Dist: atflows==0.1.2
28
+ Requires-Dist: atflows==0.1.4b3
29
29
  Requires-Dist: cryptography<49,>=42
30
30
  Provides-Extra: atflows
31
31
  Provides-Extra: dev
32
32
  Requires-Dist: pytest>=8.0.0; extra == "dev"
33
+ Requires-Dist: numpy<3,>=1.26; extra == "dev"
34
+ Requires-Dist: PyYAML<7,>=6; extra == "dev"
35
+ Requires-Dist: jsonschema<5,>=4.23; extra == "dev"
36
+ Requires-Dist: certifi>=2024.2.2; extra == "dev"
37
+ Requires-Dist: loguru<1,>=0.7; extra == "dev"
33
38
  Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
34
39
  Provides-Extra: semantic
35
40
  Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
36
41
  Provides-Extra: semantic-accelerated
37
42
  Requires-Dist: numpy<3,>=1.26; extra == "semantic-accelerated"
43
+ Provides-Extra: encrypted
44
+ Requires-Dist: sqlcipher3==0.6.2; extra == "encrypted"
38
45
  Provides-Extra: mem0
39
46
  Requires-Dist: mem0ai<3,>=2.0.20; extra == "mem0"
40
47
  Provides-Extra: langgraph-provider
@@ -79,12 +86,17 @@ Dynamic: license-file
79
86
 
80
87
  # AtMem
81
88
 
82
- [![Version 2.3.7b2](https://img.shields.io/badge/version-2.3.7b2-blue)](./docs/releases/v2.3.7b2.md)
89
+ [![Version 2.3.8](https://img.shields.io/badge/version-2.3.8-blue)](./docs/releases/v2.3.8.md)
83
90
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
84
91
 
85
92
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
86
93
 
87
- > **Release status:** AtMem 2.3.6 remains the stable release. AtMem 2.3.7b2 is a Windows concurrency and durability prerelease; see its [release note](./docs/releases/v2.3.7b2.md). The stable [memory-integrity benchmark](./docs/benchmarks/memory-integrity.md) remains unchanged. AtFlows telemetry and read-only review leads remain separate and explicit.
94
+ > **AtMem 2.3.8:** Source-linked typed context, bounded evidence packing and
95
+ > one-command Hermes setup extend the existing governed continuity surface. The
96
+ > exact AtFlows companion is 0.1.4b3. See the [release note](./docs/releases/v2.3.8.md),
97
+ > [technical report](./docs/releases/v2.3.7-to-v2.3.8-technical-report.md), and
98
+ > [bounded evaluation evidence](./benchmarks/retrieval_quality/reports/five-percent-results-20261010.md).
99
+ > Previous benchmarks retain their tested-version provenance.
88
100
  > It records exact host-observed text and supported multimodal boundaries by default,
89
101
  > while keeping every claim limited to what the connected agent actually supplied.
90
102
 
@@ -101,7 +113,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
101
113
  ### 1. Install AtMem and choose memory intelligence
102
114
 
103
115
  ```bash
104
- python -m pip install --upgrade atmem==2.3.6
116
+ python -m pip install --upgrade atmem==2.3.8
105
117
  atmem atbot setup
106
118
  atmem atbot doctor
107
119
  atmem init
@@ -114,7 +126,26 @@ always-present local vector index. Do **not** install AtBot separately. During
114
126
  hosted provider, or the safe deterministic fallback. API keys stay in
115
127
  environment variables; AtMem does not save them.
116
128
 
117
- In 2.3.7b2, `pip install atmem` installs the Python packages only; pip does not
129
+ For encrypted local households, install the SQLCipher extra and verify the
130
+ runtime before migration:
131
+
132
+ ```bash
133
+ # Ubuntu/Debian first: sudo apt-get install libsqlcipher-dev build-essential
134
+ # Then install with the system SQLCipher headers and library:
135
+ CFLAGS="-I/usr/include/sqlcipher" LDFLAGS="-lsqlcipher" \
136
+ python -m pip install --upgrade 'atmem[encrypted]'
137
+
138
+ # macOS and Windows can install the extra directly:
139
+ python -m pip install --upgrade 'atmem[encrypted]'
140
+ atmem household status ~/.atmem/memories.db
141
+ atmem household migrate ~/.atmem/memories.db
142
+ ```
143
+
144
+ Stop every writer before migration. AtMem validates SQLite integrity,
145
+ SQLCipher page integrity and per-table row counts before the atomic cutover;
146
+ see [SaaS integration and recovery](docs/saas-integration.md#privacy-retention-and-deletion).
147
+
148
+ In 2.3.8, `pip install atmem` installs the Python packages only; pip does not
118
149
  run a post-install downloader. On the first `atmem init`, if compatible Bun is not
119
150
  already installed, AtMem clearly announces and downloads its pinned official
120
151
  Bun runtime for AtFlows, verifies the archive against a release-pinned SHA-256,
@@ -143,7 +174,7 @@ package yourself.
143
174
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
144
175
 
145
176
  ```bash
146
- python -m pip install --upgrade atmem==2.3.6
177
+ python -m pip install --upgrade atmem==2.3.8
147
178
  atmem openclaw upgrade
148
179
  atmem control verify
149
180
  ```
@@ -166,7 +197,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
166
197
  #### Pydantic AI — native capability
167
198
 
168
199
  ```bash
169
- python -m pip install 'atmem[pydantic-ai]==2.3.6'
200
+ python -m pip install 'atmem[pydantic-ai]==2.3.8'
170
201
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
171
202
  ```
172
203
 
@@ -191,7 +222,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
191
222
  #### LangChain/LangGraph — native middleware
192
223
 
193
224
  ```bash
194
- python -m pip install 'atmem[langgraph]==2.3.6'
225
+ python -m pip install 'atmem[langgraph]==2.3.8'
195
226
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
196
227
  ```
197
228
 
@@ -359,7 +390,7 @@ and restores it exactly.
359
390
  ## Installation details
360
391
 
361
392
  ```bash
362
- python -m pip install atmem==2.3.6
393
+ python -m pip install atmem==2.3.8
363
394
  atmem --version
364
395
  ```
365
396
 
@@ -369,7 +400,7 @@ embedding model, while the semantic extra adds local sentence-transformer
369
400
  choices:
370
401
 
371
402
  ```bash
372
- python -m pip install 'atmem[semantic]==2.3.6'
403
+ python -m pip install 'atmem[semantic]==2.3.8'
373
404
  ```
374
405
 
375
406
  For repository development, install both workspace packages:
@@ -478,7 +509,7 @@ evidence, activate AtMem, and return it to shadow.
478
509
  ## Dashboard
479
510
 
480
511
  ```bash
481
- atmem dashboard daemon start # http://127.0.0.1:8766/
512
+ atmem dashboard daemon start # http://127.0.0.1:8768/ on a new install; existing daemon ports are preserved
482
513
  atmem dashboard daemon open
483
514
  atmem dashboard daemon status
484
515
  atmem dashboard daemon restart
@@ -557,7 +588,7 @@ atmem control restore
557
588
  Existing 2.1 installations upgrade without starting a new migration:
558
589
 
559
590
  ```bash
560
- python -m pip install --upgrade atmem==2.3.6
591
+ python -m pip install --upgrade atmem==2.3.8
561
592
  atmem openclaw upgrade
562
593
  atmem control verify
563
594
  ```
@@ -689,7 +720,7 @@ atmem mcp --db ~/.atmem/memories.db --subject user-1
689
720
  ```
690
721
 
691
722
  MCP tools: `memory_remember`, `memory_observe`, `memory_recall`,
692
- `memory_recall_decision`,
723
+ `memory_recall_decision`, `memory_form_episode`,
693
724
  `memory_get_record`, `memory_get_source`, `memory_recall_block`,
694
725
  `memory_persona`, `memory_context_pack`, `memory_capture`, `memory_list`,
695
726
  `memory_forget`, `memory_forget_artifact`, `memory_promote`, `memory_audit`,
@@ -790,10 +821,11 @@ npm test
790
821
  npm run smoke
791
822
  ```
792
823
 
793
- The latest stable release is **2.3.6** with matching OpenClaw bridge source
794
- **2.3.6**. Release validation requires exact Python/bridge alignment; AtBot
795
- retains its independent stable compatible version **0.1.0** and AtFlows remains
796
- **0.1.2**.
824
+ The current source candidate is **2.3.8** with matching OpenClaw bridge source
825
+ **2.3.8**. Release validation requires exact Python/bridge alignment; AtBot
826
+ retains its independent compatible version **0.1.0** and the tested AtFlows pin
827
+ is **0.1.4b3**. The published package remains 2.3.7 until the candidate is
828
+ reviewed, tagged and registry-verified.
797
829
 
798
830
  ## License
799
831
 
@@ -1,11 +1,16 @@
1
1
  # AtMem
2
2
 
3
- [![Version 2.3.7b2](https://img.shields.io/badge/version-2.3.7b2-blue)](./docs/releases/v2.3.7b2.md)
3
+ [![Version 2.3.8](https://img.shields.io/badge/version-2.3.8-blue)](./docs/releases/v2.3.8.md)
4
4
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
5
5
 
6
6
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
7
7
 
8
- > **Release status:** AtMem 2.3.6 remains the stable release. AtMem 2.3.7b2 is a Windows concurrency and durability prerelease; see its [release note](./docs/releases/v2.3.7b2.md). The stable [memory-integrity benchmark](./docs/benchmarks/memory-integrity.md) remains unchanged. AtFlows telemetry and read-only review leads remain separate and explicit.
8
+ > **AtMem 2.3.8:** Source-linked typed context, bounded evidence packing and
9
+ > one-command Hermes setup extend the existing governed continuity surface. The
10
+ > exact AtFlows companion is 0.1.4b3. See the [release note](./docs/releases/v2.3.8.md),
11
+ > [technical report](./docs/releases/v2.3.7-to-v2.3.8-technical-report.md), and
12
+ > [bounded evaluation evidence](./benchmarks/retrieval_quality/reports/five-percent-results-20261010.md).
13
+ > Previous benchmarks retain their tested-version provenance.
9
14
  > It records exact host-observed text and supported multimodal boundaries by default,
10
15
  > while keeping every claim limited to what the connected agent actually supplied.
11
16
 
@@ -22,7 +27,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
22
27
  ### 1. Install AtMem and choose memory intelligence
23
28
 
24
29
  ```bash
25
- python -m pip install --upgrade atmem==2.3.6
30
+ python -m pip install --upgrade atmem==2.3.8
26
31
  atmem atbot setup
27
32
  atmem atbot doctor
28
33
  atmem init
@@ -35,7 +40,26 @@ always-present local vector index. Do **not** install AtBot separately. During
35
40
  hosted provider, or the safe deterministic fallback. API keys stay in
36
41
  environment variables; AtMem does not save them.
37
42
 
38
- In 2.3.7b2, `pip install atmem` installs the Python packages only; pip does not
43
+ For encrypted local households, install the SQLCipher extra and verify the
44
+ runtime before migration:
45
+
46
+ ```bash
47
+ # Ubuntu/Debian first: sudo apt-get install libsqlcipher-dev build-essential
48
+ # Then install with the system SQLCipher headers and library:
49
+ CFLAGS="-I/usr/include/sqlcipher" LDFLAGS="-lsqlcipher" \
50
+ python -m pip install --upgrade 'atmem[encrypted]'
51
+
52
+ # macOS and Windows can install the extra directly:
53
+ python -m pip install --upgrade 'atmem[encrypted]'
54
+ atmem household status ~/.atmem/memories.db
55
+ atmem household migrate ~/.atmem/memories.db
56
+ ```
57
+
58
+ Stop every writer before migration. AtMem validates SQLite integrity,
59
+ SQLCipher page integrity and per-table row counts before the atomic cutover;
60
+ see [SaaS integration and recovery](docs/saas-integration.md#privacy-retention-and-deletion).
61
+
62
+ In 2.3.8, `pip install atmem` installs the Python packages only; pip does not
39
63
  run a post-install downloader. On the first `atmem init`, if compatible Bun is not
40
64
  already installed, AtMem clearly announces and downloads its pinned official
41
65
  Bun runtime for AtFlows, verifies the archive against a release-pinned SHA-256,
@@ -64,7 +88,7 @@ package yourself.
64
88
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
65
89
 
66
90
  ```bash
67
- python -m pip install --upgrade atmem==2.3.6
91
+ python -m pip install --upgrade atmem==2.3.8
68
92
  atmem openclaw upgrade
69
93
  atmem control verify
70
94
  ```
@@ -87,7 +111,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
87
111
  #### Pydantic AI — native capability
88
112
 
89
113
  ```bash
90
- python -m pip install 'atmem[pydantic-ai]==2.3.6'
114
+ python -m pip install 'atmem[pydantic-ai]==2.3.8'
91
115
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
92
116
  ```
93
117
 
@@ -112,7 +136,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
112
136
  #### LangChain/LangGraph — native middleware
113
137
 
114
138
  ```bash
115
- python -m pip install 'atmem[langgraph]==2.3.6'
139
+ python -m pip install 'atmem[langgraph]==2.3.8'
116
140
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
117
141
  ```
118
142
 
@@ -280,7 +304,7 @@ and restores it exactly.
280
304
  ## Installation details
281
305
 
282
306
  ```bash
283
- python -m pip install atmem==2.3.6
307
+ python -m pip install atmem==2.3.8
284
308
  atmem --version
285
309
  ```
286
310
 
@@ -290,7 +314,7 @@ embedding model, while the semantic extra adds local sentence-transformer
290
314
  choices:
291
315
 
292
316
  ```bash
293
- python -m pip install 'atmem[semantic]==2.3.6'
317
+ python -m pip install 'atmem[semantic]==2.3.8'
294
318
  ```
295
319
 
296
320
  For repository development, install both workspace packages:
@@ -399,7 +423,7 @@ evidence, activate AtMem, and return it to shadow.
399
423
  ## Dashboard
400
424
 
401
425
  ```bash
402
- atmem dashboard daemon start # http://127.0.0.1:8766/
426
+ atmem dashboard daemon start # http://127.0.0.1:8768/ on a new install; existing daemon ports are preserved
403
427
  atmem dashboard daemon open
404
428
  atmem dashboard daemon status
405
429
  atmem dashboard daemon restart
@@ -478,7 +502,7 @@ atmem control restore
478
502
  Existing 2.1 installations upgrade without starting a new migration:
479
503
 
480
504
  ```bash
481
- python -m pip install --upgrade atmem==2.3.6
505
+ python -m pip install --upgrade atmem==2.3.8
482
506
  atmem openclaw upgrade
483
507
  atmem control verify
484
508
  ```
@@ -610,7 +634,7 @@ atmem mcp --db ~/.atmem/memories.db --subject user-1
610
634
  ```
611
635
 
612
636
  MCP tools: `memory_remember`, `memory_observe`, `memory_recall`,
613
- `memory_recall_decision`,
637
+ `memory_recall_decision`, `memory_form_episode`,
614
638
  `memory_get_record`, `memory_get_source`, `memory_recall_block`,
615
639
  `memory_persona`, `memory_context_pack`, `memory_capture`, `memory_list`,
616
640
  `memory_forget`, `memory_forget_artifact`, `memory_promote`, `memory_audit`,
@@ -711,10 +735,11 @@ npm test
711
735
  npm run smoke
712
736
  ```
713
737
 
714
- The latest stable release is **2.3.6** with matching OpenClaw bridge source
715
- **2.3.6**. Release validation requires exact Python/bridge alignment; AtBot
716
- retains its independent stable compatible version **0.1.0** and AtFlows remains
717
- **0.1.2**.
738
+ The current source candidate is **2.3.8** with matching OpenClaw bridge source
739
+ **2.3.8**. Release validation requires exact Python/bridge alignment; AtBot
740
+ retains its independent compatible version **0.1.0** and the tested AtFlows pin
741
+ is **0.1.4b3**. The published package remains 2.3.7 until the candidate is
742
+ reviewed, tagged and registry-verified.
718
743
 
719
744
  ## License
720
745
 
@@ -0,0 +1,5 @@
1
+ """Product-owned Hermes memory binding; does not import the Hermes runtime."""
2
+
3
+ from .binding import HermesMemoryBinding, RecallResult
4
+
5
+ __all__ = ["HermesMemoryBinding", "RecallResult"]
@@ -0,0 +1,85 @@
1
+ """AtMem Hermes directory plugin; the host needs no AtMem Python dependency."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+ import stat
6
+
7
+ from .client import HermesRPCClient
8
+ from .provider import create_provider
9
+
10
+
11
+ def _private_read(path, limit):
12
+ if os.name == "nt":
13
+ raise RuntimeError("native Windows credential ACL qualification is pending; use a qualified WSL installation")
14
+ descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) | os.O_NONBLOCK)
15
+ try:
16
+ info = os.fstat(descriptor)
17
+ if not stat.S_ISREG(info.st_mode) or info.st_uid != os.getuid() or info.st_mode & 0o077:
18
+ raise PermissionError("Hermes connection files must be owner-only regular files")
19
+ value = os.read(descriptor, limit + 1)
20
+ if len(value) > limit:
21
+ raise ValueError("Hermes connection file exceeds its size limit")
22
+ return value.decode("utf-8")
23
+ finally:
24
+ os.close(descriptor)
25
+
26
+
27
+ SETUP_HINT = ("AtMem local CLI preview: connection is unavailable. "
28
+ "Run atmem hermes status --hermes-home PATH for this profile. "
29
+ "Installation alone does not activate memory; keep the current provider selected.")
30
+
31
+
32
+ def _unavailable_provider():
33
+ from agent.memory_provider import MemoryProvider
34
+
35
+ class UnconfiguredAtMem(MemoryProvider):
36
+ name = "atmem"
37
+
38
+ def is_available(self):
39
+ return False
40
+
41
+ def unavailable_reason(self):
42
+ return SETUP_HINT
43
+
44
+ def initialize(self, session_id, **kwargs):
45
+ raise RuntimeError(SETUP_HINT)
46
+
47
+ def get_tool_schemas(self):
48
+ return []
49
+
50
+ def post_setup(self, hermes_home, config):
51
+ print(SETUP_HINT)
52
+
53
+ def get_status_config(self, config=None):
54
+ return {"available": False, "platform": "local CLI only", "setup": SETUP_HINT}
55
+
56
+ return UnconfiguredAtMem()
57
+
58
+
59
+ def _configured_provider():
60
+ home = Path(__file__).resolve().parents[2]
61
+ private = home / ".atmem"
62
+ if private.is_symlink():
63
+ raise PermissionError("Hermes connection directory cannot be a symbolic link")
64
+ info = private.stat()
65
+ if info.st_uid != os.getuid() or info.st_mode & 0o077:
66
+ raise PermissionError("Hermes connection directory must be owner-only")
67
+ config = json.loads(_private_read(private / "connection.json", 16384))
68
+ if not isinstance(config, dict):
69
+ raise ValueError("invalid connection")
70
+ if config.get("format") != "atmem-hermes-connection-v1":
71
+ raise ValueError("unsupported AtMem Hermes connection")
72
+ if Path(config["hermes_home"]).resolve() != home:
73
+ raise PermissionError("AtMem connection belongs to another Hermes profile")
74
+ client = HermesRPCClient(config["endpoint"], _private_read(private / "credential", 256).strip(),
75
+ profile_id=config["profile_id"], user_id=config.get("user_id"), timeout=10.0)
76
+ return create_provider(client, hermes_home=str(home))
77
+
78
+
79
+ def register(ctx):
80
+ try:
81
+ provider = _configured_provider() if os.name != "nt" else _unavailable_provider()
82
+ except Exception:
83
+ # Discovery must remain possible, but never echo credential/config data.
84
+ provider = _unavailable_provider()
85
+ ctx.register_memory_provider(provider)
@@ -0,0 +1,215 @@
1
+ """Fresh-recall authorization using the ordinary AtMem control plane.
2
+
3
+ This is the trusted service-side binding, not an HTTP authentication boundary.
4
+ The installer/service supplies identity; model tool arguments cannot change it.
5
+ It deliberately makes no claim about replayed Hermes conversation history.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass, replace
10
+ from datetime import datetime, timezone
11
+ import hashlib
12
+ from typing import Any
13
+
14
+ from atmem.adapters.base import AtMemAdapterIdentity
15
+ from atmem.core.canonical import canonical_json
16
+ from atmem.service import APIError, APIPrincipal, AtMemApplication
17
+
18
+
19
+ PROFILE = "authorized-at-recall-v1"
20
+
21
+
22
+ def _identifier(value: str, name: str) -> str:
23
+ if not isinstance(value, str) or not value.strip() or len(value) > 512:
24
+ raise ValueError(f"{name} must be a nonempty identifier of at most 512 characters")
25
+ if any(ord(char) < 32 for char in value):
26
+ raise ValueError(f"{name} contains a control character")
27
+ return value
28
+
29
+
30
+ @dataclass(frozen=True, slots=True)
31
+ class RecallResult:
32
+ context: str
33
+ reason: str
34
+ candidate_ids: tuple[str, ...] = ()
35
+ exposure_id: str | None = None
36
+ context_receipt_id: str | None = None
37
+ profile: str = PROFILE
38
+
39
+
40
+ class HermesMemoryBinding:
41
+ """One immutable administrator-selected identity, checked on each operation.
42
+
43
+ Constructed inactive. Enabling the binding does not activate the control
44
+ plane: both this explicit selection and AtMem's own active policy are needed.
45
+ No query/context cache is retained. Background scheduling belongs to the host
46
+ bridge; these methods return only after the product operation has finished.
47
+ """
48
+
49
+ def __init__(self, manager: Any, identity: AtMemAdapterIdentity, *,
50
+ profile_id: str, enabled: bool = False, influence: bool | None = None,
51
+ max_context_chars: int = 4096):
52
+ self.manager = manager
53
+ self.identity = replace(identity, framework="hermes")
54
+ self.profile_id = _identifier(profile_id, "profile_id")
55
+ for name in ("agent_id", "workspace_id", "subject_id"):
56
+ _identifier(getattr(identity, name), name)
57
+ if not identity.authenticated_user:
58
+ raise PermissionError("Hermes binding requires an authenticated operator identity")
59
+ if isinstance(max_context_chars, bool) or not isinstance(max_context_chars, int) or not 1 <= max_context_chars <= 4096:
60
+ raise ValueError("max_context_chars must be between 1 and 4096")
61
+ self.enabled = bool(enabled)
62
+ self.influence = self.enabled if influence is None else bool(influence)
63
+ self.max_context_chars = max_context_chars
64
+ self.application = AtMemApplication(manager)
65
+
66
+ def _scope(self) -> None:
67
+ """Topology, not request content, binds agent/subject/workspace."""
68
+ authority = getattr(self.manager, "authority_topology", None)
69
+ topology = authority() if callable(authority) else self.manager.agent_topology()
70
+ workspaces = topology.get("workspaces", [])
71
+ match = any(
72
+ row.get("workspace_id") == self.identity.workspace_id
73
+ and row.get("subject_id") == self.identity.subject_id
74
+ and self.identity.agent_id in (row.get("agent_ids") or [])
75
+ for row in workspaces
76
+ )
77
+ subject_rows = [row for row in workspaces if row.get("subject_id") == self.identity.subject_id]
78
+ agent_rows = [row for row in workspaces if self.identity.agent_id in (row.get("agent_ids") or [])]
79
+ if not match or len(subject_rows) != 1 or len(agent_rows) != 1:
80
+ raise PermissionError("Hermes binding no longer matches AtMem topology")
81
+
82
+ def _session(self, session_id: str) -> str:
83
+ value = [_identifier(self.profile_id, "profile_id"), _identifier(session_id, "session_id")]
84
+ return "hermes_" + hashlib.sha256(canonical_json(value).encode()).hexdigest()
85
+
86
+ def _run_id(self, session_id: str, turn_id: str) -> str:
87
+ session = self._session(session_id)
88
+ turn = _identifier(str(turn_id), "turn_id")
89
+ return "hermes_run_" + hashlib.sha256(
90
+ canonical_json([self.profile_id, session, turn]).encode()
91
+ ).hexdigest()
92
+
93
+ def record_event(self, event_type: str, *, session_id: str, turn_id: str,
94
+ payload: dict[str, Any], context_event_id: str | None = None,
95
+ context_receipt_id: str | None = None,
96
+ retrieval_id: str | None = None,
97
+ event_time: str | None = None) -> dict[str, Any] | None:
98
+ """Project a local Hermes turn into AtMem's ordinary session evidence."""
99
+ recorder = getattr(self.manager, "record_blackbox_event", None)
100
+ if not callable(recorder):
101
+ return None
102
+ session = self._session(session_id)
103
+ turn = _identifier(str(turn_id), "turn_id")
104
+ run_id = self._run_id(session_id, turn)
105
+ order = {
106
+ "turn.input": 1,
107
+ "context.disposition": 2,
108
+ "model.input": 3,
109
+ "model.output": 4,
110
+ "turn.ended": 5,
111
+ }
112
+ sequence = order.get(event_type)
113
+ if sequence is None:
114
+ raise ValueError("unsupported Hermes lifecycle event")
115
+ stable_event_id = "hermes_event_" + hashlib.sha256(
116
+ canonical_json([self.profile_id, session, turn, event_type]).encode()
117
+ ).hexdigest()
118
+ observed_at = event_time or datetime.now(timezone.utc).isoformat(
119
+ timespec="milliseconds"
120
+ ).replace("+00:00", "Z")
121
+ return recorder(
122
+ event_type=event_type, run_id=run_id, session_id=session,
123
+ turn_id=turn, agent_id=self.identity.agent_id,
124
+ workspace_id=self.identity.workspace_id,
125
+ subject_id=self.identity.subject_id,
126
+ context_event_id=context_event_id,
127
+ context_receipt_id=context_receipt_id,
128
+ retrieval_id=retrieval_id,
129
+ event_id=stable_event_id,
130
+ producer_instance_id=f"hermes:{self.profile_id}",
131
+ producer_epoch=run_id,
132
+ producer_sequence=sequence,
133
+ event_time=observed_at,
134
+ payload={key: value for key, value in payload.items() if value is not None},
135
+ )
136
+
137
+ def recall(self, query: str, *, session_id: str, turn_id: str) -> RecallResult:
138
+ if not self.enabled:
139
+ return RecallResult("", "inactive")
140
+ if not self.influence:
141
+ return RecallResult("", "withheld")
142
+ if not isinstance(query, str) or not query.strip() or len(query) > 65536:
143
+ return RecallResult("", "invalid_query")
144
+ try:
145
+ self._scope()
146
+ session = self._session(session_id)
147
+ turn = _identifier(turn_id, "turn_id")
148
+ run_id = self._run_id(session_id, turn)
149
+ prepared = self.manager.prepare(
150
+ query, allow_delegation=False, session_id=session,
151
+ host_run_id=run_id, turn_id=turn,
152
+ workspace_id=self.identity.workspace_id,
153
+ subject_id=self.identity.subject_id, agent_id=self.identity.agent_id,
154
+ max_chars=self.max_context_chars,
155
+ deterministic=True,
156
+ )
157
+ if not prepared.get("inject"):
158
+ # Shadow previews must never be returned as active context.
159
+ return RecallResult("", "withheld")
160
+ context = prepared.get("context")
161
+ if not isinstance(context, str) or not context:
162
+ return RecallResult("", "no_context")
163
+ if len(context) > self.max_context_chars:
164
+ return RecallResult("", "context_limit")
165
+ # Only fresh canonical preparation can supply bytes. Do not fall
166
+ # back to a previous successful recall if this operation fails.
167
+ return RecallResult(
168
+ context, "authorized",
169
+ tuple(str(value) for value in prepared.get("candidate_ids", [])),
170
+ prepared.get("exposure_id"), prepared.get("context_receipt_id"),
171
+ )
172
+ except (OSError, RuntimeError, ValueError, TypeError, PermissionError):
173
+ # Never disclose exception details (paths/queries/provider secrets)
174
+ # in a model-facing result. No successful-delivery receipt is made.
175
+ return RecallResult("", "unavailable_or_denied")
176
+
177
+ def observe_user(self, text: str, *, session_id: str, observation_id: str) -> dict[str, Any]:
178
+ """Persist an authenticated user's source via ordinary governed capture.
179
+
180
+ Assistant summaries and tool output are not authenticated user messages;
181
+ the host bridge must not feed them to this method as such.
182
+ """
183
+ if not self.enabled:
184
+ return {"captured": False, "reason": "inactive"}
185
+ self._scope()
186
+ if not isinstance(text, str) or not text.strip() or len(text) > 65536:
187
+ raise ValueError("user text must contain 1–65536 characters")
188
+ session = self._session(session_id)
189
+ observation = _identifier(observation_id, "observation_id")
190
+ key = hashlib.sha256(canonical_json([session, observation]).encode()).hexdigest()
191
+ principal = APIPrincipal(
192
+ principal_id=self.profile_id, role="agent",
193
+ subject_id=str(self.identity.subject_id), agent_id=self.identity.agent_id,
194
+ workspace_id=self.identity.workspace_id,
195
+ )
196
+ try:
197
+ return self.application.create_memory(
198
+ principal, text, idempotency_key=key, session_id=session,
199
+ )
200
+ except APIError:
201
+ raise
202
+ except Exception:
203
+ raise APIError("observation_uncertain", "inspect the observation receipt before retrying", status=409) from None
204
+
205
+ def status(self) -> dict[str, Any]:
206
+ return {
207
+ "profile": PROFILE, "enabled": self.enabled,
208
+ "mode": "active" if self.enabled and self.influence else
209
+ "shadow" if self.enabled else "inactive",
210
+ "profile_id": self.profile_id, "agent_id": self.identity.agent_id,
211
+ "workspace_id": self.identity.workspace_id,
212
+ "capture_coverage": "memory_operations_only",
213
+ "per_model_call_revalidation": False,
214
+ "previous_context_retraction": False,
215
+ }