AbstractRuntime 0.4.4__tar.gz → 0.4.5__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 (293) hide show
  1. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/CHANGELOG.md +11 -1
  2. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/PKG-INFO +7 -7
  3. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/README.md +3 -3
  4. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/api.md +1 -1
  5. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/architecture.md +1 -1
  6. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/getting-started.md +1 -1
  7. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/integrations/abstractcore.md +2 -2
  8. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/limits.md +1 -1
  9. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/proposal.md +1 -1
  10. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/provenance.md +1 -1
  11. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/llms-full.txt +3 -3
  12. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/llms.txt +3 -3
  13. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/pyproject.toml +4 -4
  14. abstractruntime-0.4.5/release-notes.md +6 -0
  15. abstractruntime-0.4.5/src/abstractruntime/integrations/abstractcore/output_specs.py +73 -0
  16. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_multimodal_abstractcore_integration.py +50 -4
  17. abstractruntime-0.4.4/release-notes.md +0 -35
  18. abstractruntime-0.4.4/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -173
  19. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.github/workflows/ci.yml +0 -0
  20. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.github/workflows/release.yml +0 -0
  21. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.gitignore +0 -0
  22. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/ACKNOWLEDGMENTS.md +0 -0
  23. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/CONTRIBUTING.md +0 -0
  24. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/LICENSE +0 -0
  25. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/ROADMAP.md +0 -0
  26. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/SECURITY.md +0 -0
  27. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/README.md +0 -0
  28. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  29. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  30. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  31. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/README.md +0 -0
  32. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/README.md +0 -0
  33. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  34. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  35. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/003_wait_primitives.md +0 -0
  36. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  37. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  38. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  39. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  40. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/009_artifact_store.md +0 -0
  41. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  42. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  43. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  44. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  45. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  46. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  47. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  48. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  49. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  50. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  51. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  52. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  53. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_tests.md +0 -0
  54. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  55. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  56. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  57. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  58. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/README.md +0 -0
  59. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  60. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  61. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  62. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  63. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  64. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  65. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/evidence.md +0 -0
  66. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/faq.md +0 -0
  67. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/manual_testing.md +0 -0
  68. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/mcp-worker.md +0 -0
  69. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/snapshots.md +0 -0
  70. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/tools-comms.md +0 -0
  71. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/workflow-bundles.md +0 -0
  72. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/emails.config.example.yaml +0 -0
  73. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/01_hello_world.py +0 -0
  74. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/02_ask_user.py +0 -0
  75. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/03_wait_until.py +0 -0
  76. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/04_multi_step.py +0 -0
  77. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/05_persistence.py +0 -0
  78. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/06_llm_integration.py +0 -0
  79. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/07_react_agent.py +0 -0
  80. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/README.md +0 -0
  81. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/mkdocs.yml +0 -0
  82. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/pytest.ini +0 -0
  83. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/__init__.py +0 -0
  84. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/__init__.py +0 -0
  85. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/config.py +0 -0
  86. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/event_keys.py +0 -0
  87. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/models.py +0 -0
  88. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/policy.py +0 -0
  89. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/runtime.py +0 -0
  90. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/spec.py +0 -0
  91. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/vars.py +0 -0
  92. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/evidence/__init__.py +0 -0
  93. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/evidence/recorder.py +0 -0
  94. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/history_bundle.py +0 -0
  95. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/identity/__init__.py +0 -0
  96. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/identity/fingerprint.py +0 -0
  97. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/__init__.py +0 -0
  98. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  99. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  100. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  101. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  102. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  103. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  104. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  105. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  106. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  107. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  108. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  109. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  110. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  111. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  112. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  113. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  114. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/__init__.py +0 -0
  115. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_context.py +0 -0
  116. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_memory.py +0 -0
  117. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/compaction.py +0 -0
  118. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/kg_packets.py +0 -0
  119. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/memact_composer.py +0 -0
  120. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/recall_levels.py +0 -0
  121. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/token_budget.py +0 -0
  122. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/__init__.py +0 -0
  123. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  124. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/json_stringify.py +0 -0
  125. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/__init__.py +0 -0
  126. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/convenience.py +0 -0
  127. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/registry.py +0 -0
  128. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/scheduler.py +0 -0
  129. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/__init__.py +0 -0
  130. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/artifacts.py +0 -0
  131. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/base.py +0 -0
  132. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/commands.py +0 -0
  133. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/in_memory.py +0 -0
  134. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/json_files.py +0 -0
  135. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/ledger_chain.py +0 -0
  136. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/observable.py +0 -0
  137. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/offloading.py +0 -0
  138. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/snapshots.py +0 -0
  139. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/sqlite.py +0 -0
  140. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  141. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  142. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  143. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  144. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  145. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  146. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  147. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  148. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  149. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  150. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  151. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  152. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  153. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  154. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  155. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  156. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  157. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  158. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  159. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  160. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  161. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/models.py +0 -0
  162. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  163. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  164. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  165. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/README.md +0 -0
  166. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/conftest.py +0 -0
  167. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_active_context_policy.py +0 -0
  168. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_active_memory.py +0 -0
  169. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_answer_user_effect.py +0 -0
  170. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_artifacts.py +0 -0
  171. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_chat_summarizer_integration.py +0 -0
  172. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_command_store.py +0 -0
  173. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_compaction_helpers.py +0 -0
  174. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_control_adapter_while.py +0 -0
  175. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_comms_gating.py +0 -0
  176. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_files.py +0 -0
  177. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_folders.py +0 -0
  178. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_search_files_executor.py +0 -0
  179. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_durable_toolsets.py +0 -0
  180. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  181. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_emit_event_without_workflow_registry.py +0 -0
  182. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_evidence_recorder.py +0 -0
  183. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  184. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_integration_abstractcore.py +0 -0
  185. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_integrations_abstractcore.py +0 -0
  186. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_json_file_run_store_children_index.py +0 -0
  187. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_jsonl_ledger_recovery.py +0 -0
  188. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_kg_learn_and_recall_contract.py +0 -0
  189. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_ledger_chain.py +0 -0
  190. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_ledger_subscription.py +0 -0
  191. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs.py +0 -0
  192. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  193. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  194. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_requires_prompt.py +0 -0
  195. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_response_schema_normalization.py +0 -0
  196. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_structured_output_fallback.py +0 -0
  197. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  198. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  199. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  200. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_media_artifacts.py +0 -0
  201. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_system_context.py +0 -0
  202. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_tool_call_parsing.py +0 -0
  203. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  204. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_remote_tool_executor.py +0 -0
  205. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_logging.py +0 -0
  206. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_security.py +0 -0
  207. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_stdio.py +0 -0
  208. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memact_composer_from_kg_result.py +0 -0
  209. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  210. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_packets.py +0 -0
  211. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  212. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  213. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  214. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  215. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_note_effect.py +0 -0
  216. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_query_effect.py +0 -0
  217. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_query_rich_filters.py +0 -0
  218. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  219. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_tag_effect.py +0 -0
  220. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mlx_generation_serialization.py +0 -0
  221. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_offloading.py +0 -0
  222. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_packaging_extras.py +0 -0
  223. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_pause_resume.py +0 -0
  224. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_prompt_cache_modules.py +0 -0
  225. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_queryable_run_store.py +0 -0
  226. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  227. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_real_integration.py +0 -0
  228. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_recall_levels_policy.py +0 -0
  229. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_remote_llm_client.py +0 -0
  230. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_rendering_agent_trace_report.py +0 -0
  231. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_rendering_json_stringify.py +0 -0
  232. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_retry_idempotency.py +0 -0
  233. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_run_history_bundle.py +0 -0
  234. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  235. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  236. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_node_traces.py +0 -0
  237. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  238. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_scheduler.py +0 -0
  239. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  240. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_snapshots.py +0 -0
  241. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_sqlite_ledger_store.py +0 -0
  242. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_async_wait.py +0 -0
  243. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  244. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  245. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_structured_output_schema_enum.py +0 -0
  246. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_subworkflow.py +0 -0
  247. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_terminal_effect_completion.py +0 -0
  248. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  249. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  250. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_approval_executor.py +0 -0
  251. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_approval_resume_executes.py +0 -0
  252. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_calls_idempotency_keys.py +0 -0
  253. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_argument_sanitization.py +0 -0
  254. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_error_output_detection.py +0 -0
  255. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_filename_alias.py +0 -0
  256. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  257. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_read_file_aliases.py +0 -0
  258. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_timeout.py +0 -0
  259. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_wait_allowlist_safety.py +0 -0
  260. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_trace_context_propagation.py +0 -0
  261. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_vars_query_effect.py +0 -0
  262. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  263. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  264. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  265. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  266. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  267. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  268. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memact_compose_node.py +0 -0
  269. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  270. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  271. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  272. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_builtin.py +0 -0
  273. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  274. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_call_tool_node.py +0 -0
  275. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_compiler_basic.py +0 -0
  276. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  277. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_get_element_node.py +0 -0
  278. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_get_random_element_node.py +0 -0
  279. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_has_tools_builtin.py +0 -0
  280. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  281. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  282. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_make_object_node.py +0 -0
  283. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  284. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_memory_source_pins.py +0 -0
  285. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_prompt_only.py +0 -0
  286. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_random_nodes.py +0 -0
  287. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_string_contains_replace.py +0 -0
  288. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_tool_parameters_node.py +0 -0
  289. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_wait_event_prompt_metadata.py +0 -0
  290. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workflow_bundle_registry.py +0 -0
  291. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  292. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  293. {abstractruntime-0.4.4 → abstractruntime-0.4.5}/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.5] - 2026-05-07
11
+
12
+ ### Changed
13
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.9` so Runtime can use AbstractCore's public output-selector contract instead of mirroring provider-private multimodal selector logic.
14
+ - Runtime's AbstractCore output-spec adapter now delegates selector detection, normalization, generated-media detection, non-chat dispatch detection, and runtime metadata stripping to `abstractcore.core.output_specs`.
15
+
16
+ ### Fixed
17
+ - Explicit `voice_clone` output specs no longer require a Runtime `ArtifactStore` before dispatch because AbstractCore exposes them as generated resources rather than binary media outputs.
18
+
10
19
  ## [0.4.4] - 2026-05-07
11
20
 
12
21
  ### Added
@@ -323,7 +332,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
323
332
 
324
333
  Initial development version with basic proof-of-concept features.
325
334
 
326
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...HEAD
335
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.5...HEAD
336
+ [0.4.5]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...v0.4.5
327
337
  [0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
328
338
  [0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
329
339
  [0.4.2]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.4
3
+ Version: 0.4.5
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
@@ -22,15 +22,15 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
23
  Requires-Dist: abstractsemantics>=0.0.2
24
24
  Provides-Extra: abstractcore
25
- Requires-Dist: abstractcore>=2.13.8; extra == 'abstractcore'
25
+ Requires-Dist: abstractcore>=2.13.9; extra == 'abstractcore'
26
26
  Provides-Extra: docs
27
27
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
28
28
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
29
29
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
30
30
  Provides-Extra: mcp-worker
31
- Requires-Dist: abstractcore[tools]>=2.13.8; extra == 'mcp-worker'
31
+ Requires-Dist: abstractcore[tools]>=2.13.9; extra == 'mcp-worker'
32
32
  Provides-Extra: multimodal
33
- Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.8; extra == 'multimodal'
33
+ Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.9; extra == 'multimodal'
34
34
  Provides-Extra: test
35
35
  Requires-Dist: pytest>=7.0.0; extra == 'test'
36
36
  Description-Content-Type: text/markdown
@@ -41,7 +41,7 @@ Description-Content-Type: text/markdown
41
41
 
42
42
  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.
43
43
 
44
- **Version:** 0.4.4 • **Python:** 3.10+
44
+ **Version:** 0.4.5 • **Python:** 3.10+
45
45
 
46
46
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
47
47
 
@@ -75,7 +75,7 @@ AbstractCore integration (LLM + tools):
75
75
  pip install "abstractruntime[abstractcore]"
76
76
  ```
77
77
 
78
- The `abstractcore` extra installs AbstractCore 2.13.8 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, and unified multimodal generation response types are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
78
+ The `abstractcore` extra installs AbstractCore 2.13.9 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, and public output-selector contract are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
79
79
 
80
80
  MCP worker entrypoint (default toolsets over stdio):
81
81
 
@@ -124,7 +124,7 @@ state = rt.resume(
124
124
  assert state.status.value == "completed"
125
125
  ```
126
126
 
127
- ## What’s included (v0.4.4)
127
+ ## What’s included (v0.4.5)
128
128
 
129
129
  Kernel (dependency-light):
130
130
  - 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.4 • **Python:** 3.10+
7
+ **Version:** 0.4.5 • **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.8 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, and unified multimodal generation response types are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
41
+ The `abstractcore` extra installs AbstractCore 2.13.9 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, and public output-selector contract are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
42
42
 
43
43
  MCP worker entrypoint (default toolsets over stdio):
44
44
 
@@ -87,7 +87,7 @@ state = rt.resume(
87
87
  assert state.status.value == "completed"
88
88
  ```
89
89
 
90
- ## What’s included (v0.4.4)
90
+ ## What’s included (v0.4.5)
91
91
 
92
92
  Kernel (dependency-light):
93
93
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -176,7 +176,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
176
176
 
177
177
  ### AbstractCore (LLM + tools)
178
178
 
179
- Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.8 or newer).
179
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.9 or newer).
180
180
 
181
181
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
182
182
 
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-05-07
4
- > Version: 0.4.4
4
+ > Version: 0.4.5
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.
@@ -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.8 or newer, which matches the documented server auth, provider-key header routing, prompt-cache control plane, current tool behavior, and unified multimodal generation response types. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, or audio dependencies.
21
+ This installs AbstractCore 2.13.9 or newer, which matches the documented server auth, provider-key header routing, prompt-cache control plane, current tool behavior, unified multimodal generation response types, and public output-selector contract. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, or audio dependencies.
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.8 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), prompt-cache control-plane endpoints, current tool catalog, and the unified multimodal `generate(..., output=...)` response types.
19
+ This extra installs AbstractCore 2.13.9 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), prompt-cache control-plane endpoints, current tool catalog, the unified multimodal `generate(..., output=...)` response types, and AbstractCore's public output-selector contract.
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[media,openai,vision,voice,audio]>=2.13.8`. Local image/voice generation still depends on the configured AbstractCore capability backends (for example AbstractVision and AbstractVoice, or OpenAI/OpenAI-compatible remote engines).
27
+ This installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`. Local image/voice generation still depends on the configured AbstractCore capability backends (for example AbstractVision and AbstractVoice, or OpenAI/OpenAI-compatible remote engines).
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -62,7 +62,7 @@ Returns a structured dict for UI/status display. (`src/abstractruntime/core/runt
62
62
 
63
63
  Returns a list of `LimitWarning` objects for limits approaching/exceeded. (`src/abstractruntime/core/models.py`, `src/abstractruntime/core/runtime.py`)
64
64
 
65
- As of v0.4.4, warnings are computed for:
65
+ As of v0.4.5, warnings are computed for:
66
66
  - `iterations` (`current_iteration` vs `max_iterations`)
67
67
  - `tokens` (`estimated_tokens_used` vs `max_tokens`)
68
68
 
@@ -79,7 +79,7 @@ AbstractRuntime stays dependency-light at the kernel level; concrete integration
79
79
 
80
80
  ## Status (implemented in this repository)
81
81
 
82
- As of v0.4.4:
82
+ As of v0.4.5:
83
83
  - durable kernel: `RunState`, `WaitState`, `Runtime.start/tick/resume`
84
84
  - built-in waits + events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
85
85
  - persistence backends: in-memory, JSON/JSONL, SQLite
@@ -8,7 +8,7 @@ Implementation pointers:
8
8
  - model fields: `src/abstractruntime/core/models.py` (`StepRecord.prev_hash`, `StepRecord.record_hash`, `StepRecord.signature`)
9
9
  - hash-chain decorator + verifier: `src/abstractruntime/storage/ledger_chain.py`
10
10
 
11
- ## What is implemented (v0.4.4)
11
+ ## What is implemented (v0.4.5)
12
12
 
13
13
  - `HashChainedLedgerStore(inner_store)` — wraps any `LedgerStore` to compute hashes on append
14
14
  - `verify_ledger_chain(records)` — validates the chain and returns a verification report
@@ -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.4
13
+ - Version: 0.4.5
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.8`
17
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
16
+ - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.9`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`
18
18
 
19
19
  ```mermaid
20
20
  flowchart LR
@@ -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.4
6
+ - Version: 0.4.5
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.8`
10
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
9
+ - Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.9`
10
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`
11
11
 
12
12
  ## Start here
13
13
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.4.4"
7
+ version = "0.4.5"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -42,18 +42,18 @@ dependencies = [
42
42
  [project.optional-dependencies]
43
43
  # Enables `abstractruntime.integrations.abstractcore.*` imports.
44
44
  abstractcore = [
45
- "abstractcore>=2.13.8",
45
+ "abstractcore>=2.13.9",
46
46
  ]
47
47
 
48
48
  # Enables AbstractCore multimodal generation helpers with common OpenAI-backed
49
49
  # image/voice capability packages.
50
50
  multimodal = [
51
- "abstractcore[media,openai,vision,voice,audio]>=2.13.8",
51
+ "abstractcore[media,openai,vision,voice,audio]>=2.13.9",
52
52
  ]
53
53
 
54
54
  # Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
55
55
  mcp-worker = [
56
- "abstractcore[tools]>=2.13.8",
56
+ "abstractcore[tools]>=2.13.9",
57
57
  ]
58
58
 
59
59
  # CI/test dependencies. The workflow runs the basic contract suite plus focused
@@ -0,0 +1,6 @@
1
+ ### Changed
2
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.9` so Runtime can use AbstractCore's public output-selector contract instead of mirroring provider-private multimodal selector logic.
3
+ - Runtime's AbstractCore output-spec adapter now delegates selector detection, normalization, generated-media detection, non-chat dispatch detection, and runtime metadata stripping to `abstractcore.core.output_specs`.
4
+
5
+ ### Fixed
6
+ - Explicit `voice_clone` output specs no longer require a Runtime `ArtifactStore` before dispatch because AbstractCore exposes them as generated resources rather than binary media outputs.
@@ -0,0 +1,73 @@
1
+ """Runtime adapters around AbstractCore's public output-selector contract."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ try:
8
+ from abstractcore.core.output_specs import (
9
+ is_output_request,
10
+ normalize_output_spec,
11
+ normalize_output_specs,
12
+ output_has_generated_media,
13
+ output_requires_non_chat_dispatch,
14
+ strip_runtime_output_metadata,
15
+ )
16
+ except ImportError as exc: # pragma: no cover - import-time dependency guard
17
+ raise ImportError(
18
+ "abstractruntime.integrations.abstractcore requires abstractcore>=2.13.9 "
19
+ "for the public output selector contract."
20
+ ) from exc
21
+
22
+
23
+ def is_abstractcore_output_request(output: Any) -> bool:
24
+ """Return True when `output` is AbstractCore's multimodal output selector."""
25
+
26
+ return is_output_request(output)
27
+
28
+
29
+ def normalize_output_spec_for_runtime(output: Any) -> Dict[str, Any]:
30
+ """Normalize an AbstractCore output selector using the same public aliases as core."""
31
+
32
+ return normalize_output_spec(output)
33
+
34
+
35
+ def normalize_output_specs_for_runtime(output: Any) -> List[Dict[str, Any]]:
36
+ return normalize_output_specs(output)
37
+
38
+
39
+ def strip_runtime_output_metadata_for_core(output: Any) -> Any:
40
+ """Keep runtime artifact metadata out of AbstractCore capability kwargs."""
41
+
42
+ return strip_runtime_output_metadata(output)
43
+
44
+
45
+ def output_runtime_metadata(output: Any) -> tuple[Optional[str], Dict[str, Any]]:
46
+ """Extract runtime storage metadata from an AbstractCore output selector."""
47
+
48
+ if not is_abstractcore_output_request(output):
49
+ return None, {}
50
+
51
+ specs = normalize_output_specs_for_runtime(output)
52
+ run_id: Optional[str] = None
53
+ tags: Dict[str, Any] = {}
54
+ for spec in specs:
55
+ raw_run_id = spec.get("run_id")
56
+ if run_id is None and isinstance(raw_run_id, str) and raw_run_id.strip():
57
+ run_id = raw_run_id.strip()
58
+
59
+ raw_tags = spec.get("tags")
60
+ if isinstance(raw_tags, dict):
61
+ tags.update({str(k): str(v) for k, v in raw_tags.items() if k is not None and v is not None})
62
+
63
+ return run_id, tags
64
+
65
+
66
+ def output_request_has_generated_media(output: Any) -> bool:
67
+ """Return True when an output selector can produce generated binary media."""
68
+
69
+ return output_has_generated_media(output)
70
+
71
+
72
+ def output_request_has_non_text_result(output: Any) -> bool:
73
+ return output_requires_non_chat_dispatch(output)
@@ -13,7 +13,10 @@ from abstractruntime.integrations.abstractcore.llm_client import (
13
13
  RemoteAbstractCoreLLMClient,
14
14
  _normalize_local_response,
15
15
  )
16
- from abstractruntime.integrations.abstractcore.output_specs import is_abstractcore_output_request
16
+ from abstractruntime.integrations.abstractcore.output_specs import (
17
+ is_abstractcore_output_request,
18
+ output_request_has_generated_media,
19
+ )
17
20
  from abstractruntime.storage.artifacts import InMemoryArtifactStore
18
21
  from abstractruntime.storage.in_memory import InMemoryLedgerStore, InMemoryRunStore
19
22
 
@@ -239,8 +242,8 @@ def test_llm_call_generated_media_requires_artifact_store() -> None:
239
242
  assert "ArtifactStore" in str(state.error)
240
243
 
241
244
 
242
- def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes() -> None:
243
- from abstractcore.providers.base import BaseProvider
245
+ def test_runtime_output_selector_adapter_delegates_to_public_abstractcore_contract() -> None:
246
+ from abstractcore.core.output_specs import is_output_request, output_has_generated_media
244
247
 
245
248
  cases = [
246
249
  "text",
@@ -255,7 +258,50 @@ def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes
255
258
  ]
256
259
 
257
260
  for case in cases:
258
- assert is_abstractcore_output_request(case) is BaseProvider._is_acore_output_request(case)
261
+ assert is_abstractcore_output_request(case) is is_output_request(case)
262
+
263
+ assert output_request_has_generated_media("image") is output_has_generated_media("image")
264
+ assert output_request_has_generated_media({"task": "voice_clone"}) is False
265
+
266
+
267
+ def test_local_voice_clone_resource_does_not_require_artifact_store() -> None:
268
+ from abstractcore.core.multimodal_generation import GeneratedResource, MultimodalGenerateResponse
269
+
270
+ seen = {}
271
+
272
+ class _FakeLLM:
273
+ def generate(self, **kwargs):
274
+ seen.update(kwargs)
275
+ return MultimodalGenerateResponse(
276
+ resources={
277
+ "voice": [
278
+ GeneratedResource(
279
+ modality="voice",
280
+ task="voice_clone",
281
+ resource_type="voice",
282
+ resource_id="voice-demo",
283
+ )
284
+ ]
285
+ }
286
+ )
287
+
288
+ client = object.__new__(LocalAbstractCoreLLMClient)
289
+ client._provider = "openai"
290
+ client._model = "gpt-4o-mini"
291
+ client._artifact_store = None
292
+ client._generate_lock = None
293
+ client._llm = _FakeLLM()
294
+ client._maybe_prepare_prompt_cache = lambda **_kwargs: None
295
+
296
+ out = client.generate(
297
+ prompt="Reference text.",
298
+ media=[{"type": "audio", "path": "reference.wav"}],
299
+ params={"output": {"task": "voice_clone", "run_id": "run-voice", "tags": {"node_id": "n-voice"}}},
300
+ )
301
+
302
+ assert seen["output"] == {"task": "voice_clone"}
303
+ resource = out["resources"]["voice"][0]
304
+ assert resource["resource_id"] == "voice-demo"
259
305
 
260
306
 
261
307
  class _RemoteImageSender:
@@ -1,35 +0,0 @@
1
- ### Added
2
- - **AbstractCore multimodal generation integration**:
3
- - `LLM_CALL` now forwards AbstractCore's unified `generate(..., output=...)` selector for image generation, TTS/voice output, and audio transcription
4
- - generated binary outputs are normalized into JSON-safe runtime results with ArtifactStore-backed refs instead of inline bytes
5
- - local runtimes can use AbstractCore capability plugins such as AbstractVision and AbstractVoice through the same runtime effect shape
6
- - remote runtimes support AbstractCore Server image generation, speech, and transcription endpoints, plus OpenAI-compatible chat media content arrays
7
- - **Multimodal packaging extra**:
8
- - new `abstractruntime[multimodal]` extra installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
9
- - **VisualFlow LLM media selectors**:
10
- - LLM nodes lowered from VisualFlow can request generated media through `output` / `outputs` from node config or input data
11
-
12
- ### Changed
13
- - Minimum `abstractcore` optional dependency increased to `>=2.13.8` for the unified multimodal response types.
14
- - `LLM_CALL` accepts top-level `text`, top-level `output`, and top-level `outputs` as a runtime alias for AbstractCore `output`.
15
- - `LLM_CALL.media` accepts one media item or a list; artifact refs are materialized to provider-ready temporary files before model calls.
16
- - Remote AbstractCore clients now preserve existing OpenAI-style content arrays when adding media attachments.
17
- - Remote AbstractCore clients now resolve ArtifactStore-backed media refs for direct client use, matching the runtime effect-handler path.
18
- - VisualFlow LLM pending-call lowering now carries `output` / `outputs` selectors into runtime LLM effects.
19
- - VisualFlow LLM result syncing now projects generated media artifacts into node outputs such as `outputs`, `resources`, `artifact_ref`, `artifact_id`, and `meta.output_mode`.
20
-
21
- ### Fixed
22
- - Runtime artifact metadata (`run_id`, tags, artifact ids) is kept out of AbstractCore provider/capability kwargs while still being applied to stored generated media artifacts.
23
- - Generated binary media now fails closed without an ArtifactStore instead of embedding base64 bytes in durable state.
24
- - Remote image/TTS/STT calls no longer reuse the chat model unless an output-specific media model is supplied.
25
- - Remote media inputs now either convert to a provider-ready content item or fail before dispatch; unsupported remote image edits, voice reference inputs, and non-file STT inputs are rejected explicitly.
26
- - Turn-grounding injection now preserves structured multimodal message content arrays instead of stringifying them.
27
- - Session-scoped prompt-cache key derivation now uses the effective AbstractCore client provider/model identity when an `LLM_CALL` payload omits explicit provider/model overrides.
28
-
29
- ### Documentation
30
- - Documented multimodal `LLM_CALL` payloads, artifact-backed response shape, remote endpoint coverage, cached-session/prompt-cache boundaries, and the `abstractruntime[multimodal]` extra in the AbstractCore integration guide, API reference, architecture guide, FAQ, README, getting-started guide, docs index, and AI-ready `llms*.txt` files.
31
- - Added a planned workspace/media access policy item covering default workspace-only access, explicit user allow/deny paths, and a conscious full-machine access mode for long-running agency deployments.
32
-
33
- ### Testing
34
- - Added focused coverage for multimodal response normalization, artifact-backed generated media, media-only transcription calls, remote image/TTS/STT endpoints, remote media guardrails, remote chat media content arrays, content-array prompt extraction, direct remote artifact-ref media resolution, text-alias routing, provider-request redaction, and runtime metadata/tag boundaries.
35
- - Added coverage for effective prompt-cache key identity and VisualFlow LLM media selector/result projection.
@@ -1,173 +0,0 @@
1
- """AbstractCore output-selector helpers used by Runtime effect wiring and clients."""
2
-
3
- from __future__ import annotations
4
-
5
- from typing import Any, Dict, List, Optional
6
-
7
- _ACORE_OUTPUT_MODALITY_ALIASES = {
8
- "speech": ("voice", "tts"),
9
- "tts": ("voice", "tts"),
10
- "audio": ("voice", "tts"),
11
- "transcript": ("text", "transcription"),
12
- "transcription": ("text", "transcription"),
13
- "t2i": ("image", "image_generation"),
14
- "image_generation": ("image", "image_generation"),
15
- "i2i": ("image", "image_edit"),
16
- "image_to_image": ("image", "image_edit"),
17
- "image_edit": ("image", "image_edit"),
18
- }
19
-
20
- _ACORE_OUTPUT_TASK_ALIASES = {
21
- "speech": "tts",
22
- "audio": "tts",
23
- "clone": "voice_clone",
24
- "transcript": "transcription",
25
- "t2i": "image_generation",
26
- "i2i": "image_edit",
27
- "image_to_image": "image_edit",
28
- }
29
-
30
- _ACORE_OUTPUT_STRING_VALUES = {
31
- "text",
32
- "transcript",
33
- "transcription",
34
- "image",
35
- "voice",
36
- "speech",
37
- "tts",
38
- "audio",
39
- }
40
-
41
- _ACORE_OUTPUT_DICT_VALUES = {
42
- "text",
43
- "transcript",
44
- "transcription",
45
- "text_generation",
46
- "image",
47
- "image_generation",
48
- "image_edit",
49
- "t2i",
50
- "i2i",
51
- "image_to_image",
52
- "voice",
53
- "speech",
54
- "tts",
55
- "voice_clone",
56
- "clone",
57
- }
58
-
59
-
60
- def is_abstractcore_output_request(output: Any) -> bool:
61
- """Return True when `output` is AbstractCore's multimodal output selector."""
62
-
63
- if output is None:
64
- return False
65
- if isinstance(output, str):
66
- return output.strip().lower() in _ACORE_OUTPUT_STRING_VALUES
67
- if isinstance(output, (list, tuple)):
68
- return bool(output) and all(is_abstractcore_output_request(item) for item in output)
69
- if isinstance(output, dict):
70
- raw = output.get("modality", output.get("type", output.get("output")))
71
- task = output.get("task")
72
- values = {str(v).strip().lower() for v in (raw, task) if isinstance(v, str) and v.strip()}
73
- return bool(values & _ACORE_OUTPUT_DICT_VALUES)
74
- return False
75
-
76
-
77
- def normalize_output_spec_for_runtime(output: Any) -> Dict[str, Any]:
78
- """Normalize an AbstractCore output selector using the same public aliases as core."""
79
-
80
- if isinstance(output, str):
81
- spec: Dict[str, Any] = {"modality": output}
82
- elif isinstance(output, dict):
83
- spec = dict(output)
84
- spec["modality"] = spec.get("modality", spec.get("type", spec.get("output")))
85
- else:
86
- raise ValueError("output must be a string, dict, or list of output specs")
87
-
88
- modality = str(spec.get("modality") or "").strip().lower()
89
- task = str(spec.get("task") or "").strip().lower()
90
-
91
- if modality in _ACORE_OUTPUT_MODALITY_ALIASES:
92
- modality, default_task = _ACORE_OUTPUT_MODALITY_ALIASES[modality]
93
- task = task or default_task
94
-
95
- if task in _ACORE_OUTPUT_TASK_ALIASES:
96
- task = _ACORE_OUTPUT_TASK_ALIASES[task]
97
-
98
- if not modality:
99
- if task in {"tts", "voice_clone"}:
100
- modality = "voice"
101
- elif task in {"transcription"}:
102
- modality = "text"
103
- elif task in {"image_generation", "image_edit"}:
104
- modality = "image"
105
-
106
- spec["modality"] = modality
107
- if task:
108
- spec["task"] = task
109
- return spec
110
-
111
-
112
- def normalize_output_specs_for_runtime(output: Any) -> List[Dict[str, Any]]:
113
- if isinstance(output, (list, tuple)):
114
- return [normalize_output_spec_for_runtime(item) for item in output]
115
- return [normalize_output_spec_for_runtime(output)]
116
-
117
-
118
- def strip_runtime_output_metadata_for_core(output: Any) -> Any:
119
- """Keep runtime artifact metadata out of AbstractCore capability kwargs."""
120
-
121
- if isinstance(output, (list, tuple)):
122
- return [strip_runtime_output_metadata_for_core(item) for item in output]
123
- if not isinstance(output, dict):
124
- return output
125
-
126
- spec = dict(output)
127
- # Runtime stores generated bytes after normalization. Keep artifact metadata
128
- # away from provider/capability kwargs that may receive output specs directly.
129
- for key in ("run_id", "tags", "artifact_id"):
130
- spec.pop(key, None)
131
- return spec
132
-
133
-
134
- def output_runtime_metadata(output: Any) -> tuple[Optional[str], Dict[str, Any]]:
135
- """Extract runtime storage metadata from an AbstractCore output selector."""
136
-
137
- if not is_abstractcore_output_request(output):
138
- return None, {}
139
-
140
- specs = normalize_output_specs_for_runtime(output)
141
- run_id: Optional[str] = None
142
- tags: Dict[str, Any] = {}
143
- for spec in specs:
144
- raw_run_id = spec.get("run_id")
145
- if run_id is None and isinstance(raw_run_id, str) and raw_run_id.strip():
146
- run_id = raw_run_id.strip()
147
-
148
- raw_tags = spec.get("tags")
149
- if isinstance(raw_tags, dict):
150
- tags.update({str(k): str(v) for k, v in raw_tags.items() if k is not None and v is not None})
151
-
152
- return run_id, tags
153
-
154
-
155
- def output_request_has_generated_media(output: Any) -> bool:
156
- """Return True when an output selector can produce generated binary media."""
157
-
158
- if not is_abstractcore_output_request(output):
159
- return False
160
- specs = normalize_output_specs_for_runtime(output)
161
- return any(str(spec.get("modality") or "").strip().lower() != "text" for spec in specs)
162
-
163
-
164
- def output_request_has_non_text_result(output: Any) -> bool:
165
- if not is_abstractcore_output_request(output):
166
- return False
167
- specs = normalize_output_specs_for_runtime(output)
168
- for spec in specs:
169
- modality = str(spec.get("modality") or "").strip().lower()
170
- task = str(spec.get("task") or "").strip().lower()
171
- if modality != "text" or task == "transcription":
172
- return True
173
- return False
File without changes