AbstractRuntime 0.4.21__tar.gz → 0.4.22__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 (335) hide show
  1. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/CHANGELOG.md +11 -1
  2. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/PKG-INFO +11 -11
  3. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/README.md +3 -3
  4. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/api.md +1 -1
  5. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/architecture.md +2 -2
  6. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/README.md +2 -1
  7. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +1 -1
  8. abstractruntime-0.4.22/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +43 -0
  9. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/getting-started.md +1 -1
  10. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/integrations/abstractcore.md +2 -2
  11. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/troubleshooting.md +1 -1
  12. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/llms-full.txt +3 -3
  13. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/llms.txt +3 -3
  14. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/pyproject.toml +8 -8
  15. abstractruntime-0.4.22/release-notes.md +6 -0
  16. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/llm_client.py +8 -8
  17. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
  18. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/run_facade.py +12 -0
  19. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/executor.py +7 -5
  20. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_run_facade.py +18 -1
  21. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_multimodal_abstractcore_integration.py +19 -0
  22. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_packaging_extras.py +7 -7
  23. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_media_nodes.py +27 -2
  24. abstractruntime-0.4.21/release-notes.md +0 -15
  25. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.github/workflows/ci.yml +0 -0
  26. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.github/workflows/release.yml +0 -0
  27. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.gitignore +0 -0
  28. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/ACKNOWLEDGMENTS.md +0 -0
  29. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/CODE_OF_CONDUCT.md +0 -0
  30. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/CONTRIBUTING.md +0 -0
  31. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/LICENSE +0 -0
  32. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/ROADMAP.md +0 -0
  33. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/SECURITY.md +0 -0
  34. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/README.md +0 -0
  35. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  36. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  37. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  38. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  39. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  40. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  41. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  42. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/README.md +0 -0
  43. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  44. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  45. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  46. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  47. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  48. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  49. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/003_wait_primitives.md +0 -0
  50. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  51. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  52. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  53. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  54. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/009_artifact_store.md +0 -0
  55. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  56. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  57. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  58. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  59. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  60. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  61. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  62. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  63. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  64. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  65. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  66. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  67. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  68. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  69. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  70. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  71. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  72. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  73. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  74. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  75. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  76. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  77. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  78. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/004_tests.md +0 -0
  79. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  80. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  81. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  82. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  83. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/README.md +0 -0
  84. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  85. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  86. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  87. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  88. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  89. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  90. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  91. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  92. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  93. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/evidence.md +0 -0
  94. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/faq.md +0 -0
  95. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/limits.md +0 -0
  96. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/manual_testing.md +0 -0
  97. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/mcp-worker.md +0 -0
  98. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/proposal.md +0 -0
  99. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/provenance.md +0 -0
  100. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/snapshots.md +0 -0
  101. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/tools-comms.md +0 -0
  102. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/workflow-bundles.md +0 -0
  103. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/emails.config.example.yaml +0 -0
  104. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/01_hello_world.py +0 -0
  105. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/02_ask_user.py +0 -0
  106. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/03_wait_until.py +0 -0
  107. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/04_multi_step.py +0 -0
  108. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/05_persistence.py +0 -0
  109. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/06_llm_integration.py +0 -0
  110. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/07_react_agent.py +0 -0
  111. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/README.md +0 -0
  112. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/mkdocs.yml +0 -0
  113. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/pytest.ini +0 -0
  114. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/__init__.py +0 -0
  115. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/__init__.py +0 -0
  116. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/config.py +0 -0
  117. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/event_keys.py +0 -0
  118. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/models.py +0 -0
  119. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/policy.py +0 -0
  120. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/runtime.py +0 -0
  121. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/spec.py +0 -0
  122. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/vars.py +0 -0
  123. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/evidence/__init__.py +0 -0
  124. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/evidence/recorder.py +0 -0
  125. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/history_bundle.py +0 -0
  126. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/identity/__init__.py +0 -0
  127. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/identity/fingerprint.py +0 -0
  128. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/__init__.py +0 -0
  129. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  130. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  131. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  132. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  133. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  134. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  135. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  136. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  137. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  138. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  139. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  140. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  141. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  142. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  143. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  144. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  145. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  146. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  147. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  148. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  149. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  150. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/__init__.py +0 -0
  151. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/active_context.py +0 -0
  152. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/active_memory.py +0 -0
  153. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/compaction.py +0 -0
  154. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/kg_packets.py +0 -0
  155. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/memact_composer.py +0 -0
  156. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/recall_levels.py +0 -0
  157. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/token_budget.py +0 -0
  158. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/__init__.py +0 -0
  159. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  160. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/json_stringify.py +0 -0
  161. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/__init__.py +0 -0
  162. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/convenience.py +0 -0
  163. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/registry.py +0 -0
  164. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/scheduler.py +0 -0
  165. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/__init__.py +0 -0
  166. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/artifacts.py +0 -0
  167. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/base.py +0 -0
  168. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/commands.py +0 -0
  169. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/in_memory.py +0 -0
  170. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/json_files.py +0 -0
  171. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/ledger_chain.py +0 -0
  172. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/observable.py +0 -0
  173. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/offloading.py +0 -0
  174. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/snapshots.py +0 -0
  175. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/sqlite.py +0 -0
  176. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  177. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  178. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  179. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  180. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  181. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  182. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  183. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  184. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  185. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  186. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  187. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  188. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  189. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  190. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  191. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  192. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  193. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  194. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  195. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  196. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/models.py +0 -0
  197. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  198. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  199. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  200. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/README.md +0 -0
  201. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/conftest.py +0 -0
  202. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_comms_facade.py +0 -0
  203. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_discovery_facade.py +0 -0
  204. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_host_facade.py +0 -0
  205. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_telegram_facade.py +0 -0
  206. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_active_context_policy.py +0 -0
  207. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_active_memory.py +0 -0
  208. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_answer_user_effect.py +0 -0
  209. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_artifacts.py +0 -0
  210. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_chat_summarizer_integration.py +0 -0
  211. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_command_store.py +0 -0
  212. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_compaction_helpers.py +0 -0
  213. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_control_adapter_while.py +0 -0
  214. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_comms_gating.py +0 -0
  215. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_include_skim_files.py +0 -0
  216. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_include_skim_folders.py +0 -0
  217. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_search_files_executor.py +0 -0
  218. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_durable_toolsets.py +0 -0
  219. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  220. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_emit_event_without_workflow_registry.py +0 -0
  221. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_evidence_recorder.py +0 -0
  222. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  223. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_integration_abstractcore.py +0 -0
  224. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_integrations_abstractcore.py +0 -0
  225. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_json_file_run_store_children_index.py +0 -0
  226. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_jsonl_ledger_recovery.py +0 -0
  227. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_kg_learn_and_recall_contract.py +0 -0
  228. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_ledger_chain.py +0 -0
  229. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_ledger_subscription.py +0 -0
  230. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_artifact_refs.py +0 -0
  231. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  232. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  233. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_requires_prompt.py +0 -0
  234. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_response_schema_normalization.py +0 -0
  235. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_structured_output_fallback.py +0 -0
  236. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  237. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  238. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  239. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_media_artifacts.py +0 -0
  240. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_system_context.py +0 -0
  241. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_tool_call_parsing.py +0 -0
  242. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  243. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_remote_tool_executor.py +0 -0
  244. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_logging.py +0 -0
  245. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_security.py +0 -0
  246. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_stdio.py +0 -0
  247. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_media_artifact_resolution.py +0 -0
  248. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memact_composer_from_kg_result.py +0 -0
  249. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  250. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_packets.py +0 -0
  251. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  252. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  253. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  254. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  255. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_note_effect.py +0 -0
  256. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_query_effect.py +0 -0
  257. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_query_rich_filters.py +0 -0
  258. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  259. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_tag_effect.py +0 -0
  260. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mlx_generation_serialization.py +0 -0
  261. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_model_residency_control_plane.py +0 -0
  262. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_offloading.py +0 -0
  263. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_pause_resume.py +0 -0
  264. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_prompt_cache_export_import.py +0 -0
  265. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_prompt_cache_modules.py +0 -0
  266. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_queryable_run_store.py +0 -0
  267. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  268. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_real_integration.py +0 -0
  269. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_recall_levels_policy.py +0 -0
  270. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_remote_llm_client.py +0 -0
  271. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_rendering_agent_trace_report.py +0 -0
  272. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_rendering_json_stringify.py +0 -0
  273. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_retry_idempotency.py +0 -0
  274. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_run_history_bundle.py +0 -0
  275. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  276. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_install_boundary.py +0 -0
  277. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  278. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_node_traces.py +0 -0
  279. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  280. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_scheduler.py +0 -0
  281. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  282. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_snapshots.py +0 -0
  283. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_sqlite_ledger_store.py +0 -0
  284. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_async_wait.py +0 -0
  285. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  286. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  287. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_structured_output_schema_enum.py +0 -0
  288. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_subworkflow.py +0 -0
  289. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_terminal_effect_completion.py +0 -0
  290. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  291. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  292. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_approval_executor.py +0 -0
  293. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_approval_resume_executes.py +0 -0
  294. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_calls_idempotency_keys.py +0 -0
  295. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_argument_sanitization.py +0 -0
  296. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_error_output_detection.py +0 -0
  297. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_filename_alias.py +0 -0
  298. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  299. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_read_file_aliases.py +0 -0
  300. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_timeout.py +0 -0
  301. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_wait_allowlist_safety.py +0 -0
  302. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_trace_context_propagation.py +0 -0
  303. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_vars_query_effect.py +0 -0
  304. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  305. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  306. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  307. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  308. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  309. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  310. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memact_compose_node.py +0 -0
  311. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  312. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  313. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  314. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_add_message_builtin.py +0 -0
  315. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  316. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_call_tool_node.py +0 -0
  317. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_compiler_basic.py +0 -0
  318. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  319. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_get_element_node.py +0 -0
  320. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_get_random_element_node.py +0 -0
  321. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_has_tools_builtin.py +0 -0
  322. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  323. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  324. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_make_object_node.py +0 -0
  325. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  326. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_memory_source_pins.py +0 -0
  327. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_prompt_only.py +0 -0
  328. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_random_nodes.py +0 -0
  329. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_string_contains_replace.py +0 -0
  330. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_tool_parameters_node.py +0 -0
  331. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_wait_event_prompt_metadata.py +0 -0
  332. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workflow_bundle_registry.py +0 -0
  333. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  334. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  335. {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.22] - 2026-05-23
11
+
12
+ ### Changed
13
+ - 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.
14
+
15
+ ### Fixed
16
+ - 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.
17
+ - 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.
18
+
10
19
  ## [0.4.21] - 2026-05-22
11
20
 
12
21
  ### Added
@@ -523,7 +532,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
523
532
 
524
533
  Initial development version with basic proof-of-concept features.
525
534
 
526
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...HEAD
535
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...HEAD
536
+ [0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
527
537
  [0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
528
538
  [0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
529
539
  [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.22
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.27; 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.27; 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.27; 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.27; 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.27; 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.27; 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.27; 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.22 • **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.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`).
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.22)
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.22 • **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.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`).
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.22)
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.27 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.22
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: 29
18
18
  - Deprecated: 13
19
19
  - Recurrent: 0
20
20
 
@@ -68,6 +68,7 @@ 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` |
71
72
 
72
73
  ## Planned
73
74
 
@@ -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`.
@@ -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.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`).
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.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.
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.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.
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -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.27`.
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.22
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.27`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.27`
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.22
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.27`
10
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.27`
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.22"
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.27",
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.27",
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.27",
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.27",
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.27",
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.27",
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.27",
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",
@@ -0,0 +1,6 @@
1
+ ### Changed
2
+ - 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.
3
+
4
+ ### Fixed
5
+ - 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.
6
+ - 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.
@@ -7692,12 +7692,17 @@ class RemoteAbstractCoreLLMClient:
7692
7692
  params: Dict[str, Any],
7693
7693
  ) -> Dict[str, Any]:
7694
7694
  fmt = str(spec.get("format") or spec.get("response_format") or "wav").strip().lower() or "wav"
7695
+ legacy_backend = str(spec.get("backend") or spec.get("music_backend") or "").strip()
7696
+ if legacy_backend:
7697
+ raise ValueError(
7698
+ "Music output routing uses `provider` as the backend selector; "
7699
+ "`backend` and `music_backend` are not supported."
7700
+ )
7695
7701
  body: Dict[str, Any] = {
7696
7702
  "prompt": str(prompt or ""),
7697
7703
  "task": str(spec.get("task") or "music_generation"),
7698
7704
  "format": fmt,
7699
7705
  }
7700
- route_selector = str(spec.get("backend") or spec.get("music_backend") or "").strip().lower().replace("_", "-")
7701
7706
  for key, value in spec.items():
7702
7707
  if key in {
7703
7708
  "modality",
@@ -7722,15 +7727,10 @@ class RemoteAbstractCoreLLMClient:
7722
7727
  if isinstance(base_url, str) and base_url.strip():
7723
7728
  body["base_url"] = base_url.strip()
7724
7729
 
7725
- if route_selector:
7726
- url = _join_core_provider_v1_url(self._server_base_url, route_selector, "/audio/music")
7727
- else:
7728
- url = _join_core_v1_url(self._server_base_url, "/audio/music")
7730
+ url = _join_core_v1_url(self._server_base_url, "/audio/music")
7729
7731
  audio_bytes, resp_headers = self._post_bytes(url, headers=headers, json_body=body)
7730
7732
  content_type = str(resp_headers.get("content-type") or f"audio/{fmt}").split(";", 1)[0].strip() or f"audio/{fmt}"
7731
- media_provider = (
7732
- str(body.get("provider") or route_selector or "abstractcore-server").strip() or "abstractcore-server"
7733
- )
7733
+ media_provider = str(body.get("provider") or "abstractcore-server").strip() or "abstractcore-server"
7734
7734
  run_id, tags = self._trace_run_id_and_tags(
7735
7735
  params,
7736
7736
  task="music_generation",
@@ -4,8 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Any, Dict, List, Optional
6
6
 
7
- _MIN_ABSTRACTCORE_VERSION = (2, 13, 25)
8
- _MIN_ABSTRACTCORE_VERSION_TEXT = "2.13.25"
7
+ _MIN_ABSTRACTCORE_VERSION = (2, 13, 27)
8
+ _MIN_ABSTRACTCORE_VERSION_TEXT = "2.13.27"
9
9
 
10
10
 
11
11
  def _version_tuple(value: str) -> tuple[int, int, int]:
@@ -76,6 +76,17 @@ def _workflow_id_for_output(output: Any) -> str:
76
76
  return f"{_WORKFLOW_PREFIX}_{safe}"
77
77
 
78
78
 
79
+ def _validate_music_output_spec(output: Any) -> None:
80
+ if not isinstance(output, dict):
81
+ return
82
+ legacy_backend = str(output.get("backend") or output.get("music_backend") or "").strip()
83
+ if legacy_backend:
84
+ raise ValueError(
85
+ "Music output uses `provider` as the backend selector; "
86
+ "`backend` and `music_backend` are not supported."
87
+ )
88
+
89
+
79
90
  def _workflow_id_for_tool_calls(tool_calls: list[Dict[str, Any]]) -> str:
80
91
  suffix = "tool_calls"
81
92
  if isinstance(tool_calls, list) and tool_calls:
@@ -410,6 +421,7 @@ class AbstractCoreRunFacade:
410
421
 
411
422
  spec = {"modality": "music", "task": "music_generation"}
412
423
  if isinstance(output, dict):
424
+ _validate_music_output_spec(output)
413
425
  spec.update(copy.deepcopy(output))
414
426
  return self.execute_llm_call(
415
427
  run_id,
@@ -1823,7 +1823,6 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
1823
1823
 
1824
1824
  for key in (
1825
1825
  "lyrics",
1826
- "structure_prompt",
1827
1826
  "text_planner_mode",
1828
1827
  "vocal_language",
1829
1828
  "negative_prompt",
@@ -1858,7 +1857,7 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
1858
1857
  if guidance is not None:
1859
1858
  output_spec["guidance_scale"] = guidance
1860
1859
 
1861
- for key in ("instrumental", "enhance_prompt", "auto_lyrics", "planning"):
1860
+ for key in ("instrumental", "enhance_prompt", "structure_prompt", "auto_lyrics", "planning"):
1862
1861
  raw_value = _input_or_config(payload, config, key, default=None)
1863
1862
  if raw_value is not None:
1864
1863
  output_spec[key] = _coerce_bool(raw_value)
@@ -1869,15 +1868,18 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
1869
1868
  music_model = _nonempty_str(
1870
1869
  _input_or_config(payload, config, "music_model", "musicModel", "model_music")
1871
1870
  )
1872
- music_backend = _nonempty_str(
1871
+ legacy_music_backend = _nonempty_str(
1873
1872
  _input_or_config(payload, config, "music_backend", "musicBackend", "backend_music")
1874
1873
  )
1875
1874
  if music_provider:
1876
1875
  output_spec["provider"] = music_provider
1877
1876
  if music_model:
1878
1877
  output_spec["model"] = music_model
1879
- if music_backend:
1880
- output_spec["backend"] = music_backend
1878
+ if legacy_music_backend:
1879
+ raise ValueError(
1880
+ "generate_music uses `music_provider` as the backend selector; "
1881
+ "`music_backend` is not supported."
1882
+ )
1881
1883
 
1882
1884
  extra = _input_or_config(payload, config, "extra")
1883
1885
  if isinstance(extra, dict) and extra:
@@ -285,7 +285,7 @@ def test_run_facade_generate_music_creates_durable_child_run_with_artifact_backe
285
285
  parent_run_id = runtime.start(
286
286
  workflow=parent,
287
287
  session_id="sess-music",
288
- vars={"_runtime": {"music_backend": "acemusic"}},
288
+ vars={"_runtime": {"prompt_cache": {"enabled": True}}},
289
289
  )
290
290
  runtime.tick(workflow=parent, run_id=parent_run_id)
291
291
 
@@ -317,6 +317,23 @@ def test_run_facade_generate_music_creates_durable_child_run_with_artifact_backe
317
317
  assert artifact.metadata.tags["kind"] == "generated_media"
318
318
 
319
319
 
320
+ def test_run_facade_generate_music_rejects_legacy_backend_fields() -> None:
321
+ class _StubRuntime:
322
+ def start(self, **kwargs):
323
+ raise AssertionError("legacy music backend fields should be rejected before runtime start")
324
+
325
+ def tick(self, **kwargs):
326
+ raise AssertionError("legacy music backend fields should be rejected before runtime tick")
327
+
328
+ def get_state(self, run_id: str):
329
+ raise AssertionError(f"unexpected get_state({run_id})")
330
+
331
+ facade = AbstractCoreRunFacade(_StubRuntime())
332
+
333
+ with pytest.raises(ValueError, match="provider.*backend selector"):
334
+ facade.generate_music("run-1", prompt="Warm lo-fi piano.", output={"backend": "acemusic"})
335
+
336
+
320
337
  def test_run_facade_send_telegram_message_creates_durable_child_tool_run() -> None:
321
338
  seen: Dict[str, Any] = {}
322
339
 
@@ -737,6 +737,25 @@ def test_remote_music_output_uses_music_endpoint_and_stores_artifact() -> None:
737
737
  assert out["media_model"] == "ace-step"
738
738
 
739
739
 
740
+ def test_remote_music_output_rejects_legacy_backend_fields() -> None:
741
+ store = InMemoryArtifactStore()
742
+ sender = _RemoteMusicSender()
743
+ client = RemoteAbstractCoreLLMClient(
744
+ server_base_url="http://core.test",
745
+ model="openai/gpt-4o-mini",
746
+ request_sender=sender,
747
+ artifact_store=store,
748
+ )
749
+
750
+ with pytest.raises(ValueError, match="provider.*backend selector"):
751
+ client.generate(
752
+ prompt="Warm lo-fi piano with brushed drums.",
753
+ params={"output": {"modality": "music", "backend": "acemusic", "format": "wav"}},
754
+ )
755
+
756
+ assert sender.calls == []
757
+
758
+
740
759
  def test_remote_voice_output_uses_speech_endpoint_and_stores_artifact() -> None:
741
760
  store = InMemoryArtifactStore()
742
761
  sender = _RemoteTtsSender()
@@ -49,8 +49,8 @@ def test_runtime_exposes_abstractcore_and_worker_extras_with_gateway_aligned_flo
49
49
  assert "[project.optional-dependencies]" in text
50
50
  assert "abstractcore = [" in text
51
51
  assert "mcp-worker = [" in text
52
- assert '"abstractcore>=2.13.25"' in text
53
- assert '"abstractcore[remote,vision,voice,audio,music]>=2.13.25"' in text
52
+ assert '"abstractcore>=2.13.27"' in text
53
+ assert '"abstractcore[remote,vision,voice,audio,music]>=2.13.27"' in text
54
54
  assert '"openai<2.0.0,>=1.109.1"' in text
55
55
  assert '"httpx<1.0.0,>=0.28.1"' in text
56
56
  assert '"anyio<5.0.0,>=4.12.1"' in text
@@ -59,7 +59,7 @@ def test_runtime_exposes_abstractcore_and_worker_extras_with_gateway_aligned_flo
59
59
  assert '"python-pptx<2.0.0,>=1.0.2"' in text
60
60
 
61
61
  worker_block = _extract_optional_dependency_block(text, key="mcp-worker")
62
- assert '"abstractcore[tools]>=2.13.25"' in worker_block
62
+ assert '"abstractcore[tools]>=2.13.27"' in worker_block
63
63
 
64
64
 
65
65
  def test_runtime_exposes_python_install_hardware_profile_cascades() -> None:
@@ -78,10 +78,10 @@ def test_runtime_exposes_python_install_hardware_profile_cascades() -> None:
78
78
  all_apple_block = _extract_optional_dependency_block(text, key="all-apple")
79
79
  all_gpu_block = _extract_optional_dependency_block(text, key="all-gpu")
80
80
 
81
- assert '"abstractcore[apple]>=2.13.25"' in apple_block
82
- assert '"abstractcore[gpu]>=2.13.25"' in gpu_block
83
- assert '"abstractcore[all-apple]>=2.13.25"' in all_apple_block
84
- assert '"abstractcore[all-gpu]>=2.13.25"' in all_gpu_block
81
+ assert '"abstractcore[apple]>=2.13.27"' in apple_block
82
+ assert '"abstractcore[gpu]>=2.13.27"' in gpu_block
83
+ assert '"abstractcore[all-apple]>=2.13.27"' in all_apple_block
84
+ assert '"abstractcore[all-gpu]>=2.13.27"' in all_gpu_block
85
85
  assert '"setuptools<82.0.0,>=80.10.2"' in apple_block
86
86
  assert '"setuptools<82.0.0,>=80.10.2"' in gpu_block
87
87
  assert '"setuptools<82.0.0,>=80.10.2"' in all_apple_block