atmem 2.3.2__tar.gz → 2.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {atmem-2.3.2/atmem.egg-info → atmem-2.3.3}/PKG-INFO +20 -14
- {atmem-2.3.2 → atmem-2.3.3}/README.md +17 -13
- atmem-2.3.3/atmem/benchmark/data/mem0-head-to-head-2.3.3b1-v1.json +48 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/external.py +2 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/models.py +13 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.css +25 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/atbot_companion.py +8 -39
- atmem-2.3.3/atmem/control/query_expansion.py +27 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/mcp/server.py +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/atmem/memory.py +17 -3
- {atmem-2.3.2 → atmem-2.3.3}/atmem/openclaw_install.py +1 -1
- atmem-2.3.3/atmem/retrieve/fusion.py +18 -0
- atmem-2.3.3/atmem/retrieve/graph.py +135 -0
- atmem-2.3.3/atmem/retrieve/hybrid.py +159 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/rank.py +59 -1
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/recall-request.json +2 -1
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/index.py +201 -41
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/providers.py +61 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/store/sqlite.py +34 -0
- {atmem-2.3.2 → atmem-2.3.3/atmem.egg-info}/PKG-INFO +20 -14
- {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/SOURCES.txt +24 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/requires.txt +3 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/benchmarks.md +60 -2
- {atmem-2.3.2 → atmem-2.3.3}/docs/current-status.md +16 -4
- atmem-2.3.3/docs/implementation-evidence/031/baseline.md +50 -0
- atmem-2.3.3/docs/implementation-evidence/031/consistency-audit.md +32 -0
- atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-benchmark.md +87 -0
- atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-calibration.json +479 -0
- atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-review.md +85 -0
- atmem-2.3.3/docs/implementation-evidence/031/graph-calibration-four-profile.json +1126 -0
- atmem-2.3.3/docs/implementation-evidence/031/graph-calibration.json +908 -0
- atmem-2.3.3/docs/implementation-evidence/031/graph-nomination.md +174 -0
- atmem-2.3.3/docs/implementation-evidence/031/matched-v2.md +67 -0
- atmem-2.3.3/docs/implementation-evidence/031/numpy-benchmark.md +65 -0
- atmem-2.3.3/docs/implementation-evidence/031/numpy-review.md +64 -0
- atmem-2.3.3/docs/implementation-evidence/031/profiling.md +84 -0
- atmem-2.3.3/docs/implementation-evidence/031/release-2.3.3.md +62 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/release-roadmap.md +21 -5
- atmem-2.3.3/docs/releases/v2.3.3.md +120 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/README.md +2 -2
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/openclaw.plugin.json +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/package-lock.json +2 -2
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/package.json +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/rpc-client.ts +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/pyproject.toml +4 -1
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_atbot_companion.py +22 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_external.py +66 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_plane.py +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_dashboard.py +9 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_documentation.py +2 -2
- atmem-2.3.3/tests/test_release_metadata.py +57 -0
- atmem-2.3.3/tests/test_retrieval_candidate_union.py +226 -0
- atmem-2.3.3/tests/test_retrieval_graph_fusion.py +206 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_quality.py +44 -0
- atmem-2.3.3/tests/test_semantic_matrix_cache.py +124 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_rebuild.py +56 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_search.py +89 -0
- atmem-2.3.3/tools/benchmark_core_hybrid.py +93 -0
- atmem-2.3.3/tools/benchmark_numpy_cache.py +79 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/run_longmemeval_retrieval.py +226 -43
- {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_installed_package.py +1 -1
- {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_upgrade_from_2_1.py +4 -4
- atmem-2.3.2/tests/test_release_metadata.py +0 -30
- {atmem-2.3.2 → atmem-2.3.3}/LICENSE +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/MANIFEST.in +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/base.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/callbacks.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/crewai.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/evidence_profiles.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/google_adk.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/langgraph.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/microsoft_agent.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/openai_agents.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/pydantic_ai.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/smolagents.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/deterministic-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/retrieval-calibration-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/retrieval-heldout-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/task-state-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/thresholds-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/profiles.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/retrieval.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/runner.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/cli.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/client.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/execution.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/task_state.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/versions.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.html +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.js +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/atmem.jpg +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/atbot_service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/blackbox.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/compat.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/evidence.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/explain.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/hosts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/manager.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/openclaw_native.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/openclaw_topology.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/server.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/state.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/store.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/topology.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/ui.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/verify.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/control/web.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/canonical.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/fact_keys.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/keys.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/storage.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/core/time.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/dashboard_daemon.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/canonical.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/client.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/config.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/transport.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/validation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/accounts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/crypto.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/store.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/coverage.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/events.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/projection.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/retention.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/status.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/classify.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/context.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/review.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/rules.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/validation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/identity.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/maintenance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/store.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/traverse.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/home/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/home/artifacts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/home/layout.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/home/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/store.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/incidents/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/incidents/detect.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/export.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/importer.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/mem0.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/plan.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/attestation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/registry.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/report.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/verdict.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/investigate.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/invalidation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/maintenance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/maintenance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/mcp/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/access.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/index.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/invalidation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/processors.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/media/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/onboarding.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/onboarding_verify.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/langgraph.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/lifecycle.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/loading.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/mem0.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/pydantic_ai.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/runtime.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/server.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/signing.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/worker.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/cache.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/calibration-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/calibration.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/graph_signal.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/signals.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/support.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/admin-audit.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/capabilities.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/context-package.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/graph-path.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-lifecycle-request.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-observation-request.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-proposal-request.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/invariant-registry.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/media-observation.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-archive.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-lifecycle.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-proposal.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/onboarding-state.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/retrieval-decision.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/scope.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/semantic-health.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-job.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-key.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-principal.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/source-capture.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-context-package.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-profile.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-session-binding.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-start-request.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-state-proposal.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-state.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-transition-decision.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/unified-health.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/health.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/models.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/pgvector.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/qdrant.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/admin_audit.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/auth.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/cache_policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/config.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/jobs.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/observability.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/recovery.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/server/repositories.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/service/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/service/application.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/service/executions.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/store/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/store/health.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/store/postgres.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/binding.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/context.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/enablement.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/enforcement.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/governance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/guards.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/host_boundary.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/models.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/observability.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/profiles.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/provenance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/telemetry/__init__.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem/telemetry/retrieval.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/dependency_links.txt +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/entry_points.txt +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/top_level.txt +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/agent-blackbox.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/atbot-release.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/audit-log-spec.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/audit-search.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/auditing-guide.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/capabilities.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/context-provider-adapters.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-request-auth-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-request-auth-v1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/control-plane.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/dashboard-design-language.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/data-storage-and-backup.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/delegated-context-provider.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/entity-relationship-memory.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/benchmark-deterministic-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/http.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/langgraph.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/openclaw.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/pydantic-ai.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/framework-adapters.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/generic-adapter.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/governed-task-state.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/http-api.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T043658Z-740c5c89d63c-host-compatibility.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T055300Z-04a063ce1e7b-publication.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260910-storizon-published-2.2.6.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260909-progress-card-observations.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260909-selective-context-and-precise-time.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260912-m0-investigation-preview.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260912-release-candidate-correctness-hardening.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/021/20260912-m0-findings-ui.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/022/20260909-dashboard-usability.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/028/20260913-encrypted-evidence-access.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/029/2026-09-13-local-user-management.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/030/2026-09-13-portable-home.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/README.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/integration-guide.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/invariants.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/memory-extraction.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/memory-interchange.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/multimodal-observations.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/onboarding.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/openclaw-setup.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/production-service.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v1.0.0.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.0.0.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.0.1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.1.0.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.0.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.2.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.3.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.4.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.5.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b10.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b11.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b2.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b3.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b4.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b5.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b8.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b9.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.0.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.0b1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.1.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.2.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/retrieval-quality.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/saas-integration.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/security/production-threat-model.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/semantic-search.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/spec-kit.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/docs/storage-performance.md +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/index.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/delegated-identity.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/execution-spool.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/setup.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/task-tools.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-errors.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-observations.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-result-comparison.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/types.ts +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/blackbox-diagnostics.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/dashboard-live.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-identity.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-journey.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/execution-spool.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.7.1-2.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.8.1.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.2.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.3.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.4.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/hook-context-compat.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/hooks.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/lib/hook-context-shape.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/lib/record-hook-context.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/manifest.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/setup.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/smoke.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/task-journey.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/task-tools.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/tool-observations.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/tool-result-comparison.mjs +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/tsconfig.json +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/setup.cfg +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_idempotency.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_upgrade.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_atbot_service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_auditability.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_cli.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_runner.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_blackbox.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_cli.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_cli_guidance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_contracts_v1.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_evidence.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_verify.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_dashboard_daemon.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_context.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_control.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_transport.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_encryption.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_evidence_protection.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_execution_capture.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_execution_identity.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_proposals.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_upgrade.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_feature_surfaces.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_forget_verification.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapter_conformance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapter_packaging.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapters.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_delegated_adapters.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_generic_control.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_aliases.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_lifecycle.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_quality.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_home.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_host_adapter.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_http_api.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_incident_resolution.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_interchange.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_langgraph_provider.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_layers.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_lifecycle.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_lifecycle_migration.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_local_identity.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_maintenance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_mcp.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_governance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_observations.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_packaging.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_mem0_provider.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_memory.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_onboarding.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_onboarding_recovery.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_compat.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_control.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_install.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_topology.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_cli.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_integration.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_packaging.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_performance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_runtime.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_server.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_pydantic_provider.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_recall_evidence.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_restore_receipt.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_adapter_conformance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_benchmark.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_cache.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_signals_and_cache.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieve.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_sdk_packaging.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_health.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_parity.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_policy_invalidation.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_profiles.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_schema.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_setup.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_spec_task_inventory.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_storage_packaging.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_store_transactions.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_supporting_evidence.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_adapters.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_atbot.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_benchmark.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_binding.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_cli.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_clock.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_context.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_dashboard.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_deletion.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_expiry.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_governance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_guards.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_host_boundary.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_host_contracts.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_observability.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_performance.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_policy.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_prerequisites.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_schemas.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_service.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_session_binding.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_store.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_tamper.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_upgrade.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_walking_skeleton.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/benchmark_storage.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/check_invariants.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/check_spec_tasks.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/release_metadata.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/run_mem0_openclaw_live.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_delegated_package.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_delegated_transport.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_mem0_roleplay.py +0 -0
- {atmem-2.3.2 → atmem-2.3.3}/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.3
|
|
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>
|
|
@@ -31,6 +31,8 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
|
31
31
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
32
32
|
Provides-Extra: semantic
|
|
33
33
|
Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
|
|
34
|
+
Provides-Extra: semantic-accelerated
|
|
35
|
+
Requires-Dist: numpy<3,>=1.26; extra == "semantic-accelerated"
|
|
34
36
|
Provides-Extra: mem0
|
|
35
37
|
Requires-Dist: mem0ai<3,>=2.0.20; extra == "mem0"
|
|
36
38
|
Provides-Extra: langgraph-provider
|
|
@@ -75,12 +77,12 @@ Dynamic: license-file
|
|
|
75
77
|
|
|
76
78
|
# AtMem
|
|
77
79
|
|
|
78
|
-
[](./docs/releases/v2.3.3.md)
|
|
79
81
|
[](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
|
|
80
82
|
|
|
81
83
|
**AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
|
|
82
84
|
|
|
83
|
-
> **Release status:** AtMem 2.3.
|
|
85
|
+
> **Release status:** AtMem 2.3.3 is the stable encrypted Agent Black Box release.
|
|
84
86
|
> It records exact host-observed text and supported multimodal boundaries by default,
|
|
85
87
|
> while keeping every claim limited to what the connected agent actually supplied.
|
|
86
88
|
|
|
@@ -97,7 +99,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
97
99
|
### 1. Install AtMem and choose memory intelligence
|
|
98
100
|
|
|
99
101
|
```bash
|
|
100
|
-
python -m pip install --upgrade atmem==2.3.
|
|
102
|
+
python -m pip install --upgrade atmem==2.3.3
|
|
101
103
|
atmem atbot setup
|
|
102
104
|
atmem atbot doctor
|
|
103
105
|
atmem init
|
|
@@ -130,7 +132,7 @@ package yourself.
|
|
|
130
132
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
131
133
|
|
|
132
134
|
```bash
|
|
133
|
-
python -m pip install --upgrade atmem==2.3.
|
|
135
|
+
python -m pip install --upgrade atmem==2.3.3
|
|
134
136
|
atmem openclaw upgrade
|
|
135
137
|
atmem control verify
|
|
136
138
|
```
|
|
@@ -153,7 +155,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
153
155
|
#### Pydantic AI — native capability
|
|
154
156
|
|
|
155
157
|
```bash
|
|
156
|
-
python -m pip install 'atmem[pydantic-ai]==2.3.
|
|
158
|
+
python -m pip install 'atmem[pydantic-ai]==2.3.3'
|
|
157
159
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
158
160
|
```
|
|
159
161
|
|
|
@@ -178,7 +180,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
178
180
|
#### LangChain/LangGraph — native middleware
|
|
179
181
|
|
|
180
182
|
```bash
|
|
181
|
-
python -m pip install 'atmem[langgraph]==2.3.
|
|
183
|
+
python -m pip install 'atmem[langgraph]==2.3.3'
|
|
182
184
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
183
185
|
```
|
|
184
186
|
|
|
@@ -242,7 +244,7 @@ open tasks. AtBot may propose a change, but AtMem revalidates and commits it.
|
|
|
242
244
|
|
|
243
245
|
See the [Governed Task State guide](docs/governed-task-state.md) for lifecycle,
|
|
244
246
|
correction, provenance, expiry, benchmark, and automation examples, and read
|
|
245
|
-
the [2.3.
|
|
247
|
+
the [2.3.3 release notes](docs/releases/v2.3.3.md) before upgrading.
|
|
246
248
|
|
|
247
249
|
### Prove memory quality locally
|
|
248
250
|
|
|
@@ -250,12 +252,16 @@ the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
|
|
|
250
252
|
atmem benchmark run --output benchmark.json
|
|
251
253
|
```
|
|
252
254
|
|
|
253
|
-
This offline release gate runs
|
|
255
|
+
This offline release gate runs 24 isolated extraction, contradiction, recall,
|
|
254
256
|
withholding, injection, privacy, poisoning and fallback cases. Safety must be
|
|
255
257
|
perfect; other quality metrics cannot fall below checked-in baselines. Optional
|
|
256
258
|
local/hosted profiles, LongMemEval import and fair Mem0 OSS comparison are also
|
|
257
259
|
available without adding Mem0 or model SDKs to the base install. See the
|
|
258
260
|
[memory benchmark guide](docs/benchmarks.md) for commands and honest limits.
|
|
261
|
+
The [2.3.3 release](docs/releases/v2.3.3.md) improves local retrieval work and
|
|
262
|
+
archive layout while retaining existing retrieval defaults. Developer opt-in
|
|
263
|
+
fusion, scoped graph nomination and matrix reuse are available for evaluation;
|
|
264
|
+
broader performance targets remain research, not release claims.
|
|
259
265
|
|
|
260
266
|
### 3. Review, then activate
|
|
261
267
|
|
|
@@ -340,7 +346,7 @@ and restores it exactly.
|
|
|
340
346
|
## Installation details
|
|
341
347
|
|
|
342
348
|
```bash
|
|
343
|
-
python -m pip install atmem==2.3.
|
|
349
|
+
python -m pip install atmem==2.3.3
|
|
344
350
|
atmem --version
|
|
345
351
|
```
|
|
346
352
|
|
|
@@ -350,7 +356,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
350
356
|
choices:
|
|
351
357
|
|
|
352
358
|
```bash
|
|
353
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
359
|
+
python -m pip install 'atmem[semantic]==2.3.3'
|
|
354
360
|
```
|
|
355
361
|
|
|
356
362
|
For repository development, install both workspace packages:
|
|
@@ -538,7 +544,7 @@ atmem control restore
|
|
|
538
544
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
539
545
|
|
|
540
546
|
```bash
|
|
541
|
-
python -m pip install --upgrade atmem==2.3.
|
|
547
|
+
python -m pip install --upgrade atmem==2.3.3
|
|
542
548
|
atmem openclaw upgrade
|
|
543
549
|
atmem control verify
|
|
544
550
|
```
|
|
@@ -766,8 +772,8 @@ npm test
|
|
|
766
772
|
npm run smoke
|
|
767
773
|
```
|
|
768
774
|
|
|
769
|
-
Current repository metadata is version **2.3.
|
|
770
|
-
bridge **2.3.
|
|
775
|
+
Current repository metadata is version **2.3.3**, with the matched OpenClaw
|
|
776
|
+
bridge **2.3.3**. Release validation requires exact Python/bridge alignment;
|
|
771
777
|
AtBot retains its independent stable compatible version **0.1.0**.
|
|
772
778
|
|
|
773
779
|
## License
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# AtMem
|
|
2
2
|
|
|
3
|
-
[](./docs/releases/v2.3.3.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.3 is the stable encrypted Agent Black Box release.
|
|
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.3
|
|
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.3
|
|
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.3'
|
|
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.3'
|
|
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.3 release notes](docs/releases/v2.3.3.md) before upgrading.
|
|
171
171
|
|
|
172
172
|
### Prove memory quality locally
|
|
173
173
|
|
|
@@ -175,12 +175,16 @@ the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
|
|
|
175
175
|
atmem benchmark run --output benchmark.json
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
-
This offline release gate runs
|
|
178
|
+
This offline release gate runs 24 isolated extraction, contradiction, recall,
|
|
179
179
|
withholding, injection, privacy, poisoning and fallback cases. Safety must be
|
|
180
180
|
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 release](docs/releases/v2.3.3.md) improves local retrieval work and
|
|
185
|
+
archive layout while retaining existing retrieval defaults. Developer opt-in
|
|
186
|
+
fusion, scoped graph nomination and matrix reuse are available for evaluation;
|
|
187
|
+
broader performance targets remain research, not release claims.
|
|
184
188
|
|
|
185
189
|
### 3. Review, then activate
|
|
186
190
|
|
|
@@ -265,7 +269,7 @@ and restores it exactly.
|
|
|
265
269
|
## Installation details
|
|
266
270
|
|
|
267
271
|
```bash
|
|
268
|
-
python -m pip install atmem==2.3.
|
|
272
|
+
python -m pip install atmem==2.3.3
|
|
269
273
|
atmem --version
|
|
270
274
|
```
|
|
271
275
|
|
|
@@ -275,7 +279,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
275
279
|
choices:
|
|
276
280
|
|
|
277
281
|
```bash
|
|
278
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
282
|
+
python -m pip install 'atmem[semantic]==2.3.3'
|
|
279
283
|
```
|
|
280
284
|
|
|
281
285
|
For repository development, install both workspace packages:
|
|
@@ -463,7 +467,7 @@ atmem control restore
|
|
|
463
467
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
464
468
|
|
|
465
469
|
```bash
|
|
466
|
-
python -m pip install --upgrade atmem==2.3.
|
|
470
|
+
python -m pip install --upgrade atmem==2.3.3
|
|
467
471
|
atmem openclaw upgrade
|
|
468
472
|
atmem control verify
|
|
469
473
|
```
|
|
@@ -691,8 +695,8 @@ npm test
|
|
|
691
695
|
npm run smoke
|
|
692
696
|
```
|
|
693
697
|
|
|
694
|
-
Current repository metadata is version **2.3.
|
|
695
|
-
bridge **2.3.
|
|
698
|
+
Current repository metadata is version **2.3.3**, with the matched OpenClaw
|
|
699
|
+
bridge **2.3.3**. Release validation requires exact Python/bridge alignment;
|
|
696
700
|
AtBot retains its independent stable compatible version **0.1.0**.
|
|
697
701
|
|
|
698
702
|
## License
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "atmem-mem0-head-to-head-manifest-v1",
|
|
3
|
+
"frozen_at": "2026-09-16",
|
|
4
|
+
"dataset": {
|
|
5
|
+
"name": "LongMemEval-S cleaned",
|
|
6
|
+
"upstream_commit": "98d7416c24c778c2fee6e6f3006e7a073259d48f",
|
|
7
|
+
"source_sha256": "d6f21ea9d60a0d56f34a05b609c79c88a451d2ae03597821ea3d5a9678c3a442"
|
|
8
|
+
},
|
|
9
|
+
"selection": {
|
|
10
|
+
"rule": "sha256-question-id-stratified-v1",
|
|
11
|
+
"calibration_case_ids": [
|
|
12
|
+
"07741c45", "b6019101", "720133ac", "gpt4_7fce9456",
|
|
13
|
+
"c4f10528", "1d4da289", "54026fce", "06878be2",
|
|
14
|
+
"58bf7951", "c8c3f81d", "gpt4_d31cdae3", "gpt4_4edbafa2"
|
|
15
|
+
],
|
|
16
|
+
"heldout_case_ids": [
|
|
17
|
+
"6071bd76", "a2f3aa27", "09ba9854", "00ca467f",
|
|
18
|
+
"70b3e69b", "ceb54acb", "195a1a1b", "6b7dfb22",
|
|
19
|
+
"ad7109d1", "36580ce8", "bcbe585f", "gpt4_6ed717ea"
|
|
20
|
+
],
|
|
21
|
+
"heldout_selection_sha256": "sha256:4bd9ee57ced759f74e09283da571dd0b1283c1560aa26afabde50a2dd8e050a5"
|
|
22
|
+
},
|
|
23
|
+
"raw_retrieval": {
|
|
24
|
+
"ingestion": "raw-infer-disabled",
|
|
25
|
+
"chunk_chars": 1600,
|
|
26
|
+
"embedding_provider": "ollama",
|
|
27
|
+
"embedding_model": "nomic-embed-text:latest",
|
|
28
|
+
"embedding_model_id": "0a109f422b47",
|
|
29
|
+
"retrieved_chunk_limit": 100,
|
|
30
|
+
"session_cutoff": 5,
|
|
31
|
+
"quality_metrics": ["session_recall_any_at_5", "session_recall_all_at_5", "session_mrr_at_5"],
|
|
32
|
+
"latency_boundary": "query embedding through returned search candidates; excludes admission/indexing"
|
|
33
|
+
},
|
|
34
|
+
"native_preparation": {
|
|
35
|
+
"quality_metrics": ["useful_context_precision", "answerable_recall", "no_answer_correctness", "incorrect_injection_rate"],
|
|
36
|
+
"latency_boundary": "native control_prepare entry through authorized prepared context return",
|
|
37
|
+
"final_delivery_is_separately_confirmed": true
|
|
38
|
+
},
|
|
39
|
+
"competition": {
|
|
40
|
+
"mem0_oss_version": "2.0.20",
|
|
41
|
+
"mem0_nlp_and_bm25_status": "explicitly report base and hybrid-enabled profiles separately",
|
|
42
|
+
"speed_ratio_target": 2.0,
|
|
43
|
+
"speed_ratio_stretch": 10.0,
|
|
44
|
+
"speed_metric": "matched warm p95 on the same declared boundary",
|
|
45
|
+
"quality_condition": "no lower held-out answer/source quality and zero authority violations",
|
|
46
|
+
"claim_policy": "no cross-profile ratio or beta publication if a required comparable 2x gate fails"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -212,9 +212,22 @@ class RecallRequest(Contract):
|
|
|
212
212
|
reranker_model: str = "none"
|
|
213
213
|
egress_class: Literal["local", "remote", "none"] = "local"
|
|
214
214
|
min_score: float = 0.0
|
|
215
|
+
retrieval_strategy: Literal['legacy', 'core-rrf-v1'] = 'legacy'
|
|
216
|
+
|
|
217
|
+
def to_dict(self) -> dict[str, Any]:
|
|
218
|
+
value = Contract.to_dict(self)
|
|
219
|
+
if self.retrieval_strategy == 'legacy':
|
|
220
|
+
value.pop('retrieval_strategy')
|
|
221
|
+
return value
|
|
215
222
|
|
|
216
223
|
def __post_init__(self) -> None:
|
|
217
224
|
_required_id("request_id", self.request_id)
|
|
225
|
+
if self.retrieval_strategy not in {'legacy', 'core-rrf-v1'}:
|
|
226
|
+
raise ValueError('unknown retrieval strategy')
|
|
227
|
+
if self.retrieval_strategy == 'core-rrf-v1' and not 1 <= int(self.candidate_limit) <= 2000:
|
|
228
|
+
raise ValueError('candidate_limit must be between 1 and 2000')
|
|
229
|
+
if self.retrieval_strategy == 'core-rrf-v1' and not {'lexical', 'semantic', 'graph'}.intersection(self.signals):
|
|
230
|
+
raise ValueError('core-rrf-v1 requires lexical, semantic or graph signals')
|
|
218
231
|
if not str(self.query).strip():
|
|
219
232
|
raise ValueError("query is required")
|
|
220
233
|
if not 1 <= int(self.limit) <= 100:
|
|
@@ -473,6 +473,31 @@ body:has(.memorychat.collapsed){padding-bottom:70px}
|
|
|
473
473
|
@media(max-width:760px){.activityrow .activitytime{display:flex}.activityclock{font-size:11px}}
|
|
474
474
|
@media(max-width:780px){.insightmetrics{grid-template-columns:1fr 1fr}.healthcharthead{display:block}.chartlegend{margin-top:8px}}
|
|
475
475
|
|
|
476
|
+
/* The archive can be narrow on a wide screen when evidence is open. Size its
|
|
477
|
+
contents against the pane, not the viewport or the drawer's former parent. */
|
|
478
|
+
#blackboxArchiveCard{container-type:inline-size;min-width:0;align-self:start}
|
|
479
|
+
.flightfilters>.field{min-width:0}
|
|
480
|
+
.flightfilters input,.flightfilters select{min-width:0;max-width:100%;width:100%}
|
|
481
|
+
.flightidentity>.mono{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
482
|
+
.flightstat{min-width:0;overflow-wrap:anywhere}
|
|
483
|
+
@container (max-width:850px){
|
|
484
|
+
.flightfilters{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
485
|
+
.flightfilters>.field:first-child{grid-column:1/-1}
|
|
486
|
+
.flightfilters>button{align-self:end;white-space:normal}
|
|
487
|
+
.blackboxhead{flex-direction:column;gap:8px}
|
|
488
|
+
.flight,.blackboxworkspace.detail-open .flight{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:start;padding:12px}
|
|
489
|
+
.flight>.flightidentity{grid-column:1/-1}
|
|
490
|
+
.flight>.flightstat,.blackboxworkspace.detail-open .flight>.flightstat{display:block}
|
|
491
|
+
.flight>.secondary,.blackboxworkspace.detail-open .flight>.secondary{grid-column:1/-1;grid-row:auto;justify-self:start;max-width:100%;white-space:normal}
|
|
492
|
+
.flighttimestamp{white-space:normal}
|
|
493
|
+
}
|
|
494
|
+
@container (max-width:380px){
|
|
495
|
+
.flightfilters{grid-template-columns:minmax(0,1fr)}
|
|
496
|
+
.flight,.blackboxworkspace.detail-open .flight{grid-template-columns:minmax(0,1fr)}
|
|
497
|
+
.flightstat{display:flex;gap:8px;justify-content:space-between}
|
|
498
|
+
.flightstat small{flex-shrink:0}
|
|
499
|
+
}
|
|
500
|
+
|
|
476
501
|
.activitylegend{margin:12px 0 18px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;color:var(--muted);font-size:12px;line-height:1.5}
|
|
477
502
|
.activitylegend .legendlabel{font-weight:600;color:var(--ink)}
|
|
478
503
|
.activitylegend ul{display:flex;flex-wrap:wrap;gap:6px 16px;list-style:none;margin:7px 0;padding:0}
|
|
@@ -87,52 +87,21 @@ class AtBotCompanionClient:
|
|
|
87
87
|
return _fallback(query, candidates, {**health, "reason": str(exc)})
|
|
88
88
|
|
|
89
89
|
def expand_query(self, query: str) -> dict[str, Any]:
|
|
90
|
-
"""
|
|
90
|
+
"""Expand locally; AtBot v1 uses these same deterministic rules."""
|
|
91
91
|
clean = " ".join(query.split())
|
|
92
92
|
from atmem.control.atbot_service import AtBotServiceManager
|
|
93
|
+
from atmem.control.query_expansion import expand_query_v1
|
|
93
94
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if AtBotServiceManager().fallback_selected()
|
|
97
|
-
else self.health()
|
|
98
|
-
)
|
|
99
|
-
fallback = {
|
|
95
|
+
fallback_selected = AtBotServiceManager().fallback_selected()
|
|
96
|
+
return {
|
|
100
97
|
"format": "atbot-query-expansion-v1",
|
|
101
98
|
"query": clean,
|
|
102
|
-
"expanded_queries": [clean],
|
|
99
|
+
"expanded_queries": [clean] if fallback_selected and clean else expand_query_v1(clean),
|
|
103
100
|
"content_received": False,
|
|
104
|
-
"
|
|
101
|
+
"provider": "atbot-policy",
|
|
102
|
+
"model": "query-concepts-v1",
|
|
103
|
+
"companion": {"available": False, "fallback": True, "local_rules": not fallback_selected},
|
|
105
104
|
}
|
|
106
|
-
if not health.get("available"):
|
|
107
|
-
return fallback
|
|
108
|
-
request = Request(
|
|
109
|
-
f"{self.endpoint}/api/companion/expand-query",
|
|
110
|
-
data=json.dumps({"query": clean}).encode("utf-8"),
|
|
111
|
-
headers={
|
|
112
|
-
"Content-Type": "application/json",
|
|
113
|
-
"X-AtBot-CSRF": str(health["csrf_token"]),
|
|
114
|
-
},
|
|
115
|
-
method="POST",
|
|
116
|
-
)
|
|
117
|
-
try:
|
|
118
|
-
with urlopen(request, timeout=min(self.timeout, 10.0)) as response:
|
|
119
|
-
value = json.loads(response.read())
|
|
120
|
-
queries: list[str] = []
|
|
121
|
-
for raw in value.get("expanded_queries") or []:
|
|
122
|
-
item = " ".join(str(raw).split())[:200]
|
|
123
|
-
if item and item.casefold() not in {row.casefold() for row in queries}:
|
|
124
|
-
queries.append(item)
|
|
125
|
-
if len(queries) >= 6:
|
|
126
|
-
break
|
|
127
|
-
if not queries or value.get("content_received") is not False:
|
|
128
|
-
raise ValueError("invalid content-free expansion result")
|
|
129
|
-
return {
|
|
130
|
-
**value,
|
|
131
|
-
"expanded_queries": queries,
|
|
132
|
-
"companion": {"available": True, "fallback": False},
|
|
133
|
-
}
|
|
134
|
-
except (OSError, ValueError, HTTPError, URLError, json.JSONDecodeError):
|
|
135
|
-
return fallback
|
|
136
105
|
|
|
137
106
|
def propose(self, message: str) -> dict[str, Any]:
|
|
138
107
|
"""Request interpretation only; AtMem remains responsible for admission."""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Local, content-free query expansion matching AtBot's v1 rules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def expand_query_v1(query: str) -> list[str]:
|
|
7
|
+
clean = " ".join(query.split())
|
|
8
|
+
if not clean:
|
|
9
|
+
return []
|
|
10
|
+
lowered = clean.casefold()
|
|
11
|
+
expansions = [clean]
|
|
12
|
+
concept_rules = (
|
|
13
|
+
(("fav food", "favorite food", "favourite food"), ("favorite food", "food preference", "preferred meal", "likes to eat")),
|
|
14
|
+
(("fav car", "favorite car", "favourite car"), ("favorite car", "car preference", "preferred vehicle")),
|
|
15
|
+
(("fav book", "favorite book", "favourite book"), ("favorite book", "book preference", "preferred reading")),
|
|
16
|
+
)
|
|
17
|
+
for triggers, values in concept_rules:
|
|
18
|
+
if any(trigger in lowered for trigger in triggers):
|
|
19
|
+
expansions.extend(values)
|
|
20
|
+
normalized: list[str] = []
|
|
21
|
+
for value in expansions:
|
|
22
|
+
item = " ".join(str(value).split())[:200]
|
|
23
|
+
if item and item.casefold() not in {row.casefold() for row in normalized}:
|
|
24
|
+
normalized.append(item)
|
|
25
|
+
if len(normalized) >= 6:
|
|
26
|
+
break
|
|
27
|
+
return normalized
|
|
@@ -734,6 +734,13 @@ class Memory:
|
|
|
734
734
|
|
|
735
735
|
if not isinstance(request, RecallRequest):
|
|
736
736
|
raise TypeError("request must be RecallRequest")
|
|
737
|
+
if request.retrieval_strategy == 'core-rrf-v1':
|
|
738
|
+
from dataclasses import replace
|
|
739
|
+
from atmem.retrieve.hybrid import collect
|
|
740
|
+
rows, metadata = collect(self, request)
|
|
741
|
+
# Channel quotas are independent; bound the ranked publication prefix.
|
|
742
|
+
publication = replace(request, candidate_limit=max(request.candidate_limit, request.limit))
|
|
743
|
+
return self.create_candidate_set_v1(publication, rows, retrieval_metadata=metadata)
|
|
737
744
|
scope = request.scope
|
|
738
745
|
recalled = self.recall(
|
|
739
746
|
scope.subject_id,
|
|
@@ -884,7 +891,7 @@ class Memory:
|
|
|
884
891
|
|
|
885
892
|
@_atomic
|
|
886
893
|
def create_candidate_set_v1(
|
|
887
|
-
self, request: Any, candidates: list[dict[str, Any]]
|
|
894
|
+
self, request: Any, candidates: list[dict[str, Any]], *, retrieval_metadata: dict[str, Any] | None = None
|
|
888
895
|
) -> Any:
|
|
889
896
|
"""Persist one revalidated union of already-governed retrieval signals.
|
|
890
897
|
|
|
@@ -969,7 +976,7 @@ class Memory:
|
|
|
969
976
|
aggregation_signal_digest,
|
|
970
977
|
)
|
|
971
978
|
|
|
972
|
-
aggregated = aggregate_supporting_evidence(
|
|
979
|
+
aggregated = eligible_rows if retrieval_metadata is not None else aggregate_supporting_evidence(
|
|
973
980
|
eligible_rows,
|
|
974
981
|
subject_id=scope.subject_id,
|
|
975
982
|
workspace_id=scope.workspace_id,
|
|
@@ -1024,7 +1031,14 @@ class Memory:
|
|
|
1024
1031
|
for query in row.get("matched_queries") or ()
|
|
1025
1032
|
}
|
|
1026
1033
|
),
|
|
1027
|
-
"support_aggregation_version": SUPPORT_AGGREGATION_VERSION,
|
|
1034
|
+
"support_aggregation_version": None if retrieval_metadata is not None else SUPPORT_AGGREGATION_VERSION,
|
|
1035
|
+
**({'retrieval_fusion': {**retrieval_metadata, 'candidate_ranks': {
|
|
1036
|
+
row.record_id: row.signals.get('fusion', {}).get('channel_ranks', {})
|
|
1037
|
+
for row in durable
|
|
1038
|
+
}, 'graph_support_record_ids': {
|
|
1039
|
+
row.record_id: [step['record_id'] for step in row.signals.get('fusion', {}).get('graph_path', ())]
|
|
1040
|
+
for row in durable if row.signals.get('fusion', {}).get('graph_path')
|
|
1041
|
+
}}} if retrieval_metadata is not None else {}),
|
|
1028
1042
|
"aggregation_signal_digest": aggregation_digest,
|
|
1029
1043
|
"grouped_candidate_count": len(grouped_candidates),
|
|
1030
1044
|
"supported_group_count": len(
|
|
@@ -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.3.
|
|
20
|
+
OPENCLAW_PLUGIN_VERSION = "2.3.3"
|
|
21
21
|
_CONFIG_KEY = "plugins.entries.memory-atmem"
|
|
22
22
|
|
|
23
23
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Deterministic rank fusion; scores are nomination priors, not confidence."""
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
|
|
4
|
+
FUSION_VERSION = 'core-rrf-v1'
|
|
5
|
+
RANK_CONSTANT = 60
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def fuse_rankings(channels):
|
|
9
|
+
active = {name: list(dict.fromkeys(ids)) for name, ids in channels.items() if ids}
|
|
10
|
+
ranks = defaultdict(dict)
|
|
11
|
+
for name, ids in active.items():
|
|
12
|
+
for rank, record_id in enumerate(ids, 1):
|
|
13
|
+
ranks[record_id][name] = rank
|
|
14
|
+
denominator = len(active) / (RANK_CONSTANT + 1) if active else 1
|
|
15
|
+
result = [dict(record_id=record_id, channel_ranks=positions,
|
|
16
|
+
score=sum(1 / (RANK_CONSTANT + rank) for rank in positions.values()) / denominator)
|
|
17
|
+
for record_id, positions in ranks.items()]
|
|
18
|
+
return sorted(result, key=lambda row: (-row['score'], row['record_id']))
|