atmem 2.2.1__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.1/atmem.egg-info → atmem-2.2.3}/PKG-INFO +12 -12
  2. {atmem-2.2.1 → atmem-2.2.3}/README.md +10 -10
  3. {atmem-2.2.1 → atmem-2.2.3}/atmem/adapters/pydantic_ai.py +2 -2
  4. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/atbot_service.py +1 -1
  5. {atmem-2.2.1 → atmem-2.2.3}/atmem/mcp/server.py +1 -1
  6. {atmem-2.2.1 → atmem-2.2.3}/atmem/openclaw_install.py +1 -1
  7. {atmem-2.2.1 → atmem-2.2.3/atmem.egg-info}/PKG-INFO +12 -12
  8. {atmem-2.2.1 → atmem-2.2.3}/atmem.egg-info/SOURCES.txt +2 -0
  9. {atmem-2.2.1 → atmem-2.2.3}/atmem.egg-info/requires.txt +1 -1
  10. {atmem-2.2.1 → atmem-2.2.3}/docs/atbot-release.md +1 -1
  11. {atmem-2.2.1 → atmem-2.2.3}/docs/capabilities.json +2 -2
  12. {atmem-2.2.1 → atmem-2.2.3}/docs/current-status.md +4 -4
  13. {atmem-2.2.1 → atmem-2.2.3}/docs/openclaw-setup.md +2 -2
  14. atmem-2.2.3/docs/releases/v2.2.2.md +28 -0
  15. atmem-2.2.3/docs/releases/v2.2.3.md +32 -0
  16. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/README.md +2 -2
  17. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/openclaw.plugin.json +1 -1
  18. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/package-lock.json +2 -2
  19. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/package.json +1 -1
  20. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/src/rpc-client.ts +1 -1
  21. {atmem-2.2.1 → atmem-2.2.3}/pyproject.toml +2 -2
  22. {atmem-2.2.1 → atmem-2.2.3}/tests/test_cli_guidance.py +2 -2
  23. {atmem-2.2.1 → atmem-2.2.3}/tests/test_control_plane.py +3 -3
  24. {atmem-2.2.1 → atmem-2.2.3}/tests/test_documentation.py +5 -2
  25. {atmem-2.2.1 → atmem-2.2.3}/tools/smoke_installed_package.py +2 -2
  26. {atmem-2.2.1 → atmem-2.2.3}/tools/smoke_upgrade_from_2_1.py +3 -3
  27. {atmem-2.2.1 → atmem-2.2.3}/LICENSE +0 -0
  28. {atmem-2.2.1 → atmem-2.2.3}/MANIFEST.in +0 -0
  29. {atmem-2.2.1 → atmem-2.2.3}/atmem/__init__.py +0 -0
  30. {atmem-2.2.1 → atmem-2.2.3}/atmem/adapters/__init__.py +0 -0
  31. {atmem-2.2.1 → atmem-2.2.3}/atmem/adapters/base.py +0 -0
  32. {atmem-2.2.1 → atmem-2.2.3}/atmem/adapters/langgraph.py +0 -0
  33. {atmem-2.2.1 → atmem-2.2.3}/atmem/cli.py +0 -0
  34. {atmem-2.2.1 → atmem-2.2.3}/atmem/contracts/__init__.py +0 -0
  35. {atmem-2.2.1 → atmem-2.2.3}/atmem/contracts/models.py +0 -0
  36. {atmem-2.2.1 → atmem-2.2.3}/atmem/contracts/versions.py +0 -0
  37. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/__init__.py +0 -0
  38. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/assets/app.css +0 -0
  39. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/assets/app.html +0 -0
  40. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/assets/app.js +0 -0
  41. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/assets/atmem.jpg +0 -0
  42. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/atbot_companion.py +0 -0
  43. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/blackbox.py +0 -0
  44. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/compat.py +0 -0
  45. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/evidence.py +0 -0
  46. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/hosts.py +0 -0
  47. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/manager.py +0 -0
  48. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/models.py +0 -0
  49. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/openclaw_native.py +0 -0
  50. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/openclaw_topology.py +0 -0
  51. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/server.py +0 -0
  52. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/state.py +0 -0
  53. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/store.py +0 -0
  54. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/topology.py +0 -0
  55. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/ui.py +0 -0
  56. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/verify.py +0 -0
  57. {atmem-2.2.1 → atmem-2.2.3}/atmem/control/web.py +0 -0
  58. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/__init__.py +0 -0
  59. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/canonical.py +0 -0
  60. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/fact_keys.py +0 -0
  61. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/keys.py +0 -0
  62. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/policy.py +0 -0
  63. {atmem-2.2.1 → atmem-2.2.3}/atmem/core/storage.py +0 -0
  64. {atmem-2.2.1 → atmem-2.2.3}/atmem/dashboard_daemon.py +0 -0
  65. {atmem-2.2.1 → atmem-2.2.3}/atmem/extract/__init__.py +0 -0
  66. {atmem-2.2.1 → atmem-2.2.3}/atmem/extract/rules.py +0 -0
  67. {atmem-2.2.1 → atmem-2.2.3}/atmem/graph.py +0 -0
  68. {atmem-2.2.1 → atmem-2.2.3}/atmem/investigate.py +0 -0
  69. {atmem-2.2.1 → atmem-2.2.3}/atmem/maintenance.py +0 -0
  70. {atmem-2.2.1 → atmem-2.2.3}/atmem/mcp/__init__.py +0 -0
  71. {atmem-2.2.1 → atmem-2.2.3}/atmem/media.py +0 -0
  72. {atmem-2.2.1 → atmem-2.2.3}/atmem/memory.py +0 -0
  73. {atmem-2.2.1 → atmem-2.2.3}/atmem/retrieve/__init__.py +0 -0
  74. {atmem-2.2.1 → atmem-2.2.3}/atmem/retrieve/rank.py +0 -0
  75. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/__init__.py +0 -0
  76. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/capabilities.json +0 -0
  77. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/context-package.json +0 -0
  78. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/memory-proposal.json +0 -0
  79. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/recall-request.json +0 -0
  80. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/scope.json +0 -0
  81. {atmem-2.2.1 → atmem-2.2.3}/atmem/schemas/v1/source-capture.json +0 -0
  82. {atmem-2.2.1 → atmem-2.2.3}/atmem/semantic/__init__.py +0 -0
  83. {atmem-2.2.1 → atmem-2.2.3}/atmem/semantic/index.py +0 -0
  84. {atmem-2.2.1 → atmem-2.2.3}/atmem/semantic/providers.py +0 -0
  85. {atmem-2.2.1 → atmem-2.2.3}/atmem/store/__init__.py +0 -0
  86. {atmem-2.2.1 → atmem-2.2.3}/atmem/store/sqlite.py +0 -0
  87. {atmem-2.2.1 → atmem-2.2.3}/atmem.egg-info/dependency_links.txt +0 -0
  88. {atmem-2.2.1 → atmem-2.2.3}/atmem.egg-info/entry_points.txt +0 -0
  89. {atmem-2.2.1 → atmem-2.2.3}/atmem.egg-info/top_level.txt +0 -0
  90. {atmem-2.2.1 → atmem-2.2.3}/docs/agent-blackbox.md +0 -0
  91. {atmem-2.2.1 → atmem-2.2.3}/docs/audit-log-spec.md +0 -0
  92. {atmem-2.2.1 → atmem-2.2.3}/docs/audit-search.md +0 -0
  93. {atmem-2.2.1 → atmem-2.2.3}/docs/auditing-guide.md +0 -0
  94. {atmem-2.2.1 → atmem-2.2.3}/docs/control-plane.md +0 -0
  95. {atmem-2.2.1 → atmem-2.2.3}/docs/dashboard-design-language.md +0 -0
  96. {atmem-2.2.1 → atmem-2.2.3}/docs/data-storage-and-backup.md +0 -0
  97. {atmem-2.2.1 → atmem-2.2.3}/docs/framework-adapters.md +0 -0
  98. {atmem-2.2.1 → atmem-2.2.3}/docs/generic-adapter.md +0 -0
  99. {atmem-2.2.1 → atmem-2.2.3}/docs/integration-guide.md +0 -0
  100. {atmem-2.2.1 → atmem-2.2.3}/docs/multimodal-observations.md +0 -0
  101. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v1.0.0.md +0 -0
  102. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v2.0.0.md +0 -0
  103. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v2.0.1.md +0 -0
  104. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v2.1.0.md +0 -0
  105. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v2.2.0.md +0 -0
  106. {atmem-2.2.1 → atmem-2.2.3}/docs/releases/v2.2.1.md +0 -0
  107. {atmem-2.2.1 → atmem-2.2.3}/docs/saas-integration.md +0 -0
  108. {atmem-2.2.1 → atmem-2.2.3}/docs/semantic-search.md +0 -0
  109. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/index.ts +0 -0
  110. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/src/setup.ts +0 -0
  111. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/src/types.ts +0 -0
  112. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/test/hooks.mjs +0 -0
  113. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/test/setup.mjs +0 -0
  114. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/test/smoke.mjs +0 -0
  115. {atmem-2.2.1 → atmem-2.2.3}/integrations/openclaw/tsconfig.json +0 -0
  116. {atmem-2.2.1 → atmem-2.2.3}/setup.cfg +0 -0
  117. {atmem-2.2.1 → atmem-2.2.3}/tests/test_atbot_companion.py +0 -0
  118. {atmem-2.2.1 → atmem-2.2.3}/tests/test_atbot_service.py +0 -0
  119. {atmem-2.2.1 → atmem-2.2.3}/tests/test_auditability.py +0 -0
  120. {atmem-2.2.1 → atmem-2.2.3}/tests/test_blackbox.py +0 -0
  121. {atmem-2.2.1 → atmem-2.2.3}/tests/test_cli.py +0 -0
  122. {atmem-2.2.1 → atmem-2.2.3}/tests/test_contracts_v1.py +0 -0
  123. {atmem-2.2.1 → atmem-2.2.3}/tests/test_control_evidence.py +0 -0
  124. {atmem-2.2.1 → atmem-2.2.3}/tests/test_control_verify.py +0 -0
  125. {atmem-2.2.1 → atmem-2.2.3}/tests/test_dashboard_daemon.py +0 -0
  126. {atmem-2.2.1 → atmem-2.2.3}/tests/test_encryption.py +0 -0
  127. {atmem-2.2.1 → atmem-2.2.3}/tests/test_extract.py +0 -0
  128. {atmem-2.2.1 → atmem-2.2.3}/tests/test_framework_adapters.py +0 -0
  129. {atmem-2.2.1 → atmem-2.2.3}/tests/test_generic_control.py +0 -0
  130. {atmem-2.2.1 → atmem-2.2.3}/tests/test_graph.py +0 -0
  131. {atmem-2.2.1 → atmem-2.2.3}/tests/test_host_adapter.py +0 -0
  132. {atmem-2.2.1 → atmem-2.2.3}/tests/test_layers.py +0 -0
  133. {atmem-2.2.1 → atmem-2.2.3}/tests/test_maintenance.py +0 -0
  134. {atmem-2.2.1 → atmem-2.2.3}/tests/test_mcp.py +0 -0
  135. {atmem-2.2.1 → atmem-2.2.3}/tests/test_media_observations.py +0 -0
  136. {atmem-2.2.1 → atmem-2.2.3}/tests/test_memory.py +0 -0
  137. {atmem-2.2.1 → atmem-2.2.3}/tests/test_openclaw_control.py +0 -0
  138. {atmem-2.2.1 → atmem-2.2.3}/tests/test_openclaw_install.py +0 -0
  139. {atmem-2.2.1 → atmem-2.2.3}/tests/test_openclaw_topology.py +0 -0
  140. {atmem-2.2.1 → atmem-2.2.3}/tests/test_policy.py +0 -0
  141. {atmem-2.2.1 → atmem-2.2.3}/tests/test_recall_evidence.py +0 -0
  142. {atmem-2.2.1 → atmem-2.2.3}/tests/test_restore_receipt.py +0 -0
  143. {atmem-2.2.1 → atmem-2.2.3}/tests/test_retrieve.py +0 -0
  144. {atmem-2.2.1 → atmem-2.2.3}/tests/test_semantic_search.py +0 -0
  145. {atmem-2.2.1 → atmem-2.2.3}/tests/test_store_transactions.py +0 -0
  146. {atmem-2.2.1 → 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.1
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,7 +44,7 @@ Dynamic: license-file
44
44
 
45
45
  # AtMem
46
46
 
47
- [![Version 2.2.1](https://img.shields.io/badge/version-2.2.1-blue)](./docs/releases/v2.2.1.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.**
@@ -59,7 +59,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
59
59
  ### 1. Install AtMem and choose memory intelligence
60
60
 
61
61
  ```bash
62
- python -m pip install --upgrade atmem==2.2.1
62
+ python -m pip install --upgrade atmem==2.2.3
63
63
  atmem atbot setup
64
64
  atmem atbot doctor
65
65
  atmem dashboard
@@ -87,7 +87,7 @@ connection. Do not install the npm package yourself.
87
87
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
88
88
 
89
89
  ```bash
90
- python -m pip install --upgrade atmem==2.2.1
90
+ python -m pip install --upgrade atmem==2.2.3
91
91
  atmem openclaw upgrade
92
92
  atmem control verify
93
93
  ```
@@ -95,7 +95,7 @@ atmem control verify
95
95
  #### Pydantic AI — native capability
96
96
 
97
97
  ```bash
98
- python -m pip install 'atmem[pydantic-ai]==2.2.1'
98
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
99
99
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
100
100
  ```
101
101
 
@@ -119,7 +119,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
119
119
  #### LangChain/LangGraph — native middleware
120
120
 
121
121
  ```bash
122
- python -m pip install 'atmem[langgraph]==2.2.1'
122
+ python -m pip install 'atmem[langgraph]==2.2.3'
123
123
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
124
124
  ```
125
125
 
@@ -163,7 +163,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
163
163
  capture and hybrid ranking. Memory authority and agent operation do not depend
164
164
  on a hosted model.
165
165
 
166
- > **Release status:** this repository describes **AtMem 2.2.1**. AtBot is a
166
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
167
167
  > separately packaged, headless component installed and managed by AtMem; it is
168
168
  > not an independent agent or a second memory authority.
169
169
 
@@ -182,7 +182,7 @@ and restores it exactly.
182
182
  ## Installation details
183
183
 
184
184
  ```bash
185
- python -m pip install atmem==2.2.1
185
+ python -m pip install atmem==2.2.3
186
186
  atmem --version
187
187
  ```
188
188
 
@@ -190,7 +190,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
190
190
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
191
191
 
192
192
  ```bash
193
- python -m pip install 'atmem[semantic]==2.2.1'
193
+ python -m pip install 'atmem[semantic]==2.2.3'
194
194
  ```
195
195
 
196
196
  For repository development, install both workspace packages:
@@ -370,7 +370,7 @@ atmem control restore
370
370
  Existing 2.1 installations upgrade without starting a new migration:
371
371
 
372
372
  ```bash
373
- python -m pip install --upgrade atmem==2.2.1
373
+ python -m pip install --upgrade atmem==2.2.3
374
374
  atmem openclaw upgrade
375
375
  atmem control verify
376
376
  ```
@@ -516,7 +516,7 @@ npm test
516
516
  npm run smoke
517
517
  ```
518
518
 
519
- Current repository metadata is version **2.2.1**. Python and npm release
519
+ Current repository metadata is version **2.2.3**. Python and npm release
520
520
  versions are intentionally kept equal because the OpenClaw installer pins the
521
521
  matching bridge.
522
522
 
@@ -1,6 +1,6 @@
1
1
  # AtMem
2
2
 
3
- [![Version 2.2.1](https://img.shields.io/badge/version-2.2.1-blue)](./docs/releases/v2.2.1.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.**
@@ -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 --upgrade atmem==2.2.1
18
+ python -m pip install --upgrade atmem==2.2.3
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 --upgrade atmem==2.2.1
46
+ python -m pip install --upgrade atmem==2.2.3
47
47
  atmem openclaw upgrade
48
48
  atmem control verify
49
49
  ```
@@ -51,7 +51,7 @@ atmem control verify
51
51
  #### Pydantic AI — native capability
52
52
 
53
53
  ```bash
54
- python -m pip install 'atmem[pydantic-ai]==2.2.1'
54
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
55
55
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
56
56
  ```
57
57
 
@@ -75,7 +75,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
75
75
  #### LangChain/LangGraph — native middleware
76
76
 
77
77
  ```bash
78
- python -m pip install 'atmem[langgraph]==2.2.1'
78
+ python -m pip install 'atmem[langgraph]==2.2.3'
79
79
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
80
80
  ```
81
81
 
@@ -119,7 +119,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
119
119
  capture and hybrid ranking. Memory authority and agent operation do not depend
120
120
  on a hosted model.
121
121
 
122
- > **Release status:** this repository describes **AtMem 2.2.1**. AtBot is a
122
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
123
123
  > separately packaged, headless component installed and managed by AtMem; it is
124
124
  > not an independent agent or a second memory authority.
125
125
 
@@ -138,7 +138,7 @@ and restores it exactly.
138
138
  ## Installation details
139
139
 
140
140
  ```bash
141
- python -m pip install atmem==2.2.1
141
+ python -m pip install atmem==2.2.3
142
142
  atmem --version
143
143
  ```
144
144
 
@@ -146,7 +146,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
146
146
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
147
147
 
148
148
  ```bash
149
- python -m pip install 'atmem[semantic]==2.2.1'
149
+ python -m pip install 'atmem[semantic]==2.2.3'
150
150
  ```
151
151
 
152
152
  For repository development, install both workspace packages:
@@ -326,7 +326,7 @@ atmem control restore
326
326
  Existing 2.1 installations upgrade without starting a new migration:
327
327
 
328
328
  ```bash
329
- python -m pip install --upgrade atmem==2.2.1
329
+ python -m pip install --upgrade atmem==2.2.3
330
330
  atmem openclaw upgrade
331
331
  atmem control verify
332
332
  ```
@@ -472,7 +472,7 @@ npm test
472
472
  npm run smoke
473
473
  ```
474
474
 
475
- Current repository metadata is version **2.2.1**. Python and npm release
475
+ Current repository metadata is version **2.2.3**. Python and npm release
476
476
  versions are intentionally kept equal because the OpenClaw installer pins the
477
477
  matching bridge.
478
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.1"
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.1"
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.1
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,7 +44,7 @@ Dynamic: license-file
44
44
 
45
45
  # AtMem
46
46
 
47
- [![Version 2.2.1](https://img.shields.io/badge/version-2.2.1-blue)](./docs/releases/v2.2.1.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.**
@@ -59,7 +59,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
59
59
  ### 1. Install AtMem and choose memory intelligence
60
60
 
61
61
  ```bash
62
- python -m pip install --upgrade atmem==2.2.1
62
+ python -m pip install --upgrade atmem==2.2.3
63
63
  atmem atbot setup
64
64
  atmem atbot doctor
65
65
  atmem dashboard
@@ -87,7 +87,7 @@ connection. Do not install the npm package yourself.
87
87
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
88
88
 
89
89
  ```bash
90
- python -m pip install --upgrade atmem==2.2.1
90
+ python -m pip install --upgrade atmem==2.2.3
91
91
  atmem openclaw upgrade
92
92
  atmem control verify
93
93
  ```
@@ -95,7 +95,7 @@ atmem control verify
95
95
  #### Pydantic AI — native capability
96
96
 
97
97
  ```bash
98
- python -m pip install 'atmem[pydantic-ai]==2.2.1'
98
+ python -m pip install 'atmem[pydantic-ai]==2.2.3'
99
99
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
100
100
  ```
101
101
 
@@ -119,7 +119,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
119
119
  #### LangChain/LangGraph — native middleware
120
120
 
121
121
  ```bash
122
- python -m pip install 'atmem[langgraph]==2.2.1'
122
+ python -m pip install 'atmem[langgraph]==2.2.3'
123
123
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
124
124
  ```
125
125
 
@@ -163,7 +163,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
163
163
  capture and hybrid ranking. Memory authority and agent operation do not depend
164
164
  on a hosted model.
165
165
 
166
- > **Release status:** this repository describes **AtMem 2.2.1**. AtBot is a
166
+ > **Release status:** this repository describes **AtMem 2.2.3**. AtBot is a
167
167
  > separately packaged, headless component installed and managed by AtMem; it is
168
168
  > not an independent agent or a second memory authority.
169
169
 
@@ -182,7 +182,7 @@ and restores it exactly.
182
182
  ## Installation details
183
183
 
184
184
  ```bash
185
- python -m pip install atmem==2.2.1
185
+ python -m pip install atmem==2.2.3
186
186
  atmem --version
187
187
  ```
188
188
 
@@ -190,7 +190,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
190
190
  vector sidecar; the semantic extra adds an optional local embedding upgrade:
191
191
 
192
192
  ```bash
193
- python -m pip install 'atmem[semantic]==2.2.1'
193
+ python -m pip install 'atmem[semantic]==2.2.3'
194
194
  ```
195
195
 
196
196
  For repository development, install both workspace packages:
@@ -370,7 +370,7 @@ atmem control restore
370
370
  Existing 2.1 installations upgrade without starting a new migration:
371
371
 
372
372
  ```bash
373
- python -m pip install --upgrade atmem==2.2.1
373
+ python -m pip install --upgrade atmem==2.2.3
374
374
  atmem openclaw upgrade
375
375
  atmem control verify
376
376
  ```
@@ -516,7 +516,7 @@ npm test
516
516
  npm run smoke
517
517
  ```
518
518
 
519
- Current repository metadata is version **2.2.1**. Python and npm release
519
+ Current repository metadata is version **2.2.3**. Python and npm release
520
520
  versions are intentionally kept equal because the OpenClaw installer pins the
521
521
  matching bridge.
522
522
 
@@ -93,6 +93,8 @@ docs/releases/v2.0.1.md
93
93
  docs/releases/v2.1.0.md
94
94
  docs/releases/v2.2.0.md
95
95
  docs/releases/v2.2.1.md
96
+ docs/releases/v2.2.2.md
97
+ docs/releases/v2.2.3.md
96
98
  integrations/openclaw/README.md
97
99
  integrations/openclaw/index.ts
98
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
 
@@ -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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "product": "memory_control_plane",
3
- "version": "2.2.1",
3
+ "version": "2.2.3",
4
4
  "development_target": null,
5
5
  "release_status": "released",
6
6
  "engine": "model_agnostic",
@@ -8,7 +8,7 @@
8
8
  "intelligence_companion": {
9
9
  "package": "atbot",
10
10
  "distribution": "atmem-atbot",
11
- "pinned_version": "0.1.0a1",
11
+ "pinned_version": "0.1.0a2",
12
12
  "required_distribution_dependency": true,
13
13
  "separate_process": true,
14
14
  "loopback_protocol": "1",
@@ -2,8 +2,8 @@
2
2
 
3
3
  Updated: 31 August 2026
4
4
 
5
- Repository metadata and the matched OpenClaw bridge are version **2.2.1**.
6
- The required `atmem-atbot==0.1.0a1` companion is published separately and
5
+ Repository metadata and the matched OpenClaw bridge are version **2.2.3**.
6
+ The required `atmem-atbot==0.1.0a2` companion is published separately and
7
7
  installed automatically with AtMem.
8
8
 
9
9
  The release has four runtime boundaries:
@@ -42,7 +42,7 @@ The release has four runtime boundaries:
42
42
 
43
43
  ## Packaging and runtime status
44
44
 
45
- - `pyproject.toml` requires exactly `atmem-atbot==0.1.0a1`. The PyPI
45
+ - `pyproject.toml` requires exactly `atmem-atbot==0.1.0a2`. The PyPI
46
46
  distribution is `atmem-atbot`; its Python import and command remain `atbot`.
47
47
  - AtBot source lives under `packages/atbot`; it is a separately released
48
48
  distribution and process and does not own canonical storage.
@@ -75,7 +75,7 @@ The release has four runtime boundaries:
75
75
  ## Upgrade and support status
76
76
 
77
77
  - The release workflow creates persisted data with public AtMem 2.1.0, upgrades
78
- the same environment to 2.2.1, and verifies record identity, recall, audit
78
+ the same environment to 2.2.3, and verifies record identity, recall, audit
79
79
  integrity, control migration identity, candidate retention, schema migration,
80
80
  and automatic vector-sidecar creation before publication.
81
81
  - Existing OpenClaw installations upgrade the bridge with
@@ -9,7 +9,7 @@
9
9
  ## Install
10
10
 
11
11
  ```bash
12
- python -m pip install --upgrade atmem==2.2.1
12
+ python -m pip install --upgrade atmem==2.2.3
13
13
  atmem --version
14
14
  atmem openclaw install
15
15
  ```
@@ -22,7 +22,7 @@ Upgrade AtMem first, then refresh the existing bridge without creating a new
22
22
  migration or changing the current shadow/active mode:
23
23
 
24
24
  ```bash
25
- python -m pip install --upgrade atmem==2.2.1
25
+ python -m pip install --upgrade atmem==2.2.3
26
26
  atmem openclaw upgrade
27
27
  atmem control verify
28
28
  atmem atbot doctor
@@ -0,0 +1,28 @@
1
+ # AtMem 2.2.2 — unpublished release candidate
2
+
3
+ The 2.2.2 release gate detected a Pydantic AI 1.x adapter incompatibility before
4
+ AtMem, the OpenClaw npm bridge, or a GitHub release was published. The corrected
5
+ package was released as 2.2.3. Do not install or reference 2.2.2.
6
+
7
+ ## Candidate changes
8
+
9
+ - AtBot is updated to `atmem-atbot==0.1.0a2`.
10
+ - The companion now stays on Pydantic AI 1.x, OpenAI SDK 2.x, and the compatible
11
+ Jiter range used by the supported LangChain, OpenAI Agents SDK, LiteLLM,
12
+ LlamaIndex, and Instructor installations.
13
+ - Installing or upgrading AtMem no longer selects OpenAI SDK 3.x merely because
14
+ it is the newest release on PyPI.
15
+ - The documented `atmem openclaw upgrade` command remained available.
16
+
17
+ ## Upgrade
18
+
19
+ ```bash
20
+ python -m pip install --upgrade atmem==2.2.3
21
+ atmem openclaw upgrade
22
+ atmem control verify
23
+ ```
24
+
25
+ Existing 2.1.x and 2.2.x databases, record IDs, audit chains, memory mode,
26
+ OpenClaw configuration, and AtBot provider settings are retained.
27
+
28
+ The failed gate and correction are documented in the 2.2.3 release notes.
@@ -0,0 +1,32 @@
1
+ # AtMem 2.2.3 — dependency-safe upgrades
2
+
3
+ AtMem 2.2.3 keeps automatic AtBot installation compatible with shared Python
4
+ agent environments and supports both Pydantic AI 1.x and 2.x request contexts.
5
+
6
+ ## Fixed
7
+
8
+ - AtMem installs the published `atmem-atbot==0.1.0a2` companion.
9
+ - AtBot stays on Pydantic AI 1.x, OpenAI SDK 2.x, and Jiter below 0.14 instead
10
+ of upgrading a shared environment across incompatible major versions.
11
+ - The native Pydantic AI adapter reads model identity safely across both the
12
+ 1.x and 2.x `ModelRequestContext` shapes.
13
+ - The documented `atmem openclaw upgrade` command remains available and the
14
+ matched OpenClaw bridge version is 2.2.3.
15
+
16
+ ## Upgrade
17
+
18
+ ```bash
19
+ python -m pip install --upgrade atmem==2.2.3
20
+ atmem openclaw upgrade
21
+ atmem control verify
22
+ ```
23
+
24
+ Existing 2.1.x and 2.2.x databases, record IDs, audit chains, memory mode,
25
+ OpenClaw configuration, and AtBot provider settings are retained.
26
+
27
+ ## Verification
28
+
29
+ The release gate covers Python 3.10 through 3.13, Pydantic AI 1.x and 2.x
30
+ adapter behavior, clean-wheel dependency consistency, the 2.1.0 in-place
31
+ upgrade drill, AtBot packaging, and the OpenClaw typecheck, build, test, and
32
+ smoke suites.
@@ -5,11 +5,11 @@ This npm package is the host bridge for AtMem. It is not a standalone memory eng
5
5
  Use the Python-owned installer:
6
6
 
7
7
  ```bash
8
- python -m pip install --upgrade atmem==2.2.1
8
+ python -m pip install --upgrade atmem==2.2.3
9
9
  atmem openclaw install
10
10
  ```
11
11
 
12
- The installer pins `openclaw-memory-atmem@2.2.1`, binds the exact `atmem` executable, copies existing OpenClaw memory, configures shadow mode, restarts the gateway and verifies the loaded plugin. Direct npm installation cannot perform or prove those steps.
12
+ The installer pins `openclaw-memory-atmem@2.2.3`, binds the exact `atmem` executable, copies existing OpenClaw memory, configures shadow mode, restarts the gateway and verifies the loaded plugin. Direct npm installation cannot perform or prove those steps.
13
13
 
14
14
  Existing AtMem 2.1 users run `atmem openclaw upgrade` after upgrading the Python
15
15
  package. This preserves the current memory mode and migration, verifies the new
@@ -2,7 +2,7 @@
2
2
  "id": "memory-atmem",
3
3
  "name": "Memory (atmem)",
4
4
  "description": "OpenClaw bridge installed and managed by the AtMem memory control plane.",
5
- "version": "2.2.1",
5
+ "version": "2.2.3",
6
6
  "commandAliases": ["memory-atmem"],
7
7
  "activation": {
8
8
  "onStartup": true
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "openclaw-memory-atmem",
3
- "version": "2.2.1",
3
+ "version": "2.2.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "openclaw-memory-atmem",
9
- "version": "2.2.1",
9
+ "version": "2.2.3",
10
10
  "license": "Apache-2.0",
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.20.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-memory-atmem",
3
- "version": "2.2.1",
3
+ "version": "2.2.3",
4
4
  "description": "OpenClaw Agent Black Box and memory control-plane bridge for AtMem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -166,7 +166,7 @@ export class AtmemClient {
166
166
  capabilities: {},
167
167
  clientInfo: {
168
168
  name: "openclaw-memory-atmem",
169
- version: "2.2.1",
169
+ version: "2.2.3",
170
170
  },
171
171
  });
172
172
  this.notify("notifications/initialized", {});
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atmem"
7
- version = "2.2.1"
7
+ version = "2.2.3"
8
8
  description = "Host-neutral Agent Black Box and reversible memory control plane."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -27,7 +27,7 @@ classifiers = [
27
27
  "Topic :: Software Development :: Libraries :: Python Modules",
28
28
  ]
29
29
  dependencies = [
30
- "atmem-atbot==0.1.0a1",
30
+ "atmem-atbot==0.1.0a2",
31
31
  ]
32
32
 
33
33
  [project.optional-dependencies]
@@ -35,7 +35,7 @@ def test_openclaw_upgrade_preserves_mode_and_reports_verified_bridge(
35
35
  "format": "atmem-openclaw-bridge-refresh-v1",
36
36
  "refreshed": True,
37
37
  "previous_bridge_version": "2.1.0",
38
- "bridge_version": "2.2.1",
38
+ "bridge_version": "2.2.3",
39
39
  "mode": "active",
40
40
  "gateway_verified": True,
41
41
  "test_flight": {
@@ -49,7 +49,7 @@ def test_openclaw_upgrade_preserves_mode_and_reports_verified_bridge(
49
49
  cli.main()
50
50
 
51
51
  result = json.loads(capsys.readouterr().out)
52
- assert result["bridge_version"] == "2.2.1"
52
+ assert result["bridge_version"] == "2.2.3"
53
53
  assert result["mode"] == "active"
54
54
  assert result["test_flight"]["valid"] is True
55
55
 
@@ -510,7 +510,7 @@ def test_dashboard_is_direct_on_loopback_and_uses_csrf_for_mutations(
510
510
  "refresh_openclaw_bridge_and_test",
511
511
  lambda **_kwargs: {
512
512
  "refreshed": True,
513
- "bridge_version": "2.2.1",
513
+ "bridge_version": "2.2.3",
514
514
  "test_flight": {
515
515
  "run_id": "fresh-run",
516
516
  "verdict": "completed_successfully",
@@ -531,7 +531,7 @@ def test_dashboard_is_direct_on_loopback_and_uses_csrf_for_mutations(
531
531
  "openclaw_bridge_refresh_status",
532
532
  lambda: {
533
533
  "available": True,
534
- "pinned_version": "2.2.1",
534
+ "pinned_version": "2.2.3",
535
535
  "installed_version": "1.0.0",
536
536
  },
537
537
  )
@@ -552,7 +552,7 @@ def test_dashboard_is_direct_on_loopback_and_uses_csrf_for_mutations(
552
552
  assert opener.open(f"{base}/api/status").status == 200
553
553
  product = json.loads(opener.open(f"{base}/api/product").read())
554
554
  assert product["atmem_pip_version"]
555
- assert product["atmem_npm_version"] == "2.2.1"
555
+ assert product["atmem_npm_version"] == "2.2.3"
556
556
  assert product["x_url"] == "https://x.com/AtMemX"
557
557
  profiles = json.loads(opener.open(f"{base}/api/companion/profiles").read())
558
558
  assert {"local-ollama", "openai", "anthropic"} <= set(profiles["providers"])
@@ -63,9 +63,9 @@ def test_readme_puts_supported_quick_starts_front_and_center() -> None:
63
63
  assert "atmem atbot setup" in opening
64
64
  assert "atmem openclaw install" in opening
65
65
  assert "atmem openclaw upgrade" in opening
66
- assert "atmem[pydantic-ai]==2.2.1" in opening
66
+ assert "atmem[pydantic-ai]==2.2.3" in opening
67
67
  assert "PydanticAIAtMemAdapter" in opening
68
- assert "atmem[langgraph]==2.2.1" in opening
68
+ assert "atmem[langgraph]==2.2.3" in opening
69
69
  assert "create_langgraph_middleware" in opening
70
70
  assert "atmem control activate" in opening
71
71
 
@@ -89,6 +89,9 @@ def test_development_docs_match_companion_packaging() -> None:
89
89
 
90
90
  assert 'name = "atmem-atbot"' in companion_metadata
91
91
  assert f'"atmem-atbot=={companion_version}"' in root_metadata
92
+ assert '"pydantic-ai-slim[openai]>=1,<2"' in companion_metadata
93
+ assert '"openai>=2.29,<3"' in companion_metadata
94
+ assert '"jiter>=0.10,<0.14"' in companion_metadata
92
95
  assert companion["distribution"] == "atmem-atbot"
93
96
  assert companion["pinned_version"] == companion_version
94
97
  assert companion["required_distribution_dependency"] is True
@@ -21,7 +21,7 @@ def json_run(*args: str) -> object:
21
21
 
22
22
  def main() -> None:
23
23
  distribution = importlib.metadata.distribution("atmem")
24
- assert distribution.version == "2.2.1"
24
+ assert distribution.version == "2.2.3"
25
25
  scripts = {
26
26
  entry.name: entry.value
27
27
  for entry in distribution.entry_points
@@ -31,7 +31,7 @@ def main() -> None:
31
31
 
32
32
  executable = Path(sys.executable).with_name("atmem")
33
33
  assert executable.is_file()
34
- assert "2.2.1" in run(str(executable), "--version").stdout
34
+ assert "2.2.3" in run(str(executable), "--version").stdout
35
35
 
36
36
  with tempfile.TemporaryDirectory(prefix="atmem-wheel-smoke-") as temp:
37
37
  database = Path(temp) / "memory.db"
@@ -76,8 +76,8 @@ def create_fixture(root: Path) -> None:
76
76
 
77
77
  def verify_upgrade(root: Path) -> None:
78
78
  manifest = json.loads((root / "fixture.json").read_text(encoding="utf-8"))
79
- assert importlib.metadata.version("atmem") == "2.2.1"
80
- assert importlib.metadata.version("atmem-atbot") == "0.1.0a1"
79
+ assert importlib.metadata.version("atmem") == "2.2.3"
80
+ assert importlib.metadata.version("atmem-atbot") == "0.1.0a2"
81
81
 
82
82
  database = root / "memory.db"
83
83
  memory = Memory(database)
@@ -116,7 +116,7 @@ def verify_upgrade(root: Path) -> None:
116
116
  "SELECT value FROM schema_meta WHERE key = 'schema_version'"
117
117
  ).fetchone()[0]
118
118
  assert int(schema_version) == 4
119
- print("AtMem 2.1.0 -> 2.2.1 upgrade smoke test passed")
119
+ print("AtMem 2.1.0 -> 2.2.3 upgrade smoke test passed")
120
120
 
121
121
 
122
122
  def main() -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes