AbstractRuntime 0.2.0__tar.gz → 0.4.1__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.1/0 +0 -0
  2. abstractruntime-0.4.1/ACKNOWLEDGMENTS.md +27 -0
  3. abstractruntime-0.4.1/ACKNOWLEDMENTS.md +4 -0
  4. abstractruntime-0.4.1/CHANGELOD.md +4 -0
  5. abstractruntime-0.4.1/CHANGELOG.md +253 -0
  6. abstractruntime-0.4.1/CONTRIBUTING.md +58 -0
  7. abstractruntime-0.4.1/PKG-INFO +177 -0
  8. abstractruntime-0.4.1/README.md +150 -0
  9. abstractruntime-0.4.1/ROADMAP.md +36 -0
  10. abstractruntime-0.4.1/SECURITY.md +24 -0
  11. abstractruntime-0.4.1/docs/README.md +37 -0
  12. abstractruntime-0.4.1/docs/api.md +172 -0
  13. abstractruntime-0.4.1/docs/architecture.md +197 -0
  14. abstractruntime-0.4.1/docs/backlog/README.md +40 -0
  15. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/002_persistence_and_ledger.md +1 -2
  16. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/004_scheduler_driver.md +5 -11
  17. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +4 -10
  18. abstractruntime-0.4.1/docs/backlog/completed/016_runtime_aware_parameters.md +46 -0
  19. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/README.md +1 -2
  20. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +3 -3
  21. abstractruntime-0.4.1/docs/evidence.md +39 -0
  22. abstractruntime-0.4.1/docs/faq.md +138 -0
  23. abstractruntime-0.4.1/docs/getting-started.md +141 -0
  24. abstractruntime-0.4.1/docs/integrations/abstractcore.md +101 -0
  25. abstractruntime-0.4.1/docs/limits.md +83 -0
  26. abstractruntime-0.4.1/docs/manual_testing.md +243 -0
  27. abstractruntime-0.4.1/docs/mcp-worker.md +54 -0
  28. abstractruntime-0.4.1/docs/proposal.md +91 -0
  29. abstractruntime-0.4.1/docs/provenance.md +43 -0
  30. abstractruntime-0.4.1/docs/snapshots.md +43 -0
  31. abstractruntime-0.4.1/docs/tools-comms.md +83 -0
  32. abstractruntime-0.4.1/docs/workflow-bundles.md +62 -0
  33. abstractruntime-0.4.1/emails.config.example.yaml +44 -0
  34. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/README.md +2 -1
  35. abstractruntime-0.4.1/llms-full.txt +85 -0
  36. abstractruntime-0.4.1/llms.txt +51 -0
  37. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/pyproject.toml +22 -6
  38. abstractruntime-0.4.1/pytest.ini +6 -0
  39. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/__init__.py +83 -3
  40. abstractruntime-0.4.1/src/abstractruntime/core/config.py +181 -0
  41. abstractruntime-0.4.1/src/abstractruntime/core/event_keys.py +62 -0
  42. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/models.py +17 -1
  43. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/policy.py +74 -3
  44. abstractruntime-0.4.1/src/abstractruntime/core/runtime.py +4042 -0
  45. abstractruntime-0.4.1/src/abstractruntime/core/vars.py +195 -0
  46. abstractruntime-0.4.1/src/abstractruntime/evidence/__init__.py +10 -0
  47. abstractruntime-0.4.1/src/abstractruntime/evidence/recorder.py +325 -0
  48. abstractruntime-0.4.1/src/abstractruntime/history_bundle.py +772 -0
  49. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/__init__.py +6 -0
  50. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/constants.py +19 -0
  51. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/default_tools.py +258 -0
  52. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/effect_handlers.py +2709 -0
  53. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/embeddings_client.py +69 -0
  54. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/factory.py +320 -0
  55. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/llm_client.py +1233 -0
  56. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/mcp_worker.py +587 -0
  57. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/observability.py +80 -0
  58. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/session_attachments.py +946 -0
  59. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/summarizer.py +154 -0
  60. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/tool_executor.py +646 -0
  61. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +561 -0
  62. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractmemory/__init__.py +3 -0
  63. abstractruntime-0.4.1/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +946 -0
  64. abstractruntime-0.4.1/src/abstractruntime/memory/__init__.py +21 -0
  65. abstractruntime-0.4.1/src/abstractruntime/memory/active_context.py +751 -0
  66. abstractruntime-0.4.1/src/abstractruntime/memory/active_memory.py +452 -0
  67. abstractruntime-0.4.1/src/abstractruntime/memory/compaction.py +105 -0
  68. abstractruntime-0.4.1/src/abstractruntime/memory/kg_packets.py +164 -0
  69. abstractruntime-0.4.1/src/abstractruntime/memory/memact_composer.py +175 -0
  70. abstractruntime-0.4.1/src/abstractruntime/memory/recall_levels.py +163 -0
  71. abstractruntime-0.4.1/src/abstractruntime/memory/token_budget.py +86 -0
  72. abstractruntime-0.4.1/src/abstractruntime/rendering/__init__.py +17 -0
  73. abstractruntime-0.4.1/src/abstractruntime/rendering/agent_trace_report.py +256 -0
  74. abstractruntime-0.4.1/src/abstractruntime/rendering/json_stringify.py +136 -0
  75. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/scheduler.py +93 -2
  76. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/__init__.py +7 -2
  77. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/artifacts.py +175 -32
  78. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/base.py +17 -1
  79. abstractruntime-0.4.1/src/abstractruntime/storage/commands.py +339 -0
  80. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/in_memory.py +41 -1
  81. abstractruntime-0.4.1/src/abstractruntime/storage/json_files.py +404 -0
  82. abstractruntime-0.4.1/src/abstractruntime/storage/observable.py +136 -0
  83. abstractruntime-0.4.1/src/abstractruntime/storage/offloading.py +433 -0
  84. abstractruntime-0.4.1/src/abstractruntime/storage/sqlite.py +836 -0
  85. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/__init__.py +29 -0
  86. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/__init__.py +11 -0
  87. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +126 -0
  88. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +109 -0
  89. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +615 -0
  90. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +1051 -0
  91. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +307 -0
  92. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +97 -0
  93. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +114 -0
  94. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +74 -0
  95. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +316 -0
  96. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/compiler.py +3832 -0
  97. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/flow.py +247 -0
  98. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/__init__.py +13 -0
  99. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +29 -0
  100. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/builtins.py +1376 -0
  101. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/code_executor.py +214 -0
  102. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/executor.py +2804 -0
  103. abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/models.py +211 -0
  104. abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/__init__.py +52 -0
  105. abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/models.py +236 -0
  106. abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/packer.py +317 -0
  107. abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/reader.py +87 -0
  108. abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/registry.py +587 -0
  109. abstractruntime-0.4.1/tests/conftest.py +34 -0
  110. abstractruntime-0.4.1/tests/test_active_context_policy.py +217 -0
  111. abstractruntime-0.4.1/tests/test_active_memory.py +157 -0
  112. abstractruntime-0.4.1/tests/test_answer_user_effect.py +62 -0
  113. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_artifacts.py +73 -8
  114. abstractruntime-0.4.1/tests/test_chat_summarizer_integration.py +146 -0
  115. abstractruntime-0.4.1/tests/test_command_store.py +113 -0
  116. abstractruntime-0.4.1/tests/test_compaction_helpers.py +42 -0
  117. abstractruntime-0.4.1/tests/test_default_tools_comms_gating.py +44 -0
  118. abstractruntime-0.4.1/tests/test_default_tools_include_skim_files.py +52 -0
  119. abstractruntime-0.4.1/tests/test_default_tools_include_skim_folders.py +53 -0
  120. abstractruntime-0.4.1/tests/test_default_tools_search_files_executor.py +62 -0
  121. abstractruntime-0.4.1/tests/test_e2e_tool_calls_idempotency_lmstudio.py +140 -0
  122. abstractruntime-0.4.1/tests/test_emit_event_without_workflow_registry.py +34 -0
  123. abstractruntime-0.4.1/tests/test_evidence_recorder.py +136 -0
  124. abstractruntime-0.4.1/tests/test_factory_timeouts_default_to_abstractcore_config.py +100 -0
  125. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_integrations_abstractcore.py +46 -0
  126. abstractruntime-0.4.1/tests/test_json_file_run_store_children_index.py +67 -0
  127. abstractruntime-0.4.1/tests/test_kg_learn_and_recall_contract.py +245 -0
  128. abstractruntime-0.4.1/tests/test_ledger_subscription.py +87 -0
  129. abstractruntime-0.4.1/tests/test_llm_call_media_artifact_refs.py +138 -0
  130. abstractruntime-0.4.1/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +112 -0
  131. abstractruntime-0.4.1/tests/test_llm_call_media_uses_source_path_label.py +31 -0
  132. abstractruntime-0.4.1/tests/test_llm_call_requires_prompt.py +57 -0
  133. abstractruntime-0.4.1/tests/test_llm_call_response_schema_normalization.py +154 -0
  134. abstractruntime-0.4.1/tests/test_llm_call_structured_output_fallback.py +77 -0
  135. abstractruntime-0.4.1/tests/test_llm_call_truncation_retry_contract.py +93 -0
  136. abstractruntime-0.4.1/tests/test_llm_call_use_context_appends_turn.py +37 -0
  137. abstractruntime-0.4.1/tests/test_llm_call_verbatim_payload_capture.py +31 -0
  138. abstractruntime-0.4.1/tests/test_llm_client_system_context.py +234 -0
  139. abstractruntime-0.4.1/tests/test_llm_client_tool_call_parsing.py +250 -0
  140. abstractruntime-0.4.1/tests/test_local_runtime_timeout_kwarg_policy.py +38 -0
  141. abstractruntime-0.4.1/tests/test_mcp_remote_tool_executor.py +214 -0
  142. abstractruntime-0.4.1/tests/test_mcp_worker_logging.py +92 -0
  143. abstractruntime-0.4.1/tests/test_mcp_worker_security.py +89 -0
  144. abstractruntime-0.4.1/tests/test_mcp_worker_stdio.py +44 -0
  145. abstractruntime-0.4.1/tests/test_memact_composer_from_kg_result.py +76 -0
  146. abstractruntime-0.4.1/tests/test_memory_kg_assert_attributes_defaults.py +75 -0
  147. abstractruntime-0.4.1/tests/test_memory_kg_packets.py +73 -0
  148. abstractruntime-0.4.1/tests/test_memory_kg_predicate_aliasing.py +90 -0
  149. abstractruntime-0.4.1/tests/test_memory_kg_query_packetization_restart.py +114 -0
  150. abstractruntime-0.4.1/tests/test_memory_kg_query_recall_level_policy.py +112 -0
  151. abstractruntime-0.4.1/tests/test_memory_kg_semantic_query_ranking.py +96 -0
  152. abstractruntime-0.4.1/tests/test_memory_note_effect.py +235 -0
  153. abstractruntime-0.4.1/tests/test_memory_query_effect.py +115 -0
  154. abstractruntime-0.4.1/tests/test_memory_query_rich_filters.py +250 -0
  155. abstractruntime-0.4.1/tests/test_memory_scope_and_rehydrate_effect.py +545 -0
  156. abstractruntime-0.4.1/tests/test_memory_tag_effect.py +122 -0
  157. abstractruntime-0.4.1/tests/test_mlx_generation_serialization.py +65 -0
  158. abstractruntime-0.4.1/tests/test_offloading.py +109 -0
  159. abstractruntime-0.4.1/tests/test_packaging_extras.py +33 -0
  160. abstractruntime-0.4.1/tests/test_pause_resume.py +197 -0
  161. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_queryable_run_store.py +61 -1
  162. abstractruntime-0.4.1/tests/test_read_file_fallback_to_session_attachments.py +226 -0
  163. abstractruntime-0.4.1/tests/test_recall_levels_policy.py +41 -0
  164. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_remote_llm_client.py +21 -1
  165. abstractruntime-0.4.1/tests/test_rendering_agent_trace_report.py +72 -0
  166. abstractruntime-0.4.1/tests/test_rendering_json_stringify.py +28 -0
  167. abstractruntime-0.4.1/tests/test_run_history_bundle.py +178 -0
  168. abstractruntime-0.4.1/tests/test_runtime_config_max_output_tokens_fallback.py +19 -0
  169. abstractruntime-0.4.1/tests/test_runtime_llm_call_grounding_in_ledger.py +63 -0
  170. abstractruntime-0.4.1/tests/test_runtime_node_traces.py +65 -0
  171. abstractruntime-0.4.1/tests/test_runtime_start_seeds_tool_support.py +37 -0
  172. abstractruntime-0.4.1/tests/test_session_attachments_registry_and_open_tool.py +1100 -0
  173. abstractruntime-0.4.1/tests/test_sqlite_ledger_store.py +239 -0
  174. abstractruntime-0.4.1/tests/test_start_subworkflow_async_wait.py +61 -0
  175. abstractruntime-0.4.1/tests/test_start_subworkflow_inherit_context_merges_messages.py +89 -0
  176. abstractruntime-0.4.1/tests/test_start_subworkflow_workspace_inheritance.py +108 -0
  177. abstractruntime-0.4.1/tests/test_structured_output_schema_enum.py +38 -0
  178. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_subworkflow.py +20 -0
  179. abstractruntime-0.4.1/tests/test_terminal_effect_completion.py +48 -0
  180. abstractruntime-0.4.1/tests/test_terminal_resume_appends_ledger_completion.py +76 -0
  181. abstractruntime-0.4.1/tests/test_tick_completion_includes_output_in_ledger.py +55 -0
  182. abstractruntime-0.4.1/tests/test_tool_calls_idempotency_keys.py +179 -0
  183. abstractruntime-0.4.1/tests/test_tool_executor_argument_sanitization.py +28 -0
  184. abstractruntime-0.4.1/tests/test_tool_executor_error_output_detection.py +28 -0
  185. abstractruntime-0.4.1/tests/test_tool_executor_filename_alias.py +30 -0
  186. abstractruntime-0.4.1/tests/test_tool_executor_kwarg_canonicalization.py +58 -0
  187. abstractruntime-0.4.1/tests/test_tool_executor_read_file_aliases.py +65 -0
  188. abstractruntime-0.4.1/tests/test_tool_executor_timeout.py +45 -0
  189. abstractruntime-0.4.1/tests/test_tool_wait_allowlist_safety.py +152 -0
  190. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_trace_context_propagation.py +24 -0
  191. abstractruntime-0.4.1/tests/test_vars_query_effect.py +109 -0
  192. abstractruntime-0.4.1/tests/test_visual_agent_output_context_includes_messages.py +89 -0
  193. abstractruntime-0.4.1/tests/test_visual_agent_tool_observations_persist_across_restart.py +168 -0
  194. abstractruntime-0.4.1/tests/test_visual_agent_use_context_inherits_attachments.py +87 -0
  195. abstractruntime-0.4.1/tests/test_visual_agent_use_context_persists_tool_observations.py +98 -0
  196. abstractruntime-0.4.1/tests/test_visual_agent_use_context_persists_turn.py +65 -0
  197. abstractruntime-0.4.1/tests/test_visual_llm_call_schema_ref_resolution.py +86 -0
  198. abstractruntime-0.4.1/tests/test_visual_memact_compose_node.py +190 -0
  199. abstractruntime-0.4.1/tests/test_visual_memory_kg_query_outputs_propagate.py +172 -0
  200. abstractruntime-0.4.1/tests/test_visual_memory_kg_resolve_outputs_propagate.py +161 -0
  201. abstractruntime-0.4.1/tests/test_visualflow_add_message_builtin.py +24 -0
  202. abstractruntime-0.4.1/tests/test_visualflow_add_message_node_appends_to_active_context.py +54 -0
  203. abstractruntime-0.4.1/tests/test_visualflow_call_tool_node.py +159 -0
  204. abstractruntime-0.4.1/tests/test_visualflow_compiler_basic.py +79 -0
  205. abstractruntime-0.4.1/tests/test_visualflow_context_and_builder_nodes.py +175 -0
  206. abstractruntime-0.4.1/tests/test_visualflow_get_element_node.py +111 -0
  207. abstractruntime-0.4.1/tests/test_visualflow_get_random_element_node.py +88 -0
  208. abstractruntime-0.4.1/tests/test_visualflow_has_tools_builtin.py +14 -0
  209. abstractruntime-0.4.1/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +43 -0
  210. abstractruntime-0.4.1/tests/test_visualflow_make_object_node.py +75 -0
  211. abstractruntime-0.4.1/tests/test_visualflow_memory_effect_nodes.py +385 -0
  212. abstractruntime-0.4.1/tests/test_visualflow_memory_source_pins.py +363 -0
  213. abstractruntime-0.4.1/tests/test_visualflow_prompt_only.py +203 -0
  214. abstractruntime-0.4.1/tests/test_visualflow_random_nodes.py +82 -0
  215. abstractruntime-0.4.1/tests/test_visualflow_string_contains_replace.py +33 -0
  216. abstractruntime-0.4.1/tests/test_visualflow_tool_parameters_node.py +111 -0
  217. abstractruntime-0.4.1/tests/test_wait_event_prompt_metadata.py +61 -0
  218. abstractruntime-0.4.1/tests/test_workflow_bundle_registry.py +82 -0
  219. abstractruntime-0.4.1/tests/test_workspace_policy_allowlist_mode.py +41 -0
  220. abstractruntime-0.4.1/tests/test_workspace_policy_mount_virtual_paths.py +56 -0
  221. abstractruntime-0.4.1/tests/test_workspace_policy_tool_calls_persist_across_restart.py +103 -0
  222. abstractruntime-0.2.0/CHANGELOG.md +0 -132
  223. abstractruntime-0.2.0/PKG-INFO +0 -163
  224. abstractruntime-0.2.0/README.md +0 -141
  225. abstractruntime-0.2.0/ROADMAP.md +0 -235
  226. abstractruntime-0.2.0/docs/backlog/README.md +0 -42
  227. abstractruntime-0.2.0/docs/backlog/completed/016_runtime_aware_parameters.md +0 -240
  228. abstractruntime-0.2.0/docs/integrations/abstractcore.md +0 -97
  229. abstractruntime-0.2.0/docs/limits.md +0 -266
  230. abstractruntime-0.2.0/docs/manual_testing.md +0 -309
  231. abstractruntime-0.2.0/docs/proposal.md +0 -166
  232. abstractruntime-0.2.0/docs/provenance.md +0 -36
  233. abstractruntime-0.2.0/docs/snapshots.md +0 -47
  234. abstractruntime-0.2.0/src/abstractruntime/core/config.py +0 -101
  235. abstractruntime-0.2.0/src/abstractruntime/core/runtime.py +0 -736
  236. abstractruntime-0.2.0/src/abstractruntime/core/vars.py +0 -94
  237. abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -119
  238. abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/factory.py +0 -187
  239. abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -397
  240. abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -168
  241. abstractruntime-0.2.0/src/abstractruntime/storage/json_files.py +0 -208
  242. abstractruntime-0.2.0/tests/conftest.py +0 -20
  243. abstractruntime-0.2.0/tests/test_pause_resume.py +0 -98
  244. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/.gitignore +0 -0
  245. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/LICENSE +0 -0
  246. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  247. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  248. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  249. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/README.md +0 -0
  250. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  251. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
  252. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  253. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  254. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  255. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/009_artifact_store.md +0 -0
  256. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  257. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  258. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  259. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  260. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  261. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  262. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  263. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  264. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  265. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  266. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_tests.md +0 -0
  267. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  268. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  269. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  270. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  271. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  272. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  273. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  274. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  275. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/01_hello_world.py +0 -0
  276. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/02_ask_user.py +0 -0
  277. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/03_wait_until.py +0 -0
  278. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/04_multi_step.py +0 -0
  279. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/05_persistence.py +0 -0
  280. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/06_llm_integration.py +0 -0
  281. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/07_react_agent.py +0 -0
  282. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/__init__.py +0 -0
  283. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/spec.py +0 -0
  284. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/__init__.py +0 -0
  285. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/fingerprint.py +0 -0
  286. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/__init__.py +0 -0
  287. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  288. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/__init__.py +0 -0
  289. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/convenience.py +0 -0
  290. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/registry.py +0 -0
  291. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
  292. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/snapshots.py +0 -0
  293. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/README.md +0 -0
  294. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_durable_toolsets.py +0 -0
  295. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_integration_abstractcore.py +0 -0
  296. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_ledger_chain.py +0 -0
  297. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_real_integration.py +0 -0
  298. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_retry_idempotency.py +0 -0
  299. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_scheduler.py +0 -0
  300. {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_snapshots.py +0 -0
File without changes
@@ -0,0 +1,27 @@
1
+ # Acknowledgments
2
+
3
+ AbstractRuntime is designed to pair with the wider Abstract ecosystem and the open-source Python tooling community.
4
+
5
+ This project depends on (and is shaped by) the following libraries.
6
+ The canonical dependency list lives in `pyproject.toml`.
7
+
8
+ ## Runtime dependencies (core install)
9
+
10
+ - **abstractsemantics** — structured schema registry support (declared in `pyproject.toml`, used in `src/abstractruntime/integrations/abstractmemory/effect_handlers.py` and VisualFlow execution wiring).
11
+
12
+ ## Optional integrations (extras)
13
+
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`).
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`).
18
+ - **RestrictedPython** (optional) — used for sandboxed execution of VisualFlow “Code” nodes when available (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
19
+
20
+ ## Build & test tooling
21
+
22
+ - **hatchling** — build backend (`pyproject.toml` `[build-system]`).
23
+ - **pytest** — test runner (`pytest.ini`, `tests/`).
24
+
25
+ And thanks to everyone who reports bugs, discusses design tradeoffs, and contributes improvements.
26
+
27
+ See also: `LICENSE`, `CONTRIBUTING.md`.
@@ -0,0 +1,4 @@
1
+ # Acknowledments (legacy filename)
2
+
3
+ This project uses `ACKNOWLEDGMENTS.md` (correct spelling). Please refer to that file.
4
+
@@ -0,0 +1,4 @@
1
+ # Changelog (legacy filename)
2
+
3
+ This project uses `CHANGELOG.md`. Please refer to that file.
4
+
@@ -0,0 +1,253 @@
1
+ # Changelog
2
+
3
+ All notable changes to AbstractRuntime will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ ### Changed
12
+
13
+ ### Fixed
14
+
15
+ ## [0.4.1] - 2026-02-04
16
+
17
+ ### Added
18
+ - **Durable prompt metadata for EVENT waits**:
19
+ - `WAIT_EVENT` effects may include optional `prompt`, `choices`, and `allow_free_text` fields.
20
+ - The runtime persists these fields onto `WaitState` so hosts (including remote/thin clients) can render a durable ask+wait UX without relying on in-process callbacks.
21
+ - **Rendering utilities** (`abstractruntime.rendering`):
22
+ - `stringify_json(...)` + `JsonStringifyMode` to render JSON/JSON-ish values into strings with `none|beautify|minified` modes.
23
+ - `render_agent_trace_markdown(...)` to render runtime-owned `node_traces` scratchpads into a complete, review-friendly Markdown timeline.
24
+ - **Documentation refresh**:
25
+ - clearer entrypoints: `README.md` → `docs/getting-started.md`
26
+ - new reference docs: `docs/api.md`, `docs/faq.md`, `docs/architecture.md`
27
+ - maintainer-facing orientation: `llms.txt`, `llms-full.txt`
28
+ - new repo policies: `CONTRIBUTING.md`, `SECURITY.md`, `ACKNOWLEDGMENTS.md`
29
+
30
+ ### Fixed
31
+ - Normalize AbstractCore tool specs for skim tools so `paths` is always an array parameter (improves JSON schema consistency for tool callers).
32
+
33
+ ## [0.4.0] - 2025-01-06
34
+
35
+ ### Added
36
+
37
+ - **Active Memory System** (`abstractruntime.memory.active_memory`): Complete MemAct agent memory module
38
+ - Runtime-owned `ACTIVE_MEMORY_DELTA` effect for structured Active Memory updates (used by agents via `active_memory_delta` tool)
39
+ - JSON-safe durable storage in `run.vars["_runtime"]["active_memory"]`
40
+ - Memory modules: MY PERSONA, RELATIONSHIPS, MEMORY BLUEPRINTS, CURRENT TASKS, CURRENT CONTEXT, CRITICAL INSIGHTS, REFERENCES, HISTORY
41
+ - Active Memory v9 format with natural-language markdown rendering (not YAML) to reduce syntax contamination
42
+ - All components render into system prompt by default (prevents user-role pollution on native-tool providers)
43
+
44
+ - **MCP Worker** (`abstractruntime-mcp-worker`): Standalone stdio-based MCP server for AbstractRuntime tools
45
+ - Exposes AbstractRuntime's default toolsets as MCP tools via stdio transport
46
+ - Human-friendly logging to stderr with ANSI color support
47
+ - Security: allowlist-based command execution safety (`TOOL_WAIT` effect for dangerous commands)
48
+ - New optional dependency: `abstractruntime[mcp-worker]` (includes `abstractcore[tools]`)
49
+ - Entry point: `abstractruntime-mcp-worker` CLI script
50
+
51
+ - **Evidence Capture System** (`abstractruntime.evidence.recorder`): Always-on provenance-first evidence recording
52
+ - Automatically records evidence for external-boundary tools: `web_search`, `fetch_url`, `execute_command`
53
+ - Evidence stored as artifact-backed records indexed as `kind="evidence"` in `RunState.vars["_runtime"]["memory_spans"]`
54
+ - Runtime helpers: `Runtime.list_evidence(run_id)` and `Runtime.load_evidence(evidence_id)`
55
+ - Keeps RunState JSON-safe by storing large payloads in ArtifactStore with refs
56
+
57
+ - **Ledger Subscriptions**: Real-time step append events via `Runtime.subscribe_ledger()`
58
+ - `create_local_runtime`, `create_remote_runtime`, `create_hybrid_runtime` now wrap LedgerStore with `ObservableLedgerStore` by default
59
+ - Hosts can receive real-time notifications when steps are appended to ledger
60
+
61
+ - **Durable Custom Events (Signals)**:
62
+ - `EMIT_EVENT` effect to dispatch events and resume matching `WAIT_EVENT` runs
63
+ - Extended `WAIT_EVENT` to accept `{scope, name}` payloads (runtime computes stable `wait_key`)
64
+ - `Scheduler.emit_event(...)` host API for external event delivery (session-scoped by default)
65
+
66
+ - **Orchestrator-Owned Timeouts** (AbstractCore integration):
67
+ - Default **LLM timeout**: 7200s per `LLM_CALL` (not per-workflow), enforced by `create_*_runtime` factories
68
+ - Default **tool execution timeout**: 7200s per tool call (not per-workflow), enforced by ToolExecutor implementations
69
+
70
+ - **Tool Executor Enhancements** (`MappingToolExecutor`):
71
+ - **Argument canonicalization**: Maps common parameter name variations (e.g., `file_path`/`filepath`/`path`) to canonical names
72
+ - **Filename aliases**: Supports `target_file`, `file_path`, `filepath`, `path` as aliases for file operations
73
+ - **Error output detection**: Detects structured error responses (`{"success": false, ...}`) from tools
74
+ - **Argument sanitization**: Cleans and validates tool call arguments
75
+ - **Timeout support**: Per-tool execution timeouts with configurable limits
76
+
77
+ - **Memory Query Enhancements** (`MEMORY_QUERY` effect):
78
+ - Tag filters with **AND/OR** modes (`tags_mode=all|any`) and **multi-value** keys (`tags.person=["alice","bob"]`)
79
+ - Metadata filters for **authors** (`created_by`) and **locations** (`location`, `tags.location`)
80
+ - Span records now capture `created_by` for `conversation_span`, `active_memory_span`, `memory_note` when `actor_id` available
81
+ - `MEMORY_NOTE` accepts optional `location` field
82
+ - `MEMORY_NOTE` supports `keep_in_context=true` flag to immediately rehydrate stored note into `context.messages`
83
+
84
+ - **Package Dependencies**:
85
+ - New optional dependency: `abstractruntime[abstractcore]` (enables `abstractruntime.integrations.abstractcore.*`)
86
+ - New optional dependency: `abstractruntime[mcp-worker]` (includes `abstractcore[tools]>=2.6.8`)
87
+
88
+ ### Changed
89
+
90
+ - **LLM Client Enhancements**:
91
+ - Tool call parsing refactored for better robustness and error handling
92
+ - Streaming support with timing metrics (TTFT, generation time)
93
+ - Response normalization preserves JSON-safe `raw_response` for debugging
94
+ - Always attaches exact provider request payload under `result.metadata._provider_request` for every `LLM_CALL` step
95
+
96
+ - **Runtime Core** (902 lines changed):
97
+ - Enhanced resume handling for paused/cancelled runs
98
+ - Improved subworkflow execution with async+wait support
99
+ - Better observable ledger integration
100
+
101
+ ### Fixed
102
+
103
+ - **Cancellation is Terminal**: `Runtime.tick()` now treats `RunStatus.CANCELLED` as terminal and will not progress cancelled runs
104
+ - **Control-Plane Safety**: `Runtime.tick()` stops without overwriting externally persisted pause/cancel state (used by AbstractFlow Web)
105
+ - **Atomic Run Checkpoints**: `JsonFileRunStore.save()` writes via temp file + atomic rename to prevent partial/corrupt JSON under concurrent writes
106
+ - **START_SUBWORKFLOW async+wait**: Support for `async=true` + `wait=true` to start child run without blocking parent tick, while keeping parent in durable SUBWORKFLOW wait
107
+ - **ArtifactStore Run-Scoped Addressing**: Artifact IDs namespaced to run when `run_id` provided (prevents cross-run collisions, preserves purge-by-run semantics)
108
+ - **AbstractCore Integration Imports**: `LocalAbstractCoreLLMClient` imports `create_llm` robustly in monorepo namespace-package layouts
109
+ - **Token Limit Metadata**: `_limits.max_output_tokens` falls back to model capabilities when not configured (runtime surfaces explicit per-step output budget)
110
+ - **Token-Cap Normalization Boundary**: Removed local `max_tokens → max_output_tokens` aliasing from AbstractRuntime's AbstractCore client (AbstractCore providers own this mapping)
111
+
112
+ ### Testing
113
+
114
+ - **25 new/modified test files** covering:
115
+ - Active Memory functionality
116
+ - MCP worker (logging, security, stdio communication)
117
+ - Evidence recorder
118
+ - Memory query rich filters
119
+ - Tool executor (canonicalization, filename aliases, timeouts, error detection)
120
+ - LLM client tool call parsing
121
+ - Runtime configuration and subworkflow handling
122
+ - Packaging extras validation
123
+
124
+ ### Statistics
125
+
126
+ - **33 commits** improving memory systems, MCP integration, evidence capture, and tool execution
127
+ - **45 files changed**: 5,788 insertions, 286 deletions
128
+ - **6,074 total lines changed** across the codebase
129
+ - **3 new modules**: `active_memory.py`, `evidence/recorder.py`, `mcp_worker.py`
130
+
131
+ ## [0.2.0] - 2025-12-17
132
+
133
+ ### Added
134
+
135
+ #### Core Runtime Features
136
+ - **Durable Workflow Execution**: Start/tick/resume semantics for long-running workflows that survive process restarts
137
+ - **WorkflowSpec**: Graph-based workflow definitions with node handlers keyed by ID
138
+ - **RunState**: Durable state management (`current_node`, `vars`, `waiting`, `status`)
139
+ - **Effect System**: Side-effect requests including `LLM_CALL`, `TOOL_CALLS`, `ASK_USER`, `WAIT_EVENT`, `WAIT_UNTIL`, `START_SUBWORKFLOW`
140
+ - **StepPlan**: Node execution plans that define effects and state transitions
141
+ - **Explicit Waiting States**: First-class support for pausing execution (`WaitReason`, `WaitState`)
142
+
143
+ #### Scheduler & Automation
144
+ - **Built-in Scheduler**: Zero-config background scheduler with polling thread for automatic run resumption
145
+ - **WorkflowRegistry**: Mapping from workflow_id to WorkflowSpec for dynamic workflow resolution
146
+ - **ScheduledRuntime**: High-level wrapper combining Runtime + Scheduler with simplified API
147
+ - **create_scheduled_runtime()**: Factory function for zero-config scheduler creation
148
+ - **Event Ingestion**: Support for external event delivery via `scheduler.resume_event()`
149
+ - **Scheduler Stats**: Built-in statistics tracking and callback support
150
+
151
+ #### Storage & Persistence
152
+ - **Append-only Ledger**: Execution journal with `StepRecord` entries for audit/debug/provenance
153
+ - **InMemoryRunStore**: In-memory run state storage for development and testing
154
+ - **InMemoryLedgerStore**: In-memory ledger storage for development and testing
155
+ - **JsonFileRunStore**: File-based persistent run state storage (one file per run)
156
+ - **JsonlLedgerStore**: JSONL-based persistent ledger storage
157
+ - **QueryableRunStore**: Interface for listing and filtering runs by status, workflow_id, actor_id, and time range
158
+ - **Artifacts System**: Storage for large payloads (documents, images, tool outputs) to avoid bloating checkpoints
159
+ - `ArtifactStore` interface with in-memory and file-based implementations
160
+ - `ArtifactRef` type for referencing stored artifacts
161
+ - Helper functions: `artifact_ref()`, `is_artifact_ref()`, `get_artifact_id()`, `resolve_artifact()`, `compute_artifact_id()`
162
+
163
+ #### Snapshots & Bookmarks
164
+ - **Snapshot System**: Named, searchable checkpoints of run state for debugging and experimentation
165
+ - **SnapshotStore**: Storage interface for snapshots with metadata (name, description, tags, timestamps)
166
+ - **InMemorySnapshotStore**: In-memory snapshot storage for development
167
+ - **JsonSnapshotStore**: File-based snapshot storage (one file per snapshot)
168
+ - **Snapshot Search**: Filter by run_id, tag, or substring match in name/description
169
+
170
+ #### Provenance & Accountability
171
+ - **Hash-Chained Ledger**: Tamper-evident ledger with `prev_hash` and `record_hash` for each step
172
+ - **HashChainedLedgerStore**: Decorator for adding hash chain verification to any ledger store
173
+ - **verify_ledger_chain()**: Verification function that detects modifications or reordering of ledger records
174
+ - **Actor Identity**: `ActorFingerprint` for attribution of workflow execution to specific actors
175
+ - **actor_id tracking**: Support for actor_id in both RunState and StepRecord for accountability
176
+
177
+ #### AbstractCore Integration
178
+ - **LLM_CALL Effect Handler**: Execute LLM calls via AbstractCore providers
179
+ - **TOOL_CALLS Effect Handler**: Execute tool calls with support for multiple execution modes
180
+ - **Three Execution Modes**:
181
+ - **Local**: In-process AbstractCore providers with local tool execution
182
+ - **Remote**: HTTP to AbstractCore server (`/v1/chat/completions`) with tool passthrough
183
+ - **Hybrid**: Remote LLM calls with local tool execution
184
+ - **Convenience Factories**: `create_local_runtime()`, `create_remote_runtime()`, `create_hybrid_runtime()`
185
+ - **Tool Execution Modes**:
186
+ - Executed mode (trusted local) with results
187
+ - Passthrough mode (untrusted/server) with waiting semantics
188
+ - **Layered Coupling**: AbstractCore integration as opt-in module to keep kernel dependency-light
189
+
190
+ #### Effect Policies & Reliability
191
+ - **EffectPolicy Protocol**: Configurable retry and idempotency policies for effects
192
+ - **DefaultEffectPolicy**: Default implementation with no retries
193
+ - **RetryPolicy**: Configurable retry behavior with max_attempts and backoff
194
+ - **NoRetryPolicy**: Explicit no-retry policy
195
+ - **compute_idempotency_key()**: Ledger-based deduplication to prevent duplicate side effects after crashes
196
+
197
+ #### Examples & Documentation
198
+ - **7 Runnable Examples**:
199
+ - `01_hello_world.py`: Minimal workflow demonstration
200
+ - `02_ask_user.py`: Pause/resume with user input
201
+ - `03_wait_until.py`: Scheduled resumption with time-based waiting
202
+ - `04_multi_step.py`: Branching workflow with conditional logic
203
+ - `05_persistence.py`: File-based storage demonstration
204
+ - `06_llm_integration.py`: AbstractCore LLM call integration
205
+ - `07_react_agent.py`: Full ReAct agent implementation with tools
206
+ - **Comprehensive Documentation**:
207
+ - Architecture Decision Records (ADRs) for key design choices
208
+ - Integration guides for AbstractCore
209
+ - Detailed documentation for snapshots and provenance
210
+ - Limits and constraints documentation
211
+ - ROADMAP with prioritized next steps
212
+
213
+ ### Technical Details
214
+
215
+ #### Architecture
216
+ - **Layered Design**: Clear separation between kernel, storage, integrations, and identity
217
+ - **Dependency-Light Kernel**: Core runtime remains stable with minimal dependencies
218
+ - **Graph-Based Execution**: All workflows represented as state machines/graphs for visualization and composition
219
+ - **JSON-Serializable State**: All run state and vars must be JSON-serializable for persistence
220
+
221
+ #### Testing
222
+ - Run the test suite with `python -m pytest -q` (see `docs/manual_testing.md`).
223
+
224
+ #### Compatibility
225
+ - **Python 3.10+**: Supports Python 3.10, 3.11, 3.12, and 3.13
226
+
227
+ ### Known Limitations
228
+
229
+ - Snapshot restore does not guarantee safety if workflow spec or node code has changed
230
+ - Subworkflow support (`START_SUBWORKFLOW`) is implemented but undergoing refinement
231
+ - Cryptographic signatures (non-forgeability) not yet implemented - current hash chain provides tamper-evidence only
232
+ - Remote tool worker service not yet implemented
233
+
234
+ ### Design Decisions
235
+
236
+ - **Kernel stays dependency-light**: Enables portability, stability, and clear integration boundaries
237
+ - **AbstractCore integration is opt-in**: Layered coupling prevents kernel breakage when AbstractCore changes
238
+ - **Hash chain before signatures**: Provides immediate value without key management complexity
239
+ - **Built-in scheduler (not external)**: Zero-config UX for simple cases
240
+ - **Graph representation for all workflows**: Enables visualization, checkpointing, and composition
241
+
242
+ ### Notes
243
+
244
+ AbstractRuntime is the durable execution substrate designed to pair with AbstractCore, AbstractAgent, and AbstractFlow. It enables workflows to interrupt, checkpoint, and resume across process restarts, making it suitable for long-running agent workflows that need to wait for user input, scheduled events, or external job completion.
245
+
246
+ ## [0.0.1] - Initial Development
247
+
248
+ Initial development version with basic proof-of-concept features.
249
+
250
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.1...HEAD
251
+ [0.4.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.1
252
+ [0.4.0]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.0
253
+ [0.0.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.0.1
@@ -0,0 +1,58 @@
1
+ # Contributing to AbstractRuntime
2
+
3
+ Thanks for your interest in contributing!
4
+
5
+ AbstractRuntime is a **durable workflow runtime** (interrupt → checkpoint → resume) with an append-only execution ledger.
6
+
7
+ ## Quick start (dev setup)
8
+
9
+ Prereqs: **Python 3.10+**.
10
+
11
+ ```bash
12
+ python -m venv .venv
13
+ source .venv/bin/activate
14
+ python -m pip install -U pip
15
+
16
+ # Full dev install (kernel + optional integrations used by tests/examples)
17
+ python -m pip install -e ".[abstractcore,mcp-worker]"
18
+
19
+ python -m pytest -q
20
+ ```
21
+
22
+ ## Repo map (source of truth)
23
+
24
+ - Public exports: `src/abstractruntime/__init__.py` (keep this consistent with `docs/api.md`)
25
+ - Core kernel (durable semantics): `src/abstractruntime/core/`
26
+ - Durability backends: `src/abstractruntime/storage/`
27
+ - Driver loop (in-process): `src/abstractruntime/scheduler/`
28
+ - Optional integrations (extras): `src/abstractruntime/integrations/`
29
+ - Tests: `tests/`
30
+
31
+ Docs entrypoints:
32
+ - `README.md` → `docs/getting-started.md`
33
+ - Docs index: `docs/README.md`
34
+ - Architecture: `docs/architecture.md`
35
+
36
+ ## Change guidelines
37
+
38
+ ### Code
39
+
40
+ - Preserve durability invariants: values stored in `RunState.vars` must stay JSON-serializable (`src/abstractruntime/core/models.py`).
41
+ - Add/adjust tests for new behavior (see `tests/`).
42
+ - If you touch effect semantics, update `docs/architecture.md` and ensure handlers and models stay aligned.
43
+
44
+ ### Documentation
45
+
46
+ Docs should be **user-facing**, **actionable**, and anchored to code (prefer referencing `src/...` paths for claims).
47
+
48
+ When behavior changes, update:
49
+ - `docs/api.md` (public API surface + imports)
50
+ - `docs/getting-started.md` (onboarding examples)
51
+ - `docs/architecture.md` (semantics/invariants)
52
+ - `CHANGELOG.md` (user-visible changes)
53
+
54
+ ## Releases
55
+
56
+ - Bump `version` in `pyproject.toml`
57
+ - Add a dated section to `CHANGELOG.md` (Keep a Changelog format)
58
+
@@ -0,0 +1,177 @@
1
+ Metadata-Version: 2.4
2
+ Name: AbstractRuntime
3
+ Version: 0.4.1
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
+ Author: Laurent-Philippe Albou
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: agents,checkpoint,durable,graph,llm,resume,workflow
11
+ Classifier: Development Status :: 1 - Planning
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: abstractsemantics>=0.0.1
22
+ Provides-Extra: abstractcore
23
+ Requires-Dist: abstractcore>=2.6.8; extra == 'abstractcore'
24
+ Provides-Extra: mcp-worker
25
+ Requires-Dist: abstractcore[tools]>=2.6.8; extra == 'mcp-worker'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # AbstractRuntime
29
+
30
+ **AbstractRuntime** is a durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
31
+
32
+ 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.
33
+
34
+ **Version:** 0.4.1 (`pyproject.toml`) • **Python:** 3.10+
35
+
36
+ ## Install
37
+
38
+ Core runtime:
39
+
40
+ ```bash
41
+ pip install abstractruntime
42
+ ```
43
+
44
+ AbstractCore integration (LLM + tools):
45
+
46
+ ```bash
47
+ pip install "abstractruntime[abstractcore]"
48
+ ```
49
+
50
+ MCP worker entrypoint (default toolsets over stdio):
51
+
52
+ ```bash
53
+ pip install "abstractruntime[mcp-worker]"
54
+ ```
55
+
56
+ ## Quick start (pause + resume)
57
+
58
+ ```python
59
+ from abstractruntime import Effect, EffectType, Runtime, StepPlan, WorkflowSpec
60
+ from abstractruntime.storage import InMemoryLedgerStore, InMemoryRunStore
61
+
62
+
63
+ def ask(run, ctx):
64
+ return StepPlan(
65
+ node_id="ask",
66
+ effect=Effect(
67
+ type=EffectType.ASK_USER,
68
+ payload={"prompt": "Continue?"},
69
+ result_key="user_answer",
70
+ ),
71
+ next_node="done",
72
+ )
73
+
74
+
75
+ def done(run, ctx):
76
+ return StepPlan(node_id="done", complete_output={"answer": run.vars.get("user_answer")})
77
+
78
+
79
+ wf = WorkflowSpec(workflow_id="demo", entry_node="ask", nodes={"ask": ask, "done": done})
80
+ rt = Runtime(run_store=InMemoryRunStore(), ledger_store=InMemoryLedgerStore())
81
+
82
+ run_id = rt.start(workflow=wf)
83
+ state = rt.tick(workflow=wf, run_id=run_id)
84
+ assert state.status.value == "waiting"
85
+
86
+ state = rt.resume(
87
+ workflow=wf,
88
+ run_id=run_id,
89
+ wait_key=state.waiting.wait_key,
90
+ payload={"text": "yes"},
91
+ )
92
+ assert state.status.value == "completed"
93
+ ```
94
+
95
+ ## What’s included (v0.4.1)
96
+
97
+ Kernel (dependency-light):
98
+ - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
99
+ - durable execution: `Runtime.start/tick/resume` (`src/abstractruntime/core/runtime.py`)
100
+ - durable waits/events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
101
+ - append-only ledger (`StepRecord`) + node traces (`vars["_runtime"]["node_traces"]`)
102
+ - retries/idempotency hooks: `src/abstractruntime/core/policy.py`
103
+
104
+ Durability + storage:
105
+ - stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
106
+ - artifacts + offloading (store large payloads by reference)
107
+ - snapshots/bookmarks (`docs/snapshots.md`)
108
+ - tamper-evident hash-chained ledger (`docs/provenance.md`)
109
+
110
+ Drivers + distribution:
111
+ - scheduler: `create_scheduled_runtime()` (`src/abstractruntime/scheduler/*`)
112
+ - VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
113
+ - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
114
+
115
+ Optional integrations:
116
+ - AbstractCore (LLM + tools): `docs/integrations/abstractcore.md`
117
+ - comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
118
+
119
+ ## Built-in scheduler (zero-config)
120
+
121
+ ```python
122
+ from abstractruntime import create_scheduled_runtime
123
+
124
+ sr = create_scheduled_runtime()
125
+ run_id, state = sr.run(my_workflow)
126
+
127
+ if state.status.value == "waiting":
128
+ state = sr.respond(run_id, {"answer": "yes"})
129
+
130
+ sr.stop()
131
+ ```
132
+
133
+ For persistent storage:
134
+
135
+ ```python
136
+ from abstractruntime import create_scheduled_runtime, JsonFileRunStore, JsonlLedgerStore
137
+
138
+ sr = create_scheduled_runtime(
139
+ run_store=JsonFileRunStore("./data"),
140
+ ledger_store=JsonlLedgerStore("./data"),
141
+ )
142
+ ```
143
+
144
+ ## Documentation
145
+
146
+ | Document | Description |
147
+ |----------|-------------|
148
+ | [Getting Started](docs/getting-started.md) | Install + first durable workflow |
149
+ | [API Reference](docs/api.md) | Public API surface (imports + pointers) |
150
+ | [Docs Index](docs/README.md) | Full docs map (guides + reference) |
151
+ | [FAQ](docs/faq.md) | Common questions and gotchas |
152
+ | [Architecture](docs/architecture.md) | Component map + diagrams |
153
+ | [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
154
+ | [Integrations](docs/integrations/) | Integration guides (AbstractCore) |
155
+ | [Snapshots](docs/snapshots.md) | Named checkpoints for run state |
156
+ | [Provenance](docs/provenance.md) | Tamper-evident ledger documentation |
157
+ | [Evidence](docs/evidence.md) | Artifact-backed evidence capture for web/command tools |
158
+ | [Limits](docs/limits.md) | `_limits` namespace and RuntimeConfig |
159
+ | [WorkflowBundles](docs/workflow-bundles.md) | `.flow` bundle format (VisualFlow distribution) |
160
+ | [MCP Worker](docs/mcp-worker.md) | `abstractruntime-mcp-worker` CLI |
161
+ | [Changelog](CHANGELOG.md) | Release notes |
162
+ | [Contributing](CONTRIBUTING.md) | How to build/test and submit changes |
163
+ | [Security](SECURITY.md) | Responsible vulnerability reporting |
164
+ | [Acknowledgments](ACKNOWLEDGMENTS.md) | Credits |
165
+ | [ROADMAP](ROADMAP.md) | Prioritized next steps |
166
+
167
+ ## Development
168
+
169
+ ```bash
170
+ python -m venv .venv
171
+ source .venv/bin/activate
172
+ python -m pip install -U pip
173
+ python -m pip install -e ".[abstractcore,mcp-worker]"
174
+ python -m pytest -q
175
+ ```
176
+
177
+ See `CONTRIBUTING.md` for contribution guidelines and doc conventions.
@@ -0,0 +1,150 @@
1
+ # AbstractRuntime
2
+
3
+ **AbstractRuntime** is a durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
+
5
+ It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
+
7
+ **Version:** 0.4.1 (`pyproject.toml`) • **Python:** 3.10+
8
+
9
+ ## Install
10
+
11
+ Core runtime:
12
+
13
+ ```bash
14
+ pip install abstractruntime
15
+ ```
16
+
17
+ AbstractCore integration (LLM + tools):
18
+
19
+ ```bash
20
+ pip install "abstractruntime[abstractcore]"
21
+ ```
22
+
23
+ MCP worker entrypoint (default toolsets over stdio):
24
+
25
+ ```bash
26
+ pip install "abstractruntime[mcp-worker]"
27
+ ```
28
+
29
+ ## Quick start (pause + resume)
30
+
31
+ ```python
32
+ from abstractruntime import Effect, EffectType, Runtime, StepPlan, WorkflowSpec
33
+ from abstractruntime.storage import InMemoryLedgerStore, InMemoryRunStore
34
+
35
+
36
+ def ask(run, ctx):
37
+ return StepPlan(
38
+ node_id="ask",
39
+ effect=Effect(
40
+ type=EffectType.ASK_USER,
41
+ payload={"prompt": "Continue?"},
42
+ result_key="user_answer",
43
+ ),
44
+ next_node="done",
45
+ )
46
+
47
+
48
+ def done(run, ctx):
49
+ return StepPlan(node_id="done", complete_output={"answer": run.vars.get("user_answer")})
50
+
51
+
52
+ wf = WorkflowSpec(workflow_id="demo", entry_node="ask", nodes={"ask": ask, "done": done})
53
+ rt = Runtime(run_store=InMemoryRunStore(), ledger_store=InMemoryLedgerStore())
54
+
55
+ run_id = rt.start(workflow=wf)
56
+ state = rt.tick(workflow=wf, run_id=run_id)
57
+ assert state.status.value == "waiting"
58
+
59
+ state = rt.resume(
60
+ workflow=wf,
61
+ run_id=run_id,
62
+ wait_key=state.waiting.wait_key,
63
+ payload={"text": "yes"},
64
+ )
65
+ assert state.status.value == "completed"
66
+ ```
67
+
68
+ ## What’s included (v0.4.1)
69
+
70
+ Kernel (dependency-light):
71
+ - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
72
+ - durable execution: `Runtime.start/tick/resume` (`src/abstractruntime/core/runtime.py`)
73
+ - durable waits/events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
74
+ - append-only ledger (`StepRecord`) + node traces (`vars["_runtime"]["node_traces"]`)
75
+ - retries/idempotency hooks: `src/abstractruntime/core/policy.py`
76
+
77
+ Durability + storage:
78
+ - stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
79
+ - artifacts + offloading (store large payloads by reference)
80
+ - snapshots/bookmarks (`docs/snapshots.md`)
81
+ - tamper-evident hash-chained ledger (`docs/provenance.md`)
82
+
83
+ Drivers + distribution:
84
+ - scheduler: `create_scheduled_runtime()` (`src/abstractruntime/scheduler/*`)
85
+ - VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
86
+ - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
87
+
88
+ Optional integrations:
89
+ - AbstractCore (LLM + tools): `docs/integrations/abstractcore.md`
90
+ - comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
91
+
92
+ ## Built-in scheduler (zero-config)
93
+
94
+ ```python
95
+ from abstractruntime import create_scheduled_runtime
96
+
97
+ sr = create_scheduled_runtime()
98
+ run_id, state = sr.run(my_workflow)
99
+
100
+ if state.status.value == "waiting":
101
+ state = sr.respond(run_id, {"answer": "yes"})
102
+
103
+ sr.stop()
104
+ ```
105
+
106
+ For persistent storage:
107
+
108
+ ```python
109
+ from abstractruntime import create_scheduled_runtime, JsonFileRunStore, JsonlLedgerStore
110
+
111
+ sr = create_scheduled_runtime(
112
+ run_store=JsonFileRunStore("./data"),
113
+ ledger_store=JsonlLedgerStore("./data"),
114
+ )
115
+ ```
116
+
117
+ ## Documentation
118
+
119
+ | Document | Description |
120
+ |----------|-------------|
121
+ | [Getting Started](docs/getting-started.md) | Install + first durable workflow |
122
+ | [API Reference](docs/api.md) | Public API surface (imports + pointers) |
123
+ | [Docs Index](docs/README.md) | Full docs map (guides + reference) |
124
+ | [FAQ](docs/faq.md) | Common questions and gotchas |
125
+ | [Architecture](docs/architecture.md) | Component map + diagrams |
126
+ | [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
127
+ | [Integrations](docs/integrations/) | Integration guides (AbstractCore) |
128
+ | [Snapshots](docs/snapshots.md) | Named checkpoints for run state |
129
+ | [Provenance](docs/provenance.md) | Tamper-evident ledger documentation |
130
+ | [Evidence](docs/evidence.md) | Artifact-backed evidence capture for web/command tools |
131
+ | [Limits](docs/limits.md) | `_limits` namespace and RuntimeConfig |
132
+ | [WorkflowBundles](docs/workflow-bundles.md) | `.flow` bundle format (VisualFlow distribution) |
133
+ | [MCP Worker](docs/mcp-worker.md) | `abstractruntime-mcp-worker` CLI |
134
+ | [Changelog](CHANGELOG.md) | Release notes |
135
+ | [Contributing](CONTRIBUTING.md) | How to build/test and submit changes |
136
+ | [Security](SECURITY.md) | Responsible vulnerability reporting |
137
+ | [Acknowledgments](ACKNOWLEDGMENTS.md) | Credits |
138
+ | [ROADMAP](ROADMAP.md) | Prioritized next steps |
139
+
140
+ ## Development
141
+
142
+ ```bash
143
+ python -m venv .venv
144
+ source .venv/bin/activate
145
+ python -m pip install -U pip
146
+ python -m pip install -e ".[abstractcore,mcp-worker]"
147
+ python -m pytest -q
148
+ ```
149
+
150
+ See `CONTRIBUTING.md` for contribution guidelines and doc conventions.