AbstractRuntime 0.4.18__tar.gz → 0.4.20__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/CHANGELOG.md +30 -1
  2. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/PKG-INFO +5 -5
  3. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/README.md +4 -4
  4. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/api.md +3 -1
  5. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/architecture.md +1 -1
  6. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/README.md +11 -2
  7. abstractruntime-0.4.20/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +184 -0
  8. abstractruntime-0.4.20/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +85 -0
  9. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/DEPRECATED_README.md +3 -0
  10. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/faq.md +27 -0
  11. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/integrations/abstractcore.md +46 -1
  12. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/tools-comms.md +1 -1
  13. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/llms-full.txt +3 -2
  14. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/llms.txt +4 -4
  15. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/pyproject.toml +1 -1
  16. abstractruntime-0.4.20/release-notes.md +13 -0
  17. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/__init__.py +12 -1
  18. abstractruntime-0.4.20/src/abstractruntime/integrations/abstractcore/comms_facade.py +127 -0
  19. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/factory.py +8 -0
  20. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/host_facade.py +95 -6
  21. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/llm_client.py +624 -7
  22. abstractruntime-0.4.20/tests/test_abstractcore_comms_facade.py +179 -0
  23. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_abstractcore_host_facade.py +156 -3
  24. abstractruntime-0.4.20/tests/test_prompt_cache_export_import.py +342 -0
  25. abstractruntime-0.4.18/docs/backlog/proposed/2026-05-20_agent_runtime_convenience_constructor.md +0 -37
  26. abstractruntime-0.4.18/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +0 -192
  27. abstractruntime-0.4.18/release-notes.md +0 -14
  28. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/.github/workflows/ci.yml +0 -0
  29. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/.github/workflows/release.yml +0 -0
  30. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/.gitignore +0 -0
  31. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/ACKNOWLEDGMENTS.md +0 -0
  32. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/CONTRIBUTING.md +0 -0
  33. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/LICENSE +0 -0
  34. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/ROADMAP.md +0 -0
  35. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/SECURITY.md +0 -0
  36. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/README.md +0 -0
  37. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  38. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  39. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  40. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  41. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  42. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  43. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/adr/README.md +0 -0
  44. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  45. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  46. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  47. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  48. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/003_wait_primitives.md +0 -0
  49. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  50. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  51. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  52. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  53. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/009_artifact_store.md +0 -0
  54. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  55. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  56. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  57. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  58. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  59. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  60. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  61. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  62. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  63. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  64. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  65. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  66. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  67. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  68. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  69. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  70. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  71. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  72. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  73. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  74. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  75. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  76. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/004_tests.md +0 -0
  77. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  78. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  79. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  80. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/README.md +0 -0
  81. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  82. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  83. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  84. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  85. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  86. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  87. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  88. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/evidence.md +0 -0
  89. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/getting-started.md +0 -0
  90. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/limits.md +0 -0
  91. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/manual_testing.md +0 -0
  92. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/mcp-worker.md +0 -0
  93. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/proposal.md +0 -0
  94. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/provenance.md +0 -0
  95. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/snapshots.md +0 -0
  96. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/docs/workflow-bundles.md +0 -0
  97. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/emails.config.example.yaml +0 -0
  98. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/01_hello_world.py +0 -0
  99. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/02_ask_user.py +0 -0
  100. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/03_wait_until.py +0 -0
  101. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/04_multi_step.py +0 -0
  102. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/05_persistence.py +0 -0
  103. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/06_llm_integration.py +0 -0
  104. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/07_react_agent.py +0 -0
  105. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/examples/README.md +0 -0
  106. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/mkdocs.yml +0 -0
  107. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/pytest.ini +0 -0
  108. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/__init__.py +0 -0
  109. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/__init__.py +0 -0
  110. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/config.py +0 -0
  111. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/event_keys.py +0 -0
  112. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/models.py +0 -0
  113. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/policy.py +0 -0
  114. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/runtime.py +0 -0
  115. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/spec.py +0 -0
  116. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/core/vars.py +0 -0
  117. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/evidence/__init__.py +0 -0
  118. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/evidence/recorder.py +0 -0
  119. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/history_bundle.py +0 -0
  120. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/identity/__init__.py +0 -0
  121. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/identity/fingerprint.py +0 -0
  122. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/__init__.py +0 -0
  123. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  124. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  125. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  126. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  127. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  128. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  129. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  130. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  131. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  132. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  133. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  134. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  135. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  136. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  137. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  138. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  139. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  140. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  141. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  142. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/__init__.py +0 -0
  143. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/active_context.py +0 -0
  144. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/active_memory.py +0 -0
  145. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/compaction.py +0 -0
  146. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/kg_packets.py +0 -0
  147. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/memact_composer.py +0 -0
  148. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/recall_levels.py +0 -0
  149. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/memory/token_budget.py +0 -0
  150. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/rendering/__init__.py +0 -0
  151. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  152. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/rendering/json_stringify.py +0 -0
  153. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/__init__.py +0 -0
  154. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/convenience.py +0 -0
  155. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/registry.py +0 -0
  156. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/scheduler.py +0 -0
  157. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/__init__.py +0 -0
  158. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/artifacts.py +0 -0
  159. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/base.py +0 -0
  160. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/commands.py +0 -0
  161. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/in_memory.py +0 -0
  162. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/json_files.py +0 -0
  163. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/ledger_chain.py +0 -0
  164. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/observable.py +0 -0
  165. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/offloading.py +0 -0
  166. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/snapshots.py +0 -0
  167. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/storage/sqlite.py +0 -0
  168. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  169. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  170. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  171. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  172. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  173. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  174. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  175. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  176. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  177. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  178. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  179. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  180. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  181. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  182. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  183. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  184. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  185. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  186. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  187. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  188. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  189. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/models.py +0 -0
  190. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  191. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  192. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  193. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/README.md +0 -0
  194. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/conftest.py +0 -0
  195. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_abstractcore_discovery_facade.py +0 -0
  196. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_abstractcore_run_facade.py +0 -0
  197. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_abstractcore_telegram_facade.py +0 -0
  198. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_active_context_policy.py +0 -0
  199. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_active_memory.py +0 -0
  200. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_answer_user_effect.py +0 -0
  201. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_artifacts.py +0 -0
  202. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_chat_summarizer_integration.py +0 -0
  203. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_command_store.py +0 -0
  204. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_compaction_helpers.py +0 -0
  205. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_control_adapter_while.py +0 -0
  206. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_default_tools_comms_gating.py +0 -0
  207. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_default_tools_include_skim_files.py +0 -0
  208. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_default_tools_include_skim_folders.py +0 -0
  209. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_default_tools_search_files_executor.py +0 -0
  210. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_durable_toolsets.py +0 -0
  211. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  212. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_emit_event_without_workflow_registry.py +0 -0
  213. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_evidence_recorder.py +0 -0
  214. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  215. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_integration_abstractcore.py +0 -0
  216. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_integrations_abstractcore.py +0 -0
  217. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_json_file_run_store_children_index.py +0 -0
  218. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_jsonl_ledger_recovery.py +0 -0
  219. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_kg_learn_and_recall_contract.py +0 -0
  220. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_ledger_chain.py +0 -0
  221. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_ledger_subscription.py +0 -0
  222. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_media_artifact_refs.py +0 -0
  223. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  224. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  225. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_requires_prompt.py +0 -0
  226. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_response_schema_normalization.py +0 -0
  227. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_structured_output_fallback.py +0 -0
  228. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  229. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  230. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  231. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_client_media_artifacts.py +0 -0
  232. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_client_system_context.py +0 -0
  233. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_llm_client_tool_call_parsing.py +0 -0
  234. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  235. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_mcp_remote_tool_executor.py +0 -0
  236. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_mcp_worker_logging.py +0 -0
  237. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_mcp_worker_security.py +0 -0
  238. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_mcp_worker_stdio.py +0 -0
  239. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_media_artifact_resolution.py +0 -0
  240. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memact_composer_from_kg_result.py +0 -0
  241. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  242. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_packets.py +0 -0
  243. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  244. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  245. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  246. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  247. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_note_effect.py +0 -0
  248. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_query_effect.py +0 -0
  249. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_query_rich_filters.py +0 -0
  250. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  251. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_memory_tag_effect.py +0 -0
  252. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_mlx_generation_serialization.py +0 -0
  253. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_model_residency_control_plane.py +0 -0
  254. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_multimodal_abstractcore_integration.py +0 -0
  255. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_offloading.py +0 -0
  256. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_packaging_extras.py +0 -0
  257. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_pause_resume.py +0 -0
  258. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_prompt_cache_modules.py +0 -0
  259. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_queryable_run_store.py +0 -0
  260. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  261. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_real_integration.py +0 -0
  262. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_recall_levels_policy.py +0 -0
  263. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_remote_llm_client.py +0 -0
  264. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_rendering_agent_trace_report.py +0 -0
  265. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_rendering_json_stringify.py +0 -0
  266. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_retry_idempotency.py +0 -0
  267. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_run_history_bundle.py +0 -0
  268. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  269. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_runtime_install_boundary.py +0 -0
  270. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  271. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_runtime_node_traces.py +0 -0
  272. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  273. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_scheduler.py +0 -0
  274. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  275. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_snapshots.py +0 -0
  276. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_sqlite_ledger_store.py +0 -0
  277. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_start_subworkflow_async_wait.py +0 -0
  278. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  279. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  280. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_structured_output_schema_enum.py +0 -0
  281. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_subworkflow.py +0 -0
  282. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_terminal_effect_completion.py +0 -0
  283. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  284. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  285. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_approval_executor.py +0 -0
  286. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_approval_resume_executes.py +0 -0
  287. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_calls_idempotency_keys.py +0 -0
  288. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_argument_sanitization.py +0 -0
  289. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_error_output_detection.py +0 -0
  290. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_filename_alias.py +0 -0
  291. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  292. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_read_file_aliases.py +0 -0
  293. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_executor_timeout.py +0 -0
  294. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_tool_wait_allowlist_safety.py +0 -0
  295. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_trace_context_propagation.py +0 -0
  296. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_vars_query_effect.py +0 -0
  297. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  298. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  299. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  300. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  301. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  302. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  303. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_memact_compose_node.py +0 -0
  304. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  305. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  306. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  307. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_add_message_builtin.py +0 -0
  308. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  309. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_call_tool_node.py +0 -0
  310. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_compiler_basic.py +0 -0
  311. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  312. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_get_element_node.py +0 -0
  313. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_get_random_element_node.py +0 -0
  314. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_has_tools_builtin.py +0 -0
  315. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  316. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  317. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_make_object_node.py +0 -0
  318. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_media_nodes.py +0 -0
  319. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  320. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_memory_source_pins.py +0 -0
  321. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_prompt_only.py +0 -0
  322. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_random_nodes.py +0 -0
  323. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_string_contains_replace.py +0 -0
  324. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_visualflow_tool_parameters_node.py +0 -0
  325. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_wait_event_prompt_metadata.py +0 -0
  326. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_workflow_bundle_registry.py +0 -0
  327. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  328. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  329. {abstractruntime-0.4.18 → abstractruntime-0.4.20}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.20] - 2026-05-21
11
+
12
+ ### Added
13
+ - Runtime now exposes a public host-local prompt-cache export/import admin surface on `get_abstractcore_host_facade(...)`:
14
+ - `list_prompt_cache_exports(...)`
15
+ - `prompt_cache_export(...)`
16
+ - `prompt_cache_import(...)`
17
+
18
+ ### Changed
19
+ - Local Runtime now owns the prompt-cache export root/catalog policy:
20
+ - `~/.abstractruntime/prompt_cache_exports` by default
21
+ - `<base_dir>/prompt_cache_exports` for `create_local_file_runtime(...)`
22
+ - exact provider/model partitioning with Runtime-managed metadata sidecars
23
+ - Remote and hybrid runtimes now fail honestly for prompt-cache export/import admin with a structured local-only response instead of implying server-side support.
24
+ - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document the secondary host-local export/import contract distinctly from the primary durable bloc/binding prompt-cache path.
25
+
26
+ ## [0.4.19] - 2026-05-21
27
+
28
+ ### Added
29
+ - Runtime now ships the missed standalone email comms wrapper/export layer for host-local operator surfaces:
30
+ - `abstractruntime.integrations.abstractcore.comms_facade`
31
+ - package-level email helper exports from `abstractruntime.integrations.abstractcore`
32
+
33
+ ### Changed
34
+ - Host-facade email helpers now delegate through Runtime's own comms facade instead of importing `abstractcore.tools.comms_tools` directly in the facade method body.
35
+ - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now describe the standalone email comms facade/export layer alongside the existing host facade, Telegram wrappers, and durable run-owned comms sends.
36
+
10
37
  ## [0.4.18] - 2026-05-21
11
38
 
12
39
  ### Added
@@ -478,7 +505,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
478
505
 
479
506
  Initial development version with basic proof-of-concept features.
480
507
 
481
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...HEAD
508
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...HEAD
509
+ [0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
510
+ [0.4.19]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...v0.4.19
482
511
  [0.4.18]: https://github.com/lpalbou/abstractruntime/compare/v0.4.17...v0.4.18
483
512
  [0.4.17]: https://github.com/lpalbou/abstractruntime/compare/v0.4.16...v0.4.17
484
513
  [0.4.16]: https://github.com/lpalbou/abstractruntime/compare/v0.4.15...v0.4.16
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.18
3
+ Version: 0.4.20
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -81,7 +81,7 @@ Description-Content-Type: text/markdown
81
81
 
82
82
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
83
83
 
84
- **Version:** 0.4.18 • **Python:** 3.10+
84
+ **Version:** 0.4.20 • **Python:** 3.10+
85
85
 
86
86
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
87
87
 
@@ -169,7 +169,7 @@ state = rt.resume(
169
169
  assert state.status.value == "completed"
170
170
  ```
171
171
 
172
- ## What’s included (v0.4.18)
172
+ ## What’s included (v0.4.20)
173
173
 
174
174
  Kernel (dependency-light):
175
175
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -193,8 +193,8 @@ Drivers + distribution:
193
193
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
194
194
 
195
195
  Optional integrations:
196
- - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
197
- - For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers remain host-local and nondurable.
196
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
197
+ - For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
198
198
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
199
199
  depends on the light AbstractMemory contract; hosts choose storage backends
200
200
  such as LanceDB, SQLite, or in-memory stores.
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.4.18 • **Python:** 3.10+
7
+ **Version:** 0.4.20 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -92,7 +92,7 @@ state = rt.resume(
92
92
  assert state.status.value == "completed"
93
93
  ```
94
94
 
95
- ## What’s included (v0.4.18)
95
+ ## What’s included (v0.4.20)
96
96
 
97
97
  Kernel (dependency-light):
98
98
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -116,8 +116,8 @@ Drivers + distribution:
116
116
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
117
117
 
118
118
  Optional integrations:
119
- - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
120
- - For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers remain host-local and nondurable.
119
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
120
+ - For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
121
121
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
122
122
  depends on the light AbstractMemory contract; hosts choose storage backends
123
123
  such as LanceDB, SQLite, or in-memory stores.
@@ -184,13 +184,15 @@ Entry points:
184
184
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
185
185
  - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
186
186
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
187
+ - public email comms wrappers: `list_email_accounts(...)`, `list_emails(...)`, `read_email(...)`, `send_email(...)` (`src/abstractruntime/integrations/abstractcore/comms_facade.py`)
187
188
  - public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
188
189
  - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
189
190
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
190
191
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
191
192
  - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`)
192
193
  - host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
193
- - host-facade email helpers remain host-local wrappers over AbstractCore's public comms helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
194
+ - host-local prompt-cache export/import admin also lives on the host facade and client delegation layer (`list_prompt_cache_exports`, `prompt_cache_export`, `prompt_cache_import`) and is intentionally local-only
195
+ - host-facade email helpers delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
194
196
  - run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
195
197
 
196
198
  `LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-05-21
4
- > Version: 0.4.18
4
+ > Version: 0.4.20
5
5
  > Scope: this describes **what is implemented in this repository**.
6
6
 
7
7
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -10,6 +10,14 @@ This folder contains a structured backlog used during development. Items are gro
10
10
 
11
11
  If you are new to the project, start with `../README.md` and `../architecture.md` instead.
12
12
 
13
+ ## Counts
14
+
15
+ - Planned: 5
16
+ - Proposed: 1
17
+ - Completed: 26
18
+ - Deprecated: 13
19
+ - Recurrent: 0
20
+
13
21
  ## Next recommended work
14
22
 
15
23
  1. `planned/018_workspace_access_policy_for_media_and_tools.md`
@@ -52,6 +60,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
52
60
  | 029 | `completed/029_runtime_music_generation_and_discovery_via_abstractcore.md` |
53
61
  | 0030 | `completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md` |
54
62
  | 0032 | `completed/0032_runtime_durable_outbound_comms_truth.md` |
63
+ | 0033 | `completed/0033_runtime_host_local_prompt_cache_export_import_surface.md` |
55
64
 
56
65
  ## Planned
57
66
 
@@ -67,10 +76,10 @@ If you are new to the project, start with `../README.md` and `../architecture.md
67
76
 
68
77
  | ID | Item |
69
78
  |----|------|
70
- | 2026-05-20 | `proposed/2026-05-20_agent_runtime_convenience_constructor.md` |
71
- | 2026-05-20 | `proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md` |
72
79
  | 0031 | `proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md` |
73
80
 
74
81
  ## Deprecated
75
82
 
76
83
  See `deprecated/DEPRECATED_README.md` for context on the deprecated backlog set.
84
+ Recent deprecation:
85
+ - `deprecated/0034_agent_runtime_convenience_constructor.md`
@@ -0,0 +1,184 @@
1
+ # 0033 Runtime Host-Local Prompt-Cache Export/Import Surface
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-20
5
+ - Status: Completed
6
+ - Completed: 2026-05-21
7
+ - Origin: implemented from repository backlog and user request
8
+
9
+ ## Goal
10
+
11
+ Remove the remaining Gateway prompt-cache export/import bypass by giving Runtime
12
+ a public host-facing surface for:
13
+
14
+ - listing host-local prompt-cache exports
15
+ - exporting one live local provider cache to disk
16
+ - importing one previously exported local provider cache
17
+
18
+ without confusing that admin workflow with Runtime's durable bloc/binding
19
+ memory model.
20
+
21
+ ## What Shipped
22
+
23
+ - Extended `AbstractCoreHostFacade` with:
24
+ - `list_prompt_cache_exports(...)`
25
+ - `prompt_cache_export(...)`
26
+ - `prompt_cache_import(...)`
27
+ - Implemented the local behavior in Runtime's AbstractCore clients on top of
28
+ Core's existing **public** provider hooks:
29
+ - `prompt_cache_save(...)`
30
+ - `prompt_cache_load(...)`
31
+ - `prompt_cache_artifact_extension()`
32
+ - `prompt_cache_artifact_format()`
33
+ - prompt-cache capability flags
34
+ - Kept the surface honest:
35
+ - **local-only** for local/file runtimes
36
+ - remote and hybrid return structured `prompt_cache_local_only` payloads and
37
+ do not issue HTTP requests
38
+ - Added a Runtime-owned export root policy:
39
+ - default local root: `~/.abstractruntime/prompt_cache_exports`
40
+ - default file-runtime root: `<base_dir>/prompt_cache_exports`
41
+ - explicit `prompt_cache_export_root_dir=...` overrides are supported
42
+ - Added Runtime-owned listing/catalog metadata so hosts no longer need a
43
+ Gateway-local `saved/` directory convention
44
+ - Kept per-provider/model separation exact by partitioning export directories
45
+ with reversible encoded provider/model ids instead of lossy slugs
46
+ - Preserved the broader prompt-cache boundary:
47
+ - durable app-facing exact reuse is still `bloc + KV artifact + prompt_cache_binding`
48
+ - host-local export/import remains secondary operator/admin tooling around
49
+ live local provider cache state
50
+
51
+ ## Current Code Pointers
52
+
53
+ - `src/abstractruntime/integrations/abstractcore/host_facade.py`
54
+ - `src/abstractruntime/integrations/abstractcore/llm_client.py`
55
+ - `src/abstractruntime/integrations/abstractcore/factory.py`
56
+ - `tests/test_prompt_cache_export_import.py`
57
+ - `tests/test_abstractcore_host_facade.py`
58
+ - `tests/test_remote_llm_client.py`
59
+ - `docs/integrations/abstractcore.md`
60
+ - `docs/api.md`
61
+ - `docs/faq.md`
62
+ - `README.md`
63
+
64
+ Related accepted prompt-cache policy still lives in:
65
+ - `docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md`
66
+
67
+ No new ADR was added. This item extends the existing host-surface boundary
68
+ without changing the durable app contract.
69
+
70
+ ## Validation
71
+
72
+ Focused validation run on 2026-05-21:
73
+
74
+ - `pytest -q tests/test_prompt_cache_export_import.py tests/test_abstractcore_host_facade.py tests/test_remote_llm_client.py`
75
+ - Result: `29 passed in 0.24s`
76
+
77
+ Broader regression and packaging-adjacent sanity:
78
+
79
+ - `pytest -q tests/test_prompt_cache_export_import.py tests/test_abstractcore_host_facade.py tests/test_remote_llm_client.py tests/test_prompt_cache_modules.py tests/test_packaging_extras.py`
80
+ - Result: `48 passed in 0.21s`
81
+
82
+ Syntax/import sanity:
83
+
84
+ - `python -m compileall src/abstractruntime/integrations/abstractcore`
85
+ - Result: clean
86
+
87
+ Documentation build sanity:
88
+
89
+ - `mkdocs build -q --site-dir /tmp/abstractruntime-0033-docs`
90
+ - Result: build passed; upstream Material for MkDocs emitted its current
91
+ non-blocking MkDocs 2.0 warning
92
+
93
+ Practical proof covered by the shipped tests:
94
+
95
+ - local/multi-local Runtime can export, list, and import prompt-cache
96
+ artifacts through Runtime's public host facade and local client path
97
+ - the same logical export name can coexist for distinct provider/model ids
98
+ without directory collisions
99
+ - local listing no longer requires loading the target provider/model client to
100
+ exist on disk
101
+ - remote Runtime returns `prompt_cache_local_only` for list/export/import and
102
+ does not emit HTTP traffic
103
+ - `create_local_file_runtime(...)` now wires the default export root to
104
+ `<base_dir>/prompt_cache_exports`
105
+
106
+ ## Completion Report
107
+
108
+ ### Date
109
+
110
+ 2026-05-21
111
+
112
+ ### Summary
113
+
114
+ Runtime now owns the last prompt-cache admin surface that Gateway was still
115
+ handling through private provider/runtime internals.
116
+
117
+ Hosts can keep manual provider-native export/import when they genuinely need
118
+ it, but the contract is now:
119
+
120
+ - public Runtime boundary
121
+ - Core public hooks underneath
122
+ - local-only filesystem semantics made explicit
123
+ - clean separation from durable bloc/binding workflow memory
124
+
125
+ ### Behavior Changes
126
+
127
+ - `get_abstractcore_host_facade(runtime)` now exposes:
128
+ - `list_prompt_cache_exports(...)`
129
+ - `prompt_cache_export(...)`
130
+ - `prompt_cache_import(...)`
131
+ - Local/file runtimes store host-local prompt-cache exports under a Runtime
132
+ root rather than letting Gateway or another host invent its own unmanaged
133
+ directory contract.
134
+ - Listing is now Runtime-owned and returns catalog metadata for one
135
+ provider/model partition.
136
+ - `prompt_cache_import(clear_existing=True)` now validates the artifact before
137
+ clearing live cache state, then performs the clear/load sequence so a corrupt
138
+ file does not wipe the old cache first.
139
+ - When the caller omits `key` on import, Runtime now surfaces the effective
140
+ loaded key returned by the provider instead of dropping it.
141
+
142
+ ### Contract Notes
143
+
144
+ - This is intentionally a **host-local admin** contract. It is not a durable
145
+ workflow effect and it is not replayed like `LLM_CALL`.
146
+ - Runtime currently returns `root_dir`, `artifact_path`, and `meta_path` in the
147
+ public payload because this is a host/operator surface and Gateway still
148
+ needs a real listing/catalog replacement. That path exposure is intentional
149
+ for this local admin surface, not the general durable app contract.
150
+ - Remote/hybrid runtimes do not proxy or fake host-local export roots. They
151
+ fail honestly with `prompt_cache_local_only`.
152
+
153
+ ### Tests
154
+
155
+ - `tests/test_prompt_cache_export_import.py`
156
+ - `tests/test_abstractcore_host_facade.py`
157
+ - regression support in:
158
+ - `tests/test_remote_llm_client.py`
159
+
160
+ ### Docs
161
+
162
+ - `README.md`
163
+ - `docs/integrations/abstractcore.md`
164
+ - `docs/api.md`
165
+ - `docs/faq.md`
166
+ - `llms.txt`
167
+ - `llms-full.txt`
168
+
169
+ ### Residual Risks
170
+
171
+ - This is still a secondary operator feature. The primary prompt-cache story
172
+ for durable apps remains bloc/KV artifacts plus `prompt_cache_binding`.
173
+ - Import/export support still depends on the local AbstractCore backend family
174
+ and the public `supports_save` / `supports_load` capability flags.
175
+ - Gateway adoption is still separate work in the sibling package before
176
+ `/prompt_cache/saved|save|load` is fully cleaned up end-to-end.
177
+
178
+ ### Follow-Ups
179
+
180
+ - Gateway should adopt these Runtime host-facade methods and remove its
181
+ remaining private `/prompt_cache/saved|save|load` implementation.
182
+ - Keep AbstractCore item `0797` only as optional follow-up memory. Promote it
183
+ only if Runtime/Gateway later prove they need a narrower cross-provider
184
+ metadata/compatibility contract than the current public hooks provide.
@@ -0,0 +1,85 @@
1
+ # Deprecated: Agent Runtime Convenience Constructor
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-20
5
+ - Status: Deprecated
6
+ - Completed: N/A
7
+ - Deprecated: 2026-05-21
8
+
9
+ ## Context
10
+
11
+ The old `015_agent_integration_improvements` item no longer fits as planned runtime work.
12
+
13
+ Most of the important integration correctness work is already done:
14
+
15
+ - agent tool execution can go through durable `TOOL_CALLS`
16
+ - runtime tool execution is host-configured through `ToolExecutor`
17
+ - agent state persistence is not blocked on runtime internals
18
+
19
+ The main remaining idea is much smaller: a convenience constructor such as
20
+ `create_agent_runtime(...)` that would wrap `create_local_runtime(...)` plus
21
+ `MappingToolExecutor.from_tools(...)` for simple local setups.
22
+
23
+ ## Current code reality
24
+
25
+ - `src/abstractruntime/integrations/abstractcore/factory.py`
26
+ - already exposes the generic Runtime constructor layer:
27
+ - `create_local_runtime(...)`
28
+ - `create_remote_runtime(...)`
29
+ - `create_hybrid_runtime(...)`
30
+ - `../abstractagent/src/abstractagent/agents/react.py`
31
+ - already wraps `create_local_runtime(...)` +
32
+ `MappingToolExecutor.from_tools(...)`
33
+ - `../abstractagent/src/abstractagent/agents/codeact.py`
34
+ - does the same for CodeAct
35
+ - `../abstractagent/src/abstractagent/agents/memact.py`
36
+ - does the same for MemAct
37
+ - `../abstractflow/abstractflow/visual/executor.py`
38
+ - assembles its own Runtime/tool wiring with different host-specific policy
39
+
40
+ The duplication exists, but it is concentrated in higher-level packages that
41
+ already own agent or host semantics.
42
+
43
+ ## Why it is not planned now
44
+
45
+ - It is an ergonomics improvement, not a runtime correctness gap.
46
+ - The API shape depends on cross-repo expectations from `abstractagent`.
47
+ - This repo should stay careful about adding convenience APIs that quietly pull in higher-level agent assumptions.
48
+
49
+ ## Possible future direction
50
+
51
+ - keep the helper explicitly local-only
52
+ - accept direct tool functions and build the `MappingToolExecutor`
53
+ - avoid storing callables in durable run state
54
+ - document clearly that advanced approval/passthrough/delegated tool setups should still use the lower-level factories directly
55
+
56
+ ## Guidance
57
+
58
+ Re-promote this only if maintainers still want a tiny convenience API after the higher-priority runtime boundary work lands.
59
+
60
+ ## Deprecation report
61
+
62
+ Deprecated: 2026-05-21
63
+
64
+ Reason:
65
+
66
+ - Runtime already has the correct generic constructor layer.
67
+ - The exact convenience pattern is agent-shaped rather than runtime-shaped.
68
+ - The real duplication is currently in `abstractagent`, not across Runtime
69
+ consumers generally.
70
+
71
+ What replaced it:
72
+
73
+ - Nothing new in Runtime. Higher-level packages should keep owning their own
74
+ factories or factor a shared helper in their own package.
75
+
76
+ Why it should not be built here:
77
+
78
+ - A public `create_agent_runtime(...)` would encode agent-level assumptions into
79
+ the lower-level Runtime package.
80
+ - Sibling packages do not share one uniform shape anyway: some use
81
+ approval/passthrough executors or other host policy that a tiny Runtime
82
+ convenience wrapper would not capture cleanly.
83
+
84
+ If this idea returns later, it should start in `abstractagent` as a package-
85
+ owned helper rather than a new public Runtime API.
@@ -28,6 +28,9 @@ These were temporary implementation specs created in the abstractcore workspace
28
28
  - `005_docs_updates.md` - Implemented
29
29
  - `README.md` - Original context document (preserved as-is)
30
30
 
31
+ ### From Current Numbered Backlog
32
+ - `0034_agent_runtime_convenience_constructor.md` - Deprecated on 2026-05-21 because the convenience pattern is agent-shaped and belongs in `abstractagent` if it is needed at all
33
+
31
34
  ## Note
32
35
 
33
36
  Do not add new items here. Use `completed/` for finished work and `planned/` for future work.
@@ -120,6 +120,29 @@ Gateway-specific prompt-cache environment variables should be consumed by Gatewa
120
120
  Hosts can inspect, prepare, and now clean up caches through `abstractruntime.integrations.abstractcore.get_abstractcore_host_facade(runtime)`, which exposes the normal prompt-cache/model-residency controls plus durable bloc helpers such as `upsert_text_bloc(...)`, `ensure_bloc_kv_artifact(...)`, `load_bloc_kv_artifact(...)`, `list_bloc_kv_artifacts(...)`, `delete_bloc_kv_artifact(...)`, and `delete_bloc(...)` without depending on the private runtime attachment directly.
121
121
  Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/host_facade.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
122
122
 
123
+ ## Can a host still export or import local provider prompt caches?
124
+
125
+ Yes, but treat that as **host-local operator tooling**, not the main durable
126
+ workflow memory model.
127
+
128
+ Use the Runtime host facade:
129
+ - `list_prompt_cache_exports(...)`
130
+ - `prompt_cache_export(...)`
131
+ - `prompt_cache_import(...)`
132
+
133
+ Important limits:
134
+ - this surface is **local-only**; remote and hybrid runtimes return
135
+ `prompt_cache_local_only`
136
+ - Runtime owns the export root policy:
137
+ - `~/.abstractruntime/prompt_cache_exports` by default
138
+ - `<base_dir>/prompt_cache_exports` for `create_local_file_runtime(...)`
139
+ - exports are partitioned per provider/model, so the same logical export name
140
+ can coexist cleanly across different local backends
141
+
142
+ For durable replay-safe workflow reuse, prefer `prompt_cache_binding` from
143
+ durable bloc/KV artifacts instead of host-local provider cache exports.
144
+ Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/host_facade.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
145
+
123
146
  ## Does Runtime duplicate durable bloc text? How do per-model caches relate to it?
124
147
 
125
148
  For local runtimes, Runtime owns the bloc root and stores one durable **text snapshot** per SHA256 within that root. That bloc is the source of truth. The provider/model cache is a **derived artifact** under that bloc, not a second independent memory model.
@@ -169,6 +192,10 @@ No. For the remaining host/operator paths, use Runtime's public wrappers instead
169
192
  - `...list_emails(...)`
170
193
  - `...read_email(...)`
171
194
  - `...send_email(...)`
195
+ - `abstractruntime.integrations.abstractcore.list_email_accounts(...)`
196
+ - `...list_emails(...)`
197
+ - `...read_email(...)`
198
+ - `...send_email(...)`
172
199
  - `abstractruntime.integrations.abstractcore.telegram_facade.bootstrap_telegram_auth_from_env(...)`
173
200
  - `...get_global_telegram_client(...)`
174
201
  - `...stop_global_telegram_client()`
@@ -322,6 +322,9 @@ AbstractRuntime's AbstractCore integration now exposes a public host-control fac
322
322
  - `prompt_cache_fork(...)`
323
323
  - `prompt_cache_clear(...)`
324
324
  - `prompt_cache_prepare_modules(...)`
325
+ - `list_prompt_cache_exports(...)`
326
+ - `prompt_cache_export(...)`
327
+ - `prompt_cache_import(...)`
325
328
  - `upsert_text_bloc(...)`
326
329
  - `get_bloc_record(...)`
327
330
  - `list_blocs(...)`
@@ -359,7 +362,9 @@ Contract notes:
359
362
  - The three prompt-cache tracks are distinct:
360
363
  - session prompt cache: best-effort volatile reuse
361
364
  - durable bloc prompt cache: exact reuse through bloc/KV/binding
362
- - snapshot prompt-cache admin: separate local-admin work, if enabled later
365
+ - host-local prompt-cache export/import admin: optional operator tooling
366
+ around live local provider cache state, separate from durable workflow
367
+ memory
363
368
 
364
369
  Host-side prompt-cache example:
365
370
 
@@ -416,6 +421,38 @@ loaded = facade.load_bloc_kv_artifact(
416
421
  binding = loaded["artifact"]["prompt_cache_binding"]
417
422
  ```
418
423
 
424
+ Host-local prompt-cache export/import example:
425
+
426
+ ```python
427
+ saved = facade.prompt_cache_export(
428
+ name="orbit-cache",
429
+ key="sess:orbit",
430
+ q8=True,
431
+ )
432
+ listed = facade.list_prompt_cache_exports()
433
+ loaded_cache = facade.prompt_cache_import(
434
+ name="orbit-cache",
435
+ key="loaded:orbit",
436
+ clear_existing=True,
437
+ )
438
+ ```
439
+
440
+ Host-local export/import contract:
441
+
442
+ - This surface is **local-only**. Remote and hybrid runtimes return structured
443
+ `prompt_cache_local_only` payloads instead of proxying host filesystem state
444
+ through Core Server.
445
+ - Runtime owns the export root policy:
446
+ - default local root: `~/.abstractruntime/prompt_cache_exports`
447
+ - default file-runtime root: `<base_dir>/prompt_cache_exports`
448
+ - explicit `prompt_cache_export_root_dir=...` overrides are allowed when a
449
+ host needs a different local catalog root
450
+ - Exports stay partitioned by provider/model under that root, so the same
451
+ logical export name can coexist safely across different local backends.
452
+ - This is a **secondary operator/admin feature**, not the primary durable app
453
+ contract. For replay-safe exact reuse inside workflows, prefer
454
+ `prompt_cache_binding` from durable bloc/KV artifacts instead.
455
+
419
456
  Host-side durable bloc lifecycle example:
420
457
 
421
458
  ```python
@@ -493,6 +530,11 @@ email and Telegram:
493
530
  - `list_emails(...)`
494
531
  - `read_email(...)`
495
532
  - `send_email(...)`
533
+ - `abstractruntime.integrations.abstractcore.comms_facade` also exposes:
534
+ - `list_email_accounts(...)`
535
+ - `list_emails(...)`
536
+ - `read_email(...)`
537
+ - `send_email(...)`
496
538
  - `abstractruntime.integrations.abstractcore.telegram_facade` exposes:
497
539
  - `TelegramTdlibNotAvailable`
498
540
  - `bootstrap_telegram_auth_from_env(...)`
@@ -504,6 +546,9 @@ Contract notes:
504
546
 
505
547
  - These are **host-local** wrappers over current public AbstractCore tool
506
548
  modules. They do not proxy through the remote AbstractCore server.
549
+ - The host facade email methods and the standalone `comms_facade` functions use
550
+ the same Runtime-owned email wrapper layer; choose whichever is more natural
551
+ for the host surface you are building.
507
552
  - They are intentionally **nondurable**. They do not write Runtime run history
508
553
  on their own.
509
554
  - Direct `send_email(...)` on the host facade and direct
@@ -48,7 +48,7 @@ Notes:
48
48
  - In untrusted deployments, prefer passthrough tools so a host/worker boundary approves and executes tool calls (`PassthroughToolExecutor` in `src/abstractruntime/integrations/abstractcore/tool_executor.py`).
49
49
  - For local bridge-owned delivery flows, `ApprovalToolExecutor` can auto-run the Telegram send tools while requiring approval for email, WhatsApp, unknown tools, and write/command-style tools by default.
50
50
  - Separate from the durable `TOOL_CALLS` path, Runtime also exposes **host wrappers** for operator-owned email and Telegram surfaces:
51
- - email helpers on `get_abstractcore_host_facade(runtime)`
51
+ - email helpers on `get_abstractcore_host_facade(runtime)` and `abstractruntime.integrations.abstractcore.comms_facade`
52
52
  - Telegram lifecycle/send wrappers in `abstractruntime.integrations.abstractcore.telegram_facade`
53
53
  - read/bootstrap helpers stay host-local and do not create run history by themselves
54
54
  - if an outbound send belongs to a run, prefer the durable run facade:
@@ -10,7 +10,7 @@ This file is an **agent-oriented build guide** for the AbstractRuntime *library*
10
10
 
11
11
  Quick facts:
12
12
  - Python: 3.10+ (`pyproject.toml`)
13
- - Version: 0.4.18
13
+ - Version: 0.4.20
14
14
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella; pairs with [AbstractCore](https://github.com/lpalbou/abstractcore)
15
15
  - Public export surface (source of truth): `src/abstractruntime/__init__.py`
16
16
  - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.24`
@@ -222,7 +222,7 @@ Notes:
222
222
  - Use `ApprovalToolExecutor(delegate=..., policy=ToolApprovalPolicy())` when a local host should auto-run safe tools but pause for user approval before write/command/unknown tools.
223
223
  - Remote `params.api_key` and `params.provider_api_key` are compatibility inputs; runtime converts them to `X-AbstractCore-Provider-API-Key` headers for current AbstractCore servers.
224
224
  - Gateway/hosts choose Core server URLs, Core server auth headers, provider/model defaults, tool executors, artifact stores, and any Gateway env/config translation before Runtime sees the call.
225
- - Hosts should bind `get_abstractcore_host_facade(rt)` for prompt-cache, durable bloc/KV, model-residency, and host-local email helper operations instead of reaching through the private `_abstractcore_llm_client` attachment directly.
225
+ - Hosts should bind `get_abstractcore_host_facade(rt)` for prompt-cache, durable bloc/KV, and model-residency control operations, and use the Runtime-owned email wrapper layer (`get_abstractcore_host_facade(rt)` or `abstractruntime.integrations.abstractcore.comms_facade`) for host-local email helper operations instead of importing `abstractcore.tools.comms_tools` directly.
226
226
  - Hosts should use `abstractruntime.integrations.abstractcore.telegram_facade` for Telegram TDLib bootstrap/global-client/send helpers instead of importing `abstractcore.tools.telegram_tdlib` or `abstractcore.tools.telegram_tools` directly. These wrappers remain host-local and do not proxy through a remote Core server.
227
227
  - If an outbound email or Telegram send belongs to a run, hosts should prefer `get_abstractcore_run_facade(rt).send_email(...)` or `send_telegram_message(...)`. Those are durable `TOOL_CALLS` child runs: Runtime records the request and outcome, and replay should reuse the recorded result instead of resending the message. If the child run waits for approval or passthrough host execution, resume it through the same public boundary with `resume_tool_calls(...)`.
228
228
  - Use `pip install "abstractruntime[multimodal]"` for common AbstractCore media, vision, voice, audio, and music dependencies.
@@ -318,6 +318,7 @@ Cached sessions / prompt cache:
318
318
  - Prefer stable `params.prompt_cache_key` values or `run.vars["_runtime"]["prompt_cache"]` config to select cache namespaces; Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE` is the process-wide opt-in.
319
319
  - Gateway prompt-cache env vars should be consumed by Gateway and translated into `_runtime.prompt_cache`; Runtime does not read Gateway env names directly.
320
320
  - For durable exact reuse across restarts, use `LLM_CALL.params.prompt_cache_binding` from a prior `load_bloc_kv_artifact(...)` result instead of treating provider-native snapshots as durable workflow state.
321
+ - For host-local operator workflows that still need provider-native export/import, use `get_abstractcore_host_facade(runtime).list_prompt_cache_exports(...)`, `prompt_cache_export(...)`, and `prompt_cache_import(...)`. That surface is local-only, partitions exports by provider/model under a Runtime-owned export root, and is intentionally separate from the durable bloc/binding contract.
321
322
  - For local runtimes, Runtime owns one content-addressed bloc root and stores one durable bloc text snapshot per SHA256 there; provider/model caches are separate derived artifacts under that bloc, not duplicate portable memory copies.
322
323
  - Keep provider cache handles, session objects, and warm-cache state inside AbstractCore clients or servers.
323
324
  - Runtime correctness must not depend on a warm cache; a cold cache may be slower but should produce the same durable graph behavior.
@@ -3,7 +3,7 @@
3
3
  > Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
4
 
5
5
  - Python: 3.10+ (see `pyproject.toml`)
6
- - Version: 0.4.18
6
+ - Version: 0.4.20
7
7
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
8
8
  - Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
9
9
  - Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.24`
@@ -34,11 +34,11 @@
34
34
 
35
35
  ## Integrations
36
36
 
37
- - [AbstractCore integration](docs/integrations/abstractcore.md): `LLM_CALL` / `TOOL_CALLS` / `MODEL_RESIDENCY`, local/remote/hybrid, prompt-cache and residency host controls, durable bloc/KV prompt-cache controls, discovery snapshot queries, durable run-scoped image/voice/music execution, media inputs, generated media outputs, provider-key headers, and tool approval waits
38
- - Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort session reuse; use `LLM_CALL.params.prompt_cache_binding` for durable exact bloc-backed reuse. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
37
+ - [AbstractCore integration](docs/integrations/abstractcore.md): `LLM_CALL` / `TOOL_CALLS` / `MODEL_RESIDENCY`, local/remote/hybrid, prompt-cache and residency host controls, local-only prompt-cache export/import admin, durable bloc/KV prompt-cache controls, discovery snapshot queries, durable run-scoped image/voice/music execution, media inputs, generated media outputs, provider-key headers, and tool approval waits
38
+ - Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort session reuse; use `LLM_CALL.params.prompt_cache_binding` for durable exact bloc-backed reuse; and use `get_abstractcore_host_facade(runtime).list_prompt_cache_exports(...)`, `prompt_cache_export(...)`, and `prompt_cache_import(...)` only for host-local operator/admin export-import workflows around live local provider caches. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
39
39
  - Durable bloc lifecycle: Runtime exposes `list_blocs(...)`, `list_bloc_kv_artifacts(...)`, `delete_bloc_kv_artifact(...)`, `prune_bloc_kv_artifacts(...)`, and `delete_bloc(...)`, with `dry_run`, `clear_loaded`, and `force` safety controls on the host facade.
40
40
  - Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, and `get_abstractcore_run_facade(...)`
41
- - Host-local operator wrappers: the host facade now also wraps email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
41
+ - Host-local operator wrappers: the host facade and `abstractruntime.integrations.abstractcore.comms_facade` expose email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
42
42
  - Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
43
43
  - [Artifacts](docs/api.md#artifacts-store-by-reference): JSON-safe refs for large payloads; generated images/audio/voice/music are stored here rather than embedded in `RunState.vars`
44
44
  - Remote multimodal guardrail: remote/hybrid media generation uses AbstractCore Server endpoints, does not inherit the chat model for media endpoints, rejects unsupported input media and non-file STT inputs instead of ignoring them, and redacts data URLs from persisted provider-request metadata