AbstractRuntime 0.4.21__tar.gz → 0.4.23__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.21 → abstractruntime-0.4.23}/CHANGELOG.md +24 -1
  2. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/PKG-INFO +11 -11
  3. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/README.md +3 -3
  4. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/api.md +1 -1
  5. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/architecture.md +2 -2
  6. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/README.md +3 -1
  7. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +1 -1
  8. abstractruntime-0.4.23/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +43 -0
  9. abstractruntime-0.4.23/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +53 -0
  10. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +28 -4
  11. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/getting-started.md +1 -1
  12. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/integrations/abstractcore.md +3 -3
  13. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/troubleshooting.md +1 -1
  14. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/llms-full.txt +3 -3
  15. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/llms.txt +3 -3
  16. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/pyproject.toml +11 -8
  17. abstractruntime-0.4.23/release-notes.md +9 -0
  18. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/__init__.py +5 -1
  19. abstractruntime-0.4.23/src/abstractruntime/core/run_lifecycle.py +91 -0
  20. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/runtime.py +56 -1
  21. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +29 -0
  22. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +153 -3
  23. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +13 -0
  24. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/llm_client.py +1188 -142
  25. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
  26. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/run_facade.py +12 -0
  27. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/__init__.py +3 -1
  28. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/base.py +20 -0
  29. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/commands.py +61 -1
  30. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/in_memory.py +14 -0
  31. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/json_files.py +27 -0
  32. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/ledger_chain.py +10 -1
  33. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/observable.py +6 -0
  34. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/offloading.py +15 -0
  35. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/sqlite.py +38 -1
  36. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +9 -1
  37. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/compiler.py +76 -2
  38. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +102 -1
  39. abstractruntime-0.4.23/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +53 -0
  40. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/executor.py +170 -24
  41. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_abstractcore_discovery_facade.py +181 -2
  42. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_abstractcore_run_facade.py +18 -1
  43. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_model_residency_control_plane.py +435 -45
  44. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_multimodal_abstractcore_integration.py +76 -0
  45. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_packaging_extras.py +7 -7
  46. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_queryable_run_store.py +30 -0
  47. abstractruntime-0.4.23/tests/test_runtime_effect_invocation_trace.py +45 -0
  48. abstractruntime-0.4.23/tests/test_storage_deletion.py +119 -0
  49. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_media_nodes.py +27 -2
  50. abstractruntime-0.4.21/release-notes.md +0 -15
  51. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/.github/workflows/ci.yml +0 -0
  52. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/.github/workflows/release.yml +0 -0
  53. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/.gitignore +0 -0
  54. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/ACKNOWLEDGMENTS.md +0 -0
  55. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/CODE_OF_CONDUCT.md +0 -0
  56. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/CONTRIBUTING.md +0 -0
  57. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/LICENSE +0 -0
  58. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/ROADMAP.md +0 -0
  59. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/SECURITY.md +0 -0
  60. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/README.md +0 -0
  61. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  62. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  63. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  64. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  65. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  66. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  67. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  68. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/adr/README.md +0 -0
  69. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  70. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  71. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  72. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  73. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  74. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  75. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/003_wait_primitives.md +0 -0
  76. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  77. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  78. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  79. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  80. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/009_artifact_store.md +0 -0
  81. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  82. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  83. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  84. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  85. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  86. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  87. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  88. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  89. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  90. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  91. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  92. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  93. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  94. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  95. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  96. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  97. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  98. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  99. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  100. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  101. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  102. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  103. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  104. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/004_tests.md +0 -0
  105. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  106. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  107. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  108. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  109. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/README.md +0 -0
  110. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  111. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  112. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  113. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  114. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  115. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  116. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  117. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  118. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/evidence.md +0 -0
  119. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/faq.md +0 -0
  120. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/limits.md +0 -0
  121. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/manual_testing.md +0 -0
  122. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/mcp-worker.md +0 -0
  123. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/proposal.md +0 -0
  124. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/provenance.md +0 -0
  125. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/snapshots.md +0 -0
  126. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/tools-comms.md +0 -0
  127. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/docs/workflow-bundles.md +0 -0
  128. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/emails.config.example.yaml +0 -0
  129. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/01_hello_world.py +0 -0
  130. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/02_ask_user.py +0 -0
  131. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/03_wait_until.py +0 -0
  132. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/04_multi_step.py +0 -0
  133. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/05_persistence.py +0 -0
  134. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/06_llm_integration.py +0 -0
  135. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/07_react_agent.py +0 -0
  136. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/examples/README.md +0 -0
  137. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/mkdocs.yml +0 -0
  138. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/pytest.ini +0 -0
  139. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/__init__.py +0 -0
  140. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/config.py +0 -0
  141. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/event_keys.py +0 -0
  142. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/models.py +0 -0
  143. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/policy.py +0 -0
  144. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/spec.py +0 -0
  145. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/core/vars.py +0 -0
  146. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/evidence/__init__.py +0 -0
  147. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/evidence/recorder.py +0 -0
  148. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/history_bundle.py +0 -0
  149. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/identity/__init__.py +0 -0
  150. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/identity/fingerprint.py +0 -0
  151. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/__init__.py +0 -0
  152. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  153. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  154. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  155. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  156. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  157. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  158. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  159. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  160. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  161. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  162. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  163. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  164. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  165. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  166. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  167. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  168. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  169. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  170. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/__init__.py +0 -0
  171. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/active_context.py +0 -0
  172. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/active_memory.py +0 -0
  173. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/compaction.py +0 -0
  174. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/kg_packets.py +0 -0
  175. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/memact_composer.py +0 -0
  176. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/recall_levels.py +0 -0
  177. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/memory/token_budget.py +0 -0
  178. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/rendering/__init__.py +0 -0
  179. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  180. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/rendering/json_stringify.py +0 -0
  181. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/scheduler/__init__.py +0 -0
  182. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/scheduler/convenience.py +0 -0
  183. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/scheduler/registry.py +0 -0
  184. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/scheduler/scheduler.py +0 -0
  185. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/artifacts.py +0 -0
  186. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/storage/snapshots.py +0 -0
  187. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  188. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  189. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  190. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  191. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  192. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  193. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  194. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  195. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  196. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  197. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  198. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  199. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  200. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  201. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  202. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  203. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  204. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/workflow_bundle/models.py +0 -0
  205. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  206. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  207. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  208. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/README.md +0 -0
  209. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/conftest.py +0 -0
  210. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_abstractcore_comms_facade.py +0 -0
  211. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_abstractcore_host_facade.py +0 -0
  212. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_abstractcore_telegram_facade.py +0 -0
  213. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_active_context_policy.py +0 -0
  214. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_active_memory.py +0 -0
  215. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_answer_user_effect.py +0 -0
  216. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_artifacts.py +0 -0
  217. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_chat_summarizer_integration.py +0 -0
  218. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_command_store.py +0 -0
  219. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_compaction_helpers.py +0 -0
  220. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_control_adapter_while.py +0 -0
  221. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_default_tools_comms_gating.py +0 -0
  222. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_default_tools_include_skim_files.py +0 -0
  223. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_default_tools_include_skim_folders.py +0 -0
  224. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_default_tools_search_files_executor.py +0 -0
  225. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_durable_toolsets.py +0 -0
  226. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  227. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_emit_event_without_workflow_registry.py +0 -0
  228. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_evidence_recorder.py +0 -0
  229. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  230. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_integration_abstractcore.py +0 -0
  231. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_integrations_abstractcore.py +0 -0
  232. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_json_file_run_store_children_index.py +0 -0
  233. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_jsonl_ledger_recovery.py +0 -0
  234. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_kg_learn_and_recall_contract.py +0 -0
  235. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_ledger_chain.py +0 -0
  236. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_ledger_subscription.py +0 -0
  237. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_media_artifact_refs.py +0 -0
  238. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  239. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  240. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_requires_prompt.py +0 -0
  241. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_response_schema_normalization.py +0 -0
  242. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_structured_output_fallback.py +0 -0
  243. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  244. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  245. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  246. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_client_media_artifacts.py +0 -0
  247. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_client_system_context.py +0 -0
  248. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_llm_client_tool_call_parsing.py +0 -0
  249. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  250. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_mcp_remote_tool_executor.py +0 -0
  251. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_mcp_worker_logging.py +0 -0
  252. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_mcp_worker_security.py +0 -0
  253. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_mcp_worker_stdio.py +0 -0
  254. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_media_artifact_resolution.py +0 -0
  255. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memact_composer_from_kg_result.py +0 -0
  256. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  257. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_packets.py +0 -0
  258. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  259. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  260. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  261. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  262. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_note_effect.py +0 -0
  263. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_query_effect.py +0 -0
  264. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_query_rich_filters.py +0 -0
  265. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  266. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_memory_tag_effect.py +0 -0
  267. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_mlx_generation_serialization.py +0 -0
  268. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_offloading.py +0 -0
  269. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_pause_resume.py +0 -0
  270. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_prompt_cache_export_import.py +0 -0
  271. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_prompt_cache_modules.py +0 -0
  272. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  273. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_real_integration.py +0 -0
  274. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_recall_levels_policy.py +0 -0
  275. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_remote_llm_client.py +0 -0
  276. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_rendering_agent_trace_report.py +0 -0
  277. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_rendering_json_stringify.py +0 -0
  278. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_retry_idempotency.py +0 -0
  279. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_run_history_bundle.py +0 -0
  280. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  281. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_runtime_install_boundary.py +0 -0
  282. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  283. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_runtime_node_traces.py +0 -0
  284. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  285. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_scheduler.py +0 -0
  286. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  287. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_snapshots.py +0 -0
  288. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_sqlite_ledger_store.py +0 -0
  289. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_start_subworkflow_async_wait.py +0 -0
  290. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  291. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  292. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_structured_output_schema_enum.py +0 -0
  293. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_subworkflow.py +0 -0
  294. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_terminal_effect_completion.py +0 -0
  295. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  296. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  297. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_approval_executor.py +0 -0
  298. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_approval_resume_executes.py +0 -0
  299. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_calls_idempotency_keys.py +0 -0
  300. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_argument_sanitization.py +0 -0
  301. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_error_output_detection.py +0 -0
  302. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_filename_alias.py +0 -0
  303. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  304. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_read_file_aliases.py +0 -0
  305. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_executor_timeout.py +0 -0
  306. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_tool_wait_allowlist_safety.py +0 -0
  307. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_trace_context_propagation.py +0 -0
  308. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_vars_query_effect.py +0 -0
  309. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  310. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  311. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  312. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  313. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  314. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  315. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_memact_compose_node.py +0 -0
  316. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  317. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  318. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  319. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_add_message_builtin.py +0 -0
  320. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  321. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_call_tool_node.py +0 -0
  322. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_compiler_basic.py +0 -0
  323. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  324. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_get_element_node.py +0 -0
  325. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_get_random_element_node.py +0 -0
  326. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_has_tools_builtin.py +0 -0
  327. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  328. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  329. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_make_object_node.py +0 -0
  330. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  331. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_memory_source_pins.py +0 -0
  332. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_prompt_only.py +0 -0
  333. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_random_nodes.py +0 -0
  334. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_string_contains_replace.py +0 -0
  335. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_visualflow_tool_parameters_node.py +0 -0
  336. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_wait_event_prompt_metadata.py +0 -0
  337. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_workflow_bundle_registry.py +0 -0
  338. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  339. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  340. {abstractruntime-0.4.21 → abstractruntime-0.4.23}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.23] - 2026-05-26
11
+
12
+ ### Added
13
+ - Run lifecycle helpers and execution metric surfaces for VisualFlow execution and Gateway run retention workflows.
14
+ - Storage deletion primitives for durable run cleanup across the Runtime storage backends.
15
+
16
+ ### Changed
17
+ - 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.
18
+
19
+ ### Fixed
20
+ - Effect invocation tracing now records generated-media and code-node execution details consistently across local and Gateway-hosted runs.
21
+
22
+ ## [0.4.22] - 2026-05-23
23
+
24
+ ### Changed
25
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.27` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core capability plugin floors and server contracts.
26
+
27
+ ### Fixed
28
+ - Remote and VisualFlow music generation now fail closed on legacy `backend` / `music_backend` selectors and require `provider` / `music_provider` as the backend selector, matching AbstractCore Server `/v1/audio/music` validation.
29
+ - VisualFlow `generate_music` lowering now preserves boolean `structure_prompt` values (including explicit `False`) in the pending output selector, keeping the Flow/Gateway/Core contract consistent.
30
+
10
31
  ## [0.4.21] - 2026-05-22
11
32
 
12
33
  ### Added
@@ -523,7 +544,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
523
544
 
524
545
  Initial development version with basic proof-of-concept features.
525
546
 
526
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...HEAD
547
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...HEAD
548
+ [0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
549
+ [0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
527
550
  [0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
528
551
  [0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
529
552
  [0.4.19]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...v0.4.19
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.21
3
+ Version: 0.4.23
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.25; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.28; 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.25; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.28; 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.25; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.28; 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.25; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.28; 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.25; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.28; 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.25; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.28; 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.25; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.28; 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.21 • **Python:** 3.10+
84
+ **Version:** 0.4.23 • **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.25 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, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.8` ACE-remote path used by Runtime music generation are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, audio, or music dependencies.
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`).
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.21)
172
+ ## What’s included (v0.4.23)
173
173
 
174
174
  Kernel (dependency-light):
175
175
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -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.21 • **Python:** 3.10+
7
+ **Version:** 0.4.23 • **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.25 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, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.8` ACE-remote path used by Runtime music generation are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, audio, or music dependencies.
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`).
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.21)
95
+ ## What’s included (v0.4.23)
96
96
 
97
97
  Kernel (dependency-light):
98
98
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.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.25 or newer).
183
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.28 or newer).
184
184
 
185
185
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
186
186
 
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-05-22
4
- > Version: 0.4.21
3
+ > Updated: 2026-05-23
4
+ > Version: 0.4.23
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.
@@ -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: 28
17
+ - Completed: 30
18
18
  - Deprecated: 13
19
19
  - Recurrent: 0
20
20
 
@@ -68,6 +68,8 @@ If you are new to the project, start with `../README.md` and `../architecture.md
68
68
  | 0033 | `completed/0033_runtime_host_local_prompt_cache_export_import_surface.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
+ | 0039 | `completed/0039_runtime_music_structure_prompt_bool_contract.md` |
72
+ | 0040 | `completed/0040_task_agnostic_local_residency_listing.md` |
71
73
 
72
74
  ## Planned
73
75
 
@@ -25,7 +25,7 @@ AbstractFlow now ships a `generate_music` authoring node. Runtime must recognize
25
25
  ## What shipped
26
26
  - Added first-class VisualFlow lowering support for `nodeType="generate_music"` in Runtime:
27
27
  - compiles into an `EffectType.LLM_CALL` pending effect with output selector `{modality: "music", task: "music_generation"}`
28
- - accepts `prompt`, `music_provider`, `music_model`, `music_backend`, `lyrics`, `duration_s`, `format`, `seed`, `num_inference_steps`, `guidance_scale`, `instrumental`, `enhance_prompt`, `auto_lyrics`, `structure_prompt`, `text_planner_mode`, and `extra` from pins or `effectConfig`
28
+ - accepts `prompt`, `music_provider`, `music_model`, `lyrics`, `duration_s`, `format`, `seed`, `num_inference_steps`, `guidance_scale`, `instrumental`, `enhance_prompt`, `auto_lyrics`, `structure_prompt`, `text_planner_mode`, and `extra` from pins or `effectConfig` (`music_backend` is a legacy alias and is rejected; use `music_provider`)
29
29
  - keeps runtime LLM `provider`/`model` separate from music provider/model selectors (no legacy fallback)
30
30
  - Extended VisualFlow compiler routing so `generate_music` is treated as an LLM-call-backed effect node (like `generate_image` / `generate_voice` / `transcribe_audio`).
31
31
  - Extended VisualFlow effect-result mapping so completed `generate_music` nodes populate:
@@ -0,0 +1,43 @@
1
+ # Completed: Runtime Music `structure_prompt` Boolean Contract Alignment
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-22
5
+ - Completed: 2026-05-22
6
+ - Status: Completed
7
+ - Origin: moved from `docs/backlog/proposed/0039_runtime_music_structure_prompt_bool_contract.md`
8
+
9
+ ## Problem
10
+
11
+ Gateway `MusicGenerateRequest` exposes `structure_prompt` as `Optional[bool]`.
12
+ AbstractFlow mirrors that boolean contract in its Generate Music node.
13
+
14
+ Runtime's native `generate_music` VisualFlow handler forwarded
15
+ `structure_prompt` only through the string-field path. Boolean values authored
16
+ by Flow were therefore dropped before the Gateway/Core music call.
17
+
18
+ ## Implementation
19
+
20
+ - Moved `structure_prompt` from the music string option group to the boolean
21
+ option group in the native `generate_music` VisualFlow handler.
22
+ - Preserved explicit `False` values so callers can distinguish "disabled" from
23
+ "not specified".
24
+ - Added compiler coverage proving:
25
+ - `structure_prompt=True` is forwarded as a boolean in the pending music
26
+ output selector.
27
+ - `structure_prompt=False` from node input pins is preserved as an explicit
28
+ boolean override.
29
+
30
+ ## Outcome
31
+
32
+ Runtime now keeps the same boolean contract used by AbstractFlow, Gateway, and
33
+ AbstractCore. A Flow-authored Generate Music node can enable or disable backend
34
+ structured prompt planning without Runtime stringifying or dropping the control.
35
+
36
+ ## Validation
37
+
38
+ - `PYTHONPATH=src python -m pytest -q tests/test_visualflow_media_nodes.py`
39
+
40
+ ## Related Flow work
41
+
42
+ AbstractFlow completed Gateway `0.2.17` native media alignment in
43
+ `abstractflow/docs/backlog/completed/0072_gateway_0_2_17_native_media_contract_alignment.md`.
@@ -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.
@@ -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.25 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, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.8` ACE-remote path used by Runtime music generation. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, audio, or music dependencies.
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`).
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.25 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, the public local vision-cache catalog helper used by Runtime discovery, and the lightweight `abstractmusic>=0.1.8` remote ACE path surfaced through Runtime music generation.
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.
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.25`. 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.8`, 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.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.
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -687,7 +687,7 @@ facade = get_abstractcore_run_facade(rt)
687
687
  child = facade.generate_image(
688
688
  "existing-parent-run-id",
689
689
  prompt="A red mug on a white table.",
690
- output={"provider": "mflux", "model": "flux-dev", "format": "png"},
690
+ output={"provider": "mlx-gen", "model": "flux2-klein-4b", "format": "png"},
691
691
  )
692
692
 
693
693
  assert child.status.value == "completed"
@@ -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.25`.
24
+ - The current AbstractCore integration expects `abstractcore>=2.13.28`.
25
25
 
26
26
  Verify:
27
27
 
@@ -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.21
13
+ - Version: 0.4.23
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.25`
17
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.25`
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`
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
@@ -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.21
6
+ - Version: 0.4.23
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.25`
10
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.25`
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`
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.4.21"
7
+ version = "0.4.23"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -46,14 +46,14 @@ dependencies = [
46
46
  [project.optional-dependencies]
47
47
  # Enables `abstractruntime.integrations.abstractcore.*` imports.
48
48
  abstractcore = [
49
- "abstractcore>=2.13.25",
49
+ "abstractcore>=2.13.28",
50
50
  "openai<2.0.0,>=1.109.1",
51
51
  "httpx<1.0.0,>=0.28.1",
52
52
  "anyio<5.0.0,>=4.12.1",
53
53
  ]
54
54
 
55
55
  apple = [
56
- "abstractcore[apple]>=2.13.25",
56
+ "abstractcore[apple]>=2.13.28",
57
57
  "openai<2.0.0,>=1.109.1",
58
58
  "httpx<1.0.0,>=0.28.1",
59
59
  "anyio<5.0.0,>=4.12.1",
@@ -61,7 +61,7 @@ apple = [
61
61
  ]
62
62
 
63
63
  gpu = [
64
- "abstractcore[gpu]>=2.13.25",
64
+ "abstractcore[gpu]>=2.13.28",
65
65
  "openai<2.0.0,>=1.109.1",
66
66
  "httpx<1.0.0,>=0.28.1",
67
67
  "anyio<5.0.0,>=4.12.1",
@@ -69,7 +69,7 @@ gpu = [
69
69
  ]
70
70
 
71
71
  all-apple = [
72
- "abstractcore[all-apple]>=2.13.25",
72
+ "abstractcore[all-apple]>=2.13.28",
73
73
  "openai<2.0.0,>=1.109.1",
74
74
  "httpx<1.0.0,>=0.28.1",
75
75
  "anyio<5.0.0,>=4.12.1",
@@ -77,7 +77,7 @@ all-apple = [
77
77
  ]
78
78
 
79
79
  all-gpu = [
80
- "abstractcore[all-gpu]>=2.13.25",
80
+ "abstractcore[all-gpu]>=2.13.28",
81
81
  "openai<2.0.0,>=1.109.1",
82
82
  "httpx<1.0.0,>=0.28.1",
83
83
  "anyio<5.0.0,>=4.12.1",
@@ -87,7 +87,7 @@ all-gpu = [
87
87
  # Enables AbstractCore multimodal generation helpers with common image/voice/
88
88
  # audio/music capability packages.
89
89
  multimodal = [
90
- "abstractcore[remote,vision,voice,audio,music]>=2.13.25",
90
+ "abstractcore[remote,vision,voice,audio,music]>=2.13.28",
91
91
  "openai<2.0.0,>=1.109.1",
92
92
  "httpx<1.0.0,>=0.28.1",
93
93
  "anyio<5.0.0,>=4.12.1",
@@ -101,7 +101,7 @@ multimodal = [
101
101
 
102
102
  # Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
103
103
  mcp-worker = [
104
- "abstractcore[tools]>=2.13.25",
104
+ "abstractcore[tools]>=2.13.28",
105
105
  "openai<2.0.0,>=1.109.1",
106
106
  "httpx<1.0.0,>=0.28.1",
107
107
  "anyio<5.0.0,>=4.12.1",
@@ -131,3 +131,6 @@ abstractruntime-mcp-worker = "abstractruntime.integrations.abstractcore.mcp_work
131
131
 
132
132
  [tool.hatch.build.targets.wheel]
133
133
  packages = ["src/abstractruntime"]
134
+
135
+ [tool.pytest.ini_options]
136
+ pythonpath = ["src"]
@@ -0,0 +1,9 @@
1
+ ### Added
2
+ - Run lifecycle helpers and execution metric surfaces for VisualFlow execution and Gateway run retention workflows.
3
+ - Storage deletion primitives for durable run cleanup across the Runtime storage backends.
4
+
5
+ ### Changed
6
+ - 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.
7
+
8
+ ### Fixed
9
+ - Effect invocation tracing now records generated-media and code-node execution details consistently across local and Gateway-hosted runs.
@@ -29,7 +29,7 @@ from .core.policy import (
29
29
  NoRetryPolicy,
30
30
  compute_idempotency_key,
31
31
  )
32
- from .storage.base import QueryableRunStore
32
+ from .storage.base import DeletableLedgerStore, DeletableRunStore, QueryableRunStore
33
33
  from .storage.in_memory import InMemoryLedgerStore, InMemoryRunStore
34
34
  from .storage.json_files import JsonFileRunStore, JsonlLedgerStore
35
35
  from .storage.sqlite import (
@@ -44,6 +44,7 @@ from .storage.commands import (
44
44
  CommandCursorStore,
45
45
  CommandRecord,
46
46
  CommandStore,
47
+ DeletableCommandStore,
47
48
  InMemoryCommandCursorStore,
48
49
  InMemoryCommandStore,
49
50
  JsonFileCommandCursorStore,
@@ -117,6 +118,8 @@ __all__ = [
117
118
  "create_scheduled_runtime",
118
119
  # Storage backends
119
120
  "QueryableRunStore",
121
+ "DeletableRunStore",
122
+ "DeletableLedgerStore",
120
123
  "InMemoryRunStore",
121
124
  "InMemoryLedgerStore",
122
125
  "JsonFileRunStore",
@@ -127,6 +130,7 @@ __all__ = [
127
130
  "CommandRecord",
128
131
  "CommandAppendResult",
129
132
  "CommandStore",
133
+ "DeletableCommandStore",
130
134
  "CommandCursorStore",
131
135
  "InMemoryCommandStore",
132
136
  "JsonlCommandStore",