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.
- abstractruntime-0.4.1/0 +0 -0
- abstractruntime-0.4.1/ACKNOWLEDGMENTS.md +27 -0
- abstractruntime-0.4.1/ACKNOWLEDMENTS.md +4 -0
- abstractruntime-0.4.1/CHANGELOD.md +4 -0
- abstractruntime-0.4.1/CHANGELOG.md +253 -0
- abstractruntime-0.4.1/CONTRIBUTING.md +58 -0
- abstractruntime-0.4.1/PKG-INFO +177 -0
- abstractruntime-0.4.1/README.md +150 -0
- abstractruntime-0.4.1/ROADMAP.md +36 -0
- abstractruntime-0.4.1/SECURITY.md +24 -0
- abstractruntime-0.4.1/docs/README.md +37 -0
- abstractruntime-0.4.1/docs/api.md +172 -0
- abstractruntime-0.4.1/docs/architecture.md +197 -0
- abstractruntime-0.4.1/docs/backlog/README.md +40 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/002_persistence_and_ledger.md +1 -2
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/004_scheduler_driver.md +5 -11
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +4 -10
- abstractruntime-0.4.1/docs/backlog/completed/016_runtime_aware_parameters.md +46 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/README.md +1 -2
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +3 -3
- abstractruntime-0.4.1/docs/evidence.md +39 -0
- abstractruntime-0.4.1/docs/faq.md +138 -0
- abstractruntime-0.4.1/docs/getting-started.md +141 -0
- abstractruntime-0.4.1/docs/integrations/abstractcore.md +101 -0
- abstractruntime-0.4.1/docs/limits.md +83 -0
- abstractruntime-0.4.1/docs/manual_testing.md +243 -0
- abstractruntime-0.4.1/docs/mcp-worker.md +54 -0
- abstractruntime-0.4.1/docs/proposal.md +91 -0
- abstractruntime-0.4.1/docs/provenance.md +43 -0
- abstractruntime-0.4.1/docs/snapshots.md +43 -0
- abstractruntime-0.4.1/docs/tools-comms.md +83 -0
- abstractruntime-0.4.1/docs/workflow-bundles.md +62 -0
- abstractruntime-0.4.1/emails.config.example.yaml +44 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/README.md +2 -1
- abstractruntime-0.4.1/llms-full.txt +85 -0
- abstractruntime-0.4.1/llms.txt +51 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/pyproject.toml +22 -6
- abstractruntime-0.4.1/pytest.ini +6 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/__init__.py +83 -3
- abstractruntime-0.4.1/src/abstractruntime/core/config.py +181 -0
- abstractruntime-0.4.1/src/abstractruntime/core/event_keys.py +62 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/models.py +17 -1
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/policy.py +74 -3
- abstractruntime-0.4.1/src/abstractruntime/core/runtime.py +4042 -0
- abstractruntime-0.4.1/src/abstractruntime/core/vars.py +195 -0
- abstractruntime-0.4.1/src/abstractruntime/evidence/__init__.py +10 -0
- abstractruntime-0.4.1/src/abstractruntime/evidence/recorder.py +325 -0
- abstractruntime-0.4.1/src/abstractruntime/history_bundle.py +772 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/__init__.py +6 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/constants.py +19 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/default_tools.py +258 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/effect_handlers.py +2709 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/embeddings_client.py +69 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/factory.py +320 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/llm_client.py +1233 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/mcp_worker.py +587 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/observability.py +80 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/session_attachments.py +946 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/summarizer.py +154 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/tool_executor.py +646 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +561 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractmemory/__init__.py +3 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +946 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/__init__.py +21 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/active_context.py +751 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/active_memory.py +452 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/compaction.py +105 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/kg_packets.py +164 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/memact_composer.py +175 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/recall_levels.py +163 -0
- abstractruntime-0.4.1/src/abstractruntime/memory/token_budget.py +86 -0
- abstractruntime-0.4.1/src/abstractruntime/rendering/__init__.py +17 -0
- abstractruntime-0.4.1/src/abstractruntime/rendering/agent_trace_report.py +256 -0
- abstractruntime-0.4.1/src/abstractruntime/rendering/json_stringify.py +136 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/scheduler.py +93 -2
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/__init__.py +7 -2
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/artifacts.py +175 -32
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/base.py +17 -1
- abstractruntime-0.4.1/src/abstractruntime/storage/commands.py +339 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/in_memory.py +41 -1
- abstractruntime-0.4.1/src/abstractruntime/storage/json_files.py +404 -0
- abstractruntime-0.4.1/src/abstractruntime/storage/observable.py +136 -0
- abstractruntime-0.4.1/src/abstractruntime/storage/offloading.py +433 -0
- abstractruntime-0.4.1/src/abstractruntime/storage/sqlite.py +836 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/__init__.py +29 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/__init__.py +11 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +126 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +109 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +615 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +1051 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +307 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +97 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +114 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +74 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +316 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/compiler.py +3832 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/flow.py +247 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/__init__.py +13 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +29 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/builtins.py +1376 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/code_executor.py +214 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/executor.py +2804 -0
- abstractruntime-0.4.1/src/abstractruntime/visualflow_compiler/visual/models.py +211 -0
- abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/__init__.py +52 -0
- abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/models.py +236 -0
- abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/packer.py +317 -0
- abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/reader.py +87 -0
- abstractruntime-0.4.1/src/abstractruntime/workflow_bundle/registry.py +587 -0
- abstractruntime-0.4.1/tests/conftest.py +34 -0
- abstractruntime-0.4.1/tests/test_active_context_policy.py +217 -0
- abstractruntime-0.4.1/tests/test_active_memory.py +157 -0
- abstractruntime-0.4.1/tests/test_answer_user_effect.py +62 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_artifacts.py +73 -8
- abstractruntime-0.4.1/tests/test_chat_summarizer_integration.py +146 -0
- abstractruntime-0.4.1/tests/test_command_store.py +113 -0
- abstractruntime-0.4.1/tests/test_compaction_helpers.py +42 -0
- abstractruntime-0.4.1/tests/test_default_tools_comms_gating.py +44 -0
- abstractruntime-0.4.1/tests/test_default_tools_include_skim_files.py +52 -0
- abstractruntime-0.4.1/tests/test_default_tools_include_skim_folders.py +53 -0
- abstractruntime-0.4.1/tests/test_default_tools_search_files_executor.py +62 -0
- abstractruntime-0.4.1/tests/test_e2e_tool_calls_idempotency_lmstudio.py +140 -0
- abstractruntime-0.4.1/tests/test_emit_event_without_workflow_registry.py +34 -0
- abstractruntime-0.4.1/tests/test_evidence_recorder.py +136 -0
- abstractruntime-0.4.1/tests/test_factory_timeouts_default_to_abstractcore_config.py +100 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_integrations_abstractcore.py +46 -0
- abstractruntime-0.4.1/tests/test_json_file_run_store_children_index.py +67 -0
- abstractruntime-0.4.1/tests/test_kg_learn_and_recall_contract.py +245 -0
- abstractruntime-0.4.1/tests/test_ledger_subscription.py +87 -0
- abstractruntime-0.4.1/tests/test_llm_call_media_artifact_refs.py +138 -0
- abstractruntime-0.4.1/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +112 -0
- abstractruntime-0.4.1/tests/test_llm_call_media_uses_source_path_label.py +31 -0
- abstractruntime-0.4.1/tests/test_llm_call_requires_prompt.py +57 -0
- abstractruntime-0.4.1/tests/test_llm_call_response_schema_normalization.py +154 -0
- abstractruntime-0.4.1/tests/test_llm_call_structured_output_fallback.py +77 -0
- abstractruntime-0.4.1/tests/test_llm_call_truncation_retry_contract.py +93 -0
- abstractruntime-0.4.1/tests/test_llm_call_use_context_appends_turn.py +37 -0
- abstractruntime-0.4.1/tests/test_llm_call_verbatim_payload_capture.py +31 -0
- abstractruntime-0.4.1/tests/test_llm_client_system_context.py +234 -0
- abstractruntime-0.4.1/tests/test_llm_client_tool_call_parsing.py +250 -0
- abstractruntime-0.4.1/tests/test_local_runtime_timeout_kwarg_policy.py +38 -0
- abstractruntime-0.4.1/tests/test_mcp_remote_tool_executor.py +214 -0
- abstractruntime-0.4.1/tests/test_mcp_worker_logging.py +92 -0
- abstractruntime-0.4.1/tests/test_mcp_worker_security.py +89 -0
- abstractruntime-0.4.1/tests/test_mcp_worker_stdio.py +44 -0
- abstractruntime-0.4.1/tests/test_memact_composer_from_kg_result.py +76 -0
- abstractruntime-0.4.1/tests/test_memory_kg_assert_attributes_defaults.py +75 -0
- abstractruntime-0.4.1/tests/test_memory_kg_packets.py +73 -0
- abstractruntime-0.4.1/tests/test_memory_kg_predicate_aliasing.py +90 -0
- abstractruntime-0.4.1/tests/test_memory_kg_query_packetization_restart.py +114 -0
- abstractruntime-0.4.1/tests/test_memory_kg_query_recall_level_policy.py +112 -0
- abstractruntime-0.4.1/tests/test_memory_kg_semantic_query_ranking.py +96 -0
- abstractruntime-0.4.1/tests/test_memory_note_effect.py +235 -0
- abstractruntime-0.4.1/tests/test_memory_query_effect.py +115 -0
- abstractruntime-0.4.1/tests/test_memory_query_rich_filters.py +250 -0
- abstractruntime-0.4.1/tests/test_memory_scope_and_rehydrate_effect.py +545 -0
- abstractruntime-0.4.1/tests/test_memory_tag_effect.py +122 -0
- abstractruntime-0.4.1/tests/test_mlx_generation_serialization.py +65 -0
- abstractruntime-0.4.1/tests/test_offloading.py +109 -0
- abstractruntime-0.4.1/tests/test_packaging_extras.py +33 -0
- abstractruntime-0.4.1/tests/test_pause_resume.py +197 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_queryable_run_store.py +61 -1
- abstractruntime-0.4.1/tests/test_read_file_fallback_to_session_attachments.py +226 -0
- abstractruntime-0.4.1/tests/test_recall_levels_policy.py +41 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_remote_llm_client.py +21 -1
- abstractruntime-0.4.1/tests/test_rendering_agent_trace_report.py +72 -0
- abstractruntime-0.4.1/tests/test_rendering_json_stringify.py +28 -0
- abstractruntime-0.4.1/tests/test_run_history_bundle.py +178 -0
- abstractruntime-0.4.1/tests/test_runtime_config_max_output_tokens_fallback.py +19 -0
- abstractruntime-0.4.1/tests/test_runtime_llm_call_grounding_in_ledger.py +63 -0
- abstractruntime-0.4.1/tests/test_runtime_node_traces.py +65 -0
- abstractruntime-0.4.1/tests/test_runtime_start_seeds_tool_support.py +37 -0
- abstractruntime-0.4.1/tests/test_session_attachments_registry_and_open_tool.py +1100 -0
- abstractruntime-0.4.1/tests/test_sqlite_ledger_store.py +239 -0
- abstractruntime-0.4.1/tests/test_start_subworkflow_async_wait.py +61 -0
- abstractruntime-0.4.1/tests/test_start_subworkflow_inherit_context_merges_messages.py +89 -0
- abstractruntime-0.4.1/tests/test_start_subworkflow_workspace_inheritance.py +108 -0
- abstractruntime-0.4.1/tests/test_structured_output_schema_enum.py +38 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_subworkflow.py +20 -0
- abstractruntime-0.4.1/tests/test_terminal_effect_completion.py +48 -0
- abstractruntime-0.4.1/tests/test_terminal_resume_appends_ledger_completion.py +76 -0
- abstractruntime-0.4.1/tests/test_tick_completion_includes_output_in_ledger.py +55 -0
- abstractruntime-0.4.1/tests/test_tool_calls_idempotency_keys.py +179 -0
- abstractruntime-0.4.1/tests/test_tool_executor_argument_sanitization.py +28 -0
- abstractruntime-0.4.1/tests/test_tool_executor_error_output_detection.py +28 -0
- abstractruntime-0.4.1/tests/test_tool_executor_filename_alias.py +30 -0
- abstractruntime-0.4.1/tests/test_tool_executor_kwarg_canonicalization.py +58 -0
- abstractruntime-0.4.1/tests/test_tool_executor_read_file_aliases.py +65 -0
- abstractruntime-0.4.1/tests/test_tool_executor_timeout.py +45 -0
- abstractruntime-0.4.1/tests/test_tool_wait_allowlist_safety.py +152 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_trace_context_propagation.py +24 -0
- abstractruntime-0.4.1/tests/test_vars_query_effect.py +109 -0
- abstractruntime-0.4.1/tests/test_visual_agent_output_context_includes_messages.py +89 -0
- abstractruntime-0.4.1/tests/test_visual_agent_tool_observations_persist_across_restart.py +168 -0
- abstractruntime-0.4.1/tests/test_visual_agent_use_context_inherits_attachments.py +87 -0
- abstractruntime-0.4.1/tests/test_visual_agent_use_context_persists_tool_observations.py +98 -0
- abstractruntime-0.4.1/tests/test_visual_agent_use_context_persists_turn.py +65 -0
- abstractruntime-0.4.1/tests/test_visual_llm_call_schema_ref_resolution.py +86 -0
- abstractruntime-0.4.1/tests/test_visual_memact_compose_node.py +190 -0
- abstractruntime-0.4.1/tests/test_visual_memory_kg_query_outputs_propagate.py +172 -0
- abstractruntime-0.4.1/tests/test_visual_memory_kg_resolve_outputs_propagate.py +161 -0
- abstractruntime-0.4.1/tests/test_visualflow_add_message_builtin.py +24 -0
- abstractruntime-0.4.1/tests/test_visualflow_add_message_node_appends_to_active_context.py +54 -0
- abstractruntime-0.4.1/tests/test_visualflow_call_tool_node.py +159 -0
- abstractruntime-0.4.1/tests/test_visualflow_compiler_basic.py +79 -0
- abstractruntime-0.4.1/tests/test_visualflow_context_and_builder_nodes.py +175 -0
- abstractruntime-0.4.1/tests/test_visualflow_get_element_node.py +111 -0
- abstractruntime-0.4.1/tests/test_visualflow_get_random_element_node.py +88 -0
- abstractruntime-0.4.1/tests/test_visualflow_has_tools_builtin.py +14 -0
- abstractruntime-0.4.1/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +43 -0
- abstractruntime-0.4.1/tests/test_visualflow_make_object_node.py +75 -0
- abstractruntime-0.4.1/tests/test_visualflow_memory_effect_nodes.py +385 -0
- abstractruntime-0.4.1/tests/test_visualflow_memory_source_pins.py +363 -0
- abstractruntime-0.4.1/tests/test_visualflow_prompt_only.py +203 -0
- abstractruntime-0.4.1/tests/test_visualflow_random_nodes.py +82 -0
- abstractruntime-0.4.1/tests/test_visualflow_string_contains_replace.py +33 -0
- abstractruntime-0.4.1/tests/test_visualflow_tool_parameters_node.py +111 -0
- abstractruntime-0.4.1/tests/test_wait_event_prompt_metadata.py +61 -0
- abstractruntime-0.4.1/tests/test_workflow_bundle_registry.py +82 -0
- abstractruntime-0.4.1/tests/test_workspace_policy_allowlist_mode.py +41 -0
- abstractruntime-0.4.1/tests/test_workspace_policy_mount_virtual_paths.py +56 -0
- abstractruntime-0.4.1/tests/test_workspace_policy_tool_calls_persist_across_restart.py +103 -0
- abstractruntime-0.2.0/CHANGELOG.md +0 -132
- abstractruntime-0.2.0/PKG-INFO +0 -163
- abstractruntime-0.2.0/README.md +0 -141
- abstractruntime-0.2.0/ROADMAP.md +0 -235
- abstractruntime-0.2.0/docs/backlog/README.md +0 -42
- abstractruntime-0.2.0/docs/backlog/completed/016_runtime_aware_parameters.md +0 -240
- abstractruntime-0.2.0/docs/integrations/abstractcore.md +0 -97
- abstractruntime-0.2.0/docs/limits.md +0 -266
- abstractruntime-0.2.0/docs/manual_testing.md +0 -309
- abstractruntime-0.2.0/docs/proposal.md +0 -166
- abstractruntime-0.2.0/docs/provenance.md +0 -36
- abstractruntime-0.2.0/docs/snapshots.md +0 -47
- abstractruntime-0.2.0/src/abstractruntime/core/config.py +0 -101
- abstractruntime-0.2.0/src/abstractruntime/core/runtime.py +0 -736
- abstractruntime-0.2.0/src/abstractruntime/core/vars.py +0 -94
- abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -119
- abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/factory.py +0 -187
- abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -397
- abstractruntime-0.2.0/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -168
- abstractruntime-0.2.0/src/abstractruntime/storage/json_files.py +0 -208
- abstractruntime-0.2.0/tests/conftest.py +0 -20
- abstractruntime-0.2.0/tests/test_pause_resume.py +0 -98
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/.gitignore +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/LICENSE +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/adr/README.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/README.md +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.2.0 → abstractruntime-0.4.1}/tests/test_snapshots.py +0 -0
abstractruntime-0.4.1/0
ADDED
|
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,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.
|