AbstractRuntime 0.8.0__tar.gz → 0.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/CHANGELOG.md +36 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/PKG-INFO +7 -7
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/README.md +3 -3
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/api.md +3 -2
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/architecture.md +1 -1
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/email.md +20 -1
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/getting-started.md +1 -1
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/troubleshooting.md +1 -1
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/llms-full.txt +29 -9
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/llms.txt +2 -2
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/pyproject.toml +4 -4
- abstractruntime-0.8.1/release-notes.md +33 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/binding.py +55 -5
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/feeder.py +34 -1
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +12 -4
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +104 -2
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +54 -9
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +4 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/email_received.py +36 -2
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/live_email/test_email_live_runtime.py +54 -0
- abstractruntime-0.8.1/tests/test_email_self_trigger_loop.py +240 -0
- abstractruntime-0.8.1/tests/test_media_only_requests_skip_text_client.py +114 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_packaging_extras.py +3 -3
- abstractruntime-0.8.1/tests/test_send_email_self_default_policy.py +109 -0
- abstractruntime-0.8.0/release-notes.md +0 -105
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/.gitignore +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/LICENSE +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/ROADMAP.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/SECURITY.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/adr/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/artifacts.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/automations.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/evidence.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/faq.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/limits.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/manual_testing.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/proposal.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/provenance.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/snapshots.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/tool-approval.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/tools-comms.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/examples/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/mkdocs.yml +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/pytest.ini +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/README.md +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/automation_harness.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/conftest.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_command_store.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_offloading.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_history.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.8.0 → abstractruntime-0.8.1}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.1] - 2026-09-30
|
|
11
|
+
|
|
12
|
+
Email automations never trigger themselves, speech and images work without a buildable text model,
|
|
13
|
+
and a chat's mail to its owner runs without asking. Requires AbstractCore 2.20.2.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- Mail sent by an automation run (controller, occurrence, any run it starts, the send-email action)
|
|
17
|
+
is automatic mail: the run's `EmailContext` gets `automation_marker =
|
|
18
|
+
"automation:<automation id>/run:<run id>"`, so every send carries `Auto-Submitted` and
|
|
19
|
+
`X-AbstractFramework-Automation`. `automation_marker_for(vars, run_id)` is exported from
|
|
20
|
+
`abstractruntime.email.binding`. Chats and discussions send ordinary mail.
|
|
21
|
+
- `email.received@1` config `auto_submitted`: `"skip"` (default) never admits a message whose
|
|
22
|
+
`Auto-Submitted` header is present and not `no`; `"admit"` lets it reach the filters. Stored
|
|
23
|
+
configs without the key behave like `"skip"`.
|
|
24
|
+
- `EmailInboxFeeder(..., is_own_sent=callable)` and `PollReport.own_automatic`: the account's own
|
|
25
|
+
automatic mail (the framework marker from its own address, or a Message-ID the host recorded as
|
|
26
|
+
sent) never enters the event inbox.
|
|
27
|
+
- `abstractruntime.integrations.abstractcore.run_facade.inline_run_active(run_id)`: true while the
|
|
28
|
+
run facade executes a child run in this process; host runners skip such runs.
|
|
29
|
+
- `ToolApprovalPolicy.default_require_approval_tools`: the names on the require list only because
|
|
30
|
+
no list was given (the default caution list).
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- The pooled local client runs media-only requests (image, video, voice, music, transcription, no
|
|
34
|
+
tools) and streaming TTS on AbstractCore's capability host instead of building the default text
|
|
35
|
+
client: text-to-speech no longer fails when the text default cannot be built (for example an
|
|
36
|
+
MLX route on an install without MLX), and no text model is loaded for a media request.
|
|
37
|
+
- Without a per-run tool policy, the `send_email_recipient@v2` refiner now also lowers a name that
|
|
38
|
+
is on the executor's default caution list (`send_email` under `ToolApprovalPolicy()`): a chat
|
|
39
|
+
run's send to its owner's own address runs without an approval wait. An explicitly passed
|
|
40
|
+
require list and a per-run policy's still win; email-triggered runs under `approval: "ask"` are
|
|
41
|
+
unchanged.
|
|
42
|
+
|
|
43
|
+
### Dependencies
|
|
44
|
+
- `abstractcore>=2.20.2` (also `[apple]` and `[gpu]`).
|
|
45
|
+
|
|
10
46
|
## [0.8.0] - 2026-09-30
|
|
11
47
|
|
|
12
48
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.1
|
|
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
|
|
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
|
-
Requires-Dist: abstractcore>=2.20.
|
|
23
|
+
Requires-Dist: abstractcore>=2.20.2
|
|
24
24
|
Requires-Dist: abstractmemory>=0.3.0
|
|
25
25
|
Requires-Dist: abstractsemantics>=0.0.5
|
|
26
26
|
Requires-Dist: anyio<5.0.0,>=4.12.1
|
|
@@ -35,14 +35,14 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
|
|
|
35
35
|
Requires-Dist: restrictedpython>=7.0
|
|
36
36
|
Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
|
|
37
37
|
Provides-Extra: apple
|
|
38
|
-
Requires-Dist: abstractcore[apple]>=2.20.
|
|
38
|
+
Requires-Dist: abstractcore[apple]>=2.20.2; extra == 'apple'
|
|
39
39
|
Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
|
|
40
40
|
Provides-Extra: docs
|
|
41
41
|
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
42
42
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
43
43
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
44
44
|
Provides-Extra: gpu
|
|
45
|
-
Requires-Dist: abstractcore[gpu]>=2.20.
|
|
45
|
+
Requires-Dist: abstractcore[gpu]>=2.20.2; extra == 'gpu'
|
|
46
46
|
Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
|
|
47
47
|
Provides-Extra: test
|
|
48
48
|
Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
|
|
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
|
|
56
56
|
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.
|
|
57
57
|
|
|
58
|
-
**Version:** 0.8.
|
|
58
|
+
**Version:** 0.8.1 • **Python:** 3.10+
|
|
59
59
|
|
|
60
60
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
61
61
|
|
|
@@ -83,7 +83,7 @@ Remote-light runtime:
|
|
|
83
83
|
pip install abstractruntime
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
The base install includes AbstractCore 2.20.
|
|
86
|
+
The base install includes AbstractCore 2.20.2 or newer (its light install:
|
|
87
87
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
88
88
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
89
89
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -147,7 +147,7 @@ state = rt.resume(
|
|
|
147
147
|
assert state.status.value == "completed"
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
## What’s included (v0.8.
|
|
150
|
+
## What’s included (v0.8.1)
|
|
151
151
|
|
|
152
152
|
Kernel (import-light):
|
|
153
153
|
- 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.8.
|
|
7
|
+
**Version:** 0.8.1 • **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
|
|
|
@@ -32,7 +32,7 @@ Remote-light runtime:
|
|
|
32
32
|
pip install abstractruntime
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
The base install includes AbstractCore 2.20.
|
|
35
|
+
The base install includes AbstractCore 2.20.2 or newer (its light install:
|
|
36
36
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
37
37
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
38
38
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -96,7 +96,7 @@ state = rt.resume(
|
|
|
96
96
|
assert state.status.value == "completed"
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
## What’s included (v0.8.
|
|
99
|
+
## What’s included (v0.8.1)
|
|
100
100
|
|
|
101
101
|
Kernel (import-light):
|
|
102
102
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -302,7 +302,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
302
302
|
|
|
303
303
|
### AbstractCore (LLM + tools)
|
|
304
304
|
|
|
305
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.20.
|
|
305
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.20.2 or newer is part of the base install).
|
|
306
306
|
|
|
307
307
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
308
308
|
|
|
@@ -312,7 +312,7 @@ Entry points:
|
|
|
312
312
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
313
313
|
- email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
|
|
314
314
|
- 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`)
|
|
315
|
-
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
|
|
315
|
+
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
|
|
316
316
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
317
317
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
318
318
|
- 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`, `list_vision_adapters`)
|
|
@@ -348,6 +348,7 @@ Multimodal support:
|
|
|
348
348
|
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
349
349
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
350
350
|
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
351
|
+
- with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
|
|
351
352
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
352
353
|
- local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
|
|
353
354
|
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-09-29
|
|
4
|
-
> Version: 0.8.
|
|
4
|
+
> Version: 0.8.1
|
|
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.
|
|
@@ -108,7 +108,9 @@ stored ids in `output_offloaded_artifact_ids`.
|
|
|
108
108
|
|
|
109
109
|
Any other recipient, a `reply_email` call (its recipients come from the original message), or a call the refiner
|
|
110
110
|
cannot read waits for a person on a `tool_approval` wait. The rule applies whether or not the run carries a per-run
|
|
111
|
-
tool policy (`_runtime.tool_policy`)
|
|
111
|
+
tool policy (`_runtime.tool_policy`), including under the executor's default policy (`ToolApprovalPolicy()`, whose
|
|
112
|
+
default caution list names `send_email`); a `require_approval_tools` list the host passes explicitly, or a per-run
|
|
113
|
+
policy's, still wins. Email-triggered runs under `approval: "ask"` never use the refiner. In a batch,
|
|
112
114
|
one `send_email` that needs a person makes every `send_email` of that batch wait.
|
|
113
115
|
|
|
114
116
|
Approval is separate from the account's recipient policy (allowlist or denylist): AbstractCore's `guarded_send`
|
|
@@ -118,6 +120,15 @@ control that decides who can receive mail at all. A client that approves every t
|
|
|
118
120
|
the approval wait for that user's own runs, never the recipient policy. See
|
|
119
121
|
[tool-approval.md](tool-approval.md#per-call-refiners).
|
|
120
122
|
|
|
123
|
+
## Mail sent by automations
|
|
124
|
+
|
|
125
|
+
Every message a run of an automation sends (its controller, an occurrence or any run it starts, including the
|
|
126
|
+
send-email action) is automatic mail: the runtime hands AbstractCore the run's account with
|
|
127
|
+
`EmailContext.automation_marker = "automation:<automation id>/run:<run id>"`, so each send carries
|
|
128
|
+
`Auto-Submitted: auto-generated` (`auto-replied` for a reply) and `X-AbstractFramework-Automation`. Chats and
|
|
129
|
+
discussions (a person is there) send ordinary mail. The marker is decided on the run's automation attribution, which
|
|
130
|
+
the runtime sets and a client cannot write (`automation_marker_for(vars, run_id)`).
|
|
131
|
+
|
|
121
132
|
## Running an automation when mail arrives
|
|
122
133
|
|
|
123
134
|
### The inbox and the watcher
|
|
@@ -155,6 +166,10 @@ if email_trigger_consumers(runtime): # at least one email automation
|
|
|
155
166
|
`Body (not fetched):` with the cause and fix.
|
|
156
167
|
- A message that cannot be fetched on three polls in a row is recorded in `feeder.status()["unprocessable"]` with its
|
|
157
168
|
code, cause and fix, and the feeder moves past it.
|
|
169
|
+
- The account's own automatic mail never becomes an event, so an automation can never trigger itself: a message
|
|
170
|
+
that carries the framework marker (`X-AbstractFramework-Automation`) and comes from the account's own address, or
|
|
171
|
+
whose Message-ID the host reports as sent by the framework (`EmailInboxFeeder(..., is_own_sent=callable)`), is
|
|
172
|
+
passed before its body is fetched and counted in `report.own_automatic`.
|
|
158
173
|
- A connection or sign-in failure never raises: the report and `feeder.status()` carry `{code, cause, fix,
|
|
159
174
|
retryable}`, and the next poll waits 60 seconds, doubling up to 15 minutes (`poll(..., force=True)` polls at once).
|
|
160
175
|
No automation is paused.
|
|
@@ -174,6 +189,7 @@ trigger = {
|
|
|
174
189
|
"every": "1h", # batch interval, at least "60s"
|
|
175
190
|
"folder": "INBOX",
|
|
176
191
|
"max_batch": 100,
|
|
192
|
+
"auto_submitted": "skip", # default; "admit" runs on automatic mail too
|
|
177
193
|
"filter": {"from_domain_in": ["example.test"], "subject_contains": "invoice"},
|
|
178
194
|
},
|
|
179
195
|
}
|
|
@@ -182,6 +198,9 @@ trigger = {
|
|
|
182
198
|
- **Filters** are typed: `from_in` (addresses), `from_domain_in` (exact domains; list a subdomain to match it),
|
|
183
199
|
`to_in` (any To or Cc address), `subject_contains` (one literal, case-insensitive substring) and `has_attachment`.
|
|
184
200
|
There are no patterns or expressions.
|
|
201
|
+
- **Automatic mail** (RFC 3834): with `auto_submitted: "skip"` (the default) a message whose `Auto-Submitted` header
|
|
202
|
+
is present and not `no` (auto-responders, notifications, other automations) is never admitted; `"admit"` lets it
|
|
203
|
+
reach the filters. The account's own automatic mail is kept out of the inbox whatever this option says.
|
|
185
204
|
- **Batches**: the automation runs at most once per `every`, with every matching message received since its previous
|
|
186
205
|
run (up to `max_batch`; the rest go to the next run). An automation that runs a model defaults to once an hour; one
|
|
187
206
|
that needs no model defaults to every minute.
|
|
@@ -12,7 +12,7 @@ Remote-light runtime:
|
|
|
12
12
|
pip install abstractruntime
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
This installs AbstractCore 2.20.
|
|
15
|
+
This installs AbstractCore 2.20.2 or newer with remote provider, vision,
|
|
16
16
|
voice, audio, music, tool, and MCP-worker support. The base install is
|
|
17
17
|
remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
|
|
18
18
|
endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
|
|
@@ -20,7 +20,7 @@ Fix:
|
|
|
20
20
|
- Install or upgrade the base Runtime package. LLM/tools integration, common
|
|
21
21
|
remote-light multimodal dependencies, and the MCP worker entry point are part
|
|
22
22
|
of the base install.
|
|
23
|
-
- The current AbstractCore integration expects `abstractcore>=2.20.
|
|
23
|
+
- The current AbstractCore integration expects `abstractcore>=2.20.2`.
|
|
24
24
|
|
|
25
25
|
Verify:
|
|
26
26
|
|
|
@@ -53,7 +53,7 @@ See llms.txt for the linked index.
|
|
|
53
53
|
|
|
54
54
|
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.
|
|
55
55
|
|
|
56
|
-
**Version:** 0.8.
|
|
56
|
+
**Version:** 0.8.1 • **Python:** 3.10+
|
|
57
57
|
|
|
58
58
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
59
59
|
|
|
@@ -81,7 +81,7 @@ Remote-light runtime:
|
|
|
81
81
|
pip install abstractruntime
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
The base install includes AbstractCore 2.20.
|
|
84
|
+
The base install includes AbstractCore 2.20.2 or newer (its light install:
|
|
85
85
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
86
86
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
87
87
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -145,7 +145,7 @@ state = rt.resume(
|
|
|
145
145
|
assert state.status.value == "completed"
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
-
## What’s included (v0.8.
|
|
148
|
+
## What’s included (v0.8.1)
|
|
149
149
|
|
|
150
150
|
Kernel (import-light):
|
|
151
151
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -287,7 +287,7 @@ Remote-light runtime:
|
|
|
287
287
|
pip install abstractruntime
|
|
288
288
|
```
|
|
289
289
|
|
|
290
|
-
This installs AbstractCore 2.20.
|
|
290
|
+
This installs AbstractCore 2.20.2 or newer with remote provider, vision,
|
|
291
291
|
voice, audio, music, tool, and MCP-worker support. The base install is
|
|
292
292
|
remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
|
|
293
293
|
endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
|
|
@@ -432,7 +432,7 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
|
|
|
432
432
|
# AbstractRuntime — Architecture
|
|
433
433
|
|
|
434
434
|
> Updated: 2026-09-29
|
|
435
|
-
> Version: 0.8.
|
|
435
|
+
> Version: 0.8.1
|
|
436
436
|
> Scope: this describes **what is implemented in this repository**.
|
|
437
437
|
|
|
438
438
|
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.
|
|
@@ -1167,7 +1167,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
1167
1167
|
|
|
1168
1168
|
### AbstractCore (LLM + tools)
|
|
1169
1169
|
|
|
1170
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.20.
|
|
1170
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.20.2 or newer is part of the base install).
|
|
1171
1171
|
|
|
1172
1172
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
1173
1173
|
|
|
@@ -1177,7 +1177,7 @@ Entry points:
|
|
|
1177
1177
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
1178
1178
|
- email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
|
|
1179
1179
|
- 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`)
|
|
1180
|
-
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
|
|
1180
|
+
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
|
|
1181
1181
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
1182
1182
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
1183
1183
|
- 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`, `list_vision_adapters`)
|
|
@@ -1213,6 +1213,7 @@ Multimodal support:
|
|
|
1213
1213
|
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
1214
1214
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
1215
1215
|
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
1216
|
+
- with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
|
|
1216
1217
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
1217
1218
|
- local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
|
|
1218
1219
|
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
|
|
@@ -1678,7 +1679,7 @@ Fix:
|
|
|
1678
1679
|
- Install or upgrade the base Runtime package. LLM/tools integration, common
|
|
1679
1680
|
remote-light multimodal dependencies, and the MCP worker entry point are part
|
|
1680
1681
|
of the base install.
|
|
1681
|
-
- The current AbstractCore integration expects `abstractcore>=2.20.
|
|
1682
|
+
- The current AbstractCore integration expects `abstractcore>=2.20.2`.
|
|
1682
1683
|
|
|
1683
1684
|
Verify:
|
|
1684
1685
|
|
|
@@ -4566,7 +4567,9 @@ stored ids in `output_offloaded_artifact_ids`.
|
|
|
4566
4567
|
|
|
4567
4568
|
Any other recipient, a `reply_email` call (its recipients come from the original message), or a call the refiner
|
|
4568
4569
|
cannot read waits for a person on a `tool_approval` wait. The rule applies whether or not the run carries a per-run
|
|
4569
|
-
tool policy (`_runtime.tool_policy`)
|
|
4570
|
+
tool policy (`_runtime.tool_policy`), including under the executor's default policy (`ToolApprovalPolicy()`, whose
|
|
4571
|
+
default caution list names `send_email`); a `require_approval_tools` list the host passes explicitly, or a per-run
|
|
4572
|
+
policy's, still wins. Email-triggered runs under `approval: "ask"` never use the refiner. In a batch,
|
|
4570
4573
|
one `send_email` that needs a person makes every `send_email` of that batch wait.
|
|
4571
4574
|
|
|
4572
4575
|
Approval is separate from the account's recipient policy (allowlist or denylist): AbstractCore's `guarded_send`
|
|
@@ -4576,6 +4579,15 @@ control that decides who can receive mail at all. A client that approves every t
|
|
|
4576
4579
|
the approval wait for that user's own runs, never the recipient policy. See
|
|
4577
4580
|
[tool-approval.md](tool-approval.md#per-call-refiners).
|
|
4578
4581
|
|
|
4582
|
+
## Mail sent by automations
|
|
4583
|
+
|
|
4584
|
+
Every message a run of an automation sends (its controller, an occurrence or any run it starts, including the
|
|
4585
|
+
send-email action) is automatic mail: the runtime hands AbstractCore the run's account with
|
|
4586
|
+
`EmailContext.automation_marker = "automation:<automation id>/run:<run id>"`, so each send carries
|
|
4587
|
+
`Auto-Submitted: auto-generated` (`auto-replied` for a reply) and `X-AbstractFramework-Automation`. Chats and
|
|
4588
|
+
discussions (a person is there) send ordinary mail. The marker is decided on the run's automation attribution, which
|
|
4589
|
+
the runtime sets and a client cannot write (`automation_marker_for(vars, run_id)`).
|
|
4590
|
+
|
|
4579
4591
|
## Running an automation when mail arrives
|
|
4580
4592
|
|
|
4581
4593
|
### The inbox and the watcher
|
|
@@ -4613,6 +4625,10 @@ if email_trigger_consumers(runtime): # at least one email automation
|
|
|
4613
4625
|
`Body (not fetched):` with the cause and fix.
|
|
4614
4626
|
- A message that cannot be fetched on three polls in a row is recorded in `feeder.status()["unprocessable"]` with its
|
|
4615
4627
|
code, cause and fix, and the feeder moves past it.
|
|
4628
|
+
- The account's own automatic mail never becomes an event, so an automation can never trigger itself: a message
|
|
4629
|
+
that carries the framework marker (`X-AbstractFramework-Automation`) and comes from the account's own address, or
|
|
4630
|
+
whose Message-ID the host reports as sent by the framework (`EmailInboxFeeder(..., is_own_sent=callable)`), is
|
|
4631
|
+
passed before its body is fetched and counted in `report.own_automatic`.
|
|
4616
4632
|
- A connection or sign-in failure never raises: the report and `feeder.status()` carry `{code, cause, fix,
|
|
4617
4633
|
retryable}`, and the next poll waits 60 seconds, doubling up to 15 minutes (`poll(..., force=True)` polls at once).
|
|
4618
4634
|
No automation is paused.
|
|
@@ -4632,6 +4648,7 @@ trigger = {
|
|
|
4632
4648
|
"every": "1h", # batch interval, at least "60s"
|
|
4633
4649
|
"folder": "INBOX",
|
|
4634
4650
|
"max_batch": 100,
|
|
4651
|
+
"auto_submitted": "skip", # default; "admit" runs on automatic mail too
|
|
4635
4652
|
"filter": {"from_domain_in": ["example.test"], "subject_contains": "invoice"},
|
|
4636
4653
|
},
|
|
4637
4654
|
}
|
|
@@ -4640,6 +4657,9 @@ trigger = {
|
|
|
4640
4657
|
- **Filters** are typed: `from_in` (addresses), `from_domain_in` (exact domains; list a subdomain to match it),
|
|
4641
4658
|
`to_in` (any To or Cc address), `subject_contains` (one literal, case-insensitive substring) and `has_attachment`.
|
|
4642
4659
|
There are no patterns or expressions.
|
|
4660
|
+
- **Automatic mail** (RFC 3834): with `auto_submitted: "skip"` (the default) a message whose `Auto-Submitted` header
|
|
4661
|
+
is present and not `no` (auto-responders, notifications, other automations) is never admitted; `"admit"` lets it
|
|
4662
|
+
reach the filters. The account's own automatic mail is kept out of the inbox whatever this option says.
|
|
4643
4663
|
- **Batches**: the automation runs at most once per `every`, with every matching message received since its previous
|
|
4644
4664
|
run (up to `max_batch`; the rest go to the next run). An automation that runs a model defaults to once an hour; one
|
|
4645
4665
|
that needs no model defaults to every minute.
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
> Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
|
|
4
4
|
|
|
5
5
|
- Python: 3.10+ (see `pyproject.toml`)
|
|
6
|
-
- Version: 0.8.
|
|
6
|
+
- Version: 0.8.1
|
|
7
7
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
8
8
|
- Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
|
|
9
|
-
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.20.
|
|
9
|
+
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.20.2 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
|
|
10
10
|
- Install profiles: base `abstractruntime` is remote-light with MCP, generated media routing, and Runtime-owned permissive PDF read/write nodes; `abstractruntime[apple]` and `abstractruntime[gpu]` add local inferencer stacks.
|
|
11
11
|
- Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names. Hosts can attach `resolve_provider_endpoint_profile(provider_id)` to the LLM client; Runtime treats it as an optional resolver hook, injects transient provider/base URL/key params for the call, and redacts secret-like params from persisted observability.
|
|
12
12
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "AbstractRuntime"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.1"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -53,7 +53,7 @@ dependencies = [
|
|
|
53
53
|
# plugins) without selecting local inference engines. 2.19.2 floors
|
|
54
54
|
# abstractvision>=0.3.33, whose resident loads report `loaded_new` and whose
|
|
55
55
|
# unload frees the pipeline (the resident media path relies on both).
|
|
56
|
-
"abstractcore>=2.20.
|
|
56
|
+
"abstractcore>=2.20.2",
|
|
57
57
|
"openai<3.0.0,>=1.109.1",
|
|
58
58
|
"httpx<1.0.0,>=0.28.1",
|
|
59
59
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -70,12 +70,12 @@ dependencies = [
|
|
|
70
70
|
|
|
71
71
|
[project.optional-dependencies]
|
|
72
72
|
apple = [
|
|
73
|
-
"abstractcore[apple]>=2.20.
|
|
73
|
+
"abstractcore[apple]>=2.20.2",
|
|
74
74
|
"setuptools<82.0.0,>=80.10.2",
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
gpu = [
|
|
78
|
-
"abstractcore[gpu]>=2.20.
|
|
78
|
+
"abstractcore[gpu]>=2.20.2",
|
|
79
79
|
# vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
|
|
80
80
|
"setuptools<82.0.0,>=77.0.3",
|
|
81
81
|
]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Email automations never trigger themselves, speech and images work without a buildable text model,
|
|
2
|
+
and a chat's mail to its owner runs without asking. Requires AbstractCore 2.20.2.
|
|
3
|
+
|
|
4
|
+
### Added
|
|
5
|
+
- Mail sent by an automation run (controller, occurrence, any run it starts, the send-email action)
|
|
6
|
+
is automatic mail: the run's `EmailContext` gets `automation_marker =
|
|
7
|
+
"automation:<automation id>/run:<run id>"`, so every send carries `Auto-Submitted` and
|
|
8
|
+
`X-AbstractFramework-Automation`. `automation_marker_for(vars, run_id)` is exported from
|
|
9
|
+
`abstractruntime.email.binding`. Chats and discussions send ordinary mail.
|
|
10
|
+
- `email.received@1` config `auto_submitted`: `"skip"` (default) never admits a message whose
|
|
11
|
+
`Auto-Submitted` header is present and not `no`; `"admit"` lets it reach the filters. Stored
|
|
12
|
+
configs without the key behave like `"skip"`.
|
|
13
|
+
- `EmailInboxFeeder(..., is_own_sent=callable)` and `PollReport.own_automatic`: the account's own
|
|
14
|
+
automatic mail (the framework marker from its own address, or a Message-ID the host recorded as
|
|
15
|
+
sent) never enters the event inbox.
|
|
16
|
+
- `abstractruntime.integrations.abstractcore.run_facade.inline_run_active(run_id)`: true while the
|
|
17
|
+
run facade executes a child run in this process; host runners skip such runs.
|
|
18
|
+
- `ToolApprovalPolicy.default_require_approval_tools`: the names on the require list only because
|
|
19
|
+
no list was given (the default caution list).
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- The pooled local client runs media-only requests (image, video, voice, music, transcription, no
|
|
23
|
+
tools) and streaming TTS on AbstractCore's capability host instead of building the default text
|
|
24
|
+
client: text-to-speech no longer fails when the text default cannot be built (for example an
|
|
25
|
+
MLX route on an install without MLX), and no text model is loaded for a media request.
|
|
26
|
+
- Without a per-run tool policy, the `send_email_recipient@v2` refiner now also lowers a name that
|
|
27
|
+
is on the executor's default caution list (`send_email` under `ToolApprovalPolicy()`): a chat
|
|
28
|
+
run's send to its owner's own address runs without an approval wait. An explicitly passed
|
|
29
|
+
require list and a per-run policy's still win; email-triggered runs under `approval: "ask"` are
|
|
30
|
+
unchanged.
|
|
31
|
+
|
|
32
|
+
### Dependencies
|
|
33
|
+
- `abstractcore>=2.20.2` (also `[apple]` and `[gpu]`).
|
|
@@ -129,11 +129,59 @@ def bind_email_account(
|
|
|
129
129
|
|
|
130
130
|
Resolver = Callable[[EmailBinding], Any]
|
|
131
131
|
|
|
132
|
-
# (resolver of the executing run's Runtime, the run's binding, the use
|
|
133
|
-
|
|
132
|
+
# (resolver of the executing run's Runtime, the run's binding, the use, the automation marker).
|
|
133
|
+
# Unset outside a tool batch.
|
|
134
|
+
_SCOPE: "ContextVar[Optional[Tuple[Optional[Resolver], Optional[EmailBinding], str, str]]]" = ContextVar(
|
|
134
135
|
"abstractruntime_email_scope", default=None
|
|
135
136
|
)
|
|
136
137
|
|
|
138
|
+
AUTOMATION_MARKER_MAX = 200
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def automation_marker_for(vars_obj: Any, run_id: Any = None) -> str:
|
|
142
|
+
"""The framework marker for mail a run sends automatically, or "" for a person's run.
|
|
143
|
+
|
|
144
|
+
A run of an automation (its controller, an occurrence or any descendant of one, decided on
|
|
145
|
+
the runtime-set attribution in `_meta`, which a client cannot write) sends automatically:
|
|
146
|
+
`automation:<automation id>/run:<run id>`; a legacy scheduled run: `schedule:<run id>`.
|
|
147
|
+
Chats and discussions (a person is there) get "" and their mail is sent unmarked.
|
|
148
|
+
AbstractCore stamps the marker and RFC 3834 `Auto-Submitted` on every message sent through
|
|
149
|
+
the run's `EmailContext`, and the mail watcher never admits them back (no self-trigger).
|
|
150
|
+
"""
|
|
151
|
+
from ..core.run_attribution import automation_index_fields
|
|
152
|
+
|
|
153
|
+
rid = str(run_id or "").strip()
|
|
154
|
+
fields = automation_index_fields(vars_obj, run_id=rid or None)
|
|
155
|
+
role = fields.get("role")
|
|
156
|
+
if role in ("controller", "occurrence", "descendant"):
|
|
157
|
+
aid = str(fields.get("automation_id") or "").strip()
|
|
158
|
+
marker = f"automation:{aid}/run:{rid}" if rid else f"automation:{aid}"
|
|
159
|
+
elif role == "legacy_schedule":
|
|
160
|
+
marker = f"schedule:{rid}"
|
|
161
|
+
else:
|
|
162
|
+
return ""
|
|
163
|
+
if len(marker) > AUTOMATION_MARKER_MAX or any(not (32 <= ord(c) < 127) for c in marker):
|
|
164
|
+
return "automation"
|
|
165
|
+
return marker
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _with_marker(ctx: Any, marker: str) -> Any:
|
|
169
|
+
"""`ctx` carrying `automation_marker` (a copy; the host's object is never changed)."""
|
|
170
|
+
if not marker or ctx is None:
|
|
171
|
+
return ctx
|
|
172
|
+
import dataclasses
|
|
173
|
+
|
|
174
|
+
if not dataclasses.is_dataclass(ctx) or "automation_marker" not in {f.name for f in dataclasses.fields(ctx)}:
|
|
175
|
+
# An AbstractCore without the marker field would send automatic mail unmarked and the
|
|
176
|
+
# watcher would admit it again: refuse loudly instead of looping silently.
|
|
177
|
+
raise RuntimeError(
|
|
178
|
+
"This AbstractCore cannot mark automatic mail (EmailContext.automation_marker is missing); "
|
|
179
|
+
"upgrade abstractcore to 2.20.2 or later."
|
|
180
|
+
)
|
|
181
|
+
if getattr(ctx, "automation_marker", ""):
|
|
182
|
+
return ctx
|
|
183
|
+
return dataclasses.replace(ctx, automation_marker=marker)
|
|
184
|
+
|
|
137
185
|
|
|
138
186
|
def resolver_accepts_use(resolver: Any) -> bool:
|
|
139
187
|
"""True when `resolver` takes a `use` keyword (or `**kwargs`); decided on its signature."""
|
|
@@ -175,7 +223,7 @@ def resolve_scoped_context() -> Any:
|
|
|
175
223
|
scope = _SCOPE.get()
|
|
176
224
|
if scope is None:
|
|
177
225
|
return None
|
|
178
|
-
resolver, binding, use = scope
|
|
226
|
+
resolver, binding, use, marker = scope
|
|
179
227
|
if resolver is None or binding is None:
|
|
180
228
|
return None
|
|
181
229
|
from abstractcore.comms.email import EmailError, EmailSecretUnavailable
|
|
@@ -189,7 +237,7 @@ def resolve_scoped_context() -> Any:
|
|
|
189
237
|
"The email account of this run could not be loaded.",
|
|
190
238
|
"Open Settings -> Email and Test the account; connect it again if the test fails.",
|
|
191
239
|
) from None
|
|
192
|
-
return ctx
|
|
240
|
+
return _with_marker(ctx, marker)
|
|
193
241
|
|
|
194
242
|
|
|
195
243
|
def install_core_resolver() -> None:
|
|
@@ -242,7 +290,8 @@ def email_run_scope(run: Any, *, resolver: Optional[Resolver] = None, use: Optio
|
|
|
242
290
|
if use not in EMAIL_USES:
|
|
243
291
|
raise ValueError(f"use must be one of {EMAIL_USES}, got {use!r}")
|
|
244
292
|
vars_obj = getattr(run, "vars", None)
|
|
245
|
-
|
|
293
|
+
marker = automation_marker_for(vars_obj, getattr(run, "run_id", None))
|
|
294
|
+
token = _SCOPE.set((resolver if callable(resolver) else None, binding_of(vars_obj), use, marker))
|
|
246
295
|
try:
|
|
247
296
|
yield
|
|
248
297
|
finally:
|
|
@@ -270,6 +319,7 @@ __all__ = [
|
|
|
270
319
|
"EMAIL_USE_ACTION",
|
|
271
320
|
"EMAIL_USE_AGENT_TOOL",
|
|
272
321
|
"EmailBinding",
|
|
322
|
+
"automation_marker_for",
|
|
273
323
|
"bind_email_account",
|
|
274
324
|
"binding_of",
|
|
275
325
|
"core_resolver_installed",
|