atmem 2.3.3__tar.gz → 2.3.4__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.3.3/atmem.egg-info → atmem-2.3.4}/PKG-INFO +23 -15
- {atmem-2.3.3 → atmem-2.3.4}/README.md +20 -14
- {atmem-2.3.3 → atmem-2.3.4}/atmem/cli.py +270 -10
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/assets/app.css +67 -20
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/assets/app.html +38 -9
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/assets/app.js +62 -11
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/compat.py +1 -0
- atmem-2.3.4/atmem/control/jev_service.py +165 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/manager.py +24 -1
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/web.py +31 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/service.py +30 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/store.py +12 -1
- atmem-2.3.4/atmem/integrations/__init__.py +1 -0
- atmem-2.3.4/atmem/integrations/atflows.py +189 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/mcp/server.py +1 -1
- {atmem-2.3.3 → atmem-2.3.4}/atmem/openclaw_install.py +1 -1
- {atmem-2.3.3 → atmem-2.3.4/atmem.egg-info}/PKG-INFO +23 -15
- {atmem-2.3.3 → atmem-2.3.4}/atmem.egg-info/SOURCES.txt +33 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem.egg-info/requires.txt +3 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/agent-blackbox.md +19 -5
- {atmem-2.3.3 → atmem-2.3.4}/docs/benchmarks.md +4 -5
- {atmem-2.3.3 → atmem-2.3.4}/docs/control-plane.md +1 -1
- {atmem-2.3.3 → atmem-2.3.4}/docs/current-status.md +30 -26
- atmem-2.3.4/docs/data-storage-and-backup.md +67 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/framework-adapters.md +2 -1
- atmem-2.3.4/docs/http-api.md +124 -0
- atmem-2.3.4/docs/implementation-evidence/026/20260920T094307Z-85c2ae2-atflows-b2.md +15 -0
- atmem-2.3.4/docs/implementation-evidence/026/20260920T105859Z-atmem-234-stable.md +12 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/release-2.3.3.md +42 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/multimodal-observations.md +7 -3
- atmem-2.3.4/docs/release-roadmap.md +164 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.3.3.md +7 -9
- atmem-2.3.4/docs/releases/v2.3.4.md +50 -0
- atmem-2.3.4/docs/releases/v2.3.4b1.md +79 -0
- atmem-2.3.4/docs/releases/v2.3.4b2.md +112 -0
- atmem-2.3.4/docs/website/atbot.md +25 -0
- atmem-2.3.4/docs/website/atflows.md +36 -0
- atmem-2.3.4/docs/website/cli.md +66 -0
- atmem-2.3.4/docs/website/dashboard.md +27 -0
- atmem-2.3.4/docs/website/evidence.md +38 -0
- atmem-2.3.4/docs/website/examples.md +36 -0
- atmem-2.3.4/docs/website/getting-started.md +61 -0
- atmem-2.3.4/docs/website/index.md +29 -0
- atmem-2.3.4/docs/website/integrations.md +30 -0
- atmem-2.3.4/docs/website/manifest.json +261 -0
- atmem-2.3.4/docs/website/mcp.md +33 -0
- atmem-2.3.4/docs/website/portfolio.md +13 -0
- atmem-2.3.4/docs/website/python.md +28 -0
- atmem-2.3.4/docs/website/reference.md +28 -0
- atmem-2.3.4/docs/website/releases.md +25 -0
- atmem-2.3.4/docs/website/troubleshooting.md +30 -0
- atmem-2.3.4/docs/website-contributing.md +33 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/README.md +6 -2
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/openclaw.plugin.json +1 -1
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/package-lock.json +2 -2
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/package.json +1 -1
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/rpc-client.ts +1 -1
- atmem-2.3.4/integrations/openclaw/test/fixtures/hook-context/2026.9.5.json +401 -0
- {atmem-2.3.3 → atmem-2.3.4}/pyproject.toml +5 -1
- atmem-2.3.4/tests/test_atflows_review.py +153 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_cli_guidance.py +48 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_control_plane.py +8 -3
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_documentation.py +2 -2
- atmem-2.3.4/tests/test_jev_lab.py +52 -0
- atmem-2.3.4/tests/test_jev_service.py +48 -0
- atmem-2.3.4/tests/test_production_benchmarks.py +53 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_release_metadata.py +7 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_performance.py +73 -40
- atmem-2.3.4/tests/test_website_docs.py +33 -0
- atmem-2.3.4/tools/smoke_atflows_delegated.py +116 -0
- atmem-2.3.4/tools/smoke_atflows_handoff.py +128 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/smoke_installed_package.py +1 -1
- {atmem-2.3.3 → atmem-2.3.4}/tools/smoke_upgrade_from_2_1.py +5 -4
- atmem-2.3.3/docs/data-storage-and-backup.md +0 -32
- atmem-2.3.3/docs/http-api.md +0 -21
- atmem-2.3.3/docs/release-roadmap.md +0 -92
- {atmem-2.3.3 → atmem-2.3.4}/LICENSE +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/MANIFEST.in +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/base.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/callbacks.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/crewai.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/evidence_profiles.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/google_adk.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/langgraph.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/microsoft_agent.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/openai_agents.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/pydantic_ai.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/adapters/smolagents.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/deterministic-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/mem0-head-to-head-2.3.3b1-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/retrieval-calibration-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/retrieval-heldout-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/task-state-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/data/thresholds-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/external.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/profiles.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/retrieval.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/benchmark/runner.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/client.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/contracts/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/contracts/execution.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/contracts/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/contracts/task_state.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/contracts/versions.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/assets/atmem.jpg +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/atbot_companion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/atbot_service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/blackbox.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/evidence.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/explain.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/hosts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/openclaw_native.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/openclaw_topology.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/query_expansion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/server.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/state.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/store.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/topology.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/ui.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/control/verify.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/canonical.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/fact_keys.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/keys.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/storage.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/core/time.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/dashboard_daemon.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/canonical.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/client.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/config.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/transport.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/delegated/validation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/accounts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/crypto.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/evidence/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/coverage.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/events.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/projection.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/retention.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/execution/status.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/classify.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/context.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/review.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/rules.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/extract/validation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/identity.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/maintenance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/store.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/graph/traverse.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/home/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/home/artifacts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/home/layout.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/home/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/identity/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/identity/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/identity/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/identity/store.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/incidents/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/incidents/detect.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/export.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/importer.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/mem0.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/interchange/plan.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/attestation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/registry.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/report.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/invariants/verdict.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/investigate.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/invalidation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/maintenance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/lifecycle/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/maintenance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/mcp/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/access.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/index.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/invalidation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/processors.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/media/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/memory.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/onboarding.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/onboarding_verify.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/langgraph.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/lifecycle.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/loading.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/mem0.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/pydantic_ai.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/runtime.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/server.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/signing.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/provider_adapters/worker.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/cache.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/calibration-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/calibration.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/fusion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/graph.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/graph_signal.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/hybrid.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/rank.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/signals.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/retrieve/support.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/admin-audit.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/capabilities.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/context-package.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/graph-path.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/host-task-lifecycle-request.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/host-task-observation-request.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/host-task-proposal-request.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/invariant-registry.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/media-observation.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/memory-archive.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/memory-lifecycle.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/memory-proposal.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/onboarding-state.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/recall-request.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/retrieval-decision.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/scope.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/semantic-health.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/service-job.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/service-key.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/service-principal.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/source-capture.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-context-package.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-profile.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-session-binding.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-start-request.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-state-proposal.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-state.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/task-transition-decision.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/schemas/v1/unified-health.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/health.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/index.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/models.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/pgvector.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/providers.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/semantic/qdrant.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/admin_audit.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/auth.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/cache_policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/config.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/jobs.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/observability.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/recovery.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/server/repositories.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/service/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/service/application.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/service/executions.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/store/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/store/health.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/store/postgres.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/store/sqlite.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/binding.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/context.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/enablement.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/enforcement.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/governance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/guards.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/host_boundary.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/models.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/observability.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/profiles.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/provenance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/task_state/service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/telemetry/__init__.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem/telemetry/retrieval.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem.egg-info/dependency_links.txt +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem.egg-info/entry_points.txt +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/atmem.egg-info/top_level.txt +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/atbot-release.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/audit-log-spec.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/audit-search.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/auditing-guide.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/capabilities.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/context-provider-adapters.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-request-auth-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/contracts/delegated-request-auth-v1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/dashboard-design-language.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/delegated-context-provider.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/entity-relationship-memory.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/benchmark-deterministic-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/onboarding/http.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/onboarding/langgraph.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/onboarding/openclaw.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/examples/onboarding/pydantic-ai.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/generic-adapter.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/governed-task-state.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/003/20260909T043658Z-740c5c89d63c-host-compatibility.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/003/20260909T055300Z-04a063ce1e7b-publication.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/003/20260910-storizon-published-2.2.6.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/020/20260909-progress-card-observations.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/020/20260909-selective-context-and-precise-time.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/020/20260912-m0-investigation-preview.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/020/20260912-release-candidate-correctness-hardening.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/021/20260912-m0-findings-ui.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/022/20260909-dashboard-usability.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/028/20260913-encrypted-evidence-access.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/029/2026-09-13-local-user-management.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/030/2026-09-13-portable-home.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/baseline.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/consistency-audit.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/core-hybrid-benchmark.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/core-hybrid-calibration.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/core-hybrid-review.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/graph-calibration-four-profile.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/graph-calibration.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/graph-nomination.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/matched-v2.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/numpy-benchmark.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/numpy-review.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/031/profiling.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/implementation-evidence/README.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/integration-guide.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/invariants.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/memory-extraction.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/memory-interchange.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/onboarding.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/openclaw-setup.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/production-service.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v1.0.0.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.0.0.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.0.1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.1.0.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.0.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.2.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.3.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.4.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.5.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b10.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b11.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b2.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b3.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b4.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b5.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b8.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.2.6b9.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.3.0.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.3.0b1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.3.1.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/releases/v2.3.2.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/retrieval-quality.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/saas-integration.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/security/production-threat-model.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/semantic-search.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/spec-kit.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/docs/storage-performance.md +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/index.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/delegated-identity.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/execution-spool.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/setup.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/task-tools.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/tool-errors.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/tool-observations.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/tool-result-comparison.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/src/types.ts +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/blackbox-diagnostics.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/dashboard-live.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/delegated-identity.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/delegated-journey.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/execution-spool.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/fixtures/hook-context/2026.7.1-2.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/fixtures/hook-context/2026.8.1.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/fixtures/hook-context/2026.9.2.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/fixtures/hook-context/2026.9.3.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/fixtures/hook-context/2026.9.4.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/hook-context-compat.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/hooks.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/lib/hook-context-shape.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/lib/record-hook-context.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/manifest.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/setup.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/smoke.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/task-journey.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/task-tools.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/tool-observations.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/test/tool-result-comparison.mjs +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/integrations/openclaw/tsconfig.json +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/setup.cfg +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_api_contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_api_idempotency.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_api_upgrade.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_atbot_companion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_atbot_service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_auditability.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_benchmark_cli.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_benchmark_contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_benchmark_external.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_benchmark_runner.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_blackbox.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_cli.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_contracts_v1.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_control_evidence.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_control_verify.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_dashboard.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_dashboard_daemon.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_delegated_context.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_delegated_control.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_delegated_transport.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_encryption.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_evidence_protection.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_execution_capture.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_execution_identity.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_extract.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_extract_contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_extract_proposals.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_extract_upgrade.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_feature_surfaces.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_forget_verification.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_framework_adapter_conformance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_framework_adapter_packaging.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_framework_adapters.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_framework_delegated_adapters.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_generic_control.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_graph.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_graph_aliases.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_graph_lifecycle.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_graph_quality.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_home.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_host_adapter.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_http_api.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_incident_resolution.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_interchange.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_langgraph_provider.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_layers.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_lifecycle.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_lifecycle_migration.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_local_identity.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_maintenance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_mcp.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_media_governance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_media_observations.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_media_packaging.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_mem0_provider.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_memory.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_onboarding.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_onboarding_recovery.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_openclaw_compat.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_openclaw_control.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_openclaw_install.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_openclaw_topology.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_cli.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_integration.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_packaging.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_performance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_runtime.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_provider_server.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_pydantic_provider.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_recall_evidence.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_restore_receipt.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_adapter_conformance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_benchmark.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_cache.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_candidate_union.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_graph_fusion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_quality.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieval_signals_and_cache.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_retrieve.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_sdk_packaging.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_health.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_matrix_cache.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_parity.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_policy_invalidation.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_profiles.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_rebuild.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_schema.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_search.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_semantic_setup.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_spec_task_inventory.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_storage_packaging.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_store_transactions.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_supporting_evidence.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_adapters.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_atbot.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_benchmark.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_binding.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_cli.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_clock.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_context.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_dashboard.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_deletion.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_expiry.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_governance.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_guards.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_host_boundary.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_host_contracts.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_observability.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_policy.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_prerequisites.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_schemas.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_service.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_session_binding.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_store.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_tamper.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_upgrade.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tests/test_task_state_walking_skeleton.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/benchmark_core_hybrid.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/benchmark_numpy_cache.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/benchmark_storage.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/check_invariants.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/check_spec_tasks.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/release_metadata.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/run_longmemeval_retrieval.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/run_mem0_openclaw_live.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/smoke_delegated_package.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/smoke_delegated_transport.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/smoke_mem0_roleplay.py +0 -0
- {atmem-2.3.3 → atmem-2.3.4}/tools/verify_audit.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atmem
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.4
|
|
4
4
|
Summary: Host-neutral Agent Black Box and reversible memory control plane.
|
|
5
5
|
Author-email: Javad Taghia <taghia.javad@gmail.com>
|
|
6
6
|
Maintainer-email: Aetna / AtMem <aetna000@gmail.com>
|
|
@@ -25,7 +25,9 @@ Requires-Python: >=3.10
|
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
License-File: LICENSE
|
|
27
27
|
Requires-Dist: atmem-atbot==0.1.0
|
|
28
|
+
Requires-Dist: atflows==0.1.1
|
|
28
29
|
Requires-Dist: cryptography<49,>=42
|
|
30
|
+
Provides-Extra: atflows
|
|
29
31
|
Provides-Extra: dev
|
|
30
32
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
31
33
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
@@ -77,12 +79,12 @@ Dynamic: license-file
|
|
|
77
79
|
|
|
78
80
|
# AtMem
|
|
79
81
|
|
|
80
|
-
[](./docs/releases/v2.3.4.md)
|
|
81
83
|
[](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
|
|
82
84
|
|
|
83
85
|
**AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
|
|
84
86
|
|
|
85
|
-
> **Release status:** AtMem 2.3.
|
|
87
|
+
> **Release status:** AtMem 2.3.4 is the stable Agent Black Box and governed-memory release. It installs AtFlows 0.1.1 by default, with optional AtMem-owned login and read-only review leads.
|
|
86
88
|
> It records exact host-observed text and supported multimodal boundaries by default,
|
|
87
89
|
> while keeping every claim limited to what the connected agent actually supplied.
|
|
88
90
|
|
|
@@ -99,7 +101,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
99
101
|
### 1. Install AtMem and choose memory intelligence
|
|
100
102
|
|
|
101
103
|
```bash
|
|
102
|
-
python -m pip install --upgrade atmem==2.3.
|
|
104
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
103
105
|
atmem atbot setup
|
|
104
106
|
atmem atbot doctor
|
|
105
107
|
atmem init
|
|
@@ -132,7 +134,7 @@ package yourself.
|
|
|
132
134
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
133
135
|
|
|
134
136
|
```bash
|
|
135
|
-
python -m pip install --upgrade atmem==2.3.
|
|
137
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
136
138
|
atmem openclaw upgrade
|
|
137
139
|
atmem control verify
|
|
138
140
|
```
|
|
@@ -155,7 +157,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
155
157
|
#### Pydantic AI — native capability
|
|
156
158
|
|
|
157
159
|
```bash
|
|
158
|
-
python -m pip install 'atmem[pydantic-ai]==2.3.
|
|
160
|
+
python -m pip install 'atmem[pydantic-ai]==2.3.4'
|
|
159
161
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
160
162
|
```
|
|
161
163
|
|
|
@@ -180,7 +182,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
180
182
|
#### LangChain/LangGraph — native middleware
|
|
181
183
|
|
|
182
184
|
```bash
|
|
183
|
-
python -m pip install 'atmem[langgraph]==2.3.
|
|
185
|
+
python -m pip install 'atmem[langgraph]==2.3.4'
|
|
184
186
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
185
187
|
```
|
|
186
188
|
|
|
@@ -244,7 +246,7 @@ open tasks. AtBot may propose a change, but AtMem revalidates and commits it.
|
|
|
244
246
|
|
|
245
247
|
See the [Governed Task State guide](docs/governed-task-state.md) for lifecycle,
|
|
246
248
|
correction, provenance, expiry, benchmark, and automation examples, and read
|
|
247
|
-
the [2.3.
|
|
249
|
+
the [2.3.4 release notes](docs/releases/v2.3.4.md) before upgrading.
|
|
248
250
|
|
|
249
251
|
### Prove memory quality locally
|
|
250
252
|
|
|
@@ -258,8 +260,9 @@ perfect; other quality metrics cannot fall below checked-in baselines. Optional
|
|
|
258
260
|
local/hosted profiles, LongMemEval import and fair Mem0 OSS comparison are also
|
|
259
261
|
available without adding Mem0 or model SDKs to the base install. See the
|
|
260
262
|
[memory benchmark guide](docs/benchmarks.md) for commands and honest limits.
|
|
261
|
-
The [2.3.3
|
|
262
|
-
|
|
263
|
+
The retrieval and archive improvements from [2.3.3](docs/releases/v2.3.3.md)
|
|
264
|
+
remain in [2.3.4](docs/releases/v2.3.4.md), which adds the optional AtFlows
|
|
265
|
+
observability and shared-login scope. Developer opt-in
|
|
263
266
|
fusion, scoped graph nomination and matrix reuse are available for evaluation;
|
|
264
267
|
broader performance targets remain research, not release claims.
|
|
265
268
|
|
|
@@ -346,7 +349,7 @@ and restores it exactly.
|
|
|
346
349
|
## Installation details
|
|
347
350
|
|
|
348
351
|
```bash
|
|
349
|
-
python -m pip install atmem==2.3.
|
|
352
|
+
python -m pip install atmem==2.3.4
|
|
350
353
|
atmem --version
|
|
351
354
|
```
|
|
352
355
|
|
|
@@ -356,7 +359,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
356
359
|
choices:
|
|
357
360
|
|
|
358
361
|
```bash
|
|
359
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
362
|
+
python -m pip install 'atmem[semantic]==2.3.4'
|
|
360
363
|
```
|
|
361
364
|
|
|
362
365
|
For repository development, install both workspace packages:
|
|
@@ -544,7 +547,7 @@ atmem control restore
|
|
|
544
547
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
545
548
|
|
|
546
549
|
```bash
|
|
547
|
-
python -m pip install --upgrade atmem==2.3.
|
|
550
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
548
551
|
atmem openclaw upgrade
|
|
549
552
|
atmem control verify
|
|
550
553
|
```
|
|
@@ -715,6 +718,11 @@ system-of-record verification.
|
|
|
715
718
|
|
|
716
719
|
## Documentation map
|
|
717
720
|
|
|
721
|
+
Official website documentation is maintained through the public
|
|
722
|
+
[documentation inventory](docs/website/manifest.json). See
|
|
723
|
+
[how to contribute and update release docs](docs/website-contributing.md).
|
|
724
|
+
Website publication follows a separate owner-reviewed, main-only deployment.
|
|
725
|
+
|
|
718
726
|
- [Current implementation status](docs/current-status.md)
|
|
719
727
|
- [Generic runtime adapter](docs/generic-adapter.md)
|
|
720
728
|
- [Delegated context-provider contract](docs/contracts/delegated-context-provider-v1.md)
|
|
@@ -772,8 +780,8 @@ npm test
|
|
|
772
780
|
npm run smoke
|
|
773
781
|
```
|
|
774
782
|
|
|
775
|
-
Current
|
|
776
|
-
bridge **2.3.
|
|
783
|
+
Current source metadata is the **2.3.4 stable target**, with matched OpenClaw
|
|
784
|
+
bridge source **2.3.4**. Release validation requires exact Python/bridge alignment;
|
|
777
785
|
AtBot retains its independent stable compatible version **0.1.0**.
|
|
778
786
|
|
|
779
787
|
## License
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# AtMem
|
|
2
2
|
|
|
3
|
-
[](./docs/releases/v2.3.4.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.**
|
|
7
7
|
|
|
8
|
-
> **Release status:** AtMem 2.3.
|
|
8
|
+
> **Release status:** AtMem 2.3.4 is the stable Agent Black Box and governed-memory release. It installs AtFlows 0.1.1 by default, with optional AtMem-owned login and read-only review leads.
|
|
9
9
|
> It records exact host-observed text and supported multimodal boundaries by default,
|
|
10
10
|
> while keeping every claim limited to what the connected agent actually supplied.
|
|
11
11
|
|
|
@@ -22,7 +22,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
22
22
|
### 1. Install AtMem and choose memory intelligence
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
python -m pip install --upgrade atmem==2.3.
|
|
25
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
26
26
|
atmem atbot setup
|
|
27
27
|
atmem atbot doctor
|
|
28
28
|
atmem init
|
|
@@ -55,7 +55,7 @@ package yourself.
|
|
|
55
55
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
python -m pip install --upgrade atmem==2.3.
|
|
58
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
59
59
|
atmem openclaw upgrade
|
|
60
60
|
atmem control verify
|
|
61
61
|
```
|
|
@@ -78,7 +78,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
78
78
|
#### Pydantic AI — native capability
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
python -m pip install 'atmem[pydantic-ai]==2.3.
|
|
81
|
+
python -m pip install 'atmem[pydantic-ai]==2.3.4'
|
|
82
82
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
83
83
|
```
|
|
84
84
|
|
|
@@ -103,7 +103,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
103
103
|
#### LangChain/LangGraph — native middleware
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
|
-
python -m pip install 'atmem[langgraph]==2.3.
|
|
106
|
+
python -m pip install 'atmem[langgraph]==2.3.4'
|
|
107
107
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
108
108
|
```
|
|
109
109
|
|
|
@@ -167,7 +167,7 @@ open tasks. AtBot may propose a change, but AtMem revalidates and commits it.
|
|
|
167
167
|
|
|
168
168
|
See the [Governed Task State guide](docs/governed-task-state.md) for lifecycle,
|
|
169
169
|
correction, provenance, expiry, benchmark, and automation examples, and read
|
|
170
|
-
the [2.3.
|
|
170
|
+
the [2.3.4 release notes](docs/releases/v2.3.4.md) before upgrading.
|
|
171
171
|
|
|
172
172
|
### Prove memory quality locally
|
|
173
173
|
|
|
@@ -181,8 +181,9 @@ perfect; other quality metrics cannot fall below checked-in baselines. Optional
|
|
|
181
181
|
local/hosted profiles, LongMemEval import and fair Mem0 OSS comparison are also
|
|
182
182
|
available without adding Mem0 or model SDKs to the base install. See the
|
|
183
183
|
[memory benchmark guide](docs/benchmarks.md) for commands and honest limits.
|
|
184
|
-
The [2.3.3
|
|
185
|
-
|
|
184
|
+
The retrieval and archive improvements from [2.3.3](docs/releases/v2.3.3.md)
|
|
185
|
+
remain in [2.3.4](docs/releases/v2.3.4.md), which adds the optional AtFlows
|
|
186
|
+
observability and shared-login scope. Developer opt-in
|
|
186
187
|
fusion, scoped graph nomination and matrix reuse are available for evaluation;
|
|
187
188
|
broader performance targets remain research, not release claims.
|
|
188
189
|
|
|
@@ -269,7 +270,7 @@ and restores it exactly.
|
|
|
269
270
|
## Installation details
|
|
270
271
|
|
|
271
272
|
```bash
|
|
272
|
-
python -m pip install atmem==2.3.
|
|
273
|
+
python -m pip install atmem==2.3.4
|
|
273
274
|
atmem --version
|
|
274
275
|
```
|
|
275
276
|
|
|
@@ -279,7 +280,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
279
280
|
choices:
|
|
280
281
|
|
|
281
282
|
```bash
|
|
282
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
283
|
+
python -m pip install 'atmem[semantic]==2.3.4'
|
|
283
284
|
```
|
|
284
285
|
|
|
285
286
|
For repository development, install both workspace packages:
|
|
@@ -467,7 +468,7 @@ atmem control restore
|
|
|
467
468
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
468
469
|
|
|
469
470
|
```bash
|
|
470
|
-
python -m pip install --upgrade atmem==2.3.
|
|
471
|
+
python -m pip install --upgrade atmem==2.3.4
|
|
471
472
|
atmem openclaw upgrade
|
|
472
473
|
atmem control verify
|
|
473
474
|
```
|
|
@@ -638,6 +639,11 @@ system-of-record verification.
|
|
|
638
639
|
|
|
639
640
|
## Documentation map
|
|
640
641
|
|
|
642
|
+
Official website documentation is maintained through the public
|
|
643
|
+
[documentation inventory](docs/website/manifest.json). See
|
|
644
|
+
[how to contribute and update release docs](docs/website-contributing.md).
|
|
645
|
+
Website publication follows a separate owner-reviewed, main-only deployment.
|
|
646
|
+
|
|
641
647
|
- [Current implementation status](docs/current-status.md)
|
|
642
648
|
- [Generic runtime adapter](docs/generic-adapter.md)
|
|
643
649
|
- [Delegated context-provider contract](docs/contracts/delegated-context-provider-v1.md)
|
|
@@ -695,8 +701,8 @@ npm test
|
|
|
695
701
|
npm run smoke
|
|
696
702
|
```
|
|
697
703
|
|
|
698
|
-
Current
|
|
699
|
-
bridge **2.3.
|
|
704
|
+
Current source metadata is the **2.3.4 stable target**, with matched OpenClaw
|
|
705
|
+
bridge source **2.3.4**. Release validation requires exact Python/bridge alignment;
|
|
700
706
|
AtBot retains its independent stable compatible version **0.1.0**.
|
|
701
707
|
|
|
702
708
|
## License
|
|
@@ -6,9 +6,12 @@ from importlib.metadata import PackageNotFoundError, version
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
from pathlib import Path
|
|
9
|
+
import re
|
|
9
10
|
import shutil
|
|
11
|
+
import site
|
|
10
12
|
import subprocess
|
|
11
13
|
import sys
|
|
14
|
+
import sysconfig
|
|
12
15
|
from typing import Any
|
|
13
16
|
from urllib.parse import urlencode
|
|
14
17
|
|
|
@@ -44,6 +47,122 @@ def _installed_version() -> str:
|
|
|
44
47
|
return "unknown"
|
|
45
48
|
|
|
46
49
|
|
|
50
|
+
def _companion_version(package: str) -> str:
|
|
51
|
+
try:
|
|
52
|
+
return version(package)
|
|
53
|
+
except PackageNotFoundError:
|
|
54
|
+
return "not installed"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _safe_atflows_status(output: str) -> str:
|
|
58
|
+
"""Retain only bounded loopback links from the companion status output."""
|
|
59
|
+
rows: list[str] = []
|
|
60
|
+
pattern = re.compile(
|
|
61
|
+
r"Dashboard:\s*http://(localhost|127\.0\.0\.1):(\d{1,5})\s+"
|
|
62
|
+
r"Proxy:\s*http://(localhost|127\.0\.0\.1):(\d{1,5})"
|
|
63
|
+
)
|
|
64
|
+
for match in pattern.finditer(output[:4096]):
|
|
65
|
+
dashboard_host, dashboard_port, proxy_host, proxy_port = match.groups()
|
|
66
|
+
if not 1 <= int(dashboard_port) <= 65535 or not 1 <= int(proxy_port) <= 65535:
|
|
67
|
+
continue
|
|
68
|
+
# Review accepts numeric loopback only; display copyable compatible URLs.
|
|
69
|
+
dashboard_host = "127.0.0.1" if dashboard_host == "localhost" else dashboard_host
|
|
70
|
+
proxy_host = "127.0.0.1" if proxy_host == "localhost" else proxy_host
|
|
71
|
+
rows.append(
|
|
72
|
+
f"Dashboard: http://{dashboard_host}:{dashboard_port} "
|
|
73
|
+
f"Proxy: http://{proxy_host}:{proxy_port}"
|
|
74
|
+
)
|
|
75
|
+
if len(rows) == 8:
|
|
76
|
+
break
|
|
77
|
+
return "\n".join(rows) if rows else "No running AtFlows server reported."
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _atflows_executable(expected_version: str) -> Path | None:
|
|
81
|
+
name = "atflows.exe" if os.name == "nt" else "atflows"
|
|
82
|
+
paths = [
|
|
83
|
+
Path(sys.executable).with_name(name),
|
|
84
|
+
Path(sysconfig.get_path("scripts")) / name,
|
|
85
|
+
Path(site.getuserbase()) / ("Scripts" if os.name == "nt" else "bin") / name,
|
|
86
|
+
]
|
|
87
|
+
found = shutil.which("atflows")
|
|
88
|
+
if found:
|
|
89
|
+
paths.append(Path(found))
|
|
90
|
+
for path in dict.fromkeys(paths):
|
|
91
|
+
if not path.is_file():
|
|
92
|
+
continue
|
|
93
|
+
try:
|
|
94
|
+
result = subprocess.run(
|
|
95
|
+
[str(path), "--version"], capture_output=True, text=True,
|
|
96
|
+
timeout=5, check=False,
|
|
97
|
+
)
|
|
98
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
99
|
+
continue
|
|
100
|
+
if result.returncode == 0 and result.stdout.strip() == f"atflows {expected_version}":
|
|
101
|
+
return path
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _run_install_status(args: argparse.Namespace) -> None:
|
|
106
|
+
"""Report installed packages and local service links without starting them."""
|
|
107
|
+
from atmem.dashboard_daemon import manage_dashboard_daemon
|
|
108
|
+
from atmem.home.layout import resolve_home
|
|
109
|
+
|
|
110
|
+
dashboard = manage_dashboard_daemon("status")
|
|
111
|
+
atflows_version = _companion_version("atflows")
|
|
112
|
+
atflows_bin = (
|
|
113
|
+
_atflows_executable(atflows_version)
|
|
114
|
+
if atflows_version != "not installed" else None
|
|
115
|
+
)
|
|
116
|
+
atflows_status = (
|
|
117
|
+
"AtFlows CLI unavailable in this Python environment."
|
|
118
|
+
if atflows_version != "not installed" else
|
|
119
|
+
"AtFlows is not installed in this Python environment."
|
|
120
|
+
)
|
|
121
|
+
if atflows_bin is not None:
|
|
122
|
+
try:
|
|
123
|
+
result = subprocess.run(
|
|
124
|
+
[str(atflows_bin), "status"], capture_output=True, text=True,
|
|
125
|
+
timeout=5, check=False,
|
|
126
|
+
)
|
|
127
|
+
atflows_status = (
|
|
128
|
+
_safe_atflows_status(result.stdout)
|
|
129
|
+
if result.returncode == 0 else
|
|
130
|
+
"Status unavailable; run `atflows status` to retry."
|
|
131
|
+
)
|
|
132
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
133
|
+
atflows_status = "Status unavailable; run `atflows status` to retry."
|
|
134
|
+
report = {
|
|
135
|
+
"format": "atmem-install-status-v1",
|
|
136
|
+
"packages": {
|
|
137
|
+
"atmem": _installed_version(),
|
|
138
|
+
"atmem-atbot": _companion_version("atmem-atbot"),
|
|
139
|
+
"atflows": atflows_version,
|
|
140
|
+
},
|
|
141
|
+
"home": str(resolve_home()),
|
|
142
|
+
"dashboard": {
|
|
143
|
+
"running": bool(dashboard.get("running")),
|
|
144
|
+
"url": dashboard.get("url") if dashboard.get("running") else None,
|
|
145
|
+
},
|
|
146
|
+
"atflows_status": atflows_status,
|
|
147
|
+
}
|
|
148
|
+
if args.json:
|
|
149
|
+
_print(report)
|
|
150
|
+
return
|
|
151
|
+
print("AtMem installation\n")
|
|
152
|
+
for label, package in (("AtMem", "atmem"), ("AtBot", "atmem-atbot"), ("AtFlows", "atflows")):
|
|
153
|
+
print(f" {label:<18}{report['packages'][package]}")
|
|
154
|
+
print(f" {'AtMem Home':<18}{report['home']}")
|
|
155
|
+
print("\nLocal dashboards")
|
|
156
|
+
print(" AtMem " + (str(report["dashboard"]["url"]) if report["dashboard"]["running"] else "No managed service record (manual start may still be running)"))
|
|
157
|
+
for line in atflows_status.splitlines():
|
|
158
|
+
print(" " + line)
|
|
159
|
+
print("\nNext steps")
|
|
160
|
+
print(" atmem init Create the local Administrator; copy its one-time password")
|
|
161
|
+
print(" atflows init Set up AtFlows when you want tracing and review")
|
|
162
|
+
print(" atflows status Show its running dashboard and proxy URLs")
|
|
163
|
+
print(" AtBot setup and behaviour are unchanged.")
|
|
164
|
+
|
|
165
|
+
|
|
47
166
|
def _run_features(args: argparse.Namespace) -> None:
|
|
48
167
|
from atmem.contracts.versions import capabilities
|
|
49
168
|
manifest = capabilities()
|
|
@@ -75,6 +194,9 @@ def main() -> None:
|
|
|
75
194
|
description="Governed memory and agent oversight, with optional AtBot intelligence.",
|
|
76
195
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
77
196
|
epilog="""Start here:
|
|
197
|
+
atmem status
|
|
198
|
+
Show installed package versions and running local dashboard links.
|
|
199
|
+
|
|
78
200
|
atmem atbot setup
|
|
79
201
|
Choose local AI, a hosted API, or the safe deterministic fallback.
|
|
80
202
|
|
|
@@ -100,6 +222,11 @@ Run `atmem COMMAND --help` for command-specific examples.""",
|
|
|
100
222
|
)
|
|
101
223
|
subparsers = parser.add_subparsers(dest="command")
|
|
102
224
|
|
|
225
|
+
status_parser = subparsers.add_parser(
|
|
226
|
+
"status", help="Show installed companions, local dashboards and setup steps"
|
|
227
|
+
)
|
|
228
|
+
status_parser.add_argument("--json", action="store_true")
|
|
229
|
+
|
|
103
230
|
home_parser = subparsers.add_parser(
|
|
104
231
|
"home", help="Inspect, verify, migrate or adopt the portable AtMem Home"
|
|
105
232
|
)
|
|
@@ -1343,7 +1470,8 @@ or input errors.""",
|
|
|
1343
1470
|
command_parser = evidence_commands.add_parser(name, help=help_text)
|
|
1344
1471
|
command_parser.add_argument("--state", default=None)
|
|
1345
1472
|
if name not in {"status", "create-test-accounts"}:
|
|
1346
|
-
command_parser.add_argument("--token",
|
|
1473
|
+
command_parser.add_argument("--token", help="Legacy evidence token argument (visible in process listings)")
|
|
1474
|
+
command_parser.add_argument("--token-env", default="ATMEM_EVIDENCE_TOKEN", help="Environment variable containing the evidence token")
|
|
1347
1475
|
if name in {"show", "reconstruct", "replay-manifest", "delete-run", "export-plaintext"}:
|
|
1348
1476
|
command_parser.add_argument("run_id")
|
|
1349
1477
|
if name == "search":
|
|
@@ -1362,6 +1490,26 @@ or input errors.""",
|
|
|
1362
1490
|
command_parser.add_argument("--confirm", required=True)
|
|
1363
1491
|
command_parser.add_argument("--output", required=True)
|
|
1364
1492
|
|
|
1493
|
+
atflows_parser = subparsers.add_parser(
|
|
1494
|
+
"atflows", help="Inspect optional AtFlows telemetry against protected AtMem evidence"
|
|
1495
|
+
)
|
|
1496
|
+
atflows_commands = atflows_parser.add_subparsers(dest="atflows_command")
|
|
1497
|
+
atflows_review = atflows_commands.add_parser(
|
|
1498
|
+
"review", help="Produce read-only exact-session review leads"
|
|
1499
|
+
)
|
|
1500
|
+
atflows_review.add_argument("run_id")
|
|
1501
|
+
atflows_review.add_argument("--session-id", required=True)
|
|
1502
|
+
atflows_review.add_argument("--since-ms", type=int, required=True)
|
|
1503
|
+
atflows_review.add_argument("--until-ms", type=int, required=True)
|
|
1504
|
+
atflows_review.add_argument("--token", help="AtMem evidence token (legacy argument; visible in process listings)")
|
|
1505
|
+
atflows_review.add_argument("--token-env", default="ATMEM_EVIDENCE_TOKEN", help="Environment variable containing the AtMem evidence token")
|
|
1506
|
+
atflows_review.add_argument("--state", default=None)
|
|
1507
|
+
atflows_review.add_argument("--base-url", default="http://127.0.0.1:1337")
|
|
1508
|
+
atflows_review.add_argument("--password-env", default="ATFLOWS_ADMIN_PASSWORD")
|
|
1509
|
+
atflows_output = atflows_review.add_mutually_exclusive_group()
|
|
1510
|
+
atflows_output.add_argument("--json", action="store_true", help="Print the versioned JSON report (default)")
|
|
1511
|
+
atflows_output.add_argument("--human", action="store_true", help="Print a concise human-readable report")
|
|
1512
|
+
|
|
1365
1513
|
verify_run_parser = subparsers.add_parser(
|
|
1366
1514
|
"verify-run",
|
|
1367
1515
|
help="Verify one agent run and print its unified coverage report",
|
|
@@ -1388,6 +1536,10 @@ or input errors.""",
|
|
|
1388
1536
|
_print_cli_welcome(parser)
|
|
1389
1537
|
return
|
|
1390
1538
|
|
|
1539
|
+
if args.command == "status":
|
|
1540
|
+
_run_install_status(args)
|
|
1541
|
+
return
|
|
1542
|
+
|
|
1391
1543
|
if args.command == "init":
|
|
1392
1544
|
_run_identity_init(args)
|
|
1393
1545
|
return
|
|
@@ -1476,6 +1628,13 @@ or input errors.""",
|
|
|
1476
1628
|
_run_evidence(args)
|
|
1477
1629
|
return
|
|
1478
1630
|
|
|
1631
|
+
if args.command == "atflows":
|
|
1632
|
+
if args.atflows_command is None:
|
|
1633
|
+
atflows_parser.print_help()
|
|
1634
|
+
return
|
|
1635
|
+
_run_atflows(args)
|
|
1636
|
+
return
|
|
1637
|
+
|
|
1479
1638
|
if args.command == "verify-run":
|
|
1480
1639
|
args.blackbox_command = "verify"
|
|
1481
1640
|
_run_blackbox(args)
|
|
@@ -3722,6 +3881,8 @@ def _print_cli_welcome(parser: argparse.ArgumentParser) -> None:
|
|
|
3722
3881
|
print(" atmem dashboard\n")
|
|
3723
3882
|
print(" 5. Check AtBot and its configured model")
|
|
3724
3883
|
print(" atmem atbot doctor\n")
|
|
3884
|
+
print(" 6. Check installed packages and local dashboard links")
|
|
3885
|
+
print(" atmem status\n")
|
|
3725
3886
|
print("AtMem starts safely: no memory injection is enabled until you explicitly activate it.")
|
|
3726
3887
|
print("Run `atmem --help` for every command or `atmem atbot` for provider examples.")
|
|
3727
3888
|
|
|
@@ -4013,25 +4174,31 @@ def _identity_manager(state_path: str | None):
|
|
|
4013
4174
|
return manager
|
|
4014
4175
|
|
|
4015
4176
|
|
|
4016
|
-
def _print_bootstrap(value: dict[str, Any], *, as_json: bool = False) -> None:
|
|
4177
|
+
def _print_bootstrap(value: dict[str, Any], *, as_json: bool = False, port: int = 8766) -> None:
|
|
4017
4178
|
if as_json:
|
|
4018
4179
|
_print(value)
|
|
4019
4180
|
return
|
|
4020
4181
|
if not value.get("created"):
|
|
4021
4182
|
print("AtMem is already initialized. Existing credentials were not changed or disclosed.")
|
|
4022
|
-
print("Dashboard: http://127.0.0.1:
|
|
4183
|
+
print(f"Dashboard: http://127.0.0.1:{port}/")
|
|
4023
4184
|
return
|
|
4024
|
-
print("AtMem local
|
|
4185
|
+
print("AtMem local setup\n")
|
|
4186
|
+
print(f" AtMem {_installed_version()}")
|
|
4187
|
+
print(f" AtBot {_companion_version('atmem-atbot')}")
|
|
4188
|
+
print(f" AtFlows {_companion_version('atflows')}")
|
|
4189
|
+
print(f" Dashboard http://127.0.0.1:{port}/")
|
|
4025
4190
|
print(f" Username {value['username']}")
|
|
4026
|
-
print(
|
|
4027
|
-
print("
|
|
4028
|
-
print("
|
|
4191
|
+
print("\n Temporary password (copy now):")
|
|
4192
|
+
print(f" {value['password']}")
|
|
4193
|
+
print("\nSign in and change this password; it will not be shown again.")
|
|
4194
|
+
print("Run `atflows init` when you want to set up tracing and its own Administrator.")
|
|
4195
|
+
print("Run `atmem status` or `atflows status` for local dashboard links.")
|
|
4029
4196
|
|
|
4030
4197
|
|
|
4031
4198
|
def _run_identity_init(args: argparse.Namespace) -> None:
|
|
4032
4199
|
manager = _identity_manager(args.state)
|
|
4033
4200
|
bootstrap = manager.identity_service().bootstrap()
|
|
4034
|
-
_print_bootstrap(bootstrap, as_json=args.json)
|
|
4201
|
+
_print_bootstrap(bootstrap, as_json=args.json, port=args.port)
|
|
4035
4202
|
if args.json or args.no_open or not bootstrap.get("created"):
|
|
4036
4203
|
return
|
|
4037
4204
|
from atmem.dashboard_daemon import _open_default_browser, manage_dashboard_daemon
|
|
@@ -4190,7 +4357,7 @@ def _serve_dashboard(
|
|
|
4190
4357
|
if not sys.stdin.isatty():
|
|
4191
4358
|
raise ValueError("local identity is not initialized; run `atmem init` before starting the dashboard daemon")
|
|
4192
4359
|
bootstrap = identity.bootstrap()
|
|
4193
|
-
_print_bootstrap(bootstrap)
|
|
4360
|
+
_print_bootstrap(bootstrap, port=port)
|
|
4194
4361
|
from atmem.control.atbot_service import AtBotServiceManager
|
|
4195
4362
|
|
|
4196
4363
|
atbot_manager = AtBotServiceManager()
|
|
@@ -4577,6 +4744,99 @@ def _run_blackbox(args: argparse.Namespace) -> None:
|
|
|
4577
4744
|
print(format_flight_report(report), end="")
|
|
4578
4745
|
|
|
4579
4746
|
|
|
4747
|
+
def _format_atflows_review(report: dict[str, Any]) -> str:
|
|
4748
|
+
coverage = report["coverage"]
|
|
4749
|
+
lines = [
|
|
4750
|
+
"AtMem + AtFlows review",
|
|
4751
|
+
f" Run {report['run_id']}",
|
|
4752
|
+
f" Session {report['session_id']}",
|
|
4753
|
+
f" Correlation {report['correlation']}",
|
|
4754
|
+
]
|
|
4755
|
+
if report.get("reason"):
|
|
4756
|
+
lines.append(f" Reason {report['reason']}")
|
|
4757
|
+
if coverage["reported"]:
|
|
4758
|
+
lines.append(
|
|
4759
|
+
f" Coverage {coverage['atflows_rows']} rows, "
|
|
4760
|
+
f"{coverage['unique_traces']} traces"
|
|
4761
|
+
+ (" (truncated)" if coverage["truncated"] else "")
|
|
4762
|
+
)
|
|
4763
|
+
else:
|
|
4764
|
+
lines.append(" Coverage not reported without an authorized exact-session link")
|
|
4765
|
+
lines.append(f" Review leads {len(report['leads'])}")
|
|
4766
|
+
for lead in report["leads"]:
|
|
4767
|
+
lines.append(f" {lead['reason_code']}: {lead['trace_id']}")
|
|
4768
|
+
lines.append(f" Limit {report['limitation']}")
|
|
4769
|
+
return "\n".join(lines) + "\n"
|
|
4770
|
+
|
|
4771
|
+
|
|
4772
|
+
def _read_evidence_token(args: argparse.Namespace) -> str:
|
|
4773
|
+
token = args.token or os.environ.get(args.token_env)
|
|
4774
|
+
if not token and sys.stdin.isatty():
|
|
4775
|
+
token = getpass.getpass("AtMem evidence token: ")
|
|
4776
|
+
if not token:
|
|
4777
|
+
raise ValueError("AtMem evidence token is required; set the selected token environment variable or use --token")
|
|
4778
|
+
return token
|
|
4779
|
+
|
|
4780
|
+
|
|
4781
|
+
def _run_atflows(args: argparse.Namespace) -> None:
|
|
4782
|
+
from atmem.control.manager import ControlPlaneManager, DEFAULT_STATE_PATH
|
|
4783
|
+
from atmem.evidence.models import EvidenceOperation, EvidenceScope
|
|
4784
|
+
from atmem.integrations.atflows import auth_mode, fetch_traces, review_leads
|
|
4785
|
+
|
|
4786
|
+
manager = ControlPlaneManager(args.state or str(DEFAULT_STATE_PATH))
|
|
4787
|
+
service = manager.evidence_service()
|
|
4788
|
+
principal = service.authenticate(_read_evidence_token(args))
|
|
4789
|
+
if principal is None:
|
|
4790
|
+
raise ValueError("invalid evidence account token")
|
|
4791
|
+
principal.authorize(
|
|
4792
|
+
EvidenceOperation.VIEW,
|
|
4793
|
+
EvidenceScope(
|
|
4794
|
+
principal.scope.tenant_id,
|
|
4795
|
+
principal.scope.subject_id,
|
|
4796
|
+
principal.scope.workspace_id,
|
|
4797
|
+
args.run_id,
|
|
4798
|
+
),
|
|
4799
|
+
)
|
|
4800
|
+
if auth_mode(args.base_url) == "atmem":
|
|
4801
|
+
username = os.environ.get("ATMEM_USERNAME") or input("AtMem username: ")
|
|
4802
|
+
password = os.environ.get("ATMEM_PASSWORD") or getpass.getpass("AtMem password: ")
|
|
4803
|
+
identity = manager.identity_service()
|
|
4804
|
+
session = identity.login(username, password)
|
|
4805
|
+
token = session["session_token"]
|
|
4806
|
+
try:
|
|
4807
|
+
traces = fetch_traces(
|
|
4808
|
+
base_url=args.base_url,
|
|
4809
|
+
atmem_session=token,
|
|
4810
|
+
session_id=args.session_id,
|
|
4811
|
+
since_ms=args.since_ms,
|
|
4812
|
+
until_ms=args.until_ms,
|
|
4813
|
+
)
|
|
4814
|
+
finally:
|
|
4815
|
+
identity.logout(token)
|
|
4816
|
+
else:
|
|
4817
|
+
password = os.environ.get(args.password_env) or getpass.getpass("AtFlows Administrator password: ")
|
|
4818
|
+
traces = fetch_traces(
|
|
4819
|
+
base_url=args.base_url,
|
|
4820
|
+
password=password,
|
|
4821
|
+
session_id=args.session_id,
|
|
4822
|
+
since_ms=args.since_ms,
|
|
4823
|
+
until_ms=args.until_ms,
|
|
4824
|
+
)
|
|
4825
|
+
report = review_leads(
|
|
4826
|
+
service,
|
|
4827
|
+
principal,
|
|
4828
|
+
run_id=args.run_id,
|
|
4829
|
+
session_id=args.session_id,
|
|
4830
|
+
traces=traces,
|
|
4831
|
+
since_ms=args.since_ms,
|
|
4832
|
+
until_ms=args.until_ms,
|
|
4833
|
+
)
|
|
4834
|
+
if args.human:
|
|
4835
|
+
print(_format_atflows_review(report), end="")
|
|
4836
|
+
else:
|
|
4837
|
+
_print(report)
|
|
4838
|
+
|
|
4839
|
+
|
|
4580
4840
|
def _run_evidence(args: argparse.Namespace) -> None:
|
|
4581
4841
|
from atmem.control.manager import ControlPlaneManager, DEFAULT_STATE_PATH
|
|
4582
4842
|
from atmem.evidence import CaptureMode, EvidenceRole, EvidenceScope
|
|
@@ -4598,7 +4858,7 @@ def _run_evidence(args: argparse.Namespace) -> None:
|
|
|
4598
4858
|
}
|
|
4599
4859
|
)
|
|
4600
4860
|
return
|
|
4601
|
-
principal = service.authenticate(args
|
|
4861
|
+
principal = service.authenticate(_read_evidence_token(args))
|
|
4602
4862
|
if principal is None:
|
|
4603
4863
|
raise ValueError("invalid evidence account token")
|
|
4604
4864
|
if command == "show":
|