AbstractRuntime 0.4.9__tar.gz → 0.4.11__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.9 → abstractruntime-0.4.11}/CHANGELOG.md +19 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/PKG-INFO +11 -11
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/README.md +3 -3
- abstractruntime-0.4.11/docs/backlog/proposed/2026-05-09_runtime_retention_and_purge_contract.md +82 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/pyproject.toml +8 -8
- abstractruntime-0.4.11/release-notes.md +6 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +43 -2
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/llm_client.py +18 -2
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/compiler.py +73 -1
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/executor.py +224 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_client_media_artifacts.py +8 -3
- abstractruntime-0.4.11/tests/test_media_artifact_resolution.py +66 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_multimodal_abstractcore_integration.py +8 -1
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_session_attachments_registry_and_open_tool.py +9 -1
- abstractruntime-0.4.11/tests/test_visualflow_media_nodes.py +175 -0
- abstractruntime-0.4.9/release-notes.md +0 -9
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/.gitignore +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/LICENSE +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/ROADMAP.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/SECURITY.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/api.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/architecture.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/proposed/2026-05-08_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/evidence.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/faq.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/getting-started.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/limits.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/proposal.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/provenance.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/examples/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/llms-full.txt +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/llms.txt +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/mkdocs.yml +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/pytest.ini +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/README.md +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/conftest.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.9 → abstractruntime-0.4.11}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.11] - 2026-05-13
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- AbstractCore effect-handler media materialization now preserves artifact `content_type`, media `type`, artifact ids, and safe filename extensions instead of dropping artifact-backed media to bare paths. This keeps generated WAV artifacts valid for downstream transcription nodes.
|
|
14
|
+
- Added explicit MIME extension aliases for common generated media types such as `audio/wav`, `image/png`, and `video/mp4` so platform MIME table differences do not create extensionless temp files.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.14`.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## [0.4.10] - 2026-05-12
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Generated media VisualFlow nodes now keep media model selection in the output spec and reserve LLM `provider`/`model` routing for explicit `runtime_provider`/`runtime_model` overrides.
|
|
24
|
+
- Legacy `provider`/`model` pins on image, TTS, and STT media nodes remain accepted as media selector fallbacks for existing flows.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.13` so generated media and audio catalog contracts stay aligned.
|
|
28
|
+
|
|
10
29
|
## [0.4.9] - 2026-05-09
|
|
11
30
|
|
|
12
31
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.11
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -23,23 +23,23 @@ Requires-Python: >=3.10
|
|
|
23
23
|
Requires-Dist: abstractmemory>=0.2.6
|
|
24
24
|
Requires-Dist: abstractsemantics>=0.0.3
|
|
25
25
|
Provides-Extra: abstractcore
|
|
26
|
-
Requires-Dist: abstractcore>=2.13.
|
|
26
|
+
Requires-Dist: abstractcore>=2.13.14; extra == 'abstractcore'
|
|
27
27
|
Provides-Extra: all-apple
|
|
28
|
-
Requires-Dist: abstractcore[all-apple]>=2.13.
|
|
28
|
+
Requires-Dist: abstractcore[all-apple]>=2.13.14; extra == 'all-apple'
|
|
29
29
|
Provides-Extra: all-gpu
|
|
30
|
-
Requires-Dist: abstractcore[all-gpu]>=2.13.
|
|
30
|
+
Requires-Dist: abstractcore[all-gpu]>=2.13.14; extra == 'all-gpu'
|
|
31
31
|
Provides-Extra: apple
|
|
32
|
-
Requires-Dist: abstractcore[apple]>=2.13.
|
|
32
|
+
Requires-Dist: abstractcore[apple]>=2.13.14; extra == 'apple'
|
|
33
33
|
Provides-Extra: docs
|
|
34
34
|
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
35
35
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
36
36
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
37
37
|
Provides-Extra: gpu
|
|
38
|
-
Requires-Dist: abstractcore[gpu]>=2.13.
|
|
38
|
+
Requires-Dist: abstractcore[gpu]>=2.13.14; extra == 'gpu'
|
|
39
39
|
Provides-Extra: mcp-worker
|
|
40
|
-
Requires-Dist: abstractcore[tools]>=2.13.
|
|
40
|
+
Requires-Dist: abstractcore[tools]>=2.13.14; extra == 'mcp-worker'
|
|
41
41
|
Provides-Extra: multimodal
|
|
42
|
-
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.
|
|
42
|
+
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.14; extra == 'multimodal'
|
|
43
43
|
Provides-Extra: test
|
|
44
44
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
45
45
|
Description-Content-Type: text/markdown
|
|
@@ -50,7 +50,7 @@ Description-Content-Type: text/markdown
|
|
|
50
50
|
|
|
51
51
|
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.
|
|
52
52
|
|
|
53
|
-
**Version:** 0.4.
|
|
53
|
+
**Version:** 0.4.10 • **Python:** 3.10+
|
|
54
54
|
|
|
55
55
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
56
56
|
|
|
@@ -84,7 +84,7 @@ AbstractCore integration (LLM + tools):
|
|
|
84
84
|
pip install "abstractruntime[abstractcore]"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
The `abstractcore` extra installs AbstractCore 2.13.
|
|
87
|
+
The `abstractcore` extra installs AbstractCore 2.13.13 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, current tool catalog, public output-selector contract, and async/sync text-generation output-selector parity are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
|
|
88
88
|
|
|
89
89
|
Hardware profile cascades are available for native Python installs:
|
|
90
90
|
`abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
|
|
@@ -138,7 +138,7 @@ state = rt.resume(
|
|
|
138
138
|
assert state.status.value == "completed"
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
-
## What’s included (v0.4.
|
|
141
|
+
## What’s included (v0.4.10)
|
|
142
142
|
|
|
143
143
|
Kernel (dependency-light):
|
|
144
144
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
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
6
|
|
|
7
|
-
**Version:** 0.4.
|
|
7
|
+
**Version:** 0.4.10 • **Python:** 3.10+
|
|
8
8
|
|
|
9
9
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
10
10
|
|
|
@@ -38,7 +38,7 @@ AbstractCore integration (LLM + tools):
|
|
|
38
38
|
pip install "abstractruntime[abstractcore]"
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
The `abstractcore` extra installs AbstractCore 2.13.
|
|
41
|
+
The `abstractcore` extra installs AbstractCore 2.13.13 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, current tool catalog, public output-selector contract, and async/sync text-generation output-selector parity are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
|
|
42
42
|
|
|
43
43
|
Hardware profile cascades are available for native Python installs:
|
|
44
44
|
`abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
|
|
@@ -92,7 +92,7 @@ state = rt.resume(
|
|
|
92
92
|
assert state.status.value == "completed"
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
## What’s included (v0.4.
|
|
95
|
+
## What’s included (v0.4.10)
|
|
96
96
|
|
|
97
97
|
Kernel (dependency-light):
|
|
98
98
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
abstractruntime-0.4.11/docs/backlog/proposed/2026-05-09_runtime_retention_and_purge_contract.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Proposed: Runtime Retention And Purge Contract
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
- Created: 2026-05-09
|
|
5
|
+
- Status: Proposed
|
|
6
|
+
- Completed: N/A
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
AbstractRuntime is the durable graph ledger. Durability is still the default, but hosts such as
|
|
11
|
+
AbstractGateway need a principled way to handle temporary/private runs created by authoring tools
|
|
12
|
+
like AbstractFlow.
|
|
13
|
+
|
|
14
|
+
Current Runtime reality:
|
|
15
|
+
|
|
16
|
+
- `RunStore` exposes `save()` and `load()`.
|
|
17
|
+
- `QueryableRunStore` exposes listing and child traversal.
|
|
18
|
+
- `LedgerStore` is append-only with `append()` and `list()`.
|
|
19
|
+
- `ArtifactStore` implementations already have delete helpers such as `delete_by_run()`.
|
|
20
|
+
- There is no generic retention class, purge protocol, or host-neutral cleanup helper for a run tree.
|
|
21
|
+
|
|
22
|
+
## Why this might matter
|
|
23
|
+
|
|
24
|
+
Gateway can implement cleanup itself, but the concepts are generic:
|
|
25
|
+
|
|
26
|
+
- deleting or archiving a root run and all child/subworkflow runs;
|
|
27
|
+
- deleting ledgers and artifacts for a run tree;
|
|
28
|
+
- preserving append-only production ledgers while allowing explicitly temporary authoring runs to
|
|
29
|
+
expire;
|
|
30
|
+
- hiding private runs from default indexes.
|
|
31
|
+
|
|
32
|
+
If every host invents its own cleanup behavior, run history, artifacts, and child runs can drift.
|
|
33
|
+
|
|
34
|
+
## Proposed direction
|
|
35
|
+
|
|
36
|
+
Add optional runtime-level retention/purge contracts:
|
|
37
|
+
|
|
38
|
+
- Run metadata convention:
|
|
39
|
+
- `run.vars["_runtime"]["purpose"]`;
|
|
40
|
+
- `run.vars["_runtime"]["visibility"]`;
|
|
41
|
+
- `run.vars["_runtime"]["retention"]`;
|
|
42
|
+
- `expires_at` or `ttl_s` where appropriate.
|
|
43
|
+
- Optional storage protocols:
|
|
44
|
+
- `DeletableRunStore.delete(run_id)`;
|
|
45
|
+
- `DeletableLedgerStore.delete(run_id)` or `delete_by_run(run_id)`;
|
|
46
|
+
- query helpers for expired/private/draft runs.
|
|
47
|
+
- Runtime helper:
|
|
48
|
+
- collect a run tree from a root;
|
|
49
|
+
- purge or archive run checkpoints, ledgers, and artifacts;
|
|
50
|
+
- return a structured cleanup report.
|
|
51
|
+
- Documentation:
|
|
52
|
+
- durability remains default;
|
|
53
|
+
- purge is allowed only for explicitly temporary/private runs unless a host chooses otherwise.
|
|
54
|
+
|
|
55
|
+
## Evidence to gather before promotion
|
|
56
|
+
|
|
57
|
+
- Determine whether JSON file and SQLite stores can implement deletion safely without weakening
|
|
58
|
+
provenance guarantees for production runs.
|
|
59
|
+
- Decide whether "private" means hidden, encrypted, or merely excluded from default listings in v0.
|
|
60
|
+
- Decide whether purge should be hard-delete or archive-to-artifact for auditability.
|
|
61
|
+
- Check Gateway's needs for draft Flow tests and backlog/UAT workspaces before finalizing fields.
|
|
62
|
+
|
|
63
|
+
## Validation ideas
|
|
64
|
+
|
|
65
|
+
- Store contract tests for JSON, SQLite, and in-memory implementations.
|
|
66
|
+
- Runtime helper tests:
|
|
67
|
+
- root + child run tree cleanup;
|
|
68
|
+
- artifact cleanup;
|
|
69
|
+
- no accidental cleanup of non-temporary runs unless explicitly forced.
|
|
70
|
+
- Gateway integration tests once promoted.
|
|
71
|
+
|
|
72
|
+
## Non-goals
|
|
73
|
+
|
|
74
|
+
- Do not make Runtime responsible for Gateway's retention policy defaults.
|
|
75
|
+
- Do not remove append-only ledger semantics for normal production runs.
|
|
76
|
+
- Do not require every store backend to implement deletion immediately; keep protocols optional and
|
|
77
|
+
capability-detected.
|
|
78
|
+
|
|
79
|
+
## Guidance for future agents
|
|
80
|
+
|
|
81
|
+
Promote this only when Gateway starts implementing first-class draft/private run cleanup. Keep the
|
|
82
|
+
boundary clean: Runtime defines reusable storage mechanics; Gateway decides policy; Flow decides UX.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "AbstractRuntime"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.11"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -46,34 +46,34 @@ dependencies = [
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
# Enables `abstractruntime.integrations.abstractcore.*` imports.
|
|
48
48
|
abstractcore = [
|
|
49
|
-
"abstractcore>=2.13.
|
|
49
|
+
"abstractcore>=2.13.14",
|
|
50
50
|
]
|
|
51
51
|
|
|
52
52
|
apple = [
|
|
53
|
-
"abstractcore[apple]>=2.13.
|
|
53
|
+
"abstractcore[apple]>=2.13.14",
|
|
54
54
|
]
|
|
55
55
|
|
|
56
56
|
gpu = [
|
|
57
|
-
"abstractcore[gpu]>=2.13.
|
|
57
|
+
"abstractcore[gpu]>=2.13.14",
|
|
58
58
|
]
|
|
59
59
|
|
|
60
60
|
all-apple = [
|
|
61
|
-
"abstractcore[all-apple]>=2.13.
|
|
61
|
+
"abstractcore[all-apple]>=2.13.14",
|
|
62
62
|
]
|
|
63
63
|
|
|
64
64
|
all-gpu = [
|
|
65
|
-
"abstractcore[all-gpu]>=2.13.
|
|
65
|
+
"abstractcore[all-gpu]>=2.13.14",
|
|
66
66
|
]
|
|
67
67
|
|
|
68
68
|
# Enables AbstractCore multimodal generation helpers with common OpenAI-backed
|
|
69
69
|
# image/voice capability packages.
|
|
70
70
|
multimodal = [
|
|
71
|
-
"abstractcore[media,openai,vision,voice,audio]>=2.13.
|
|
71
|
+
"abstractcore[media,openai,vision,voice,audio]>=2.13.14",
|
|
72
72
|
]
|
|
73
73
|
|
|
74
74
|
# Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
|
|
75
75
|
mcp-worker = [
|
|
76
|
-
"abstractcore[tools]>=2.13.
|
|
76
|
+
"abstractcore[tools]>=2.13.14",
|
|
77
77
|
]
|
|
78
78
|
|
|
79
79
|
# CI/test dependencies. The workflow runs the basic contract suite plus focused
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
### Fixed
|
|
2
|
+
- AbstractCore effect-handler media materialization now preserves artifact `content_type`, media `type`, artifact ids, and safe filename extensions instead of dropping artifact-backed media to bare paths. This keeps generated WAV artifacts valid for downstream transcription nodes.
|
|
3
|
+
- Added explicit MIME extension aliases for common generated media types such as `audio/wav`, `image/png`, and `video/mp4` so platform MIME table differences do not create extensionless temp files.
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.14`.
|
|
@@ -63,6 +63,23 @@ def _guess_ext_from_content_type(content_type: str) -> str:
|
|
|
63
63
|
ct = str(content_type or "").strip().lower()
|
|
64
64
|
if not ct:
|
|
65
65
|
return ""
|
|
66
|
+
explicit = {
|
|
67
|
+
"audio/wav": ".wav",
|
|
68
|
+
"audio/wave": ".wav",
|
|
69
|
+
"audio/x-wav": ".wav",
|
|
70
|
+
"audio/mpeg": ".mp3",
|
|
71
|
+
"audio/mp3": ".mp3",
|
|
72
|
+
"audio/ogg": ".ogg",
|
|
73
|
+
"audio/flac": ".flac",
|
|
74
|
+
"image/jpeg": ".jpg",
|
|
75
|
+
"image/jpg": ".jpg",
|
|
76
|
+
"image/png": ".png",
|
|
77
|
+
"image/webp": ".webp",
|
|
78
|
+
"video/mp4": ".mp4",
|
|
79
|
+
"video/quicktime": ".mov",
|
|
80
|
+
}
|
|
81
|
+
if ct in explicit:
|
|
82
|
+
return explicit[ct]
|
|
66
83
|
ext = mimetypes.guess_extension(ct) or ""
|
|
67
84
|
if ext == ".jpe":
|
|
68
85
|
return ".jpg"
|
|
@@ -679,9 +696,21 @@ def _resolve_llm_call_media(
|
|
|
679
696
|
raw_name = source_path or item.get("filename") or item.get("name")
|
|
680
697
|
if isinstance(raw_name, str) and raw_name.strip():
|
|
681
698
|
filename = raw_name.strip()
|
|
699
|
+
content_type = ""
|
|
700
|
+
if isinstance(item, dict):
|
|
701
|
+
for key in ("content_type", "mime_type", "mimeType", "mime"):
|
|
702
|
+
raw_ct = item.get(key)
|
|
703
|
+
if isinstance(raw_ct, str) and raw_ct.strip():
|
|
704
|
+
content_type = raw_ct.strip()
|
|
705
|
+
break
|
|
706
|
+
if not content_type:
|
|
707
|
+
raw_artifact_ct = getattr(artifact, "content_type", None)
|
|
708
|
+
if isinstance(raw_artifact_ct, str) and raw_artifact_ct.strip():
|
|
709
|
+
content_type = raw_artifact_ct.strip()
|
|
710
|
+
|
|
682
711
|
ext = Path(filename).suffix if filename else ""
|
|
683
712
|
if not ext:
|
|
684
|
-
ct = str(getattr(getattr(artifact, "metadata", None), "content_type", "") or "")
|
|
713
|
+
ct = content_type or str(getattr(getattr(artifact, "metadata", None), "content_type", "") or "")
|
|
685
714
|
ext = _guess_ext_from_content_type(ct)
|
|
686
715
|
|
|
687
716
|
desired = source_path or filename or artifact_id
|
|
@@ -691,7 +720,19 @@ def _resolve_llm_call_media(
|
|
|
691
720
|
p.write_bytes(bytes(content))
|
|
692
721
|
except Exception as e:
|
|
693
722
|
return None, f"Failed to materialize artifact '{artifact_id}': {e}"
|
|
694
|
-
|
|
723
|
+
resolved: Dict[str, Any] = {"file_path": str(p), "$artifact": str(artifact_id), "artifact_id": str(artifact_id)}
|
|
724
|
+
if content_type:
|
|
725
|
+
resolved["content_type"] = content_type
|
|
726
|
+
base_type = content_type.split(";", 1)[0].strip().lower()
|
|
727
|
+
if base_type.startswith("audio/"):
|
|
728
|
+
resolved["type"] = "audio"
|
|
729
|
+
elif base_type.startswith("image/"):
|
|
730
|
+
resolved["type"] = "image"
|
|
731
|
+
elif base_type.startswith("video/"):
|
|
732
|
+
resolved["type"] = "video"
|
|
733
|
+
elif base_type.startswith("text/"):
|
|
734
|
+
resolved["type"] = "text"
|
|
735
|
+
out.append(resolved)
|
|
695
736
|
|
|
696
737
|
return (out or None), None
|
|
697
738
|
|
|
@@ -842,8 +842,24 @@ def _resolve_media_artifacts(
|
|
|
842
842
|
file_path = ""
|
|
843
843
|
|
|
844
844
|
if file_path:
|
|
845
|
-
#
|
|
846
|
-
|
|
845
|
+
# Preserve content type alongside the resolved path. Artifact stores
|
|
846
|
+
# often use extensionless content paths, so a raw path can lose the
|
|
847
|
+
# modality and make downstream transcription reject valid audio.
|
|
848
|
+
resolved: Dict[str, Any] = {"file_path": str(file_path)}
|
|
849
|
+
if content_type:
|
|
850
|
+
resolved["content_type"] = str(content_type)
|
|
851
|
+
base_type = str(content_type).split(";", 1)[0].strip().lower()
|
|
852
|
+
if base_type.startswith("audio/"):
|
|
853
|
+
resolved["type"] = "audio"
|
|
854
|
+
elif base_type.startswith("image/"):
|
|
855
|
+
resolved["type"] = "image"
|
|
856
|
+
elif base_type.startswith("video/"):
|
|
857
|
+
resolved["type"] = "video"
|
|
858
|
+
elif base_type.startswith("text/"):
|
|
859
|
+
resolved["type"] = "text"
|
|
860
|
+
resolved["artifact_id"] = str(aid)
|
|
861
|
+
resolved["$artifact"] = str(aid)
|
|
862
|
+
out.append(resolved)
|
|
847
863
|
continue
|
|
848
864
|
|
|
849
865
|
raise ValueError(f"Unable to resolve artifact '{aid}' to provider-ready media content.")
|
{abstractruntime-0.4.9 → abstractruntime-0.4.11}/src/abstractruntime/visualflow_compiler/compiler.py
RENAMED
|
@@ -169,7 +169,7 @@ def _create_effect_node_handler(
|
|
|
169
169
|
input_key=input_key,
|
|
170
170
|
output_key=output_key,
|
|
171
171
|
)
|
|
172
|
-
elif effect_type
|
|
172
|
+
elif effect_type in {"llm_call", "generate_image", "generate_voice", "transcribe_audio"}:
|
|
173
173
|
base_handler = create_llm_call_handler(
|
|
174
174
|
node_id=node_id,
|
|
175
175
|
next_node=next_node,
|
|
@@ -180,6 +180,13 @@ def _create_effect_node_handler(
|
|
|
180
180
|
temperature=effect_config.get("temperature", 0.7),
|
|
181
181
|
seed=effect_config.get("seed", -1),
|
|
182
182
|
)
|
|
183
|
+
elif effect_type == "listen_voice":
|
|
184
|
+
base_handler = create_wait_event_handler(
|
|
185
|
+
node_id=node_id,
|
|
186
|
+
next_node=next_node,
|
|
187
|
+
input_key=input_key,
|
|
188
|
+
output_key=output_key,
|
|
189
|
+
)
|
|
183
190
|
elif effect_type == "tool_calls":
|
|
184
191
|
base_handler = create_tool_calls_handler(
|
|
185
192
|
node_id=node_id,
|
|
@@ -2571,6 +2578,71 @@ def _sync_effect_results_to_node_outputs(run: Any, flow: Flow) -> None:
|
|
|
2571
2578
|
if (node_id, "ttft_ms") in referenced_source_pins:
|
|
2572
2579
|
current["ttft_ms"] = ttft_ms
|
|
2573
2580
|
mapped_value = response_text
|
|
2581
|
+
elif effect_type in {"generate_image", "generate_voice"}:
|
|
2582
|
+
if isinstance(raw, dict):
|
|
2583
|
+
modality = "image" if effect_type == "generate_image" else "voice"
|
|
2584
|
+
outputs = raw.get("outputs")
|
|
2585
|
+
current["outputs"] = outputs if isinstance(outputs, dict) else {}
|
|
2586
|
+
resources = raw.get("resources")
|
|
2587
|
+
if isinstance(resources, dict):
|
|
2588
|
+
current["resources"] = resources
|
|
2589
|
+
artifact_id, artifact_ref = _first_generated_artifact(raw)
|
|
2590
|
+
if artifact_ref:
|
|
2591
|
+
current["artifact_ref"] = artifact_ref
|
|
2592
|
+
current["image_artifact" if modality == "image" else "audio_artifact"] = artifact_ref
|
|
2593
|
+
ct = artifact_ref.get("content_type")
|
|
2594
|
+
if isinstance(ct, str) and ct.strip():
|
|
2595
|
+
current["content_type"] = ct.strip()
|
|
2596
|
+
if artifact_id:
|
|
2597
|
+
current["artifact_id"] = artifact_id
|
|
2598
|
+
current["success"] = bool(artifact_id or artifact_ref)
|
|
2599
|
+
meta = {
|
|
2600
|
+
"schema": f"abstractflow.{effect_type}.v1.meta",
|
|
2601
|
+
"version": 1,
|
|
2602
|
+
"modality": modality,
|
|
2603
|
+
"provider": raw.get("provider"),
|
|
2604
|
+
"model": raw.get("model"),
|
|
2605
|
+
}
|
|
2606
|
+
current["meta"] = {k: v for k, v in meta.items() if v is not None}
|
|
2607
|
+
current["raw"] = raw
|
|
2608
|
+
mapped_value = artifact_ref or artifact_id
|
|
2609
|
+
elif effect_type == "transcribe_audio":
|
|
2610
|
+
if isinstance(raw, dict):
|
|
2611
|
+
text_value = ""
|
|
2612
|
+
text_obj = raw.get("text")
|
|
2613
|
+
if isinstance(text_obj, dict):
|
|
2614
|
+
content = text_obj.get("content")
|
|
2615
|
+
if content is not None:
|
|
2616
|
+
text_value = str(content)
|
|
2617
|
+
if not text_value:
|
|
2618
|
+
content = raw.get("content")
|
|
2619
|
+
if content is not None:
|
|
2620
|
+
text_value = str(content)
|
|
2621
|
+
current["text"] = text_value
|
|
2622
|
+
artifact_id, artifact_ref = _first_generated_artifact(raw)
|
|
2623
|
+
if artifact_ref:
|
|
2624
|
+
current["artifact_ref"] = artifact_ref
|
|
2625
|
+
current["transcript_artifact"] = artifact_ref
|
|
2626
|
+
if artifact_id:
|
|
2627
|
+
current["artifact_id"] = artifact_id
|
|
2628
|
+
current["success"] = True
|
|
2629
|
+
current["meta"] = {"schema": "abstractflow.transcribe_audio.v1.meta", "version": 1, "modality": "text", "task": "transcription"}
|
|
2630
|
+
current["raw"] = raw
|
|
2631
|
+
mapped_value = text_value
|
|
2632
|
+
elif effect_type == "listen_voice":
|
|
2633
|
+
if isinstance(raw, dict):
|
|
2634
|
+
current.update(raw)
|
|
2635
|
+
audio_ref = raw.get("audio_artifact") or raw.get("artifact") or raw.get("artifact_ref")
|
|
2636
|
+
if isinstance(audio_ref, dict):
|
|
2637
|
+
current["audio_artifact"] = audio_ref
|
|
2638
|
+
current["artifact_ref"] = audio_ref
|
|
2639
|
+
aid = audio_ref.get("$artifact") or audio_ref.get("artifact_id")
|
|
2640
|
+
if isinstance(aid, str) and aid.strip():
|
|
2641
|
+
current["artifact_id"] = aid.strip()
|
|
2642
|
+
mapped_value = current.get("audio_artifact") or raw
|
|
2643
|
+
else:
|
|
2644
|
+
current["event_data"] = raw
|
|
2645
|
+
mapped_value = raw
|
|
2574
2646
|
elif effect_type == "tool_calls":
|
|
2575
2647
|
# Effect outcome is produced by AbstractRuntime TOOL_CALLS handler:
|
|
2576
2648
|
# - executed: {"mode":"executed","results":[{call_id,name,success,output,error}, ...]}
|