AbstractRuntime 0.4.4__tar.gz → 0.4.6__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.6}/CHANGELOG.md +20 -1
  2. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/PKG-INFO +7 -7
  3. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/README.md +3 -3
  4. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/api.md +1 -1
  5. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/architecture.md +1 -1
  6. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/getting-started.md +1 -1
  7. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/integrations/abstractcore.md +2 -2
  8. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/limits.md +1 -1
  9. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/proposal.md +1 -1
  10. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/provenance.md +1 -1
  11. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/llms-full.txt +3 -3
  12. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/llms.txt +3 -3
  13. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/pyproject.toml +4 -4
  14. abstractruntime-0.4.6/release-notes.md +5 -0
  15. abstractruntime-0.4.6/src/abstractruntime/integrations/abstractcore/output_specs.py +98 -0
  16. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_multimodal_abstractcore_integration.py +63 -4
  17. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_packaging_extras.py +3 -2
  18. abstractruntime-0.4.4/release-notes.md +0 -35
  19. abstractruntime-0.4.4/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -173
  20. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/.github/workflows/ci.yml +0 -0
  21. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/.github/workflows/release.yml +0 -0
  22. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/.gitignore +0 -0
  23. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/ACKNOWLEDGMENTS.md +0 -0
  24. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/CONTRIBUTING.md +0 -0
  25. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/LICENSE +0 -0
  26. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/ROADMAP.md +0 -0
  27. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/SECURITY.md +0 -0
  28. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/README.md +0 -0
  29. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  30. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  31. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  32. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/adr/README.md +0 -0
  33. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/README.md +0 -0
  34. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  35. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  36. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/003_wait_primitives.md +0 -0
  37. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  38. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  39. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  40. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  41. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/009_artifact_store.md +0 -0
  42. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  43. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  44. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  45. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  46. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  47. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  48. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  49. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  50. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  51. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  52. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  53. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  54. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/004_tests.md +0 -0
  55. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  56. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  57. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  58. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  59. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/README.md +0 -0
  60. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  61. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  62. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  63. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  64. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  65. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  66. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/evidence.md +0 -0
  67. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/faq.md +0 -0
  68. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/manual_testing.md +0 -0
  69. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/mcp-worker.md +0 -0
  70. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/snapshots.md +0 -0
  71. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/tools-comms.md +0 -0
  72. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/docs/workflow-bundles.md +0 -0
  73. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/emails.config.example.yaml +0 -0
  74. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/01_hello_world.py +0 -0
  75. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/02_ask_user.py +0 -0
  76. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/03_wait_until.py +0 -0
  77. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/04_multi_step.py +0 -0
  78. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/05_persistence.py +0 -0
  79. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/06_llm_integration.py +0 -0
  80. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/07_react_agent.py +0 -0
  81. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/examples/README.md +0 -0
  82. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/mkdocs.yml +0 -0
  83. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/pytest.ini +0 -0
  84. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/__init__.py +0 -0
  85. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/__init__.py +0 -0
  86. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/config.py +0 -0
  87. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/event_keys.py +0 -0
  88. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/models.py +0 -0
  89. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/policy.py +0 -0
  90. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/runtime.py +0 -0
  91. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/spec.py +0 -0
  92. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/core/vars.py +0 -0
  93. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/evidence/__init__.py +0 -0
  94. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/evidence/recorder.py +0 -0
  95. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/history_bundle.py +0 -0
  96. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/identity/__init__.py +0 -0
  97. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/identity/fingerprint.py +0 -0
  98. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/__init__.py +0 -0
  99. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  100. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  101. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  102. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  103. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  104. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  105. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  106. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  107. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  108. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  109. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  110. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  111. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  112. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  113. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  114. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  115. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/__init__.py +0 -0
  116. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/active_context.py +0 -0
  117. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/active_memory.py +0 -0
  118. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/compaction.py +0 -0
  119. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/kg_packets.py +0 -0
  120. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/memact_composer.py +0 -0
  121. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/recall_levels.py +0 -0
  122. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/memory/token_budget.py +0 -0
  123. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/rendering/__init__.py +0 -0
  124. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  125. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/rendering/json_stringify.py +0 -0
  126. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/scheduler/__init__.py +0 -0
  127. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/scheduler/convenience.py +0 -0
  128. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/scheduler/registry.py +0 -0
  129. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/scheduler/scheduler.py +0 -0
  130. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/__init__.py +0 -0
  131. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/artifacts.py +0 -0
  132. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/base.py +0 -0
  133. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/commands.py +0 -0
  134. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/in_memory.py +0 -0
  135. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/json_files.py +0 -0
  136. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/ledger_chain.py +0 -0
  137. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/observable.py +0 -0
  138. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/offloading.py +0 -0
  139. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/snapshots.py +0 -0
  140. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/storage/sqlite.py +0 -0
  141. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  142. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  143. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  144. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  145. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  146. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  147. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  148. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  149. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  150. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  151. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  152. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  153. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  154. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  155. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  156. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  157. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  158. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  159. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  160. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  161. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  162. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/workflow_bundle/models.py +0 -0
  163. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  164. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  165. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  166. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/README.md +0 -0
  167. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/conftest.py +0 -0
  168. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_active_context_policy.py +0 -0
  169. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_active_memory.py +0 -0
  170. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_answer_user_effect.py +0 -0
  171. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_artifacts.py +0 -0
  172. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_chat_summarizer_integration.py +0 -0
  173. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_command_store.py +0 -0
  174. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_compaction_helpers.py +0 -0
  175. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_control_adapter_while.py +0 -0
  176. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_default_tools_comms_gating.py +0 -0
  177. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_default_tools_include_skim_files.py +0 -0
  178. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_default_tools_include_skim_folders.py +0 -0
  179. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_default_tools_search_files_executor.py +0 -0
  180. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_durable_toolsets.py +0 -0
  181. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  182. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_emit_event_without_workflow_registry.py +0 -0
  183. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_evidence_recorder.py +0 -0
  184. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  185. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_integration_abstractcore.py +0 -0
  186. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_integrations_abstractcore.py +0 -0
  187. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_json_file_run_store_children_index.py +0 -0
  188. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_jsonl_ledger_recovery.py +0 -0
  189. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_kg_learn_and_recall_contract.py +0 -0
  190. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_ledger_chain.py +0 -0
  191. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_ledger_subscription.py +0 -0
  192. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_media_artifact_refs.py +0 -0
  193. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  194. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  195. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_requires_prompt.py +0 -0
  196. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_response_schema_normalization.py +0 -0
  197. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_structured_output_fallback.py +0 -0
  198. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  199. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  200. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  201. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_client_media_artifacts.py +0 -0
  202. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_client_system_context.py +0 -0
  203. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_llm_client_tool_call_parsing.py +0 -0
  204. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  205. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_mcp_remote_tool_executor.py +0 -0
  206. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_mcp_worker_logging.py +0 -0
  207. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_mcp_worker_security.py +0 -0
  208. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_mcp_worker_stdio.py +0 -0
  209. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memact_composer_from_kg_result.py +0 -0
  210. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  211. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_packets.py +0 -0
  212. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  213. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  214. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  215. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  216. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_note_effect.py +0 -0
  217. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_query_effect.py +0 -0
  218. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_query_rich_filters.py +0 -0
  219. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  220. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_memory_tag_effect.py +0 -0
  221. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_mlx_generation_serialization.py +0 -0
  222. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_offloading.py +0 -0
  223. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_pause_resume.py +0 -0
  224. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_prompt_cache_modules.py +0 -0
  225. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_queryable_run_store.py +0 -0
  226. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  227. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_real_integration.py +0 -0
  228. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_recall_levels_policy.py +0 -0
  229. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_remote_llm_client.py +0 -0
  230. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_rendering_agent_trace_report.py +0 -0
  231. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_rendering_json_stringify.py +0 -0
  232. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_retry_idempotency.py +0 -0
  233. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_run_history_bundle.py +0 -0
  234. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  235. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  236. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_runtime_node_traces.py +0 -0
  237. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  238. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_scheduler.py +0 -0
  239. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  240. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_snapshots.py +0 -0
  241. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_sqlite_ledger_store.py +0 -0
  242. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_start_subworkflow_async_wait.py +0 -0
  243. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  244. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  245. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_structured_output_schema_enum.py +0 -0
  246. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_subworkflow.py +0 -0
  247. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_terminal_effect_completion.py +0 -0
  248. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  249. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  250. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_approval_executor.py +0 -0
  251. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_approval_resume_executes.py +0 -0
  252. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_calls_idempotency_keys.py +0 -0
  253. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_argument_sanitization.py +0 -0
  254. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_error_output_detection.py +0 -0
  255. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_filename_alias.py +0 -0
  256. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  257. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_read_file_aliases.py +0 -0
  258. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_executor_timeout.py +0 -0
  259. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_tool_wait_allowlist_safety.py +0 -0
  260. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_trace_context_propagation.py +0 -0
  261. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_vars_query_effect.py +0 -0
  262. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  263. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  264. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  265. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  266. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  267. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  268. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_memact_compose_node.py +0 -0
  269. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  270. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  271. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  272. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_add_message_builtin.py +0 -0
  273. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  274. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_call_tool_node.py +0 -0
  275. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_compiler_basic.py +0 -0
  276. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  277. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_get_element_node.py +0 -0
  278. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_get_random_element_node.py +0 -0
  279. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_has_tools_builtin.py +0 -0
  280. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  281. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  282. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_make_object_node.py +0 -0
  283. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  284. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_memory_source_pins.py +0 -0
  285. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_prompt_only.py +0 -0
  286. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_random_nodes.py +0 -0
  287. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_string_contains_replace.py +0 -0
  288. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_visualflow_tool_parameters_node.py +0 -0
  289. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_wait_event_prompt_metadata.py +0 -0
  290. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_workflow_bundle_registry.py +0 -0
  291. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  292. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  293. {abstractruntime-0.4.4 → abstractruntime-0.4.6}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.6] - 2026-05-07
11
+
12
+ ### Changed
13
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.10` so Runtime picks up AbstractCore's async/sync text-generation output-selector parity in addition to the public output-selector contract.
14
+
15
+ ### Fixed
16
+ - AbstractCore output-selector imports now fail fast when an older local AbstractCore install exposes the helper module but does not include the 2.13.10 async parity fix.
17
+
18
+ ## [0.4.5] - 2026-05-07
19
+
20
+ ### Changed
21
+ - 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.
22
+ - 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`.
23
+
24
+ ### Fixed
25
+ - 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.
26
+
10
27
  ## [0.4.4] - 2026-05-07
11
28
 
12
29
  ### Added
@@ -323,7 +340,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
323
340
 
324
341
  Initial development version with basic proof-of-concept features.
325
342
 
326
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...HEAD
343
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.6...HEAD
344
+ [0.4.6]: https://github.com/lpalbou/abstractruntime/compare/v0.4.5...v0.4.6
345
+ [0.4.5]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...v0.4.5
327
346
  [0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
328
347
  [0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
329
348
  [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.6
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.10; 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.10; 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.10; 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.6 • **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.10 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, public output-selector contract, and async/sync text-generation output-selector parity 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.6)
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.6 • **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.10 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, public output-selector contract, and async/sync text-generation output-selector parity 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.6)
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.10 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.6
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.10 or newer, which matches the documented server auth, provider-key header routing, prompt-cache control plane, current tool behavior, unified multimodal generation response types, public output-selector contract, and async/sync text-generation output-selector parity. 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.10 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, AbstractCore's public output-selector contract, and async/sync text-generation output-selector parity.
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.10`. 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.6, 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.6:
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.6)
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.6
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.10`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.10`
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.6
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.10`
10
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.10`
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.6"
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.10",
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.10",
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.10",
57
57
  ]
58
58
 
59
59
  # CI/test dependencies. The workflow runs the basic contract suite plus focused
@@ -0,0 +1,5 @@
1
+ ### Changed
2
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.10` so Runtime picks up AbstractCore's async/sync text-generation output-selector parity in addition to the public output-selector contract.
3
+
4
+ ### Fixed
5
+ - AbstractCore output-selector imports now fail fast when an older local AbstractCore install exposes the helper module but does not include the 2.13.10 async parity fix.
@@ -0,0 +1,98 @@
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
+ _MIN_ABSTRACTCORE_VERSION = (2, 13, 10)
8
+ _MIN_ABSTRACTCORE_VERSION_TEXT = "2.13.10"
9
+
10
+
11
+ def _version_tuple(value: str) -> tuple[int, int, int]:
12
+ parts: list[int] = []
13
+ for raw in str(value or "").split(".")[:3]:
14
+ digits = []
15
+ for char in raw:
16
+ if not char.isdigit():
17
+ break
18
+ digits.append(char)
19
+ parts.append(int("".join(digits) or "0"))
20
+ while len(parts) < 3:
21
+ parts.append(0)
22
+ return parts[0], parts[1], parts[2]
23
+
24
+
25
+ try:
26
+ from abstractcore.utils.version import __version__ as _abstractcore_version
27
+ from abstractcore.core.output_specs import (
28
+ is_output_request,
29
+ normalize_output_spec,
30
+ normalize_output_specs,
31
+ output_has_generated_media,
32
+ output_requires_non_chat_dispatch,
33
+ strip_runtime_output_metadata,
34
+ )
35
+ except ImportError as exc: # pragma: no cover - import-time dependency guard
36
+ raise ImportError(
37
+ f"abstractruntime.integrations.abstractcore requires abstractcore>={_MIN_ABSTRACTCORE_VERSION_TEXT} "
38
+ "for the public output selector contract."
39
+ ) from exc
40
+
41
+ if _version_tuple(_abstractcore_version) < _MIN_ABSTRACTCORE_VERSION: # pragma: no cover - environment guard
42
+ raise ImportError(
43
+ f"abstractruntime.integrations.abstractcore requires abstractcore>={_MIN_ABSTRACTCORE_VERSION_TEXT} "
44
+ f"for async/sync output-selector parity; found abstractcore {_abstractcore_version}."
45
+ )
46
+
47
+
48
+ def is_abstractcore_output_request(output: Any) -> bool:
49
+ """Return True when `output` is AbstractCore's multimodal output selector."""
50
+
51
+ return is_output_request(output)
52
+
53
+
54
+ def normalize_output_spec_for_runtime(output: Any) -> Dict[str, Any]:
55
+ """Normalize an AbstractCore output selector using the same public aliases as core."""
56
+
57
+ return normalize_output_spec(output)
58
+
59
+
60
+ def normalize_output_specs_for_runtime(output: Any) -> List[Dict[str, Any]]:
61
+ return normalize_output_specs(output)
62
+
63
+
64
+ def strip_runtime_output_metadata_for_core(output: Any) -> Any:
65
+ """Keep runtime artifact metadata out of AbstractCore capability kwargs."""
66
+
67
+ return strip_runtime_output_metadata(output)
68
+
69
+
70
+ def output_runtime_metadata(output: Any) -> tuple[Optional[str], Dict[str, Any]]:
71
+ """Extract runtime storage metadata from an AbstractCore output selector."""
72
+
73
+ if not is_abstractcore_output_request(output):
74
+ return None, {}
75
+
76
+ specs = normalize_output_specs_for_runtime(output)
77
+ run_id: Optional[str] = None
78
+ tags: Dict[str, Any] = {}
79
+ for spec in specs:
80
+ raw_run_id = spec.get("run_id")
81
+ if run_id is None and isinstance(raw_run_id, str) and raw_run_id.strip():
82
+ run_id = raw_run_id.strip()
83
+
84
+ raw_tags = spec.get("tags")
85
+ if isinstance(raw_tags, dict):
86
+ tags.update({str(k): str(v) for k, v in raw_tags.items() if k is not None and v is not None})
87
+
88
+ return run_id, tags
89
+
90
+
91
+ def output_request_has_generated_media(output: Any) -> bool:
92
+ """Return True when an output selector can produce generated binary media."""
93
+
94
+ return output_has_generated_media(output)
95
+
96
+
97
+ def output_request_has_non_text_result(output: Any) -> bool:
98
+ return output_requires_non_chat_dispatch(output)
@@ -13,7 +13,12 @@ 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
+ normalize_output_specs_for_runtime,
19
+ output_request_has_generated_media,
20
+ output_request_has_non_text_result,
21
+ )
17
22
  from abstractruntime.storage.artifacts import InMemoryArtifactStore
18
23
  from abstractruntime.storage.in_memory import InMemoryLedgerStore, InMemoryRunStore
19
24
 
@@ -239,8 +244,13 @@ def test_llm_call_generated_media_requires_artifact_store() -> None:
239
244
  assert "ArtifactStore" in str(state.error)
240
245
 
241
246
 
242
- def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes() -> None:
243
- from abstractcore.providers.base import BaseProvider
247
+ def test_runtime_output_selector_adapter_delegates_to_public_abstractcore_contract() -> None:
248
+ from abstractcore.core.output_specs import (
249
+ is_output_request,
250
+ normalize_output_specs,
251
+ output_has_generated_media,
252
+ output_requires_non_chat_dispatch,
253
+ )
244
254
 
245
255
  cases = [
246
256
  "text",
@@ -248,6 +258,7 @@ def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes
248
258
  {"modality": "audio"},
249
259
  {"modality": "voice"},
250
260
  {"task": "tts"},
261
+ {"task": "text_generation"},
251
262
  {"task": "image_edit"},
252
263
  [{"modality": "text"}, {"modality": "image"}],
253
264
  "json",
@@ -255,7 +266,55 @@ def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes
255
266
  ]
256
267
 
257
268
  for case in cases:
258
- assert is_abstractcore_output_request(case) is BaseProvider._is_acore_output_request(case)
269
+ assert is_abstractcore_output_request(case) is is_output_request(case)
270
+
271
+ text_generation = {"task": "text_generation"}
272
+ assert normalize_output_specs_for_runtime(text_generation) == normalize_output_specs(text_generation)
273
+ assert output_request_has_generated_media("image") is output_has_generated_media("image")
274
+ assert output_request_has_generated_media(text_generation) is False
275
+ assert output_request_has_non_text_result(text_generation) is output_requires_non_chat_dispatch(text_generation)
276
+ assert output_request_has_non_text_result(text_generation) is False
277
+ assert output_request_has_generated_media({"task": "voice_clone"}) is False
278
+
279
+
280
+ def test_local_voice_clone_resource_does_not_require_artifact_store() -> None:
281
+ from abstractcore.core.multimodal_generation import GeneratedResource, MultimodalGenerateResponse
282
+
283
+ seen = {}
284
+
285
+ class _FakeLLM:
286
+ def generate(self, **kwargs):
287
+ seen.update(kwargs)
288
+ return MultimodalGenerateResponse(
289
+ resources={
290
+ "voice": [
291
+ GeneratedResource(
292
+ modality="voice",
293
+ task="voice_clone",
294
+ resource_type="voice",
295
+ resource_id="voice-demo",
296
+ )
297
+ ]
298
+ }
299
+ )
300
+
301
+ client = object.__new__(LocalAbstractCoreLLMClient)
302
+ client._provider = "openai"
303
+ client._model = "gpt-4o-mini"
304
+ client._artifact_store = None
305
+ client._generate_lock = None
306
+ client._llm = _FakeLLM()
307
+ client._maybe_prepare_prompt_cache = lambda **_kwargs: None
308
+
309
+ out = client.generate(
310
+ prompt="Reference text.",
311
+ media=[{"type": "audio", "path": "reference.wav"}],
312
+ params={"output": {"task": "voice_clone", "run_id": "run-voice", "tags": {"node_id": "n-voice"}}},
313
+ )
314
+
315
+ assert seen["output"] == {"task": "voice_clone"}
316
+ resource = out["resources"]["voice"][0]
317
+ assert resource["resource_id"] == "voice-demo"
259
318
 
260
319
 
261
320
  class _RemoteImageSender:
@@ -27,7 +27,8 @@ def test_runtime_exposes_abstractcore_and_worker_extras() -> None:
27
27
  assert "[project.optional-dependencies]" in text
28
28
  assert "abstractcore = [" in text
29
29
  assert "mcp-worker = [" in text
30
+ assert '"abstractcore>=2.13.10"' in text
31
+ assert '"abstractcore[media,openai,vision,voice,audio]>=2.13.10"' in text
30
32
 
31
33
  worker_block = _extract_optional_dependency_block(text, key="mcp-worker")
32
- assert "abstractcore[tools]" in worker_block
33
-
34
+ assert '"abstractcore[tools]>=2.13.10"' in worker_block
@@ -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.