AbstractRuntime 0.4.15__tar.gz → 0.4.17__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 (324) hide show
  1. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/CHANGELOG.md +30 -1
  2. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/PKG-INFO +12 -12
  3. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/README.md +4 -4
  4. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/README.md +1 -1
  5. abstractruntime-0.4.17/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +104 -0
  6. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/README.md +2 -0
  7. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/api.md +12 -9
  8. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/architecture.md +3 -3
  9. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/README.md +20 -2
  10. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +2 -2
  11. abstractruntime-0.4.17/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +177 -0
  12. abstractruntime-0.4.17/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +145 -0
  13. abstractruntime-0.4.17/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +178 -0
  14. abstractruntime-0.4.17/docs/backlog/planned/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +165 -0
  15. abstractruntime-0.4.17/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +86 -0
  16. abstractruntime-0.4.17/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +192 -0
  17. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/faq.md +48 -11
  18. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/getting-started.md +2 -2
  19. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/integrations/abstractcore.md +146 -9
  20. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/llms-full.txt +14 -10
  21. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/llms.txt +7 -6
  22. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/pyproject.toml +10 -10
  23. abstractruntime-0.4.17/release-notes.md +10 -0
  24. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/__init__.py +1 -1
  25. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +56 -0
  26. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +165 -0
  27. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +32 -0
  28. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/factory.py +4 -0
  29. abstractruntime-0.4.17/src/abstractruntime/integrations/abstractcore/host_facade.py +665 -0
  30. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/llm_client.py +1994 -25
  31. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/run_facade.py +23 -1
  32. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_abstractcore_discovery_facade.py +176 -0
  33. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_abstractcore_host_facade.py +465 -1
  34. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_abstractcore_run_facade.py +75 -0
  35. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_multimodal_abstractcore_integration.py +54 -0
  36. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_packaging_extras.py +7 -7
  37. abstractruntime-0.4.17/tests/test_prompt_cache_modules.py +1293 -0
  38. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_remote_llm_client.py +58 -0
  39. abstractruntime-0.4.15/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +0 -74
  40. abstractruntime-0.4.15/release-notes.md +0 -12
  41. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -324
  42. abstractruntime-0.4.15/tests/test_prompt_cache_modules.py +0 -462
  43. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/.github/workflows/ci.yml +0 -0
  44. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/.github/workflows/release.yml +0 -0
  45. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/.gitignore +0 -0
  46. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/ACKNOWLEDGMENTS.md +0 -0
  47. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/CONTRIBUTING.md +0 -0
  48. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/LICENSE +0 -0
  49. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/ROADMAP.md +0 -0
  50. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/SECURITY.md +0 -0
  51. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  52. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  53. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  54. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  55. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  56. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  57. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  58. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/003_wait_primitives.md +0 -0
  59. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  60. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  61. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  62. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  63. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/009_artifact_store.md +0 -0
  64. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  65. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  66. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  67. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  68. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  69. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  70. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  71. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  72. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  73. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  74. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  75. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  76. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  77. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  78. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  79. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  80. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  81. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  82. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/004_tests.md +0 -0
  83. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  84. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  85. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  86. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  87. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/README.md +0 -0
  88. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  89. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  90. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  91. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  92. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  93. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  94. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/backlog/proposed/2026-05-20_agent_runtime_convenience_constructor.md +0 -0
  95. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/evidence.md +0 -0
  96. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/limits.md +0 -0
  97. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/manual_testing.md +0 -0
  98. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/mcp-worker.md +0 -0
  99. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/proposal.md +0 -0
  100. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/provenance.md +0 -0
  101. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/snapshots.md +0 -0
  102. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/tools-comms.md +0 -0
  103. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/docs/workflow-bundles.md +0 -0
  104. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/emails.config.example.yaml +0 -0
  105. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/01_hello_world.py +0 -0
  106. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/02_ask_user.py +0 -0
  107. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/03_wait_until.py +0 -0
  108. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/04_multi_step.py +0 -0
  109. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/05_persistence.py +0 -0
  110. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/06_llm_integration.py +0 -0
  111. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/07_react_agent.py +0 -0
  112. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/examples/README.md +0 -0
  113. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/mkdocs.yml +0 -0
  114. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/pytest.ini +0 -0
  115. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/__init__.py +0 -0
  116. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/__init__.py +0 -0
  117. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/config.py +0 -0
  118. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/event_keys.py +0 -0
  119. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/models.py +0 -0
  120. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/policy.py +0 -0
  121. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/runtime.py +0 -0
  122. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/spec.py +0 -0
  123. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/core/vars.py +0 -0
  124. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/evidence/__init__.py +0 -0
  125. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/evidence/recorder.py +0 -0
  126. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/history_bundle.py +0 -0
  127. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/identity/__init__.py +0 -0
  128. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/identity/fingerprint.py +0 -0
  129. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/__init__.py +0 -0
  130. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  131. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  132. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  133. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  134. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  135. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  136. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  137. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  138. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  139. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  140. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  141. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  142. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  143. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  144. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/__init__.py +0 -0
  145. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/active_context.py +0 -0
  146. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/active_memory.py +0 -0
  147. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/compaction.py +0 -0
  148. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/kg_packets.py +0 -0
  149. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/memact_composer.py +0 -0
  150. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/recall_levels.py +0 -0
  151. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/memory/token_budget.py +0 -0
  152. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/rendering/__init__.py +0 -0
  153. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  154. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/rendering/json_stringify.py +0 -0
  155. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/scheduler/__init__.py +0 -0
  156. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/scheduler/convenience.py +0 -0
  157. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/scheduler/registry.py +0 -0
  158. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/scheduler/scheduler.py +0 -0
  159. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/__init__.py +0 -0
  160. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/artifacts.py +0 -0
  161. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/base.py +0 -0
  162. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/commands.py +0 -0
  163. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/in_memory.py +0 -0
  164. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/json_files.py +0 -0
  165. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/ledger_chain.py +0 -0
  166. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/observable.py +0 -0
  167. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/offloading.py +0 -0
  168. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/snapshots.py +0 -0
  169. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/storage/sqlite.py +0 -0
  170. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  171. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  172. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  173. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  174. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  175. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  176. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  177. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  178. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  179. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  180. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  181. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  182. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  183. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  184. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  185. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  186. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  187. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  188. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  189. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  190. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  191. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/workflow_bundle/models.py +0 -0
  192. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  193. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  194. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  195. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/README.md +0 -0
  196. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/conftest.py +0 -0
  197. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_active_context_policy.py +0 -0
  198. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_active_memory.py +0 -0
  199. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_answer_user_effect.py +0 -0
  200. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_artifacts.py +0 -0
  201. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_chat_summarizer_integration.py +0 -0
  202. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_command_store.py +0 -0
  203. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_compaction_helpers.py +0 -0
  204. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_control_adapter_while.py +0 -0
  205. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_default_tools_comms_gating.py +0 -0
  206. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_default_tools_include_skim_files.py +0 -0
  207. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_default_tools_include_skim_folders.py +0 -0
  208. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_default_tools_search_files_executor.py +0 -0
  209. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_durable_toolsets.py +0 -0
  210. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  211. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_emit_event_without_workflow_registry.py +0 -0
  212. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_evidence_recorder.py +0 -0
  213. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  214. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_integration_abstractcore.py +0 -0
  215. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_integrations_abstractcore.py +0 -0
  216. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_json_file_run_store_children_index.py +0 -0
  217. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_jsonl_ledger_recovery.py +0 -0
  218. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_kg_learn_and_recall_contract.py +0 -0
  219. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_ledger_chain.py +0 -0
  220. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_ledger_subscription.py +0 -0
  221. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_media_artifact_refs.py +0 -0
  222. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  223. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  224. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_requires_prompt.py +0 -0
  225. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_response_schema_normalization.py +0 -0
  226. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_structured_output_fallback.py +0 -0
  227. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  228. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  229. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  230. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_client_media_artifacts.py +0 -0
  231. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_client_system_context.py +0 -0
  232. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_llm_client_tool_call_parsing.py +0 -0
  233. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  234. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_mcp_remote_tool_executor.py +0 -0
  235. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_mcp_worker_logging.py +0 -0
  236. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_mcp_worker_security.py +0 -0
  237. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_mcp_worker_stdio.py +0 -0
  238. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_media_artifact_resolution.py +0 -0
  239. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memact_composer_from_kg_result.py +0 -0
  240. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  241. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_packets.py +0 -0
  242. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  243. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  244. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  245. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  246. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_note_effect.py +0 -0
  247. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_query_effect.py +0 -0
  248. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_query_rich_filters.py +0 -0
  249. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  250. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_memory_tag_effect.py +0 -0
  251. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_mlx_generation_serialization.py +0 -0
  252. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_model_residency_control_plane.py +0 -0
  253. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_offloading.py +0 -0
  254. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_pause_resume.py +0 -0
  255. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_queryable_run_store.py +0 -0
  256. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  257. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_real_integration.py +0 -0
  258. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_recall_levels_policy.py +0 -0
  259. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_rendering_agent_trace_report.py +0 -0
  260. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_rendering_json_stringify.py +0 -0
  261. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_retry_idempotency.py +0 -0
  262. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_run_history_bundle.py +0 -0
  263. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  264. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_runtime_install_boundary.py +0 -0
  265. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  266. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_runtime_node_traces.py +0 -0
  267. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  268. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_scheduler.py +0 -0
  269. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  270. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_snapshots.py +0 -0
  271. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_sqlite_ledger_store.py +0 -0
  272. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_start_subworkflow_async_wait.py +0 -0
  273. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  274. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  275. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_structured_output_schema_enum.py +0 -0
  276. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_subworkflow.py +0 -0
  277. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_terminal_effect_completion.py +0 -0
  278. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  279. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  280. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_approval_executor.py +0 -0
  281. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_approval_resume_executes.py +0 -0
  282. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_calls_idempotency_keys.py +0 -0
  283. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_argument_sanitization.py +0 -0
  284. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_error_output_detection.py +0 -0
  285. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_filename_alias.py +0 -0
  286. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  287. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_read_file_aliases.py +0 -0
  288. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_executor_timeout.py +0 -0
  289. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_tool_wait_allowlist_safety.py +0 -0
  290. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_trace_context_propagation.py +0 -0
  291. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_vars_query_effect.py +0 -0
  292. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  293. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  294. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  295. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  296. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  297. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  298. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_memact_compose_node.py +0 -0
  299. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  300. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  301. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  302. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_add_message_builtin.py +0 -0
  303. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  304. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_call_tool_node.py +0 -0
  305. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_compiler_basic.py +0 -0
  306. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  307. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_get_element_node.py +0 -0
  308. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_get_random_element_node.py +0 -0
  309. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_has_tools_builtin.py +0 -0
  310. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  311. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  312. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_make_object_node.py +0 -0
  313. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_media_nodes.py +0 -0
  314. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  315. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_memory_source_pins.py +0 -0
  316. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_prompt_only.py +0 -0
  317. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_random_nodes.py +0 -0
  318. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_string_contains_replace.py +0 -0
  319. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_visualflow_tool_parameters_node.py +0 -0
  320. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_wait_event_prompt_metadata.py +0 -0
  321. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_workflow_bundle_registry.py +0 -0
  322. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  323. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  324. {abstractruntime-0.4.15 → abstractruntime-0.4.17}/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.17] - 2026-05-21
11
+
12
+ ### Added
13
+ - Runtime now surfaces AbstractCore-backed music through the same durable boundary as other generated artifacts:
14
+ - host discovery snapshot methods for music providers/models
15
+ - durable run-scoped `generate_music(...)`
16
+ - artifact-backed normalized music outputs for local and remote Runtime paths
17
+
18
+ ### Changed
19
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.24`.
20
+ - The `multimodal` extra now installs `abstractcore[remote,vision,voice,audio,music]>=2.13.24`, which includes AbstractMusic's lightweight remote ACE backend path via `abstractmusic>=0.1.4`.
21
+ - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now describe the shipped music boundary and the current `0030` Gateway cleanup scope more accurately.
22
+
23
+ ## [0.4.16] - 2026-05-21
24
+
25
+ ### Added
26
+ - Public durable AbstractCore bloc lifecycle operations on `get_abstractcore_host_facade(...)` across local, remote, and hybrid runtimes:
27
+ - `list_blocs(...)`
28
+ - `list_bloc_kv_artifacts(...)`
29
+ - `delete_bloc_kv_artifact(...)`
30
+ - `prune_bloc_kv_artifacts(...)`
31
+ - `delete_bloc(...)`
32
+
33
+ ### Changed
34
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.23`.
35
+ - Runtime's public docs and AI-readable `llms.txt` / `llms-full.txt` now describe the shipped durable bloc prompt-cache lifecycle boundary, including per-model KV artifacts and explicit cleanup controls.
36
+
10
37
  ## [0.4.15] - 2026-05-20
11
38
 
12
39
  ### Added
@@ -434,7 +461,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
434
461
 
435
462
  Initial development version with basic proof-of-concept features.
436
463
 
437
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.15...HEAD
464
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.17...HEAD
465
+ [0.4.17]: https://github.com/lpalbou/abstractruntime/compare/v0.4.16...v0.4.17
466
+ [0.4.16]: https://github.com/lpalbou/abstractruntime/compare/v0.4.15...v0.4.16
438
467
  [0.4.15]: https://github.com/lpalbou/abstractruntime/compare/v0.4.14...v0.4.15
439
468
  [0.4.14]: https://github.com/lpalbou/abstractruntime/compare/v0.4.13...v0.4.14
440
469
  [0.4.13]: https://github.com/lpalbou/abstractruntime/compare/v0.4.12...v0.4.13
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.15
3
+ Version: 0.4.17
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
@@ -23,24 +23,24 @@ Requires-Python: >=3.10
23
23
  Requires-Dist: abstractmemory>=0.2.6
24
24
  Requires-Dist: abstractsemantics>=0.0.3
25
25
  Provides-Extra: abstractcore
26
- Requires-Dist: abstractcore>=2.13.20; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.24; extra == 'abstractcore'
27
27
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'abstractcore'
28
28
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'abstractcore'
29
29
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'abstractcore'
30
30
  Provides-Extra: all-apple
31
- Requires-Dist: abstractcore[all-apple]>=2.13.20; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.24; extra == 'all-apple'
32
32
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-apple'
33
33
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-apple'
34
34
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-apple'
35
35
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-apple'
36
36
  Provides-Extra: all-gpu
37
- Requires-Dist: abstractcore[all-gpu]>=2.13.20; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.24; extra == 'all-gpu'
38
38
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-gpu'
39
39
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-gpu'
40
40
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-gpu'
41
41
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-gpu'
42
42
  Provides-Extra: apple
43
- Requires-Dist: abstractcore[apple]>=2.13.20; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.24; extra == 'apple'
44
44
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'apple'
45
45
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'apple'
46
46
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'apple'
@@ -50,18 +50,18 @@ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
50
50
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
51
51
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
52
52
  Provides-Extra: gpu
53
- Requires-Dist: abstractcore[gpu]>=2.13.20; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.24; extra == 'gpu'
54
54
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'gpu'
55
55
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'gpu'
56
56
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'gpu'
57
57
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'gpu'
58
58
  Provides-Extra: mcp-worker
59
- Requires-Dist: abstractcore[tools]>=2.13.20; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.24; extra == 'mcp-worker'
60
60
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'mcp-worker'
61
61
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'mcp-worker'
62
62
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'mcp-worker'
63
63
  Provides-Extra: multimodal
64
- Requires-Dist: abstractcore[audio,remote,vision,voice]>=2.13.20; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.24; extra == 'multimodal'
65
65
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'multimodal'
66
66
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'multimodal'
67
67
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'multimodal'
@@ -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.15 • **Python:** 3.10+
84
+ **Version:** 0.4.17 • **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
 
@@ -115,7 +115,7 @@ AbstractCore integration (LLM + tools):
115
115
  pip install "abstractruntime[abstractcore]"
116
116
  ```
117
117
 
118
- The `abstractcore` extra installs AbstractCore 2.13.20 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
118
+ The `abstractcore` extra installs AbstractCore 2.13.24 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, and lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.4` ACE-remote path used by Runtime music generation are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, audio, and music dependencies.
119
119
 
120
120
  Hardware profile cascades are available for native Python installs:
121
121
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -169,7 +169,7 @@ state = rt.resume(
169
169
  assert state.status.value == "completed"
170
170
  ```
171
171
 
172
- ## What’s included (v0.4.15)
172
+ ## What’s included (v0.4.17)
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/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
196
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, and lifecycle operations, media inputs, generated image/voice/music outputs, tool approval waits): `docs/integrations/abstractcore.md`
197
197
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
198
198
  depends on the light AbstractMemory contract; hosts choose storage backends
199
199
  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.15 • **Python:** 3.10+
7
+ **Version:** 0.4.17 • **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
 
@@ -38,7 +38,7 @@ AbstractCore integration (LLM + tools):
38
38
  pip install "abstractruntime[abstractcore]"
39
39
  ```
40
40
 
41
- The `abstractcore` extra installs AbstractCore 2.13.20 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
41
+ The `abstractcore` extra installs AbstractCore 2.13.24 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, and lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.4` ACE-remote path used by Runtime music generation are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, audio, and music dependencies.
42
42
 
43
43
  Hardware profile cascades are available for native Python installs:
44
44
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -92,7 +92,7 @@ state = rt.resume(
92
92
  assert state.status.value == "completed"
93
93
  ```
94
94
 
95
- ## What’s included (v0.4.15)
95
+ ## What’s included (v0.4.17)
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/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
119
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, and lifecycle operations, media inputs, generated image/voice/music outputs, tool approval waits): `docs/integrations/abstractcore.md`
120
120
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
121
121
  depends on the light AbstractMemory contract; hosts choose storage backends
122
122
  such as LanceDB, SQLite, or in-memory stores.
@@ -24,7 +24,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
24
24
 
25
25
  - `faq.md` — common questions (recommended)
26
26
  - `manual_testing.md` — manual smoke tests and how to run the test suite
27
- - `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions/prompt-cache control, media inputs, generated media outputs, and tool approval waits via AbstractCore
27
+ - `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions, durable bloc prompt-cache control, media inputs, generated media outputs, and tool approval waits via AbstractCore
28
28
  - `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
29
29
 
30
30
  ## Features (reference)
@@ -0,0 +1,104 @@
1
+ ## ADR 0006: Runtime owns durable AbstractCore bloc prompt-cache control
2
+
3
+ ### Status
4
+ Accepted (2026-05-20)
5
+
6
+ ### Context
7
+ AbstractCore `2.13.22` added a public durable prompt-cache contract for local
8
+ backends:
9
+
10
+ - text/file blocs as durable source-of-truth content,
11
+ - provider/model-specific KV artifacts,
12
+ - request-time `prompt_cache_binding` proof for exact reuse.
13
+
14
+ Before this decision, Runtime only owned:
15
+
16
+ - best-effort session prompt-cache controls,
17
+ - model-residency controls,
18
+ - discovery/query snapshots,
19
+ - durable run-scoped media execution.
20
+
21
+ That left a real gap for app-facing durable prompt caching:
22
+
23
+ - hosts had no public Runtime path for bloc/KV control operations;
24
+ - remote Runtime execution dropped `prompt_cache_binding`;
25
+ - `LLM_CALL` key injection could derive a competing session key even when a
26
+ durable binding was present;
27
+ - local Runtime had no explicit bloc-store root policy and would otherwise
28
+ inherit Core defaults implicitly.
29
+
30
+ ### Decision
31
+ AbstractRuntime owns the host-facing durable AbstractCore bloc prompt-cache
32
+ boundary.
33
+
34
+ Specifically:
35
+
36
+ - Hosts should use the existing `AbstractCoreHostFacade` for durable bloc/KV
37
+ prompt-cache controls rather than adding a fourth public facade.
38
+ - The public host surface includes:
39
+ - `upsert_text_bloc(...)`
40
+ - `get_bloc_record(...)`
41
+ - `list_blocs(...)`
42
+ - `get_bloc_kv_manifest(...)`
43
+ - `ensure_bloc_kv_artifact(...)`
44
+ - `load_bloc_kv_artifact(...)`
45
+ - `list_bloc_kv_artifacts(...)`
46
+ - `delete_bloc_kv_artifact(...)`
47
+ - `prune_bloc_kv_artifacts(...)`
48
+ - `delete_bloc(...)`
49
+ - Runtime mirrors Core's public bloc request/response model instead of
50
+ inventing a Gateway-local save/load vocabulary.
51
+ - `LLM_CALL.payload.params.prompt_cache_binding` is the public Runtime binding
52
+ input. Runtime may also accept the local Python alias
53
+ `expected_prompt_cache_binding`, but it must normalize to
54
+ `prompt_cache_binding`.
55
+ - When a binding is present:
56
+ - `binding.key` becomes the effective `prompt_cache_key` when no explicit key
57
+ was supplied;
58
+ - mismatched `prompt_cache_key` and `binding.key` fail before provider or
59
+ server execution;
60
+ - Runtime must not auto-derive a competing session key;
61
+ - local session prompt-cache preparation must not mutate the bound key before
62
+ generation.
63
+ - Local Runtime owns an explicit bloc-root policy:
64
+ - default local root: `~/.abstractruntime/blocs`
65
+ - default file-runtime root: `<base_dir>/blocs`
66
+ - explicit `bloc_root_dir=` overrides are allowed for hosts such as Gateway
67
+
68
+ ### Consequences
69
+ - Runtime becomes the public Python boundary for three distinct prompt-cache
70
+ tracks:
71
+ - session prompt-cache reuse,
72
+ - durable bloc/KV/binding reuse,
73
+ - local-admin snapshot save/load/list work if promoted later
74
+ - Hosts can expose durable bloc caching without reaching into Core or provider
75
+ internals.
76
+ - Hosts can also reclaim durable bloc/KV storage through the same Runtime
77
+ boundary instead of manual filesystem deletion or private Core hooks.
78
+ - Runtime does not silently inherit Core's default `~/.abstractcore/blocs`
79
+ layout.
80
+ - Provider-private prompt-cache snapshot save/load remains a separate local-admin
81
+ concern and is not promoted by this decision.
82
+
83
+ ### Enforcement
84
+ - New host adoption work should use `get_abstractcore_host_facade(runtime)` for
85
+ durable bloc/KV operations.
86
+ - Runtime docs and AI-readable docs must describe the durable bloc track
87
+ separately from session prompt caching.
88
+ - Runtime code review should reject any new auto-derived prompt-cache behavior
89
+ that competes with `prompt_cache_binding`.
90
+
91
+ ### Validation
92
+ - Host-facade tests cover delegation and remote route shaping for bloc/KV
93
+ operations.
94
+ - `LLM_CALL` tests cover binding-only adoption, alias normalization, and
95
+ mismatch fail-fast behavior.
96
+ - Regression coverage includes local/root-policy tests and the broader
97
+ AbstractCore Runtime facade suite.
98
+
99
+ ### See Also
100
+ - Implementation: [`../backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md`](../backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md)
101
+ - Core binding contract: `../abstractcore/docs/adr/0007-durable-memory-bloc-cache-binding.md`
102
+ - Related Runtime ADRs:
103
+ - [`0004_runtime_owns_run_scoped_media_execution_truth.md`](0004_runtime_owns_run_scoped_media_execution_truth.md)
104
+ - [`0005_runtime_owns_abstractcore_host_discovery_queries.md`](0005_runtime_owns_abstractcore_host_discovery_queries.md)
@@ -18,6 +18,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
18
18
  | 0003 | [Provenance Hash Chain](0003_provenance_tamper_evident_hash_chain.md) | Accepted | 2025-12-11 | Tamper-evident ledger first; cryptographic signatures deferred |
19
19
  | 0004 | [Runtime Owns Run-Scoped Media Execution Truth](0004_runtime_owns_run_scoped_media_execution_truth.md) | Accepted | 2026-05-20 | Hosts must route run-scoped media execution through Runtime |
20
20
  | 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
21
+ | 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
21
22
 
22
23
  ## Relationship to Backlog
23
24
 
@@ -30,6 +31,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
30
31
  | 0003 | `backlog/completed/007_provenance_hash_chain.md`, `backlog/planned/008_signatures_and_keys.md` |
31
32
  | 0004 | `backlog/completed/023_truthful_local_media_residency_boundaries.md`, `backlog/completed/024_runtime_owned_run_scoped_media_execution.md` |
32
33
  | 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
34
+ | 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
33
35
 
34
36
  ## Adding New ADRs
35
37
 
@@ -125,7 +125,7 @@ Key types:
125
125
  Artifacts are used by:
126
126
  - offloading wrappers (`src/abstractruntime/storage/offloading.py`)
127
127
  - evidence capture (`docs/evidence.md`, `src/abstractruntime/evidence/recorder.py`)
128
- - AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/voice/audio outputs are stored as artifact refs
128
+ - AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/voice/music/audio outputs are stored as artifact refs
129
129
 
130
130
  ## Snapshots / bookmarks
131
131
 
@@ -176,7 +176,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
176
176
 
177
177
  ### AbstractCore (LLM + tools)
178
178
 
179
- Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.20 or newer).
179
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.24 or newer).
180
180
 
181
181
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
182
182
 
@@ -187,22 +187,22 @@ Entry points:
187
187
  - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
188
188
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
189
189
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
190
- - 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_vision_provider_models`, `list_cached_vision_models`)
191
- - host-facade 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`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
192
- - run-facade helpers create durable child runs for existing runs (`execute_llm_call`, `generate_image`, `generate_voice`, `transcribe_audio`)
190
+ - 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`)
191
+ - host-facade 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`)
192
+ - run-facade helpers create durable child runs for existing runs (`execute_llm_call`, `generate_image`, `generate_voice`, `generate_music`, `transcribe_audio`)
193
193
 
194
194
  `LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
195
195
  - `prompt`, `messages`, `system_prompt`, and convenience `text`
196
196
  - `media`: a media path, artifact ref (`{"$artifact": "..."}` or `{"artifact_id": "..."}`), media dict, or list of those
197
197
  - `output`: AbstractCore output selector; top-level `outputs` is accepted as a runtime alias
198
- - `params`: provider/model routing, generation controls, prompt-cache keys, structured-output schema options, and tracing metadata
198
+ - `params`: provider/model routing, generation controls, prompt-cache keys or `prompt_cache_binding`, structured-output schema options, and tracing metadata
199
199
 
200
200
  Multimodal support:
201
- - install `abstractruntime[multimodal]` for common AbstractCore media, vision, voice, and audio dependencies
201
+ - install `abstractruntime[multimodal]` for common AbstractCore media, vision, voice, audio, and music dependencies
202
202
  - local clients call AbstractCore's unified `generate(..., media=..., output=...)`
203
- - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, speech, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
203
+ - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
204
204
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
205
- - generated image/voice/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
205
+ - generated image/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
206
206
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
207
207
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`, while unsupported local media warmup also reports `execution_mode="local_one_shot_subprocess"` and `requires_long_lived_server=true`
208
208
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected Core/capability install profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
@@ -210,6 +210,9 @@ Multimodal support:
210
210
  Prompt cache / cached sessions:
211
211
  - LLM clients expose cache control methods listed above for host-side preparation and inspection
212
212
  - `LLM_CALL.params.prompt_cache_key` selects a cache key for a call; runtime can also derive a session-scoped key from `run.vars["_runtime"]["prompt_cache"]` or the Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE` process default
213
+ - `LLM_CALL.params.prompt_cache_binding` is the durable exact-reuse input for bloc-backed prompt caching; if a binding includes `key`, Runtime adopts it as the effective prompt-cache key and refuses mismatches before provider execution
214
+ - `get_abstractcore_host_facade(...)` also exposes durable bloc helpers (`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`)
215
+ - local Runtime owns the bloc root policy: `~/.abstractruntime/blocs` by default, `<base_dir>/blocs` for `create_local_file_runtime(...)`, and explicit `bloc_root_dir=...` overrides when needed
213
216
  - provider cache/session handles are not durable runtime state and should not be stored in `RunState.vars`
214
217
 
215
218
  Attachment registration limits:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-05-20
4
- > Version: 0.4.15
3
+ > Updated: 2026-05-21
4
+ > Version: 0.4.17
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.
@@ -28,7 +28,7 @@ Key invariants (enforced by code, not convention):
28
28
 
29
29
  ## AbstractCore capability boundary
30
30
 
31
- AbstractRuntime's job is persistence and orchestration. AbstractCore owns model/provider capability execution: chat, structured output, cached sessions/prompt cache, media input analysis, image generation, voice/audio generation, transcription, and future modalities such as music or video.
31
+ AbstractRuntime's job is persistence and orchestration. AbstractCore owns model/provider capability execution: chat, structured output, cached sessions/prompt cache, media input analysis, image generation, voice/audio generation, music generation, transcription, and future modalities such as video.
32
32
 
33
33
  The boundary is intentionally narrow:
34
34
  - Workflow nodes request model work with `EffectType.LLM_CALL`; the runtime persists the request/result and delegates execution to the configured AbstractCore client.
@@ -10,6 +10,19 @@ 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
+ ## Next recommended work
14
+
15
+ 1. `planned/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md`
16
+ This is the narrow Runtime work that unblocks the last high-pressure direct
17
+ `abstractcore` imports in Gateway for comms/email and Telegram without
18
+ reopening the already-completed media/discovery boundary work.
19
+ 2. `planned/018_workspace_access_policy_for_media_and_tools.md`
20
+ Keep workspace and tool policy explicit while Gateway extracts its local
21
+ workspace helpers.
22
+ 3. `planned/014_remote_tool_worker_executor.md`
23
+ The public ToolExecutor path is still the larger follow-on after the current
24
+ Gateway boundary cleanup.
25
+
13
26
  ## Completed
14
27
 
15
28
  | ID | Item |
@@ -34,6 +47,9 @@ If you are new to the project, start with `../README.md` and `../architecture.md
34
47
  | 023 | `completed/023_truthful_local_media_residency_boundaries.md` |
35
48
  | 024 | `completed/024_runtime_owned_run_scoped_media_execution.md` |
36
49
  | 026 | `completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
50
+ | 027 | `completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
51
+ | 028 | `completed/028_runtime_bloc_kv_lifecycle_and_pruning.md` |
52
+ | 029 | `completed/029_runtime_music_generation_and_discovery_via_abstractcore.md` |
37
53
 
38
54
  ## Planned
39
55
 
@@ -44,13 +60,15 @@ If you are new to the project, start with `../README.md` and `../architecture.md
44
60
  | 017 | `planned/017_limit_warnings_and_observability.md` |
45
61
  | 018 | `planned/018_workspace_access_policy_for_media_and_tools.md` |
46
62
  | 025 | `planned/025_runtime_retention_and_purge_contract.md` |
63
+ | 0030 | `planned/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md` |
47
64
 
48
65
  ## Proposed
49
66
 
50
- | Date | Item |
51
- |------|------|
67
+ | ID | Item |
68
+ |----|------|
52
69
  | 2026-05-20 | `proposed/2026-05-20_agent_runtime_convenience_constructor.md` |
53
70
  | 2026-05-20 | `proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md` |
71
+ | 0031 | `proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md` |
54
72
 
55
73
  ## Deprecated
56
74
 
@@ -18,7 +18,7 @@ the base package, while still exposing explicit extras and profile cascades for
18
18
  `abstractruntime[multimodal]`.
19
19
  - Runtime now exposes explicit profile-cascade extras (`apple`, `gpu`, `all-apple`, `all-gpu`) instead of requiring
20
20
  hosts to guess how to align local-engine install profiles.
21
- - The package metadata floor has since advanced to `abstractcore>=2.13.20`; the original completion landed on an older
21
+ - The package metadata floor has since advanced to `abstractcore>=2.13.23`; the original completion landed on an older
22
22
  2.13.12-aligned floor and was later tightened without changing the boundary itself.
23
23
  - Regression tests cover package metadata, optional-stack imports, and the rule that Gateway env/auth does not leak
24
24
  into Runtime's remote AbstractCore client boundary.
@@ -79,7 +79,7 @@ through extras, and tests prove the packaging/import boundary.
79
79
 
80
80
  ### Residual risks
81
81
 
82
- - Version-floor references in historical backlog text had drifted behind the current `abstractcore>=2.13.20` baseline.
82
+ - Version-floor references in historical backlog text had drifted behind the current `abstractcore>=2.13.23` baseline.
83
83
  That drift is now explicit here, but other historical backlog notes may still mention `2.13.12`.
84
84
  - This item validates the package/import boundary, not every higher-level deployment profile that Gateway may choose.
85
85
 
@@ -0,0 +1,177 @@
1
+ # 027 Runtime Durable Bloc Prompt-Cache Facade
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-20
5
+ - Status: Completed
6
+ - Completed: 2026-05-20
7
+ - Origin: promoted from `proposed/2026-05-20_runtime_durable_bloc_prompt_cache_facade.md`
8
+
9
+ ## Goal
10
+
11
+ Give hosts a public Runtime-owned path for durable AbstractCore bloc/KV
12
+ prompt-cache operations and make normal Runtime `LLM_CALL` execution binding
13
+ aware, so apps can use exact prompt-cache reuse across restarts without
14
+ reaching into Core or provider internals.
15
+
16
+ ## What Shipped
17
+
18
+ - Extended `AbstractCoreHostFacade` with durable bloc/KV methods:
19
+ - `upsert_text_bloc(...)`
20
+ - `get_bloc_record(...)`
21
+ - `get_bloc_kv_manifest(...)`
22
+ - `ensure_bloc_kv_artifact(...)`
23
+ - `load_bloc_kv_artifact(...)`
24
+ - Wired those methods through local, multi-local, remote, and hybrid
25
+ AbstractCore Runtime clients.
26
+ - Forwarded `prompt_cache_binding` through remote Runtime execution.
27
+ - Made Runtime `LLM_CALL` key injection binding-aware:
28
+ - normalize `expected_prompt_cache_binding` to `prompt_cache_binding`
29
+ - adopt `binding.key` when no explicit key is supplied
30
+ - fail fast on mismatched explicit key vs binding key
31
+ - skip derived session-key injection when a binding is present
32
+ - Added an explicit local Runtime bloc-root policy:
33
+ - default local root: `~/.abstractruntime/blocs`
34
+ - default file-runtime root: `<base_dir>/blocs`
35
+ - optional `bloc_root_dir=...` override
36
+ - Raised the AbstractCore dependency floor to `2.13.22`.
37
+
38
+ ## Current Code Pointers
39
+
40
+ - `src/abstractruntime/integrations/abstractcore/host_facade.py`
41
+ - `src/abstractruntime/integrations/abstractcore/llm_client.py`
42
+ - `src/abstractruntime/integrations/abstractcore/effect_handlers.py`
43
+ - `src/abstractruntime/integrations/abstractcore/factory.py`
44
+ - `tests/test_abstractcore_host_facade.py`
45
+ - `tests/test_prompt_cache_modules.py`
46
+ - `tests/test_remote_llm_client.py`
47
+ - `tests/test_packaging_extras.py`
48
+ - `docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md`
49
+
50
+ ## Validation
51
+
52
+ Focused validation run on 2026-05-20:
53
+
54
+ - `pytest -q tests/test_abstractcore_host_facade.py tests/test_remote_llm_client.py tests/test_prompt_cache_modules.py tests/test_packaging_extras.py`
55
+ - Result: `40 passed in 0.16s`
56
+
57
+ Broader regression slice:
58
+
59
+ - `pytest -q tests/test_abstractcore_discovery_facade.py tests/test_abstractcore_host_facade.py tests/test_abstractcore_run_facade.py tests/test_model_residency_control_plane.py tests/test_multimodal_abstractcore_integration.py tests/test_remote_llm_client.py tests/test_prompt_cache_modules.py tests/test_packaging_extras.py tests/test_runtime_install_boundary.py`
60
+ - Result: `108 passed in 0.37s`
61
+
62
+ Additional validation:
63
+
64
+ - `python -m py_compile src/abstractruntime/integrations/abstractcore/llm_client.py src/abstractruntime/integrations/abstractcore/host_facade.py src/abstractruntime/integrations/abstractcore/factory.py src/abstractruntime/integrations/abstractcore/effect_handlers.py tests/test_abstractcore_host_facade.py tests/test_prompt_cache_modules.py tests/test_remote_llm_client.py tests/test_packaging_extras.py`
65
+ - Result: clean
66
+
67
+ Practical proof points from the shipped tests:
68
+
69
+ - Remote Runtime now forwards `prompt_cache_binding` in chat-generation
70
+ requests and preserves the exact binding payload.
71
+ - Remote Runtime omits local loaded-runtime selectors when bloc/KV calls are
72
+ explicitly proxied with `base_url=...`.
73
+ - Local Runtime bloc helpers use the Runtime-owned bloc root and return
74
+ structured artifact metadata including `prompt_cache_binding`.
75
+ - Binding-aware execution accepts binding-only requests, preserves matching
76
+ explicit keys, rejects mismatches before provider execution, and does not
77
+ derive a competing session key for keyless bindings.
78
+
79
+ ## Completion report
80
+
81
+ ### Date
82
+
83
+ 2026-05-20
84
+
85
+ ### Summary
86
+
87
+ Runtime now owns the app-facing durable bloc prompt-cache boundary for
88
+ AbstractCore-backed hosts. Hosts can create or read durable blocs, ensure or
89
+ load KV artifacts, and then execute ordinary `LLM_CALL`s with a
90
+ `prompt_cache_binding` through Runtime rather than relying on provider-private
91
+ snapshot hacks.
92
+
93
+ ### Behavior changes
94
+
95
+ - `get_abstractcore_host_facade(runtime)` is now the public Runtime surface for
96
+ durable bloc/KV prompt-cache operations in addition to normal prompt-cache
97
+ control and model residency.
98
+ - Remote Runtime no longer drops `prompt_cache_binding`.
99
+ - Local Runtime no longer injects or mutates a competing session cache key when
100
+ a durable binding is present.
101
+ - File-backed local runtimes now default bloc storage under `<base_dir>/blocs`
102
+ instead of implicitly inheriting Core defaults.
103
+
104
+ ### Review and refinement cycles
105
+
106
+ - Cycle 1: design review pushed three improvements before closeout:
107
+ - keep the work inside the existing host facade instead of adding a fourth
108
+ public facade
109
+ - define an explicit Runtime-owned bloc root policy instead of inheriting
110
+ Core defaults silently
111
+ - make `LLM_CALL` execution binding-aware, not just host-control aware
112
+ - Refinements shipped:
113
+ - extended `AbstractCoreHostFacade`
114
+ - added explicit local/file-runtime bloc-root defaults
115
+ - normalized and enforced binding precedence in effect handling
116
+ - Cycle 2: broader regression and compatibility review found one meaningful
117
+ issue:
118
+ - `MultiLocalAbstractCoreLLMClient` could break monkeypatched or older test
119
+ doubles that do not accept the new `bloc_root_dir` constructor kwarg
120
+ - Final refinement shipped:
121
+ - added a narrow compatibility fallback in `_get_client(...)` for local
122
+ client call sites that reject only the new `bloc_root_dir` kwarg
123
+ - Cycle 3: independent implementation review found one real remote-path
124
+ blocker plus two coverage gaps:
125
+ - remote bloc/KV proxy calls must not carry local selector fields when
126
+ `base_url` is supplied
127
+ - the direct-client `expected_prompt_cache_binding` alias path needed its own
128
+ regression
129
+ - the primary `MultiLocal` local deployment path and keyless-binding
130
+ precedence needed direct coverage
131
+ - Final refinements shipped:
132
+ - `base_url` now wins cleanly for remote bloc/KV proxy calls
133
+ - direct client binding-alias normalization is covered and aligned with
134
+ Runtime semantics
135
+ - tests now cover the factory/local `MultiLocal` durable-bloc path and the
136
+ keyless-binding no-derived-key rule
137
+ - Final blocker-only review reported no blockers.
138
+
139
+ ### Tests
140
+
141
+ - `tests/test_abstractcore_host_facade.py`
142
+ - `tests/test_prompt_cache_modules.py`
143
+ - `tests/test_remote_llm_client.py`
144
+ - `tests/test_packaging_extras.py`
145
+ - regression coverage alongside:
146
+ - `tests/test_abstractcore_discovery_facade.py`
147
+ - `tests/test_abstractcore_run_facade.py`
148
+ - `tests/test_model_residency_control_plane.py`
149
+ - `tests/test_multimodal_abstractcore_integration.py`
150
+ - `tests/test_runtime_install_boundary.py`
151
+
152
+ ### Docs
153
+
154
+ - `README.md`
155
+ - `docs/README.md`
156
+ - `docs/getting-started.md`
157
+ - `docs/integrations/abstractcore.md`
158
+ - `docs/api.md`
159
+ - `docs/faq.md`
160
+ - `llms.txt`
161
+ - `llms-full.txt`
162
+ - `docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md`
163
+
164
+ ### Residual risks
165
+
166
+ - This repo now provides the Runtime-side durable bloc contract, but sibling
167
+ hosts still need to adopt it instead of provider-private snapshot flows where
168
+ those still exist.
169
+ - Provider-native snapshot save/load remains a separate local-admin concern and
170
+ should not be confused with the primary durable bloc contract.
171
+
172
+ ### Follow-ups
173
+
174
+ - Evaluate whether Gateway should expose app-facing durable bloc routes on top
175
+ of this Runtime surface.
176
+ - Keep the separate local-admin snapshot item proposed until there is a real
177
+ operator need beyond durable bloc/KV/binding reuse.