AbstractRuntime 0.4.19__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.19 → abstractruntime-0.4.20}/CHANGELOG.md +18 -1
  2. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/PKG-INFO +4 -4
  3. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/README.md +3 -3
  4. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/api.md +1 -0
  5. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/architecture.md +1 -1
  6. {abstractruntime-0.4.19 → 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.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/DEPRECATED_README.md +3 -0
  10. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/faq.md +23 -0
  11. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/integrations/abstractcore.md +38 -1
  12. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/llms-full.txt +2 -1
  13. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/llms.txt +3 -3
  14. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/pyproject.toml +1 -1
  15. abstractruntime-0.4.20/release-notes.md +13 -0
  16. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/factory.py +8 -0
  17. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/host_facade.py +91 -1
  18. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/llm_client.py +624 -7
  19. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_abstractcore_host_facade.py +156 -3
  20. abstractruntime-0.4.20/tests/test_prompt_cache_export_import.py +342 -0
  21. abstractruntime-0.4.19/docs/backlog/proposed/2026-05-20_agent_runtime_convenience_constructor.md +0 -37
  22. abstractruntime-0.4.19/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +0 -192
  23. abstractruntime-0.4.19/release-notes.md +0 -8
  24. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/.github/workflows/ci.yml +0 -0
  25. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/.github/workflows/release.yml +0 -0
  26. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/.gitignore +0 -0
  27. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/ACKNOWLEDGMENTS.md +0 -0
  28. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/CONTRIBUTING.md +0 -0
  29. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/LICENSE +0 -0
  30. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/ROADMAP.md +0 -0
  31. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/SECURITY.md +0 -0
  32. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/README.md +0 -0
  33. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  34. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  35. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  36. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  37. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  38. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  39. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/adr/README.md +0 -0
  40. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  41. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  42. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  43. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  44. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/003_wait_primitives.md +0 -0
  45. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  46. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  47. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  48. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  49. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/009_artifact_store.md +0 -0
  50. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  51. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  52. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  53. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  54. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  55. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  56. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  57. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  58. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  59. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  60. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  61. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  62. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  63. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  64. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  65. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  66. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  67. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  68. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  69. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  70. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  71. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  72. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/004_tests.md +0 -0
  73. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  74. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  75. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  76. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/README.md +0 -0
  77. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  78. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  79. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  80. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  81. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  82. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  83. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  84. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/evidence.md +0 -0
  85. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/getting-started.md +0 -0
  86. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/limits.md +0 -0
  87. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/manual_testing.md +0 -0
  88. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/mcp-worker.md +0 -0
  89. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/proposal.md +0 -0
  90. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/provenance.md +0 -0
  91. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/snapshots.md +0 -0
  92. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/tools-comms.md +0 -0
  93. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/docs/workflow-bundles.md +0 -0
  94. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/emails.config.example.yaml +0 -0
  95. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/01_hello_world.py +0 -0
  96. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/02_ask_user.py +0 -0
  97. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/03_wait_until.py +0 -0
  98. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/04_multi_step.py +0 -0
  99. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/05_persistence.py +0 -0
  100. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/06_llm_integration.py +0 -0
  101. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/07_react_agent.py +0 -0
  102. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/examples/README.md +0 -0
  103. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/mkdocs.yml +0 -0
  104. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/pytest.ini +0 -0
  105. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/__init__.py +0 -0
  106. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/__init__.py +0 -0
  107. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/config.py +0 -0
  108. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/event_keys.py +0 -0
  109. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/models.py +0 -0
  110. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/policy.py +0 -0
  111. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/runtime.py +0 -0
  112. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/spec.py +0 -0
  113. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/core/vars.py +0 -0
  114. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/evidence/__init__.py +0 -0
  115. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/evidence/recorder.py +0 -0
  116. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/history_bundle.py +0 -0
  117. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/identity/__init__.py +0 -0
  118. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/identity/fingerprint.py +0 -0
  119. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/__init__.py +0 -0
  120. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  121. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  122. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  123. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  124. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  125. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  126. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  127. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  128. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  129. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  130. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  131. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  132. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  133. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  134. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  135. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  136. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  137. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  138. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  139. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  140. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  141. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/__init__.py +0 -0
  142. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/active_context.py +0 -0
  143. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/active_memory.py +0 -0
  144. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/compaction.py +0 -0
  145. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/kg_packets.py +0 -0
  146. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/memact_composer.py +0 -0
  147. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/recall_levels.py +0 -0
  148. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/memory/token_budget.py +0 -0
  149. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/rendering/__init__.py +0 -0
  150. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  151. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/rendering/json_stringify.py +0 -0
  152. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/__init__.py +0 -0
  153. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/convenience.py +0 -0
  154. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/registry.py +0 -0
  155. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/scheduler/scheduler.py +0 -0
  156. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/__init__.py +0 -0
  157. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/artifacts.py +0 -0
  158. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/base.py +0 -0
  159. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/commands.py +0 -0
  160. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/in_memory.py +0 -0
  161. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/json_files.py +0 -0
  162. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/ledger_chain.py +0 -0
  163. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/observable.py +0 -0
  164. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/offloading.py +0 -0
  165. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/snapshots.py +0 -0
  166. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/storage/sqlite.py +0 -0
  167. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  168. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  169. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  170. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  171. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  172. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  173. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  174. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  175. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  176. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  177. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  178. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  179. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  180. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  181. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  182. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  183. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  184. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  185. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  186. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  187. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  188. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/models.py +0 -0
  189. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  190. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  191. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  192. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/README.md +0 -0
  193. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/conftest.py +0 -0
  194. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_abstractcore_comms_facade.py +0 -0
  195. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_abstractcore_discovery_facade.py +0 -0
  196. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_abstractcore_run_facade.py +0 -0
  197. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_abstractcore_telegram_facade.py +0 -0
  198. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_active_context_policy.py +0 -0
  199. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_active_memory.py +0 -0
  200. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_answer_user_effect.py +0 -0
  201. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_artifacts.py +0 -0
  202. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_chat_summarizer_integration.py +0 -0
  203. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_command_store.py +0 -0
  204. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_compaction_helpers.py +0 -0
  205. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_control_adapter_while.py +0 -0
  206. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_default_tools_comms_gating.py +0 -0
  207. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_default_tools_include_skim_files.py +0 -0
  208. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_default_tools_include_skim_folders.py +0 -0
  209. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_default_tools_search_files_executor.py +0 -0
  210. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_durable_toolsets.py +0 -0
  211. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  212. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_emit_event_without_workflow_registry.py +0 -0
  213. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_evidence_recorder.py +0 -0
  214. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  215. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_integration_abstractcore.py +0 -0
  216. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_integrations_abstractcore.py +0 -0
  217. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_json_file_run_store_children_index.py +0 -0
  218. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_jsonl_ledger_recovery.py +0 -0
  219. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_kg_learn_and_recall_contract.py +0 -0
  220. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_ledger_chain.py +0 -0
  221. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_ledger_subscription.py +0 -0
  222. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_media_artifact_refs.py +0 -0
  223. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  224. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  225. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_requires_prompt.py +0 -0
  226. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_response_schema_normalization.py +0 -0
  227. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_structured_output_fallback.py +0 -0
  228. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  229. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  230. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  231. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_client_media_artifacts.py +0 -0
  232. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_client_system_context.py +0 -0
  233. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_llm_client_tool_call_parsing.py +0 -0
  234. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  235. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_mcp_remote_tool_executor.py +0 -0
  236. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_mcp_worker_logging.py +0 -0
  237. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_mcp_worker_security.py +0 -0
  238. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_mcp_worker_stdio.py +0 -0
  239. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_media_artifact_resolution.py +0 -0
  240. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memact_composer_from_kg_result.py +0 -0
  241. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  242. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_packets.py +0 -0
  243. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  244. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  245. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  246. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  247. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_note_effect.py +0 -0
  248. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_query_effect.py +0 -0
  249. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_query_rich_filters.py +0 -0
  250. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  251. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_memory_tag_effect.py +0 -0
  252. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_mlx_generation_serialization.py +0 -0
  253. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_model_residency_control_plane.py +0 -0
  254. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_multimodal_abstractcore_integration.py +0 -0
  255. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_offloading.py +0 -0
  256. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_packaging_extras.py +0 -0
  257. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_pause_resume.py +0 -0
  258. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_prompt_cache_modules.py +0 -0
  259. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_queryable_run_store.py +0 -0
  260. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  261. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_real_integration.py +0 -0
  262. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_recall_levels_policy.py +0 -0
  263. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_remote_llm_client.py +0 -0
  264. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_rendering_agent_trace_report.py +0 -0
  265. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_rendering_json_stringify.py +0 -0
  266. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_retry_idempotency.py +0 -0
  267. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_run_history_bundle.py +0 -0
  268. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  269. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_runtime_install_boundary.py +0 -0
  270. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  271. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_runtime_node_traces.py +0 -0
  272. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  273. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_scheduler.py +0 -0
  274. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  275. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_snapshots.py +0 -0
  276. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_sqlite_ledger_store.py +0 -0
  277. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_start_subworkflow_async_wait.py +0 -0
  278. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  279. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  280. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_structured_output_schema_enum.py +0 -0
  281. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_subworkflow.py +0 -0
  282. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_terminal_effect_completion.py +0 -0
  283. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  284. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  285. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_approval_executor.py +0 -0
  286. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_approval_resume_executes.py +0 -0
  287. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_calls_idempotency_keys.py +0 -0
  288. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_argument_sanitization.py +0 -0
  289. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_error_output_detection.py +0 -0
  290. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_filename_alias.py +0 -0
  291. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  292. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_read_file_aliases.py +0 -0
  293. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_executor_timeout.py +0 -0
  294. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_tool_wait_allowlist_safety.py +0 -0
  295. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_trace_context_propagation.py +0 -0
  296. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_vars_query_effect.py +0 -0
  297. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  298. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  299. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  300. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  301. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  302. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  303. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_memact_compose_node.py +0 -0
  304. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  305. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  306. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  307. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_add_message_builtin.py +0 -0
  308. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  309. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_call_tool_node.py +0 -0
  310. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_compiler_basic.py +0 -0
  311. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  312. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_get_element_node.py +0 -0
  313. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_get_random_element_node.py +0 -0
  314. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_has_tools_builtin.py +0 -0
  315. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  316. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  317. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_make_object_node.py +0 -0
  318. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_media_nodes.py +0 -0
  319. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  320. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_memory_source_pins.py +0 -0
  321. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_prompt_only.py +0 -0
  322. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_random_nodes.py +0 -0
  323. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_string_contains_replace.py +0 -0
  324. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_visualflow_tool_parameters_node.py +0 -0
  325. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_wait_event_prompt_metadata.py +0 -0
  326. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_workflow_bundle_registry.py +0 -0
  327. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  328. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  329. {abstractruntime-0.4.19 → abstractruntime-0.4.20}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,22 @@ 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
+
10
26
  ## [0.4.19] - 2026-05-21
11
27
 
12
28
  ### Added
@@ -489,7 +505,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
489
505
 
490
506
  Initial development version with basic proof-of-concept features.
491
507
 
492
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...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
493
510
  [0.4.19]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...v0.4.19
494
511
  [0.4.18]: https://github.com/lpalbou/abstractruntime/compare/v0.4.17...v0.4.18
495
512
  [0.4.17]: https://github.com/lpalbou/abstractruntime/compare/v0.4.16...v0.4.17
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.19
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.19 • **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.19)
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,7 +193,7 @@ 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`
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
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
@@ -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.19 • **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.19)
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,7 +116,7 @@ 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`
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
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
@@ -191,6 +191,7 @@ Entry points:
191
191
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
192
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`)
193
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`)
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
194
195
  - host-facade email helpers delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
195
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`)
196
197
 
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-05-21
4
- > Version: 0.4.19
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.
@@ -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
@@ -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.19
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`
@@ -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.19
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,8 +34,8 @@
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
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.4.19"
7
+ version = "0.4.20"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,13 @@
1
+ ### Added
2
+ - Runtime now exposes a public host-local prompt-cache export/import admin surface on `get_abstractcore_host_facade(...)`:
3
+ - `list_prompt_cache_exports(...)`
4
+ - `prompt_cache_export(...)`
5
+ - `prompt_cache_import(...)`
6
+
7
+ ### Changed
8
+ - Local Runtime now owns the prompt-cache export root/catalog policy:
9
+ - `~/.abstractruntime/prompt_cache_exports` by default
10
+ - `<base_dir>/prompt_cache_exports` for `create_local_file_runtime(...)`
11
+ - exact provider/model partitioning with Runtime-managed metadata sidecars
12
+ - 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.
13
+ - 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.
@@ -75,6 +75,7 @@ def create_local_runtime(
75
75
  model: str,
76
76
  llm_kwargs: Optional[Dict[str, Any]] = None,
77
77
  bloc_root_dir: Optional[str | Path] = None,
78
+ prompt_cache_export_root_dir: Optional[str | Path] = None,
78
79
  run_store: Optional[RunStore] = None,
79
80
  ledger_store: Optional[LedgerStore] = None,
80
81
  tool_executor: Optional[ToolExecutor] = None,
@@ -138,6 +139,7 @@ def create_local_runtime(
138
139
  llm_kwargs=effective_llm_kwargs,
139
140
  artifact_store=artifact_store,
140
141
  bloc_root_dir=bloc_root_dir,
142
+ prompt_cache_export_root_dir=prompt_cache_export_root_dir,
141
143
  )
142
144
  tools = tool_executor or AbstractCoreToolExecutor(timeout_s=resolved_tool_timeout_s)
143
145
  # Orchestrator policy: enforce tool execution timeout at the runtime layer.
@@ -322,6 +324,7 @@ def create_local_file_runtime(
322
324
  model: str,
323
325
  llm_kwargs: Optional[Dict[str, Any]] = None,
324
326
  bloc_root_dir: Optional[str | Path] = None,
327
+ prompt_cache_export_root_dir: Optional[str | Path] = None,
325
328
  context: Optional[Any] = None,
326
329
  config: Optional[RuntimeConfig] = None,
327
330
  tool_timeout_s: Optional[float] = None,
@@ -333,6 +336,11 @@ def create_local_file_runtime(
333
336
  model=model,
334
337
  llm_kwargs=llm_kwargs,
335
338
  bloc_root_dir=Path(bloc_root_dir) if bloc_root_dir is not None else (Path(base_dir) / "blocs"),
339
+ prompt_cache_export_root_dir=(
340
+ Path(prompt_cache_export_root_dir)
341
+ if prompt_cache_export_root_dir is not None
342
+ else (Path(base_dir) / "prompt_cache_exports")
343
+ ),
336
344
  run_store=run_store,
337
345
  ledger_store=ledger_store,
338
346
  context=context,