AbstractRuntime 0.4.11__tar.gz → 0.4.12__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 (298) hide show
  1. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/.github/workflows/release.yml +45 -22
  2. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/CHANGELOG.md +9 -0
  3. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/PKG-INFO +8 -8
  4. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/integrations/abstractcore.md +15 -0
  5. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/pyproject.toml +8 -8
  6. abstractruntime-0.4.12/release-notes.md +6 -0
  7. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/runtime.py +20 -2
  8. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/llm_client.py +292 -52
  9. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +89 -5
  10. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/compiler.py +22 -6
  11. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/executor.py +44 -48
  12. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_client_system_context.py +73 -35
  13. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_multimodal_abstractcore_integration.py +101 -0
  14. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_runtime_llm_call_grounding_in_ledger.py +16 -3
  15. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_multi_entry_loop_overrides.py +32 -0
  16. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_media_nodes.py +7 -5
  17. abstractruntime-0.4.11/release-notes.md +0 -6
  18. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/.github/workflows/ci.yml +0 -0
  19. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/.gitignore +0 -0
  20. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/ACKNOWLEDGMENTS.md +0 -0
  21. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/CONTRIBUTING.md +0 -0
  22. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/LICENSE +0 -0
  23. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/README.md +0 -0
  24. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/ROADMAP.md +0 -0
  25. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/SECURITY.md +0 -0
  26. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/README.md +0 -0
  27. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  28. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  29. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  30. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/adr/README.md +0 -0
  31. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/api.md +0 -0
  32. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/architecture.md +0 -0
  33. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/README.md +0 -0
  34. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  35. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  36. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/003_wait_primitives.md +0 -0
  37. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  38. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  39. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  40. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  41. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/009_artifact_store.md +0 -0
  42. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  43. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  44. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  45. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  46. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  47. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  48. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  49. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  50. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  51. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  52. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  53. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  54. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/004_tests.md +0 -0
  55. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  56. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  57. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  58. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  59. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/README.md +0 -0
  60. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  61. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  62. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  63. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  64. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  65. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  66. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-08_runtime_gateway_env_namespace_cleanup.md +0 -0
  67. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md +0 -0
  68. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-09_runtime_retention_and_purge_contract.md +0 -0
  69. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/evidence.md +0 -0
  70. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/faq.md +0 -0
  71. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/getting-started.md +0 -0
  72. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/limits.md +0 -0
  73. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/manual_testing.md +0 -0
  74. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/mcp-worker.md +0 -0
  75. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/proposal.md +0 -0
  76. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/provenance.md +0 -0
  77. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/snapshots.md +0 -0
  78. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/tools-comms.md +0 -0
  79. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/docs/workflow-bundles.md +0 -0
  80. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/emails.config.example.yaml +0 -0
  81. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/01_hello_world.py +0 -0
  82. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/02_ask_user.py +0 -0
  83. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/03_wait_until.py +0 -0
  84. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/04_multi_step.py +0 -0
  85. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/05_persistence.py +0 -0
  86. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/06_llm_integration.py +0 -0
  87. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/07_react_agent.py +0 -0
  88. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/examples/README.md +0 -0
  89. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/llms-full.txt +0 -0
  90. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/llms.txt +0 -0
  91. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/mkdocs.yml +0 -0
  92. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/pytest.ini +0 -0
  93. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/__init__.py +0 -0
  94. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/__init__.py +0 -0
  95. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/config.py +0 -0
  96. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/event_keys.py +0 -0
  97. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/models.py +0 -0
  98. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/policy.py +0 -0
  99. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/spec.py +0 -0
  100. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/core/vars.py +0 -0
  101. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/evidence/__init__.py +0 -0
  102. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/evidence/recorder.py +0 -0
  103. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/history_bundle.py +0 -0
  104. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/identity/__init__.py +0 -0
  105. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/identity/fingerprint.py +0 -0
  106. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/__init__.py +0 -0
  107. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  108. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  109. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  110. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  111. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  112. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  113. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  114. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  115. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  116. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  117. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  118. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  119. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  120. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  121. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  122. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  123. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/__init__.py +0 -0
  124. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/active_context.py +0 -0
  125. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/active_memory.py +0 -0
  126. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/compaction.py +0 -0
  127. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/kg_packets.py +0 -0
  128. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/memact_composer.py +0 -0
  129. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/recall_levels.py +0 -0
  130. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/memory/token_budget.py +0 -0
  131. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/rendering/__init__.py +0 -0
  132. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  133. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/rendering/json_stringify.py +0 -0
  134. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/__init__.py +0 -0
  135. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/convenience.py +0 -0
  136. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/registry.py +0 -0
  137. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/scheduler.py +0 -0
  138. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/__init__.py +0 -0
  139. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/artifacts.py +0 -0
  140. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/base.py +0 -0
  141. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/commands.py +0 -0
  142. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/in_memory.py +0 -0
  143. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/json_files.py +0 -0
  144. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/ledger_chain.py +0 -0
  145. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/observable.py +0 -0
  146. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/offloading.py +0 -0
  147. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/snapshots.py +0 -0
  148. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/storage/sqlite.py +0 -0
  149. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  150. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  151. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  152. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  153. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  154. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  155. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  156. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  157. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  158. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  159. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  160. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  161. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  162. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  163. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  164. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  165. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  166. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  167. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/models.py +0 -0
  168. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  169. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  170. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  171. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/README.md +0 -0
  172. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/conftest.py +0 -0
  173. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_active_context_policy.py +0 -0
  174. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_active_memory.py +0 -0
  175. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_answer_user_effect.py +0 -0
  176. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_artifacts.py +0 -0
  177. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_chat_summarizer_integration.py +0 -0
  178. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_command_store.py +0 -0
  179. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_compaction_helpers.py +0 -0
  180. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_control_adapter_while.py +0 -0
  181. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_default_tools_comms_gating.py +0 -0
  182. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_default_tools_include_skim_files.py +0 -0
  183. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_default_tools_include_skim_folders.py +0 -0
  184. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_default_tools_search_files_executor.py +0 -0
  185. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_durable_toolsets.py +0 -0
  186. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  187. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_emit_event_without_workflow_registry.py +0 -0
  188. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_evidence_recorder.py +0 -0
  189. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  190. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_integration_abstractcore.py +0 -0
  191. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_integrations_abstractcore.py +0 -0
  192. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_json_file_run_store_children_index.py +0 -0
  193. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_jsonl_ledger_recovery.py +0 -0
  194. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_kg_learn_and_recall_contract.py +0 -0
  195. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_ledger_chain.py +0 -0
  196. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_ledger_subscription.py +0 -0
  197. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_media_artifact_refs.py +0 -0
  198. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  199. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  200. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_requires_prompt.py +0 -0
  201. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_response_schema_normalization.py +0 -0
  202. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_structured_output_fallback.py +0 -0
  203. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  204. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  205. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  206. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_client_media_artifacts.py +0 -0
  207. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_llm_client_tool_call_parsing.py +0 -0
  208. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  209. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_mcp_remote_tool_executor.py +0 -0
  210. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_mcp_worker_logging.py +0 -0
  211. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_mcp_worker_security.py +0 -0
  212. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_mcp_worker_stdio.py +0 -0
  213. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_media_artifact_resolution.py +0 -0
  214. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memact_composer_from_kg_result.py +0 -0
  215. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  216. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_packets.py +0 -0
  217. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  218. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  219. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  220. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  221. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_note_effect.py +0 -0
  222. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_query_effect.py +0 -0
  223. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_query_rich_filters.py +0 -0
  224. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  225. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_memory_tag_effect.py +0 -0
  226. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_mlx_generation_serialization.py +0 -0
  227. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_offloading.py +0 -0
  228. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_packaging_extras.py +0 -0
  229. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_pause_resume.py +0 -0
  230. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_prompt_cache_modules.py +0 -0
  231. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_queryable_run_store.py +0 -0
  232. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  233. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_real_integration.py +0 -0
  234. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_recall_levels_policy.py +0 -0
  235. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_remote_llm_client.py +0 -0
  236. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_rendering_agent_trace_report.py +0 -0
  237. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_rendering_json_stringify.py +0 -0
  238. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_retry_idempotency.py +0 -0
  239. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_run_history_bundle.py +0 -0
  240. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  241. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_runtime_install_boundary.py +0 -0
  242. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_runtime_node_traces.py +0 -0
  243. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  244. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_scheduler.py +0 -0
  245. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  246. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_snapshots.py +0 -0
  247. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_sqlite_ledger_store.py +0 -0
  248. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_start_subworkflow_async_wait.py +0 -0
  249. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  250. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  251. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_structured_output_schema_enum.py +0 -0
  252. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_subworkflow.py +0 -0
  253. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_terminal_effect_completion.py +0 -0
  254. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  255. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  256. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_approval_executor.py +0 -0
  257. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_approval_resume_executes.py +0 -0
  258. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_calls_idempotency_keys.py +0 -0
  259. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_argument_sanitization.py +0 -0
  260. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_error_output_detection.py +0 -0
  261. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_filename_alias.py +0 -0
  262. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  263. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_read_file_aliases.py +0 -0
  264. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_executor_timeout.py +0 -0
  265. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_tool_wait_allowlist_safety.py +0 -0
  266. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_trace_context_propagation.py +0 -0
  267. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_vars_query_effect.py +0 -0
  268. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  269. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  270. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  271. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  272. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  273. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  274. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_memact_compose_node.py +0 -0
  275. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  276. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  277. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_add_message_builtin.py +0 -0
  278. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  279. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_call_tool_node.py +0 -0
  280. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_compiler_basic.py +0 -0
  281. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  282. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_get_element_node.py +0 -0
  283. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_get_random_element_node.py +0 -0
  284. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_has_tools_builtin.py +0 -0
  285. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  286. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  287. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_make_object_node.py +0 -0
  288. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  289. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_memory_source_pins.py +0 -0
  290. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_prompt_only.py +0 -0
  291. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_random_nodes.py +0 -0
  292. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_string_contains_replace.py +0 -0
  293. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_visualflow_tool_parameters_node.py +0 -0
  294. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_wait_event_prompt_metadata.py +0 -0
  295. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_workflow_bundle_registry.py +0 -0
  296. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  297. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  298. {abstractruntime-0.4.11 → abstractruntime-0.4.12}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -1,6 +1,9 @@
1
1
  name: Release
2
2
 
3
3
  on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
4
7
  workflow_dispatch:
5
8
  inputs:
6
9
  version:
@@ -111,7 +114,9 @@ jobs:
111
114
  import urllib.request
112
115
  from pathlib import Path
113
116
 
114
- raw_version = os.environ["RELEASE_INPUT_VERSION"].strip()
117
+ version_input = os.environ.get("RELEASE_INPUT_VERSION", "").strip()
118
+ ref_name = os.environ.get("GITHUB_REF_NAME", "").strip()
119
+ raw_version = version_input or ref_name
115
120
  version = raw_version[1:] if raw_version.startswith("v") else raw_version
116
121
  if not re.fullmatch(r"\d+\.\d+\.\d+(?:[a-zA-Z0-9.-]+)?", version):
117
122
  raise SystemExit(f"Invalid release version: {raw_version!r}")
@@ -136,28 +141,36 @@ jobs:
136
141
  raise SystemExit(f"CHANGELOG.md entry for {version} is empty")
137
142
  Path("release-notes.md").write_text(notes + "\n", encoding="utf-8")
138
143
 
139
- publish = os.environ["RELEASE_PUBLISH"].lower() == "true"
144
+ event_name = os.environ.get("GITHUB_EVENT_NAME", "")
145
+ publish = event_name == "push" or os.environ["RELEASE_PUBLISH"].lower() == "true"
140
146
  if publish:
141
- if os.environ.get("GITHUB_REF") != "refs/heads/main":
147
+ if event_name == "workflow_dispatch" and os.environ.get("GITHUB_REF") != "refs/heads/main":
142
148
  raise SystemExit("Publishing is only allowed from the main branch.")
143
149
 
144
- expected = f"publish-abstractruntime-{version}"
145
- confirmation = os.environ.get("RELEASE_CONFIRMATION", "").strip()
146
- if confirmation != expected:
147
- raise SystemExit(
148
- f"publish_confirmation must be exactly {expected!r}; got {confirmation!r}"
149
- )
150
+ if event_name == "workflow_dispatch":
151
+ expected = f"publish-abstractruntime-{version}"
152
+ confirmation = os.environ.get("RELEASE_CONFIRMATION", "").strip()
153
+ if confirmation != expected:
154
+ raise SystemExit(
155
+ f"publish_confirmation must be exactly {expected!r}; got {confirmation!r}"
156
+ )
150
157
 
151
- tag_check = subprocess.run(
152
- ["git", "ls-remote", "--exit-code", "--tags", "origin", f"refs/tags/{tag}"],
153
- check=False,
154
- stdout=subprocess.DEVNULL,
155
- stderr=subprocess.DEVNULL,
156
- )
157
- if tag_check.returncode == 0:
158
- raise SystemExit(f"Remote tag {tag} already exists.")
159
- if tag_check.returncode not in (0, 2):
160
- raise SystemExit(f"Could not check remote tag {tag}.")
158
+ if event_name == "workflow_dispatch":
159
+ tag_check = subprocess.run(
160
+ ["git", "ls-remote", "--exit-code", "--tags", "origin", f"refs/tags/{tag}^{{}}"],
161
+ check=False,
162
+ capture_output=True,
163
+ text=True,
164
+ )
165
+ if tag_check.returncode == 0:
166
+ remote_sha = tag_check.stdout.split()[0].strip() if tag_check.stdout.split() else ""
167
+ local_sha = subprocess.check_output(["git", "rev-parse", "HEAD"], text=True).strip()
168
+ if remote_sha != local_sha:
169
+ raise SystemExit(
170
+ f"Remote tag {tag} already exists at {remote_sha}, but current commit is {local_sha}."
171
+ )
172
+ elif tag_check.returncode != 2:
173
+ raise SystemExit(f"Could not check remote tag {tag}.")
161
174
 
162
175
  try:
163
176
  with urllib.request.urlopen(
@@ -200,17 +213,27 @@ jobs:
200
213
  - uses: actions/checkout@v4
201
214
  with:
202
215
  fetch-depth: 0
203
- - name: Create annotated tag
216
+ - name: Create annotated tag for manual releases
217
+ if: github.event_name == 'workflow_dispatch'
204
218
  run: |
205
219
  tag="${{ needs.build.outputs.tag }}"
206
220
  if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then
207
- echo "Tag ${tag} already exists on origin."
208
- exit 1
221
+ remote_sha="$(git ls-remote --tags origin "refs/tags/${tag}^{}" | awk '{print $1}')"
222
+ local_sha="$(git rev-parse HEAD)"
223
+ if [ "${remote_sha}" != "${local_sha}" ]; then
224
+ echo "Tag ${tag} already exists at ${remote_sha}, but current commit is ${local_sha}."
225
+ exit 1
226
+ fi
227
+ echo "Tag ${tag} already exists on origin for the same commit. Reusing it."
228
+ exit 0
209
229
  fi
210
230
  git config user.name "github-actions[bot]"
211
231
  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
212
232
  git tag -a "${tag}" -m "AbstractRuntime ${tag}"
213
233
  git push origin "${tag}"
234
+ - name: Tag already supplied by push trigger
235
+ if: github.event_name != 'workflow_dispatch'
236
+ run: echo "Using existing tag ${{ needs.build.outputs.tag }}"
214
237
 
215
238
  publish-pypi:
216
239
  name: Publish to PyPI
@@ -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.12] - 2026-05-19
11
+
12
+ ### Fixed
13
+ - Remote AbstractCore transcription now uses provider-scoped audio routes such as `/{provider}/v1/audio/transcriptions` when an STT provider is selected.
14
+ - VisualFlow generated media nodes now keep LLM `provider`/`model` routing separate from image, TTS, and STT provider/model pins.
15
+
16
+ ### Changed
17
+ - Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.15`.
18
+
10
19
  ## [0.4.11] - 2026-05-13
11
20
 
12
21
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.11
3
+ Version: 0.4.12
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -23,23 +23,23 @@ Requires-Python: >=3.10
23
23
  Requires-Dist: abstractmemory>=0.2.6
24
24
  Requires-Dist: abstractsemantics>=0.0.3
25
25
  Provides-Extra: abstractcore
26
- Requires-Dist: abstractcore>=2.13.14; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.15; extra == 'abstractcore'
27
27
  Provides-Extra: all-apple
28
- Requires-Dist: abstractcore[all-apple]>=2.13.14; extra == 'all-apple'
28
+ Requires-Dist: abstractcore[all-apple]>=2.13.15; extra == 'all-apple'
29
29
  Provides-Extra: all-gpu
30
- Requires-Dist: abstractcore[all-gpu]>=2.13.14; extra == 'all-gpu'
30
+ Requires-Dist: abstractcore[all-gpu]>=2.13.15; extra == 'all-gpu'
31
31
  Provides-Extra: apple
32
- Requires-Dist: abstractcore[apple]>=2.13.14; extra == 'apple'
32
+ Requires-Dist: abstractcore[apple]>=2.13.15; extra == 'apple'
33
33
  Provides-Extra: docs
34
34
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
35
35
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
36
36
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
37
37
  Provides-Extra: gpu
38
- Requires-Dist: abstractcore[gpu]>=2.13.14; extra == 'gpu'
38
+ Requires-Dist: abstractcore[gpu]>=2.13.15; extra == 'gpu'
39
39
  Provides-Extra: mcp-worker
40
- Requires-Dist: abstractcore[tools]>=2.13.14; extra == 'mcp-worker'
40
+ Requires-Dist: abstractcore[tools]>=2.13.15; extra == 'mcp-worker'
41
41
  Provides-Extra: multimodal
42
- Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.14; extra == 'multimodal'
42
+ Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.15; extra == 'multimodal'
43
43
  Provides-Extra: test
44
44
  Requires-Dist: pytest>=7.0.0; extra == 'test'
45
45
  Description-Content-Type: text/markdown
@@ -115,6 +115,21 @@ Notes:
115
115
  - `output.tags`, when present, are merged into the generated artifact metadata. Runtime metadata such as `run_id` and `tags` is used by AbstractRuntime's ArtifactStore boundary and is not forwarded as provider-specific generation kwargs.
116
116
  - Host-supplied run defaults such as `run.vars["_runtime"]["provider"]` and `run.vars["_runtime"]["model"]` are persisted as JSON-safe routing metadata; provider clients, auth objects, downloaded model handles, and server sessions are not durable runtime state.
117
117
 
118
+ ## Runtime grounding
119
+
120
+ AbstractRuntime records per-call grounding as structured response metadata under `metadata.runtime_grounding`. The current fields include local datetime, timezone when detectable, country, source, whether prompt injection occurred, and an optional user identity when supplied by trace metadata or local environment.
121
+
122
+ For text/chat LLM calls only, the same grounding is rendered into the current user turn as a tagged runtime envelope:
123
+
124
+ ```text
125
+ <runtime_metadata>{"country":"FR","local_datetime":"2026-05-13T18:00:00+02:00"}</runtime_metadata>
126
+ hello
127
+ ```
128
+
129
+ This makes time/location/user context visible to the LLM without mutating the durable human message into a natural-language prefix. If a model echoes the runtime-owned envelope, AbstractRuntime removes that envelope from user-facing response text while preserving `metadata.runtime_grounding` for audit.
130
+
131
+ Direct media requests, including image generation, TTS, and transcription, do not receive prompt-injected grounding. They still receive trace headers/tags for observability and artifact ownership, but TTS `input` and image prompts remain the literal text supplied by the workflow.
132
+
118
133
  ## Multimodal generation
119
134
 
120
135
  AbstractRuntime forwards AbstractCore's unified `generate(..., output=...)` selector and normalizes multimodal responses into JSON-safe, artifact-backed results.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.4.11"
7
+ version = "0.4.12"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -46,34 +46,34 @@ dependencies = [
46
46
  [project.optional-dependencies]
47
47
  # Enables `abstractruntime.integrations.abstractcore.*` imports.
48
48
  abstractcore = [
49
- "abstractcore>=2.13.14",
49
+ "abstractcore>=2.13.15",
50
50
  ]
51
51
 
52
52
  apple = [
53
- "abstractcore[apple]>=2.13.14",
53
+ "abstractcore[apple]>=2.13.15",
54
54
  ]
55
55
 
56
56
  gpu = [
57
- "abstractcore[gpu]>=2.13.14",
57
+ "abstractcore[gpu]>=2.13.15",
58
58
  ]
59
59
 
60
60
  all-apple = [
61
- "abstractcore[all-apple]>=2.13.14",
61
+ "abstractcore[all-apple]>=2.13.15",
62
62
  ]
63
63
 
64
64
  all-gpu = [
65
- "abstractcore[all-gpu]>=2.13.14",
65
+ "abstractcore[all-gpu]>=2.13.15",
66
66
  ]
67
67
 
68
68
  # Enables AbstractCore multimodal generation helpers with common OpenAI-backed
69
69
  # image/voice capability packages.
70
70
  multimodal = [
71
- "abstractcore[media,openai,vision,voice,audio]>=2.13.14",
71
+ "abstractcore[media,openai,vision,voice,audio]>=2.13.15",
72
72
  ]
73
73
 
74
74
  # Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
75
75
  mcp-worker = [
76
- "abstractcore[tools]>=2.13.14",
76
+ "abstractcore[tools]>=2.13.15",
77
77
  ]
78
78
 
79
79
  # CI/test dependencies. The workflow runs the basic contract suite plus focused
@@ -0,0 +1,6 @@
1
+ ### Fixed
2
+ - Remote AbstractCore transcription now uses provider-scoped audio routes such as `/{provider}/v1/audio/transcriptions` when an STT provider is selected.
3
+ - VisualFlow generated media nodes now keep LLM `provider`/`model` routing separate from image, TTS, and STT provider/model pins.
4
+
5
+ ### Changed
6
+ - Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.15`.
@@ -291,12 +291,30 @@ def _maybe_inject_llm_call_grounding_for_ledger(*, effect: Effect) -> Effect:
291
291
  prompt_str = str(prompt or "")
292
292
  messages_list = messages if isinstance(messages, list) else None
293
293
 
294
+ output_request = payload.get("output")
295
+ if output_request is None:
296
+ output_request = payload.get("outputs")
297
+
294
298
  try:
295
- from abstractruntime.integrations.abstractcore.llm_client import _inject_turn_grounding
299
+ from abstractruntime.integrations.abstractcore.llm_client import (
300
+ _mark_grounding_prompt_injected,
301
+ _normalize_turn_grounding,
302
+ _output_request_has_non_text_result,
303
+ _runtime_grounding_metadata,
304
+ )
296
305
  except Exception:
297
306
  return effect
298
307
 
299
- updated_prompt, updated_messages = _inject_turn_grounding(prompt=prompt_str, messages=messages_list)
308
+ skip_turn_grounding = _output_request_has_non_text_result(output_request)
309
+ grounding = None
310
+ if not skip_turn_grounding:
311
+ grounding = _mark_grounding_prompt_injected(_runtime_grounding_metadata(), True)
312
+
313
+ updated_prompt, updated_messages = _normalize_turn_grounding(
314
+ prompt=prompt_str,
315
+ messages=messages_list,
316
+ grounding=grounding,
317
+ )
300
318
 
301
319
  changed = False
302
320
  if updated_prompt != prompt_str: