AbstractRuntime 0.4.1__tar.gz → 0.4.3__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 (296) hide show
  1. abstractruntime-0.4.3/.github/workflows/ci.yml +77 -0
  2. abstractruntime-0.4.3/.github/workflows/release.yml +279 -0
  3. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/.gitignore +2 -1
  4. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/ACKNOWLEDGMENTS.md +3 -3
  5. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/CHANGELOG.md +45 -1
  6. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/CONTRIBUTING.md +5 -1
  7. abstractruntime-0.4.1/README.md → abstractruntime-0.4.3/PKG-INFO +66 -6
  8. abstractruntime-0.4.1/PKG-INFO → abstractruntime-0.4.3/README.md +31 -33
  9. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/ROADMAP.md +1 -1
  10. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/README.md +12 -2
  11. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/api.md +39 -4
  12. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/architecture.md +21 -4
  13. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/faq.md +29 -0
  14. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/getting-started.md +5 -1
  15. abstractruntime-0.4.3/docs/integrations/abstractcore.md +237 -0
  16. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/limits.md +2 -2
  17. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/manual_testing.md +5 -1
  18. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/proposal.md +11 -1
  19. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/provenance.md +1 -1
  20. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/tools-comms.md +3 -7
  21. abstractruntime-0.4.3/docs/workflow-bundles.md +103 -0
  22. abstractruntime-0.4.3/llms-full.txt +334 -0
  23. abstractruntime-0.4.3/llms.txt +62 -0
  24. abstractruntime-0.4.3/mkdocs.yml +55 -0
  25. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/pyproject.toml +19 -4
  26. abstractruntime-0.4.3/release-notes.md +33 -0
  27. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/config.py +2 -2
  28. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/runtime.py +211 -5
  29. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/vars.py +1 -1
  30. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/__init__.py +10 -1
  31. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/factory.py +37 -4
  32. abstractruntime-0.4.3/src/abstractruntime/integrations/abstractcore/llm_client.py +2378 -0
  33. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/tool_executor.py +129 -1
  34. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/json_files.py +41 -3
  35. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +1 -1
  36. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +149 -1
  37. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/compiler.py +133 -5
  38. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/builtins.py +40 -0
  39. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/executor.py +28 -1
  40. abstractruntime-0.4.3/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +367 -0
  41. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/conftest.py +12 -3
  42. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_active_memory.py +1 -1
  43. abstractruntime-0.4.3/tests/test_control_adapter_while.py +56 -0
  44. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_factory_timeouts_default_to_abstractcore_config.py +4 -2
  45. abstractruntime-0.4.3/tests/test_jsonl_ledger_recovery.py +21 -0
  46. abstractruntime-0.4.3/tests/test_llm_client_media_artifacts.py +26 -0
  47. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_client_system_context.py +3 -0
  48. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_client_tool_call_parsing.py +4 -0
  49. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_local_runtime_timeout_kwarg_policy.py +2 -1
  50. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_assert_attributes_defaults.py +4 -1
  51. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_predicate_aliasing.py +4 -0
  52. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_query_packetization_restart.py +5 -0
  53. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_query_recall_level_policy.py +4 -0
  54. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_semantic_query_ranking.py +4 -0
  55. abstractruntime-0.4.3/tests/test_prompt_cache_modules.py +335 -0
  56. abstractruntime-0.4.3/tests/test_remote_llm_client.py +134 -0
  57. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_session_attachments_registry_and_open_tool.py +4 -4
  58. abstractruntime-0.4.3/tests/test_tool_approval_executor.py +93 -0
  59. abstractruntime-0.4.3/tests/test_tool_approval_resume_executes.py +114 -0
  60. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_memact_compose_node.py +6 -0
  61. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_memory_kg_query_outputs_propagate.py +6 -1
  62. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +5 -1
  63. abstractruntime-0.4.3/tests/test_visual_multi_entry_loop_overrides.py +387 -0
  64. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_compiler_basic.py +8 -0
  65. abstractruntime-0.4.1/ACKNOWLEDMENTS.md +0 -4
  66. abstractruntime-0.4.1/CHANGELOD.md +0 -4
  67. abstractruntime-0.4.1/docs/integrations/abstractcore.md +0 -101
  68. abstractruntime-0.4.1/docs/workflow-bundles.md +0 -62
  69. abstractruntime-0.4.1/llms-full.txt +0 -85
  70. abstractruntime-0.4.1/llms.txt +0 -51
  71. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -1233
  72. abstractruntime-0.4.1/tests/test_remote_llm_client.py +0 -73
  73. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/0 +0 -0
  74. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/LICENSE +0 -0
  75. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/SECURITY.md +0 -0
  76. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  77. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  78. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  79. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/adr/README.md +0 -0
  80. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/README.md +0 -0
  81. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  82. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  83. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/003_wait_primitives.md +0 -0
  84. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  85. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  86. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  87. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  88. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/009_artifact_store.md +0 -0
  89. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  90. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  91. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  92. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  93. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  94. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  95. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  96. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  97. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  98. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  99. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  100. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  101. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/004_tests.md +0 -0
  102. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  103. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  104. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  105. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  106. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/README.md +0 -0
  107. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  108. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  109. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  110. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  111. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  112. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/evidence.md +0 -0
  113. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/mcp-worker.md +0 -0
  114. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/docs/snapshots.md +0 -0
  115. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/emails.config.example.yaml +0 -0
  116. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/01_hello_world.py +0 -0
  117. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/02_ask_user.py +0 -0
  118. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/03_wait_until.py +0 -0
  119. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/04_multi_step.py +0 -0
  120. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/05_persistence.py +0 -0
  121. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/06_llm_integration.py +0 -0
  122. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/07_react_agent.py +0 -0
  123. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/examples/README.md +0 -0
  124. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/pytest.ini +0 -0
  125. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/__init__.py +0 -0
  126. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/__init__.py +0 -0
  127. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/event_keys.py +0 -0
  128. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/models.py +0 -0
  129. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/policy.py +0 -0
  130. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/core/spec.py +0 -0
  131. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/evidence/__init__.py +0 -0
  132. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/evidence/recorder.py +0 -0
  133. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/history_bundle.py +0 -0
  134. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/identity/__init__.py +0 -0
  135. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/identity/fingerprint.py +0 -0
  136. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/__init__.py +0 -0
  137. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  138. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  139. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  140. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  141. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  142. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  143. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  144. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  145. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  146. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  147. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  148. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  149. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/__init__.py +0 -0
  150. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/active_context.py +0 -0
  151. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/active_memory.py +0 -0
  152. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/compaction.py +0 -0
  153. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/kg_packets.py +0 -0
  154. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/memact_composer.py +0 -0
  155. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/recall_levels.py +0 -0
  156. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/memory/token_budget.py +0 -0
  157. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/rendering/__init__.py +0 -0
  158. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  159. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/rendering/json_stringify.py +0 -0
  160. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/scheduler/__init__.py +0 -0
  161. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/scheduler/convenience.py +0 -0
  162. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/scheduler/registry.py +0 -0
  163. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/scheduler/scheduler.py +0 -0
  164. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/__init__.py +0 -0
  165. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/artifacts.py +0 -0
  166. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/base.py +0 -0
  167. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/commands.py +0 -0
  168. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/in_memory.py +0 -0
  169. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/ledger_chain.py +0 -0
  170. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/observable.py +0 -0
  171. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/offloading.py +0 -0
  172. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/snapshots.py +0 -0
  173. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/storage/sqlite.py +0 -0
  174. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  175. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  176. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  177. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  178. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  179. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  180. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  181. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  182. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  183. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  184. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  185. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  186. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  187. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  188. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  189. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/workflow_bundle/models.py +0 -0
  190. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  191. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  192. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  193. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/README.md +0 -0
  194. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_active_context_policy.py +0 -0
  195. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_answer_user_effect.py +0 -0
  196. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_artifacts.py +0 -0
  197. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_chat_summarizer_integration.py +0 -0
  198. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_command_store.py +0 -0
  199. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_compaction_helpers.py +0 -0
  200. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_default_tools_comms_gating.py +0 -0
  201. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_default_tools_include_skim_files.py +0 -0
  202. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_default_tools_include_skim_folders.py +0 -0
  203. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_default_tools_search_files_executor.py +0 -0
  204. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_durable_toolsets.py +0 -0
  205. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  206. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_emit_event_without_workflow_registry.py +0 -0
  207. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_evidence_recorder.py +0 -0
  208. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_integration_abstractcore.py +0 -0
  209. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_integrations_abstractcore.py +0 -0
  210. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_json_file_run_store_children_index.py +0 -0
  211. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_kg_learn_and_recall_contract.py +0 -0
  212. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_ledger_chain.py +0 -0
  213. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_ledger_subscription.py +0 -0
  214. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_media_artifact_refs.py +0 -0
  215. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  216. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  217. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_requires_prompt.py +0 -0
  218. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_response_schema_normalization.py +0 -0
  219. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_structured_output_fallback.py +0 -0
  220. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  221. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  222. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  223. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_mcp_remote_tool_executor.py +0 -0
  224. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_mcp_worker_logging.py +0 -0
  225. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_mcp_worker_security.py +0 -0
  226. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_mcp_worker_stdio.py +0 -0
  227. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memact_composer_from_kg_result.py +0 -0
  228. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_kg_packets.py +0 -0
  229. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_note_effect.py +0 -0
  230. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_query_effect.py +0 -0
  231. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_query_rich_filters.py +0 -0
  232. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  233. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_memory_tag_effect.py +0 -0
  234. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_mlx_generation_serialization.py +0 -0
  235. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_offloading.py +0 -0
  236. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_packaging_extras.py +0 -0
  237. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_pause_resume.py +0 -0
  238. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_queryable_run_store.py +0 -0
  239. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  240. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_real_integration.py +0 -0
  241. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_recall_levels_policy.py +0 -0
  242. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_rendering_agent_trace_report.py +0 -0
  243. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_rendering_json_stringify.py +0 -0
  244. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_retry_idempotency.py +0 -0
  245. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_run_history_bundle.py +0 -0
  246. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  247. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  248. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_runtime_node_traces.py +0 -0
  249. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  250. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_scheduler.py +0 -0
  251. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_snapshots.py +0 -0
  252. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_sqlite_ledger_store.py +0 -0
  253. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_start_subworkflow_async_wait.py +0 -0
  254. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  255. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  256. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_structured_output_schema_enum.py +0 -0
  257. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_subworkflow.py +0 -0
  258. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_terminal_effect_completion.py +0 -0
  259. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  260. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  261. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_calls_idempotency_keys.py +0 -0
  262. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_argument_sanitization.py +0 -0
  263. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_error_output_detection.py +0 -0
  264. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_filename_alias.py +0 -0
  265. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  266. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_read_file_aliases.py +0 -0
  267. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_executor_timeout.py +0 -0
  268. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_tool_wait_allowlist_safety.py +0 -0
  269. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_trace_context_propagation.py +0 -0
  270. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_vars_query_effect.py +0 -0
  271. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  272. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  273. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  274. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  275. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  276. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  277. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_add_message_builtin.py +0 -0
  278. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  279. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_call_tool_node.py +0 -0
  280. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  281. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_get_element_node.py +0 -0
  282. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_get_random_element_node.py +0 -0
  283. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_has_tools_builtin.py +0 -0
  284. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  285. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_make_object_node.py +0 -0
  286. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  287. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_memory_source_pins.py +0 -0
  288. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_prompt_only.py +0 -0
  289. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_random_nodes.py +0 -0
  290. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_string_contains_replace.py +0 -0
  291. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_visualflow_tool_parameters_node.py +0 -0
  292. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_wait_event_prompt_metadata.py +0 -0
  293. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_workflow_bundle_registry.py +0 -0
  294. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  295. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  296. {abstractruntime-0.4.1 → abstractruntime-0.4.3}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -0,0 +1,77 @@
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_visual_multi_entry_loop_overrides.py \
43
+ tests/test_control_adapter_while.py \
44
+ tests/test_jsonl_ledger_recovery.py \
45
+ tests/test_llm_client_media_artifacts.py
46
+
47
+ build:
48
+ name: Build distributions
49
+ runs-on: ubuntu-latest
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+ - uses: actions/setup-python@v5
53
+ with:
54
+ python-version: "3.12"
55
+ cache: pip
56
+ - name: Build
57
+ run: |
58
+ python -m pip install -U pip
59
+ python -m pip install build twine
60
+ python -m build
61
+ python -m twine check dist/*
62
+
63
+ docs:
64
+ name: Build docs
65
+ runs-on: ubuntu-latest
66
+ steps:
67
+ - uses: actions/checkout@v4
68
+ - uses: actions/setup-python@v5
69
+ with:
70
+ python-version: "3.12"
71
+ cache: pip
72
+ - name: Install
73
+ run: |
74
+ python -m pip install -U pip
75
+ python -m pip install -e ".[docs]"
76
+ - name: MkDocs build
77
+ run: mkdocs build -q
@@ -0,0 +1,279 @@
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_visual_multi_entry_loop_overrides.py \
55
+ tests/test_control_adapter_while.py \
56
+ tests/test_jsonl_ledger_recovery.py \
57
+ tests/test_llm_client_media_artifacts.py
58
+
59
+ docs:
60
+ name: Build docs
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ - uses: actions/setup-python@v5
65
+ with:
66
+ python-version: "3.12"
67
+ cache: pip
68
+ - name: Install
69
+ run: |
70
+ python -m pip install -U pip
71
+ python -m pip install -e ".[docs]"
72
+ - name: MkDocs build
73
+ run: mkdocs build -q
74
+
75
+ build:
76
+ name: Validate and build distributions
77
+ runs-on: ubuntu-latest
78
+ needs: [test, docs]
79
+ outputs:
80
+ version: ${{ steps.release-meta.outputs.version }}
81
+ tag: ${{ steps.release-meta.outputs.tag }}
82
+ should_publish: ${{ steps.release-meta.outputs.should_publish }}
83
+ steps:
84
+ - uses: actions/checkout@v4
85
+ with:
86
+ fetch-depth: 0
87
+ - uses: actions/setup-python@v5
88
+ with:
89
+ python-version: "3.12"
90
+ cache: pip
91
+ - name: Install build tools
92
+ run: |
93
+ python -m pip install -U pip
94
+ python -m pip install build twine
95
+ - name: Validate version, changelog, tag, and publish guard
96
+ id: release-meta
97
+ env:
98
+ RELEASE_INPUT_VERSION: ${{ inputs.version }}
99
+ RELEASE_PUBLISH: ${{ inputs.publish }}
100
+ RELEASE_CONFIRMATION: ${{ inputs.publish_confirmation || '' }}
101
+ run: |
102
+ python - <<'PY'
103
+ import json
104
+ import os
105
+ import re
106
+ import subprocess
107
+ import tomllib
108
+ import urllib.error
109
+ import urllib.request
110
+ from pathlib import Path
111
+
112
+ raw_version = os.environ["RELEASE_INPUT_VERSION"].strip()
113
+ version = raw_version[1:] if raw_version.startswith("v") else raw_version
114
+ if not re.fullmatch(r"\d+\.\d+\.\d+(?:[a-zA-Z0-9.-]+)?", version):
115
+ raise SystemExit(f"Invalid release version: {raw_version!r}")
116
+ tag = f"v{version}"
117
+
118
+ pyproject = tomllib.loads(Path("pyproject.toml").read_text(encoding="utf-8"))
119
+ package_version = pyproject["project"]["version"]
120
+ if version != package_version:
121
+ raise SystemExit(
122
+ f"Requested version {version!r} does not match pyproject.toml version {package_version!r}"
123
+ )
124
+
125
+ changelog = Path("CHANGELOG.md").read_text(encoding="utf-8")
126
+ header = re.search(rf"^## \[{re.escape(version)}\] - .+$", changelog, re.MULTILINE)
127
+ if not header:
128
+ raise SystemExit(f"CHANGELOG.md has no entry for {version}")
129
+
130
+ rest = changelog[header.end():]
131
+ next_header = re.search(r"^## \[", rest, re.MULTILINE)
132
+ notes = rest[: next_header.start() if next_header else len(rest)].strip()
133
+ if not notes:
134
+ raise SystemExit(f"CHANGELOG.md entry for {version} is empty")
135
+ Path("release-notes.md").write_text(notes + "\n", encoding="utf-8")
136
+
137
+ publish = os.environ["RELEASE_PUBLISH"].lower() == "true"
138
+ if publish:
139
+ if os.environ.get("GITHUB_REF") != "refs/heads/main":
140
+ raise SystemExit("Publishing is only allowed from the main branch.")
141
+
142
+ expected = f"publish-abstractruntime-{version}"
143
+ confirmation = os.environ.get("RELEASE_CONFIRMATION", "").strip()
144
+ if confirmation != expected:
145
+ raise SystemExit(
146
+ f"publish_confirmation must be exactly {expected!r}; got {confirmation!r}"
147
+ )
148
+
149
+ tag_check = subprocess.run(
150
+ ["git", "ls-remote", "--exit-code", "--tags", "origin", f"refs/tags/{tag}"],
151
+ check=False,
152
+ stdout=subprocess.DEVNULL,
153
+ stderr=subprocess.DEVNULL,
154
+ )
155
+ if tag_check.returncode == 0:
156
+ raise SystemExit(f"Remote tag {tag} already exists.")
157
+ if tag_check.returncode not in (0, 2):
158
+ raise SystemExit(f"Could not check remote tag {tag}.")
159
+
160
+ try:
161
+ with urllib.request.urlopen(
162
+ f"https://pypi.org/pypi/AbstractRuntime/{version}/json",
163
+ timeout=20,
164
+ ) as response:
165
+ json.load(response)
166
+ raise SystemExit(f"PyPI already has AbstractRuntime {version}.")
167
+ except urllib.error.HTTPError as exc:
168
+ if exc.code != 404:
169
+ raise
170
+
171
+ output = Path(os.environ["GITHUB_OUTPUT"])
172
+ with output.open("a", encoding="utf-8") as fh:
173
+ print(f"version={version}", file=fh)
174
+ print(f"tag={tag}", file=fh)
175
+ print(f"should_publish={str(publish).lower()}", file=fh)
176
+ PY
177
+ - name: Build
178
+ run: python -m build
179
+ - name: Check distributions
180
+ run: python -m twine check dist/*
181
+ - uses: actions/upload-artifact@v4
182
+ with:
183
+ name: release-dist
184
+ path: dist/*
185
+ - uses: actions/upload-artifact@v4
186
+ with:
187
+ name: release-notes
188
+ path: release-notes.md
189
+
190
+ ensure-tag:
191
+ name: Ensure release tag
192
+ runs-on: ubuntu-latest
193
+ needs: build
194
+ if: needs.build.outputs.should_publish == 'true'
195
+ permissions:
196
+ contents: write
197
+ steps:
198
+ - uses: actions/checkout@v4
199
+ with:
200
+ fetch-depth: 0
201
+ - name: Create annotated tag
202
+ run: |
203
+ tag="${{ needs.build.outputs.tag }}"
204
+ if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then
205
+ echo "Tag ${tag} already exists on origin."
206
+ exit 1
207
+ fi
208
+ git config user.name "github-actions[bot]"
209
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
210
+ git tag -a "${tag}" -m "AbstractRuntime ${tag}"
211
+ git push origin "${tag}"
212
+
213
+ publish-pypi:
214
+ name: Publish to PyPI
215
+ runs-on: ubuntu-latest
216
+ needs: [build, ensure-tag]
217
+ if: needs.build.outputs.should_publish == 'true'
218
+ environment:
219
+ name: pypi
220
+ url: https://pypi.org/project/AbstractRuntime/
221
+ permissions:
222
+ contents: read
223
+ id-token: write
224
+ steps:
225
+ - uses: actions/download-artifact@v4
226
+ with:
227
+ name: release-dist
228
+ path: dist
229
+ - uses: pypa/gh-action-pypi-publish@release/v1
230
+
231
+ github-release:
232
+ name: Create GitHub Release
233
+ runs-on: ubuntu-latest
234
+ needs: [build, ensure-tag, publish-pypi]
235
+ if: needs.build.outputs.should_publish == 'true'
236
+ permissions:
237
+ contents: write
238
+ steps:
239
+ - uses: actions/download-artifact@v4
240
+ with:
241
+ name: release-dist
242
+ path: dist
243
+ - uses: actions/download-artifact@v4
244
+ with:
245
+ name: release-notes
246
+ path: .
247
+ - uses: softprops/action-gh-release@v2
248
+ with:
249
+ tag_name: ${{ needs.build.outputs.tag }}
250
+ name: AbstractRuntime ${{ needs.build.outputs.tag }}
251
+ body_path: release-notes.md
252
+ files: dist/*
253
+ fail_on_unmatched_files: true
254
+
255
+ deploy-docs:
256
+ name: Deploy docs to GitHub Pages
257
+ runs-on: ubuntu-latest
258
+ needs: [build, github-release]
259
+ if: needs.build.outputs.should_publish == 'true'
260
+ permissions:
261
+ contents: write
262
+ steps:
263
+ - uses: actions/checkout@v4
264
+ with:
265
+ fetch-depth: 0
266
+ - uses: actions/setup-python@v5
267
+ with:
268
+ python-version: "3.12"
269
+ cache: pip
270
+ - name: Install docs dependencies
271
+ run: |
272
+ python -m pip install -U pip
273
+ python -m pip install -e ".[docs]"
274
+ - name: Configure git author
275
+ run: |
276
+ git config user.name "github-actions[bot]"
277
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
278
+ - name: Deploy MkDocs site
279
+ 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
@@ -9,8 +9,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Added
11
11
  ### Changed
12
+ ### Fixed
13
+
14
+ ## [0.4.3] - 2026-05-06
15
+
16
+ ### Added
17
+ - **AbstractCore prompt-cache control plane**:
18
+ - 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`
19
+ - local clients can maintain compartmentalized `system | tools | history` prompt-cache modules when providers support `local_control_plane`
20
+ - remote clients proxy `/acore/prompt_cache/*` endpoints for gateway/CLI hosts
21
+ - **Artifact-backed media for AbstractCore LLM calls**:
22
+ - local/hybrid AbstractCore clients can resolve runtime artifact refs into provider-ready media inputs
23
+ - AbstractCore runtime factories now pass the runtime artifact store into LLM clients
24
+ - **Durable tool approval execution**:
25
+ - `ToolApprovalPolicy` and `ApprovalToolExecutor` support safe auto-approval, durable approval waits, and approved re-execution
26
+ - runtime factories expose the configured tool executor for approval-style `TOOL_CALLS` resumes
27
+ - **VisualFlow multi-entry lowering**:
28
+ - authoring graphs with multiple incoming `exec-in` routes can be lowered into internal `join_exec` and `path_mux` nodes
29
+ - per-entry input overrides survive pause/resume and file-store restart scenarios
30
+
31
+ ### Changed
32
+ - 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.
33
+ - 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.
34
+ - AbstractCore runtime factories expose the underlying LLM client for host-side control-plane operations and continue to honor AbstractCore timeout/config defaults.
35
+ - Default runtime iteration budget increased from 25 to 50.
36
+ - 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.
37
+ - 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.
38
+ - 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.
12
39
 
13
40
  ### Fixed
41
+ - VisualFlow While nodes again route `condition=true` to Loop and `condition=false` to Done/parent/complete after the execution-handle tracking refactor.
42
+ - 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.
43
+ - JSONL ledger listing now recovers concatenated JSON records defensively.
44
+ - `TOOL_CALLS` now emits durable warnings for missing or duplicate tool call ids.
45
+ - Optional VisualFlow fixture tests now skip cleanly when assessment fixtures are absent.
46
+
47
+ ### Testing
48
+ - 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.
49
+
50
+ ## [0.4.2] - 2026-02-08
51
+
52
+ ### Changed
53
+ - **Dependencies**:
54
+ - bump minimum `abstractcore` / `abstractcore[tools]` to `>=2.11.8` (`pyproject.toml`)
55
+ - bump minimum `abstractsemantics` to `>=0.0.2` (`pyproject.toml`)
14
56
 
15
57
  ## [0.4.1] - 2026-02-04
16
58
 
@@ -247,7 +289,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
247
289
 
248
290
  Initial development version with basic proof-of-concept features.
249
291
 
250
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.1...HEAD
292
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.3...HEAD
293
+ [0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
294
+ [0.4.2]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.2
251
295
  [0.4.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.1
252
296
  [0.4.0]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.0
253
297
  [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,63 @@
1
+ Metadata-Version: 2.4
2
+ Name: AbstractRuntime
3
+ Version: 0.4.3
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.5; 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.5; extra == 'mcp-worker'
32
+ Provides-Extra: test
33
+ Requires-Dist: pytest>=7.0.0; extra == 'test'
34
+ Description-Content-Type: text/markdown
35
+
1
36
  # AbstractRuntime
2
37
 
3
38
  **AbstractRuntime** is a durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
39
 
5
40
  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
41
 
7
- **Version:** 0.4.1 (`pyproject.toml`) • **Python:** 3.10+
42
+ **Version:** 0.4.3 (see `pyproject.toml`) • **Python:** 3.10+
43
+
44
+ **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
45
+
46
+ ## AbstractFramework ecosystem
47
+
48
+ AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
49
+ - **AbstractRuntime** (this repo) — durable workflow kernel (`src/abstractruntime/core/*`)
50
+ - **AbstractCore** — LLM + tools integration (wired via `src/abstractruntime/integrations/abstractcore/*`)
51
+ Repo: [lpalbou/abstractcore](https://github.com/lpalbou/abstractcore)
52
+
53
+ 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.
54
+
55
+ ```mermaid
56
+ flowchart LR
57
+ Host["Host app / orchestrator"] -->|"WorkflowSpec"| RT["AbstractRuntime"]
58
+ RT -->|"LLM_CALL / TOOL_CALLS"| AC["AbstractCore"]
59
+ AC -->|"results / waits"| RT
60
+ ```
8
61
 
9
62
  ## Install
10
63
 
@@ -20,6 +73,8 @@ AbstractCore integration (LLM + tools):
20
73
  pip install "abstractruntime[abstractcore]"
21
74
  ```
22
75
 
76
+ The `abstractcore` extra installs AbstractCore 2.13.5 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, and current tool catalog are available.
77
+
23
78
  MCP worker entrypoint (default toolsets over stdio):
24
79
 
25
80
  ```bash
@@ -46,7 +101,9 @@ def ask(run, ctx):
46
101
 
47
102
 
48
103
  def done(run, ctx):
49
- return StepPlan(node_id="done", complete_output={"answer": run.vars.get("user_answer")})
104
+ answer = run.vars.get("user_answer") or {}
105
+ text = answer.get("text") if isinstance(answer, dict) else None
106
+ return StepPlan(node_id="done", complete_output={"answer": text})
50
107
 
51
108
 
52
109
  wf = WorkflowSpec(workflow_id="demo", entry_node="ask", nodes={"ask": ask, "done": done})
@@ -65,7 +122,7 @@ state = rt.resume(
65
122
  assert state.status.value == "completed"
66
123
  ```
67
124
 
68
- ## What’s included (v0.4.1)
125
+ ## What’s included (v0.4.3)
69
126
 
70
127
  Kernel (dependency-light):
71
128
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -73,9 +130,11 @@ Kernel (dependency-light):
73
130
  - durable waits/events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
74
131
  - append-only ledger (`StepRecord`) + node traces (`vars["_runtime"]["node_traces"]`)
75
132
  - retries/idempotency hooks: `src/abstractruntime/core/policy.py`
133
+ - runtime-aware limits (`_limits`) with a default iteration budget of 50 (`docs/limits.md`)
76
134
 
77
135
  Durability + storage:
78
136
  - stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
137
+ - durable command inbox primitives (idempotent, append-only): `CommandStore`, `CommandCursorStore` (`src/abstractruntime/storage/commands.py`, `src/abstractruntime/storage/sqlite.py`)
79
138
  - artifacts + offloading (store large payloads by reference)
80
139
  - snapshots/bookmarks (`docs/snapshots.md`)
81
140
  - tamper-evident hash-chained ledger (`docs/provenance.md`)
@@ -83,10 +142,11 @@ Durability + storage:
83
142
  Drivers + distribution:
84
143
  - scheduler: `create_scheduled_runtime()` (`src/abstractruntime/scheduler/*`)
85
144
  - VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
145
+ - VisualFlow multi-entry execution lowering for fan-in routes and per-entry input overrides (`docs/workflow-bundles.md`)
86
146
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
87
147
 
88
148
  Optional integrations:
89
- - AbstractCore (LLM + tools): `docs/integrations/abstractcore.md`
149
+ - AbstractCore (LLM + tools, prompt cache, tool approval waits): `docs/integrations/abstractcore.md`
90
150
  - comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
91
151
 
92
152
  ## Built-in scheduler (zero-config)
@@ -98,7 +158,7 @@ sr = create_scheduled_runtime()
98
158
  run_id, state = sr.run(my_workflow)
99
159
 
100
160
  if state.status.value == "waiting":
101
- state = sr.respond(run_id, {"answer": "yes"})
161
+ state = sr.respond(run_id, {"text": "yes"})
102
162
 
103
163
  sr.stop()
104
164
  ```
@@ -143,7 +203,7 @@ sr = create_scheduled_runtime(
143
203
  python -m venv .venv
144
204
  source .venv/bin/activate
145
205
  python -m pip install -U pip
146
- python -m pip install -e ".[abstractcore,mcp-worker]"
206
+ python -m pip install -e ".[abstractcore,mcp-worker,test,docs]"
147
207
  python -m pytest -q
148
208
  ```
149
209