AbstractRuntime 0.4.22__tar.gz → 0.4.24__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.22 → abstractruntime-0.4.24}/.github/workflows/ci.yml +3 -0
  2. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/.github/workflows/release.yml +3 -0
  3. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CHANGELOG.md +29 -1
  4. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/PKG-INFO +12 -12
  5. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/README.md +4 -4
  6. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/README.md +1 -1
  7. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/api.md +7 -7
  8. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/architecture.md +3 -3
  9. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/README.md +2 -1
  10. abstractruntime-0.4.24/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +53 -0
  11. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +28 -4
  12. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/faq.md +6 -3
  13. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/getting-started.md +1 -1
  14. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/integrations/abstractcore.md +71 -8
  15. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/troubleshooting.md +2 -3
  16. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/llms-full.txt +6 -6
  17. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/llms.txt +7 -7
  18. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/pyproject.toml +11 -8
  19. abstractruntime-0.4.24/release-notes.md +11 -0
  20. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/__init__.py +5 -1
  21. abstractruntime-0.4.24/src/abstractruntime/core/run_lifecycle.py +91 -0
  22. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/runtime.py +245 -1
  23. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +29 -0
  24. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +153 -4
  25. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +28 -2
  26. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/llm_client.py +1515 -137
  27. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
  28. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/run_facade.py +47 -1
  29. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/__init__.py +3 -1
  30. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/base.py +20 -0
  31. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/commands.py +61 -1
  32. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/in_memory.py +14 -0
  33. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/json_files.py +27 -0
  34. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/ledger_chain.py +10 -1
  35. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/observable.py +6 -0
  36. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/offloading.py +15 -0
  37. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/sqlite.py +38 -1
  38. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +9 -1
  39. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/compiler.py +92 -3
  40. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +102 -1
  41. abstractruntime-0.4.24/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +53 -0
  42. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/executor.py +276 -19
  43. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_discovery_facade.py +181 -2
  44. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_run_facade.py +137 -0
  45. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_model_residency_control_plane.py +441 -45
  46. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_multimodal_abstractcore_integration.py +305 -7
  47. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_packaging_extras.py +7 -7
  48. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_queryable_run_store.py +30 -0
  49. abstractruntime-0.4.24/tests/test_runtime_effect_invocation_trace.py +45 -0
  50. abstractruntime-0.4.24/tests/test_storage_deletion.py +119 -0
  51. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_media_nodes.py +60 -0
  52. abstractruntime-0.4.22/release-notes.md +0 -6
  53. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/.gitignore +0 -0
  54. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/ACKNOWLEDGMENTS.md +0 -0
  55. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CODE_OF_CONDUCT.md +0 -0
  56. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CONTRIBUTING.md +0 -0
  57. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/LICENSE +0 -0
  58. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/ROADMAP.md +0 -0
  59. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/SECURITY.md +0 -0
  60. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  61. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  62. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  63. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  64. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  65. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  66. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  67. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/README.md +0 -0
  68. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  69. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  70. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  71. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  72. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  73. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  74. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  75. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  76. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/003_wait_primitives.md +0 -0
  77. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  78. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  79. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  80. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  81. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/009_artifact_store.md +0 -0
  82. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  83. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  84. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  85. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  86. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  87. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  88. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  89. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  90. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  91. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  92. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  93. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  94. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  95. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  96. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  97. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  98. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  99. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  100. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  101. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  102. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  103. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  104. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  105. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/004_tests.md +0 -0
  106. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  107. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  108. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  109. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  110. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/README.md +0 -0
  111. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  112. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  113. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  114. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  115. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  116. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  117. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  118. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  119. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/evidence.md +0 -0
  120. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/limits.md +0 -0
  121. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/manual_testing.md +0 -0
  122. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/mcp-worker.md +0 -0
  123. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/proposal.md +0 -0
  124. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/provenance.md +0 -0
  125. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/snapshots.md +0 -0
  126. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/tools-comms.md +0 -0
  127. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/workflow-bundles.md +0 -0
  128. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/emails.config.example.yaml +0 -0
  129. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/01_hello_world.py +0 -0
  130. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/02_ask_user.py +0 -0
  131. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/03_wait_until.py +0 -0
  132. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/04_multi_step.py +0 -0
  133. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/05_persistence.py +0 -0
  134. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/06_llm_integration.py +0 -0
  135. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/07_react_agent.py +0 -0
  136. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/README.md +0 -0
  137. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/mkdocs.yml +0 -0
  138. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/pytest.ini +0 -0
  139. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/__init__.py +0 -0
  140. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/config.py +0 -0
  141. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/event_keys.py +0 -0
  142. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/models.py +0 -0
  143. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/policy.py +0 -0
  144. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/spec.py +0 -0
  145. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/vars.py +0 -0
  146. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/evidence/__init__.py +0 -0
  147. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/evidence/recorder.py +0 -0
  148. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/history_bundle.py +0 -0
  149. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/identity/__init__.py +0 -0
  150. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/identity/fingerprint.py +0 -0
  151. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/__init__.py +0 -0
  152. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  153. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  154. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  155. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  156. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  157. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  158. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  159. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  160. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  161. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  162. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  163. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  164. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  165. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  166. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  167. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  168. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  169. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  170. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/__init__.py +0 -0
  171. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/active_context.py +0 -0
  172. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/active_memory.py +0 -0
  173. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/compaction.py +0 -0
  174. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/kg_packets.py +0 -0
  175. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/memact_composer.py +0 -0
  176. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/recall_levels.py +0 -0
  177. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/token_budget.py +0 -0
  178. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/__init__.py +0 -0
  179. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  180. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/json_stringify.py +0 -0
  181. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/__init__.py +0 -0
  182. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/convenience.py +0 -0
  183. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/registry.py +0 -0
  184. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/scheduler.py +0 -0
  185. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/artifacts.py +0 -0
  186. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/snapshots.py +0 -0
  187. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  188. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  189. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  190. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  191. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  192. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  193. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  194. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  195. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  196. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  197. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  198. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  199. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  200. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  201. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  202. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  203. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  204. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/models.py +0 -0
  205. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  206. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  207. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  208. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/README.md +0 -0
  209. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/conftest.py +0 -0
  210. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_comms_facade.py +0 -0
  211. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_host_facade.py +0 -0
  212. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_telegram_facade.py +0 -0
  213. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_active_context_policy.py +0 -0
  214. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_active_memory.py +0 -0
  215. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_answer_user_effect.py +0 -0
  216. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_artifacts.py +0 -0
  217. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_chat_summarizer_integration.py +0 -0
  218. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_command_store.py +0 -0
  219. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_compaction_helpers.py +0 -0
  220. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_control_adapter_while.py +0 -0
  221. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_comms_gating.py +0 -0
  222. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_include_skim_files.py +0 -0
  223. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_include_skim_folders.py +0 -0
  224. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_search_files_executor.py +0 -0
  225. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_durable_toolsets.py +0 -0
  226. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  227. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_emit_event_without_workflow_registry.py +0 -0
  228. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_evidence_recorder.py +0 -0
  229. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  230. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_integration_abstractcore.py +0 -0
  231. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_integrations_abstractcore.py +0 -0
  232. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_json_file_run_store_children_index.py +0 -0
  233. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_jsonl_ledger_recovery.py +0 -0
  234. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_kg_learn_and_recall_contract.py +0 -0
  235. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_ledger_chain.py +0 -0
  236. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_ledger_subscription.py +0 -0
  237. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_artifact_refs.py +0 -0
  238. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  239. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  240. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_requires_prompt.py +0 -0
  241. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_response_schema_normalization.py +0 -0
  242. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_structured_output_fallback.py +0 -0
  243. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  244. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  245. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  246. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_media_artifacts.py +0 -0
  247. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_system_context.py +0 -0
  248. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_tool_call_parsing.py +0 -0
  249. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  250. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_remote_tool_executor.py +0 -0
  251. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_logging.py +0 -0
  252. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_security.py +0 -0
  253. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_stdio.py +0 -0
  254. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_media_artifact_resolution.py +0 -0
  255. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memact_composer_from_kg_result.py +0 -0
  256. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  257. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_packets.py +0 -0
  258. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  259. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  260. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  261. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  262. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_note_effect.py +0 -0
  263. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_query_effect.py +0 -0
  264. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_query_rich_filters.py +0 -0
  265. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  266. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_tag_effect.py +0 -0
  267. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mlx_generation_serialization.py +0 -0
  268. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_offloading.py +0 -0
  269. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_pause_resume.py +0 -0
  270. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_prompt_cache_export_import.py +0 -0
  271. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_prompt_cache_modules.py +0 -0
  272. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  273. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_real_integration.py +0 -0
  274. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_recall_levels_policy.py +0 -0
  275. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_remote_llm_client.py +0 -0
  276. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_rendering_agent_trace_report.py +0 -0
  277. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_rendering_json_stringify.py +0 -0
  278. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_retry_idempotency.py +0 -0
  279. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_run_history_bundle.py +0 -0
  280. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  281. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_install_boundary.py +0 -0
  282. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  283. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_node_traces.py +0 -0
  284. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  285. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_scheduler.py +0 -0
  286. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  287. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_snapshots.py +0 -0
  288. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_sqlite_ledger_store.py +0 -0
  289. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_async_wait.py +0 -0
  290. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  291. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  292. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_structured_output_schema_enum.py +0 -0
  293. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_subworkflow.py +0 -0
  294. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_terminal_effect_completion.py +0 -0
  295. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  296. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  297. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_approval_executor.py +0 -0
  298. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_approval_resume_executes.py +0 -0
  299. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_calls_idempotency_keys.py +0 -0
  300. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_argument_sanitization.py +0 -0
  301. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_error_output_detection.py +0 -0
  302. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_filename_alias.py +0 -0
  303. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  304. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_read_file_aliases.py +0 -0
  305. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_timeout.py +0 -0
  306. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_wait_allowlist_safety.py +0 -0
  307. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_trace_context_propagation.py +0 -0
  308. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_vars_query_effect.py +0 -0
  309. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  310. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  311. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  312. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  313. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  314. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  315. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memact_compose_node.py +0 -0
  316. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  317. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  318. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  319. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_add_message_builtin.py +0 -0
  320. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  321. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_call_tool_node.py +0 -0
  322. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_compiler_basic.py +0 -0
  323. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  324. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_get_element_node.py +0 -0
  325. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_get_random_element_node.py +0 -0
  326. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_has_tools_builtin.py +0 -0
  327. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  328. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  329. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_make_object_node.py +0 -0
  330. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  331. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_memory_source_pins.py +0 -0
  332. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_prompt_only.py +0 -0
  333. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_random_nodes.py +0 -0
  334. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_string_contains_replace.py +0 -0
  335. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_tool_parameters_node.py +0 -0
  336. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_wait_event_prompt_metadata.py +0 -0
  337. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workflow_bundle_registry.py +0 -0
  338. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  339. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  340. {abstractruntime-0.4.22 → abstractruntime-0.4.24}/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.24] - 2026-05-26
11
+
12
+ ### Added
13
+ - Runtime now surfaces AbstractCore/AbstractVision video generation through the existing generated-media boundary:
14
+ - `LLM_CALL` output selectors for `{"modality":"video","task":"text_to_video"}` and `{"modality":"video","task":"image_to_video"}`
15
+ - remote Core Server routing for `/v1/videos/generations` and `/v1/videos/edits`
16
+ - durable run-facade helpers `generate_video(...)` and `image_to_video(...)`
17
+ - VisualFlow node lowering for `generate_video` / `text_to_video` and `image_to_video`
18
+ - Provider progress callbacks are converted into JSON-safe `abstract.progress` ledger events during `LLM_CALL` execution without persisting Python callback objects.
19
+
20
+ ### Changed
21
+ - 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.
22
+ - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document text-to-video, image-to-video, and generated-media progress events.
23
+
24
+ ## [0.4.23] - 2026-05-26
25
+
26
+ ### Added
27
+ - Run lifecycle helpers and execution metric surfaces for VisualFlow execution and Gateway run retention workflows.
28
+ - Storage deletion primitives for durable run cleanup across the Runtime storage backends.
29
+
30
+ ### Changed
31
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.28` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core capability defaults, MLX-Gen catalog, and OmniVoice discovery contracts.
32
+
33
+ ### Fixed
34
+ - Effect invocation tracing now records generated-media and code-node execution details consistently across local and Gateway-hosted runs.
35
+
10
36
  ## [0.4.22] - 2026-05-23
11
37
 
12
38
  ### Changed
@@ -532,7 +558,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
532
558
 
533
559
  Initial development version with basic proof-of-concept features.
534
560
 
535
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...HEAD
561
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...HEAD
562
+ [0.4.24]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...v0.4.24
563
+ [0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
536
564
  [0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
537
565
  [0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
538
566
  [0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.22
3
+ Version: 0.4.24
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.27; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.29; 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.27; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.29; 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.27; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.29; 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.27; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.29; 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.27; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.29; 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.27; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.29; 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.27; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.29; 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.22 • **Python:** 3.10+
84
+ **Version:** 0.4.24 • **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.27 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.27`, including `abstractmusic>=0.1.12`).
118
+ The `abstractcore` extra installs AbstractCore 2.13.29 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.29`, 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.22)
172
+ ## What’s included (v0.4.24)
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.22 • **Python:** 3.10+
7
+ **Version:** 0.4.24 • **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.27 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.27`, including `abstractmusic>=0.1.12`).
41
+ The `abstractcore` extra installs AbstractCore 2.13.29 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.29`, 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.22)
95
+ ## What’s included (v0.4.24)
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.27 or newer).
183
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.29 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.22
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
@@ -14,7 +14,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
14
14
 
15
15
  - Planned: 5
16
16
  - Proposed: 3
17
- - Completed: 29
17
+ - Completed: 30
18
18
  - Deprecated: 13
19
19
  - Recurrent: 0
20
20
 
@@ -69,6 +69,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
69
69
  | 0035 | `completed/0035_model_residency_provider_truth_for_local_http_clients.md` |
70
70
  | 0037 | `completed/0037_visualflow_generate_music_node_compiler_parity.md` |
71
71
  | 0039 | `completed/0039_runtime_music_structure_prompt_bool_contract.md` |
72
+ | 0040 | `completed/0040_task_agnostic_local_residency_listing.md` |
72
73
 
73
74
  ## Planned
74
75
 
@@ -0,0 +1,53 @@
1
+ # 0040 Task-Agnostic Local Residency Listing
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-24
5
+ - Status: Completed
6
+ - Completed: 2026-05-24
7
+ - Origin: direct bug fix from AbstractFlow model residency UI investigation
8
+
9
+ ## Goal
10
+
11
+ Make Runtime's local model-residency list operation match the Gateway/Core
12
+ control-plane contract: omitting `task` lists resident models across tasks,
13
+ while an explicit `task` remains a filter.
14
+
15
+ ## What Shipped
16
+
17
+ - Local and MultiLocal Runtime residency listing now treat an omitted task as
18
+ task-agnostic instead of silently defaulting to `text_generation`.
19
+ - Local capability-backed residency rows are normalized with verified
20
+ `provider_resident` / `provider_residency_verified` fields when the
21
+ capability plugin reports `loaded` or `resident`.
22
+ - AbstractFlow's loaded-model table now honors the canonical `loaded` /
23
+ `resident` state used by Core capability records, while still respecting
24
+ explicit negative provider-residency fields.
25
+ - Regression tests cover local and MultiLocal TTS rows appearing in an
26
+ unfiltered residency list after a capability-backed load.
27
+
28
+ ## Current Code Pointers
29
+
30
+ - `src/abstractruntime/integrations/abstractcore/llm_client.py`
31
+ - `tests/test_model_residency_control_plane.py`
32
+ - AbstractFlow `web/frontend/src/components/ModelResidencyPanel.tsx`
33
+
34
+ ## Validation
35
+
36
+ Focused validation run on 2026-05-24:
37
+
38
+ - `python -m py_compile abstractruntime/src/abstractruntime/integrations/abstractcore/llm_client.py`
39
+ - `PYTHONPATH=abstractruntime/src pytest -q abstractruntime/tests/test_model_residency_control_plane.py -q`
40
+ - `npm run build` from `abstractflow/web/frontend`
41
+ - `git diff --check` for the touched Runtime and Flow files
42
+
43
+ ## Completion Report
44
+
45
+ ### Summary
46
+
47
+ The Omnivoice warmup path was already returning a true resident runtime. The
48
+ row disappeared because local Runtime listing with no task returned only text
49
+ rows, and Flow then hid capability rows that used `loaded=true` /
50
+ `state=resident` instead of text-provider-specific `provider_loaded`.
51
+
52
+ The fix is at the control-plane normalization boundary, not an Omnivoice
53
+ special case.
@@ -1,6 +1,6 @@
1
1
  ## 025_runtime_retention_and_purge_contract (planned)
2
2
 
3
- **Status**: Planned
3
+ **Status**: Partially implemented
4
4
  **Priority**: Medium
5
5
  **Depends on**: 009_artifact_store (completed), 011_subworkflow_support (completed), 012_run_store_query_and_scheduler_support (completed), 024_runtime_owned_run_scoped_media_execution (completed)
6
6
  **Related ADRs**: 0003_provenance_tamper_evident_hash_chain, 0004_runtime_owns_run_scoped_media_execution_truth
@@ -15,12 +15,18 @@ Define capability-detected runtime purge mechanics for explicitly ephemeral run
15
15
 
16
16
  ## Current code reality
17
17
 
18
- - `RunStore` still exposes only `save()` / `load()`.
18
+ - `RunStore` still exposes only `save()` / `load()` as its mandatory base interface.
19
19
  - `QueryableRunStore` already exposes `list_runs()`, `list_due_wait_until()`, and `list_children()`.
20
20
  - `QueryableRunIndexStore` already exposes `list_run_index(...)`, including `session_id` and `root_only`, so hosts can already hide child runs from top-level listings without inventing purge semantics first.
21
- - `LedgerStore` is still append-only with `append()` / `list()`.
21
+ - `LedgerStore` is still append-only as its mandatory base interface with `append()` / `list()`.
22
+ - Optional deletion protocols now exist for host-owned cleanup paths:
23
+ - `DeletableRunStore.delete(run_id)`
24
+ - `DeletableLedgerStore.delete(run_id)`
25
+ - `DeletableCommandStore.delete_by_run(run_id)`
26
+ - In-memory, JSON-file/JSONL, SQLite, and storage wrapper implementations now support those deletion protocols where applicable.
22
27
  - `ArtifactStore` already supports `delete()` and `delete_by_run()`.
23
28
  - Runtime already has private tree-walk precedents via `history_bundle._list_descendant_run_ids(...)` and scheduler child-run traversal, but no public host-facing purge helper.
29
+ - Gateway now uses these optional deletion capabilities in `abstractgateway.run_retention` to purge expired ephemeral draft-test run trees. Runtime still does not own the Gateway/Flow draft taxonomy.
24
30
  - Runtime-owned child runs now include both classic subworkflows and media child runs, so cleanup is no longer only a Flow/Gateway concern.
25
31
  - Provenance hash chains are implemented, which makes purge/archive semantics an explicit audit decision, not just a storage API detail.
26
32
 
@@ -101,7 +107,7 @@ Document the consequences clearly:
101
107
  ## Acceptance criteria
102
108
 
103
109
  - [ ] Runtime documents a minimal retention metadata contract centered on `retention_class` and optional `expires_at`.
104
- - [ ] Optional delete capabilities are defined without widening every storage base class.
110
+ - [x] Optional delete capabilities are defined without widening every storage base class.
105
111
  - [ ] A host-facing purge helper can dry-run and execute run-tree cleanup when the configured stores support it.
106
112
  - [ ] The helper refuses active runs by default and refuses durable runs unless explicitly forced.
107
113
  - [ ] The helper reports descendant runs, deleted checkpoints, deleted ledgers, deleted artifacts, unsupported capabilities, and GC caveats in a structured result.
@@ -139,3 +145,21 @@ No new ADR is required yet. If this item graduates into an accepted retention ta
139
145
  ## Priority note
140
146
 
141
147
  This matters more now that Runtime owns more child-run patterns, but it is still a medium-priority mechanics item, not the highest-priority runtime correctness gap.
148
+
149
+ ---
150
+
151
+ ## 2026-05-25 implementation note
152
+
153
+ The AbstractFlow draft/published lifecycle slice added the storage-level deletion mechanics needed
154
+ by Gateway-owned draft-test purge:
155
+
156
+ - `abstractruntime.storage.base.DeletableRunStore`
157
+ - `abstractruntime.storage.base.DeletableLedgerStore`
158
+ - `abstractruntime.storage.commands.DeletableCommandStore`
159
+ - concrete deletion support for memory, JSON/JSONL, SQLite, offloading, observable, and hash-chain
160
+ store wrappers
161
+ - focused coverage in `tests/test_storage_deletion.py`
162
+
163
+ The broader Runtime-owned host-facing purge helper remains open. Gateway currently owns the only
164
+ concrete purge policy because `purpose: draft_test` and `retention.mode: ephemeral` are Gateway/Flow
165
+ control-plane semantics, not Runtime taxonomy.
@@ -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.27 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.27`, including `abstractmusic>=0.1.12`).
21
+ This installs AbstractCore 2.13.29 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.29`, 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.27 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.29 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.27`. 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.29`. 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": "mflux", "model": "flux-dev", "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