AbstractRuntime 0.4.23__tar.gz → 0.4.25__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 (340) hide show
  1. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/.github/workflows/ci.yml +3 -0
  2. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/.github/workflows/release.yml +3 -0
  3. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/CHANGELOG.md +29 -1
  4. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/PKG-INFO +12 -12
  5. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/README.md +4 -4
  6. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/README.md +1 -1
  7. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/api.md +7 -7
  8. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/architecture.md +3 -3
  9. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/faq.md +6 -3
  10. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/getting-started.md +1 -1
  11. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/integrations/abstractcore.md +71 -8
  12. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/troubleshooting.md +2 -3
  13. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/llms-full.txt +6 -6
  14. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/llms.txt +7 -7
  15. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/pyproject.toml +8 -8
  16. abstractruntime-0.4.25/release-notes.md +9 -0
  17. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/runtime.py +190 -1
  18. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -1
  19. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +20 -2
  20. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/llm_client.py +373 -9
  21. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
  22. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/run_facade.py +47 -1
  23. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/artifacts.py +12 -0
  24. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/compiler.py +16 -1
  25. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/executor.py +113 -0
  26. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_abstractcore_run_facade.py +137 -0
  27. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_artifacts.py +20 -0
  28. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_media_artifact_resolution.py +33 -0
  29. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_model_residency_control_plane.py +10 -0
  30. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_multimodal_abstractcore_integration.py +248 -7
  31. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_packaging_extras.py +7 -7
  32. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_media_nodes.py +77 -1
  33. abstractruntime-0.4.23/release-notes.md +0 -9
  34. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/.gitignore +0 -0
  35. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/ACKNOWLEDGMENTS.md +0 -0
  36. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/CODE_OF_CONDUCT.md +0 -0
  37. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/CONTRIBUTING.md +0 -0
  38. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/LICENSE +0 -0
  39. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/ROADMAP.md +0 -0
  40. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/SECURITY.md +0 -0
  41. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  42. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  43. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  44. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  45. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  46. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  47. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  48. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/adr/README.md +0 -0
  49. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/README.md +0 -0
  50. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  51. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  52. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  53. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  54. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  55. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  56. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  57. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  58. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/003_wait_primitives.md +0 -0
  59. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  60. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  61. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  62. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  63. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  64. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/009_artifact_store.md +0 -0
  65. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  66. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  67. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  68. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  69. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  70. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  71. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  72. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  73. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  74. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  75. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  76. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  77. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  78. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  79. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  80. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  81. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  82. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  83. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  84. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  85. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  86. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  87. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  88. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_tests.md +0 -0
  89. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  90. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  91. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  92. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  93. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/README.md +0 -0
  94. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  95. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  96. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  97. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  98. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  99. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  100. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  101. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  102. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  103. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/evidence.md +0 -0
  104. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/limits.md +0 -0
  105. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/manual_testing.md +0 -0
  106. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/mcp-worker.md +0 -0
  107. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/proposal.md +0 -0
  108. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/provenance.md +0 -0
  109. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/snapshots.md +0 -0
  110. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/tools-comms.md +0 -0
  111. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/docs/workflow-bundles.md +0 -0
  112. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/emails.config.example.yaml +0 -0
  113. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/01_hello_world.py +0 -0
  114. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/02_ask_user.py +0 -0
  115. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/03_wait_until.py +0 -0
  116. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/04_multi_step.py +0 -0
  117. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/05_persistence.py +0 -0
  118. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/06_llm_integration.py +0 -0
  119. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/07_react_agent.py +0 -0
  120. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/examples/README.md +0 -0
  121. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/mkdocs.yml +0 -0
  122. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/pytest.ini +0 -0
  123. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/__init__.py +0 -0
  124. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/__init__.py +0 -0
  125. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/config.py +0 -0
  126. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/event_keys.py +0 -0
  127. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/models.py +0 -0
  128. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/policy.py +0 -0
  129. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/run_lifecycle.py +0 -0
  130. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/spec.py +0 -0
  131. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/core/vars.py +0 -0
  132. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/evidence/__init__.py +0 -0
  133. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/evidence/recorder.py +0 -0
  134. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/history_bundle.py +0 -0
  135. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/identity/__init__.py +0 -0
  136. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/identity/fingerprint.py +0 -0
  137. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/__init__.py +0 -0
  138. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  139. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  140. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  141. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  142. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  143. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  144. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  145. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  146. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  147. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  148. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  149. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  150. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  151. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  152. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  153. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  154. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  155. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  156. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  157. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/__init__.py +0 -0
  158. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_context.py +0 -0
  159. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_memory.py +0 -0
  160. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/compaction.py +0 -0
  161. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/kg_packets.py +0 -0
  162. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/memact_composer.py +0 -0
  163. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/recall_levels.py +0 -0
  164. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/memory/token_budget.py +0 -0
  165. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/rendering/__init__.py +0 -0
  166. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  167. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/rendering/json_stringify.py +0 -0
  168. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/__init__.py +0 -0
  169. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/convenience.py +0 -0
  170. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/registry.py +0 -0
  171. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/scheduler.py +0 -0
  172. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/__init__.py +0 -0
  173. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/base.py +0 -0
  174. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/commands.py +0 -0
  175. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/in_memory.py +0 -0
  176. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/json_files.py +0 -0
  177. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/ledger_chain.py +0 -0
  178. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/observable.py +0 -0
  179. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/offloading.py +0 -0
  180. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/snapshots.py +0 -0
  181. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/storage/sqlite.py +0 -0
  182. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  183. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  184. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  185. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  186. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  187. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  188. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  189. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  190. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  191. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  192. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  193. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  194. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  195. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  196. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  197. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  198. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  199. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  200. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  201. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  202. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/models.py +0 -0
  203. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  204. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  205. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  206. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/README.md +0 -0
  207. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/conftest.py +0 -0
  208. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_abstractcore_comms_facade.py +0 -0
  209. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_abstractcore_discovery_facade.py +0 -0
  210. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_abstractcore_host_facade.py +0 -0
  211. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_abstractcore_telegram_facade.py +0 -0
  212. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_active_context_policy.py +0 -0
  213. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_active_memory.py +0 -0
  214. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_answer_user_effect.py +0 -0
  215. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_chat_summarizer_integration.py +0 -0
  216. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_command_store.py +0 -0
  217. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_compaction_helpers.py +0 -0
  218. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_control_adapter_while.py +0 -0
  219. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_default_tools_comms_gating.py +0 -0
  220. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_files.py +0 -0
  221. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_folders.py +0 -0
  222. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_default_tools_search_files_executor.py +0 -0
  223. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_durable_toolsets.py +0 -0
  224. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  225. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_emit_event_without_workflow_registry.py +0 -0
  226. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_evidence_recorder.py +0 -0
  227. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  228. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_integration_abstractcore.py +0 -0
  229. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_integrations_abstractcore.py +0 -0
  230. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_json_file_run_store_children_index.py +0 -0
  231. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_jsonl_ledger_recovery.py +0 -0
  232. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_kg_learn_and_recall_contract.py +0 -0
  233. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_ledger_chain.py +0 -0
  234. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_ledger_subscription.py +0 -0
  235. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs.py +0 -0
  236. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  237. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  238. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_requires_prompt.py +0 -0
  239. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_response_schema_normalization.py +0 -0
  240. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_structured_output_fallback.py +0 -0
  241. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  242. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  243. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  244. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_client_media_artifacts.py +0 -0
  245. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_client_system_context.py +0 -0
  246. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_llm_client_tool_call_parsing.py +0 -0
  247. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  248. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_mcp_remote_tool_executor.py +0 -0
  249. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_mcp_worker_logging.py +0 -0
  250. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_mcp_worker_security.py +0 -0
  251. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_mcp_worker_stdio.py +0 -0
  252. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memact_composer_from_kg_result.py +0 -0
  253. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  254. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_packets.py +0 -0
  255. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  256. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  257. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  258. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  259. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_note_effect.py +0 -0
  260. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_query_effect.py +0 -0
  261. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_query_rich_filters.py +0 -0
  262. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  263. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_memory_tag_effect.py +0 -0
  264. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_mlx_generation_serialization.py +0 -0
  265. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_offloading.py +0 -0
  266. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_pause_resume.py +0 -0
  267. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_prompt_cache_export_import.py +0 -0
  268. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_prompt_cache_modules.py +0 -0
  269. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_queryable_run_store.py +0 -0
  270. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  271. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_real_integration.py +0 -0
  272. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_recall_levels_policy.py +0 -0
  273. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_remote_llm_client.py +0 -0
  274. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_rendering_agent_trace_report.py +0 -0
  275. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_rendering_json_stringify.py +0 -0
  276. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_retry_idempotency.py +0 -0
  277. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_run_history_bundle.py +0 -0
  278. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  279. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_effect_invocation_trace.py +0 -0
  280. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_install_boundary.py +0 -0
  281. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  282. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_node_traces.py +0 -0
  283. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  284. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_scheduler.py +0 -0
  285. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  286. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_snapshots.py +0 -0
  287. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_sqlite_ledger_store.py +0 -0
  288. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_start_subworkflow_async_wait.py +0 -0
  289. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  290. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  291. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_storage_deletion.py +0 -0
  292. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_structured_output_schema_enum.py +0 -0
  293. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_subworkflow.py +0 -0
  294. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_terminal_effect_completion.py +0 -0
  295. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  296. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  297. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_approval_executor.py +0 -0
  298. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_approval_resume_executes.py +0 -0
  299. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_calls_idempotency_keys.py +0 -0
  300. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_argument_sanitization.py +0 -0
  301. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_error_output_detection.py +0 -0
  302. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_filename_alias.py +0 -0
  303. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  304. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_read_file_aliases.py +0 -0
  305. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_executor_timeout.py +0 -0
  306. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_tool_wait_allowlist_safety.py +0 -0
  307. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_trace_context_propagation.py +0 -0
  308. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_vars_query_effect.py +0 -0
  309. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  310. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  311. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  312. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  313. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  314. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  315. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_memact_compose_node.py +0 -0
  316. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  317. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  318. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  319. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_builtin.py +0 -0
  320. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  321. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_call_tool_node.py +0 -0
  322. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_compiler_basic.py +0 -0
  323. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  324. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_get_element_node.py +0 -0
  325. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_get_random_element_node.py +0 -0
  326. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_has_tools_builtin.py +0 -0
  327. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  328. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  329. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_make_object_node.py +0 -0
  330. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  331. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_memory_source_pins.py +0 -0
  332. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_prompt_only.py +0 -0
  333. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_random_nodes.py +0 -0
  334. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_string_contains_replace.py +0 -0
  335. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_visualflow_tool_parameters_node.py +0 -0
  336. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_wait_event_prompt_metadata.py +0 -0
  337. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_workflow_bundle_registry.py +0 -0
  338. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  339. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  340. {abstractruntime-0.4.23 → abstractruntime-0.4.25}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -40,6 +40,9 @@ jobs:
40
40
  tests/test_remote_llm_client.py \
41
41
  tests/test_prompt_cache_modules.py \
42
42
  tests/test_multimodal_abstractcore_integration.py \
43
+ tests/test_abstractcore_run_facade.py \
44
+ tests/test_visualflow_media_nodes.py \
45
+ tests/test_model_residency_control_plane.py \
43
46
  tests/test_visualflow_llm_call_multimodal_output.py \
44
47
  tests/test_visual_multi_entry_loop_overrides.py \
45
48
  tests/test_control_adapter_while.py \
@@ -55,6 +55,9 @@ jobs:
55
55
  tests/test_remote_llm_client.py \
56
56
  tests/test_prompt_cache_modules.py \
57
57
  tests/test_multimodal_abstractcore_integration.py \
58
+ tests/test_abstractcore_run_facade.py \
59
+ tests/test_visualflow_media_nodes.py \
60
+ tests/test_model_residency_control_plane.py \
58
61
  tests/test_visualflow_llm_call_multimodal_output.py \
59
62
  tests/test_visual_multi_entry_loop_overrides.py \
60
63
  tests/test_control_adapter_while.py \
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.25] - 2026-05-29
11
+
12
+ ### Added
13
+ - File-backed artifact stores now expose `content_path(...)` for hosts that need a stable local path while in-memory stores continue to return `None`.
14
+
15
+ ### Changed
16
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.30` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core media/plugin floors and image-to-image residency truth.
17
+
18
+ ### Fixed
19
+ - Artifact-backed media resolution now preserves image roles such as `source` and `mask`, keeping image-edit and image-to-video requests wired correctly through AbstractCore.
20
+ - Model-residency discovery now treats `image_to_image` as its own vision task and deduplicates shared loaded-model records when task is omitted.
21
+
22
+ ## [0.4.24] - 2026-05-26
23
+
24
+ ### Added
25
+ - Runtime now surfaces AbstractCore/AbstractVision video generation through the existing generated-media boundary:
26
+ - `LLM_CALL` output selectors for `{"modality":"video","task":"text_to_video"}` and `{"modality":"video","task":"image_to_video"}`
27
+ - remote Core Server routing for `/v1/videos/generations` and `/v1/videos/edits`
28
+ - durable run-facade helpers `generate_video(...)` and `image_to_video(...)`
29
+ - VisualFlow node lowering for `generate_video` / `text_to_video` and `image_to_video`
30
+ - Provider progress callbacks are converted into JSON-safe `abstract.progress` ledger events during `LLM_CALL` execution without persisting Python callback objects.
31
+
32
+ ### Changed
33
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.29` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with Core video endpoints, video residency tasks, and AbstractVision 0.3.16 progress-capable generation.
34
+ - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document text-to-video, image-to-video, and generated-media progress events.
35
+
10
36
  ## [0.4.23] - 2026-05-26
11
37
 
12
38
  ### Added
@@ -544,7 +570,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
544
570
 
545
571
  Initial development version with basic proof-of-concept features.
546
572
 
547
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...HEAD
573
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.25...HEAD
574
+ [0.4.25]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...v0.4.25
575
+ [0.4.24]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...v0.4.24
548
576
  [0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
549
577
  [0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
550
578
  [0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.23
3
+ Version: 0.4.25
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.28; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.30; 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.28; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.30; 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.28; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.30; 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.28; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.30; 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.28; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.30; 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.28; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.30; 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,music,remote,vision,voice]>=2.13.28; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.30; 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.23 • **Python:** 3.10+
84
+ **Version:** 0.4.25 • **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.28 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, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/TTS/STT, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`, including `abstractmusic>=0.1.12`).
118
+ The `abstractcore` extra installs AbstractCore 2.13.30 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, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
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.23)
172
+ ## What’s included (v0.4.25)
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, 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`
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/video/voice/music outputs with progress events, 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.23 • **Python:** 3.10+
7
+ **Version:** 0.4.25 • **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.28 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, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/TTS/STT, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`, including `abstractmusic>=0.1.12`).
41
+ The `abstractcore` extra installs AbstractCore 2.13.30 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, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
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.23)
95
+ ## What’s included (v0.4.25)
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, 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`
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/video/voice/music outputs with progress events, 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
@@ -26,7 +26,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
26
26
  - `faq.md` — common questions (recommended)
27
27
  - `troubleshooting.md` — symptom-oriented setup, runtime, and integration fixes
28
28
  - `manual_testing.md` — manual smoke tests and how to run the test suite
29
- - `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
29
+ - `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
30
30
  - `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
31
31
 
32
32
  ## Features (reference)
@@ -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/music/audio outputs are stored as artifact refs
128
+ - AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/video/voice/music/audio outputs are stored as artifact refs
129
129
 
130
130
  ## Snapshots / bookmarks
131
131
 
@@ -157,7 +157,7 @@ VisualFlow compiler helpers are available from `abstractruntime.visualflow_compi
157
157
  - `compile_visualflow(...)` and `compile_visualflow_tree(...)` compile VisualFlow JSON into executable `WorkflowSpec` objects.
158
158
 
159
159
  VisualFlow authoring note (media nodes):
160
- - Runtime recognizes first-class VisualFlow media nodes such as `generate_image`, `edit_image`, `image_to_image`, `generate_voice`, `generate_music`, `transcribe_audio`, and `listen_voice`.
160
+ - Runtime recognizes first-class VisualFlow media nodes such as `generate_image`, `edit_image`, `image_to_image`, `generate_video`, `text_to_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`, and `listen_voice`.
161
161
  - Generated-media and transcription nodes lower to a durable `EffectType.LLM_CALL` with an `output` selector (for example `{"modality":"music","task":"music_generation"}`), while `listen_voice` lowers to `WAIT_EVENT`. Hosts should persist the authoring node type rather than pre-lowering to `llm_call`.
162
162
 
163
163
  Public bundle APIs are exported from `src/abstractruntime/workflow_bundle/__init__.py` and re-exported in `src/abstractruntime/__init__.py`:
@@ -180,7 +180,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
180
180
 
181
181
  ### AbstractCore (LLM + tools)
182
182
 
183
- Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.28 or newer).
183
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.30 or newer).
184
184
 
185
185
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
186
186
 
@@ -197,7 +197,7 @@ Entry points:
197
197
  - 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`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
198
198
  - 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
199
199
  - host-facade email helpers delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
200
- - run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `edit_image`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
200
+ - run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `edit_image`, `generate_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
201
201
 
202
202
  `LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
203
203
  - `prompt`, `messages`, `system_prompt`, and convenience `text`
@@ -208,11 +208,11 @@ Entry points:
208
208
  Multimodal support:
209
209
  - install `abstractruntime[multimodal]` for common AbstractCore media, vision, voice, audio, and music dependencies
210
210
  - local clients call AbstractCore's unified `generate(..., media=..., output=...)`
211
- - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, 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
211
+ - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, text-to-video, image-to-video, 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
212
212
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
213
- - generated image/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
213
+ - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
214
214
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
215
- - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and image generation also reports `execution_mode="local_one_shot_subprocess"`
215
+ - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and generated image/video tasks also report `execution_mode="local_one_shot_subprocess"`
216
216
  - 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
217
217
 
218
218
  Prompt cache / cached sessions:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-05-23
4
- > Version: 0.4.23
4
+ > Version: 0.4.24
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, music generation, transcription, and future modalities such as 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, video generation, voice/audio generation, music generation, and transcription.
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.
@@ -169,7 +169,7 @@ Registered in `Runtime._register_builtin_handlers()` (`src/abstractruntime/core/
169
169
 
170
170
  ### Host-wired effects
171
171
  The kernel defines the protocol; concrete integrations provide handlers:
172
- - `LLM_CALL`, `TOOL_CALLS`, `MODEL_RESIDENCY`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, discovery/catalog snapshots, model residency, durable run-scoped media child runs, media inputs, generated media outputs, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
172
+ - `LLM_CALL`, `TOOL_CALLS`, `MODEL_RESIDENCY`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, discovery/catalog snapshots, model residency, durable run-scoped media child runs, media inputs, generated media outputs, provider progress callbacks as ledger events, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
173
173
  - `MEMORY_KG_*`: provided by the AbstractMemory bridge (`src/abstractruntime/integrations/abstractmemory/effect_handlers.py`)
174
174
 
175
175
  ### Reliability: retries + idempotency
@@ -90,21 +90,22 @@ Yes, when the configured AbstractCore provider/model supports the media. Pass `p
90
90
  Install `abstractruntime[multimodal]` for common media/vision/audio/music dependencies.
91
91
  Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/effect_handlers.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
92
92
 
93
- ## How do I generate images, voice/audio, or music?
93
+ ## How do I generate images, video, voice/audio, or music?
94
94
 
95
95
  Use `LLM_CALL` with AbstractCore's `output` selector:
96
96
 
97
97
  ```python
98
98
  {"text": "A red cube on a white table", "output": {"modality": "image", "format": "png"}}
99
+ {"text": "A logo reveal", "output": {"modality": "video", "task": "text_to_video", "provider": "mlx-gen", "model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers", "format": "mp4"}}
99
100
  {"text": "Hello from Runtime", "output": {"modality": "voice", "voice": "alloy", "format": "wav"}}
100
101
  {"text": "Warm lo-fi piano with brushed drums", "output": {"modality": "music", "provider": "acemusic", "model": "ace-step", "format": "wav"}}
101
102
  ```
102
103
 
103
- Generated bytes require a runtime `ArtifactStore`. The durable result contains `artifact_id` / `artifact_ref`, not inline binary data. Remote and hybrid runtimes support common AbstractCore Server endpoints for image generation, image edits, speech, music generation, transcription, and chat media. Local runtimes can use richer AbstractCore capability plugins for voice cloning, reference-guided generation, and local text-to-music when those AbstractCore capabilities are installed.
104
+ Generated bytes require a runtime `ArtifactStore`. The durable result contains `artifact_id` / `artifact_ref`, not inline binary data. Remote and hybrid runtimes support common AbstractCore Server endpoints for image generation, image edits, text-to-video, image-to-video, speech, music generation, transcription, and chat media. Local runtimes can use richer AbstractCore capability plugins for voice cloning, reference-guided generation, local text-to-music, and local video generation when those AbstractCore capabilities are installed.
104
105
 
105
106
  ## Does AbstractRuntime implement image, voice, music, or video engines?
106
107
 
107
- No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model, waits, and artifact boundary. AbstractCore provides the LLM/media generation and analysis capabilities. Music is already surfaced through that boundary with the same JSON-safe `output` selector plus artifact-backed result shape as image and voice. Video is still future work unless AbstractCore adds it and Runtime needs new workflow-level wait/effect semantics.
108
+ No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model, waits, and artifact boundary. AbstractCore provides the LLM/media generation and analysis capabilities. Image, video, voice, transcription, and music all flow through the same JSON-safe `output` selector plus artifact-backed result shape; Runtime does not implement provider engines itself.
108
109
 
109
110
  ## Where should cached session or prompt-cache state live?
110
111
 
@@ -283,6 +284,8 @@ Docs: `provenance.md`. Code: `src/abstractruntime/storage/ledger_chain.py`.
283
284
  If your `LedgerStore` supports subscriptions (or is wrapped with `ObservableLedgerStore`), you can subscribe in-process:
284
285
  - `Runtime.subscribe_ledger(callback, run_id=...)`
285
286
 
287
+ Long-running generated media uses the same ledger stream. Runtime converts provider progress callbacks into `EMIT_EVENT` ledger records named `abstract.progress` with JSON-safe payloads such as `phase`, `step`, `total_steps`, `frame`, `total_frames`, and `progress`.
288
+
286
289
  Docs: `architecture.md`. Code: `src/abstractruntime/core/runtime.py` (`subscribe_ledger`), `src/abstractruntime/storage/observable.py`.
287
290
 
288
291
  ## What is “evidence capture”?
@@ -18,7 +18,7 @@ Optional (LLM + tools via AbstractCore):
18
18
  pip install "abstractruntime[abstractcore]"
19
19
  ```
20
20
 
21
- This installs AbstractCore 2.13.28 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery. Use `abstractruntime[multimodal]` when your workflows need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`, including `abstractmusic>=0.1.12`).
21
+ This installs AbstractCore 2.13.30 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery. Use `abstractruntime[multimodal]` when your workflows need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
22
22
 
23
23
  ## Mental model (source of truth)
24
24
 
@@ -16,7 +16,7 @@ Implementation pointers (this repo):
16
16
  pip install "abstractruntime[abstractcore]"
17
17
  ```
18
18
 
19
- This extra installs AbstractCore 2.13.28 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery.
19
+ This extra installs AbstractCore 2.13.30 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery.
20
20
 
21
21
  For AbstractCore's multimodal `generate(..., output=...)` path, use the newer baseline and optional media packages:
22
22
 
@@ -24,7 +24,7 @@ For AbstractCore's multimodal `generate(..., output=...)` path, use the newer ba
24
24
  pip install "abstractruntime[multimodal]"
25
25
  ```
26
26
 
27
- This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`. Local image/voice/music generation still depends on the configured AbstractCore capability backends (for example AbstractVision, AbstractVoice, and AbstractMusic, or OpenAI/OpenAI-compatible remote engines). With `abstractmusic>=0.1.12`, the base music extra includes the lightweight remote ACE Music backend without local model-runtime extras.
27
+ This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`. Local image/video/voice/music generation still depends on the configured AbstractCore capability backends (for example AbstractVision, AbstractVoice, and AbstractMusic, or OpenAI/OpenAI-compatible remote engines). With `abstractmusic>=0.1.12`, the base music extra includes the lightweight remote ACE Music backend without local model-runtime extras.
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -101,7 +101,7 @@ print(state.output)
101
101
  "messages": [{"role": "user", "content": "..."}],
102
102
  "system_prompt": "...",
103
103
  "media": ["path/or/artifact-ref"],
104
- "output": {"modality": "text|image|voice|music", "task": "optional"},
104
+ "output": {"modality": "text|image|video|voice|music", "task": "optional"},
105
105
  "tools": [{"name": "...", "description": "...", "parameters": {...}}],
106
106
  "params": {
107
107
  "temperature": 0.0,
@@ -178,6 +178,48 @@ Effect(
178
178
  )
179
179
  ```
180
180
 
181
+ Generate video:
182
+
183
+ ```python
184
+ Effect(
185
+ type=EffectType.LLM_CALL,
186
+ payload={
187
+ "prompt": "Glowing data streams converge into a geometric logo.",
188
+ "output": {
189
+ "modality": "video",
190
+ "task": "text_to_video",
191
+ "provider": "mlx-gen",
192
+ "model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
193
+ "format": "mp4",
194
+ "num_frames": 41,
195
+ "fps": 24,
196
+ "steps": 10,
197
+ },
198
+ },
199
+ result_key="video_result",
200
+ )
201
+ ```
202
+
203
+ Image to video:
204
+
205
+ ```python
206
+ Effect(
207
+ type=EffectType.LLM_CALL,
208
+ payload={
209
+ "prompt": "Add a slow camera orbit.",
210
+ "media": {"$artifact": "source_image_artifact_id", "type": "image", "role": "source"},
211
+ "output": {
212
+ "modality": "video",
213
+ "task": "image_to_video",
214
+ "provider": "mlx-gen",
215
+ "model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
216
+ "format": "mp4",
217
+ },
218
+ },
219
+ result_key="video_result",
220
+ )
221
+ ```
222
+
181
223
  Transcribe/analyze audio:
182
224
 
183
225
  ```python
@@ -211,21 +253,23 @@ Generated binary media requires a runtime `ArtifactStore` and is stored there. T
211
253
  Media-only normalized results now distinguish orchestration identity from the actual media backend:
212
254
 
213
255
  - `runtime_provider` / `runtime_model`: the runtime-side orchestration identity, when relevant
214
- - `media_provider` / `media_model`: the actual image/voice/music backend identity surfaced from the generated output
256
+ - `media_provider` / `media_model`: the actual image/video/voice/music backend identity surfaced from the generated output
215
257
 
216
258
  For local one-shot subprocess image generation, runtime metadata also records `execution_mode="local_one_shot_subprocess"`.
217
259
 
218
- Remote runtimes support chat media by sending OpenAI-compatible data URL content arrays to AbstractCore Server. They also support image generation (`/v1/images/generations`), image edits (`/v1/images/edits` or `/{provider}/v1/images/edits`), TTS (`/v1/audio/speech`), music generation (`/v1/audio/music`), and STT (`/v1/audio/transcriptions`) with the same artifact-backed result shape. Remote media endpoint calls do not inherit the chat model by default; pass an output-specific `model` only when you want a remote provider/model instead of the server's configured capability default. Remote STT requires exactly one audio media item that resolves to a local file path or artifact-backed temporary file. Remote image edits require one source image media item and may include one mask item, both resolving to local paths or artifact-backed temporary files. For voice clone/register or reference-guided TTS, use local execution so AbstractCore can use its in-process capability dispatcher. Runtime does not import `abstractmusic` directly; local music support comes through the configured AbstractCore capability stack.
260
+ Long-running generated media may expose provider progress callbacks. Runtime injects a transient `on_progress` callback during `LLM_CALL` execution and persists each callback as an `EMIT_EVENT` ledger record named `abstract.progress`. The callback itself is never stored in the effect payload or run vars.
261
+
262
+ Remote runtimes support chat media by sending OpenAI-compatible data URL content arrays to AbstractCore Server. They also support image generation (`/v1/images/generations`), image edits (`/v1/images/edits` or `/{provider}/v1/images/edits`), text-to-video (`/v1/videos/generations`), image-to-video (`/v1/videos/edits` or `/{provider}/v1/videos/edits`), TTS (`/v1/audio/speech`), music generation (`/v1/audio/music`), and STT (`/v1/audio/transcriptions`) with the same artifact-backed result shape. Remote media endpoint calls do not inherit the chat model by default; pass an output-specific `model` only when you want a remote provider/model instead of the server's configured capability default. Remote STT requires exactly one audio media item that resolves to a local file path or artifact-backed temporary file. Remote image edits and image-to-video require one source image media item resolving to a local path or artifact-backed temporary file. For voice clone/register or reference-guided TTS, use local execution so AbstractCore can use its in-process capability dispatcher. Runtime does not import `abstractmusic` directly; local music support comes through the configured AbstractCore capability stack.
219
263
 
220
264
  Remote multimodal generation currently supports one `output` selector per `LLM_CALL`. Hybrid runtimes use the same remote LLM/media path as remote mode while executing tools locally. Local runtimes can use AbstractCore's in-process multimodal dispatcher for richer capability plugin behavior.
221
265
 
222
- Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `tts`, `stt`, and `music_generation` return:
266
+ Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` return:
223
267
 
224
268
  - `code="model_residency_unsupported"`
225
269
  - `requires_long_lived_server=true`
226
270
  - `config_hint` pointing to `ABSTRACTCORE_SERVER_BASE_URL`
227
271
 
228
- Image-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local image generation is isolated into one-shot workers unless a long-lived Core server owns the media backend.
272
+ Image/video-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local generated media can be isolated into one-shot workers unless a long-lived Core server owns the media backend.
229
273
 
230
274
  When the workflow marks residency as optional (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true` so hosts can render the no-op honestly.
231
275
 
@@ -665,6 +709,8 @@ Public durable entry points:
665
709
  - `resume_tool_calls(...)`
666
710
  - `generate_image(...)`
667
711
  - `edit_image(...)`
712
+ - `generate_video(...)`
713
+ - `image_to_video(...)`
668
714
  - `generate_voice(...)`
669
715
  - `generate_music(...)`
670
716
  - `transcribe_audio(...)`
@@ -687,7 +733,7 @@ facade = get_abstractcore_run_facade(rt)
687
733
  child = facade.generate_image(
688
734
  "existing-parent-run-id",
689
735
  prompt="A red mug on a white table.",
690
- output={"provider": "mlx-gen", "model": "flux2-klein-4b", "format": "png"},
736
+ output={"provider": "mlx-gen", "model": "AbstractFramework/flux.2-klein-4b-4bit", "format": "png"},
691
737
  )
692
738
 
693
739
  assert child.status.value == "completed"
@@ -695,6 +741,23 @@ result = child.output["result"]
695
741
  print(child.run_id, result["media_model"], result["outputs"]["image"][0]["artifact_id"])
696
742
  ```
697
743
 
744
+ For video, use the same child-run boundary:
745
+
746
+ ```python
747
+ child = facade.generate_video(
748
+ "existing-parent-run-id",
749
+ prompt="Glowing data streams converge into a geometric logo.",
750
+ output={
751
+ "provider": "mlx-gen",
752
+ "model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
753
+ "format": "mp4",
754
+ "num_frames": 41,
755
+ },
756
+ )
757
+
758
+ print(child.run_id, child.output["result"]["outputs"]["video"][0]["artifact_id"])
759
+ ```
760
+
698
761
  Outbound comms sends that belong to a run should use the same durable child-run surface:
699
762
 
700
763
  ```python
@@ -21,7 +21,7 @@ Fix:
21
21
  - `abstractruntime[abstractcore]` for LLM/tools integration.
22
22
  - `abstractruntime[multimodal]` for common image, voice, audio, and music dependencies.
23
23
  - `abstractruntime[mcp-worker]` for the MCP worker entry point.
24
- - The current AbstractCore integration expects `abstractcore>=2.13.28`.
24
+ - The current AbstractCore integration expects `abstractcore>=2.13.30`.
25
25
 
26
26
  Verify:
27
27
 
@@ -84,7 +84,7 @@ Docs:
84
84
  ## Local media residency returns `model_residency_unsupported`
85
85
 
86
86
  Symptom:
87
- - A local `MODEL_RESIDENCY` load for `image_generation`, `tts`, `stt`, or `music_generation` returns `ok=false` with
87
+ - A local `MODEL_RESIDENCY` load for `image_generation`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, or `music_generation` returns `ok=false` with
88
88
  `code="model_residency_unsupported"`.
89
89
 
90
90
  Meaning:
@@ -133,4 +133,3 @@ abstractruntime-mcp-worker --help
133
133
 
134
134
  Docs:
135
135
  - `mcp-worker.md`
136
-
@@ -10,11 +10,11 @@ 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.23
13
+ - Version: 0.4.25
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
- - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.28`
17
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`
16
+ - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
18
18
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned env/config should be translated into explicit Runtime inputs or Runtime-owned env names.
19
19
 
20
20
  ```mermaid
@@ -204,7 +204,7 @@ What you get:
204
204
  - prompt-cache control methods and durable bloc/KV helpers on local/multi-local/remote LLM clients
205
205
  - cached-session/prompt-cache routing through stable runtime keys; provider cache objects stay inside AbstractCore clients
206
206
  - media input analysis and transcription via `LLM_CALL.media`
207
- - generated image, voice/audio, and music outputs via AbstractCore's unified `generate(..., output=...)` selector
207
+ - generated image, video, voice/audio, and music outputs via AbstractCore's unified `generate(..., output=...)` selector
208
208
  - generated binary outputs require a runtime ArtifactStore and are normalized to ArtifactStore refs instead of inline bytes
209
209
  - hardened remote provider-key routing: server auth uses `Authorization`, provider overrides use `X-AbstractCore-Provider-API-Key`
210
210
  - optional MCP worker entrypoint (`abstractruntime-mcp-worker`)
@@ -304,7 +304,7 @@ Result shape for generated media is JSON-safe:
304
304
  }
305
305
  ```
306
306
 
307
- Boundary rule: AbstractRuntime is the durable graph runner. It does not implement image, voice, music, or video model engines. AbstractCore owns provider capability plugins and server endpoints; Runtime carries JSON-safe requests, persists checkpoints/ledger entries, materializes input artifact refs for provider calls, and stores generated bytes as artifacts. Music already follows the same `output` selector + ArtifactStore result shape as image and voice. Video remains future work unless Runtime needs a new workflow-level wait/effect semantic.
307
+ Boundary rule: AbstractRuntime is the durable graph runner. It does not implement image, video, voice, music, or transcription model engines. AbstractCore owns provider capability plugins and server endpoints; Runtime carries JSON-safe requests, persists checkpoints/ledger entries, materializes input artifact refs for provider calls, stores generated bytes as artifacts, and records provider progress callbacks as `abstract.progress` ledger events.
308
308
 
309
309
  Remote multimodal guardrails:
310
310
  - remote/hybrid media generation uses AbstractCore Server endpoints, not the local AbstractCore capability dispatcher
@@ -383,7 +383,7 @@ Durability and distribution:
383
383
  - `docs/evidence.md`: artifact-backed evidence capture for boundary tools
384
384
  - `docs/snapshots.md`: snapshot/bookmark model
385
385
  - `docs/workflow-bundles.md`: `.flow` bundle format, VisualFlow distribution, and concrete multi-entry fan-in metadata
386
- - VisualFlow media nodes (`generate_image`, `edit_image`/`image_to_image`, `generate_voice`, `generate_music`, `transcribe_audio`) compile to `LLM_CALL` with an `output` selector, while `listen_voice` compiles to `WAIT_EVENT` (persist the authoring node type; no client-side lowering required).
386
+ - VisualFlow media nodes (`generate_image`, `edit_image`/`image_to_image`, `generate_video`/`text_to_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`) compile to `LLM_CALL` with an `output` selector, while `listen_voice` compiles to `WAIT_EVENT` (persist the authoring node type; no client-side lowering required).
387
387
  - VisualFlow multi-entry fan-in is lowered into internal `join_exec` and `path_mux` nodes when authoring JSON uses `entryRoutes` and `inputRouteOverrides`.
388
388
 
389
389
  ## VisualFlow multi-entry fan-in (LLM authoring note)
@@ -3,11 +3,11 @@
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.23
6
+ - Version: 0.4.25
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
- - Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.28`
10
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.28`
9
+ - Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
10
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
11
11
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names.
12
12
 
13
13
  ## Start here
@@ -35,14 +35,14 @@
35
35
 
36
36
  ## Integrations
37
37
 
38
- - [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/edit-image/voice/music/STT execution, media inputs, generated media outputs, provider-key headers, and tool approval waits
39
- - Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort text/chat 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. Runtime does not auto-derive prompt-cache keys for image/voice/music/STT output selectors. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
38
+ - [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/edit-image/text-to-video/image-to-video/voice/music/STT execution, media inputs, generated media outputs, progress ledger events, provider-key headers, and tool approval waits
39
+ - Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort text/chat 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. Runtime does not auto-derive prompt-cache keys for image/video/voice/music/STT output selectors. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
40
40
  - 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.
41
41
  - Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, and `get_abstractcore_run_facade(...)`
42
42
  - 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.
43
43
  - Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
44
44
  - [Artifacts](docs/api.md#artifacts-store-by-reference): JSON-safe refs for large payloads; generated images/audio/voice/music are stored here rather than embedded in `RunState.vars`
45
- - Remote multimodal guardrail: remote/hybrid media generation uses AbstractCore Server endpoints, does not inherit the chat model for media endpoints, routes image edits through Core `/images/edits`, rejects unsupported input media and non-file STT inputs instead of ignoring them, and redacts data URLs from persisted provider-request metadata
45
+ - Remote multimodal guardrail: remote/hybrid media generation uses AbstractCore Server endpoints, does not inherit the chat model for media endpoints, routes image edits through Core `/images/edits`, routes video generation through Core `/videos/*`, rejects unsupported input media and non-file STT inputs instead of ignoring them, and redacts data URLs from persisted provider-request metadata
46
46
  - [MCP worker](docs/mcp-worker.md): `abstractruntime-mcp-worker` CLI (stdio/HTTP)
47
47
  - [Comms toolset](docs/tools-comms.md): opt-in email/WhatsApp/Telegram gating
48
48
 
@@ -55,7 +55,7 @@
55
55
  ## Distribution
56
56
 
57
57
  - [WorkflowBundles](docs/workflow-bundles.md): `.flow` bundle format, VisualFlow compilation, concrete multi-entry fan-in metadata, and shared/framework registry directory resolution
58
- - VisualFlow media nodes: `generate_image`, `edit_image`/`image_to_image`, `generate_voice`, `generate_music`, and `transcribe_audio` compile to `LLM_CALL` with an `output` selector; `listen_voice` compiles to `WAIT_EVENT` (no client-side lowering required)
58
+ - VisualFlow media nodes: `generate_image`, `edit_image`/`image_to_image`, `generate_video`/`text_to_video`, `image_to_video`, `generate_voice`, `generate_music`, and `transcribe_audio` compile to `LLM_CALL` with an `output` selector; `listen_voice` compiles to `WAIT_EVENT` (no client-side lowering required)
59
59
  - [VisualFlow compiler](docs/architecture.md): lowers multi-entry `entryRoutes` / `inputRouteOverrides` into internal `join_exec` / `path_mux` nodes
60
60
 
61
61
  ## Maintainers