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