AbstractRuntime 0.4.2__tar.gz → 0.4.4__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 (300) hide show
  1. abstractruntime-0.4.4/.github/workflows/ci.yml +79 -0
  2. abstractruntime-0.4.4/.github/workflows/release.yml +281 -0
  3. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/.gitignore +2 -1
  4. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/ACKNOWLEDGMENTS.md +3 -3
  5. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/CHANGELOG.md +80 -1
  6. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/CONTRIBUTING.md +5 -1
  7. abstractruntime-0.4.2/README.md → abstractruntime-0.4.4/PKG-INFO +68 -6
  8. abstractruntime-0.4.2/PKG-INFO → abstractruntime-0.4.4/README.md +31 -33
  9. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/ROADMAP.md +1 -1
  10. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/README.md +12 -2
  11. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/api.md +58 -4
  12. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/architecture.md +35 -4
  13. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/README.md +1 -1
  14. abstractruntime-0.4.4/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +74 -0
  15. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/faq.md +58 -0
  16. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/getting-started.md +6 -2
  17. abstractruntime-0.4.4/docs/integrations/abstractcore.md +315 -0
  18. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/limits.md +2 -2
  19. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/manual_testing.md +5 -1
  20. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/proposal.md +11 -1
  21. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/provenance.md +1 -1
  22. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/tools-comms.md +3 -7
  23. abstractruntime-0.4.4/docs/workflow-bundles.md +103 -0
  24. abstractruntime-0.4.4/llms-full.txt +409 -0
  25. abstractruntime-0.4.4/llms.txt +65 -0
  26. abstractruntime-0.4.4/mkdocs.yml +55 -0
  27. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/pyproject.toml +24 -3
  28. abstractruntime-0.4.4/release-notes.md +35 -0
  29. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/config.py +2 -2
  30. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/runtime.py +211 -5
  31. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/vars.py +1 -1
  32. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/__init__.py +10 -1
  33. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +146 -6
  34. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/factory.py +39 -4
  35. abstractruntime-0.4.4/src/abstractruntime/integrations/abstractcore/llm_client.py +3363 -0
  36. abstractruntime-0.4.4/src/abstractruntime/integrations/abstractcore/output_specs.py +173 -0
  37. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/tool_executor.py +129 -1
  38. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/json_files.py +41 -3
  39. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +1 -1
  40. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +149 -1
  41. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/compiler.py +208 -6
  42. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/builtins.py +40 -0
  43. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/executor.py +60 -10
  44. abstractruntime-0.4.4/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +367 -0
  45. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/conftest.py +12 -3
  46. abstractruntime-0.4.4/tests/test_control_adapter_while.py +56 -0
  47. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_factory_timeouts_default_to_abstractcore_config.py +4 -2
  48. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_integration_abstractcore.py +14 -6
  49. abstractruntime-0.4.4/tests/test_jsonl_ledger_recovery.py +21 -0
  50. abstractruntime-0.4.4/tests/test_llm_client_media_artifacts.py +26 -0
  51. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_client_system_context.py +3 -0
  52. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_client_tool_call_parsing.py +4 -0
  53. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_local_runtime_timeout_kwarg_policy.py +2 -1
  54. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_assert_attributes_defaults.py +4 -1
  55. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_predicate_aliasing.py +4 -0
  56. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_query_packetization_restart.py +5 -0
  57. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_query_recall_level_policy.py +4 -0
  58. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_semantic_query_ranking.py +4 -0
  59. abstractruntime-0.4.4/tests/test_multimodal_abstractcore_integration.py +750 -0
  60. abstractruntime-0.4.4/tests/test_prompt_cache_modules.py +405 -0
  61. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_real_integration.py +11 -5
  62. abstractruntime-0.4.4/tests/test_remote_llm_client.py +134 -0
  63. abstractruntime-0.4.4/tests/test_tool_approval_executor.py +93 -0
  64. abstractruntime-0.4.4/tests/test_tool_approval_resume_executes.py +114 -0
  65. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_memact_compose_node.py +6 -0
  66. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_memory_kg_query_outputs_propagate.py +6 -1
  67. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +5 -1
  68. abstractruntime-0.4.4/tests/test_visual_multi_entry_loop_overrides.py +387 -0
  69. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_compiler_basic.py +8 -0
  70. abstractruntime-0.4.4/tests/test_visualflow_llm_call_multimodal_output.py +146 -0
  71. abstractruntime-0.4.2/0 +0 -0
  72. abstractruntime-0.4.2/ACKNOWLEDMENTS.md +0 -4
  73. abstractruntime-0.4.2/CHANGELOD.md +0 -4
  74. abstractruntime-0.4.2/docs/integrations/abstractcore.md +0 -101
  75. abstractruntime-0.4.2/docs/workflow-bundles.md +0 -62
  76. abstractruntime-0.4.2/llms-full.txt +0 -85
  77. abstractruntime-0.4.2/llms.txt +0 -51
  78. abstractruntime-0.4.2/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -1233
  79. abstractruntime-0.4.2/tests/test_remote_llm_client.py +0 -73
  80. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/LICENSE +0 -0
  81. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/SECURITY.md +0 -0
  82. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  83. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  84. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  85. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/adr/README.md +0 -0
  86. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  87. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  88. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/003_wait_primitives.md +0 -0
  89. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  90. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  91. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  92. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  93. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/009_artifact_store.md +0 -0
  94. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  95. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  96. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  97. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  98. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  99. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  100. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  101. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  102. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  103. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  104. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  105. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  106. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/004_tests.md +0 -0
  107. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  108. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  109. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  110. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  111. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/README.md +0 -0
  112. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  113. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  114. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  115. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  116. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  117. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/evidence.md +0 -0
  118. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/mcp-worker.md +0 -0
  119. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/docs/snapshots.md +0 -0
  120. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/emails.config.example.yaml +0 -0
  121. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/01_hello_world.py +0 -0
  122. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/02_ask_user.py +0 -0
  123. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/03_wait_until.py +0 -0
  124. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/04_multi_step.py +0 -0
  125. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/05_persistence.py +0 -0
  126. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/06_llm_integration.py +0 -0
  127. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/07_react_agent.py +0 -0
  128. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/examples/README.md +0 -0
  129. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/pytest.ini +0 -0
  130. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/__init__.py +0 -0
  131. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/__init__.py +0 -0
  132. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/event_keys.py +0 -0
  133. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/models.py +0 -0
  134. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/policy.py +0 -0
  135. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/core/spec.py +0 -0
  136. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/evidence/__init__.py +0 -0
  137. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/evidence/recorder.py +0 -0
  138. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/history_bundle.py +0 -0
  139. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/identity/__init__.py +0 -0
  140. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/identity/fingerprint.py +0 -0
  141. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/__init__.py +0 -0
  142. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  143. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  144. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  145. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  146. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  147. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  148. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  149. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  150. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  151. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  152. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  153. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/__init__.py +0 -0
  154. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/active_context.py +0 -0
  155. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/active_memory.py +0 -0
  156. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/compaction.py +0 -0
  157. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/kg_packets.py +0 -0
  158. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/memact_composer.py +0 -0
  159. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/recall_levels.py +0 -0
  160. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/memory/token_budget.py +0 -0
  161. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/rendering/__init__.py +0 -0
  162. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  163. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/rendering/json_stringify.py +0 -0
  164. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/scheduler/__init__.py +0 -0
  165. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/scheduler/convenience.py +0 -0
  166. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/scheduler/registry.py +0 -0
  167. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/scheduler/scheduler.py +0 -0
  168. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/__init__.py +0 -0
  169. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/artifacts.py +0 -0
  170. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/base.py +0 -0
  171. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/commands.py +0 -0
  172. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/in_memory.py +0 -0
  173. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/ledger_chain.py +0 -0
  174. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/observable.py +0 -0
  175. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/offloading.py +0 -0
  176. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/snapshots.py +0 -0
  177. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/storage/sqlite.py +0 -0
  178. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  179. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  180. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  181. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  182. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  183. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  184. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  185. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  186. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  187. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  188. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  189. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  190. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  191. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  192. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  193. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/workflow_bundle/models.py +0 -0
  194. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  195. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  196. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  197. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/README.md +0 -0
  198. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_active_context_policy.py +0 -0
  199. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_active_memory.py +0 -0
  200. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_answer_user_effect.py +0 -0
  201. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_artifacts.py +0 -0
  202. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_chat_summarizer_integration.py +0 -0
  203. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_command_store.py +0 -0
  204. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_compaction_helpers.py +0 -0
  205. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_default_tools_comms_gating.py +0 -0
  206. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_default_tools_include_skim_files.py +0 -0
  207. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_default_tools_include_skim_folders.py +0 -0
  208. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_default_tools_search_files_executor.py +0 -0
  209. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_durable_toolsets.py +0 -0
  210. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  211. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_emit_event_without_workflow_registry.py +0 -0
  212. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_evidence_recorder.py +0 -0
  213. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_integrations_abstractcore.py +0 -0
  214. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_json_file_run_store_children_index.py +0 -0
  215. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_kg_learn_and_recall_contract.py +0 -0
  216. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_ledger_chain.py +0 -0
  217. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_ledger_subscription.py +0 -0
  218. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_media_artifact_refs.py +0 -0
  219. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  220. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  221. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_requires_prompt.py +0 -0
  222. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_response_schema_normalization.py +0 -0
  223. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_structured_output_fallback.py +0 -0
  224. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  225. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  226. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  227. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_mcp_remote_tool_executor.py +0 -0
  228. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_mcp_worker_logging.py +0 -0
  229. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_mcp_worker_security.py +0 -0
  230. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_mcp_worker_stdio.py +0 -0
  231. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memact_composer_from_kg_result.py +0 -0
  232. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_kg_packets.py +0 -0
  233. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_note_effect.py +0 -0
  234. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_query_effect.py +0 -0
  235. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_query_rich_filters.py +0 -0
  236. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  237. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_memory_tag_effect.py +0 -0
  238. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_mlx_generation_serialization.py +0 -0
  239. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_offloading.py +0 -0
  240. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_packaging_extras.py +0 -0
  241. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_pause_resume.py +0 -0
  242. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_queryable_run_store.py +0 -0
  243. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  244. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_recall_levels_policy.py +0 -0
  245. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_rendering_agent_trace_report.py +0 -0
  246. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_rendering_json_stringify.py +0 -0
  247. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_retry_idempotency.py +0 -0
  248. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_run_history_bundle.py +0 -0
  249. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  250. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  251. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_runtime_node_traces.py +0 -0
  252. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  253. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_scheduler.py +0 -0
  254. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  255. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_snapshots.py +0 -0
  256. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_sqlite_ledger_store.py +0 -0
  257. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_start_subworkflow_async_wait.py +0 -0
  258. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  259. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  260. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_structured_output_schema_enum.py +0 -0
  261. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_subworkflow.py +0 -0
  262. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_terminal_effect_completion.py +0 -0
  263. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  264. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  265. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_calls_idempotency_keys.py +0 -0
  266. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_argument_sanitization.py +0 -0
  267. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_error_output_detection.py +0 -0
  268. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_filename_alias.py +0 -0
  269. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  270. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_read_file_aliases.py +0 -0
  271. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_executor_timeout.py +0 -0
  272. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_tool_wait_allowlist_safety.py +0 -0
  273. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_trace_context_propagation.py +0 -0
  274. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_vars_query_effect.py +0 -0
  275. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  276. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  277. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  278. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  279. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  280. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  281. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_add_message_builtin.py +0 -0
  282. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  283. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_call_tool_node.py +0 -0
  284. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  285. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_get_element_node.py +0 -0
  286. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_get_random_element_node.py +0 -0
  287. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_has_tools_builtin.py +0 -0
  288. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  289. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_make_object_node.py +0 -0
  290. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  291. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_memory_source_pins.py +0 -0
  292. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_prompt_only.py +0 -0
  293. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_random_nodes.py +0 -0
  294. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_string_contains_replace.py +0 -0
  295. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_visualflow_tool_parameters_node.py +0 -0
  296. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_wait_event_prompt_metadata.py +0 -0
  297. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_workflow_bundle_registry.py +0 -0
  298. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  299. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  300. {abstractruntime-0.4.2 → abstractruntime-0.4.4}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -0,0 +1,79 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ test:
17
+ name: Test Python ${{ matrix.python-version }}
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: actions/setup-python@v5
26
+ with:
27
+ python-version: ${{ matrix.python-version }}
28
+ cache: pip
29
+ - name: Install
30
+ run: |
31
+ python -m pip install -U pip
32
+ python -m pip install -e ".[abstractcore,mcp-worker,test]"
33
+ - name: Pytest basic suite
34
+ run: python -m pytest -q -m basic
35
+ - name: Pytest focused runtime suite
36
+ run: |
37
+ python -m pytest -q \
38
+ tests/test_tool_approval_executor.py \
39
+ tests/test_tool_approval_resume_executes.py \
40
+ tests/test_remote_llm_client.py \
41
+ tests/test_prompt_cache_modules.py \
42
+ tests/test_multimodal_abstractcore_integration.py \
43
+ tests/test_visualflow_llm_call_multimodal_output.py \
44
+ tests/test_visual_multi_entry_loop_overrides.py \
45
+ tests/test_control_adapter_while.py \
46
+ tests/test_jsonl_ledger_recovery.py \
47
+ tests/test_llm_client_media_artifacts.py
48
+
49
+ build:
50
+ name: Build distributions
51
+ runs-on: ubuntu-latest
52
+ steps:
53
+ - uses: actions/checkout@v4
54
+ - uses: actions/setup-python@v5
55
+ with:
56
+ python-version: "3.12"
57
+ cache: pip
58
+ - name: Build
59
+ run: |
60
+ python -m pip install -U pip
61
+ python -m pip install build twine
62
+ python -m build
63
+ python -m twine check dist/*
64
+
65
+ docs:
66
+ name: Build docs
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ - uses: actions/setup-python@v5
71
+ with:
72
+ python-version: "3.12"
73
+ cache: pip
74
+ - name: Install
75
+ run: |
76
+ python -m pip install -U pip
77
+ python -m pip install -e ".[docs]"
78
+ - name: MkDocs build
79
+ run: mkdocs build -q
@@ -0,0 +1,281 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: "Release version, with or without the leading v (example: 0.4.3)"
8
+ required: true
9
+ type: string
10
+ publish:
11
+ description: "Publish to PyPI, create the GitHub Release, and deploy docs"
12
+ required: true
13
+ type: boolean
14
+ default: false
15
+ publish_confirmation:
16
+ description: "Required only when publish=true: publish-abstractruntime-<version>"
17
+ required: false
18
+ type: string
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ concurrency:
24
+ group: release-${{ github.ref }}
25
+ cancel-in-progress: false
26
+
27
+ jobs:
28
+ test:
29
+ name: Test Python ${{ matrix.python-version }}
30
+ runs-on: ubuntu-latest
31
+ strategy:
32
+ fail-fast: false
33
+ matrix:
34
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: actions/setup-python@v5
38
+ with:
39
+ python-version: ${{ matrix.python-version }}
40
+ cache: pip
41
+ - name: Install
42
+ run: |
43
+ python -m pip install -U pip
44
+ python -m pip install -e ".[abstractcore,mcp-worker,test]"
45
+ - name: Pytest basic suite
46
+ run: python -m pytest -q -m basic
47
+ - name: Pytest focused runtime suite
48
+ run: |
49
+ python -m pytest -q \
50
+ tests/test_tool_approval_executor.py \
51
+ tests/test_tool_approval_resume_executes.py \
52
+ tests/test_remote_llm_client.py \
53
+ tests/test_prompt_cache_modules.py \
54
+ tests/test_multimodal_abstractcore_integration.py \
55
+ tests/test_visualflow_llm_call_multimodal_output.py \
56
+ tests/test_visual_multi_entry_loop_overrides.py \
57
+ tests/test_control_adapter_while.py \
58
+ tests/test_jsonl_ledger_recovery.py \
59
+ tests/test_llm_client_media_artifacts.py
60
+
61
+ docs:
62
+ name: Build docs
63
+ runs-on: ubuntu-latest
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+ - uses: actions/setup-python@v5
67
+ with:
68
+ python-version: "3.12"
69
+ cache: pip
70
+ - name: Install
71
+ run: |
72
+ python -m pip install -U pip
73
+ python -m pip install -e ".[docs]"
74
+ - name: MkDocs build
75
+ run: mkdocs build -q
76
+
77
+ build:
78
+ name: Validate and build distributions
79
+ runs-on: ubuntu-latest
80
+ needs: [test, docs]
81
+ outputs:
82
+ version: ${{ steps.release-meta.outputs.version }}
83
+ tag: ${{ steps.release-meta.outputs.tag }}
84
+ should_publish: ${{ steps.release-meta.outputs.should_publish }}
85
+ steps:
86
+ - uses: actions/checkout@v4
87
+ with:
88
+ fetch-depth: 0
89
+ - uses: actions/setup-python@v5
90
+ with:
91
+ python-version: "3.12"
92
+ cache: pip
93
+ - name: Install build tools
94
+ run: |
95
+ python -m pip install -U pip
96
+ python -m pip install build twine
97
+ - name: Validate version, changelog, tag, and publish guard
98
+ id: release-meta
99
+ env:
100
+ RELEASE_INPUT_VERSION: ${{ inputs.version }}
101
+ RELEASE_PUBLISH: ${{ inputs.publish }}
102
+ RELEASE_CONFIRMATION: ${{ inputs.publish_confirmation || '' }}
103
+ run: |
104
+ python - <<'PY'
105
+ import json
106
+ import os
107
+ import re
108
+ import subprocess
109
+ import tomllib
110
+ import urllib.error
111
+ import urllib.request
112
+ from pathlib import Path
113
+
114
+ raw_version = os.environ["RELEASE_INPUT_VERSION"].strip()
115
+ version = raw_version[1:] if raw_version.startswith("v") else raw_version
116
+ if not re.fullmatch(r"\d+\.\d+\.\d+(?:[a-zA-Z0-9.-]+)?", version):
117
+ raise SystemExit(f"Invalid release version: {raw_version!r}")
118
+ tag = f"v{version}"
119
+
120
+ pyproject = tomllib.loads(Path("pyproject.toml").read_text(encoding="utf-8"))
121
+ package_version = pyproject["project"]["version"]
122
+ if version != package_version:
123
+ raise SystemExit(
124
+ f"Requested version {version!r} does not match pyproject.toml version {package_version!r}"
125
+ )
126
+
127
+ changelog = Path("CHANGELOG.md").read_text(encoding="utf-8")
128
+ header = re.search(rf"^## \[{re.escape(version)}\] - .+$", changelog, re.MULTILINE)
129
+ if not header:
130
+ raise SystemExit(f"CHANGELOG.md has no entry for {version}")
131
+
132
+ rest = changelog[header.end():]
133
+ next_header = re.search(r"^## \[", rest, re.MULTILINE)
134
+ notes = rest[: next_header.start() if next_header else len(rest)].strip()
135
+ if not notes:
136
+ raise SystemExit(f"CHANGELOG.md entry for {version} is empty")
137
+ Path("release-notes.md").write_text(notes + "\n", encoding="utf-8")
138
+
139
+ publish = os.environ["RELEASE_PUBLISH"].lower() == "true"
140
+ if publish:
141
+ if os.environ.get("GITHUB_REF") != "refs/heads/main":
142
+ raise SystemExit("Publishing is only allowed from the main branch.")
143
+
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
+
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}.")
161
+
162
+ try:
163
+ with urllib.request.urlopen(
164
+ f"https://pypi.org/pypi/AbstractRuntime/{version}/json",
165
+ timeout=20,
166
+ ) as response:
167
+ json.load(response)
168
+ raise SystemExit(f"PyPI already has AbstractRuntime {version}.")
169
+ except urllib.error.HTTPError as exc:
170
+ if exc.code != 404:
171
+ raise
172
+
173
+ output = Path(os.environ["GITHUB_OUTPUT"])
174
+ with output.open("a", encoding="utf-8") as fh:
175
+ print(f"version={version}", file=fh)
176
+ print(f"tag={tag}", file=fh)
177
+ print(f"should_publish={str(publish).lower()}", file=fh)
178
+ PY
179
+ - name: Build
180
+ run: python -m build
181
+ - name: Check distributions
182
+ run: python -m twine check dist/*
183
+ - uses: actions/upload-artifact@v4
184
+ with:
185
+ name: release-dist
186
+ path: dist/*
187
+ - uses: actions/upload-artifact@v4
188
+ with:
189
+ name: release-notes
190
+ path: release-notes.md
191
+
192
+ ensure-tag:
193
+ name: Ensure release tag
194
+ runs-on: ubuntu-latest
195
+ needs: build
196
+ if: needs.build.outputs.should_publish == 'true'
197
+ permissions:
198
+ contents: write
199
+ steps:
200
+ - uses: actions/checkout@v4
201
+ with:
202
+ fetch-depth: 0
203
+ - name: Create annotated tag
204
+ run: |
205
+ tag="${{ needs.build.outputs.tag }}"
206
+ 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
209
+ fi
210
+ git config user.name "github-actions[bot]"
211
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
212
+ git tag -a "${tag}" -m "AbstractRuntime ${tag}"
213
+ git push origin "${tag}"
214
+
215
+ publish-pypi:
216
+ name: Publish to PyPI
217
+ runs-on: ubuntu-latest
218
+ needs: [build, ensure-tag]
219
+ if: needs.build.outputs.should_publish == 'true'
220
+ environment:
221
+ name: pypi
222
+ url: https://pypi.org/project/AbstractRuntime/
223
+ permissions:
224
+ contents: read
225
+ id-token: write
226
+ steps:
227
+ - uses: actions/download-artifact@v4
228
+ with:
229
+ name: release-dist
230
+ path: dist
231
+ - uses: pypa/gh-action-pypi-publish@release/v1
232
+
233
+ github-release:
234
+ name: Create GitHub Release
235
+ runs-on: ubuntu-latest
236
+ needs: [build, ensure-tag, publish-pypi]
237
+ if: needs.build.outputs.should_publish == 'true'
238
+ permissions:
239
+ contents: write
240
+ steps:
241
+ - uses: actions/download-artifact@v4
242
+ with:
243
+ name: release-dist
244
+ path: dist
245
+ - uses: actions/download-artifact@v4
246
+ with:
247
+ name: release-notes
248
+ path: .
249
+ - uses: softprops/action-gh-release@v2
250
+ with:
251
+ tag_name: ${{ needs.build.outputs.tag }}
252
+ name: AbstractRuntime ${{ needs.build.outputs.tag }}
253
+ body_path: release-notes.md
254
+ files: dist/*
255
+ fail_on_unmatched_files: true
256
+
257
+ deploy-docs:
258
+ name: Deploy docs to GitHub Pages
259
+ runs-on: ubuntu-latest
260
+ needs: [build, github-release]
261
+ if: needs.build.outputs.should_publish == 'true'
262
+ permissions:
263
+ contents: write
264
+ steps:
265
+ - uses: actions/checkout@v4
266
+ with:
267
+ fetch-depth: 0
268
+ - uses: actions/setup-python@v5
269
+ with:
270
+ python-version: "3.12"
271
+ cache: pip
272
+ - name: Install docs dependencies
273
+ run: |
274
+ python -m pip install -U pip
275
+ python -m pip install -e ".[docs]"
276
+ - name: Configure git author
277
+ run: |
278
+ git config user.name "github-actions[bot]"
279
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
280
+ - name: Deploy MkDocs site
281
+ run: mkdocs gh-deploy --force --clean --message "Deploy docs for ${{ needs.build.outputs.tag }}"
@@ -11,6 +11,7 @@ __pycache__/
11
11
  build/
12
12
  develop-eggs/
13
13
  dist/
14
+ site/
14
15
  downloads/
15
16
  eggs/
16
17
  .eggs/
@@ -85,4 +86,4 @@ venv.bak/
85
86
  # End Generation Here
86
87
  ```
87
88
 
88
- .DS_Store
89
+ .DS_Store
@@ -7,14 +7,14 @@ The canonical dependency list lives in `pyproject.toml`.
7
7
 
8
8
  ## Runtime dependencies (core install)
9
9
 
10
- - **abstractsemantics** — structured schema registry support (declared in `pyproject.toml`, used in `src/abstractruntime/integrations/abstractmemory/effect_handlers.py` and VisualFlow execution wiring).
10
+ - **abstractsemantics** (`>=0.0.2`) — structured schema registry support (declared in `pyproject.toml`, used in `src/abstractruntime/integrations/abstractmemory/effect_handlers.py` and VisualFlow execution wiring).
11
11
 
12
12
  ## Optional integrations (extras)
13
13
 
14
14
  Installed only when you opt in to extras:
15
- - **abstractcore** — LLM + tools integration used by `abstractruntime[abstractcore]` (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
15
+ - **abstractcore** (`>=2.11.8`) — LLM + tools integration used by `abstractruntime[abstractcore]` (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
16
16
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
17
- - **abstractcore[tools]** — toolchain extra used by `abstractruntime[mcp-worker]` (declared in `pyproject.toml`) and intended to include HTML parsing dependencies (see comments in `pyproject.toml`).
17
+ - **abstractcore[tools]** (`>=2.11.8`) — toolchain extra used by `abstractruntime[mcp-worker]` (declared in `pyproject.toml`) and intended to include HTML parsing dependencies (see comments in `pyproject.toml`).
18
18
  - **RestrictedPython** (optional) — used for sandboxed execution of VisualFlow “Code” nodes when available (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
19
19
 
20
20
  ## Build & test tooling
@@ -7,10 +7,86 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.4] - 2026-05-07
11
+
10
12
  ### Added
13
+ - **AbstractCore multimodal generation integration**:
14
+ - `LLM_CALL` now forwards AbstractCore's unified `generate(..., output=...)` selector for image generation, TTS/voice output, and audio transcription
15
+ - generated binary outputs are normalized into JSON-safe runtime results with ArtifactStore-backed refs instead of inline bytes
16
+ - local runtimes can use AbstractCore capability plugins such as AbstractVision and AbstractVoice through the same runtime effect shape
17
+ - remote runtimes support AbstractCore Server image generation, speech, and transcription endpoints, plus OpenAI-compatible chat media content arrays
18
+ - **Multimodal packaging extra**:
19
+ - new `abstractruntime[multimodal]` extra installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
20
+ - **VisualFlow LLM media selectors**:
21
+ - LLM nodes lowered from VisualFlow can request generated media through `output` / `outputs` from node config or input data
22
+
11
23
  ### Changed
24
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.8` for the unified multimodal response types.
25
+ - `LLM_CALL` accepts top-level `text`, top-level `output`, and top-level `outputs` as a runtime alias for AbstractCore `output`.
26
+ - `LLM_CALL.media` accepts one media item or a list; artifact refs are materialized to provider-ready temporary files before model calls.
27
+ - Remote AbstractCore clients now preserve existing OpenAI-style content arrays when adding media attachments.
28
+ - Remote AbstractCore clients now resolve ArtifactStore-backed media refs for direct client use, matching the runtime effect-handler path.
29
+ - VisualFlow LLM pending-call lowering now carries `output` / `outputs` selectors into runtime LLM effects.
30
+ - VisualFlow LLM result syncing now projects generated media artifacts into node outputs such as `outputs`, `resources`, `artifact_ref`, `artifact_id`, and `meta.output_mode`.
12
31
 
13
32
  ### Fixed
33
+ - Runtime artifact metadata (`run_id`, tags, artifact ids) is kept out of AbstractCore provider/capability kwargs while still being applied to stored generated media artifacts.
34
+ - Generated binary media now fails closed without an ArtifactStore instead of embedding base64 bytes in durable state.
35
+ - Remote image/TTS/STT calls no longer reuse the chat model unless an output-specific media model is supplied.
36
+ - Remote media inputs now either convert to a provider-ready content item or fail before dispatch; unsupported remote image edits, voice reference inputs, and non-file STT inputs are rejected explicitly.
37
+ - Turn-grounding injection now preserves structured multimodal message content arrays instead of stringifying them.
38
+ - Session-scoped prompt-cache key derivation now uses the effective AbstractCore client provider/model identity when an `LLM_CALL` payload omits explicit provider/model overrides.
39
+
40
+ ### Documentation
41
+ - Documented multimodal `LLM_CALL` payloads, artifact-backed response shape, remote endpoint coverage, cached-session/prompt-cache boundaries, and the `abstractruntime[multimodal]` extra in the AbstractCore integration guide, API reference, architecture guide, FAQ, README, getting-started guide, docs index, and AI-ready `llms*.txt` files.
42
+ - Added a planned workspace/media access policy item covering default workspace-only access, explicit user allow/deny paths, and a conscious full-machine access mode for long-running agency deployments.
43
+
44
+ ### Testing
45
+ - Added focused coverage for multimodal response normalization, artifact-backed generated media, media-only transcription calls, remote image/TTS/STT endpoints, remote media guardrails, remote chat media content arrays, content-array prompt extraction, direct remote artifact-ref media resolution, text-alias routing, provider-request redaction, and runtime metadata/tag boundaries.
46
+ - Added coverage for effective prompt-cache key identity and VisualFlow LLM media selector/result projection.
47
+
48
+ ## [0.4.3] - 2026-05-06
49
+
50
+ ### Added
51
+ - **AbstractCore prompt-cache control plane**:
52
+ - local, multi-local, and remote LLM clients expose `get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, and `prompt_cache_prepare_modules`
53
+ - local clients can maintain compartmentalized `system | tools | history` prompt-cache modules when providers support `local_control_plane`
54
+ - remote clients proxy `/acore/prompt_cache/*` endpoints for gateway/CLI hosts
55
+ - **Artifact-backed media for AbstractCore LLM calls**:
56
+ - local and remote AbstractCore clients can resolve runtime artifact refs into provider-ready media inputs
57
+ - AbstractCore runtime factories now pass the runtime artifact store into LLM clients
58
+ - **Durable tool approval execution**:
59
+ - `ToolApprovalPolicy` and `ApprovalToolExecutor` support safe auto-approval, durable approval waits, and approved re-execution
60
+ - runtime factories expose the configured tool executor for approval-style `TOOL_CALLS` resumes
61
+ - **VisualFlow multi-entry lowering**:
62
+ - authoring graphs with multiple incoming `exec-in` routes can be lowered into internal `join_exec` and `path_mux` nodes
63
+ - per-entry input overrides survive pause/resume and file-store restart scenarios
64
+
65
+ ### Changed
66
+ - AbstractCore remote provider-key overrides now use `X-AbstractCore-Provider-API-Key` headers instead of body/query `api_key` fields rejected by current AbstractCore servers.
67
+ - AbstractCore LLM clients keep per-turn grounding out of stable system prompts, coalesce leading system messages, strip internal tool-activity system messages, and propagate trace metadata headers.
68
+ - AbstractCore runtime factories expose the underlying LLM client for host-side control-plane operations and continue to honor AbstractCore timeout/config defaults.
69
+ - Default runtime iteration budget increased from 25 to 50.
70
+ - Minimum AbstractCore optional dependency increased to `>=2.13.5` so the documented prompt-cache control plane, hardened server auth, provider-key header routing, Telegram tools, and current model/provider behavior are available by default.
71
+ - Documentation: align version references with `pyproject.toml` (0.4.3), document AbstractCore prompt-cache operations, update remote provider-key guidance, and add concrete VisualFlow multi-entry authoring metadata.
72
+ - CI/release automation now builds the package and docs on normal CI and exposes a manual-only guarded release path for PyPI, GitHub Releases, and the docs site.
73
+
74
+ ### Fixed
75
+ - VisualFlow While nodes again route `condition=true` to Loop and `condition=false` to Done/parent/complete after the execution-handle tracking refactor.
76
+ - Tool approval resumes now execute approved calls in-runtime when configured, return structured tool errors when denied or unavailable, and append completion ledger records for ledger-only replay clients.
77
+ - JSONL ledger listing now recovers concatenated JSON records defensively.
78
+ - `TOOL_CALLS` now emits durable warnings for missing or duplicate tool call ids.
79
+ - Optional VisualFlow fixture tests now skip cleanly when assessment fixtures are absent.
80
+
81
+ ### Testing
82
+ - Added focused coverage for prompt-cache module preparation/rebuilds, remote prompt-cache proxying, artifact-backed media, tool approval waits/resumes, JSONL ledger recovery, remote provider-key headers, VisualFlow multi-entry prompt overrides, direct effect re-entry, same-predecessor route handles, stale route metadata, join-only fan-in, and While routing regressions.
83
+
84
+ ## [0.4.2] - 2026-02-08
85
+
86
+ ### Changed
87
+ - **Dependencies**:
88
+ - bump minimum `abstractcore` / `abstractcore[tools]` to `>=2.11.8` (`pyproject.toml`)
89
+ - bump minimum `abstractsemantics` to `>=0.0.2` (`pyproject.toml`)
14
90
 
15
91
  ## [0.4.1] - 2026-02-04
16
92
 
@@ -247,7 +323,10 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
247
323
 
248
324
  Initial development version with basic proof-of-concept features.
249
325
 
250
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.1...HEAD
326
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...HEAD
327
+ [0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
328
+ [0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
329
+ [0.4.2]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.2
251
330
  [0.4.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.1
252
331
  [0.4.0]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.0
253
332
  [0.0.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.0.1
@@ -8,6 +8,9 @@ AbstractRuntime is a **durable workflow runtime** (interrupt → checkpoint →
8
8
 
9
9
  Prereqs: **Python 3.10+**.
10
10
 
11
+ Recommended (workspace checkout): develop inside the [AbstractFramework](https://github.com/lpalbou/AbstractFramework) workspace.
12
+ The test bootstrap (`tests/conftest.py`) will auto-wire sibling projects on `sys.path` (e.g., `abstractcore/`, `abstractmemory/`, `abstractsemantics/`, `abstractflow/`).
13
+
11
14
  ```bash
12
15
  python -m venv .venv
13
16
  source .venv/bin/activate
@@ -19,6 +22,8 @@ python -m pip install -e ".[abstractcore,mcp-worker]"
19
22
  python -m pytest -q
20
23
  ```
21
24
 
25
+ If you cloned **only** this repo (without the AbstractFramework workspace), make sure the sibling packages above are importable (install them or clone them next to this repo) before running the full test suite.
26
+
22
27
  ## Repo map (source of truth)
23
28
 
24
29
  - Public exports: `src/abstractruntime/__init__.py` (keep this consistent with `docs/api.md`)
@@ -55,4 +60,3 @@ When behavior changes, update:
55
60
 
56
61
  - Bump `version` in `pyproject.toml`
57
62
  - Add a dated section to `CHANGELOG.md` (Keep a Changelog format)
58
-
@@ -1,10 +1,65 @@
1
+ Metadata-Version: 2.4
2
+ Name: AbstractRuntime
3
+ Version: 0.4.4
4
+ Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
+ Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
+ Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
7
+ Project-URL: Documentation, https://www.lpalbou.info/AbstractRuntime/
8
+ Project-URL: Changelog, https://github.com/lpalbou/abstractruntime/blob/main/CHANGELOG.md
9
+ Author: Laurent-Philippe Albou
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: agents,checkpoint,durable,graph,llm,resume,workflow
13
+ Classifier: Development Status :: 1 - Planning
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: abstractsemantics>=0.0.2
24
+ Provides-Extra: abstractcore
25
+ Requires-Dist: abstractcore>=2.13.8; extra == 'abstractcore'
26
+ Provides-Extra: docs
27
+ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
28
+ Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
29
+ Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
30
+ Provides-Extra: mcp-worker
31
+ Requires-Dist: abstractcore[tools]>=2.13.8; extra == 'mcp-worker'
32
+ Provides-Extra: multimodal
33
+ Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.8; extra == 'multimodal'
34
+ Provides-Extra: test
35
+ Requires-Dist: pytest>=7.0.0; extra == 'test'
36
+ Description-Content-Type: text/markdown
37
+
1
38
  # AbstractRuntime
2
39
 
3
40
  **AbstractRuntime** is a durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
41
 
5
42
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
43
 
7
- **Version:** 0.4.1 (`pyproject.toml`) • **Python:** 3.10+
44
+ **Version:** 0.4.4 • **Python:** 3.10+
45
+
46
+ **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
47
+
48
+ ## AbstractFramework ecosystem
49
+
50
+ AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
51
+ - **AbstractRuntime** (this repo) — durable workflow kernel (`src/abstractruntime/core/*`)
52
+ - **AbstractCore** — LLM + tools integration (wired via `src/abstractruntime/integrations/abstractcore/*`)
53
+ Repo: [lpalbou/abstractcore](https://github.com/lpalbou/abstractcore)
54
+
55
+ At a high level, hosts define workflow graphs (`WorkflowSpec`) and AbstractRuntime executes them durably. When nodes request LLM/tool work (`EffectType.LLM_CALL`, `EffectType.TOOL_CALLS`), those effects are typically handled via AbstractCore.
56
+
57
+ ```mermaid
58
+ flowchart LR
59
+ Host["Host app / orchestrator"] -->|"WorkflowSpec"| RT["AbstractRuntime"]
60
+ RT -->|"LLM_CALL / TOOL_CALLS"| AC["AbstractCore"]
61
+ AC -->|"results / waits"| RT
62
+ ```
8
63
 
9
64
  ## Install
10
65
 
@@ -20,6 +75,8 @@ AbstractCore integration (LLM + tools):
20
75
  pip install "abstractruntime[abstractcore]"
21
76
  ```
22
77
 
78
+ The `abstractcore` extra installs AbstractCore 2.13.8 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, and unified multimodal generation response types are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
79
+
23
80
  MCP worker entrypoint (default toolsets over stdio):
24
81
 
25
82
  ```bash
@@ -46,7 +103,9 @@ def ask(run, ctx):
46
103
 
47
104
 
48
105
  def done(run, ctx):
49
- return StepPlan(node_id="done", complete_output={"answer": run.vars.get("user_answer")})
106
+ answer = run.vars.get("user_answer") or {}
107
+ text = answer.get("text") if isinstance(answer, dict) else None
108
+ return StepPlan(node_id="done", complete_output={"answer": text})
50
109
 
51
110
 
52
111
  wf = WorkflowSpec(workflow_id="demo", entry_node="ask", nodes={"ask": ask, "done": done})
@@ -65,7 +124,7 @@ state = rt.resume(
65
124
  assert state.status.value == "completed"
66
125
  ```
67
126
 
68
- ## What’s included (v0.4.1)
127
+ ## What’s included (v0.4.4)
69
128
 
70
129
  Kernel (dependency-light):
71
130
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -73,9 +132,11 @@ Kernel (dependency-light):
73
132
  - durable waits/events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
74
133
  - append-only ledger (`StepRecord`) + node traces (`vars["_runtime"]["node_traces"]`)
75
134
  - retries/idempotency hooks: `src/abstractruntime/core/policy.py`
135
+ - runtime-aware limits (`_limits`) with a default iteration budget of 50 (`docs/limits.md`)
76
136
 
77
137
  Durability + storage:
78
138
  - stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
139
+ - durable command inbox primitives (idempotent, append-only): `CommandStore`, `CommandCursorStore` (`src/abstractruntime/storage/commands.py`, `src/abstractruntime/storage/sqlite.py`)
79
140
  - artifacts + offloading (store large payloads by reference)
80
141
  - snapshots/bookmarks (`docs/snapshots.md`)
81
142
  - tamper-evident hash-chained ledger (`docs/provenance.md`)
@@ -83,10 +144,11 @@ Durability + storage:
83
144
  Drivers + distribution:
84
145
  - scheduler: `create_scheduled_runtime()` (`src/abstractruntime/scheduler/*`)
85
146
  - VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
147
+ - VisualFlow multi-entry execution lowering for fan-in routes and per-entry input overrides (`docs/workflow-bundles.md`)
86
148
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
87
149
 
88
150
  Optional integrations:
89
- - AbstractCore (LLM + tools): `docs/integrations/abstractcore.md`
151
+ - AbstractCore (LLM + tools, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
90
152
  - comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
91
153
 
92
154
  ## Built-in scheduler (zero-config)
@@ -98,7 +160,7 @@ sr = create_scheduled_runtime()
98
160
  run_id, state = sr.run(my_workflow)
99
161
 
100
162
  if state.status.value == "waiting":
101
- state = sr.respond(run_id, {"answer": "yes"})
163
+ state = sr.respond(run_id, {"text": "yes"})
102
164
 
103
165
  sr.stop()
104
166
  ```
@@ -143,7 +205,7 @@ sr = create_scheduled_runtime(
143
205
  python -m venv .venv
144
206
  source .venv/bin/activate
145
207
  python -m pip install -U pip
146
- python -m pip install -e ".[abstractcore,mcp-worker]"
208
+ python -m pip install -e ".[abstractcore,mcp-worker,test,docs]"
147
209
  python -m pytest -q
148
210
  ```
149
211