atmem 2.3.7b2__tar.gz → 2.3.8__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.7b2/atmem.egg-info → atmem-2.3.8}/PKG-INFO +50 -18
- {atmem-2.3.7b2 → atmem-2.3.8}/README.md +41 -16
- atmem-2.3.8/atmem/adapters/hermes/__init__.py +5 -0
- atmem-2.3.8/atmem/adapters/hermes/assets/plugin_entry.py +85 -0
- atmem-2.3.8/atmem/adapters/hermes/binding.py +215 -0
- atmem-2.3.8/atmem/adapters/hermes/client.py +179 -0
- atmem-2.3.8/atmem/adapters/hermes/package.py +17 -0
- atmem-2.3.8/atmem/adapters/hermes/provider.py +404 -0
- atmem-2.3.8/atmem/adapters/hermes/service.py +525 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/atflows_service.py +2 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/__init__.py +6 -0
- atmem-2.3.8/atmem/benchmark/attribution.py +514 -0
- atmem-2.3.8/atmem/benchmark/contracts.py +703 -0
- atmem-2.3.8/atmem/benchmark/finalization.py +180 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/cli.py +420 -16
- atmem-2.3.8/atmem/context_engine/__init__.py +43 -0
- atmem-2.3.8/atmem/context_engine/contracts.py +624 -0
- atmem-2.3.8/atmem/context_engine/coverage.py +56 -0
- atmem-2.3.8/atmem/context_engine/formation.py +881 -0
- atmem-2.3.8/atmem/context_engine/navigator.py +187 -0
- atmem-2.3.8/atmem/context_engine/packing.py +287 -0
- atmem-2.3.8/atmem/context_engine/planner.py +560 -0
- atmem-2.3.8/atmem/context_engine/pools.py +24 -0
- atmem-2.3.8/atmem/context_engine/profiles.py +104 -0
- atmem-2.3.8/atmem/context_engine/retrieval.py +1293 -0
- atmem-2.3.8/atmem/context_engine/service.py +337 -0
- atmem-2.3.8/atmem/context_engine/sufficiency.py +114 -0
- atmem-2.3.8/atmem/continuity/__init__.py +5 -0
- atmem-2.3.8/atmem/continuity/client.py +256 -0
- atmem-2.3.8/atmem/continuity/example.py +56 -0
- atmem-2.3.8/atmem/continuity/integrations.py +112 -0
- atmem-2.3.8/atmem/continuity/langgraph_example.py +88 -0
- atmem-2.3.8/atmem/continuity/service.py +408 -0
- atmem-2.3.8/atmem/continuity/tools.py +108 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/__init__.py +53 -0
- atmem-2.3.8/atmem/contracts/continuity-event-v1.json +28 -0
- atmem-2.3.8/atmem/contracts/models.py +852 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.css +9 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.html +24 -7
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/app.js +63 -15
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/blackbox.py +9 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/compat.py +6 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/manager.py +519 -53
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/openclaw_native.py +2 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/state.py +2 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/store.py +80 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/verify.py +25 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/web.py +103 -1
- atmem-2.3.8/atmem/core/keys.py +603 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/storage.py +25 -7
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/dashboard_daemon.py +5 -3
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/models.py +5 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/service.py +40 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/store.py +52 -13
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/__init__.py +26 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/context.py +5 -6
- atmem-2.3.8/atmem/extract/formation.py +848 -0
- atmem-2.3.8/atmem/extract/models.py +679 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/review.py +88 -50
- atmem-2.3.8/atmem/extract/structured_projection.py +99 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/validation.py +276 -8
- atmem-2.3.8/atmem/hermes_install.py +881 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/service.py +2 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/mcp/server.py +115 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/memory.py +1872 -53
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/openclaw_install.py +1 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/__init__.py +21 -0
- atmem-2.3.8/atmem/retrieve/assemble.py +712 -0
- atmem-2.3.8/atmem/retrieve/expand.py +124 -0
- atmem-2.3.8/atmem/retrieve/hybrid.py +658 -0
- atmem-2.3.8/atmem/retrieve/intent.py +621 -0
- atmem-2.3.8/atmem/retrieve/profiles.py +56 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/rank.py +1 -0
- atmem-2.3.8/atmem/retrieve/sufficiency.py +401 -0
- atmem-2.3.8/atmem/schemas/v1/episode-ingest.json +45 -0
- atmem-2.3.8/atmem/schemas/v1/evidence-neighborhood.json +16 -0
- atmem-2.3.8/atmem/schemas/v1/formation-receipt.json +27 -0
- atmem-2.3.8/atmem/schemas/v1/information-need.json +34 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-proposal.json +7 -1
- atmem-2.3.8/atmem/schemas/v1/retrieval-budget.json +18 -0
- atmem-2.3.8/atmem/schemas/v1/retrieval-stage-event.json +34 -0
- atmem-2.3.8/atmem/schemas/v1/sufficiency-decision.json +15 -0
- atmem-2.3.8/atmem/schemas/v2/context-package.json +23 -0
- atmem-2.3.8/atmem/schemas/v2/context-request.json +15 -0
- atmem-2.3.8/atmem/schemas/v2/memory-unit.json +46 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/index.py +12 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/application.py +108 -0
- atmem-2.3.8/atmem/service/household.py +71 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/sqlite.py +2473 -47
- {atmem-2.3.7b2 → atmem-2.3.8/atmem.egg-info}/PKG-INFO +50 -18
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/SOURCES.txt +98 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/requires.txt +9 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/benchmarks.md +24 -0
- atmem-2.3.8/docs/continuity.md +249 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/http-api.md +66 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/integration-guide.md +1 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/release-roadmap.md +150 -5
- atmem-2.3.8/docs/releases/v2.3.7-to-v2.3.8-technical-report.md +93 -0
- atmem-2.3.8/docs/releases/v2.3.7.md +117 -0
- atmem-2.3.8/docs/releases/v2.3.8.md +128 -0
- atmem-2.3.8/docs/releases/v2.3.8b2.md +56 -0
- atmem-2.3.8/docs/releases/v2.3.8b3.md +29 -0
- atmem-2.3.8/docs/releases/v2.3.8b4.md +32 -0
- atmem-2.3.8/docs/releases/v2.3.8b5.md +33 -0
- atmem-2.3.8/docs/releases/v2.3.8b6.md +68 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/saas-integration.md +12 -5
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/atbot.md +1 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/atflows.md +21 -3
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/cli.md +3 -3
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/getting-started.md +1 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/index.md +8 -0
- atmem-2.3.8/docs/website/integrations/hermes.md +49 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/integrations.md +4 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/manifest.json +5 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/portfolio.md +1 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/releases.md +19 -4
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/troubleshooting.md +2 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/README.md +2 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/openclaw.plugin.json +1 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/package-lock.json +2 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/package.json +2 -2
- atmem-2.3.8/integrations/openclaw/test/fixtures/hook-context/2026.9.6.json +409 -0
- atmem-2.3.8/integrations/openclaw/test/fixtures/hook-context/2026.9.9.json +413 -0
- atmem-2.3.8/integrations/openclaw/test/hook-context-parser.mjs +36 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/lib/hook-context-shape.mjs +31 -9
- {atmem-2.3.7b2 → atmem-2.3.8}/pyproject.toml +13 -3
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_auditability.py +100 -0
- atmem-2.3.8/tests/test_benchmark_attribution.py +474 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_runner.py +11 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_blackbox.py +6 -1
- atmem-2.3.8/tests/test_context_assembler_v2.py +605 -0
- atmem-2.3.8/tests/test_context_engine_contracts.py +270 -0
- atmem-2.3.8/tests/test_context_engine_formation.py +346 -0
- atmem-2.3.8/tests/test_context_engine_governance.py +433 -0
- atmem-2.3.8/tests/test_context_engine_migration.py +152 -0
- atmem-2.3.8/tests/test_context_engine_navigation.py +90 -0
- atmem-2.3.8/tests/test_context_engine_performance.py +303 -0
- atmem-2.3.8/tests/test_context_engine_retrieval.py +1316 -0
- atmem-2.3.8/tests/test_continuity_http.py +120 -0
- atmem-2.3.8/tests/test_continuity_integration.py +134 -0
- atmem-2.3.8/tests/test_continuity_product.py +313 -0
- atmem-2.3.8/tests/test_continuity_tools.py +42 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_plane.py +2 -1
- atmem-2.3.8/tests/test_control_store_process_lock.py +137 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_verify.py +50 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_dashboard.py +11 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_context.py +2 -2
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_documentation.py +2 -2
- atmem-2.3.8/tests/test_encryption.py +452 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_evidence_protection.py +2 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_proposals.py +115 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_generic_control.py +74 -0
- atmem-2.3.8/tests/test_hermes_authority.py +428 -0
- atmem-2.3.8/tests/test_hermes_binding.py +129 -0
- atmem-2.3.8/tests/test_hermes_install.py +365 -0
- atmem-2.3.8/tests/test_hermes_native.py +92 -0
- atmem-2.3.8/tests/test_hermes_packaging.py +120 -0
- atmem-2.3.8/tests/test_hermes_provider.py +184 -0
- atmem-2.3.8/tests/test_hermes_upstream_contract.py +152 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_http_api.py +31 -0
- atmem-2.3.8/tests/test_installed_benchmark_product.py +52 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_mcp.py +20 -0
- atmem-2.3.8/tests/test_memory_formation.py +1191 -0
- atmem-2.3.8/tests/test_official_benchmark_adapters.py +1719 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding_services.py +25 -9
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_control.py +33 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_production_benchmarks.py +44 -0
- atmem-2.3.8/tests/test_reference_parity.py +254 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_release_metadata.py +4 -1
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_adapter_conformance.py +27 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_candidate_union.py +230 -26
- atmem-2.3.8/tests/test_retrieval_cli.py +78 -0
- atmem-2.3.8/tests/test_retrieval_intent.py +70 -0
- atmem-2.3.8/tests/test_retrieval_quality_contracts.py +595 -0
- atmem-2.3.8/tests/test_retrieval_quality_protocol.py +534 -0
- atmem-2.3.8/tests/test_retrieval_query_plan.py +199 -0
- atmem-2.3.8/tests/test_retrieval_sufficiency.py +284 -0
- atmem-2.3.8/tests/test_typed_memory_persistence.py +536 -0
- atmem-2.3.8/tests/test_windows_atomic_startup.py +44 -0
- atmem-2.3.8/tools/install_local_wheels.py +22 -0
- atmem-2.3.8/tools/run_installed_encryption_tests.py +42 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_atflows_handoff.py +1 -1
- atmem-2.3.8/tools/smoke_installed_encryption.py +102 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_installed_package.py +1 -1
- atmem-2.3.8/tools/smoke_installed_retrieval.py +37 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_upgrade_from_2_1.py +9 -4
- atmem-2.3.7b2/atmem/benchmark/contracts.py +0 -143
- atmem-2.3.7b2/atmem/contracts/models.py +0 -308
- atmem-2.3.7b2/atmem/core/keys.py +0 -131
- atmem-2.3.7b2/atmem/extract/models.py +0 -151
- atmem-2.3.7b2/atmem/retrieve/hybrid.py +0 -159
- atmem-2.3.7b2/tests/test_encryption.py +0 -108
- {atmem-2.3.7b2 → atmem-2.3.8}/LICENSE +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/MANIFEST.in +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/base.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/callbacks.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/crewai.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/evidence_profiles.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/google_adk.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/langgraph.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/microsoft_agent.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/openai_agents.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/pydantic_ai.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/adapters/smolagents.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/deterministic-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/mem0-head-to-head-2.3.3b1-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/retrieval-calibration-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/retrieval-heldout-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/task-state-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/data/thresholds-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/external.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/profiles.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/retrieval.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/benchmark/runner.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/bun_runtime.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/client.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/execution.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/task_state.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/contracts/versions.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/assets/atmem.jpg +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/atbot_companion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/atbot_service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/evidence.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/explain.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/hosts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/jev_service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/openclaw_topology.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/query_expansion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/server.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/topology.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/control/ui.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/canonical.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/fact_keys.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/core/time.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/canonical.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/client.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/config.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/transport.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/delegated/validation.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/durability.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/accounts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/evidence/crypto.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/coverage.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/events.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/projection.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/retention.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/execution/status.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/classify.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/extract/rules.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/identity.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/maintenance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/store.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/graph/traverse.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/artifacts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/home/layout.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/identity/store.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/incidents/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/incidents/detect.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/integrations/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/integrations/atflows.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/export.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/importer.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/mem0.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/interchange/plan.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/attestation.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/registry.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/report.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/invariants/verdict.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/investigate.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/invalidation.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/maintenance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/lifecycle/service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/locking.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/maintenance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/mcp/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/access.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/index.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/invalidation.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/processors.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/media/service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/onboarding.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/onboarding_verify.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/processes.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/langgraph.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/lifecycle.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/loading.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/mem0.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/pydantic_ai.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/runtime.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/server.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/signing.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/provider_adapters/worker.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/cache.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/calibration-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/calibration.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/fusion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/graph.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/graph_signal.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/signals.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/retrieve/support.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/admin-audit.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/capabilities.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/context-package.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/graph-path.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-lifecycle-request.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-observation-request.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/host-task-proposal-request.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/invariant-registry.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/media-observation.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-archive.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/memory-lifecycle.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/onboarding-state.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/recall-request.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/retrieval-decision.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/scope.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/semantic-health.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-job.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-key.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/service-principal.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/source-capture.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-context-package.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-profile.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-session-binding.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-start-request.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-state-proposal.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-state.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/task-transition-decision.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/schemas/v1/unified-health.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/health.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/models.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/pgvector.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/providers.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/semantic/qdrant.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/admin_audit.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/auth.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/cache_policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/config.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/jobs.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/observability.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/recovery.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/server/repositories.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/service/executions.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/health.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/store/postgres.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/binding.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/context.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/enablement.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/enforcement.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/governance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/guards.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/host_boundary.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/models.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/observability.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/profiles.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/provenance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/task_state/service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/telemetry/__init__.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem/telemetry/retrieval.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/dependency_links.txt +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/entry_points.txt +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/atmem.egg-info/top_level.txt +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/agent-blackbox.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/atbot-release.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/audit-log-spec.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/audit-search.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/auditing-guide.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/benchmarks/memory-integrity.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/capabilities.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/context-provider-adapters.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-request-auth-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/contracts/delegated-request-auth-v1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/control-plane.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/current-status.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/dashboard-design-language.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/data-storage-and-backup.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/delegated-context-provider.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/entity-relationship-memory.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/benchmark-deterministic-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/http.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/langgraph.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/openclaw.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/examples/onboarding/pydantic-ai.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/framework-adapters.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/generic-adapter.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/governed-task-state.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T043658Z-740c5c89d63c-host-compatibility.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260909T055300Z-04a063ce1e7b-publication.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/003/20260910-storizon-published-2.2.6.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260909-progress-card-observations.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260909-selective-context-and-precise-time.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260912-m0-investigation-preview.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/020/20260912-release-candidate-correctness-hardening.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/021/20260912-m0-findings-ui.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/022/20260909-dashboard-usability.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/026/20260920T094307Z-85c2ae2-atflows-b2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/026/20260920T105859Z-atmem-234-stable.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/028/20260913-encrypted-evidence-access.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/029/2026-09-13-local-user-management.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/030/2026-09-13-portable-home.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/baseline.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/consistency-audit.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-benchmark.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-calibration.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/core-hybrid-review.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-calibration-four-profile.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-calibration.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/graph-nomination.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/matched-v2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/numpy-benchmark.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/numpy-review.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/profiling.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/031/release-2.3.3.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/implementation-evidence/README.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/invariants.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/memory-extraction.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/memory-interchange.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/multimodal-observations.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/onboarding.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/openclaw-setup.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/production-service.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/release-coordination.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v1.0.0.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.0.0.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.0.1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.1.0.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.0.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.3.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.4.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.5.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b10.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b11.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b3.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b4.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b5.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b8.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.2.6b9.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.0.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.0b1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.3.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4b1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.4b2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.5.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.6.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.6b1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.7b1.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/releases/v2.3.7b2.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/retrieval-quality.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/security/production-threat-model.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/semantic-search.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/spec-kit.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/storage-performance.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/dashboard.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/evidence.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/examples.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/mcp.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/python.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website/reference.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/docs/website-contributing.md +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/index.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/delegated-identity.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/execution-spool.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/rpc-client.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/setup.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/task-tools.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-errors.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-observations.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/tool-result-comparison.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/src/types.ts +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/blackbox-diagnostics.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/dashboard-live.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-identity.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/delegated-journey.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/execution-spool.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.7.1-2.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.8.1.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.2.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.3.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.4.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/fixtures/hook-context/2026.9.5.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/hook-context-compat.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/hooks.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/lib/record-hook-context.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/manifest.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/setup.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/smoke.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/task-journey.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/task-tools.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/tool-observations.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/test/tool-result-comparison.mjs +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/integrations/openclaw/tsconfig.json +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/setup.cfg +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_idempotency.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_api_upgrade.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atbot_companion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atbot_service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_atflows_review.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_cli.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_external.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_benchmark_memory_integrity_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_bun_runtime.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_cli.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_cli_guidance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_contracts_v1.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_control_evidence.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_dashboard_daemon.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_control.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_delegated_transport.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_durability.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_execution_capture.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_execution_identity.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_extract_upgrade.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_feature_surfaces.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_forget_verification.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapter_conformance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapter_packaging.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_adapters.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_framework_delegated_adapters.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_aliases.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_lifecycle.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_graph_quality.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_home.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_host_adapter.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_incident_resolution.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_interchange.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_jev_lab.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_jev_service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_langgraph_provider.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_layers.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_lifecycle.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_lifecycle_migration.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_local_identity.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_locking.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_maintenance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_governance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_observations.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_media_packaging.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_mem0_provider.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_memory.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_onboarding_recovery.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_compat.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_install.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_openclaw_topology.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_processes.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_cli.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_integration.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_packaging.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_performance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_runtime.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_provider_server.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_pydantic_provider.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_recall_evidence.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_restore_receipt.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_benchmark.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_cache.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_graph_fusion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_quality.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieval_signals_and_cache.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_retrieve.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_sdk_packaging.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_health.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_matrix_cache.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_parity.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_policy_invalidation.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_profiles.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_rebuild.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_schema.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_search.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_semantic_setup.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_spec_task_inventory.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_storage_packaging.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_store_transactions.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_supporting_evidence.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_adapters.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_atbot.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_benchmark.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_binding.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_cli.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_clock.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_context.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_dashboard.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_deletion.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_expiry.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_governance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_guards.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_host_boundary.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_host_contracts.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_observability.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_performance.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_policy.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_prerequisites.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_schemas.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_service.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_session_binding.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_store.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_tamper.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_upgrade.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_task_state_walking_skeleton.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tests/test_website_docs.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_core_hybrid.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_numpy_cache.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/benchmark_storage.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/check_invariants.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/check_spec_tasks.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/release_metadata.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/run_longmemeval_retrieval.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/run_mem0_openclaw_live.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_atflows_delegated.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_delegated_package.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_delegated_transport.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/tools/smoke_mem0_roleplay.py +0 -0
- {atmem-2.3.7b2 → atmem-2.3.8}/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.8
|
|
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,16 +25,23 @@ 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.
|
|
28
|
+
Requires-Dist: atflows==0.1.4b3
|
|
29
29
|
Requires-Dist: cryptography<49,>=42
|
|
30
30
|
Provides-Extra: atflows
|
|
31
31
|
Provides-Extra: dev
|
|
32
32
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
33
|
+
Requires-Dist: numpy<3,>=1.26; extra == "dev"
|
|
34
|
+
Requires-Dist: PyYAML<7,>=6; extra == "dev"
|
|
35
|
+
Requires-Dist: jsonschema<5,>=4.23; extra == "dev"
|
|
36
|
+
Requires-Dist: certifi>=2024.2.2; extra == "dev"
|
|
37
|
+
Requires-Dist: loguru<1,>=0.7; extra == "dev"
|
|
33
38
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
34
39
|
Provides-Extra: semantic
|
|
35
40
|
Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
|
|
36
41
|
Provides-Extra: semantic-accelerated
|
|
37
42
|
Requires-Dist: numpy<3,>=1.26; extra == "semantic-accelerated"
|
|
43
|
+
Provides-Extra: encrypted
|
|
44
|
+
Requires-Dist: sqlcipher3==0.6.2; extra == "encrypted"
|
|
38
45
|
Provides-Extra: mem0
|
|
39
46
|
Requires-Dist: mem0ai<3,>=2.0.20; extra == "mem0"
|
|
40
47
|
Provides-Extra: langgraph-provider
|
|
@@ -79,12 +86,17 @@ Dynamic: license-file
|
|
|
79
86
|
|
|
80
87
|
# AtMem
|
|
81
88
|
|
|
82
|
-
[](./docs/releases/v2.3.8.md)
|
|
83
90
|
[](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
|
|
84
91
|
|
|
85
92
|
**AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
|
|
86
93
|
|
|
87
|
-
> **
|
|
94
|
+
> **AtMem 2.3.8:** Source-linked typed context, bounded evidence packing and
|
|
95
|
+
> one-command Hermes setup extend the existing governed continuity surface. The
|
|
96
|
+
> exact AtFlows companion is 0.1.4b3. See the [release note](./docs/releases/v2.3.8.md),
|
|
97
|
+
> [technical report](./docs/releases/v2.3.7-to-v2.3.8-technical-report.md), and
|
|
98
|
+
> [bounded evaluation evidence](./benchmarks/retrieval_quality/reports/five-percent-results-20261010.md).
|
|
99
|
+
> Previous benchmarks retain their tested-version provenance.
|
|
88
100
|
> It records exact host-observed text and supported multimodal boundaries by default,
|
|
89
101
|
> while keeping every claim limited to what the connected agent actually supplied.
|
|
90
102
|
|
|
@@ -101,7 +113,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
101
113
|
### 1. Install AtMem and choose memory intelligence
|
|
102
114
|
|
|
103
115
|
```bash
|
|
104
|
-
python -m pip install --upgrade atmem==2.3.
|
|
116
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
105
117
|
atmem atbot setup
|
|
106
118
|
atmem atbot doctor
|
|
107
119
|
atmem init
|
|
@@ -114,7 +126,26 @@ always-present local vector index. Do **not** install AtBot separately. During
|
|
|
114
126
|
hosted provider, or the safe deterministic fallback. API keys stay in
|
|
115
127
|
environment variables; AtMem does not save them.
|
|
116
128
|
|
|
117
|
-
|
|
129
|
+
For encrypted local households, install the SQLCipher extra and verify the
|
|
130
|
+
runtime before migration:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Ubuntu/Debian first: sudo apt-get install libsqlcipher-dev build-essential
|
|
134
|
+
# Then install with the system SQLCipher headers and library:
|
|
135
|
+
CFLAGS="-I/usr/include/sqlcipher" LDFLAGS="-lsqlcipher" \
|
|
136
|
+
python -m pip install --upgrade 'atmem[encrypted]'
|
|
137
|
+
|
|
138
|
+
# macOS and Windows can install the extra directly:
|
|
139
|
+
python -m pip install --upgrade 'atmem[encrypted]'
|
|
140
|
+
atmem household status ~/.atmem/memories.db
|
|
141
|
+
atmem household migrate ~/.atmem/memories.db
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Stop every writer before migration. AtMem validates SQLite integrity,
|
|
145
|
+
SQLCipher page integrity and per-table row counts before the atomic cutover;
|
|
146
|
+
see [SaaS integration and recovery](docs/saas-integration.md#privacy-retention-and-deletion).
|
|
147
|
+
|
|
148
|
+
In 2.3.8, `pip install atmem` installs the Python packages only; pip does not
|
|
118
149
|
run a post-install downloader. On the first `atmem init`, if compatible Bun is not
|
|
119
150
|
already installed, AtMem clearly announces and downloads its pinned official
|
|
120
151
|
Bun runtime for AtFlows, verifies the archive against a release-pinned SHA-256,
|
|
@@ -143,7 +174,7 @@ package yourself.
|
|
|
143
174
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
144
175
|
|
|
145
176
|
```bash
|
|
146
|
-
python -m pip install --upgrade atmem==2.3.
|
|
177
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
147
178
|
atmem openclaw upgrade
|
|
148
179
|
atmem control verify
|
|
149
180
|
```
|
|
@@ -166,7 +197,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
166
197
|
#### Pydantic AI — native capability
|
|
167
198
|
|
|
168
199
|
```bash
|
|
169
|
-
python -m pip install 'atmem[pydantic-ai]==2.3.
|
|
200
|
+
python -m pip install 'atmem[pydantic-ai]==2.3.8'
|
|
170
201
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
171
202
|
```
|
|
172
203
|
|
|
@@ -191,7 +222,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
191
222
|
#### LangChain/LangGraph — native middleware
|
|
192
223
|
|
|
193
224
|
```bash
|
|
194
|
-
python -m pip install 'atmem[langgraph]==2.3.
|
|
225
|
+
python -m pip install 'atmem[langgraph]==2.3.8'
|
|
195
226
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
196
227
|
```
|
|
197
228
|
|
|
@@ -359,7 +390,7 @@ and restores it exactly.
|
|
|
359
390
|
## Installation details
|
|
360
391
|
|
|
361
392
|
```bash
|
|
362
|
-
python -m pip install atmem==2.3.
|
|
393
|
+
python -m pip install atmem==2.3.8
|
|
363
394
|
atmem --version
|
|
364
395
|
```
|
|
365
396
|
|
|
@@ -369,7 +400,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
369
400
|
choices:
|
|
370
401
|
|
|
371
402
|
```bash
|
|
372
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
403
|
+
python -m pip install 'atmem[semantic]==2.3.8'
|
|
373
404
|
```
|
|
374
405
|
|
|
375
406
|
For repository development, install both workspace packages:
|
|
@@ -478,7 +509,7 @@ evidence, activate AtMem, and return it to shadow.
|
|
|
478
509
|
## Dashboard
|
|
479
510
|
|
|
480
511
|
```bash
|
|
481
|
-
atmem dashboard daemon start # http://127.0.0.1:
|
|
512
|
+
atmem dashboard daemon start # http://127.0.0.1:8768/ on a new install; existing daemon ports are preserved
|
|
482
513
|
atmem dashboard daemon open
|
|
483
514
|
atmem dashboard daemon status
|
|
484
515
|
atmem dashboard daemon restart
|
|
@@ -557,7 +588,7 @@ atmem control restore
|
|
|
557
588
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
558
589
|
|
|
559
590
|
```bash
|
|
560
|
-
python -m pip install --upgrade atmem==2.3.
|
|
591
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
561
592
|
atmem openclaw upgrade
|
|
562
593
|
atmem control verify
|
|
563
594
|
```
|
|
@@ -689,7 +720,7 @@ atmem mcp --db ~/.atmem/memories.db --subject user-1
|
|
|
689
720
|
```
|
|
690
721
|
|
|
691
722
|
MCP tools: `memory_remember`, `memory_observe`, `memory_recall`,
|
|
692
|
-
`memory_recall_decision`,
|
|
723
|
+
`memory_recall_decision`, `memory_form_episode`,
|
|
693
724
|
`memory_get_record`, `memory_get_source`, `memory_recall_block`,
|
|
694
725
|
`memory_persona`, `memory_context_pack`, `memory_capture`, `memory_list`,
|
|
695
726
|
`memory_forget`, `memory_forget_artifact`, `memory_promote`, `memory_audit`,
|
|
@@ -790,10 +821,11 @@ npm test
|
|
|
790
821
|
npm run smoke
|
|
791
822
|
```
|
|
792
823
|
|
|
793
|
-
The
|
|
794
|
-
**2.3.
|
|
795
|
-
retains its independent
|
|
796
|
-
**0.1.2
|
|
824
|
+
The current source candidate is **2.3.8** with matching OpenClaw bridge source
|
|
825
|
+
**2.3.8**. Release validation requires exact Python/bridge alignment; AtBot
|
|
826
|
+
retains its independent compatible version **0.1.0** and the tested AtFlows pin
|
|
827
|
+
is **0.1.4b3**. The published package remains 2.3.7 until the candidate is
|
|
828
|
+
reviewed, tagged and registry-verified.
|
|
797
829
|
|
|
798
830
|
## License
|
|
799
831
|
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# AtMem
|
|
2
2
|
|
|
3
|
-
[](./docs/releases/v2.3.8.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
|
-
> **
|
|
8
|
+
> **AtMem 2.3.8:** Source-linked typed context, bounded evidence packing and
|
|
9
|
+
> one-command Hermes setup extend the existing governed continuity surface. The
|
|
10
|
+
> exact AtFlows companion is 0.1.4b3. See the [release note](./docs/releases/v2.3.8.md),
|
|
11
|
+
> [technical report](./docs/releases/v2.3.7-to-v2.3.8-technical-report.md), and
|
|
12
|
+
> [bounded evaluation evidence](./benchmarks/retrieval_quality/reports/five-percent-results-20261010.md).
|
|
13
|
+
> Previous benchmarks retain their tested-version provenance.
|
|
9
14
|
> It records exact host-observed text and supported multimodal boundaries by default,
|
|
10
15
|
> while keeping every claim limited to what the connected agent actually supplied.
|
|
11
16
|
|
|
@@ -22,7 +27,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
|
|
|
22
27
|
### 1. Install AtMem and choose memory intelligence
|
|
23
28
|
|
|
24
29
|
```bash
|
|
25
|
-
python -m pip install --upgrade atmem==2.3.
|
|
30
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
26
31
|
atmem atbot setup
|
|
27
32
|
atmem atbot doctor
|
|
28
33
|
atmem init
|
|
@@ -35,7 +40,26 @@ always-present local vector index. Do **not** install AtBot separately. During
|
|
|
35
40
|
hosted provider, or the safe deterministic fallback. API keys stay in
|
|
36
41
|
environment variables; AtMem does not save them.
|
|
37
42
|
|
|
38
|
-
|
|
43
|
+
For encrypted local households, install the SQLCipher extra and verify the
|
|
44
|
+
runtime before migration:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Ubuntu/Debian first: sudo apt-get install libsqlcipher-dev build-essential
|
|
48
|
+
# Then install with the system SQLCipher headers and library:
|
|
49
|
+
CFLAGS="-I/usr/include/sqlcipher" LDFLAGS="-lsqlcipher" \
|
|
50
|
+
python -m pip install --upgrade 'atmem[encrypted]'
|
|
51
|
+
|
|
52
|
+
# macOS and Windows can install the extra directly:
|
|
53
|
+
python -m pip install --upgrade 'atmem[encrypted]'
|
|
54
|
+
atmem household status ~/.atmem/memories.db
|
|
55
|
+
atmem household migrate ~/.atmem/memories.db
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Stop every writer before migration. AtMem validates SQLite integrity,
|
|
59
|
+
SQLCipher page integrity and per-table row counts before the atomic cutover;
|
|
60
|
+
see [SaaS integration and recovery](docs/saas-integration.md#privacy-retention-and-deletion).
|
|
61
|
+
|
|
62
|
+
In 2.3.8, `pip install atmem` installs the Python packages only; pip does not
|
|
39
63
|
run a post-install downloader. On the first `atmem init`, if compatible Bun is not
|
|
40
64
|
already installed, AtMem clearly announces and downloads its pinned official
|
|
41
65
|
Bun runtime for AtFlows, verifies the archive against a release-pinned SHA-256,
|
|
@@ -64,7 +88,7 @@ package yourself.
|
|
|
64
88
|
Already using AtMem 2.1 with OpenClaw? Upgrade in place:
|
|
65
89
|
|
|
66
90
|
```bash
|
|
67
|
-
python -m pip install --upgrade atmem==2.3.
|
|
91
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
68
92
|
atmem openclaw upgrade
|
|
69
93
|
atmem control verify
|
|
70
94
|
```
|
|
@@ -87,7 +111,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
|
|
|
87
111
|
#### Pydantic AI — native capability
|
|
88
112
|
|
|
89
113
|
```bash
|
|
90
|
-
python -m pip install 'atmem[pydantic-ai]==2.3.
|
|
114
|
+
python -m pip install 'atmem[pydantic-ai]==2.3.8'
|
|
91
115
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
92
116
|
```
|
|
93
117
|
|
|
@@ -112,7 +136,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
|
|
|
112
136
|
#### LangChain/LangGraph — native middleware
|
|
113
137
|
|
|
114
138
|
```bash
|
|
115
|
-
python -m pip install 'atmem[langgraph]==2.3.
|
|
139
|
+
python -m pip install 'atmem[langgraph]==2.3.8'
|
|
116
140
|
atmem control shadow --host generic --memory-db ~/.atmem/memories.db
|
|
117
141
|
```
|
|
118
142
|
|
|
@@ -280,7 +304,7 @@ and restores it exactly.
|
|
|
280
304
|
## Installation details
|
|
281
305
|
|
|
282
306
|
```bash
|
|
283
|
-
python -m pip install atmem==2.3.
|
|
307
|
+
python -m pip install atmem==2.3.8
|
|
284
308
|
atmem --version
|
|
285
309
|
```
|
|
286
310
|
|
|
@@ -290,7 +314,7 @@ embedding model, while the semantic extra adds local sentence-transformer
|
|
|
290
314
|
choices:
|
|
291
315
|
|
|
292
316
|
```bash
|
|
293
|
-
python -m pip install 'atmem[semantic]==2.3.
|
|
317
|
+
python -m pip install 'atmem[semantic]==2.3.8'
|
|
294
318
|
```
|
|
295
319
|
|
|
296
320
|
For repository development, install both workspace packages:
|
|
@@ -399,7 +423,7 @@ evidence, activate AtMem, and return it to shadow.
|
|
|
399
423
|
## Dashboard
|
|
400
424
|
|
|
401
425
|
```bash
|
|
402
|
-
atmem dashboard daemon start # http://127.0.0.1:
|
|
426
|
+
atmem dashboard daemon start # http://127.0.0.1:8768/ on a new install; existing daemon ports are preserved
|
|
403
427
|
atmem dashboard daemon open
|
|
404
428
|
atmem dashboard daemon status
|
|
405
429
|
atmem dashboard daemon restart
|
|
@@ -478,7 +502,7 @@ atmem control restore
|
|
|
478
502
|
Existing 2.1 installations upgrade without starting a new migration:
|
|
479
503
|
|
|
480
504
|
```bash
|
|
481
|
-
python -m pip install --upgrade atmem==2.3.
|
|
505
|
+
python -m pip install --upgrade atmem==2.3.8
|
|
482
506
|
atmem openclaw upgrade
|
|
483
507
|
atmem control verify
|
|
484
508
|
```
|
|
@@ -610,7 +634,7 @@ atmem mcp --db ~/.atmem/memories.db --subject user-1
|
|
|
610
634
|
```
|
|
611
635
|
|
|
612
636
|
MCP tools: `memory_remember`, `memory_observe`, `memory_recall`,
|
|
613
|
-
`memory_recall_decision`,
|
|
637
|
+
`memory_recall_decision`, `memory_form_episode`,
|
|
614
638
|
`memory_get_record`, `memory_get_source`, `memory_recall_block`,
|
|
615
639
|
`memory_persona`, `memory_context_pack`, `memory_capture`, `memory_list`,
|
|
616
640
|
`memory_forget`, `memory_forget_artifact`, `memory_promote`, `memory_audit`,
|
|
@@ -711,10 +735,11 @@ npm test
|
|
|
711
735
|
npm run smoke
|
|
712
736
|
```
|
|
713
737
|
|
|
714
|
-
The
|
|
715
|
-
**2.3.
|
|
716
|
-
retains its independent
|
|
717
|
-
**0.1.2
|
|
738
|
+
The current source candidate is **2.3.8** with matching OpenClaw bridge source
|
|
739
|
+
**2.3.8**. Release validation requires exact Python/bridge alignment; AtBot
|
|
740
|
+
retains its independent compatible version **0.1.0** and the tested AtFlows pin
|
|
741
|
+
is **0.1.4b3**. The published package remains 2.3.7 until the candidate is
|
|
742
|
+
reviewed, tagged and registry-verified.
|
|
718
743
|
|
|
719
744
|
## License
|
|
720
745
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""AtMem Hermes directory plugin; the host needs no AtMem Python dependency."""
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import stat
|
|
6
|
+
|
|
7
|
+
from .client import HermesRPCClient
|
|
8
|
+
from .provider import create_provider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _private_read(path, limit):
|
|
12
|
+
if os.name == "nt":
|
|
13
|
+
raise RuntimeError("native Windows credential ACL qualification is pending; use a qualified WSL installation")
|
|
14
|
+
descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) | os.O_NONBLOCK)
|
|
15
|
+
try:
|
|
16
|
+
info = os.fstat(descriptor)
|
|
17
|
+
if not stat.S_ISREG(info.st_mode) or info.st_uid != os.getuid() or info.st_mode & 0o077:
|
|
18
|
+
raise PermissionError("Hermes connection files must be owner-only regular files")
|
|
19
|
+
value = os.read(descriptor, limit + 1)
|
|
20
|
+
if len(value) > limit:
|
|
21
|
+
raise ValueError("Hermes connection file exceeds its size limit")
|
|
22
|
+
return value.decode("utf-8")
|
|
23
|
+
finally:
|
|
24
|
+
os.close(descriptor)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
SETUP_HINT = ("AtMem local CLI preview: connection is unavailable. "
|
|
28
|
+
"Run atmem hermes status --hermes-home PATH for this profile. "
|
|
29
|
+
"Installation alone does not activate memory; keep the current provider selected.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _unavailable_provider():
|
|
33
|
+
from agent.memory_provider import MemoryProvider
|
|
34
|
+
|
|
35
|
+
class UnconfiguredAtMem(MemoryProvider):
|
|
36
|
+
name = "atmem"
|
|
37
|
+
|
|
38
|
+
def is_available(self):
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
def unavailable_reason(self):
|
|
42
|
+
return SETUP_HINT
|
|
43
|
+
|
|
44
|
+
def initialize(self, session_id, **kwargs):
|
|
45
|
+
raise RuntimeError(SETUP_HINT)
|
|
46
|
+
|
|
47
|
+
def get_tool_schemas(self):
|
|
48
|
+
return []
|
|
49
|
+
|
|
50
|
+
def post_setup(self, hermes_home, config):
|
|
51
|
+
print(SETUP_HINT)
|
|
52
|
+
|
|
53
|
+
def get_status_config(self, config=None):
|
|
54
|
+
return {"available": False, "platform": "local CLI only", "setup": SETUP_HINT}
|
|
55
|
+
|
|
56
|
+
return UnconfiguredAtMem()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _configured_provider():
|
|
60
|
+
home = Path(__file__).resolve().parents[2]
|
|
61
|
+
private = home / ".atmem"
|
|
62
|
+
if private.is_symlink():
|
|
63
|
+
raise PermissionError("Hermes connection directory cannot be a symbolic link")
|
|
64
|
+
info = private.stat()
|
|
65
|
+
if info.st_uid != os.getuid() or info.st_mode & 0o077:
|
|
66
|
+
raise PermissionError("Hermes connection directory must be owner-only")
|
|
67
|
+
config = json.loads(_private_read(private / "connection.json", 16384))
|
|
68
|
+
if not isinstance(config, dict):
|
|
69
|
+
raise ValueError("invalid connection")
|
|
70
|
+
if config.get("format") != "atmem-hermes-connection-v1":
|
|
71
|
+
raise ValueError("unsupported AtMem Hermes connection")
|
|
72
|
+
if Path(config["hermes_home"]).resolve() != home:
|
|
73
|
+
raise PermissionError("AtMem connection belongs to another Hermes profile")
|
|
74
|
+
client = HermesRPCClient(config["endpoint"], _private_read(private / "credential", 256).strip(),
|
|
75
|
+
profile_id=config["profile_id"], user_id=config.get("user_id"), timeout=10.0)
|
|
76
|
+
return create_provider(client, hermes_home=str(home))
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def register(ctx):
|
|
80
|
+
try:
|
|
81
|
+
provider = _configured_provider() if os.name != "nt" else _unavailable_provider()
|
|
82
|
+
except Exception:
|
|
83
|
+
# Discovery must remain possible, but never echo credential/config data.
|
|
84
|
+
provider = _unavailable_provider()
|
|
85
|
+
ctx.register_memory_provider(provider)
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Fresh-recall authorization using the ordinary AtMem control plane.
|
|
2
|
+
|
|
3
|
+
This is the trusted service-side binding, not an HTTP authentication boundary.
|
|
4
|
+
The installer/service supplies identity; model tool arguments cannot change it.
|
|
5
|
+
It deliberately makes no claim about replayed Hermes conversation history.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, replace
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
|
+
import hashlib
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from atmem.adapters.base import AtMemAdapterIdentity
|
|
15
|
+
from atmem.core.canonical import canonical_json
|
|
16
|
+
from atmem.service import APIError, APIPrincipal, AtMemApplication
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
PROFILE = "authorized-at-recall-v1"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _identifier(value: str, name: str) -> str:
|
|
23
|
+
if not isinstance(value, str) or not value.strip() or len(value) > 512:
|
|
24
|
+
raise ValueError(f"{name} must be a nonempty identifier of at most 512 characters")
|
|
25
|
+
if any(ord(char) < 32 for char in value):
|
|
26
|
+
raise ValueError(f"{name} contains a control character")
|
|
27
|
+
return value
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True, slots=True)
|
|
31
|
+
class RecallResult:
|
|
32
|
+
context: str
|
|
33
|
+
reason: str
|
|
34
|
+
candidate_ids: tuple[str, ...] = ()
|
|
35
|
+
exposure_id: str | None = None
|
|
36
|
+
context_receipt_id: str | None = None
|
|
37
|
+
profile: str = PROFILE
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class HermesMemoryBinding:
|
|
41
|
+
"""One immutable administrator-selected identity, checked on each operation.
|
|
42
|
+
|
|
43
|
+
Constructed inactive. Enabling the binding does not activate the control
|
|
44
|
+
plane: both this explicit selection and AtMem's own active policy are needed.
|
|
45
|
+
No query/context cache is retained. Background scheduling belongs to the host
|
|
46
|
+
bridge; these methods return only after the product operation has finished.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, manager: Any, identity: AtMemAdapterIdentity, *,
|
|
50
|
+
profile_id: str, enabled: bool = False, influence: bool | None = None,
|
|
51
|
+
max_context_chars: int = 4096):
|
|
52
|
+
self.manager = manager
|
|
53
|
+
self.identity = replace(identity, framework="hermes")
|
|
54
|
+
self.profile_id = _identifier(profile_id, "profile_id")
|
|
55
|
+
for name in ("agent_id", "workspace_id", "subject_id"):
|
|
56
|
+
_identifier(getattr(identity, name), name)
|
|
57
|
+
if not identity.authenticated_user:
|
|
58
|
+
raise PermissionError("Hermes binding requires an authenticated operator identity")
|
|
59
|
+
if isinstance(max_context_chars, bool) or not isinstance(max_context_chars, int) or not 1 <= max_context_chars <= 4096:
|
|
60
|
+
raise ValueError("max_context_chars must be between 1 and 4096")
|
|
61
|
+
self.enabled = bool(enabled)
|
|
62
|
+
self.influence = self.enabled if influence is None else bool(influence)
|
|
63
|
+
self.max_context_chars = max_context_chars
|
|
64
|
+
self.application = AtMemApplication(manager)
|
|
65
|
+
|
|
66
|
+
def _scope(self) -> None:
|
|
67
|
+
"""Topology, not request content, binds agent/subject/workspace."""
|
|
68
|
+
authority = getattr(self.manager, "authority_topology", None)
|
|
69
|
+
topology = authority() if callable(authority) else self.manager.agent_topology()
|
|
70
|
+
workspaces = topology.get("workspaces", [])
|
|
71
|
+
match = any(
|
|
72
|
+
row.get("workspace_id") == self.identity.workspace_id
|
|
73
|
+
and row.get("subject_id") == self.identity.subject_id
|
|
74
|
+
and self.identity.agent_id in (row.get("agent_ids") or [])
|
|
75
|
+
for row in workspaces
|
|
76
|
+
)
|
|
77
|
+
subject_rows = [row for row in workspaces if row.get("subject_id") == self.identity.subject_id]
|
|
78
|
+
agent_rows = [row for row in workspaces if self.identity.agent_id in (row.get("agent_ids") or [])]
|
|
79
|
+
if not match or len(subject_rows) != 1 or len(agent_rows) != 1:
|
|
80
|
+
raise PermissionError("Hermes binding no longer matches AtMem topology")
|
|
81
|
+
|
|
82
|
+
def _session(self, session_id: str) -> str:
|
|
83
|
+
value = [_identifier(self.profile_id, "profile_id"), _identifier(session_id, "session_id")]
|
|
84
|
+
return "hermes_" + hashlib.sha256(canonical_json(value).encode()).hexdigest()
|
|
85
|
+
|
|
86
|
+
def _run_id(self, session_id: str, turn_id: str) -> str:
|
|
87
|
+
session = self._session(session_id)
|
|
88
|
+
turn = _identifier(str(turn_id), "turn_id")
|
|
89
|
+
return "hermes_run_" + hashlib.sha256(
|
|
90
|
+
canonical_json([self.profile_id, session, turn]).encode()
|
|
91
|
+
).hexdigest()
|
|
92
|
+
|
|
93
|
+
def record_event(self, event_type: str, *, session_id: str, turn_id: str,
|
|
94
|
+
payload: dict[str, Any], context_event_id: str | None = None,
|
|
95
|
+
context_receipt_id: str | None = None,
|
|
96
|
+
retrieval_id: str | None = None,
|
|
97
|
+
event_time: str | None = None) -> dict[str, Any] | None:
|
|
98
|
+
"""Project a local Hermes turn into AtMem's ordinary session evidence."""
|
|
99
|
+
recorder = getattr(self.manager, "record_blackbox_event", None)
|
|
100
|
+
if not callable(recorder):
|
|
101
|
+
return None
|
|
102
|
+
session = self._session(session_id)
|
|
103
|
+
turn = _identifier(str(turn_id), "turn_id")
|
|
104
|
+
run_id = self._run_id(session_id, turn)
|
|
105
|
+
order = {
|
|
106
|
+
"turn.input": 1,
|
|
107
|
+
"context.disposition": 2,
|
|
108
|
+
"model.input": 3,
|
|
109
|
+
"model.output": 4,
|
|
110
|
+
"turn.ended": 5,
|
|
111
|
+
}
|
|
112
|
+
sequence = order.get(event_type)
|
|
113
|
+
if sequence is None:
|
|
114
|
+
raise ValueError("unsupported Hermes lifecycle event")
|
|
115
|
+
stable_event_id = "hermes_event_" + hashlib.sha256(
|
|
116
|
+
canonical_json([self.profile_id, session, turn, event_type]).encode()
|
|
117
|
+
).hexdigest()
|
|
118
|
+
observed_at = event_time or datetime.now(timezone.utc).isoformat(
|
|
119
|
+
timespec="milliseconds"
|
|
120
|
+
).replace("+00:00", "Z")
|
|
121
|
+
return recorder(
|
|
122
|
+
event_type=event_type, run_id=run_id, session_id=session,
|
|
123
|
+
turn_id=turn, agent_id=self.identity.agent_id,
|
|
124
|
+
workspace_id=self.identity.workspace_id,
|
|
125
|
+
subject_id=self.identity.subject_id,
|
|
126
|
+
context_event_id=context_event_id,
|
|
127
|
+
context_receipt_id=context_receipt_id,
|
|
128
|
+
retrieval_id=retrieval_id,
|
|
129
|
+
event_id=stable_event_id,
|
|
130
|
+
producer_instance_id=f"hermes:{self.profile_id}",
|
|
131
|
+
producer_epoch=run_id,
|
|
132
|
+
producer_sequence=sequence,
|
|
133
|
+
event_time=observed_at,
|
|
134
|
+
payload={key: value for key, value in payload.items() if value is not None},
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def recall(self, query: str, *, session_id: str, turn_id: str) -> RecallResult:
|
|
138
|
+
if not self.enabled:
|
|
139
|
+
return RecallResult("", "inactive")
|
|
140
|
+
if not self.influence:
|
|
141
|
+
return RecallResult("", "withheld")
|
|
142
|
+
if not isinstance(query, str) or not query.strip() or len(query) > 65536:
|
|
143
|
+
return RecallResult("", "invalid_query")
|
|
144
|
+
try:
|
|
145
|
+
self._scope()
|
|
146
|
+
session = self._session(session_id)
|
|
147
|
+
turn = _identifier(turn_id, "turn_id")
|
|
148
|
+
run_id = self._run_id(session_id, turn)
|
|
149
|
+
prepared = self.manager.prepare(
|
|
150
|
+
query, allow_delegation=False, session_id=session,
|
|
151
|
+
host_run_id=run_id, turn_id=turn,
|
|
152
|
+
workspace_id=self.identity.workspace_id,
|
|
153
|
+
subject_id=self.identity.subject_id, agent_id=self.identity.agent_id,
|
|
154
|
+
max_chars=self.max_context_chars,
|
|
155
|
+
deterministic=True,
|
|
156
|
+
)
|
|
157
|
+
if not prepared.get("inject"):
|
|
158
|
+
# Shadow previews must never be returned as active context.
|
|
159
|
+
return RecallResult("", "withheld")
|
|
160
|
+
context = prepared.get("context")
|
|
161
|
+
if not isinstance(context, str) or not context:
|
|
162
|
+
return RecallResult("", "no_context")
|
|
163
|
+
if len(context) > self.max_context_chars:
|
|
164
|
+
return RecallResult("", "context_limit")
|
|
165
|
+
# Only fresh canonical preparation can supply bytes. Do not fall
|
|
166
|
+
# back to a previous successful recall if this operation fails.
|
|
167
|
+
return RecallResult(
|
|
168
|
+
context, "authorized",
|
|
169
|
+
tuple(str(value) for value in prepared.get("candidate_ids", [])),
|
|
170
|
+
prepared.get("exposure_id"), prepared.get("context_receipt_id"),
|
|
171
|
+
)
|
|
172
|
+
except (OSError, RuntimeError, ValueError, TypeError, PermissionError):
|
|
173
|
+
# Never disclose exception details (paths/queries/provider secrets)
|
|
174
|
+
# in a model-facing result. No successful-delivery receipt is made.
|
|
175
|
+
return RecallResult("", "unavailable_or_denied")
|
|
176
|
+
|
|
177
|
+
def observe_user(self, text: str, *, session_id: str, observation_id: str) -> dict[str, Any]:
|
|
178
|
+
"""Persist an authenticated user's source via ordinary governed capture.
|
|
179
|
+
|
|
180
|
+
Assistant summaries and tool output are not authenticated user messages;
|
|
181
|
+
the host bridge must not feed them to this method as such.
|
|
182
|
+
"""
|
|
183
|
+
if not self.enabled:
|
|
184
|
+
return {"captured": False, "reason": "inactive"}
|
|
185
|
+
self._scope()
|
|
186
|
+
if not isinstance(text, str) or not text.strip() or len(text) > 65536:
|
|
187
|
+
raise ValueError("user text must contain 1–65536 characters")
|
|
188
|
+
session = self._session(session_id)
|
|
189
|
+
observation = _identifier(observation_id, "observation_id")
|
|
190
|
+
key = hashlib.sha256(canonical_json([session, observation]).encode()).hexdigest()
|
|
191
|
+
principal = APIPrincipal(
|
|
192
|
+
principal_id=self.profile_id, role="agent",
|
|
193
|
+
subject_id=str(self.identity.subject_id), agent_id=self.identity.agent_id,
|
|
194
|
+
workspace_id=self.identity.workspace_id,
|
|
195
|
+
)
|
|
196
|
+
try:
|
|
197
|
+
return self.application.create_memory(
|
|
198
|
+
principal, text, idempotency_key=key, session_id=session,
|
|
199
|
+
)
|
|
200
|
+
except APIError:
|
|
201
|
+
raise
|
|
202
|
+
except Exception:
|
|
203
|
+
raise APIError("observation_uncertain", "inspect the observation receipt before retrying", status=409) from None
|
|
204
|
+
|
|
205
|
+
def status(self) -> dict[str, Any]:
|
|
206
|
+
return {
|
|
207
|
+
"profile": PROFILE, "enabled": self.enabled,
|
|
208
|
+
"mode": "active" if self.enabled and self.influence else
|
|
209
|
+
"shadow" if self.enabled else "inactive",
|
|
210
|
+
"profile_id": self.profile_id, "agent_id": self.identity.agent_id,
|
|
211
|
+
"workspace_id": self.identity.workspace_id,
|
|
212
|
+
"capture_coverage": "memory_operations_only",
|
|
213
|
+
"per_model_call_revalidation": False,
|
|
214
|
+
"previous_context_retraction": False,
|
|
215
|
+
}
|