AbstractRuntime 0.4.17__tar.gz → 0.4.19__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.17 → abstractruntime-0.4.19}/CHANGELOG.md +31 -1
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/PKG-INFO +5 -4
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/README.md +4 -3
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/api.md +5 -2
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/architecture.md +2 -2
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/README.md +8 -7
- {abstractruntime-0.4.17/docs/backlog/planned → abstractruntime-0.4.19/docs/backlog/completed}/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +142 -12
- abstractruntime-0.4.19/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +165 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/faq.md +31 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/integrations/abstractcore.md +103 -3
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/tools-comms.md +9 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/llms-full.txt +4 -2
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/llms.txt +3 -1
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/pyproject.toml +1 -1
- abstractruntime-0.4.19/release-notes.md +8 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/__init__.py +25 -1
- abstractruntime-0.4.19/src/abstractruntime/integrations/abstractcore/comms_facade.py +127 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/host_facade.py +82 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/run_facade.py +221 -1
- abstractruntime-0.4.19/src/abstractruntime/integrations/abstractcore/telegram_facade.py +194 -0
- abstractruntime-0.4.19/tests/test_abstractcore_comms_facade.py +179 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_abstractcore_host_facade.py +102 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_abstractcore_run_facade.py +230 -0
- abstractruntime-0.4.19/tests/test_abstractcore_telegram_facade.py +235 -0
- abstractruntime-0.4.17/release-notes.md +0 -10
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/.gitignore +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/LICENSE +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/ROADMAP.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/SECURITY.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/proposed/2026-05-20_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/evidence.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/getting-started.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/limits.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/proposal.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/provenance.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/examples/README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/mkdocs.yml +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/pytest.ini +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/README.md +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/conftest.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.17 → abstractruntime-0.4.19}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.19] - 2026-05-21
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Runtime now ships the missed standalone email comms wrapper/export layer for host-local operator surfaces:
|
|
14
|
+
- `abstractruntime.integrations.abstractcore.comms_facade`
|
|
15
|
+
- package-level email helper exports from `abstractruntime.integrations.abstractcore`
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- Host-facade email helpers now delegate through Runtime's own comms facade instead of importing `abstractcore.tools.comms_tools` directly in the facade method body.
|
|
19
|
+
- Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now describe the standalone email comms facade/export layer alongside the existing host facade, Telegram wrappers, and durable run-owned comms sends.
|
|
20
|
+
|
|
21
|
+
## [0.4.18] - 2026-05-21
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Runtime now exposes the remaining Gateway-facing comms/Telegram package boundary through public Runtime wrappers:
|
|
25
|
+
- host-local email helpers on `get_abstractcore_host_facade(...)`
|
|
26
|
+
- host-local Telegram TDLib/bootstrap/global-client wrappers in `abstractruntime.integrations.abstractcore.telegram_facade`
|
|
27
|
+
- Outbound email and Telegram sends can now execute as durable Runtime-authored child runs through `get_abstractcore_run_facade(...)`:
|
|
28
|
+
- `send_email(...)`
|
|
29
|
+
- `send_telegram_message(...)`
|
|
30
|
+
- `resume_tool_calls(...)` for approval-gated or passthrough tool waits
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now distinguish clearly between:
|
|
34
|
+
- host-local operator comms helpers
|
|
35
|
+
- durable run-owned outbound comms execution and replay semantics
|
|
36
|
+
- Outbound comms replay now follows the Runtime-owned truth model: recorded send requests and outcomes are replayed as data, not re-executed as external sends.
|
|
37
|
+
|
|
10
38
|
## [0.4.17] - 2026-05-21
|
|
11
39
|
|
|
12
40
|
### Added
|
|
@@ -461,7 +489,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
461
489
|
|
|
462
490
|
Initial development version with basic proof-of-concept features.
|
|
463
491
|
|
|
464
|
-
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.
|
|
492
|
+
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...HEAD
|
|
493
|
+
[0.4.19]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...v0.4.19
|
|
494
|
+
[0.4.18]: https://github.com/lpalbou/abstractruntime/compare/v0.4.17...v0.4.18
|
|
465
495
|
[0.4.17]: https://github.com/lpalbou/abstractruntime/compare/v0.4.16...v0.4.17
|
|
466
496
|
[0.4.16]: https://github.com/lpalbou/abstractruntime/compare/v0.4.15...v0.4.16
|
|
467
497
|
[0.4.15]: https://github.com/lpalbou/abstractruntime/compare/v0.4.14...v0.4.15
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.19
|
|
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
|
|
@@ -81,7 +81,7 @@ Description-Content-Type: text/markdown
|
|
|
81
81
|
|
|
82
82
|
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.
|
|
83
83
|
|
|
84
|
-
**Version:** 0.4.
|
|
84
|
+
**Version:** 0.4.19 • **Python:** 3.10+
|
|
85
85
|
|
|
86
86
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
87
87
|
|
|
@@ -169,7 +169,7 @@ state = rt.resume(
|
|
|
169
169
|
assert state.status.value == "completed"
|
|
170
170
|
```
|
|
171
171
|
|
|
172
|
-
## What’s included (v0.4.
|
|
172
|
+
## What’s included (v0.4.19)
|
|
173
173
|
|
|
174
174
|
Kernel (dependency-light):
|
|
175
175
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -193,7 +193,8 @@ Drivers + distribution:
|
|
|
193
193
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
194
194
|
|
|
195
195
|
Optional integrations:
|
|
196
|
-
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings,
|
|
196
|
+
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
197
|
+
- For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
|
|
197
198
|
- AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
|
|
198
199
|
depends on the light AbstractMemory contract; hosts choose storage backends
|
|
199
200
|
such as LanceDB, SQLite, or in-memory stores.
|
|
@@ -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.19 • **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
|
|
|
@@ -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.19)
|
|
96
96
|
|
|
97
97
|
Kernel (dependency-light):
|
|
98
98
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -116,7 +116,8 @@ Drivers + distribution:
|
|
|
116
116
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
117
117
|
|
|
118
118
|
Optional integrations:
|
|
119
|
-
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings,
|
|
119
|
+
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
120
|
+
- For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
|
|
120
121
|
- AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
|
|
121
122
|
depends on the light AbstractMemory contract; hosts choose storage backends
|
|
122
123
|
such as LanceDB, SQLite, or in-memory stores.
|
|
@@ -184,12 +184,15 @@ Entry points:
|
|
|
184
184
|
- `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
|
|
185
185
|
- public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
|
|
186
186
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
187
|
+
- public email comms wrappers: `list_email_accounts(...)`, `list_emails(...)`, `read_email(...)`, `send_email(...)` (`src/abstractruntime/integrations/abstractcore/comms_facade.py`)
|
|
188
|
+
- public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
|
|
187
189
|
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
|
|
188
190
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
189
191
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
190
192
|
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`)
|
|
191
|
-
- host-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
|
|
192
|
-
-
|
|
193
|
+
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
|
|
194
|
+
- host-facade email helpers delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
|
|
195
|
+
- run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
|
|
193
196
|
|
|
194
197
|
`LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
|
|
195
198
|
- `prompt`, `messages`, `system_prompt`, and convenience `text`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-05-21
|
|
4
|
-
> Version: 0.4.
|
|
4
|
+
> Version: 0.4.19
|
|
5
5
|
> Scope: this describes **what is implemented in this repository**.
|
|
6
6
|
|
|
7
7
|
AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
|
|
@@ -36,7 +36,7 @@ The boundary is intentionally narrow:
|
|
|
36
36
|
- Generated binary outputs are written to `ArtifactStore` and returned as `artifact_id` / `artifact_ref`, keeping `RunState.vars` and ledger records bounded and JSON-safe.
|
|
37
37
|
- Remote chat media is sent to AbstractCore Server as provider-ready content arrays, but persisted provider-request metadata redacts data URLs so checkpoints and ledgers do not embed media bytes.
|
|
38
38
|
- Provider sessions and prompt-cache objects are not runtime state. Runtime may carry stable cache keys, while AbstractCore clients/servers manage warm caches.
|
|
39
|
-
- Hosts should use Runtime-owned AbstractCore facades for discovery snapshots, prompt-cache/model-residency control operations, and durable run-scoped media child runs instead of reaching through private runtime attachments or importing Core internals directly.
|
|
39
|
+
- Hosts should use Runtime-owned AbstractCore facades for discovery snapshots, prompt-cache/model-residency control operations, and durable run-scoped media/comms child runs instead of reaching through private runtime attachments or importing Core internals directly.
|
|
40
40
|
- Local execution can use richer AbstractCore capability plugins. Remote and hybrid execution map the common media cases to AbstractCore Server endpoints and OpenAI-compatible content arrays, while hybrid keeps tool execution local.
|
|
41
41
|
- Gateway and other hosts compose Runtime with the desired Core/capability/memory profile. Runtime's base package includes the AbstractMemory contract but not backend extras such as LanceDB; hosts choose storage, embeddings, and readiness policy. Hardware profile extras such as `apple`, `gpu`, `all-apple`, and `all-gpu` cascade through AbstractCore when a host selects them.
|
|
42
42
|
- Remote and hybrid clients use explicit Core server URLs and auth headers supplied by the host. Runtime does not read Gateway auth environment variables for provider/model/auth decisions or treat Gateway bearer tokens as Core server/provider credentials.
|
|
@@ -12,16 +12,16 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
12
12
|
|
|
13
13
|
## Next recommended work
|
|
14
14
|
|
|
15
|
-
1. `planned/
|
|
16
|
-
This is the narrow Runtime work that unblocks the last high-pressure direct
|
|
17
|
-
`abstractcore` imports in Gateway for comms/email and Telegram without
|
|
18
|
-
reopening the already-completed media/discovery boundary work.
|
|
19
|
-
2. `planned/018_workspace_access_policy_for_media_and_tools.md`
|
|
15
|
+
1. `planned/018_workspace_access_policy_for_media_and_tools.md`
|
|
20
16
|
Keep workspace and tool policy explicit while Gateway extracts its local
|
|
21
17
|
workspace helpers.
|
|
22
|
-
|
|
18
|
+
2. `planned/014_remote_tool_worker_executor.md`
|
|
23
19
|
The public ToolExecutor path is still the larger follow-on after the current
|
|
24
20
|
Gateway boundary cleanup.
|
|
21
|
+
3. `proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md`
|
|
22
|
+
The comms/Telegram boundary cleanup is now complete; the remaining lower
|
|
23
|
+
pressure follow-up is a Runtime-owned tool-spec surface if Gateway or the
|
|
24
|
+
MCP worker still need one after adoption.
|
|
25
25
|
|
|
26
26
|
## Completed
|
|
27
27
|
|
|
@@ -50,6 +50,8 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
50
50
|
| 027 | `completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
|
|
51
51
|
| 028 | `completed/028_runtime_bloc_kv_lifecycle_and_pruning.md` |
|
|
52
52
|
| 029 | `completed/029_runtime_music_generation_and_discovery_via_abstractcore.md` |
|
|
53
|
+
| 0030 | `completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md` |
|
|
54
|
+
| 0032 | `completed/0032_runtime_durable_outbound_comms_truth.md` |
|
|
53
55
|
|
|
54
56
|
## Planned
|
|
55
57
|
|
|
@@ -60,7 +62,6 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
60
62
|
| 017 | `planned/017_limit_warnings_and_observability.md` |
|
|
61
63
|
| 018 | `planned/018_workspace_access_policy_for_media_and_tools.md` |
|
|
62
64
|
| 025 | `planned/025_runtime_retention_and_purge_contract.md` |
|
|
63
|
-
| 0030 | `planned/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md` |
|
|
64
65
|
|
|
65
66
|
## Proposed
|
|
66
67
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 0030 Runtime Host Facades For Comms And Telegram, With Tool-Spec Follow-Up Split Out
|
|
2
2
|
|
|
3
3
|
## Metadata
|
|
4
4
|
- Created: 2026-05-21
|
|
5
|
-
- Status:
|
|
6
|
-
- Completed:
|
|
5
|
+
- Status: Completed
|
|
6
|
+
- Completed: 2026-05-21
|
|
7
7
|
|
|
8
8
|
## ADR status
|
|
9
9
|
- Governing ADRs: None
|
|
@@ -140,21 +140,28 @@ tool-spec normalization as a separate follow-up.
|
|
|
140
140
|
|
|
141
141
|
## Expected outcomes
|
|
142
142
|
|
|
143
|
-
- Gateway
|
|
144
|
-
|
|
145
|
-
- Runtime
|
|
146
|
-
|
|
143
|
+
- Runtime exposes the public surfaces Gateway needs in order to stop importing
|
|
144
|
+
`abstractcore.tools.comms_tools` directly.
|
|
145
|
+
- Runtime exposes the public surfaces Gateway needs in order to stop importing
|
|
146
|
+
`abstractcore.tools.telegram_tdlib` and `telegram_tools` directly.
|
|
147
|
+
- Runtime remains the only lower-level dependency that Gateway needs for these
|
|
148
|
+
operator/tooling paths once Gateway adopts the new wrappers.
|
|
149
|
+
- Runtime phase 1 proves whether a later Runtime-owned tool-spec surface is
|
|
150
|
+
still needed; that work stays split into `0031`.
|
|
147
151
|
|
|
148
152
|
## Validation
|
|
149
153
|
|
|
150
|
-
- focused Runtime tests for new host-facade email methods
|
|
154
|
+
- focused Runtime tests for the new host-facade email methods
|
|
151
155
|
- focused Runtime tests for Telegram wrapper happy/unavailable paths
|
|
152
|
-
-
|
|
156
|
+
- focused Runtime wiring proof that the host email helpers still work when the
|
|
157
|
+
runtime is local/remote/hybrid because they are host-local wrappers, not
|
|
158
|
+
remote Core server routes
|
|
159
|
+
- aggregate Runtime regression covering the adjacent host-facade behavior
|
|
153
160
|
|
|
154
161
|
## Progress checklist
|
|
155
|
-
- [
|
|
156
|
-
- [
|
|
157
|
-
- [
|
|
162
|
+
- [x] Extend `AbstractCoreHostFacade` with email/comms helpers.
|
|
163
|
+
- [x] Add Runtime-owned Telegram wrapper helpers for bootstrap, send, and global-client lifecycle.
|
|
164
|
+
- [x] Validate the Runtime surfaces and re-run focused Runtime boundary tests.
|
|
158
165
|
|
|
159
166
|
## Guidance for the implementing agent
|
|
160
167
|
|
|
@@ -163,3 +170,126 @@ can unblock Gateway without new Core changes, do that. Keep Core item `0796`
|
|
|
163
170
|
proposed unless Runtime adoption proves the existing public tool modules are
|
|
164
171
|
too unstable or too duplicative. Keep Runtime-owned tool-spec adapters as a
|
|
165
172
|
separate follow-up rather than blocking this narrower comms/Telegram item.
|
|
173
|
+
|
|
174
|
+
## Completion report
|
|
175
|
+
|
|
176
|
+
### Date
|
|
177
|
+
|
|
178
|
+
2026-05-21
|
|
179
|
+
|
|
180
|
+
### Summary
|
|
181
|
+
|
|
182
|
+
Runtime now exposes the phase-1 public comms and Telegram wrappers that Gateway
|
|
183
|
+
needed for its remaining direct AbstractCore imports:
|
|
184
|
+
|
|
185
|
+
- host-facade email helpers on `AbstractCoreHostFacade`
|
|
186
|
+
- a separate Runtime-owned `telegram_facade` module for TDLib bootstrap,
|
|
187
|
+
process-global client lifecycle, and send parity
|
|
188
|
+
|
|
189
|
+
The implementation stayed intentionally narrow. It did not add remote server
|
|
190
|
+
routes, and it did not mix the lower-pressure tool-spec cleanup back into this
|
|
191
|
+
item.
|
|
192
|
+
|
|
193
|
+
### What shipped
|
|
194
|
+
|
|
195
|
+
- Extended `AbstractCoreHostFacade` with:
|
|
196
|
+
- `list_email_accounts(...)`
|
|
197
|
+
- `list_emails(...)`
|
|
198
|
+
- `read_email(...)`
|
|
199
|
+
- `send_email(...)`
|
|
200
|
+
- Added `abstractruntime.integrations.abstractcore.telegram_facade` with:
|
|
201
|
+
- `TelegramTdlibNotAvailable`
|
|
202
|
+
- `bootstrap_telegram_auth_from_env(...)`
|
|
203
|
+
- `get_global_telegram_client(...)`
|
|
204
|
+
- `stop_global_telegram_client()`
|
|
205
|
+
- `send_telegram_message(...)`
|
|
206
|
+
- Exported the new Telegram wrappers from
|
|
207
|
+
`abstractruntime.integrations.abstractcore`.
|
|
208
|
+
- Updated docs and LLM indexes so the public boundary now points hosts at
|
|
209
|
+
Runtime instead of direct `abstractcore.tools.*` imports.
|
|
210
|
+
|
|
211
|
+
### Current code pointers
|
|
212
|
+
|
|
213
|
+
- `src/abstractruntime/integrations/abstractcore/host_facade.py`
|
|
214
|
+
- `src/abstractruntime/integrations/abstractcore/telegram_facade.py`
|
|
215
|
+
- `src/abstractruntime/integrations/abstractcore/__init__.py`
|
|
216
|
+
- `tests/test_abstractcore_host_facade.py`
|
|
217
|
+
- `tests/test_abstractcore_telegram_facade.py`
|
|
218
|
+
- `docs/integrations/abstractcore.md`
|
|
219
|
+
- `docs/tools-comms.md`
|
|
220
|
+
- `docs/api.md`
|
|
221
|
+
- `docs/faq.md`
|
|
222
|
+
|
|
223
|
+
### Behavior changes
|
|
224
|
+
|
|
225
|
+
- Hosts can now use Runtime for operator-scoped email account discovery, email
|
|
226
|
+
listing/reading, and email sending instead of importing
|
|
227
|
+
`abstractcore.tools.comms_tools` directly.
|
|
228
|
+
- Hosts can now use Runtime for Telegram TDLib bootstrap, process-global TDLib
|
|
229
|
+
client lifecycle, and notifier-style `send_telegram_message(...)` instead of
|
|
230
|
+
importing `abstractcore.tools.telegram_tdlib` or `telegram_tools` directly.
|
|
231
|
+
- The email and Telegram phase-1 wrappers are explicitly **host-local**:
|
|
232
|
+
- they do not proxy through a remote AbstractCore server
|
|
233
|
+
- they do not create Runtime run history on their own
|
|
234
|
+
- the Telegram global client remains process-scoped rather than
|
|
235
|
+
runtime-instance scoped
|
|
236
|
+
|
|
237
|
+
### Review notes
|
|
238
|
+
|
|
239
|
+
- No new ADR was added. This is an extension of the already-established public
|
|
240
|
+
Runtime facade pattern rather than a new durable architecture rule.
|
|
241
|
+
- The two focused subagent reviews converged on the shipped shape:
|
|
242
|
+
- email belongs on the existing host facade
|
|
243
|
+
- Telegram lifecycle belongs in a separate module because it is process-global
|
|
244
|
+
host state, not normal runtime-instance state
|
|
245
|
+
- Tool-spec adapters remain explicitly deferred to `0031` rather than being
|
|
246
|
+
silently dropped.
|
|
247
|
+
|
|
248
|
+
### Tests
|
|
249
|
+
|
|
250
|
+
- `pytest -q tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py`
|
|
251
|
+
- Result: `24 passed`
|
|
252
|
+
- `pytest -q tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py tests/test_prompt_cache_modules.py tests/test_model_residency_control_plane.py tests/test_packaging_extras.py`
|
|
253
|
+
- Result: `53 passed in 0.29s`
|
|
254
|
+
- `python -m compileall src/abstractruntime/integrations/abstractcore`
|
|
255
|
+
- Result: clean
|
|
256
|
+
- `mkdocs build -q --site-dir /tmp/abstractruntime-0030-docs`
|
|
257
|
+
- Result: docs build passed; upstream Material for MkDocs emitted a
|
|
258
|
+
non-blocking roadmap warning
|
|
259
|
+
- `git diff --check`
|
|
260
|
+
- Result: clean
|
|
261
|
+
|
|
262
|
+
### Docs
|
|
263
|
+
|
|
264
|
+
- `README.md`
|
|
265
|
+
- `docs/integrations/abstractcore.md`
|
|
266
|
+
- `docs/tools-comms.md`
|
|
267
|
+
- `docs/api.md`
|
|
268
|
+
- `docs/faq.md`
|
|
269
|
+
- `llms.txt`
|
|
270
|
+
- `llms-full.txt`
|
|
271
|
+
|
|
272
|
+
### Residual risks
|
|
273
|
+
|
|
274
|
+
- These wrappers intentionally do not normalize remote/hybrid comms/Telegram
|
|
275
|
+
behavior through a remote Core server. If a later product requirement wants a
|
|
276
|
+
remote backend seam for those paths, that should be a separate decision.
|
|
277
|
+
- Gateway adoption is still tracked separately in
|
|
278
|
+
`../../../../abstractgateway/docs/backlog/planned/0050_gateway_runtime_boundary_cleanup_for_workspace_comms_and_telegram.md`.
|
|
279
|
+
- Gateway's backlog item `0050` still links to the old planned path for this
|
|
280
|
+
Runtime item. That stale sibling-package link was detected during closure
|
|
281
|
+
hygiene but was not edited here because Runtime write scope stayed confined to
|
|
282
|
+
this repository.
|
|
283
|
+
|
|
284
|
+
### Follow-ups
|
|
285
|
+
|
|
286
|
+
- Durable outbound comms sends were corrected separately in
|
|
287
|
+
`completed/0032_runtime_durable_outbound_comms_truth.md` so `0030` can stay
|
|
288
|
+
an honest record of the narrower package-boundary cleanup it originally
|
|
289
|
+
shipped.
|
|
290
|
+
- Keep Runtime-owned tool-spec adapters in
|
|
291
|
+
`../proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md`.
|
|
292
|
+
- Keep the optional Core seam idea in
|
|
293
|
+
`../../../../abstractcore/docs/backlog/proposed/0796_runtime_facing_comms_and_telegram_backend_surface.md`
|
|
294
|
+
proposed unless Runtime or Gateway adoption proves the current public Core
|
|
295
|
+
wrappers are insufficient.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# 0032 Runtime Durable Outbound Comms Truth
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
- Created: 2026-05-21
|
|
5
|
+
- Status: Completed
|
|
6
|
+
- Completed: 2026-05-21
|
|
7
|
+
- Origin: follow-up correction to `completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md`
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Close the remaining durability gap left after `0030`: outbound comms sends that
|
|
12
|
+
belong to a run must execute through Runtime so the request and outcome become
|
|
13
|
+
ledgered child-run truth instead of host-local side effects with no Runtime
|
|
14
|
+
record.
|
|
15
|
+
|
|
16
|
+
## What Shipped
|
|
17
|
+
|
|
18
|
+
- Extended `AbstractCoreRunFacade` with a generic durable child-run helper:
|
|
19
|
+
- `execute_tool_calls(...)`
|
|
20
|
+
- Extended `AbstractCoreRunFacade` with a public durable resume helper:
|
|
21
|
+
- `resume_tool_calls(...)`
|
|
22
|
+
- Extended `AbstractCoreRunFacade` with durable outbound comms helpers:
|
|
23
|
+
- `send_email(...)`
|
|
24
|
+
- `send_telegram_message(...)`
|
|
25
|
+
- Kept the existing host-local read/bootstrap wrappers intact:
|
|
26
|
+
- host-facade email list/read helpers stay operator-scoped
|
|
27
|
+
- Telegram TDLib bootstrap/global-client helpers stay host-scoped
|
|
28
|
+
- Preserved the replay rule:
|
|
29
|
+
- Runtime records the send request and the send outcome
|
|
30
|
+
- replay should show the recorded result
|
|
31
|
+
- replay should not resend the external email or Telegram message
|
|
32
|
+
|
|
33
|
+
## Current Code Pointers
|
|
34
|
+
|
|
35
|
+
- `src/abstractruntime/integrations/abstractcore/run_facade.py`
|
|
36
|
+
- `tests/test_abstractcore_run_facade.py`
|
|
37
|
+
- `docs/integrations/abstractcore.md`
|
|
38
|
+
- `docs/api.md`
|
|
39
|
+
- `docs/faq.md`
|
|
40
|
+
- `docs/tools-comms.md`
|
|
41
|
+
|
|
42
|
+
## ADR Status
|
|
43
|
+
|
|
44
|
+
- Governing ADRs: none added
|
|
45
|
+
- ADR impact: none; this extends the already-accepted Runtime-owned durable
|
|
46
|
+
child-run pattern from the run facade rather than introducing a new durable
|
|
47
|
+
policy
|
|
48
|
+
|
|
49
|
+
## Validation
|
|
50
|
+
|
|
51
|
+
Focused validation:
|
|
52
|
+
|
|
53
|
+
- `pytest -q tests/test_abstractcore_run_facade.py tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py`
|
|
54
|
+
- Result: `32 passed in 0.19s`
|
|
55
|
+
|
|
56
|
+
Aggregate validation:
|
|
57
|
+
|
|
58
|
+
- `pytest -q tests/test_abstractcore_run_facade.py tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py tests/test_prompt_cache_modules.py tests/test_model_residency_control_plane.py tests/test_packaging_extras.py`
|
|
59
|
+
- Result: `61 passed in 0.21s`
|
|
60
|
+
|
|
61
|
+
Syntax/doc sanity:
|
|
62
|
+
|
|
63
|
+
- `python -m compileall src/abstractruntime/integrations/abstractcore`
|
|
64
|
+
- `mkdocs build -q --site-dir /tmp/abstractruntime-0032-docs`
|
|
65
|
+
|
|
66
|
+
## Completion Report
|
|
67
|
+
|
|
68
|
+
### Date
|
|
69
|
+
|
|
70
|
+
2026-05-21
|
|
71
|
+
|
|
72
|
+
### Summary
|
|
73
|
+
|
|
74
|
+
`0030` solved the package-boundary problem for comms and Telegram, but it left
|
|
75
|
+
direct host-wrapper sends nondurable. This item fixes that by making outbound
|
|
76
|
+
email and Telegram sends first-class Runtime child runs through the existing
|
|
77
|
+
`TOOL_CALLS` path and by giving hosts a public `resume_tool_calls(...)` helper
|
|
78
|
+
for approval-gated or passthrough child runs.
|
|
79
|
+
|
|
80
|
+
The result is narrower than “all comms go through one facade” and cleaner:
|
|
81
|
+
|
|
82
|
+
- read/bootstrap helpers remain host-local where that still makes sense
|
|
83
|
+
- outbound sends that belong to a run are now Runtime-authored truth
|
|
84
|
+
|
|
85
|
+
### Behavior Changes
|
|
86
|
+
|
|
87
|
+
- Hosts can now use `get_abstractcore_run_facade(runtime).send_email(...)` for
|
|
88
|
+
a ledgered child run instead of performing an unrecorded host-local send.
|
|
89
|
+
- Hosts can now use
|
|
90
|
+
`get_abstractcore_run_facade(runtime).send_telegram_message(...)` for the
|
|
91
|
+
same durable behavior.
|
|
92
|
+
- Hosts can now use
|
|
93
|
+
`get_abstractcore_run_facade(runtime).resume_tool_calls(...)` to continue a
|
|
94
|
+
waiting comms/tool child run through the same public Runtime boundary.
|
|
95
|
+
- These durable send helpers use the configured Runtime tool executor:
|
|
96
|
+
- local/hybrid runtimes usually execute immediately
|
|
97
|
+
- approval-gated or passthrough executors still produce a durable wait that
|
|
98
|
+
Runtime can resume later
|
|
99
|
+
- Direct host-facade `send_email(...)` and direct
|
|
100
|
+
`telegram_facade.send_telegram_message(...)` still exist, but they are now
|
|
101
|
+
explicitly operator/local-helper paths rather than the preferred run-owned
|
|
102
|
+
send path
|
|
103
|
+
|
|
104
|
+
### Review Notes
|
|
105
|
+
|
|
106
|
+
- No new Core seam was needed. Runtime already had the correct durable external
|
|
107
|
+
side-effect mechanism in `EffectType.TOOL_CALLS`.
|
|
108
|
+
- The important design correction was to put outbound sends on the existing run
|
|
109
|
+
facade rather than inventing another host wrapper or another execution model.
|
|
110
|
+
- The last practical gap was resumability for waiting tool child runs. That is
|
|
111
|
+
now part of the same public run-facade contract instead of a test-only
|
|
112
|
+
internal workflow reconstruction trick.
|
|
113
|
+
- This keeps replay semantics honest: recorded outcomes are replayed as data,
|
|
114
|
+
not re-executed as real external sends.
|
|
115
|
+
|
|
116
|
+
### Tests
|
|
117
|
+
|
|
118
|
+
- `pytest -q tests/test_abstractcore_run_facade.py tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py`
|
|
119
|
+
- Result: `32 passed in 0.19s`
|
|
120
|
+
- `pytest -q tests/test_abstractcore_run_facade.py tests/test_abstractcore_host_facade.py tests/test_abstractcore_telegram_facade.py tests/test_prompt_cache_modules.py tests/test_model_residency_control_plane.py tests/test_packaging_extras.py`
|
|
121
|
+
- Result: `61 passed in 0.21s`
|
|
122
|
+
- `python -m compileall src/abstractruntime/integrations/abstractcore`
|
|
123
|
+
- Result: clean
|
|
124
|
+
- `mkdocs build -q --site-dir /tmp/abstractruntime-0032-docs`
|
|
125
|
+
- Result: docs build passed; upstream Material for MkDocs emitted a
|
|
126
|
+
non-blocking roadmap warning
|
|
127
|
+
|
|
128
|
+
### Docs
|
|
129
|
+
|
|
130
|
+
- `README.md`
|
|
131
|
+
- `docs/integrations/abstractcore.md`
|
|
132
|
+
- `docs/api.md`
|
|
133
|
+
- `docs/faq.md`
|
|
134
|
+
- `docs/tools-comms.md`
|
|
135
|
+
- `llms.txt`
|
|
136
|
+
- `llms-full.txt`
|
|
137
|
+
|
|
138
|
+
### Residual Risks
|
|
139
|
+
|
|
140
|
+
- Remote runtimes still default to passthrough tools, so durable comms sends may
|
|
141
|
+
enter a wait instead of executing immediately unless the host configures an
|
|
142
|
+
executing or approval-resumable tool executor.
|
|
143
|
+
- Operator-only direct sends remain possible through the host-local wrappers.
|
|
144
|
+
That is intentional for maintenance/bootstrap flows, but hosts should use the
|
|
145
|
+
durable run facade when the send belongs to workflow truth.
|
|
146
|
+
|
|
147
|
+
### Practical Proof
|
|
148
|
+
|
|
149
|
+
- Immediate durable Telegram send smoke:
|
|
150
|
+
- child run status: `completed`
|
|
151
|
+
- ledger effect records: `3`
|
|
152
|
+
- output: `{"success": true, "transport": "bot_api", "message_ids": [42]}`
|
|
153
|
+
- Approval-gated durable email smoke:
|
|
154
|
+
- initial child run status: `waiting`
|
|
155
|
+
- wait reason: `user`
|
|
156
|
+
- wait key prefix: `tool_approval`
|
|
157
|
+
- resumed child run status: `completed`
|
|
158
|
+
- output: `{"success": true, "message_id": "<smoke-1>", "account": "ops"}`
|
|
159
|
+
|
|
160
|
+
### Follow-Ups
|
|
161
|
+
|
|
162
|
+
- Keep `0030` as the package-boundary cleanup record and this item as the
|
|
163
|
+
durability correction record; do not collapse them into one historical file.
|
|
164
|
+
- Keep `0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md` separate; this
|
|
165
|
+
change does not alter the tool-spec follow-up.
|
|
@@ -161,6 +161,37 @@ These are snapshot/query reads, not durable `LLM_CALL` effects, so replay should
|
|
|
161
161
|
re-querying the current machine or server and pretending the answer is unchanged.
|
|
162
162
|
Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/discovery_facade.py`, `src/abstractruntime/integrations/abstractcore/discovery_queries.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
|
|
163
163
|
|
|
164
|
+
## Should Gateway or another host import AbstractCore comms or Telegram helpers directly?
|
|
165
|
+
|
|
166
|
+
No. For the remaining host/operator paths, use Runtime's public wrappers instead:
|
|
167
|
+
|
|
168
|
+
- `get_abstractcore_host_facade(runtime).list_email_accounts(...)`
|
|
169
|
+
- `...list_emails(...)`
|
|
170
|
+
- `...read_email(...)`
|
|
171
|
+
- `...send_email(...)`
|
|
172
|
+
- `abstractruntime.integrations.abstractcore.list_email_accounts(...)`
|
|
173
|
+
- `...list_emails(...)`
|
|
174
|
+
- `...read_email(...)`
|
|
175
|
+
- `...send_email(...)`
|
|
176
|
+
- `abstractruntime.integrations.abstractcore.telegram_facade.bootstrap_telegram_auth_from_env(...)`
|
|
177
|
+
- `...get_global_telegram_client(...)`
|
|
178
|
+
- `...stop_global_telegram_client()`
|
|
179
|
+
- `...send_telegram_message(...)`
|
|
180
|
+
|
|
181
|
+
Important nuance: the read/bootstrap wrappers are still **host-local**. They do not proxy through a remote Core
|
|
182
|
+
server, and they do not write durable Runtime history on their own. They exist so hosts can depend
|
|
183
|
+
on Runtime as the package boundary instead of importing `abstractcore.tools.comms_tools`,
|
|
184
|
+
`abstractcore.tools.telegram_tdlib`, or `abstractcore.tools.telegram_tools` directly.
|
|
185
|
+
|
|
186
|
+
For outbound sends that belong to a run, use the durable run facade instead:
|
|
187
|
+
|
|
188
|
+
- `get_abstractcore_run_facade(runtime).send_email(...)`
|
|
189
|
+
- `get_abstractcore_run_facade(runtime).send_telegram_message(...)`
|
|
190
|
+
- `get_abstractcore_run_facade(runtime).resume_tool_calls(...)` when an approval-gated or passthrough tool child run needs to continue
|
|
191
|
+
|
|
192
|
+
Those create child runs, record the send request and outcome in the ledger, and replay should show
|
|
193
|
+
the recorded result rather than resending the external message.
|
|
194
|
+
|
|
164
195
|
## Should a host execute image / TTS / music / STT directly for an existing run?
|
|
165
196
|
|
|
166
197
|
No. If the work is run-scoped and should become part of durable run history, the host should ask Runtime to execute it. Use `abstractruntime.integrations.abstractcore.get_abstractcore_run_facade(runtime)` and create a child run with `generate_image(...)`, `generate_voice(...)`, `generate_music(...)`, `transcribe_audio(...)`, or the lower-level `execute_llm_call(...)`.
|