atmem 2.2.0__tar.gz → 2.2.3__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 (146) hide show
  1. {atmem-2.2.0/atmem.egg-info → atmem-2.2.3}/PKG-INFO +127 -14
  2. {atmem-2.2.0 → atmem-2.2.3}/README.md +125 -12
  3. {atmem-2.2.0 → atmem-2.2.3}/atmem/adapters/pydantic_ai.py +2 -2
  4. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/atbot_service.py +1 -1
  5. {atmem-2.2.0 → atmem-2.2.3}/atmem/mcp/server.py +1 -1
  6. {atmem-2.2.0 → atmem-2.2.3}/atmem/openclaw_install.py +1 -1
  7. {atmem-2.2.0 → atmem-2.2.3/atmem.egg-info}/PKG-INFO +127 -14
  8. {atmem-2.2.0 → atmem-2.2.3}/atmem.egg-info/SOURCES.txt +3 -0
  9. {atmem-2.2.0 → atmem-2.2.3}/atmem.egg-info/requires.txt +1 -1
  10. {atmem-2.2.0 → atmem-2.2.3}/docs/agent-blackbox.md +5 -0
  11. {atmem-2.2.0 → atmem-2.2.3}/docs/atbot-release.md +1 -1
  12. {atmem-2.2.0 → atmem-2.2.3}/docs/capabilities.json +2 -2
  13. {atmem-2.2.0 → atmem-2.2.3}/docs/current-status.md +4 -4
  14. {atmem-2.2.0 → atmem-2.2.3}/docs/openclaw-setup.md +2 -2
  15. atmem-2.2.3/docs/releases/v2.2.1.md +49 -0
  16. atmem-2.2.3/docs/releases/v2.2.2.md +28 -0
  17. atmem-2.2.3/docs/releases/v2.2.3.md +32 -0
  18. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/README.md +2 -2
  19. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/index.ts +64 -15
  20. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/openclaw.plugin.json +1 -1
  21. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/package-lock.json +2 -2
  22. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/package.json +1 -1
  23. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/src/rpc-client.ts +1 -1
  24. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/test/hooks.mjs +64 -0
  25. {atmem-2.2.0 → atmem-2.2.3}/pyproject.toml +2 -2
  26. {atmem-2.2.0 → atmem-2.2.3}/tests/test_cli_guidance.py +2 -2
  27. {atmem-2.2.0 → atmem-2.2.3}/tests/test_control_plane.py +3 -3
  28. {atmem-2.2.0 → atmem-2.2.3}/tests/test_documentation.py +20 -0
  29. {atmem-2.2.0 → atmem-2.2.3}/tools/smoke_installed_package.py +2 -2
  30. {atmem-2.2.0 → atmem-2.2.3}/tools/smoke_upgrade_from_2_1.py +3 -3
  31. {atmem-2.2.0 → atmem-2.2.3}/LICENSE +0 -0
  32. {atmem-2.2.0 → atmem-2.2.3}/MANIFEST.in +0 -0
  33. {atmem-2.2.0 → atmem-2.2.3}/atmem/__init__.py +0 -0
  34. {atmem-2.2.0 → atmem-2.2.3}/atmem/adapters/__init__.py +0 -0
  35. {atmem-2.2.0 → atmem-2.2.3}/atmem/adapters/base.py +0 -0
  36. {atmem-2.2.0 → atmem-2.2.3}/atmem/adapters/langgraph.py +0 -0
  37. {atmem-2.2.0 → atmem-2.2.3}/atmem/cli.py +0 -0
  38. {atmem-2.2.0 → atmem-2.2.3}/atmem/contracts/__init__.py +0 -0
  39. {atmem-2.2.0 → atmem-2.2.3}/atmem/contracts/models.py +0 -0
  40. {atmem-2.2.0 → atmem-2.2.3}/atmem/contracts/versions.py +0 -0
  41. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/__init__.py +0 -0
  42. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/assets/app.css +0 -0
  43. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/assets/app.html +0 -0
  44. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/assets/app.js +0 -0
  45. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/assets/atmem.jpg +0 -0
  46. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/atbot_companion.py +0 -0
  47. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/blackbox.py +0 -0
  48. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/compat.py +0 -0
  49. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/evidence.py +0 -0
  50. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/hosts.py +0 -0
  51. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/manager.py +0 -0
  52. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/models.py +0 -0
  53. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/openclaw_native.py +0 -0
  54. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/openclaw_topology.py +0 -0
  55. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/server.py +0 -0
  56. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/state.py +0 -0
  57. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/store.py +0 -0
  58. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/topology.py +0 -0
  59. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/ui.py +0 -0
  60. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/verify.py +0 -0
  61. {atmem-2.2.0 → atmem-2.2.3}/atmem/control/web.py +0 -0
  62. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/__init__.py +0 -0
  63. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/canonical.py +0 -0
  64. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/fact_keys.py +0 -0
  65. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/keys.py +0 -0
  66. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/policy.py +0 -0
  67. {atmem-2.2.0 → atmem-2.2.3}/atmem/core/storage.py +0 -0
  68. {atmem-2.2.0 → atmem-2.2.3}/atmem/dashboard_daemon.py +0 -0
  69. {atmem-2.2.0 → atmem-2.2.3}/atmem/extract/__init__.py +0 -0
  70. {atmem-2.2.0 → atmem-2.2.3}/atmem/extract/rules.py +0 -0
  71. {atmem-2.2.0 → atmem-2.2.3}/atmem/graph.py +0 -0
  72. {atmem-2.2.0 → atmem-2.2.3}/atmem/investigate.py +0 -0
  73. {atmem-2.2.0 → atmem-2.2.3}/atmem/maintenance.py +0 -0
  74. {atmem-2.2.0 → atmem-2.2.3}/atmem/mcp/__init__.py +0 -0
  75. {atmem-2.2.0 → atmem-2.2.3}/atmem/media.py +0 -0
  76. {atmem-2.2.0 → atmem-2.2.3}/atmem/memory.py +0 -0
  77. {atmem-2.2.0 → atmem-2.2.3}/atmem/retrieve/__init__.py +0 -0
  78. {atmem-2.2.0 → atmem-2.2.3}/atmem/retrieve/rank.py +0 -0
  79. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/__init__.py +0 -0
  80. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/capabilities.json +0 -0
  81. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/context-package.json +0 -0
  82. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/memory-proposal.json +0 -0
  83. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/recall-request.json +0 -0
  84. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/scope.json +0 -0
  85. {atmem-2.2.0 → atmem-2.2.3}/atmem/schemas/v1/source-capture.json +0 -0
  86. {atmem-2.2.0 → atmem-2.2.3}/atmem/semantic/__init__.py +0 -0
  87. {atmem-2.2.0 → atmem-2.2.3}/atmem/semantic/index.py +0 -0
  88. {atmem-2.2.0 → atmem-2.2.3}/atmem/semantic/providers.py +0 -0
  89. {atmem-2.2.0 → atmem-2.2.3}/atmem/store/__init__.py +0 -0
  90. {atmem-2.2.0 → atmem-2.2.3}/atmem/store/sqlite.py +0 -0
  91. {atmem-2.2.0 → atmem-2.2.3}/atmem.egg-info/dependency_links.txt +0 -0
  92. {atmem-2.2.0 → atmem-2.2.3}/atmem.egg-info/entry_points.txt +0 -0
  93. {atmem-2.2.0 → atmem-2.2.3}/atmem.egg-info/top_level.txt +0 -0
  94. {atmem-2.2.0 → atmem-2.2.3}/docs/audit-log-spec.md +0 -0
  95. {atmem-2.2.0 → atmem-2.2.3}/docs/audit-search.md +0 -0
  96. {atmem-2.2.0 → atmem-2.2.3}/docs/auditing-guide.md +0 -0
  97. {atmem-2.2.0 → atmem-2.2.3}/docs/control-plane.md +0 -0
  98. {atmem-2.2.0 → atmem-2.2.3}/docs/dashboard-design-language.md +0 -0
  99. {atmem-2.2.0 → atmem-2.2.3}/docs/data-storage-and-backup.md +0 -0
  100. {atmem-2.2.0 → atmem-2.2.3}/docs/framework-adapters.md +0 -0
  101. {atmem-2.2.0 → atmem-2.2.3}/docs/generic-adapter.md +0 -0
  102. {atmem-2.2.0 → atmem-2.2.3}/docs/integration-guide.md +0 -0
  103. {atmem-2.2.0 → atmem-2.2.3}/docs/multimodal-observations.md +0 -0
  104. {atmem-2.2.0 → atmem-2.2.3}/docs/releases/v1.0.0.md +0 -0
  105. {atmem-2.2.0 → atmem-2.2.3}/docs/releases/v2.0.0.md +0 -0
  106. {atmem-2.2.0 → atmem-2.2.3}/docs/releases/v2.0.1.md +0 -0
  107. {atmem-2.2.0 → atmem-2.2.3}/docs/releases/v2.1.0.md +0 -0
  108. {atmem-2.2.0 → atmem-2.2.3}/docs/releases/v2.2.0.md +0 -0
  109. {atmem-2.2.0 → atmem-2.2.3}/docs/saas-integration.md +0 -0
  110. {atmem-2.2.0 → atmem-2.2.3}/docs/semantic-search.md +0 -0
  111. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/src/setup.ts +0 -0
  112. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/src/types.ts +0 -0
  113. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/test/setup.mjs +0 -0
  114. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/test/smoke.mjs +0 -0
  115. {atmem-2.2.0 → atmem-2.2.3}/integrations/openclaw/tsconfig.json +0 -0
  116. {atmem-2.2.0 → atmem-2.2.3}/setup.cfg +0 -0
  117. {atmem-2.2.0 → atmem-2.2.3}/tests/test_atbot_companion.py +0 -0
  118. {atmem-2.2.0 → atmem-2.2.3}/tests/test_atbot_service.py +0 -0
  119. {atmem-2.2.0 → atmem-2.2.3}/tests/test_auditability.py +0 -0
  120. {atmem-2.2.0 → atmem-2.2.3}/tests/test_blackbox.py +0 -0
  121. {atmem-2.2.0 → atmem-2.2.3}/tests/test_cli.py +0 -0
  122. {atmem-2.2.0 → atmem-2.2.3}/tests/test_contracts_v1.py +0 -0
  123. {atmem-2.2.0 → atmem-2.2.3}/tests/test_control_evidence.py +0 -0
  124. {atmem-2.2.0 → atmem-2.2.3}/tests/test_control_verify.py +0 -0
  125. {atmem-2.2.0 → atmem-2.2.3}/tests/test_dashboard_daemon.py +0 -0
  126. {atmem-2.2.0 → atmem-2.2.3}/tests/test_encryption.py +0 -0
  127. {atmem-2.2.0 → atmem-2.2.3}/tests/test_extract.py +0 -0
  128. {atmem-2.2.0 → atmem-2.2.3}/tests/test_framework_adapters.py +0 -0
  129. {atmem-2.2.0 → atmem-2.2.3}/tests/test_generic_control.py +0 -0
  130. {atmem-2.2.0 → atmem-2.2.3}/tests/test_graph.py +0 -0
  131. {atmem-2.2.0 → atmem-2.2.3}/tests/test_host_adapter.py +0 -0
  132. {atmem-2.2.0 → atmem-2.2.3}/tests/test_layers.py +0 -0
  133. {atmem-2.2.0 → atmem-2.2.3}/tests/test_maintenance.py +0 -0
  134. {atmem-2.2.0 → atmem-2.2.3}/tests/test_mcp.py +0 -0
  135. {atmem-2.2.0 → atmem-2.2.3}/tests/test_media_observations.py +0 -0
  136. {atmem-2.2.0 → atmem-2.2.3}/tests/test_memory.py +0 -0
  137. {atmem-2.2.0 → atmem-2.2.3}/tests/test_openclaw_control.py +0 -0
  138. {atmem-2.2.0 → atmem-2.2.3}/tests/test_openclaw_install.py +0 -0
  139. {atmem-2.2.0 → atmem-2.2.3}/tests/test_openclaw_topology.py +0 -0
  140. {atmem-2.2.0 → atmem-2.2.3}/tests/test_policy.py +0 -0
  141. {atmem-2.2.0 → atmem-2.2.3}/tests/test_recall_evidence.py +0 -0
  142. {atmem-2.2.0 → atmem-2.2.3}/tests/test_restore_receipt.py +0 -0
  143. {atmem-2.2.0 → atmem-2.2.3}/tests/test_retrieve.py +0 -0
  144. {atmem-2.2.0 → atmem-2.2.3}/tests/test_semantic_search.py +0 -0
  145. {atmem-2.2.0 → atmem-2.2.3}/tests/test_store_transactions.py +0 -0
  146. {atmem-2.2.0 → atmem-2.2.3}/tools/verify_audit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmem
3
- Version: 2.2.0
3
+ Version: 2.2.3
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>
@@ -24,7 +24,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
24
  Requires-Python: >=3.10
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: atmem-atbot==0.1.0a1
27
+ Requires-Dist: atmem-atbot==0.1.0a2
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: pytest>=8.0.0; extra == "dev"
30
30
  Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
@@ -44,14 +44,128 @@ Dynamic: license-file
44
44
 
45
45
  # AtMem
46
46
 
47
- [![Version 2.2.0](https://img.shields.io/badge/version-2.2.0-blue)](./docs/releases/v2.2.0.md)
47
+ [![Version 2.2.3](https://img.shields.io/badge/version-2.2.3-blue)](./docs/releases/v2.2.3.md)
48
48
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
49
49
 
50
50
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
51
51
 
52
- > **Release status:** this repository describes **AtMem 2.2.0**. AtBot is a
53
- > separately packaged, headless intelligence companion installed and managed
54
- > by AtMem; AtMem remains the memory authority.
52
+ Install AtMem once and give OpenClaw, Pydantic AI, LangChain/LangGraph, or a
53
+ custom agent governed long-term memory. **AtBot is installed automatically** as
54
+ AtMem's private intelligence companion: AtBot proposes and ranks; AtMem alone
55
+ authorizes, stores, scopes, injects, corrects, and deletes memory.
56
+
57
+ ## Start here
58
+
59
+ ### 1. Install AtMem and choose memory intelligence
60
+
61
+ ```bash
62
+ python -m pip install --upgrade atmem==2.2.3
63
+ atmem atbot setup
64
+ atmem atbot doctor
65
+ atmem dashboard
66
+ ```
67
+
68
+ That one Python installation includes the pinned `atmem-atbot` package and an
69
+ always-present local vector index. Do **not** install AtBot separately. During
70
+ `atmem atbot setup`, choose local Ollama, a local OpenAI-compatible model, a
71
+ hosted provider, or the safe deterministic fallback. API keys stay in
72
+ environment variables; AtMem does not save them.
73
+
74
+ ### 2. Connect your agent
75
+
76
+ #### OpenClaw — fully managed
77
+
78
+ ```bash
79
+ atmem openclaw install
80
+ atmem control verify
81
+ ```
82
+
83
+ AtMem installs the matching npm bridge, discovers OpenClaw agents and
84
+ workspaces, starts in safe shadow mode, restarts the gateway, and verifies the
85
+ connection. Do not install the npm package yourself.
86
+
87
+ Already using AtMem 2.1 with OpenClaw? Upgrade in place:
88
+
89
+ ```bash
90
+ python -m pip install --upgrade atmem==2.2.3
91
+ atmem openclaw upgrade
92
+ atmem control verify
93
+ ```
94
+
95
+ #### Pydantic AI — native capability
96
+
97
+ ```bash
98
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
99
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
100
+ ```
101
+
102
+ ```python
103
+ from pydantic_ai import Agent
104
+ from atmem.adapters import AtMemAdapterIdentity
105
+ from atmem.adapters.pydantic_ai import PydanticAIAtMemAdapter
106
+ from atmem.control import ControlPlaneManager
107
+
108
+ manager = ControlPlaneManager()
109
+ scope = manager.agent_topology()["agents"][0]
110
+ identity = AtMemAdapterIdentity(
111
+ agent_id=scope["agent_id"],
112
+ workspace_id=scope["workspace_id"],
113
+ subject_id=scope["subject_id"],
114
+ )
115
+ memory = PydanticAIAtMemAdapter(manager, identity).capability()
116
+ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
117
+ ```
118
+
119
+ #### LangChain/LangGraph — native middleware
120
+
121
+ ```bash
122
+ python -m pip install 'atmem[langgraph]==2.2.3'
123
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
124
+ ```
125
+
126
+ ```python
127
+ from langchain.agents import create_agent
128
+ from atmem.adapters import AtMemAdapterIdentity
129
+ from atmem.adapters.langgraph import create_langgraph_middleware
130
+ from atmem.control import ControlPlaneManager
131
+
132
+ manager = ControlPlaneManager()
133
+ scope = manager.agent_topology()["agents"][0]
134
+ identity = AtMemAdapterIdentity(
135
+ agent_id=scope["agent_id"],
136
+ workspace_id=scope["workspace_id"],
137
+ subject_id=scope["subject_id"],
138
+ )
139
+ memory = create_langgraph_middleware(manager, identity)
140
+ agent = create_agent(model="openai:gpt-5-mini", tools=[], middleware=[memory])
141
+ ```
142
+
143
+ The framework hooks automate authenticated capture, governed retrieval,
144
+ context injection, exposure proof, and turn/tool evidence. They do not replace
145
+ your agent's model, tools, conversation history, or LangGraph checkpoints. See
146
+ the [complete framework adapter guide](docs/framework-adapters.md) for async,
147
+ multi-agent, and low-level `StateGraph` integration.
148
+
149
+ ### 3. Review, then activate
150
+
151
+ Every integration starts in **shadow mode**: AtMem learns and shows what it
152
+ would retrieve, but cannot change model context. Review it in the dashboard,
153
+ then explicitly enable governed injection:
154
+
155
+ ```bash
156
+ atmem dashboard
157
+ atmem control status
158
+ atmem control activate
159
+ atmem control verify
160
+ ```
161
+
162
+ If AtBot or its selected model is unavailable, AtMem continues with safe local
163
+ capture and hybrid ranking. Memory authority and agent operation do not depend
164
+ on a hosted model.
165
+
166
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
167
+ > separately packaged, headless component installed and managed by AtMem; it is
168
+ > not an independent agent or a second memory authority.
55
169
 
56
170
  It gives agent runtimes one governed memory source and one tamper-evident record
57
171
  of what the host observed: memory considered and injected, model boundaries,
@@ -65,10 +179,10 @@ evidence, activate AtMem explicitly, and return to shadow at any time. The
65
179
  OpenClaw adapter additionally copies native memory, freezes it during takeover,
66
180
  and restores it exactly.
67
181
 
68
- ## Install
182
+ ## Installation details
69
183
 
70
184
  ```bash
71
- python -m pip install atmem==2.2.0
185
+ python -m pip install atmem==2.2.3
72
186
  atmem --version
73
187
  ```
74
188
 
@@ -76,11 +190,10 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
76
190
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
77
191
 
78
192
  ```bash
79
- python -m pip install 'atmem[semantic]==2.2.0'
193
+ python -m pip install 'atmem[semantic]==2.2.3'
80
194
  ```
81
195
 
82
- For repository development, install both packages so the exact companion
83
- version is satisfied locally:
196
+ For repository development, install both workspace packages:
84
197
 
85
198
  ```bash
86
199
  python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
@@ -92,7 +205,7 @@ AtMem distribution requires the separately packaged, exactly pinned AtBot
92
205
  companion. Consequently a complete 2.2 installation has AtBot's transitive
93
206
  dependencies even when the user selects AtMem's deterministic fallback.
94
207
 
95
- ## Choose an integration
208
+ ## Integration boundaries
96
209
 
97
210
  | Runtime | Start command | What AtMem supplies | What the runtime supplies |
98
211
  | --- | --- | --- | --- |
@@ -257,7 +370,7 @@ atmem control restore
257
370
  Existing 2.1 installations upgrade without starting a new migration:
258
371
 
259
372
  ```bash
260
- python -m pip install --upgrade atmem==2.2.0
373
+ python -m pip install --upgrade atmem==2.2.3
261
374
  atmem openclaw upgrade
262
375
  atmem control verify
263
376
  ```
@@ -403,7 +516,7 @@ npm test
403
516
  npm run smoke
404
517
  ```
405
518
 
406
- Current repository metadata is version **2.2.0**. Python and npm release
519
+ Current repository metadata is version **2.2.3**. Python and npm release
407
520
  versions are intentionally kept equal because the OpenClaw installer pins the
408
521
  matching bridge.
409
522
 
@@ -1,13 +1,127 @@
1
1
  # AtMem
2
2
 
3
- [![Version 2.2.0](https://img.shields.io/badge/version-2.2.0-blue)](./docs/releases/v2.2.0.md)
3
+ [![Version 2.2.3](https://img.shields.io/badge/version-2.2.3-blue)](./docs/releases/v2.2.3.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:** this repository describes **AtMem 2.2.0**. AtBot is a
9
- > separately packaged, headless intelligence companion installed and managed
10
- > by AtMem; AtMem remains the memory authority.
8
+ Install AtMem once and give OpenClaw, Pydantic AI, LangChain/LangGraph, or a
9
+ custom agent governed long-term memory. **AtBot is installed automatically** as
10
+ AtMem's private intelligence companion: AtBot proposes and ranks; AtMem alone
11
+ authorizes, stores, scopes, injects, corrects, and deletes memory.
12
+
13
+ ## Start here
14
+
15
+ ### 1. Install AtMem and choose memory intelligence
16
+
17
+ ```bash
18
+ python -m pip install --upgrade atmem==2.2.3
19
+ atmem atbot setup
20
+ atmem atbot doctor
21
+ atmem dashboard
22
+ ```
23
+
24
+ That one Python installation includes the pinned `atmem-atbot` package and an
25
+ always-present local vector index. Do **not** install AtBot separately. During
26
+ `atmem atbot setup`, choose local Ollama, a local OpenAI-compatible model, a
27
+ hosted provider, or the safe deterministic fallback. API keys stay in
28
+ environment variables; AtMem does not save them.
29
+
30
+ ### 2. Connect your agent
31
+
32
+ #### OpenClaw — fully managed
33
+
34
+ ```bash
35
+ atmem openclaw install
36
+ atmem control verify
37
+ ```
38
+
39
+ AtMem installs the matching npm bridge, discovers OpenClaw agents and
40
+ workspaces, starts in safe shadow mode, restarts the gateway, and verifies the
41
+ connection. Do not install the npm package yourself.
42
+
43
+ Already using AtMem 2.1 with OpenClaw? Upgrade in place:
44
+
45
+ ```bash
46
+ python -m pip install --upgrade atmem==2.2.3
47
+ atmem openclaw upgrade
48
+ atmem control verify
49
+ ```
50
+
51
+ #### Pydantic AI — native capability
52
+
53
+ ```bash
54
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
55
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
56
+ ```
57
+
58
+ ```python
59
+ from pydantic_ai import Agent
60
+ from atmem.adapters import AtMemAdapterIdentity
61
+ from atmem.adapters.pydantic_ai import PydanticAIAtMemAdapter
62
+ from atmem.control import ControlPlaneManager
63
+
64
+ manager = ControlPlaneManager()
65
+ scope = manager.agent_topology()["agents"][0]
66
+ identity = AtMemAdapterIdentity(
67
+ agent_id=scope["agent_id"],
68
+ workspace_id=scope["workspace_id"],
69
+ subject_id=scope["subject_id"],
70
+ )
71
+ memory = PydanticAIAtMemAdapter(manager, identity).capability()
72
+ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
73
+ ```
74
+
75
+ #### LangChain/LangGraph — native middleware
76
+
77
+ ```bash
78
+ python -m pip install 'atmem[langgraph]==2.2.3'
79
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
80
+ ```
81
+
82
+ ```python
83
+ from langchain.agents import create_agent
84
+ from atmem.adapters import AtMemAdapterIdentity
85
+ from atmem.adapters.langgraph import create_langgraph_middleware
86
+ from atmem.control import ControlPlaneManager
87
+
88
+ manager = ControlPlaneManager()
89
+ scope = manager.agent_topology()["agents"][0]
90
+ identity = AtMemAdapterIdentity(
91
+ agent_id=scope["agent_id"],
92
+ workspace_id=scope["workspace_id"],
93
+ subject_id=scope["subject_id"],
94
+ )
95
+ memory = create_langgraph_middleware(manager, identity)
96
+ agent = create_agent(model="openai:gpt-5-mini", tools=[], middleware=[memory])
97
+ ```
98
+
99
+ The framework hooks automate authenticated capture, governed retrieval,
100
+ context injection, exposure proof, and turn/tool evidence. They do not replace
101
+ your agent's model, tools, conversation history, or LangGraph checkpoints. See
102
+ the [complete framework adapter guide](docs/framework-adapters.md) for async,
103
+ multi-agent, and low-level `StateGraph` integration.
104
+
105
+ ### 3. Review, then activate
106
+
107
+ Every integration starts in **shadow mode**: AtMem learns and shows what it
108
+ would retrieve, but cannot change model context. Review it in the dashboard,
109
+ then explicitly enable governed injection:
110
+
111
+ ```bash
112
+ atmem dashboard
113
+ atmem control status
114
+ atmem control activate
115
+ atmem control verify
116
+ ```
117
+
118
+ If AtBot or its selected model is unavailable, AtMem continues with safe local
119
+ capture and hybrid ranking. Memory authority and agent operation do not depend
120
+ on a hosted model.
121
+
122
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
123
+ > separately packaged, headless component installed and managed by AtMem; it is
124
+ > not an independent agent or a second memory authority.
11
125
 
12
126
  It gives agent runtimes one governed memory source and one tamper-evident record
13
127
  of what the host observed: memory considered and injected, model boundaries,
@@ -21,10 +135,10 @@ evidence, activate AtMem explicitly, and return to shadow at any time. The
21
135
  OpenClaw adapter additionally copies native memory, freezes it during takeover,
22
136
  and restores it exactly.
23
137
 
24
- ## Install
138
+ ## Installation details
25
139
 
26
140
  ```bash
27
- python -m pip install atmem==2.2.0
141
+ python -m pip install atmem==2.2.3
28
142
  atmem --version
29
143
  ```
30
144
 
@@ -32,11 +146,10 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
32
146
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
33
147
 
34
148
  ```bash
35
- python -m pip install 'atmem[semantic]==2.2.0'
149
+ python -m pip install 'atmem[semantic]==2.2.3'
36
150
  ```
37
151
 
38
- For repository development, install both packages so the exact companion
39
- version is satisfied locally:
152
+ For repository development, install both workspace packages:
40
153
 
41
154
  ```bash
42
155
  python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
@@ -48,7 +161,7 @@ AtMem distribution requires the separately packaged, exactly pinned AtBot
48
161
  companion. Consequently a complete 2.2 installation has AtBot's transitive
49
162
  dependencies even when the user selects AtMem's deterministic fallback.
50
163
 
51
- ## Choose an integration
164
+ ## Integration boundaries
52
165
 
53
166
  | Runtime | Start command | What AtMem supplies | What the runtime supplies |
54
167
  | --- | --- | --- | --- |
@@ -213,7 +326,7 @@ atmem control restore
213
326
  Existing 2.1 installations upgrade without starting a new migration:
214
327
 
215
328
  ```bash
216
- python -m pip install --upgrade atmem==2.2.0
329
+ python -m pip install --upgrade atmem==2.2.3
217
330
  atmem openclaw upgrade
218
331
  atmem control verify
219
332
  ```
@@ -359,7 +472,7 @@ npm test
359
472
  npm run smoke
360
473
  ```
361
474
 
362
- Current repository metadata is version **2.2.0**. Python and npm release
475
+ Current repository metadata is version **2.2.3**. Python and npm release
363
476
  versions are intentionally kept equal because the OpenClaw installer pins the
364
477
  matching bridge.
365
478
 
@@ -1,4 +1,4 @@
1
- """Pydantic AI 2.x Hooks adapter for automatic governed memory."""
1
+ """Pydantic AI Hooks adapter for automatic governed memory."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -54,7 +54,7 @@ class PydanticAIAtMemAdapter:
54
54
  if governed:
55
55
  messages.append(ModelRequest(parts=[UserPromptPart(governed)]))
56
56
  model_name = str(
57
- request_context.model_id
57
+ getattr(request_context, "model_id", None)
58
58
  or getattr(request_context.model, "model_name", None)
59
59
  or getattr(request_context.model, "model_id", None)
60
60
  or "unknown"
@@ -16,7 +16,7 @@ from typing import Any
16
16
  from urllib.parse import urlparse
17
17
 
18
18
 
19
- PINNED_ATBOT_VERSION = "0.1.0a1"
19
+ PINNED_ATBOT_VERSION = "0.1.0a2"
20
20
  ATBOT_DISTRIBUTION = "atmem-atbot"
21
21
  ATBOT_PROTOCOL_VERSION = "1"
22
22
  DEFAULT_ROOT = Path.home() / ".atmem" / "atbot"
@@ -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.0"
29
+ SERVER_VERSION = "2.2.3"
30
30
 
31
31
  _SUBJECT_PROPERTY = {
32
32
  "subject_id": {
@@ -16,7 +16,7 @@ from atmem.control.manager import DEFAULT_STATE_PATH, DEFAULT_CONTROL_ROOT
16
16
 
17
17
  OPENCLAW_PLUGIN_ID = "memory-atmem"
18
18
  OPENCLAW_PLUGIN_PACKAGE = "openclaw-memory-atmem"
19
- OPENCLAW_PLUGIN_VERSION = "2.2.0"
19
+ OPENCLAW_PLUGIN_VERSION = "2.2.3"
20
20
  _CONFIG_KEY = "plugins.entries.memory-atmem"
21
21
 
22
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmem
3
- Version: 2.2.0
3
+ Version: 2.2.3
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>
@@ -24,7 +24,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
24
  Requires-Python: >=3.10
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: atmem-atbot==0.1.0a1
27
+ Requires-Dist: atmem-atbot==0.1.0a2
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: pytest>=8.0.0; extra == "dev"
30
30
  Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
@@ -44,14 +44,128 @@ Dynamic: license-file
44
44
 
45
45
  # AtMem
46
46
 
47
- [![Version 2.2.0](https://img.shields.io/badge/version-2.2.0-blue)](./docs/releases/v2.2.0.md)
47
+ [![Version 2.2.3](https://img.shields.io/badge/version-2.2.3-blue)](./docs/releases/v2.2.3.md)
48
48
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
49
49
 
50
50
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
51
51
 
52
- > **Release status:** this repository describes **AtMem 2.2.0**. AtBot is a
53
- > separately packaged, headless intelligence companion installed and managed
54
- > by AtMem; AtMem remains the memory authority.
52
+ Install AtMem once and give OpenClaw, Pydantic AI, LangChain/LangGraph, or a
53
+ custom agent governed long-term memory. **AtBot is installed automatically** as
54
+ AtMem's private intelligence companion: AtBot proposes and ranks; AtMem alone
55
+ authorizes, stores, scopes, injects, corrects, and deletes memory.
56
+
57
+ ## Start here
58
+
59
+ ### 1. Install AtMem and choose memory intelligence
60
+
61
+ ```bash
62
+ python -m pip install --upgrade atmem==2.2.3
63
+ atmem atbot setup
64
+ atmem atbot doctor
65
+ atmem dashboard
66
+ ```
67
+
68
+ That one Python installation includes the pinned `atmem-atbot` package and an
69
+ always-present local vector index. Do **not** install AtBot separately. During
70
+ `atmem atbot setup`, choose local Ollama, a local OpenAI-compatible model, a
71
+ hosted provider, or the safe deterministic fallback. API keys stay in
72
+ environment variables; AtMem does not save them.
73
+
74
+ ### 2. Connect your agent
75
+
76
+ #### OpenClaw — fully managed
77
+
78
+ ```bash
79
+ atmem openclaw install
80
+ atmem control verify
81
+ ```
82
+
83
+ AtMem installs the matching npm bridge, discovers OpenClaw agents and
84
+ workspaces, starts in safe shadow mode, restarts the gateway, and verifies the
85
+ connection. Do not install the npm package yourself.
86
+
87
+ Already using AtMem 2.1 with OpenClaw? Upgrade in place:
88
+
89
+ ```bash
90
+ python -m pip install --upgrade atmem==2.2.3
91
+ atmem openclaw upgrade
92
+ atmem control verify
93
+ ```
94
+
95
+ #### Pydantic AI — native capability
96
+
97
+ ```bash
98
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
99
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
100
+ ```
101
+
102
+ ```python
103
+ from pydantic_ai import Agent
104
+ from atmem.adapters import AtMemAdapterIdentity
105
+ from atmem.adapters.pydantic_ai import PydanticAIAtMemAdapter
106
+ from atmem.control import ControlPlaneManager
107
+
108
+ manager = ControlPlaneManager()
109
+ scope = manager.agent_topology()["agents"][0]
110
+ identity = AtMemAdapterIdentity(
111
+ agent_id=scope["agent_id"],
112
+ workspace_id=scope["workspace_id"],
113
+ subject_id=scope["subject_id"],
114
+ )
115
+ memory = PydanticAIAtMemAdapter(manager, identity).capability()
116
+ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
117
+ ```
118
+
119
+ #### LangChain/LangGraph — native middleware
120
+
121
+ ```bash
122
+ python -m pip install 'atmem[langgraph]==2.2.3'
123
+ atmem control shadow --host generic --memory-db ~/.atmem/memories.db
124
+ ```
125
+
126
+ ```python
127
+ from langchain.agents import create_agent
128
+ from atmem.adapters import AtMemAdapterIdentity
129
+ from atmem.adapters.langgraph import create_langgraph_middleware
130
+ from atmem.control import ControlPlaneManager
131
+
132
+ manager = ControlPlaneManager()
133
+ scope = manager.agent_topology()["agents"][0]
134
+ identity = AtMemAdapterIdentity(
135
+ agent_id=scope["agent_id"],
136
+ workspace_id=scope["workspace_id"],
137
+ subject_id=scope["subject_id"],
138
+ )
139
+ memory = create_langgraph_middleware(manager, identity)
140
+ agent = create_agent(model="openai:gpt-5-mini", tools=[], middleware=[memory])
141
+ ```
142
+
143
+ The framework hooks automate authenticated capture, governed retrieval,
144
+ context injection, exposure proof, and turn/tool evidence. They do not replace
145
+ your agent's model, tools, conversation history, or LangGraph checkpoints. See
146
+ the [complete framework adapter guide](docs/framework-adapters.md) for async,
147
+ multi-agent, and low-level `StateGraph` integration.
148
+
149
+ ### 3. Review, then activate
150
+
151
+ Every integration starts in **shadow mode**: AtMem learns and shows what it
152
+ would retrieve, but cannot change model context. Review it in the dashboard,
153
+ then explicitly enable governed injection:
154
+
155
+ ```bash
156
+ atmem dashboard
157
+ atmem control status
158
+ atmem control activate
159
+ atmem control verify
160
+ ```
161
+
162
+ If AtBot or its selected model is unavailable, AtMem continues with safe local
163
+ capture and hybrid ranking. Memory authority and agent operation do not depend
164
+ on a hosted model.
165
+
166
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
167
+ > separately packaged, headless component installed and managed by AtMem; it is
168
+ > not an independent agent or a second memory authority.
55
169
 
56
170
  It gives agent runtimes one governed memory source and one tamper-evident record
57
171
  of what the host observed: memory considered and injected, model boundaries,
@@ -65,10 +179,10 @@ evidence, activate AtMem explicitly, and return to shadow at any time. The
65
179
  OpenClaw adapter additionally copies native memory, freezes it during takeover,
66
180
  and restores it exactly.
67
181
 
68
- ## Install
182
+ ## Installation details
69
183
 
70
184
  ```bash
71
- python -m pip install atmem==2.2.0
185
+ python -m pip install atmem==2.2.3
72
186
  atmem --version
73
187
  ```
74
188
 
@@ -76,11 +190,10 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
76
190
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
77
191
 
78
192
  ```bash
79
- python -m pip install 'atmem[semantic]==2.2.0'
193
+ python -m pip install 'atmem[semantic]==2.2.3'
80
194
  ```
81
195
 
82
- For repository development, install both packages so the exact companion
83
- version is satisfied locally:
196
+ For repository development, install both workspace packages:
84
197
 
85
198
  ```bash
86
199
  python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
@@ -92,7 +205,7 @@ AtMem distribution requires the separately packaged, exactly pinned AtBot
92
205
  companion. Consequently a complete 2.2 installation has AtBot's transitive
93
206
  dependencies even when the user selects AtMem's deterministic fallback.
94
207
 
95
- ## Choose an integration
208
+ ## Integration boundaries
96
209
 
97
210
  | Runtime | Start command | What AtMem supplies | What the runtime supplies |
98
211
  | --- | --- | --- | --- |
@@ -257,7 +370,7 @@ atmem control restore
257
370
  Existing 2.1 installations upgrade without starting a new migration:
258
371
 
259
372
  ```bash
260
- python -m pip install --upgrade atmem==2.2.0
373
+ python -m pip install --upgrade atmem==2.2.3
261
374
  atmem openclaw upgrade
262
375
  atmem control verify
263
376
  ```
@@ -403,7 +516,7 @@ npm test
403
516
  npm run smoke
404
517
  ```
405
518
 
406
- Current repository metadata is version **2.2.0**. Python and npm release
519
+ Current repository metadata is version **2.2.3**. Python and npm release
407
520
  versions are intentionally kept equal because the OpenClaw installer pins the
408
521
  matching bridge.
409
522
 
@@ -92,6 +92,9 @@ docs/releases/v2.0.0.md
92
92
  docs/releases/v2.0.1.md
93
93
  docs/releases/v2.1.0.md
94
94
  docs/releases/v2.2.0.md
95
+ docs/releases/v2.2.1.md
96
+ docs/releases/v2.2.2.md
97
+ docs/releases/v2.2.3.md
95
98
  integrations/openclaw/README.md
96
99
  integrations/openclaw/index.ts
97
100
  integrations/openclaw/openclaw.plugin.json
@@ -1,4 +1,4 @@
1
- atmem-atbot==0.1.0a1
1
+ atmem-atbot==0.1.0a2
2
2
 
3
3
  [atbot]
4
4
 
@@ -61,6 +61,11 @@ a small model charge.
61
61
  A structurally complete flight has covered integrity, lifecycle, context, model,
62
62
  tools, and response-binding components. In particular:
63
63
 
64
+ OpenClaw normally observes `turn.input` at `before_model_resolve`. Execution
65
+ paths such as `claude-cli` that omit that hook use `before_prompt_build` as an
66
+ idempotent fallback. If both hooks fire, the bridge records and stages the
67
+ authenticated input only once.
68
+
64
69
  - the retained Black Box hash chain verifies;
65
70
  - the run has `turn.input` and terminal `turn.ended` events;
66
71
  - one explicit context disposition records what memory reached the model, or why none did;
@@ -31,7 +31,7 @@ stored in GitHub.
31
31
  2. Run both Python suites and build both distributions locally.
32
32
  3. Push the reviewed changes.
33
33
  4. Create and push a tag matching `atbot-v<VERSION>`, for example
34
- `atbot-v0.1.0a1`.
34
+ `atbot-v0.1.0a2`.
35
35
  5. Approve the protected `pypi-atbot` environment deployment.
36
36
  6. Confirm `python -m pip install atmem-atbot==<VERSION>` installs an `atbot`
37
37
  command with the same version.