atmem 2.2.6b2__tar.gz → 2.2.6b3__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 (214) hide show
  1. {atmem-2.2.6b2/atmem.egg-info → atmem-2.2.6b3}/PKG-INFO +41 -13
  2. {atmem-2.2.6b2 → atmem-2.2.6b3}/README.md +33 -12
  3. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/cli.py +121 -0
  4. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/mcp/server.py +1 -1
  5. atmem-2.2.6b3/atmem/provider_adapters/__init__.py +12 -0
  6. atmem-2.2.6b3/atmem/provider_adapters/langgraph.py +43 -0
  7. atmem-2.2.6b3/atmem/provider_adapters/lifecycle.py +268 -0
  8. atmem-2.2.6b3/atmem/provider_adapters/loading.py +23 -0
  9. atmem-2.2.6b3/atmem/provider_adapters/mem0.py +75 -0
  10. atmem-2.2.6b3/atmem/provider_adapters/models.py +132 -0
  11. atmem-2.2.6b3/atmem/provider_adapters/pydantic_ai.py +76 -0
  12. atmem-2.2.6b3/atmem/provider_adapters/runtime.py +142 -0
  13. atmem-2.2.6b3/atmem/provider_adapters/server.py +77 -0
  14. atmem-2.2.6b3/atmem/provider_adapters/signing.py +125 -0
  15. atmem-2.2.6b3/atmem/provider_adapters/worker.py +20 -0
  16. {atmem-2.2.6b2 → atmem-2.2.6b3/atmem.egg-info}/PKG-INFO +41 -13
  17. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/SOURCES.txt +22 -0
  18. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/requires.txt +10 -0
  19. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/capabilities.json +9 -2
  20. atmem-2.2.6b3/docs/context-provider-adapters.md +118 -0
  21. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/current-status.md +9 -4
  22. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/delegated-context-provider.md +13 -0
  23. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/openclaw-setup.md +2 -2
  24. atmem-2.2.6b3/docs/releases/v2.2.6b3.md +44 -0
  25. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/README.md +1 -1
  26. {atmem-2.2.6b2 → atmem-2.2.6b3}/pyproject.toml +11 -1
  27. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_documentation.py +2 -2
  28. atmem-2.2.6b3/tests/test_langgraph_provider.py +37 -0
  29. atmem-2.2.6b3/tests/test_mem0_provider.py +37 -0
  30. atmem-2.2.6b3/tests/test_provider_cli.py +56 -0
  31. atmem-2.2.6b3/tests/test_provider_integration.py +60 -0
  32. atmem-2.2.6b3/tests/test_provider_packaging.py +15 -0
  33. atmem-2.2.6b3/tests/test_provider_performance.py +32 -0
  34. atmem-2.2.6b3/tests/test_provider_runtime.py +79 -0
  35. atmem-2.2.6b3/tests/test_provider_server.py +85 -0
  36. atmem-2.2.6b3/tests/test_pydantic_provider.py +32 -0
  37. {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_installed_package.py +1 -1
  38. {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_upgrade_from_2_1.py +3 -3
  39. {atmem-2.2.6b2 → atmem-2.2.6b3}/LICENSE +0 -0
  40. {atmem-2.2.6b2 → atmem-2.2.6b3}/MANIFEST.in +0 -0
  41. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/__init__.py +0 -0
  42. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/__init__.py +0 -0
  43. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/base.py +0 -0
  44. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/langgraph.py +0 -0
  45. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/adapters/pydantic_ai.py +0 -0
  46. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/__init__.py +0 -0
  47. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/contracts.py +0 -0
  48. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/deterministic-v1.json +0 -0
  49. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
  50. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/data/thresholds-v1.json +0 -0
  51. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/external.py +0 -0
  52. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/profiles.py +0 -0
  53. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/benchmark/runner.py +0 -0
  54. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/__init__.py +0 -0
  55. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/models.py +0 -0
  56. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/contracts/versions.py +0 -0
  57. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/__init__.py +0 -0
  58. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.css +0 -0
  59. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.html +0 -0
  60. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/app.js +0 -0
  61. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/assets/atmem.jpg +0 -0
  62. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/atbot_companion.py +0 -0
  63. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/atbot_service.py +0 -0
  64. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/blackbox.py +0 -0
  65. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/compat.py +0 -0
  66. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/evidence.py +0 -0
  67. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/hosts.py +0 -0
  68. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/manager.py +0 -0
  69. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/models.py +0 -0
  70. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/openclaw_native.py +0 -0
  71. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/openclaw_topology.py +0 -0
  72. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/server.py +0 -0
  73. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/state.py +0 -0
  74. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/store.py +0 -0
  75. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/topology.py +0 -0
  76. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/ui.py +0 -0
  77. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/verify.py +0 -0
  78. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/control/web.py +0 -0
  79. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/__init__.py +0 -0
  80. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/canonical.py +0 -0
  81. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/fact_keys.py +0 -0
  82. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/keys.py +0 -0
  83. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/policy.py +0 -0
  84. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/core/storage.py +0 -0
  85. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/dashboard_daemon.py +0 -0
  86. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/__init__.py +0 -0
  87. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/canonical.py +0 -0
  88. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/client.py +0 -0
  89. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/config.py +0 -0
  90. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/contracts.py +0 -0
  91. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/service.py +0 -0
  92. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/delegated/validation.py +0 -0
  93. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/extract/__init__.py +0 -0
  94. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/extract/rules.py +0 -0
  95. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/graph.py +0 -0
  96. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/investigate.py +0 -0
  97. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/maintenance.py +0 -0
  98. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/mcp/__init__.py +0 -0
  99. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/media.py +0 -0
  100. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/memory.py +0 -0
  101. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/openclaw_install.py +0 -0
  102. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/__init__.py +0 -0
  103. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/rank.py +0 -0
  104. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/retrieve/support.py +0 -0
  105. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/__init__.py +0 -0
  106. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
  107. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
  108. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/capabilities.json +0 -0
  109. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/context-package.json +0 -0
  110. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/memory-proposal.json +0 -0
  111. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/recall-request.json +0 -0
  112. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/scope.json +0 -0
  113. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/schemas/v1/source-capture.json +0 -0
  114. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/__init__.py +0 -0
  115. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/index.py +0 -0
  116. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/semantic/providers.py +0 -0
  117. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/store/__init__.py +0 -0
  118. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem/store/sqlite.py +0 -0
  119. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/dependency_links.txt +0 -0
  120. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/entry_points.txt +0 -0
  121. {atmem-2.2.6b2 → atmem-2.2.6b3}/atmem.egg-info/top_level.txt +0 -0
  122. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/agent-blackbox.md +0 -0
  123. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/atbot-release.md +0 -0
  124. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/audit-log-spec.md +0 -0
  125. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/audit-search.md +0 -0
  126. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/auditing-guide.md +0 -0
  127. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/benchmarks.md +0 -0
  128. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
  129. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
  130. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
  131. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
  132. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
  133. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1.md +0 -0
  134. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
  135. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
  136. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/control-plane.md +0 -0
  137. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/dashboard-design-language.md +0 -0
  138. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/data-storage-and-backup.md +0 -0
  139. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/benchmark-deterministic-v1.json +0 -0
  140. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
  141. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
  142. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/framework-adapters.md +0 -0
  143. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/generic-adapter.md +0 -0
  144. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/integration-guide.md +0 -0
  145. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/multimodal-observations.md +0 -0
  146. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v1.0.0.md +0 -0
  147. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.0.0.md +0 -0
  148. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.0.1.md +0 -0
  149. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.1.0.md +0 -0
  150. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.0.md +0 -0
  151. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.1.md +0 -0
  152. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.2.md +0 -0
  153. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.3.md +0 -0
  154. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.4.md +0 -0
  155. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.5.md +0 -0
  156. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.6b1.md +0 -0
  157. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/releases/v2.2.6b2.md +0 -0
  158. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/saas-integration.md +0 -0
  159. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/semantic-search.md +0 -0
  160. {atmem-2.2.6b2 → atmem-2.2.6b3}/docs/spec-kit.md +0 -0
  161. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/index.ts +0 -0
  162. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/openclaw.plugin.json +0 -0
  163. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/package-lock.json +0 -0
  164. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/package.json +0 -0
  165. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/rpc-client.ts +0 -0
  166. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/setup.ts +0 -0
  167. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/src/types.ts +0 -0
  168. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
  169. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/hooks.mjs +0 -0
  170. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/setup.mjs +0 -0
  171. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/test/smoke.mjs +0 -0
  172. {atmem-2.2.6b2 → atmem-2.2.6b3}/integrations/openclaw/tsconfig.json +0 -0
  173. {atmem-2.2.6b2 → atmem-2.2.6b3}/setup.cfg +0 -0
  174. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_atbot_companion.py +0 -0
  175. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_atbot_service.py +0 -0
  176. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_auditability.py +0 -0
  177. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_cli.py +0 -0
  178. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_contracts.py +0 -0
  179. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_external.py +0 -0
  180. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_benchmark_runner.py +0 -0
  181. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_blackbox.py +0 -0
  182. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_cli.py +0 -0
  183. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_cli_guidance.py +0 -0
  184. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_contracts_v1.py +0 -0
  185. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_evidence.py +0 -0
  186. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_plane.py +0 -0
  187. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_control_verify.py +0 -0
  188. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_dashboard_daemon.py +0 -0
  189. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_delegated_context.py +0 -0
  190. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_delegated_control.py +0 -0
  191. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_encryption.py +0 -0
  192. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_extract.py +0 -0
  193. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_framework_adapters.py +0 -0
  194. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_generic_control.py +0 -0
  195. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_graph.py +0 -0
  196. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_host_adapter.py +0 -0
  197. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_layers.py +0 -0
  198. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_maintenance.py +0 -0
  199. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_mcp.py +0 -0
  200. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_media_observations.py +0 -0
  201. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_memory.py +0 -0
  202. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_control.py +0 -0
  203. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_install.py +0 -0
  204. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_openclaw_topology.py +0 -0
  205. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_policy.py +0 -0
  206. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_recall_evidence.py +0 -0
  207. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_restore_receipt.py +0 -0
  208. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_retrieve.py +0 -0
  209. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_semantic_search.py +0 -0
  210. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_store_transactions.py +0 -0
  211. {atmem-2.2.6b2 → atmem-2.2.6b3}/tests/test_supporting_evidence.py +0 -0
  212. {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/run_longmemeval_retrieval.py +0 -0
  213. {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/smoke_delegated_package.py +0 -0
  214. {atmem-2.2.6b2 → atmem-2.2.6b3}/tools/verify_audit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmem
3
- Version: 2.2.6b2
3
+ Version: 2.2.6b3
4
4
  Summary: Host-neutral Agent Black Box and reversible memory control plane.
5
5
  Author-email: aetna000 <aetna000@gmail.com>
6
6
  Maintainer-email: aetna000 <aetna000@gmail.com>
@@ -31,6 +31,13 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
31
31
  Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
32
32
  Provides-Extra: semantic
33
33
  Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
34
+ Provides-Extra: mem0
35
+ Requires-Dist: mem0ai<2,>=1; extra == "mem0"
36
+ Provides-Extra: langgraph-provider
37
+ Requires-Dist: langgraph<2,>=1.1.5; extra == "langgraph-provider"
38
+ Provides-Extra: pydantic-provider
39
+ Requires-Dist: pydantic-ai-slim<3,>=2.0; extra == "pydantic-provider"
40
+ Requires-Dist: pydantic<3,>=2.0; extra == "pydantic-provider"
34
41
  Provides-Extra: atbot
35
42
  Provides-Extra: pydantic-ai
36
43
  Requires-Dist: pydantic-ai-slim<3,>=2.0; extra == "pydantic-ai"
@@ -45,7 +52,7 @@ Dynamic: license-file
45
52
 
46
53
  # AtMem
47
54
 
48
- [![Version 2.2.6b2](https://img.shields.io/badge/version-2.2.6b2-blue)](./docs/releases/v2.2.6b2.md)
55
+ [![Version 2.2.6b3](https://img.shields.io/badge/version-2.2.6b3-blue)](./docs/releases/v2.2.6b3.md)
49
56
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
50
57
 
51
58
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
@@ -60,7 +67,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
60
67
  ### 1. Install AtMem and choose memory intelligence
61
68
 
62
69
  ```bash
63
- python -m pip install --pre --upgrade atmem==2.2.6b2
70
+ python -m pip install --pre --upgrade atmem==2.2.6b3
64
71
  atmem atbot setup
65
72
  atmem atbot doctor
66
73
  atmem dashboard
@@ -88,7 +95,7 @@ connection. Do not install the npm package yourself.
88
95
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
89
96
 
90
97
  ```bash
91
- python -m pip install --pre --upgrade atmem==2.2.6b2
98
+ python -m pip install --pre --upgrade atmem==2.2.6b3
92
99
  atmem openclaw upgrade
93
100
  atmem control verify
94
101
  ```
@@ -111,7 +118,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
111
118
  #### Pydantic AI — native capability
112
119
 
113
120
  ```bash
114
- python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b2'
121
+ python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b3'
115
122
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
116
123
  ```
117
124
 
@@ -135,7 +142,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
135
142
  #### LangChain/LangGraph — native middleware
136
143
 
137
144
  ```bash
138
- python -m pip install --pre 'atmem[langgraph]==2.2.6b2'
145
+ python -m pip install --pre 'atmem[langgraph]==2.2.6b3'
139
146
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
140
147
  ```
141
148
 
@@ -192,7 +199,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
192
199
  capture and hybrid ranking. Memory authority and agent operation do not depend
193
200
  on a hosted model.
194
201
 
195
- > **Release status:** this repository describes **AtMem 2.2.6b2**. AtBot is a
202
+ > **Release status:** this repository describes **AtMem 2.2.6b3**. AtBot is a
196
203
  > separately packaged, headless component installed and managed by AtMem; it is
197
204
  > not an independent agent or a second memory authority.
198
205
 
@@ -217,6 +224,27 @@ run native retrieval after an accepted delegated decision. Provider failure
217
224
  withholds context unless the operator explicitly registered native fallback.
218
225
  See the [delegated context-provider guide](docs/delegated-context-provider.md).
219
226
 
227
+ AtMem also ships provider-side adapters, each as an independent optional extra:
228
+
229
+ ```bash
230
+ # Mem0 chooses context; AtMem verifies and records delivery
231
+ python -m pip install 'atmem[mem0]'
232
+ atmem provider init mem0-local --kind mem0 --mode oss --port 8788
233
+
234
+ # Or use an application-owned LangGraph / Pydantic AI factory
235
+ python -m pip install 'atmem[langgraph-provider]'
236
+ atmem provider init graph-context --kind langgraph \
237
+ --factory myapp.memory_graph:build_graph --port 8789
238
+
239
+ python -m pip install 'atmem[pydantic-provider]'
240
+ atmem provider init ai-context --kind pydantic-ai \
241
+ --factory myapp.memory_agent:build_agent --port 8790
242
+ ```
243
+
244
+ `atmem provider init` creates private signing material and prints the exact
245
+ registration command; it does not enable delegated authority. See the
246
+ [context-provider adapter quick starts](docs/context-provider-adapters.md).
247
+
220
248
  It gives agent runtimes one governed memory source and one tamper-evident record
221
249
  of what the host observed: memory considered and injected, model boundaries,
222
250
  tool requests and completions, turn termination, and linked external outcome
@@ -232,7 +260,7 @@ and restores it exactly.
232
260
  ## Installation details
233
261
 
234
262
  ```bash
235
- python -m pip install --pre atmem==2.2.6b2
263
+ python -m pip install --pre atmem==2.2.6b3
236
264
  atmem --version
237
265
  ```
238
266
 
@@ -240,7 +268,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
240
268
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
241
269
 
242
270
  ```bash
243
- python -m pip install --pre 'atmem[semantic]==2.2.6b2'
271
+ python -m pip install --pre 'atmem[semantic]==2.2.6b3'
244
272
  ```
245
273
 
246
274
  For repository development, install both workspace packages:
@@ -420,7 +448,7 @@ atmem control restore
420
448
  Existing 2.1 installations upgrade without starting a new migration:
421
449
 
422
450
  ```bash
423
- python -m pip install --pre --upgrade atmem==2.2.6b2
451
+ python -m pip install --pre --upgrade atmem==2.2.6b3
424
452
  atmem openclaw upgrade
425
453
  atmem control verify
426
454
  ```
@@ -572,9 +600,9 @@ npm test
572
600
  npm run smoke
573
601
  ```
574
602
 
575
- Current repository metadata is version **2.2.6b2**. Python and npm release
576
- versions are intentionally kept equal because the OpenClaw installer pins the
577
- matching bridge.
603
+ Current repository metadata is version **2.2.6b3**. The installer pins the
604
+ compatible OpenClaw bridge independently; provider-only Python releases do not
605
+ force an unnecessary npm publication.
578
606
 
579
607
  ## License
580
608
 
@@ -1,6 +1,6 @@
1
1
  # AtMem
2
2
 
3
- [![Version 2.2.6b2](https://img.shields.io/badge/version-2.2.6b2-blue)](./docs/releases/v2.2.6b2.md)
3
+ [![Version 2.2.6b3](https://img.shields.io/badge/version-2.2.6b3-blue)](./docs/releases/v2.2.6b3.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.**
@@ -15,7 +15,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
15
15
  ### 1. Install AtMem and choose memory intelligence
16
16
 
17
17
  ```bash
18
- python -m pip install --pre --upgrade atmem==2.2.6b2
18
+ python -m pip install --pre --upgrade atmem==2.2.6b3
19
19
  atmem atbot setup
20
20
  atmem atbot doctor
21
21
  atmem dashboard
@@ -43,7 +43,7 @@ connection. Do not install the npm package yourself.
43
43
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
44
44
 
45
45
  ```bash
46
- python -m pip install --pre --upgrade atmem==2.2.6b2
46
+ python -m pip install --pre --upgrade atmem==2.2.6b3
47
47
  atmem openclaw upgrade
48
48
  atmem control verify
49
49
  ```
@@ -66,7 +66,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
66
66
  #### Pydantic AI — native capability
67
67
 
68
68
  ```bash
69
- python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b2'
69
+ python -m pip install --pre 'atmem[pydantic-ai]==2.2.6b3'
70
70
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
71
71
  ```
72
72
 
@@ -90,7 +90,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
90
90
  #### LangChain/LangGraph — native middleware
91
91
 
92
92
  ```bash
93
- python -m pip install --pre 'atmem[langgraph]==2.2.6b2'
93
+ python -m pip install --pre 'atmem[langgraph]==2.2.6b3'
94
94
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
95
95
  ```
96
96
 
@@ -147,7 +147,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
147
147
  capture and hybrid ranking. Memory authority and agent operation do not depend
148
148
  on a hosted model.
149
149
 
150
- > **Release status:** this repository describes **AtMem 2.2.6b2**. AtBot is a
150
+ > **Release status:** this repository describes **AtMem 2.2.6b3**. AtBot is a
151
151
  > separately packaged, headless component installed and managed by AtMem; it is
152
152
  > not an independent agent or a second memory authority.
153
153
 
@@ -172,6 +172,27 @@ run native retrieval after an accepted delegated decision. Provider failure
172
172
  withholds context unless the operator explicitly registered native fallback.
173
173
  See the [delegated context-provider guide](docs/delegated-context-provider.md).
174
174
 
175
+ AtMem also ships provider-side adapters, each as an independent optional extra:
176
+
177
+ ```bash
178
+ # Mem0 chooses context; AtMem verifies and records delivery
179
+ python -m pip install 'atmem[mem0]'
180
+ atmem provider init mem0-local --kind mem0 --mode oss --port 8788
181
+
182
+ # Or use an application-owned LangGraph / Pydantic AI factory
183
+ python -m pip install 'atmem[langgraph-provider]'
184
+ atmem provider init graph-context --kind langgraph \
185
+ --factory myapp.memory_graph:build_graph --port 8789
186
+
187
+ python -m pip install 'atmem[pydantic-provider]'
188
+ atmem provider init ai-context --kind pydantic-ai \
189
+ --factory myapp.memory_agent:build_agent --port 8790
190
+ ```
191
+
192
+ `atmem provider init` creates private signing material and prints the exact
193
+ registration command; it does not enable delegated authority. See the
194
+ [context-provider adapter quick starts](docs/context-provider-adapters.md).
195
+
175
196
  It gives agent runtimes one governed memory source and one tamper-evident record
176
197
  of what the host observed: memory considered and injected, model boundaries,
177
198
  tool requests and completions, turn termination, and linked external outcome
@@ -187,7 +208,7 @@ and restores it exactly.
187
208
  ## Installation details
188
209
 
189
210
  ```bash
190
- python -m pip install --pre atmem==2.2.6b2
211
+ python -m pip install --pre atmem==2.2.6b3
191
212
  atmem --version
192
213
  ```
193
214
 
@@ -195,7 +216,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
195
216
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
196
217
 
197
218
  ```bash
198
- python -m pip install --pre 'atmem[semantic]==2.2.6b2'
219
+ python -m pip install --pre 'atmem[semantic]==2.2.6b3'
199
220
  ```
200
221
 
201
222
  For repository development, install both workspace packages:
@@ -375,7 +396,7 @@ atmem control restore
375
396
  Existing 2.1 installations upgrade without starting a new migration:
376
397
 
377
398
  ```bash
378
- python -m pip install --pre --upgrade atmem==2.2.6b2
399
+ python -m pip install --pre --upgrade atmem==2.2.6b3
379
400
  atmem openclaw upgrade
380
401
  atmem control verify
381
402
  ```
@@ -527,9 +548,9 @@ npm test
527
548
  npm run smoke
528
549
  ```
529
550
 
530
- Current repository metadata is version **2.2.6b2**. Python and npm release
531
- versions are intentionally kept equal because the OpenClaw installer pins the
532
- matching bridge.
551
+ Current repository metadata is version **2.2.6b3**. The installer pins the
552
+ compatible OpenClaw bridge independently; provider-only Python releases do not
553
+ force an unnecessary npm publication.
533
554
 
534
555
  ## License
535
556
 
@@ -256,6 +256,59 @@ wants AtMem to resume native context preparation when the provider fails.""",
256
256
  command_parser = delegated_commands.add_parser(name, help=help_text)
257
257
  command_parser.add_argument("--json", action="store_true")
258
258
 
259
+ provider_parser = subparsers.add_parser(
260
+ "provider",
261
+ help="Run an optional Mem0, LangGraph, or Pydantic AI context authority",
262
+ description=(
263
+ "Create a signed local context-provider service. Initialization and startup "
264
+ "do not change AtMem authority; registration and enablement remain explicit."
265
+ ),
266
+ formatter_class=argparse.RawDescriptionHelpFormatter,
267
+ epilog="""Examples:
268
+ python -m pip install 'atmem[mem0]'
269
+ atmem provider init memory-provider --kind mem0 --mode oss --port 8788
270
+ atmem provider start memory-provider
271
+ atmem provider doctor memory-provider
272
+
273
+ python -m pip install 'atmem[langgraph-provider]'
274
+ atmem provider init graph-provider --kind langgraph \
275
+ --factory myapp.context:build_graph --port 8789
276
+
277
+ python -m pip install 'atmem[pydantic-provider]'
278
+ atmem provider init ai-provider --kind pydantic-ai \
279
+ --factory myapp.context:build_agent --egress hosted --port 8790
280
+
281
+ The init result prints the separate `atmem delegated register` command. Run its
282
+ matching `atmem delegated enable` command only after reviewing the exact scopes.""",
283
+ )
284
+ provider_commands = provider_parser.add_subparsers(dest="provider_command")
285
+ provider_init = provider_commands.add_parser("init", help="Create private keys and secret-free configuration")
286
+ provider_init.add_argument("instance")
287
+ provider_init.add_argument("--kind", required=True, choices=("mem0", "langgraph", "pydantic-ai"))
288
+ provider_init.add_argument("--port", type=int, default=8788)
289
+ provider_init.add_argument("--factory", default=None, help="Operator factory in module:attribute form")
290
+ provider_init.add_argument("--mode", choices=("oss", "platform"), default=None, help="Mem0 client mode")
291
+ provider_init.add_argument("--provider-id", default=None)
292
+ provider_init.add_argument("--provider-version", default="1.0")
293
+ provider_init.add_argument("--egress", choices=("local", "hosted"), default="local")
294
+ provider_init.add_argument("--json", action="store_true")
295
+ for name, help_text in (
296
+ ("serve", "Run one provider in the foreground"),
297
+ ("start", "Start one private background provider process"),
298
+ ("stop", "Stop only the PID owned by this provider instance"),
299
+ ("doctor", "Check dependencies, files, service health, and next trust step"),
300
+ ):
301
+ command_parser = provider_commands.add_parser(name, help=help_text)
302
+ command_parser.add_argument("instance")
303
+ command_parser.add_argument("--json", action="store_true")
304
+ provider_status = provider_commands.add_parser("status", help="Show redacted provider state")
305
+ provider_status.add_argument("instance", nargs="?")
306
+ provider_status.add_argument("--json", action="store_true")
307
+ provider_remove = provider_commands.add_parser("remove", help="Remove a stopped provider; AtMem evidence is retained")
308
+ provider_remove.add_argument("instance")
309
+ provider_remove.add_argument("--yes", action="store_true")
310
+ provider_remove.add_argument("--json", action="store_true")
311
+
259
312
  benchmark_parser = subparsers.add_parser(
260
313
  "benchmark",
261
314
  help="Run reproducible memory-quality gates and compare external results",
@@ -885,6 +938,13 @@ External evaluation:
885
938
  _run_delegated(args)
886
939
  return
887
940
 
941
+ if args.command == "provider":
942
+ if args.provider_command is None:
943
+ provider_parser.print_help()
944
+ return
945
+ _run_provider(args)
946
+ return
947
+
888
948
  if args.command == "benchmark":
889
949
  if args.benchmark_command is None:
890
950
  benchmark_parser.print_help()
@@ -2040,6 +2100,67 @@ def _run_delegated(args: argparse.Namespace) -> None:
2040
2100
  print(f"Removed {result['registration_id']}")
2041
2101
  else:
2042
2102
  print(json.dumps(result, indent=2, sort_keys=True, default=str))
2103
+
2104
+
2105
+ def _run_provider(args: argparse.Namespace) -> None:
2106
+ from atmem.provider_adapters import lifecycle
2107
+
2108
+ command = args.provider_command
2109
+ try:
2110
+ if command == "init":
2111
+ result = lifecycle.initialize(
2112
+ instance=args.instance, kind=args.kind, port=args.port,
2113
+ factory=args.factory, mode=args.mode, provider_id=args.provider_id,
2114
+ provider_version=args.provider_version, egress=args.egress,
2115
+ )
2116
+ elif command == "serve":
2117
+ from atmem.provider_adapters.server import serve
2118
+
2119
+ _, config = lifecycle.load_config(args.instance)
2120
+ serve(lifecycle.build_runtime(args.instance), config["host"], config["port"])
2121
+ return
2122
+ elif command == "start":
2123
+ result = lifecycle.start(args.instance)
2124
+ elif command == "stop":
2125
+ result = lifecycle.stop(args.instance)
2126
+ elif command == "doctor":
2127
+ result = lifecycle.doctor(args.instance)
2128
+ elif command == "status":
2129
+ if args.instance:
2130
+ result = lifecycle.status(args.instance)
2131
+ else:
2132
+ root = lifecycle.provider_root()
2133
+ result = {
2134
+ "format": "atmem-provider-status-list-v1",
2135
+ "providers": [
2136
+ lifecycle.status(path.name)
2137
+ for path in sorted(root.iterdir())
2138
+ if path.is_dir() and not path.is_symlink()
2139
+ ] if root.is_dir() else [],
2140
+ }
2141
+ elif command == "remove":
2142
+ if not args.yes:
2143
+ raise ValueError("provider removal requires --yes")
2144
+ result = lifecycle.remove(args.instance)
2145
+ else: # pragma: no cover
2146
+ raise ValueError(f"unknown provider command: {command}")
2147
+ except (ImportError, OSError, RuntimeError, ValueError) as exc:
2148
+ print(f"error: {exc}", file=sys.stderr)
2149
+ raise SystemExit(2) from exc
2150
+ if getattr(args, "json", False):
2151
+ print(json.dumps(result, indent=2, sort_keys=True, default=str))
2152
+ return
2153
+ if command == "init":
2154
+ print(f"Created provider {result['instance']} (authority remains native AtMem).")
2155
+ print("Start it:")
2156
+ print(f" atmem provider start {result['instance']}")
2157
+ print("Register exact trust scopes (still disabled):")
2158
+ print(f" {result['registration_command']}")
2159
+ print(f"Then review and enable: atmem delegated enable {result['provider_id']}:{result['instance']}")
2160
+ else:
2161
+ print(json.dumps(result, indent=2, sort_keys=True, default=str))
2162
+
2163
+
2043
2164
  def _interactive_atbot_setup(manager: Any) -> dict[str, Any]:
2044
2165
  from atmem.control.atbot_service import PROVIDER_PROFILES
2045
2166
 
@@ -26,7 +26,7 @@ try:
26
26
 
27
27
  SERVER_VERSION = _pkg_version("atmem")
28
28
  except Exception: # not installed (e.g. run from a checkout)
29
- SERVER_VERSION = "2.2.6b2"
29
+ SERVER_VERSION = "2.2.6b3"
30
30
 
31
31
  _SUBJECT_PROPERTY = {
32
32
  "subject_id": {
@@ -0,0 +1,12 @@
1
+ """Optional context-provider adapters for AtMem's delegated v1 contract."""
2
+
3
+ from .models import ContextItem, ProviderProposal, ProviderRequest, ProviderRuntimeIdentity
4
+ from .runtime import ProviderRuntime
5
+
6
+ __all__ = [
7
+ "ContextItem",
8
+ "ProviderProposal",
9
+ "ProviderRequest",
10
+ "ProviderRuntime",
11
+ "ProviderRuntimeIdentity",
12
+ ]
@@ -0,0 +1,43 @@
1
+ """LangGraph-backed delegated context provider."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import inspect
6
+ from typing import Any
7
+
8
+ from .models import ProviderProposal, ProviderRequest
9
+
10
+
11
+ class LangGraphContextProvider:
12
+ def __init__(self, graph: Any):
13
+ self.graph = graph
14
+ self.attribution = {"adapter": "langgraph"}
15
+
16
+ async def decide(self, request: ProviderRequest) -> ProviderProposal:
17
+ graph_input = {"delegated_request": {
18
+ "query": request.query,
19
+ "query_sha256": request.query_sha256,
20
+ "binding": request.binding.to_dict(),
21
+ "max_context_bytes": request.max_context_bytes,
22
+ "deadline": request.deadline,
23
+ }}
24
+ config = {"configurable": {"thread_id": f"{request.binding.session_id}:{request.binding.turn_id}"}}
25
+ if hasattr(self.graph, "ainvoke"):
26
+ output = await self.graph.ainvoke(graph_input, config=dict(config))
27
+ elif hasattr(self.graph, "invoke"):
28
+ output = self.graph.invoke(graph_input, config=dict(config))
29
+ if inspect.isawaitable(output):
30
+ output = await output
31
+ elif callable(self.graph):
32
+ output = self.graph(graph_input, dict(config))
33
+ if inspect.isawaitable(output):
34
+ output = await output
35
+ else:
36
+ raise ValueError("LangGraph provider requires an invokable graph or callable")
37
+ interrupts = getattr(output, "interrupts", ())
38
+ if interrupts:
39
+ raise ValueError("LangGraph interrupted before a context decision")
40
+ value = getattr(output, "value", output)
41
+ if not isinstance(value, dict) or set(value) != {"context_decision"}:
42
+ raise ValueError("LangGraph output must contain only context_decision")
43
+ return ProviderProposal.from_dict(value["context_decision"])