AbstractRuntime 0.4.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.0 → abstractruntime-0.4.1}/CHANGELOG.md +21 -8
- 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.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/002_persistence_and_ledger.md +1 -2
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/004_scheduler_driver.md +5 -11
- {abstractruntime-0.4.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.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/README.md +1 -2
- {abstractruntime-0.4.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.4.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.4.0 → abstractruntime-0.4.1}/pyproject.toml +8 -4
- abstractruntime-0.4.1/pytest.ini +6 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/__init__.py +76 -1
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/config.py +68 -1
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/models.py +5 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/policy.py +74 -3
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/runtime.py +1002 -126
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/vars.py +8 -2
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/evidence/recorder.py +1 -1
- abstractruntime-0.4.1/src/abstractruntime/history_bundle.py +772 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/__init__.py +3 -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.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/factory.py +68 -20
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +447 -15
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +1 -0
- abstractruntime-0.4.1/src/abstractruntime/integrations/abstractcore/session_attachments.py +946 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +31 -10
- 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.0 → abstractruntime-0.4.1}/src/abstractruntime/memory/active_context.py +6 -1
- 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.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/__init__.py +4 -1
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/artifacts.py +158 -30
- {abstractruntime-0.4.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.4.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.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/observable.py +38 -1
- 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.0 → abstractruntime-0.4.1}/tests/test_answer_user_effect.py +2 -3
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_artifacts.py +41 -8
- abstractruntime-0.4.1/tests/test_command_store.py +113 -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_factory_timeouts_default_to_abstractcore_config.py +100 -0
- {abstractruntime-0.4.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_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_client_system_context.py +234 -0
- abstractruntime-0.4.1/tests/test_local_runtime_timeout_kwarg_policy.py +38 -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.0 → abstractruntime-0.4.1}/tests/test_memory_scope_and_rehydrate_effect.py +216 -7
- 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.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.4.0 → abstractruntime-0.4.1}/tests/test_remote_llm_client.py +2 -2
- abstractruntime-0.4.1/tests/test_run_history_bundle.py +178 -0
- abstractruntime-0.4.1/tests/test_runtime_llm_call_grounding_in_ledger.py +63 -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_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.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.0 → abstractruntime-0.4.1}/tests/test_trace_context_propagation.py +24 -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_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.4.0/PKG-INFO +0 -167
- abstractruntime-0.4.0/README.md +0 -141
- abstractruntime-0.4.0/ROADMAP.md +0 -235
- abstractruntime-0.4.0/docs/architecture.md +0 -165
- abstractruntime-0.4.0/docs/backlog/README.md +0 -42
- abstractruntime-0.4.0/docs/backlog/completed/016_runtime_aware_parameters.md +0 -240
- abstractruntime-0.4.0/docs/integrations/abstractcore.md +0 -97
- abstractruntime-0.4.0/docs/limits.md +0 -266
- abstractruntime-0.4.0/docs/manual_testing.md +0 -309
- abstractruntime-0.4.0/docs/proposal.md +0 -166
- abstractruntime-0.4.0/docs/provenance.md +0 -36
- abstractruntime-0.4.0/docs/snapshots.md +0 -47
- abstractruntime-0.4.0/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -134
- abstractruntime-0.4.0/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -368
- abstractruntime-0.4.0/src/abstractruntime/storage/json_files.py +0 -221
- abstractruntime-0.4.0/tests/conftest.py +0 -38
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/.gitignore +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/LICENSE +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/README.md +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.0 → abstractruntime-0.4.1}/tests/test_wait_event_prompt_metadata.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`.
|
|
@@ -7,13 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
## [0.4.1] - 2026-02-04
|
|
16
|
+
|
|
10
17
|
### Added
|
|
11
18
|
- **Durable prompt metadata for EVENT waits**:
|
|
12
19
|
- `WAIT_EVENT` effects may include optional `prompt`, `choices`, and `allow_free_text` fields.
|
|
13
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.
|
|
14
21
|
- **Rendering utilities** (`abstractruntime.rendering`):
|
|
15
22
|
- `stringify_json(...)` + `JsonStringifyMode` to render JSON/JSON-ish values into strings with `none|beautify|minified` modes.
|
|
16
|
-
- `render_agent_trace_markdown(...)` to render runtime-owned `node_traces` scratchpads into a complete, review-friendly Markdown timeline
|
|
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).
|
|
17
32
|
|
|
18
33
|
## [0.4.0] - 2025-01-06
|
|
19
34
|
|
|
@@ -203,15 +218,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
203
218
|
- **Graph-Based Execution**: All workflows represented as state machines/graphs for visualization and composition
|
|
204
219
|
- **JSON-Serializable State**: All run state and vars must be JSON-serializable for persistence
|
|
205
220
|
|
|
206
|
-
####
|
|
207
|
-
-
|
|
208
|
-
- **Integration Tests**: Tests for AbstractCore integration, subworkflows, trace propagation
|
|
209
|
-
- **Core Tests**: Scheduler, snapshots, artifacts, pause/resume, retry/idempotency, ledger chain
|
|
210
|
-
- **Storage Tests**: Queryable run store, durable toolsets
|
|
221
|
+
#### Testing
|
|
222
|
+
- Run the test suite with `python -m pytest -q` (see `docs/manual_testing.md`).
|
|
211
223
|
|
|
212
224
|
#### Compatibility
|
|
213
225
|
- **Python 3.10+**: Supports Python 3.10, 3.11, 3.12, and 3.13
|
|
214
|
-
- **Development Status**: Planning/Alpha (moving toward Beta with 0.2.0)
|
|
215
226
|
|
|
216
227
|
### Known Limitations
|
|
217
228
|
|
|
@@ -236,5 +247,7 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
236
247
|
|
|
237
248
|
Initial development version with basic proof-of-concept features.
|
|
238
249
|
|
|
239
|
-
[
|
|
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
|
|
240
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.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# AbstractRuntime Roadmap
|
|
2
|
+
|
|
3
|
+
## Current status (v0.4.1)
|
|
4
|
+
|
|
5
|
+
AbstractRuntime provides a durable workflow kernel plus optional integrations:
|
|
6
|
+
- durable execution: `Runtime.start/tick/resume`, explicit `WaitState` (`src/abstractruntime/core/runtime.py`)
|
|
7
|
+
- append-only ledger (`StepRecord`) + persistent stores (JSON/JSONL, SQLite) (`src/abstractruntime/storage/*`)
|
|
8
|
+
- built-in scheduler (`Scheduler`, `ScheduledRuntime`) (`src/abstractruntime/scheduler/*`)
|
|
9
|
+
- snapshots/bookmarks (`src/abstractruntime/storage/snapshots.py`)
|
|
10
|
+
- tamper-evident hash-chained ledger (`src/abstractruntime/storage/ledger_chain.py`)
|
|
11
|
+
- artifacts + offloading for large payloads (`src/abstractruntime/storage/artifacts.py`, `src/abstractruntime/storage/offloading.py`)
|
|
12
|
+
- retries/idempotency hooks (`src/abstractruntime/core/policy.py`)
|
|
13
|
+
- VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
|
|
14
|
+
- AbstractCore integration for `LLM_CALL` / `TOOL_CALLS` (`docs/integrations/abstractcore.md`)
|
|
15
|
+
|
|
16
|
+
## Near-term priorities
|
|
17
|
+
|
|
18
|
+
These are tracked in `docs/backlog/planned/`:
|
|
19
|
+
|
|
20
|
+
1. **Signatures and keys** — non-forgeable provenance (beyond tamper-evidence)
|
|
21
|
+
`docs/backlog/planned/008_signatures_and_keys.md`
|
|
22
|
+
|
|
23
|
+
2. **Remote tool worker executor** — first-class worker boundary for tool execution
|
|
24
|
+
`docs/backlog/planned/014_remote_tool_worker_executor.md`
|
|
25
|
+
|
|
26
|
+
3. **Limit warnings + observability events** — surface `_limits` warnings durably/streaming
|
|
27
|
+
`docs/backlog/planned/017_limit_warnings_and_observability.md`
|
|
28
|
+
|
|
29
|
+
4. **Agent integration improvements** — reduce friction for external agent loops building on runtime
|
|
30
|
+
`docs/backlog/planned/015_agent_integration_improvements.md`
|
|
31
|
+
|
|
32
|
+
## Longer-term (not scheduled)
|
|
33
|
+
|
|
34
|
+
- distributed scheduling primitives (beyond in-process polling)
|
|
35
|
+
- workflow versioning/migration patterns for long-lived runs and snapshot restore
|
|
36
|
+
- stronger reproducibility contracts for replays (workflow snapshotting + run history bundles)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
Please report security issues **privately**.
|
|
6
|
+
|
|
7
|
+
Preferred channel:
|
|
8
|
+
- Use **GitHub Security Advisories** / the repository’s “Report a vulnerability” feature (private).
|
|
9
|
+
|
|
10
|
+
Include as much of the following as you can:
|
|
11
|
+
- affected versions (from `pyproject.toml` / `CHANGELOG.md`)
|
|
12
|
+
- impact and realistic attack scenario
|
|
13
|
+
- minimal reproduction steps or proof-of-concept
|
|
14
|
+
- environment details (OS, Python version, storage backend used)
|
|
15
|
+
|
|
16
|
+
## Coordinated disclosure
|
|
17
|
+
|
|
18
|
+
- Do not open public issues/PRs for security vulnerabilities.
|
|
19
|
+
- Avoid data exfiltration, service disruption, or destructive testing; keep verification to the minimum needed.
|
|
20
|
+
|
|
21
|
+
## Non-security bugs
|
|
22
|
+
|
|
23
|
+
If you are unsure whether an issue is security-related, prefer reporting it privately first.
|
|
24
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Documentation
|
|
2
|
+
|
|
3
|
+
This folder contains **user-facing docs** (how to use AbstractRuntime) and **maintainer docs** (ADRs/backlog).
|
|
4
|
+
|
|
5
|
+
## Start here
|
|
6
|
+
|
|
7
|
+
- `../README.md` — install + quick start
|
|
8
|
+
- `getting-started.md` — first steps (recommended)
|
|
9
|
+
- `api.md` — public API surface (imports + pointers)
|
|
10
|
+
- `architecture.md` — how the runtime is structured (with diagrams)
|
|
11
|
+
- `proposal.md` — design goals and scope boundaries
|
|
12
|
+
|
|
13
|
+
## Guides
|
|
14
|
+
|
|
15
|
+
- `faq.md` — common questions (recommended)
|
|
16
|
+
- `manual_testing.md` — manual smoke tests and how to run the test suite
|
|
17
|
+
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS` via AbstractCore
|
|
18
|
+
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
19
|
+
|
|
20
|
+
## Features (reference)
|
|
21
|
+
|
|
22
|
+
- `evidence.md` — artifact-backed evidence capture for external-boundary tools
|
|
23
|
+
- `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
|
|
24
|
+
- `snapshots.md` — snapshot/bookmark model and stores
|
|
25
|
+
- `provenance.md` — tamper-evident hash-chained ledger
|
|
26
|
+
- `limits.md` — runtime-aware `_limits` namespace and APIs
|
|
27
|
+
- `workflow-bundles.md` — `.flow` bundle format (VisualFlow distribution)
|
|
28
|
+
|
|
29
|
+
## Maintainers
|
|
30
|
+
|
|
31
|
+
- `../CHANGELOG.md` — release notes
|
|
32
|
+
- `../CONTRIBUTING.md` — how to build/test and submit changes
|
|
33
|
+
- `../SECURITY.md` — responsible vulnerability reporting
|
|
34
|
+
- `../ACKNOWLEDGMENTS.md` — credits
|
|
35
|
+
- `../ROADMAP.md` — prioritized next steps
|
|
36
|
+
- `adr/README.md` — architectural decisions (why)
|
|
37
|
+
- `backlog/README.md` — implemented and planned work items (what/how)
|