AbstractRuntime 0.4.24__tar.gz → 0.4.25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CHANGELOG.md +14 -1
  2. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/PKG-INFO +11 -11
  3. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/README.md +3 -3
  4. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/api.md +1 -1
  5. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/getting-started.md +1 -1
  6. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/integrations/abstractcore.md +2 -2
  7. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/troubleshooting.md +1 -1
  8. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/llms-full.txt +3 -3
  9. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/llms.txt +3 -3
  10. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/pyproject.toml +8 -8
  11. abstractruntime-0.4.25/release-notes.md +9 -0
  12. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +5 -0
  13. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/llm_client.py +39 -7
  14. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/artifacts.py +12 -0
  15. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_artifacts.py +20 -0
  16. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_media_artifact_resolution.py +33 -0
  17. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_model_residency_control_plane.py +4 -0
  18. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_media_nodes.py +17 -1
  19. abstractruntime-0.4.24/release-notes.md +0 -11
  20. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.github/workflows/ci.yml +0 -0
  21. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.github/workflows/release.yml +0 -0
  22. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.gitignore +0 -0
  23. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/ACKNOWLEDGMENTS.md +0 -0
  24. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CODE_OF_CONDUCT.md +0 -0
  25. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CONTRIBUTING.md +0 -0
  26. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/LICENSE +0 -0
  27. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/ROADMAP.md +0 -0
  28. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/SECURITY.md +0 -0
  29. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/README.md +0 -0
  30. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  31. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  32. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  33. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  34. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  35. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  36. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  37. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/README.md +0 -0
  38. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/architecture.md +0 -0
  39. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/README.md +0 -0
  40. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  41. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  42. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  43. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  44. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  45. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  46. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  47. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  48. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/003_wait_primitives.md +0 -0
  49. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  50. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  51. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  52. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  53. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  54. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/009_artifact_store.md +0 -0
  55. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  56. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  57. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  58. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  59. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  60. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  61. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  62. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  63. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  64. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  65. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  66. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  67. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  68. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  69. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  70. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  71. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  72. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  73. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  74. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  75. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  76. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  77. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  78. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_tests.md +0 -0
  79. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  80. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  81. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  82. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  83. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/README.md +0 -0
  84. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  85. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  86. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  87. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  88. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  89. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  90. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  91. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  92. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  93. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/evidence.md +0 -0
  94. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/faq.md +0 -0
  95. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/limits.md +0 -0
  96. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/manual_testing.md +0 -0
  97. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/mcp-worker.md +0 -0
  98. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/proposal.md +0 -0
  99. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/provenance.md +0 -0
  100. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/snapshots.md +0 -0
  101. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/tools-comms.md +0 -0
  102. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/workflow-bundles.md +0 -0
  103. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/emails.config.example.yaml +0 -0
  104. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/01_hello_world.py +0 -0
  105. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/02_ask_user.py +0 -0
  106. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/03_wait_until.py +0 -0
  107. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/04_multi_step.py +0 -0
  108. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/05_persistence.py +0 -0
  109. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/06_llm_integration.py +0 -0
  110. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/07_react_agent.py +0 -0
  111. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/README.md +0 -0
  112. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/mkdocs.yml +0 -0
  113. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/pytest.ini +0 -0
  114. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/__init__.py +0 -0
  115. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/__init__.py +0 -0
  116. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/config.py +0 -0
  117. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/event_keys.py +0 -0
  118. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/models.py +0 -0
  119. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/policy.py +0 -0
  120. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/run_lifecycle.py +0 -0
  121. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/runtime.py +0 -0
  122. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/spec.py +0 -0
  123. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/vars.py +0 -0
  124. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/evidence/__init__.py +0 -0
  125. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/evidence/recorder.py +0 -0
  126. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/history_bundle.py +0 -0
  127. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/identity/__init__.py +0 -0
  128. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/identity/fingerprint.py +0 -0
  129. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/__init__.py +0 -0
  130. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  131. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  132. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  133. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  134. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  135. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  136. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  137. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  138. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  139. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  140. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  141. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  142. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  143. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  144. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  145. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  146. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  147. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  148. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  149. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  150. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  151. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  152. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/__init__.py +0 -0
  153. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_context.py +0 -0
  154. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_memory.py +0 -0
  155. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/compaction.py +0 -0
  156. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/kg_packets.py +0 -0
  157. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/memact_composer.py +0 -0
  158. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/recall_levels.py +0 -0
  159. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/token_budget.py +0 -0
  160. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/__init__.py +0 -0
  161. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  162. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/json_stringify.py +0 -0
  163. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/__init__.py +0 -0
  164. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/convenience.py +0 -0
  165. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/registry.py +0 -0
  166. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/scheduler.py +0 -0
  167. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/__init__.py +0 -0
  168. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/base.py +0 -0
  169. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/commands.py +0 -0
  170. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/in_memory.py +0 -0
  171. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/json_files.py +0 -0
  172. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/ledger_chain.py +0 -0
  173. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/observable.py +0 -0
  174. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/offloading.py +0 -0
  175. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/snapshots.py +0 -0
  176. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/sqlite.py +0 -0
  177. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  178. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  179. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  180. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  181. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  182. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  183. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  184. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  185. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  186. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  187. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  188. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  189. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  190. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  191. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  192. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  193. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  194. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  195. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  196. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  197. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  198. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  199. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/models.py +0 -0
  200. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  201. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  202. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  203. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/README.md +0 -0
  204. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/conftest.py +0 -0
  205. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_comms_facade.py +0 -0
  206. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_discovery_facade.py +0 -0
  207. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_host_facade.py +0 -0
  208. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_run_facade.py +0 -0
  209. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_telegram_facade.py +0 -0
  210. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_active_context_policy.py +0 -0
  211. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_active_memory.py +0 -0
  212. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_answer_user_effect.py +0 -0
  213. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_chat_summarizer_integration.py +0 -0
  214. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_command_store.py +0 -0
  215. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_compaction_helpers.py +0 -0
  216. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_control_adapter_while.py +0 -0
  217. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_comms_gating.py +0 -0
  218. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_files.py +0 -0
  219. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_folders.py +0 -0
  220. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_search_files_executor.py +0 -0
  221. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_durable_toolsets.py +0 -0
  222. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  223. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_emit_event_without_workflow_registry.py +0 -0
  224. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_evidence_recorder.py +0 -0
  225. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  226. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_integration_abstractcore.py +0 -0
  227. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_integrations_abstractcore.py +0 -0
  228. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_json_file_run_store_children_index.py +0 -0
  229. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_jsonl_ledger_recovery.py +0 -0
  230. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_kg_learn_and_recall_contract.py +0 -0
  231. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_ledger_chain.py +0 -0
  232. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_ledger_subscription.py +0 -0
  233. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs.py +0 -0
  234. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  235. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  236. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_requires_prompt.py +0 -0
  237. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_response_schema_normalization.py +0 -0
  238. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_structured_output_fallback.py +0 -0
  239. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  240. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  241. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  242. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_media_artifacts.py +0 -0
  243. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_system_context.py +0 -0
  244. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_tool_call_parsing.py +0 -0
  245. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  246. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_remote_tool_executor.py +0 -0
  247. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_logging.py +0 -0
  248. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_security.py +0 -0
  249. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_stdio.py +0 -0
  250. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memact_composer_from_kg_result.py +0 -0
  251. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  252. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_packets.py +0 -0
  253. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  254. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  255. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  256. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  257. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_note_effect.py +0 -0
  258. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_query_effect.py +0 -0
  259. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_query_rich_filters.py +0 -0
  260. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  261. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_tag_effect.py +0 -0
  262. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mlx_generation_serialization.py +0 -0
  263. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_multimodal_abstractcore_integration.py +0 -0
  264. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_offloading.py +0 -0
  265. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_packaging_extras.py +0 -0
  266. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_pause_resume.py +0 -0
  267. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_prompt_cache_export_import.py +0 -0
  268. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_prompt_cache_modules.py +0 -0
  269. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_queryable_run_store.py +0 -0
  270. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  271. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_real_integration.py +0 -0
  272. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_recall_levels_policy.py +0 -0
  273. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_remote_llm_client.py +0 -0
  274. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_rendering_agent_trace_report.py +0 -0
  275. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_rendering_json_stringify.py +0 -0
  276. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_retry_idempotency.py +0 -0
  277. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_run_history_bundle.py +0 -0
  278. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  279. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_effect_invocation_trace.py +0 -0
  280. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_install_boundary.py +0 -0
  281. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  282. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_node_traces.py +0 -0
  283. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  284. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_scheduler.py +0 -0
  285. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  286. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_snapshots.py +0 -0
  287. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_sqlite_ledger_store.py +0 -0
  288. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_async_wait.py +0 -0
  289. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  290. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  291. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_storage_deletion.py +0 -0
  292. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_structured_output_schema_enum.py +0 -0
  293. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_subworkflow.py +0 -0
  294. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_terminal_effect_completion.py +0 -0
  295. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  296. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  297. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_approval_executor.py +0 -0
  298. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_approval_resume_executes.py +0 -0
  299. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_calls_idempotency_keys.py +0 -0
  300. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_argument_sanitization.py +0 -0
  301. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_error_output_detection.py +0 -0
  302. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_filename_alias.py +0 -0
  303. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  304. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_read_file_aliases.py +0 -0
  305. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_timeout.py +0 -0
  306. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_wait_allowlist_safety.py +0 -0
  307. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_trace_context_propagation.py +0 -0
  308. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_vars_query_effect.py +0 -0
  309. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  310. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  311. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  312. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  313. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  314. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  315. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memact_compose_node.py +0 -0
  316. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  317. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  318. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  319. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_builtin.py +0 -0
  320. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  321. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_call_tool_node.py +0 -0
  322. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_compiler_basic.py +0 -0
  323. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  324. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_get_element_node.py +0 -0
  325. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_get_random_element_node.py +0 -0
  326. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_has_tools_builtin.py +0 -0
  327. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  328. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  329. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_make_object_node.py +0 -0
  330. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  331. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_memory_source_pins.py +0 -0
  332. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_prompt_only.py +0 -0
  333. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_random_nodes.py +0 -0
  334. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_string_contains_replace.py +0 -0
  335. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_tool_parameters_node.py +0 -0
  336. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_wait_event_prompt_metadata.py +0 -0
  337. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workflow_bundle_registry.py +0 -0
  338. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  339. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  340. {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.25] - 2026-05-29
11
+
12
+ ### Added
13
+ - File-backed artifact stores now expose `content_path(...)` for hosts that need a stable local path while in-memory stores continue to return `None`.
14
+
15
+ ### Changed
16
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.30` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core media/plugin floors and image-to-image residency truth.
17
+
18
+ ### Fixed
19
+ - Artifact-backed media resolution now preserves image roles such as `source` and `mask`, keeping image-edit and image-to-video requests wired correctly through AbstractCore.
20
+ - Model-residency discovery now treats `image_to_image` as its own vision task and deduplicates shared loaded-model records when task is omitted.
21
+
10
22
  ## [0.4.24] - 2026-05-26
11
23
 
12
24
  ### Added
@@ -558,7 +570,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
558
570
 
559
571
  Initial development version with basic proof-of-concept features.
560
572
 
561
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...HEAD
573
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.25...HEAD
574
+ [0.4.25]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...v0.4.25
562
575
  [0.4.24]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...v0.4.24
563
576
  [0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
564
577
  [0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.24
3
+ Version: 0.4.25
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -23,24 +23,24 @@ Requires-Python: >=3.10
23
23
  Requires-Dist: abstractmemory>=0.2.6
24
24
  Requires-Dist: abstractsemantics>=0.0.3
25
25
  Provides-Extra: abstractcore
26
- Requires-Dist: abstractcore>=2.13.29; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.30; extra == 'abstractcore'
27
27
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'abstractcore'
28
28
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'abstractcore'
29
29
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'abstractcore'
30
30
  Provides-Extra: all-apple
31
- Requires-Dist: abstractcore[all-apple]>=2.13.29; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.30; extra == 'all-apple'
32
32
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-apple'
33
33
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-apple'
34
34
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-apple'
35
35
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-apple'
36
36
  Provides-Extra: all-gpu
37
- Requires-Dist: abstractcore[all-gpu]>=2.13.29; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.30; extra == 'all-gpu'
38
38
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-gpu'
39
39
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-gpu'
40
40
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-gpu'
41
41
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-gpu'
42
42
  Provides-Extra: apple
43
- Requires-Dist: abstractcore[apple]>=2.13.29; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.30; extra == 'apple'
44
44
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'apple'
45
45
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'apple'
46
46
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'apple'
@@ -50,18 +50,18 @@ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
50
50
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
51
51
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
52
52
  Provides-Extra: gpu
53
- Requires-Dist: abstractcore[gpu]>=2.13.29; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.30; extra == 'gpu'
54
54
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'gpu'
55
55
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'gpu'
56
56
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'gpu'
57
57
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'gpu'
58
58
  Provides-Extra: mcp-worker
59
- Requires-Dist: abstractcore[tools]>=2.13.29; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.30; extra == 'mcp-worker'
60
60
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'mcp-worker'
61
61
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'mcp-worker'
62
62
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'mcp-worker'
63
63
  Provides-Extra: multimodal
64
- Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.29; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.30; extra == 'multimodal'
65
65
  Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'multimodal'
66
66
  Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'multimodal'
67
67
  Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'multimodal'
@@ -81,7 +81,7 @@ Description-Content-Type: text/markdown
81
81
 
82
82
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
83
83
 
84
- **Version:** 0.4.24 • **Python:** 3.10+
84
+ **Version:** 0.4.25 • **Python:** 3.10+
85
85
 
86
86
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
87
87
 
@@ -115,7 +115,7 @@ AbstractCore integration (LLM + tools):
115
115
  pip install "abstractruntime[abstractcore]"
116
116
  ```
117
117
 
118
- The `abstractcore` extra installs AbstractCore 2.13.29 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`, including `abstractmusic>=0.1.12`).
118
+ The `abstractcore` extra installs AbstractCore 2.13.30 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
119
119
 
120
120
  Hardware profile cascades are available for native Python installs:
121
121
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -169,7 +169,7 @@ state = rt.resume(
169
169
  assert state.status.value == "completed"
170
170
  ```
171
171
 
172
- ## What’s included (v0.4.24)
172
+ ## What’s included (v0.4.25)
173
173
 
174
174
  Kernel (dependency-light):
175
175
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.4.24 • **Python:** 3.10+
7
+ **Version:** 0.4.25 • **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.29 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`, including `abstractmusic>=0.1.12`).
41
+ The `abstractcore` extra installs AbstractCore 2.13.30 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
42
42
 
43
43
  Hardware profile cascades are available for native Python installs:
44
44
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -92,7 +92,7 @@ state = rt.resume(
92
92
  assert state.status.value == "completed"
93
93
  ```
94
94
 
95
- ## What’s included (v0.4.24)
95
+ ## What’s included (v0.4.25)
96
96
 
97
97
  Kernel (dependency-light):
98
98
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -180,7 +180,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
180
180
 
181
181
  ### AbstractCore (LLM + tools)
182
182
 
183
- Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.29 or newer).
183
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.30 or newer).
184
184
 
185
185
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
186
186
 
@@ -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.29 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery. Use `abstractruntime[multimodal]` when your workflows need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`, including `abstractmusic>=0.1.12`).
21
+ This installs AbstractCore 2.13.30 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery. Use `abstractruntime[multimodal]` when your workflows need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
22
22
 
23
23
  ## Mental model (source of truth)
24
24
 
@@ -16,7 +16,7 @@ Implementation pointers (this repo):
16
16
  pip install "abstractruntime[abstractcore]"
17
17
  ```
18
18
 
19
- This extra installs AbstractCore 2.13.29 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery.
19
+ This extra installs AbstractCore 2.13.30 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery.
20
20
 
21
21
  For AbstractCore's multimodal `generate(..., output=...)` path, use the newer baseline and optional media packages:
22
22
 
@@ -24,7 +24,7 @@ For AbstractCore's multimodal `generate(..., output=...)` path, use the newer ba
24
24
  pip install "abstractruntime[multimodal]"
25
25
  ```
26
26
 
27
- This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`. Local image/video/voice/music generation still depends on the configured AbstractCore capability backends (for example AbstractVision, AbstractVoice, and AbstractMusic, or OpenAI/OpenAI-compatible remote engines). With `abstractmusic>=0.1.12`, the base music extra includes the lightweight remote ACE Music backend without local model-runtime extras.
27
+ This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`. Local image/video/voice/music generation still depends on the configured AbstractCore capability backends (for example AbstractVision, AbstractVoice, and AbstractMusic, or OpenAI/OpenAI-compatible remote engines). With `abstractmusic>=0.1.12`, the base music extra includes the lightweight remote ACE Music backend without local model-runtime extras.
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -21,7 +21,7 @@ Fix:
21
21
  - `abstractruntime[abstractcore]` for LLM/tools integration.
22
22
  - `abstractruntime[multimodal]` for common image, voice, audio, and music dependencies.
23
23
  - `abstractruntime[mcp-worker]` for the MCP worker entry point.
24
- - The current AbstractCore integration expects `abstractcore>=2.13.29`.
24
+ - The current AbstractCore integration expects `abstractcore>=2.13.30`.
25
25
 
26
26
  Verify:
27
27
 
@@ -10,11 +10,11 @@ This file is an **agent-oriented build guide** for the AbstractRuntime *library*
10
10
 
11
11
  Quick facts:
12
12
  - Python: 3.10+ (`pyproject.toml`)
13
- - Version: 0.4.24
13
+ - Version: 0.4.25
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.29`
17
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`
16
+ - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
18
18
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned env/config should be translated into explicit Runtime inputs or Runtime-owned env names.
19
19
 
20
20
  ```mermaid
@@ -3,11 +3,11 @@
3
3
  > Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
4
 
5
5
  - Python: 3.10+ (see `pyproject.toml`)
6
- - Version: 0.4.24
6
+ - Version: 0.4.25
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.29`
10
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.29`
9
+ - Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
10
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
11
11
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names.
12
12
 
13
13
  ## Start here
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.4.24"
7
+ version = "0.4.25"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -46,14 +46,14 @@ dependencies = [
46
46
  [project.optional-dependencies]
47
47
  # Enables `abstractruntime.integrations.abstractcore.*` imports.
48
48
  abstractcore = [
49
- "abstractcore>=2.13.29",
49
+ "abstractcore>=2.13.30",
50
50
  "openai<2.0.0,>=1.109.1",
51
51
  "httpx<1.0.0,>=0.28.1",
52
52
  "anyio<5.0.0,>=4.12.1",
53
53
  ]
54
54
 
55
55
  apple = [
56
- "abstractcore[apple]>=2.13.29",
56
+ "abstractcore[apple]>=2.13.30",
57
57
  "openai<2.0.0,>=1.109.1",
58
58
  "httpx<1.0.0,>=0.28.1",
59
59
  "anyio<5.0.0,>=4.12.1",
@@ -61,7 +61,7 @@ apple = [
61
61
  ]
62
62
 
63
63
  gpu = [
64
- "abstractcore[gpu]>=2.13.29",
64
+ "abstractcore[gpu]>=2.13.30",
65
65
  "openai<2.0.0,>=1.109.1",
66
66
  "httpx<1.0.0,>=0.28.1",
67
67
  "anyio<5.0.0,>=4.12.1",
@@ -69,7 +69,7 @@ gpu = [
69
69
  ]
70
70
 
71
71
  all-apple = [
72
- "abstractcore[all-apple]>=2.13.29",
72
+ "abstractcore[all-apple]>=2.13.30",
73
73
  "openai<2.0.0,>=1.109.1",
74
74
  "httpx<1.0.0,>=0.28.1",
75
75
  "anyio<5.0.0,>=4.12.1",
@@ -77,7 +77,7 @@ all-apple = [
77
77
  ]
78
78
 
79
79
  all-gpu = [
80
- "abstractcore[all-gpu]>=2.13.29",
80
+ "abstractcore[all-gpu]>=2.13.30",
81
81
  "openai<2.0.0,>=1.109.1",
82
82
  "httpx<1.0.0,>=0.28.1",
83
83
  "anyio<5.0.0,>=4.12.1",
@@ -87,7 +87,7 @@ all-gpu = [
87
87
  # Enables AbstractCore multimodal generation helpers with common image/voice/
88
88
  # audio/music capability packages.
89
89
  multimodal = [
90
- "abstractcore[remote,vision,voice,audio,music]>=2.13.29",
90
+ "abstractcore[remote,vision,voice,audio,music]>=2.13.30",
91
91
  "openai<2.0.0,>=1.109.1",
92
92
  "httpx<1.0.0,>=0.28.1",
93
93
  "anyio<5.0.0,>=4.12.1",
@@ -101,7 +101,7 @@ multimodal = [
101
101
 
102
102
  # Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
103
103
  mcp-worker = [
104
- "abstractcore[tools]>=2.13.29",
104
+ "abstractcore[tools]>=2.13.30",
105
105
  "openai<2.0.0,>=1.109.1",
106
106
  "httpx<1.0.0,>=0.28.1",
107
107
  "anyio<5.0.0,>=4.12.1",
@@ -0,0 +1,9 @@
1
+ ### Added
2
+ - File-backed artifact stores now expose `content_path(...)` for hosts that need a stable local path while in-memory stores continue to return `None`.
3
+
4
+ ### Changed
5
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.30` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core media/plugin floors and image-to-image residency truth.
6
+
7
+ ### Fixed
8
+ - Artifact-backed media resolution now preserves image roles such as `source` and `mask`, keeping image-edit and image-to-video requests wired correctly through AbstractCore.
9
+ - Model-residency discovery now treats `image_to_image` as its own vision task and deduplicates shared loaded-model records when task is omitted.
@@ -780,6 +780,11 @@ def _resolve_llm_call_media(
780
780
  except Exception as e:
781
781
  return None, f"Failed to materialize artifact '{artifact_id}': {e}"
782
782
  resolved: Dict[str, Any] = {"file_path": str(p), "$artifact": str(artifact_id), "artifact_id": str(artifact_id)}
783
+ if isinstance(item, dict):
784
+ for key in ("role", "purpose", "kind"):
785
+ raw_role = item.get(key)
786
+ if isinstance(raw_role, str) and raw_role.strip():
787
+ resolved[key] = raw_role.strip()
783
788
  if content_type:
784
789
  resolved["content_type"] = content_type
785
790
  base_type = content_type.split(";", 1)[0].strip().lower()
@@ -2145,10 +2145,10 @@ def _normalize_residency_task(task: Any) -> str:
2145
2145
  "vision": "image_generation",
2146
2146
  "t2i": "image_generation",
2147
2147
  "text_to_image": "image_generation",
2148
- "i2i": "image_generation",
2149
- "image_to_image": "image_generation",
2150
- "image_edit": "image_generation",
2151
- "edit_image": "image_generation",
2148
+ "i2i": "image_to_image",
2149
+ "image_to_image": "image_to_image",
2150
+ "image_edit": "image_to_image",
2151
+ "edit_image": "image_to_image",
2152
2152
  "video": "video_generation",
2153
2153
  "videos": "video_generation",
2154
2154
  "video_generation": "video_generation",
@@ -2189,6 +2189,7 @@ def _residency_task_filter(task: Any) -> Optional[str]:
2189
2189
 
2190
2190
  _LOCAL_CAPABILITY_RESIDENCY_LIST_TASKS = (
2191
2191
  "image_generation",
2192
+ "image_to_image",
2192
2193
  "video_generation",
2193
2194
  "text_to_video",
2194
2195
  "image_to_video",
@@ -2223,7 +2224,7 @@ def _model_residency_unsupported_payload(
2223
2224
  "diagnostics": {"source": "abstractruntime"},
2224
2225
  "affected_models": [],
2225
2226
  }
2226
- if task_s in {"image_generation", "video_generation", "text_to_video", "image_to_video"}:
2227
+ if task_s in {"image_generation", "image_to_image", "video_generation", "text_to_video", "image_to_video"}:
2227
2228
  payload["execution_mode"] = "local_one_shot_subprocess"
2228
2229
  payload["local_media_residency_backend"] = "none"
2229
2230
  payload["requires_long_lived_core_backend"] = True
@@ -2285,6 +2286,16 @@ def _local_model_residency_capabilities(*, mode: str, source: str, text_loads_ot
2285
2286
  "requires_installed_capability_plugin": True,
2286
2287
  },
2287
2288
  ),
2289
+ "image_to_image": _model_residency_capability_task(
2290
+ task="image_to_image",
2291
+ supported=True,
2292
+ truth_source="abstractcore.capability_plugin",
2293
+ extra={
2294
+ "local_media_residency_backend": "capability_plugin",
2295
+ "requires_installed_capability_plugin": True,
2296
+ "shares_backend_cache_with": "image_generation",
2297
+ },
2298
+ ),
2288
2299
  "text_to_video": _model_residency_capability_task(
2289
2300
  task="text_to_video",
2290
2301
  supported=True,
@@ -2680,7 +2691,7 @@ def _local_capability_residency_target(core: Any, task: str) -> Tuple[Any, str]:
2680
2691
  return getattr(core, "audio", None), "audio"
2681
2692
  if task_s == "music_generation":
2682
2693
  return getattr(core, "music", None), "music"
2683
- if task_s == "image_generation":
2694
+ if task_s in {"image_generation", "image_to_image"}:
2684
2695
  return getattr(core, "vision", None), "vision"
2685
2696
  raise ValueError(f"Unsupported local capability residency task: {task!r}")
2686
2697
 
@@ -2762,7 +2773,22 @@ def _local_all_model_residency_result(
2762
2773
  if isinstance(result, dict) and result.get("ok") is False and result.get("error"):
2763
2774
  task_errors[task_s] = str(result.get("error"))
2764
2775
 
2765
- records = sorted(records, key=lambda item: str(item.get("runtime_id") or item.get("load_id") or ""))
2776
+ deduped: List[Dict[str, Any]] = []
2777
+ seen_record_keys: set[str] = set()
2778
+ for record in records:
2779
+ record_key = str(record.get("runtime_id") or record.get("load_id") or "").strip()
2780
+ if not record_key:
2781
+ record_key = "|".join(
2782
+ str(record.get(key) or "").strip()
2783
+ for key in ("task", "provider", "model")
2784
+ )
2785
+ if record_key and record_key in seen_record_keys:
2786
+ continue
2787
+ if record_key:
2788
+ seen_record_keys.add(record_key)
2789
+ deduped.append(record)
2790
+
2791
+ records = sorted(deduped, key=lambda item: str(item.get("runtime_id") or item.get("load_id") or ""))
2766
2792
  diagnostics: Dict[str, Any] = {"source": source, "count": len(records), "task_counts": task_counts}
2767
2793
  if task_errors:
2768
2794
  diagnostics["task_errors"] = task_errors
@@ -7085,6 +7111,12 @@ class RemoteAbstractCoreLLMClient:
7085
7111
  supported=True,
7086
7112
  truth_source="abstractcore.server./acore/models",
7087
7113
  ),
7114
+ "image_to_image": _model_residency_capability_task(
7115
+ task="image_to_image",
7116
+ supported=True,
7117
+ truth_source="abstractcore.server./acore/models",
7118
+ extra={"shares_backend_cache_with": "image_generation"},
7119
+ ),
7088
7120
  "text_to_video": _model_residency_capability_task(
7089
7121
  task="text_to_video",
7090
7122
  supported=True,
@@ -273,6 +273,14 @@ class ArtifactStore(ABC):
273
273
  candidates.sort(key=lambda m: m.created_at, reverse=True)
274
274
  return candidates[:limit]
275
275
 
276
+ def content_path(self, artifact_id: str) -> Optional[Path]:
277
+ """Return a local content path when this store is file-backed.
278
+
279
+ Stores that cannot expose a stable local file path return ``None``; callers
280
+ should fall back to ``load()``.
281
+ """
282
+ return None
283
+
276
284
  # Convenience methods
277
285
 
278
286
  def store_text(
@@ -453,6 +461,10 @@ class FileArtifactStore(ArtifactStore):
453
461
  return self._blob_path(blob_id.strip())
454
462
  return self._legacy_content_path(artifact_id)
455
463
 
464
+ def content_path(self, artifact_id: str) -> Optional[Path]:
465
+ path = self._content_path(artifact_id)
466
+ return path if path.exists() else None
467
+
456
468
  def _metadata_path(self, artifact_id: str) -> Path:
457
469
  validate_artifact_id(artifact_id)
458
470
  p = self._ref_metadata_path(artifact_id)
@@ -235,6 +235,26 @@ class TestFileArtifactStore:
235
235
  artifact = store.load(metadata.artifact_id)
236
236
  assert artifact.content == content
237
237
 
238
+ def test_content_path_is_public_for_file_backed_store(self):
239
+ """File stores expose a stable content path; memory stores do not."""
240
+ memory_store = InMemoryArtifactStore()
241
+ memory_meta = memory_store.store(b"in memory", content_type="text/plain")
242
+ assert memory_store.content_path(memory_meta.artifact_id) is None
243
+
244
+ with tempfile.TemporaryDirectory() as tmpdir:
245
+ store = FileArtifactStore(tmpdir)
246
+ metadata = store.store(b"Persistent content", content_type="text/plain", run_id="run-1")
247
+ path = store.content_path(metadata.artifact_id)
248
+ assert path is not None
249
+ assert path.exists()
250
+ assert path.read_bytes() == b"Persistent content"
251
+
252
+ restarted = FileArtifactStore(tmpdir)
253
+ restarted_path = restarted.content_path(metadata.artifact_id)
254
+ assert restarted_path is not None
255
+ assert restarted_path.exists()
256
+ assert restarted_path.read_bytes() == b"Persistent content"
257
+
238
258
  def test_persistence_across_instances(self):
239
259
  """Artifacts persist across store instances."""
240
260
  with tempfile.TemporaryDirectory() as tmpdir:
@@ -64,3 +64,36 @@ def test_effect_handler_materialized_audio_artifact_preserves_content_type(tmp_p
64
64
  assert item["type"] == "audio"
65
65
  assert Path(item["file_path"]).suffix == ".wav"
66
66
  assert BaseProvider._media_type(item) == "audio"
67
+
68
+
69
+ def test_effect_handler_materialized_image_artifacts_preserve_roles(tmp_path: Path) -> None:
70
+ from abstractruntime.integrations.abstractcore.effect_handlers import _resolve_llm_call_media
71
+
72
+ class Artifact:
73
+ content = PNG_1X1 = (
74
+ b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR"
75
+ b"\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00"
76
+ b"\x1f\x15\xc4\x89"
77
+ )
78
+ content_type = "image/png"
79
+ metadata = None
80
+
81
+ class Store:
82
+ def load(self, artifact_id: str) -> Artifact:
83
+ assert artifact_id in {"source-img", "mask-img"}
84
+ return Artifact()
85
+
86
+ resolved, error = _resolve_llm_call_media(
87
+ [
88
+ {"$artifact": "source-img", "content_type": "image/png", "role": "source"},
89
+ {"$artifact": "mask-img", "content_type": "image/png", "role": "mask"},
90
+ ],
91
+ artifact_store=Store(),
92
+ temp_dir=tmp_path,
93
+ )
94
+
95
+ assert error is None
96
+ assert isinstance(resolved, list)
97
+ assert [item.get("role") for item in resolved] == ["source", "mask"]
98
+ assert all(item.get("type") == "image" for item in resolved)
99
+ assert all(Path(str(item.get("file_path") or "")).is_file() for item in resolved)
@@ -872,6 +872,8 @@ def test_model_residency_capabilities_describe_core_backed_truth_by_task() -> No
872
872
  assert local_caps["tasks"]["text_generation"]["truth_source"] == "abstractcore.provider.get_model_residency"
873
873
  assert local_caps["tasks"]["image_generation"]["supported"] is True
874
874
  assert local_caps["tasks"]["image_generation"]["truth_source"] == "abstractcore.capability_plugin"
875
+ assert local_caps["tasks"]["image_to_image"]["supported"] is True
876
+ assert local_caps["tasks"]["image_to_image"]["shares_backend_cache_with"] == "image_generation"
875
877
  assert local_caps["tasks"]["video_generation"]["supported"] is True
876
878
  assert local_caps["tasks"]["text_to_video"]["supported"] is True
877
879
  assert local_caps["tasks"]["image_to_video"]["supported"] is True
@@ -882,6 +884,8 @@ def test_model_residency_capabilities_describe_core_backed_truth_by_task() -> No
882
884
  assert multi_caps["tasks"]["tts"]["local_media_residency_backend"] == "capability_plugin"
883
885
  assert remote_caps["relay_only"] is True
884
886
  assert remote_caps["tasks"]["image_generation"]["truth_source"] == "abstractcore.server./acore/models"
887
+ assert remote_caps["tasks"]["image_to_image"]["truth_source"] == "abstractcore.server./acore/models"
888
+ assert remote_caps["tasks"]["image_to_image"]["supported"] is True
885
889
  assert remote_caps["tasks"]["video_generation"]["truth_source"] == "abstractcore.server./acore/models"
886
890
  assert remote_caps["tasks"]["text_to_video"]["supported"] is True
887
891
  assert remote_caps["tasks"]["image_to_video"]["supported"] is True
@@ -47,6 +47,8 @@ def test_generate_image_node_compiles_to_llm_call_output_selector() -> None:
47
47
  "width": 512,
48
48
  "height": 512,
49
49
  "steps": 8,
50
+ "seed": 1234,
51
+ "guidance_scale": 6.5,
50
52
  },
51
53
  )
52
54
 
@@ -65,6 +67,8 @@ def test_generate_image_node_compiles_to_llm_call_output_selector() -> None:
65
67
  assert output["width"] == 512
66
68
  assert output["height"] == 512
67
69
  assert output["steps"] == 8
70
+ assert output["seed"] == 1234
71
+ assert output["guidance_scale"] == 6.5
68
72
 
69
73
 
70
74
  def test_generate_image_legacy_provider_model_are_not_media_fallbacks() -> None:
@@ -112,6 +116,8 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
112
116
  "format": "png",
113
117
  "size": "1024x1024",
114
118
  "strength": 0.65,
119
+ "seed": 1234,
120
+ "guidance_scale": 6.5,
115
121
  },
116
122
  )
117
123
 
@@ -127,6 +133,8 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
127
133
  assert output["model"] == "gpt-image-1"
128
134
  assert output["size"] == "1024x1024"
129
135
  assert output["strength"] == 0.65
136
+ assert output["seed"] == 1234
137
+ assert output["guidance_scale"] == 6.5
130
138
  assert media[0]["$artifact"] == "source-img"
131
139
  assert media[0]["type"] == "image"
132
140
  assert media[0]["role"] == "source"
@@ -137,13 +145,15 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
137
145
  def test_image_to_image_alias_compiles_to_image_edit_selector() -> None:
138
146
  plan = _plan_for_node(
139
147
  "image_to_image",
140
- {"prompt": "Add clouds.", "source_image": "img-1"},
148
+ {"prompt": "Add clouds.", "source_image": "img-1", "seed": 42, "guidance_scale": 5.5},
141
149
  )
142
150
 
143
151
  assert plan.effect is not None
144
152
  payload = dict(plan.effect.payload or {})
145
153
  output = dict(payload.get("output") or {})
146
154
  assert output["task"] == "image_edit"
155
+ assert output["seed"] == 42
156
+ assert output["guidance_scale"] == 5.5
147
157
  assert payload["media"] == [{"type": "image", "role": "source", "$artifact": "img-1"}]
148
158
 
149
159
 
@@ -160,6 +170,7 @@ def test_generate_video_node_compiles_to_llm_call_video_selector() -> None:
160
170
  "frames": 121,
161
171
  "fps": 24,
162
172
  "steps": 50,
173
+ "seed": 4321,
163
174
  "guidance_scale": 5.0,
164
175
  },
165
176
  )
@@ -181,6 +192,7 @@ def test_generate_video_node_compiles_to_llm_call_video_selector() -> None:
181
192
  assert output["num_frames"] == 121
182
193
  assert output["fps"] == 24
183
194
  assert output["steps"] == 50
195
+ assert output["seed"] == 4321
184
196
  assert output["guidance_scale"] == 5.0
185
197
 
186
198
 
@@ -193,6 +205,8 @@ def test_image_to_video_node_compiles_to_llm_call_video_selector() -> None:
193
205
  "video_provider": "mlx-gen",
194
206
  "video_model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
195
207
  "frames": 41,
208
+ "seed": 4321,
209
+ "guidance_scale": 5.0,
196
210
  },
197
211
  )
198
212
 
@@ -204,6 +218,8 @@ def test_image_to_video_node_compiles_to_llm_call_video_selector() -> None:
204
218
  assert output["provider"] == "mlx-gen"
205
219
  assert output["model"] == "Wan-AI/Wan2.2-TI2V-5B-Diffusers"
206
220
  assert output["num_frames"] == 41
221
+ assert output["seed"] == 4321
222
+ assert output["guidance_scale"] == 5.0
207
223
  assert payload["media"] == [{"type": "image", "role": "source", "$artifact": "img-1"}]
208
224
 
209
225
 
@@ -1,11 +0,0 @@
1
- ### Added
2
- - Runtime now surfaces AbstractCore/AbstractVision video generation through the existing generated-media boundary:
3
- - `LLM_CALL` output selectors for `{"modality":"video","task":"text_to_video"}` and `{"modality":"video","task":"image_to_video"}`
4
- - remote Core Server routing for `/v1/videos/generations` and `/v1/videos/edits`
5
- - durable run-facade helpers `generate_video(...)` and `image_to_video(...)`
6
- - VisualFlow node lowering for `generate_video` / `text_to_video` and `image_to_video`
7
- - Provider progress callbacks are converted into JSON-safe `abstract.progress` ledger events during `LLM_CALL` execution without persisting Python callback objects.
8
-
9
- ### Changed
10
- - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.29` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with Core video endpoints, video residency tasks, and AbstractVision 0.3.16 progress-capable generation.
11
- - Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document text-to-video, image-to-video, and generated-media progress events.