atmem 2.2.4__tar.gz → 2.2.5__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.
- {atmem-2.2.4/atmem.egg-info → atmem-2.2.5}/PKG-INFO +16 -16
- {atmem-2.2.4 → atmem-2.2.5}/README.md +14 -14
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/atbot_service.py +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/atmem/mcp/server.py +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/atmem/openclaw_install.py +1 -1
- {atmem-2.2.4 → atmem-2.2.5/atmem.egg-info}/PKG-INFO +16 -16
- {atmem-2.2.4 → atmem-2.2.5}/atmem.egg-info/SOURCES.txt +1 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem.egg-info/requires.txt +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/docs/atbot-release.md +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/docs/capabilities.json +2 -2
- {atmem-2.2.4 → atmem-2.2.5}/docs/current-status.md +7 -5
- {atmem-2.2.4 → atmem-2.2.5}/docs/openclaw-setup.md +2 -2
- atmem-2.2.5/docs/releases/v2.2.5.md +34 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/README.md +2 -2
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/openclaw.plugin.json +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/package-lock.json +2 -2
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/package.json +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/src/rpc-client.ts +1 -1
- {atmem-2.2.4 → atmem-2.2.5}/pyproject.toml +2 -2
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_cli_guidance.py +3 -3
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_control_plane.py +3 -3
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_dashboard_daemon.py +4 -4
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_documentation.py +3 -3
- {atmem-2.2.4 → atmem-2.2.5}/tools/smoke_installed_package.py +2 -2
- {atmem-2.2.4 → atmem-2.2.5}/tools/smoke_upgrade_from_2_1.py +5 -5
- {atmem-2.2.4 → atmem-2.2.5}/LICENSE +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/MANIFEST.in +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/adapters/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/adapters/base.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/adapters/langgraph.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/adapters/pydantic_ai.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/cli.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/contracts/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/contracts/models.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/contracts/versions.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/assets/app.css +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/assets/app.html +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/assets/app.js +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/assets/atmem.jpg +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/atbot_companion.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/blackbox.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/compat.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/evidence.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/hosts.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/manager.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/models.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/openclaw_native.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/openclaw_topology.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/server.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/state.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/store.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/topology.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/ui.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/verify.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/control/web.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/canonical.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/fact_keys.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/keys.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/policy.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/core/storage.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/dashboard_daemon.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/extract/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/extract/rules.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/graph.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/investigate.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/maintenance.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/mcp/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/media.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/memory.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/retrieve/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/retrieve/rank.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/capabilities.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/context-package.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/memory-proposal.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/recall-request.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/scope.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/schemas/v1/source-capture.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/semantic/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/semantic/index.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/semantic/providers.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/store/__init__.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem/store/sqlite.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem.egg-info/dependency_links.txt +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem.egg-info/entry_points.txt +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/atmem.egg-info/top_level.txt +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/agent-blackbox.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/audit-log-spec.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/audit-search.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/auditing-guide.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/control-plane.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/dashboard-design-language.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/data-storage-and-backup.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/framework-adapters.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/generic-adapter.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/integration-guide.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/multimodal-observations.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v1.0.0.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.0.0.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.0.1.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.1.0.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.2.0.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.2.1.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.2.2.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.2.3.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/releases/v2.2.4.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/saas-integration.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/docs/semantic-search.md +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/index.ts +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/src/setup.ts +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/src/types.ts +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/test/hooks.mjs +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/test/setup.mjs +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/test/smoke.mjs +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/integrations/openclaw/tsconfig.json +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/setup.cfg +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_atbot_companion.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_atbot_service.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_auditability.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_blackbox.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_cli.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_contracts_v1.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_control_evidence.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_control_verify.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_encryption.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_extract.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_framework_adapters.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_generic_control.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_graph.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_host_adapter.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_layers.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_maintenance.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_mcp.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_media_observations.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_memory.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_openclaw_control.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_openclaw_install.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_openclaw_topology.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_policy.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_recall_evidence.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_restore_receipt.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_retrieve.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_semantic_search.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tests/test_store_transactions.py +0 -0
- {atmem-2.2.4 → atmem-2.2.5}/tools/verify_audit.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atmem
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.5
|
|
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.
|
|
27
|
+
Requires-Dist: atmem-atbot==0.1.0a4
|
|
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
|
-
[](./docs/releases/v2.2.5.md)
|
|
48
48
|
[](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.
|
|
62
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
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.
|
|
90
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
91
91
|
atmem openclaw upgrade
|
|
92
92
|
atmem control verify
|
|
93
93
|
```
|
|
@@ -110,7 +110,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
110
110
|
#### Pydantic AI — native capability
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
|
-
python -m pip install 'atmem[pydantic-ai]==2.2.
|
|
113
|
+
python -m pip install 'atmem[pydantic-ai]==2.2.5'
|
|
114
114
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
115
115
|
```
|
|
116
116
|
|
|
@@ -134,7 +134,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
134
134
|
#### LangChain/LangGraph — native middleware
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
|
-
python -m pip install 'atmem[langgraph]==2.2.
|
|
137
|
+
python -m pip install 'atmem[langgraph]==2.2.5'
|
|
138
138
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
139
139
|
```
|
|
140
140
|
|
|
@@ -178,7 +178,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
|
|
|
178
178
|
capture and hybrid ranking. Memory authority and agent operation do not depend
|
|
179
179
|
on a hosted model.
|
|
180
180
|
|
|
181
|
-
> **Release status:** this repository describes **AtMem 2.2.
|
|
181
|
+
> **Release status:** this repository describes **AtMem 2.2.5**. AtBot is a
|
|
182
182
|
> separately packaged, headless component installed and managed by AtMem; it is
|
|
183
183
|
> not an independent agent or a second memory authority.
|
|
184
184
|
|
|
@@ -197,7 +197,7 @@ and restores it exactly.
|
|
|
197
197
|
## Installation details
|
|
198
198
|
|
|
199
199
|
```bash
|
|
200
|
-
python -m pip install atmem==2.2.
|
|
200
|
+
python -m pip install atmem==2.2.5
|
|
201
201
|
atmem --version
|
|
202
202
|
```
|
|
203
203
|
|
|
@@ -205,7 +205,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
|
|
|
205
205
|
vector sidecar; the semantic extra adds an optional local embedding upgrade:
|
|
206
206
|
|
|
207
207
|
```bash
|
|
208
|
-
python -m pip install 'atmem[semantic]==2.2.
|
|
208
|
+
python -m pip install 'atmem[semantic]==2.2.5'
|
|
209
209
|
```
|
|
210
210
|
|
|
211
211
|
For repository development, install both workspace packages:
|
|
@@ -215,10 +215,10 @@ python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
|
|
|
215
215
|
atmem atbot setup
|
|
216
216
|
```
|
|
217
217
|
|
|
218
|
-
The authority modules remain model-agnostic and do not import AtBot
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
218
|
+
The authority modules remain model-agnostic and do not import AtBot. The AtMem
|
|
219
|
+
distribution requires the separately packaged, exactly pinned AtBot companion,
|
|
220
|
+
whose built-in Ollama and OpenAI-compatible client uses only the Python standard
|
|
221
|
+
library. Framework SDKs enter the environment only through explicit extras.
|
|
222
222
|
|
|
223
223
|
## Integration boundaries
|
|
224
224
|
|
|
@@ -385,7 +385,7 @@ atmem control restore
|
|
|
385
385
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
386
386
|
|
|
387
387
|
```bash
|
|
388
|
-
python -m pip install --upgrade atmem==2.2.
|
|
388
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
389
389
|
atmem openclaw upgrade
|
|
390
390
|
atmem control verify
|
|
391
391
|
```
|
|
@@ -531,7 +531,7 @@ npm test
|
|
|
531
531
|
npm run smoke
|
|
532
532
|
```
|
|
533
533
|
|
|
534
|
-
Current repository metadata is version **2.2.
|
|
534
|
+
Current repository metadata is version **2.2.5**. Python and npm release
|
|
535
535
|
versions are intentionally kept equal because the OpenClaw installer pins the
|
|
536
536
|
matching bridge.
|
|
537
537
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AtMem
|
|
2
2
|
|
|
3
|
-
[](./docs/releases/v2.2.5.md)
|
|
4
4
|
[](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.
|
|
18
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
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.
|
|
46
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
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 'atmem[pydantic-ai]==2.2.
|
|
69
|
+
python -m pip install 'atmem[pydantic-ai]==2.2.5'
|
|
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 'atmem[langgraph]==2.2.
|
|
93
|
+
python -m pip install 'atmem[langgraph]==2.2.5'
|
|
94
94
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
95
95
|
```
|
|
96
96
|
|
|
@@ -134,7 +134,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
|
|
|
134
134
|
capture and hybrid ranking. Memory authority and agent operation do not depend
|
|
135
135
|
on a hosted model.
|
|
136
136
|
|
|
137
|
-
> **Release status:** this repository describes **AtMem 2.2.
|
|
137
|
+
> **Release status:** this repository describes **AtMem 2.2.5**. AtBot is a
|
|
138
138
|
> separately packaged, headless component installed and managed by AtMem; it is
|
|
139
139
|
> not an independent agent or a second memory authority.
|
|
140
140
|
|
|
@@ -153,7 +153,7 @@ and restores it exactly.
|
|
|
153
153
|
## Installation details
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
|
-
python -m pip install atmem==2.2.
|
|
156
|
+
python -m pip install atmem==2.2.5
|
|
157
157
|
atmem --version
|
|
158
158
|
```
|
|
159
159
|
|
|
@@ -161,7 +161,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
|
|
|
161
161
|
vector sidecar; the semantic extra adds an optional local embedding upgrade:
|
|
162
162
|
|
|
163
163
|
```bash
|
|
164
|
-
python -m pip install 'atmem[semantic]==2.2.
|
|
164
|
+
python -m pip install 'atmem[semantic]==2.2.5'
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
For repository development, install both workspace packages:
|
|
@@ -171,10 +171,10 @@ python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
|
|
|
171
171
|
atmem atbot setup
|
|
172
172
|
```
|
|
173
173
|
|
|
174
|
-
The authority modules remain model-agnostic and do not import AtBot
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
The authority modules remain model-agnostic and do not import AtBot. The AtMem
|
|
175
|
+
distribution requires the separately packaged, exactly pinned AtBot companion,
|
|
176
|
+
whose built-in Ollama and OpenAI-compatible client uses only the Python standard
|
|
177
|
+
library. Framework SDKs enter the environment only through explicit extras.
|
|
178
178
|
|
|
179
179
|
## Integration boundaries
|
|
180
180
|
|
|
@@ -341,7 +341,7 @@ atmem control restore
|
|
|
341
341
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
342
342
|
|
|
343
343
|
```bash
|
|
344
|
-
python -m pip install --upgrade atmem==2.2.
|
|
344
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
345
345
|
atmem openclaw upgrade
|
|
346
346
|
atmem control verify
|
|
347
347
|
```
|
|
@@ -487,7 +487,7 @@ npm test
|
|
|
487
487
|
npm run smoke
|
|
488
488
|
```
|
|
489
489
|
|
|
490
|
-
Current repository metadata is version **2.2.
|
|
490
|
+
Current repository metadata is version **2.2.5**. Python and npm release
|
|
491
491
|
versions are intentionally kept equal because the OpenClaw installer pins the
|
|
492
492
|
matching bridge.
|
|
493
493
|
|
|
@@ -17,7 +17,7 @@ from atmem.control.manager import DEFAULT_STATE_PATH, DEFAULT_CONTROL_ROOT
|
|
|
17
17
|
|
|
18
18
|
OPENCLAW_PLUGIN_ID = "memory-atmem"
|
|
19
19
|
OPENCLAW_PLUGIN_PACKAGE = "openclaw-memory-atmem"
|
|
20
|
-
OPENCLAW_PLUGIN_VERSION = "2.2.
|
|
20
|
+
OPENCLAW_PLUGIN_VERSION = "2.2.5"
|
|
21
21
|
_CONFIG_KEY = "plugins.entries.memory-atmem"
|
|
22
22
|
|
|
23
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atmem
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.5
|
|
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.
|
|
27
|
+
Requires-Dist: atmem-atbot==0.1.0a4
|
|
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
|
-
[](./docs/releases/v2.2.5.md)
|
|
48
48
|
[](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.
|
|
62
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
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.
|
|
90
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
91
91
|
atmem openclaw upgrade
|
|
92
92
|
atmem control verify
|
|
93
93
|
```
|
|
@@ -110,7 +110,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
110
110
|
#### Pydantic AI — native capability
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
|
-
python -m pip install 'atmem[pydantic-ai]==2.2.
|
|
113
|
+
python -m pip install 'atmem[pydantic-ai]==2.2.5'
|
|
114
114
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
115
115
|
```
|
|
116
116
|
|
|
@@ -134,7 +134,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
134
134
|
#### LangChain/LangGraph — native middleware
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
|
-
python -m pip install 'atmem[langgraph]==2.2.
|
|
137
|
+
python -m pip install 'atmem[langgraph]==2.2.5'
|
|
138
138
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
139
139
|
```
|
|
140
140
|
|
|
@@ -178,7 +178,7 @@ If AtBot or its selected model is unavailable, AtMem continues with safe local
|
|
|
178
178
|
capture and hybrid ranking. Memory authority and agent operation do not depend
|
|
179
179
|
on a hosted model.
|
|
180
180
|
|
|
181
|
-
> **Release status:** this repository describes **AtMem 2.2.
|
|
181
|
+
> **Release status:** this repository describes **AtMem 2.2.5**. AtBot is a
|
|
182
182
|
> separately packaged, headless component installed and managed by AtMem; it is
|
|
183
183
|
> not an independent agent or a second memory authority.
|
|
184
184
|
|
|
@@ -197,7 +197,7 @@ and restores it exactly.
|
|
|
197
197
|
## Installation details
|
|
198
198
|
|
|
199
199
|
```bash
|
|
200
|
-
python -m pip install atmem==2.2.
|
|
200
|
+
python -m pip install atmem==2.2.5
|
|
201
201
|
atmem --version
|
|
202
202
|
```
|
|
203
203
|
|
|
@@ -205,7 +205,7 @@ AtMem requires Python 3.10 or newer. It always creates a dependency-free local
|
|
|
205
205
|
vector sidecar; the semantic extra adds an optional local embedding upgrade:
|
|
206
206
|
|
|
207
207
|
```bash
|
|
208
|
-
python -m pip install 'atmem[semantic]==2.2.
|
|
208
|
+
python -m pip install 'atmem[semantic]==2.2.5'
|
|
209
209
|
```
|
|
210
210
|
|
|
211
211
|
For repository development, install both workspace packages:
|
|
@@ -215,10 +215,10 @@ python -m pip install -e './packages/atbot[dev]' -e '.[dev]'
|
|
|
215
215
|
atmem atbot setup
|
|
216
216
|
```
|
|
217
217
|
|
|
218
|
-
The authority modules remain model-agnostic and do not import AtBot
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
218
|
+
The authority modules remain model-agnostic and do not import AtBot. The AtMem
|
|
219
|
+
distribution requires the separately packaged, exactly pinned AtBot companion,
|
|
220
|
+
whose built-in Ollama and OpenAI-compatible client uses only the Python standard
|
|
221
|
+
library. Framework SDKs enter the environment only through explicit extras.
|
|
222
222
|
|
|
223
223
|
## Integration boundaries
|
|
224
224
|
|
|
@@ -385,7 +385,7 @@ atmem control restore
|
|
|
385
385
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
386
386
|
|
|
387
387
|
```bash
|
|
388
|
-
python -m pip install --upgrade atmem==2.2.
|
|
388
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
389
389
|
atmem openclaw upgrade
|
|
390
390
|
atmem control verify
|
|
391
391
|
```
|
|
@@ -531,7 +531,7 @@ npm test
|
|
|
531
531
|
npm run smoke
|
|
532
532
|
```
|
|
533
533
|
|
|
534
|
-
Current repository metadata is version **2.2.
|
|
534
|
+
Current repository metadata is version **2.2.5**. Python and npm release
|
|
535
535
|
versions are intentionally kept equal because the OpenClaw installer pins the
|
|
536
536
|
matching bridge.
|
|
537
537
|
|
|
@@ -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.
|
|
34
|
+
`atbot-v0.1.0a4`.
|
|
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.
|
|
3
|
+
"version": "2.2.5",
|
|
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.
|
|
11
|
+
"pinned_version": "0.1.0a4",
|
|
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: 1 September 2026
|
|
4
4
|
|
|
5
|
-
Repository metadata and the matched OpenClaw bridge are version **2.2.
|
|
6
|
-
The required `atmem-atbot==0.1.
|
|
5
|
+
Repository metadata and the matched OpenClaw bridge are version **2.2.5**.
|
|
6
|
+
The required `atmem-atbot==0.1.0a4` companion is published separately and
|
|
7
7
|
installed automatically with AtMem.
|
|
8
8
|
|
|
9
9
|
The release has four runtime boundaries:
|
|
@@ -42,10 +42,12 @@ 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.
|
|
45
|
+
- `pyproject.toml` requires exactly `atmem-atbot==0.1.0a4`. 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.
|
|
49
|
+
- AtBot's built-in Ollama and OpenAI-compatible provider uses the standard
|
|
50
|
+
library and adds no model-SDK dependency to a default AtMem install.
|
|
49
51
|
- A clean 2.2 installation resolves the published companion automatically.
|
|
50
52
|
Repository development installs both packages explicitly with editable
|
|
51
53
|
installs.
|
|
@@ -74,8 +76,8 @@ The release has four runtime boundaries:
|
|
|
74
76
|
|
|
75
77
|
## Upgrade and support status
|
|
76
78
|
|
|
77
|
-
- The release workflow creates persisted data with public AtMem 2.1.0
|
|
78
|
-
2.2.
|
|
79
|
+
- The release workflow creates persisted data with public AtMem 2.1.0, 2.2.3,
|
|
80
|
+
and 2.2.4, upgrades each environment to 2.2.5, and verifies record identity, recall, audit
|
|
79
81
|
integrity, control migration identity, candidate retention, schema migration,
|
|
80
82
|
and automatic vector-sidecar creation before publication.
|
|
81
83
|
- 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.
|
|
12
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
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.
|
|
25
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
26
26
|
atmem openclaw upgrade
|
|
27
27
|
atmem control verify
|
|
28
28
|
atmem atbot doctor
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# AtMem 2.2.5 — SDK-neutral default install
|
|
2
|
+
|
|
3
|
+
AtMem 2.2.5 supersedes 2.2.4 after final public-install verification found that
|
|
4
|
+
AtBot's default Pydantic AI extra could upgrade OpenAI and Jiter across a shared
|
|
5
|
+
agent environment. The default install is now SDK-neutral.
|
|
6
|
+
|
|
7
|
+
## Fixed
|
|
8
|
+
|
|
9
|
+
- AtBot `0.1.0a4` uses its built-in standard-library OpenAI-compatible client
|
|
10
|
+
for local Ollama and compatible hosted endpoints.
|
|
11
|
+
- Installing or upgrading base AtMem no longer installs or upgrades Pydantic
|
|
12
|
+
AI, OpenAI, or Jiter.
|
|
13
|
+
- Pydantic AI support remains available explicitly through
|
|
14
|
+
`atmem[pydantic-ai]`; LangChain/LangGraph support remains available through
|
|
15
|
+
`atmem[langgraph]` or `atmem[frameworks]`.
|
|
16
|
+
- OpenClaw 2026.8.1 support, stale-dashboard replacement, idempotent bridge
|
|
17
|
+
upgrades, and the 2.1.0/2.2.3 persisted-state upgrade gates from 2.2.4 remain
|
|
18
|
+
intact.
|
|
19
|
+
|
|
20
|
+
## Upgrade
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
24
|
+
atmem openclaw upgrade
|
|
25
|
+
atmem control verify
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Existing memory, evidence, configuration, restore state, and provider settings
|
|
29
|
+
are retained.
|
|
30
|
+
|
|
31
|
+
If 2.2.4 was installed into a shared environment before this superseding patch,
|
|
32
|
+
run `python -m pip check`. Pydantic AI/OpenAI packages left behind by pip are no
|
|
33
|
+
longer AtMem requirements and may be reconciled according to the other agent
|
|
34
|
+
packages in that environment.
|
|
@@ -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.
|
|
8
|
+
python -m pip install --upgrade atmem==2.2.5
|
|
9
9
|
atmem openclaw install
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
The installer pins `openclaw-memory-atmem@2.2.
|
|
12
|
+
The installer pins `openclaw-memory-atmem@2.2.5`, 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
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openclaw-memory-atmem",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.5",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "openclaw-memory-atmem",
|
|
9
|
-
"version": "2.2.
|
|
9
|
+
"version": "2.2.5",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@types/node": "^22.20.1",
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "atmem"
|
|
7
|
-
version = "2.2.
|
|
7
|
+
version = "2.2.5"
|
|
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.
|
|
30
|
+
"atmem-atbot==0.1.0a4",
|
|
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.
|
|
38
|
+
"bridge_version": "2.2.5",
|
|
39
39
|
"mode": "active",
|
|
40
40
|
"gateway_verified": True,
|
|
41
41
|
"test_flight": {
|
|
@@ -51,7 +51,7 @@ def test_openclaw_upgrade_preserves_mode_and_reports_verified_bridge(
|
|
|
51
51
|
"format": "atmem-dashboard-upgrade-v1",
|
|
52
52
|
"was_running": True,
|
|
53
53
|
"restarted": True,
|
|
54
|
-
"atmem_version": "2.2.
|
|
54
|
+
"atmem_version": "2.2.5",
|
|
55
55
|
},
|
|
56
56
|
)
|
|
57
57
|
monkeypatch.setattr(sys, "argv", ["atmem", "openclaw", "upgrade", "--json"])
|
|
@@ -59,7 +59,7 @@ def test_openclaw_upgrade_preserves_mode_and_reports_verified_bridge(
|
|
|
59
59
|
cli.main()
|
|
60
60
|
|
|
61
61
|
result = json.loads(capsys.readouterr().out)
|
|
62
|
-
assert result["bridge_version"] == "2.2.
|
|
62
|
+
assert result["bridge_version"] == "2.2.5"
|
|
63
63
|
assert result["mode"] == "active"
|
|
64
64
|
assert result["test_flight"]["valid"] is True
|
|
65
65
|
assert result["dashboard"]["restarted"] is True
|
|
@@ -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.
|
|
513
|
+
"bridge_version": "2.2.5",
|
|
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.
|
|
534
|
+
"pinned_version": "2.2.5",
|
|
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.
|
|
555
|
+
assert product["atmem_npm_version"] == "2.2.5"
|
|
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"])
|