AbstractRuntime 0.7.2__tar.gz → 0.8.0__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.7.2 → abstractruntime-0.8.0}/.github/workflows/ci.yml +11 -1
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/ACKNOWLEDGMENTS.md +1 -1
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CHANGELOG.md +144 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CONTRIBUTING.md +24 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/PKG-INFO +10 -8
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/README.md +5 -4
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/README.md +3 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/api.md +32 -6
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/architecture.md +10 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/artifacts.md +6 -1
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/automations.md +82 -13
- abstractruntime-0.8.0/docs/email.md +270 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/faq.md +13 -4
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/getting-started.md +1 -1
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/integrations/abstractcore.md +14 -13
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/tool-approval.md +30 -4
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/tools-comms.md +26 -14
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/troubleshooting.md +1 -1
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/llms-full.txt +525 -66
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/llms.txt +6 -5
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/mkdocs.yml +2 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/pyproject.toml +10 -5
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/pytest.ini +1 -1
- abstractruntime-0.8.0/release-notes.md +105 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/scripts/generate_llms_full.py +1 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/attention.py +2 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/commands.py +25 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/controller.py +347 -26
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/models.py +151 -8
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/service.py +23 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/runtime.py +135 -5
- abstractruntime-0.8.0/src/abstractruntime/email/__init__.py +98 -0
- abstractruntime-0.8.0/src/abstractruntime/email/actions.py +363 -0
- abstractruntime-0.8.0/src/abstractruntime/email/automations.py +104 -0
- abstractruntime-0.8.0/src/abstractruntime/email/binding.py +283 -0
- abstractruntime-0.8.0/src/abstractruntime/email/feeder.py +304 -0
- abstractruntime-0.8.0/src/abstractruntime/email/frame.py +109 -0
- abstractruntime-0.8.0/src/abstractruntime/email/inbox.py +433 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/__init__.py +1 -11
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +9 -4
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +69 -28
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +313 -19
- abstractruntime-0.8.0/src/abstractruntime/integrations/abstractcore/email_facade.py +36 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +142 -1
- abstractruntime-0.8.0/src/abstractruntime/integrations/abstractcore/tool_effects.py +360 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +28 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/__init__.py +4 -1
- abstractruntime-0.8.0/src/abstractruntime/triggers/email_received.py +420 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/protocol.py +23 -5
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/registry.py +3 -1
- abstractruntime-0.8.0/tests/email_wp2_support.py +121 -0
- abstractruntime-0.8.0/tests/live_email/conftest.py +53 -0
- abstractruntime-0.8.0/tests/live_email/live_email_support.py +265 -0
- abstractruntime-0.8.0/tests/live_email/test_email_live_runtime.py +299 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_comms_facade.py +10 -13
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_definition.py +4 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_tool_approval.py +100 -3
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_comms_gating.py +4 -3
- abstractruntime-0.8.0/tests/test_email_binding_and_refiner.py +364 -0
- abstractruntime-0.8.0/tests/test_email_gate_fixes.py +377 -0
- abstractruntime-0.8.0/tests/test_email_inbox_and_trigger.py +698 -0
- abstractruntime-0.8.0/tests/test_email_regate_fixes.py +386 -0
- abstractruntime-0.8.0/tests/test_email_review_fixes.py +541 -0
- abstractruntime-0.8.0/tests/test_email_toolset_and_walls.py +98 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_every_path_bearing_tool_is_walled.py +1 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_packaging_extras.py +3 -3
- abstractruntime-0.8.0/tests/test_resident_media_generation.py +310 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_send_email_refiner.py +4 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_catalog.py +10 -7
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trigger_registry.py +2 -2
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_read_only.py +2 -2
- abstractruntime-0.7.2/emails.config.example.yaml +0 -44
- abstractruntime-0.7.2/release-notes.md +0 -24
- abstractruntime-0.7.2/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -160
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/.gitignore +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/LICENSE +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/ROADMAP.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/SECURITY.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/evidence.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/limits.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/proposal.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/provenance.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/README.md +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/automation_harness.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/conftest.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_history.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_write_chart.py +0 -0
|
@@ -56,7 +56,17 @@ jobs:
|
|
|
56
56
|
tests/test_budget_law_no_unrequested_caps.py \
|
|
57
57
|
tests/test_discovery_voice_openai_api_key.py \
|
|
58
58
|
tests/test_voice_openai_api_key_path.py \
|
|
59
|
-
tests/test_discovery_tts_unavailable_reason.py
|
|
59
|
+
tests/test_discovery_tts_unavailable_reason.py \
|
|
60
|
+
tests/test_abstractcore_comms_facade.py \
|
|
61
|
+
tests/test_abstractcore_discovery_facade.py \
|
|
62
|
+
tests/test_automation_definition.py \
|
|
63
|
+
tests/test_automation_tool_approval.py \
|
|
64
|
+
tests/test_default_tools_comms_gating.py \
|
|
65
|
+
tests/test_every_path_bearing_tool_is_walled.py \
|
|
66
|
+
tests/test_packaging_extras.py \
|
|
67
|
+
tests/test_tool_catalog.py \
|
|
68
|
+
tests/test_trigger_registry.py \
|
|
69
|
+
tests/test_workspace_read_only.py
|
|
60
70
|
|
|
61
71
|
build:
|
|
62
72
|
name: Build distributions
|
|
@@ -11,7 +11,7 @@ The canonical dependency list lives in `pyproject.toml`.
|
|
|
11
11
|
- **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
|
|
12
12
|
|
|
13
13
|
## Runtime integrations
|
|
14
|
-
- **abstractcore** (`abstractcore>=2.19.
|
|
14
|
+
- **abstractcore** (`abstractcore>=2.19.2`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
|
|
15
15
|
- The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
|
|
16
16
|
- The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
|
|
17
17
|
- **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
|
|
@@ -7,6 +7,150 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] - 2026-09-30
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Email for each user** (see `docs/email.md`). A run acts for one account: its non-secret binding
|
|
15
|
+
`_runtime.email_account = {account_ref, address}` is resolved at the moment a tool needs it through the host's
|
|
16
|
+
per-runtime resolver (`Runtime.set_email_context_resolver(fn)`), so credentials never enter run vars, the ledger,
|
|
17
|
+
tool arguments or results. `Runtime.set_email_binding(...)` binds automation occurrences; hosts set root runs with
|
|
18
|
+
`bind_email_account(...)` after `strip_client_email_keys(...)`. Child runs inherit the binding and the
|
|
19
|
+
pre-authorised recipients (the parent's value wins). Once a runtime has a resolver, AbstractCore's email tools in
|
|
20
|
+
that process never fall back to the local AbstractCore settings.
|
|
21
|
+
- **`send_email_recipient@v2` approval refiner.** A `send_email` runs without an approval wait only when every
|
|
22
|
+
recipient is the registered address (`_runtime.operator_email`) or is listed in `_runtime.email_allowed_recipients`;
|
|
23
|
+
`reply_email`, unknown argument keys and anything unproven ask. The account's recipient policy and send limits
|
|
24
|
+
(AbstractCore `guarded_send`) still apply to every send.
|
|
25
|
+
- **Durable event inbox and mail feeder** (`abstractruntime.email`): `JsonFileEventInbox` / `InMemoryEventInbox`
|
|
26
|
+
(append-only, unique event ids, per-stream dedupe keys and state, crash-repaired index), attached with
|
|
27
|
+
`Runtime.set_event_inbox(...)`; `EmailInboxFeeder.poll(ctx)` appends each new message whole, advances its
|
|
28
|
+
UIDVALIDITY + UID cursor only after a durable append, resynchronises after a folder rebuild without loss or
|
|
29
|
+
duplicates, passes a message that fails three polls, and reports connection failures as typed
|
|
30
|
+
`{code, cause, fix, retryable}` with a capped backoff (60 s to 15 min). `email_trigger_consumers(...)` and
|
|
31
|
+
`wake_email_automations(...)` serve the host's watcher.
|
|
32
|
+
- **`email.received@1` trigger source.** Typed filters (`from_in`, `from_domain_in`, `to_in`, `subject_contains`,
|
|
33
|
+
`has_attachment`), batches no more often than `every` (default `1h` for automations that run a model, `60s`
|
|
34
|
+
otherwise; at least `60s`), up to `max_batch` messages, each message at most once per automation across restarts
|
|
35
|
+
and folder rebuilds. Occurrences receive the messages as `input_data.trigger` marked `content_trust: "untrusted"`
|
|
36
|
+
and, for a string `prompt`, inside a fixed untrusted frame whose markers carry a boundary token drawn at random
|
|
37
|
+
for each occurrence (a body cannot fake the end of its email). The messages and the framed prompt are stored as
|
|
38
|
+
artifacts at admission: `automation.admitted`, `pending_occurrence` and the dispatch effect carry refs, metadata and
|
|
39
|
+
event ids, never bodies, and the occurrence run resolves the refs when it starts. Creating this trigger on a
|
|
40
|
+
runtime without an artifact store is refused (`unsupported_feature`).
|
|
41
|
+
- **Send-email action** (`abstractframework.email-actions@1.0.0:send_email`, `register_email_action_workflow`,
|
|
42
|
+
`email_action_target`): automations without a model send templated mail (fixed placeholders, `each` or `digest`
|
|
43
|
+
mode) through an ordinary `send_email` tool call, under the same approval rule, policy and limits.
|
|
44
|
+
- **Automation definition schema v2**: `policy.email_allowed_recipients` (`"self"` and exact addresses, default
|
|
45
|
+
`["self"]`, frozen into each occurrence) and `notify.channels` (`["console"]` or `["console", "email"]`), which
|
|
46
|
+
attention items carry as `channels`. Stored v1 definitions read with the defaults.
|
|
47
|
+
- **Email tools follow the host's decision**: `email_enabled=` on `get_default_toolsets`, `get_default_tools`,
|
|
48
|
+
`list_default_tool_specs`, `build_default_tool_map` and `list_tool_catalog`; the email kind adds `reply_email`,
|
|
49
|
+
`search_emails`, `get_email_attachment` and the read-only `list_email_folders`.
|
|
50
|
+
- **Oversized mail never blocks the feeder**: a message over AbstractCore's reading limit is appended with its headers,
|
|
51
|
+
attachment list and typed `body_skipped` record (bodies `null`, never cut), listed in `PollReport.body_skipped`,
|
|
52
|
+
passed to occurrences in `input_data.trigger.emails[].body_skipped` and shown as `Body (not fetched)` in the frame.
|
|
53
|
+
- **The resolver learns who is sending** (`use="agent_tool"` or `use="action"`), so a host applies its users'
|
|
54
|
+
"agent email tools" choice to agent tools only; the send-email action is identified by its node function.
|
|
55
|
+
- **`email_facade`** (`abstractruntime.integrations.abstractcore.email_facade`): AbstractCore's mail library for hosts.
|
|
56
|
+
- **Event-inbox retention**: `EventInboxRetention` (default 90 days and 10,000 events), `inbox.prune(...)` and
|
|
57
|
+
`prune_email_inbox(runtime, retention=...)`, which never removes an event an active email automation has not read.
|
|
58
|
+
- **`policy.untrusted_input_tools`**: tools named one by one that an email-triggered occurrence may run without asking
|
|
59
|
+
although "allow all tools" does not cover them there; message-sending tools are never granted this way.
|
|
60
|
+
- **`START_SUBWORKFLOW` `payload.resolve_vars`**: top-level vars whose artifact refs are resolved for the child only
|
|
61
|
+
(strict: a missing artifact fails the start), so the parent's ledger and node traces keep the refs.
|
|
62
|
+
- **Tool facts for untrusted input** (`tool_effects`): `TOOL_NETWORK_REACH` (`none`, `configured`, `open`, `send`) and
|
|
63
|
+
`TOOL_WRITE_SCOPE` (`workspace`, `workspace_only_mode`, `host`, and for the memory tools `run` and `memory`) for
|
|
64
|
+
every tool the runtime exposes, with `untrusted_input_grantable(...)`.
|
|
65
|
+
- `list_tool_catalog(email_off_reason=...)` names why email is off (`not_connected`, `admin_disabled`,
|
|
66
|
+
`not_available` — the administrator has not made agent email tools available to this user — and `agent_tools_off`).
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **Requires AbstractCore 2.20.0 or newer** (`abstractcore.comms.email`, the email tools on a per-run resolver).
|
|
71
|
+
- **Email-triggered automations act only within the user's mission** (operator decision 2026-09-30). Under
|
|
72
|
+
"allow all tools", an automation triggered by `email.received@1` grants by kind, decided on tool facts and never on
|
|
73
|
+
names: only tools with no network egress beyond configured services, no code or command execution, no message
|
|
74
|
+
sending, no writes outside the run's workspace and no delegation run unattended (file reads, workspace-confined
|
|
75
|
+
file writes, mailbox reads, `get_email_attachment`, `recall_memory` and `update_plan`). `fetch_url`,
|
|
76
|
+
`browser_probe`, `skim_url`, `skim_websearch`, `web_search`, `execute_command`, `shell_exec`, `execute_python`,
|
|
77
|
+
`delegate_agent`, `channel_fs_write`, `agora_post_message`, `agora_send_dm`, the camera tools, the memory-writing
|
|
78
|
+
tools (`remember`, `remember_note` including `scope: "global"`, `compact_memory`: they write the user's lasting
|
|
79
|
+
memory, outside the run's workspace, so a stranger's email cannot plant a note later runs obey), MCP tools and
|
|
80
|
+
every other tool ask, unless the user named them one by one in `policy.untrusted_input_tools`; message-sending
|
|
81
|
+
tools (`send_email`, `reply_email`, `agora_post_message`, `agora_send_dm`, WhatsApp and Telegram sends) are never
|
|
82
|
+
granted, named or not. Schedule and manual automations keep the full grant. `reply_email` is withheld like
|
|
83
|
+
`send_email` everywhere.
|
|
84
|
+
- **Email-triggered automations under "ask" run nothing unasked** (re-gate 2026-09-30). Their occurrences always carry
|
|
85
|
+
a per-run tool policy: under `policy.tool_approval: "ask"` it auto-approves only the tools the user named in
|
|
86
|
+
`policy.untrusted_input_tools` (sending tools never) and requires approval for every other tool, so neither the
|
|
87
|
+
executor's static defaults (which auto-run `skim_url`, `web_search`, the agora posts and the Telegram sends) nor a
|
|
88
|
+
per-call refiner decide there. The policy replaces any `tool_policy` the target inputs carried
|
|
89
|
+
(`replaced_target_policy: true`) and is marked `untrusted_input: true`, beside the run flag
|
|
90
|
+
`_runtime.untrusted_input`. Child runs inherit both, the parent's value winning over the child's own. Defence in
|
|
91
|
+
depth: for a run with that flag the approval executor never consults its static policy or a tier ceiling, runs a
|
|
92
|
+
listed tool unasked only when the user named it or (under "auto") its facts pass `untrusted_input_allow_all`,
|
|
93
|
+
never runs a sending tool unasked, and applies the per-call refiners only under "auto".
|
|
94
|
+
- `send_email` / `reply_email` `attachments` and `get_email_attachment`'s `output_dir` are confined to the run's
|
|
95
|
+
workspace in every workspace access mode (ignored paths and the host's protection still apply);
|
|
96
|
+
`get_email_attachment` is a `write` tool.
|
|
97
|
+
- A run policy that only withholds tools (`tool_policy.withheld_tools`) is applied like any other run policy, so the
|
|
98
|
+
per-call refiners run for it.
|
|
99
|
+
- The per-call refiners (`send_email_recipient@v2`) also run when a run carries no `_runtime.tool_policy`, on top of
|
|
100
|
+
the executor's static policy (its `require_approval_tools` still wins), and decide per call: one `send_email` that
|
|
101
|
+
needs a person makes the batch wait.
|
|
102
|
+
- No environment variable enables the email tools: `ABSTRACT_ENABLE_EMAIL_TOOLS` is gone and
|
|
103
|
+
`ABSTRACT_ENABLE_COMMS_TOOLS` enables WhatsApp and Telegram only; pass `email_enabled=True`.
|
|
104
|
+
- The untrusted frame tells the agent not to follow links or instructions contained in the emails and to act only
|
|
105
|
+
on the automation's mission.
|
|
106
|
+
- After a folder rebuild with nothing to resynchronise, the feeder stores the new baseline AbstractCore returns
|
|
107
|
+
(`reset` and `baseline`) instead of fetching one itself.
|
|
108
|
+
- Large structured tool outputs (for example a `read_email` with a big HTML body) are offloaded to session
|
|
109
|
+
attachments under the same inline limit as text outputs; the result carries artifact references.
|
|
110
|
+
- The process-local email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`) are no longer
|
|
111
|
+
exported from `abstractruntime.integrations.abstractcore`; they remain on the host facade for single-user installs.
|
|
112
|
+
|
|
113
|
+
### Removed
|
|
114
|
+
|
|
115
|
+
- `emails.config.example.yaml` (environment-variable email setup) is no longer shipped; email is configured through
|
|
116
|
+
the host's per-user settings.
|
|
117
|
+
|
|
118
|
+
## [0.7.3] - 2026-09-29
|
|
119
|
+
|
|
120
|
+
### Security
|
|
121
|
+
|
|
122
|
+
- **An automation's tool grant no longer pre-approves sending messages** (framework backlog 0992
|
|
123
|
+
WP0). With the default `policy.tool_approval: "auto"`, the grant listed every tool the runtime
|
|
124
|
+
classifies, `send_email` included, and an explicit name in the grant overrides the
|
|
125
|
+
`model_controlled_destination` belt: an occurrence that read an inbound email or a web page could
|
|
126
|
+
mail data to any address that text named. The grant now withholds every tool whose inventory row
|
|
127
|
+
carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
|
|
128
|
+
`send_telegram_artifact`), even when the target's `allowed_tools` names it, and lists them in
|
|
129
|
+
`tool_policy.withheld_tools`. Their calls take the normal approval point: a `send_email` whose
|
|
130
|
+
every recipient is the registered user's address (`_runtime.operator_email`) still runs
|
|
131
|
+
unattended; any other recipient parks the occurrence on a `tool_approval` wait until a person
|
|
132
|
+
approves or refuses it (the behaviour of `"ask"`). Recipients named in an automation's definition
|
|
133
|
+
are not auto-approved yet; that allowlist is part of backlog 0992.
|
|
134
|
+
|
|
135
|
+
### Fixed
|
|
136
|
+
|
|
137
|
+
- **A resident image/video model serves generation.** After `load_model_residency(task="image_generation")`
|
|
138
|
+
(the Gateway's `POST /models/load`, the console Load button, a flow's model residency node), a local
|
|
139
|
+
image or video request whose every media output names a resident model runs in-process on the loaded
|
|
140
|
+
pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`) instead of loading the model
|
|
141
|
+
again in a one-shot subprocess. Measured through AbstractGateway with FLUX.2 [klein] 4B on a 16 GB
|
|
142
|
+
NVIDIA card: 17-19 s per image on the resident pipeline against 54-59 s with a reload per request, and
|
|
143
|
+
no second copy of the weights on the GPU. Pooled clients of `create_local_runtime(...)` use their pool's residency core. Models that
|
|
144
|
+
were not explicitly loaded keep the isolated subprocess (crash isolation for native Metal/CUDA
|
|
145
|
+
failures), so the explicit load is the opt-in.
|
|
146
|
+
|
|
147
|
+
### Changed
|
|
148
|
+
|
|
149
|
+
- **Requires AbstractCore 2.19.2 or newer** (`abstractcore`, `abstractcore[apple]`, `abstractcore[gpu]`).
|
|
150
|
+
It brings AbstractVision 0.3.33, whose loads report `loaded_new` (a fresh image-model load reads as
|
|
151
|
+
`loaded`, not `already_loaded`) and whose unload frees the model's memory, which the resident path
|
|
152
|
+
above relies on.
|
|
153
|
+
|
|
10
154
|
## [0.7.2] - 2026-09-29
|
|
11
155
|
|
|
12
156
|
### Changed
|
|
@@ -27,6 +27,30 @@ Inside the AbstractFramework workspace, prefer `python -P -m pytest tests -q`: `
|
|
|
27
27
|
|
|
28
28
|
If you cloned **only** this repo (without the AbstractFramework workspace), make sure the sibling packages above are importable (install them or clone them next to this repo) before running the full test suite.
|
|
29
29
|
|
|
30
|
+
### Live email tests (opt-in)
|
|
31
|
+
|
|
32
|
+
`tests/live_email/` runs the email integration against a **real test mailbox** (framework backlog 0992 WP2): an
|
|
33
|
+
`email.received@1` automation admits one uniquely tagged self-sent message exactly once (not again on a second poll,
|
|
34
|
+
a later wake or a restarted runtime), and a `send_email` tool call to the account's own address runs unattended while
|
|
35
|
+
one to another address parks on a `tool_approval` wait and is never sent. The tests carry the `live_email` marker, are
|
|
36
|
+
not `basic` (CI never selects them), and are skipped unless every variable below is set.
|
|
37
|
+
|
|
38
|
+
The test harness reads the mailbox from environment variables (the tests' input only; the runtime still gets its
|
|
39
|
+
account from the host resolver): `AF_TEST_EMAIL_IMAP_HOST`, `AF_TEST_EMAIL_IMAP_PORT`, `AF_TEST_EMAIL_IMAP_SECURITY`,
|
|
40
|
+
`AF_TEST_EMAIL_SMTP_HOST`, `AF_TEST_EMAIL_SMTP_PORT`, `AF_TEST_EMAIL_SMTP_SECURITY`, `AF_TEST_EMAIL_USERNAME`,
|
|
41
|
+
`AF_TEST_EMAIL_ADDRESS`, `AF_TEST_EMAIL_PASSWORD`. Keep them in a private file (mode 0600) and load it into the test
|
|
42
|
+
process only:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
set -a; . ~/.config/abstractframework-test/email.env; set +a; \
|
|
46
|
+
python -P -m pytest tests/live_email -m live_email -s --durations=0
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
No credential value is printed (redacting objects, scrubbed failure reports), mail only goes to the test account's
|
|
50
|
+
own address (a guard refuses any other recipient before `MAIL FROM`), and messages are small and tagged
|
|
51
|
+
`[af-live-test]`: the mailbox is read-only, so nothing can be cleaned up. Use a dedicated test mailbox. AbstractCore's
|
|
52
|
+
`tests/email/live/` covers the mail library itself.
|
|
53
|
+
|
|
30
54
|
## Repo map (source of truth)
|
|
31
55
|
|
|
32
56
|
- Public exports: `src/abstractruntime/__init__.py` (keep this consistent with `docs/api.md`)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
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.
|
|
23
|
+
Requires-Dist: abstractcore>=2.20.0
|
|
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,16 +35,17 @@ 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.
|
|
38
|
+
Requires-Dist: abstractcore[apple]>=2.20.0; 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.
|
|
45
|
+
Requires-Dist: abstractcore[gpu]>=2.20.0; extra == 'gpu'
|
|
46
46
|
Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
|
|
47
47
|
Provides-Extra: test
|
|
48
|
+
Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
|
|
48
49
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
49
50
|
Description-Content-Type: text/markdown
|
|
50
51
|
|
|
@@ -54,7 +55,7 @@ Description-Content-Type: text/markdown
|
|
|
54
55
|
|
|
55
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.
|
|
56
57
|
|
|
57
|
-
**Version:** 0.
|
|
58
|
+
**Version:** 0.8.0 • **Python:** 3.10+
|
|
58
59
|
|
|
59
60
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
60
61
|
|
|
@@ -82,7 +83,7 @@ Remote-light runtime:
|
|
|
82
83
|
pip install abstractruntime
|
|
83
84
|
```
|
|
84
85
|
|
|
85
|
-
The base install includes AbstractCore 2.
|
|
86
|
+
The base install includes AbstractCore 2.20.0 or newer (its light install:
|
|
86
87
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
87
88
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
88
89
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -146,7 +147,7 @@ state = rt.resume(
|
|
|
146
147
|
assert state.status.value == "completed"
|
|
147
148
|
```
|
|
148
149
|
|
|
149
|
-
## What’s included (v0.
|
|
150
|
+
## What’s included (v0.8.0)
|
|
150
151
|
|
|
151
152
|
Kernel (import-light):
|
|
152
153
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -158,7 +159,7 @@ Kernel (import-light):
|
|
|
158
159
|
- Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
|
|
159
160
|
- host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
|
|
160
161
|
- run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
|
|
161
|
-
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
162
|
+
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals), when mail arrives (`email.received@1`, `docs/email.md`) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
162
163
|
- explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
|
|
163
164
|
|
|
164
165
|
Durability + storage:
|
|
@@ -239,6 +240,7 @@ sr = create_scheduled_runtime(
|
|
|
239
240
|
| [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
|
|
240
241
|
| [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
|
|
241
242
|
| [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
|
|
243
|
+
| [Email](docs/email.md) | Email for each user: run-scoped account binding, sending without asking, the event inbox and mail feeder, the `email.received@1` trigger, the send-email action |
|
|
242
244
|
| [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
|
|
243
245
|
| [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
|
|
244
246
|
| [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
|
|
@@ -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.
|
|
7
|
+
**Version:** 0.8.0 • **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.
|
|
35
|
+
The base install includes AbstractCore 2.20.0 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.
|
|
99
|
+
## What’s included (v0.8.0)
|
|
100
100
|
|
|
101
101
|
Kernel (import-light):
|
|
102
102
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -108,7 +108,7 @@ Kernel (import-light):
|
|
|
108
108
|
- Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
|
|
109
109
|
- host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
|
|
110
110
|
- run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
|
|
111
|
-
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
111
|
+
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals), when mail arrives (`email.received@1`, `docs/email.md`) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
112
112
|
- explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
|
|
113
113
|
|
|
114
114
|
Durability + storage:
|
|
@@ -189,6 +189,7 @@ sr = create_scheduled_runtime(
|
|
|
189
189
|
| [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
|
|
190
190
|
| [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
|
|
191
191
|
| [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
|
|
192
|
+
| [Email](docs/email.md) | Email for each user: run-scoped account binding, sending without asking, the event inbox and mail feeder, the `email.received@1` trigger, the send-email action |
|
|
192
193
|
| [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
|
|
193
194
|
| [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
|
|
194
195
|
| [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
|
|
@@ -28,14 +28,15 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
28
28
|
- `artifacts.md` — Runtime artifact identity, descriptors, provenance, catalog search, and access stats
|
|
29
29
|
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, the `config_facade` models/engines/host-jobs passthroughs for hosts, cached sessions with per-session prompt-cache listing/clearing, host memory snapshots, model-residency listings, locks and model switching, live token streaming, workspace-scoped tools, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
|
|
30
30
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
31
|
-
- `
|
|
31
|
+
- `email.md` — email for each user: run-scoped account binding and the host resolver, sending without asking (self and pre-authorised recipients), the durable event inbox and mail feeder, the `email.received@1` trigger, and the send-email action
|
|
32
|
+
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
|
|
32
33
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
33
34
|
- `api.md#sessions-and-history` — session history replay: one window, the most recent 50,000 tokens of whole turns (`HISTORY_REPLAY_MAX_TOKENS`), returned as a `ReplayedHistory` whose `.report` records what was replayed and dropped
|
|
34
35
|
- `api.md#run-history-bundle-export-portable-replay-artifact` — run history bundles, including `resolved_actions` summaries for cross-client capability replay
|
|
35
36
|
|
|
36
37
|
## Features (reference)
|
|
37
38
|
|
|
38
|
-
- `automations.md` — automations: a workflow run on a schedule or on request as a durable controller run; triggers (`schedule@1`, `manual@1`, entry-point sources), commands, independent or growing context, discussions forked at any occurrence (own writable workspace, the automation's workspace mounted read-only), tool approval, typed waits, notifications and retries, and the storage guarantees (create-if-absent, per-run lock, turn roots, session kinds, one writer process per store)
|
|
39
|
+
- `automations.md` — automations: a workflow run on a schedule or on request as a durable controller run; triggers (`schedule@1`, `manual@1`, `email.received@1`, entry-point sources), commands, independent or growing context, discussions forked at any occurrence (own writable workspace, the automation's workspace mounted read-only), tool approval, typed waits, notifications and retries, and the storage guarantees (create-if-absent, per-run lock, turn roots, session kinds, one writer process per store)
|
|
39
40
|
- `entity-runtime.md` — per-entity runtimes for summoned entities: homes, the one-writer lease, act-only diary privacy (`$act_only` refs), durable visit waits with deadlines
|
|
40
41
|
- `evidence.md` — artifact-backed evidence capture for external-boundary tools
|
|
41
42
|
- `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
|
|
@@ -64,7 +64,7 @@ Implementation: `src/abstractruntime/core/runtime.py`.
|
|
|
64
64
|
|
|
65
65
|
- `Runtime.start(workflow, vars=..., actor_id=..., session_id=..., parent_run_id=..., run_id=...) -> run_id`
|
|
66
66
|
- creates and persists a new `RunState`
|
|
67
|
-
- `run_id` starts the run under an id you choose (`[A-Za-z0-9_-]+`). The run is created only if that id is free; starting it again with the same identity (workflow, session, parent, `vars._meta.occurrence`, `vars._meta.creation_digest`) returns the existing run untouched, and a different identity raises `RunIdentityConflict` (a `ValueError`, `reason_code = "identity_conflict"`). The store must support `create_if_absent` (otherwise `NotImplementedError`). `START_SUBWORKFLOW` accepts the same explicit id as `payload.run_id`
|
|
67
|
+
- `run_id` starts the run under an id you choose (`[A-Za-z0-9_-]+`). The run is created only if that id is free; starting it again with the same identity (workflow, session, parent, `vars._meta.occurrence`, `vars._meta.creation_digest`) returns the existing run untouched, and a different identity raises `RunIdentityConflict` (a `ValueError`, `reason_code = "identity_conflict"`). The store must support `create_if_absent` (otherwise `NotImplementedError`). `START_SUBWORKFLOW` accepts the same explicit id as `payload.run_id`, and `payload.resolve_vars` (a list of top-level var names) resolves the artifact refs in those vars for the child only, strictly (a missing artifact fails the start), so the parent's records keep the refs
|
|
68
68
|
- a root run that names a session is checked against the session's attribution: in a discussion session it gets the discussion's workspace setup (its own writable workspace and the read-only mount) and provenance, and when the attribution cannot be read (an invalid discussion root, or a store without a run index) the start raises `SessionAttributionError` (see [automations.md](automations.md#discussions))
|
|
69
69
|
- `Runtime.tick(workflow, run_id, max_steps=..., step_gate=None) -> RunState`
|
|
70
70
|
- executes node handlers and effects until the run becomes `WAITING`, `COMPLETED`, `FAILED`, or `CANCELLED`
|
|
@@ -241,7 +241,32 @@ from abstractruntime.triggers import get_trigger_adapter, trigger_sources
|
|
|
241
241
|
- reads: `get_automation(run_store, id)`, `list_occurrences(runtime, id, cursor=, limit=)`, `list_attention(ledger_store, id, after_seq=, cursor=, limit=)`, `pending_waits(run_store, id, limit=)` with typed waits (`ask_user`, `tool_approval`, `event`) and `ANSWER_PAYLOADS`; `list_automations(run_store, status=, cursor=, limit=)`, `automation_summary(run)`, `latest_occurrence(run_store, id)`
|
|
242
242
|
- `start_discussion(runtime, *, automation_id, occurrence_index, request_id, prompt, workspace_root, actor_id=None)`: a separate conversation forked at any occurrence N, seeded with the automation's whole timeline 1..N, working in its own writable `workspace_root` with the automation's workspace mounted read-only
|
|
243
243
|
- controller bundle: `register_controller_bundle(registry)`, `controller_workflow_spec()`, `controller_bundle_path()`; `CONTROLLER_WORKFLOW_ID` is `abstractframework.automation-controller@1.0.0:controller`
|
|
244
|
-
- trigger sources: `trigger_sources()`, `get_trigger_adapter(id, version)`, built-ins `schedule@1` and `
|
|
244
|
+
- trigger sources: `trigger_sources()`, `get_trigger_adapter(id, version)`, built-ins `schedule@1`, `manual@1` and `email.received@1`, third-party sources through the `abstractruntime.trigger_sources` entry-point group
|
|
245
|
+
- definition v2: `policy.email_allowed_recipients` (default `["self"]`), `policy.untrusted_input_tools` (default `[]`) and `notify.channels` (default `["console"]`); attention items carry `channels`
|
|
246
|
+
|
|
247
|
+
## Email
|
|
248
|
+
|
|
249
|
+
Implementation: `src/abstractruntime/email/*`, `src/abstractruntime/triggers/email_received.py`. Deep dive: [email.md](email.md).
|
|
250
|
+
|
|
251
|
+
```python
|
|
252
|
+
from abstractruntime.email import (
|
|
253
|
+
EmailBinding, bind_email_account, strip_client_email_keys, binding_of, # run-scoped binding
|
|
254
|
+
JsonFileEventInbox, InMemoryEventInbox, # durable event inbox
|
|
255
|
+
EmailInboxFeeder, PollReport, email_event_id, # mailbox -> inbox
|
|
256
|
+
email_trigger_consumers, wake_email_automations, prune_email_inbox, # watcher helpers
|
|
257
|
+
EventInboxRetention, # inbox retention (90 days / 10,000 events)
|
|
258
|
+
EMAIL_USE_AGENT_TOOL, EMAIL_USE_ACTION, email_use_for_workflow, # who is sending
|
|
259
|
+
email_action_target, register_email_action_workflow, validate_email_action, render_email_template,
|
|
260
|
+
)
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
- `Runtime.set_email_context_resolver(fn)`: `fn(binding, *, use) -> EmailContext | None` (`use` is `"agent_tool"` or `"action"`; `fn(binding)` also accepted), per runtime, memory only
|
|
264
|
+
- `Runtime.set_email_binding(binding | None)` / `Runtime.email_binding`: the account occurrences are bound to
|
|
265
|
+
- `Runtime.set_event_inbox(inbox)` / `Runtime.event_inbox`: required by `email.received@1`
|
|
266
|
+
- `EmailInboxFeeder(inbox, account_ref=...).poll(ctx, *, now=None, force=False) -> PollReport` and `.status()`
|
|
267
|
+
- toolsets: `get_default_toolsets(..., email_enabled=True)` (also `list_default_tool_specs`, `build_default_tool_map`, `list_tool_catalog`); no env flag; `list_tool_catalog(email_enabled=False, email_off_reason="not_connected" | "admin_disabled" | "not_available" | "agent_tools_off")`
|
|
268
|
+
- mail library for hosts: `abstractruntime.integrations.abstractcore.email_facade` re-exports `abstractcore.comms.email` (its `__all__` plus the `legacy` module; `GATEWAY_NAMES` lists the names hosts use)
|
|
269
|
+
- approval: the `send_email_recipient@v2` refiner ([tool-approval.md](tool-approval.md#per-call-refiners))
|
|
245
270
|
- `adopt_legacy_schedule_projection(run)`: read-only summary of a legacy gateway `scheduled:*` root
|
|
246
271
|
- read-only mounts: `_runtime.workspace_read_only_paths` (absolute folders; file write tools and VisualFlow writers refused inside, reads and command/code tools allowed); helpers `read_only_paths(vars)`, `path_is_read_only(vars, path)` and `READ_ONLY_PATHS_KEY` in `abstractruntime.utils.workspace_paths`
|
|
247
272
|
- read-only workspaces: run vars `workspace_read_only: true` (or `_runtime.workspace_read_only: true`); `abstractruntime.integrations.abstractcore.tool_effects.TOOL_EFFECT_CLASSES` classifies every exposable tool as `read`, `write`, `exec`, `delegate`, `comms` or `memory-write`
|
|
@@ -277,7 +302,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
277
302
|
|
|
278
303
|
### AbstractCore (LLM + tools)
|
|
279
304
|
|
|
280
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
305
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.20.0 or newer is part of the base install).
|
|
281
306
|
|
|
282
307
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
283
308
|
|
|
@@ -285,7 +310,7 @@ Entry points:
|
|
|
285
310
|
- `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
|
|
286
311
|
- public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
|
|
287
312
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
288
|
-
-
|
|
313
|
+
- email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
|
|
289
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`)
|
|
290
315
|
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
|
|
291
316
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
@@ -298,7 +323,7 @@ Entry points:
|
|
|
298
323
|
- the `MODEL_RESIDENCY` effect supports `list_loaded`, `load`, `unload`, `lock`, and `unlock` operations with the same soft-fail semantics; on `unload`, `force` is forwarded only when authored in the effect payload
|
|
299
324
|
- local `list_model_residency` merges AbstractCore's host-wide loaded-model sweep into text-generation listings (sweep-only rows carry `source: "provider_server"` and no `task` label), and residency rows normalize provider size extras to `size_bytes` / `size_vram_bytes` while keeping the originals; local text rows also carry registry-declared `modalities` (omitted on a registry miss), host identity (`host_id` / `host_name`), and runtime-owned lock truth (`locked` / `lockable`, with `pinned` a truthful alias of `locked` — never the default-identity flag, which `default` alone carries), while remote listings keep the Core server's row identity
|
|
300
325
|
- host-local prompt-cache export/import admin also lives on the host facade and client delegation layer (`list_prompt_cache_exports`, `prompt_cache_export`, `prompt_cache_import`) and is intentionally local-only
|
|
301
|
-
- host-facade email helpers
|
|
326
|
+
- host-facade email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`) use the process's own AbstractCore account (single-user installs)
|
|
302
327
|
- run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `edit_image`, `upscale_image`, `generate_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
|
|
303
328
|
- task-specific image/video helpers preserve batch and adapter controls such as
|
|
304
329
|
`count`/`n`, `seeds`, ordered `lora_adapters`, and video `flow_shift`; local
|
|
@@ -324,7 +349,8 @@ Multimodal support:
|
|
|
324
349
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
325
350
|
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
326
351
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
327
|
-
-
|
|
352
|
+
- 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
|
+
- 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"`
|
|
328
354
|
- Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
|
|
329
355
|
|
|
330
356
|
Prompt cache / cached sessions:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-09-29
|
|
4
|
-
> Version: 0.
|
|
4
|
+
> Version: 0.8.0
|
|
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.
|
|
@@ -332,7 +332,8 @@ flowchart LR
|
|
|
332
332
|
subgraph Automations["automations/ + triggers/"]
|
|
333
333
|
Commands["apply_automation_command"]
|
|
334
334
|
Controller["controller run<br/>(automation-controller@1.0.0)"]
|
|
335
|
-
Triggers["trigger registry<br/>schedule@1, manual@1,<br/>entry-point sources"]
|
|
335
|
+
Triggers["trigger registry<br/>schedule@1, manual@1, email.received@1,<br/>entry-point sources"]
|
|
336
|
+
Inbox["event inbox<br/>(email/, filled by the host's watcher)"]
|
|
336
337
|
Queries["get_automation / list_occurrences /<br/>list_attention / pending_waits /<br/>list_automations"]
|
|
337
338
|
end
|
|
338
339
|
subgraph Runs["runs"]
|
|
@@ -351,6 +352,7 @@ flowchart LR
|
|
|
351
352
|
Loop --> Controller
|
|
352
353
|
Loop --> Occ
|
|
353
354
|
Controller -->|"prepare / admit / rearm"| Triggers
|
|
355
|
+
Controller -->|"events after its cursor"| Inbox
|
|
354
356
|
Controller -->|"START_SUBWORKFLOW run_id"| Occ
|
|
355
357
|
Occ --> Desc
|
|
356
358
|
Controller --> RS
|
|
@@ -361,6 +363,11 @@ flowchart LR
|
|
|
361
363
|
Queries --> LS
|
|
362
364
|
```
|
|
363
365
|
|
|
366
|
+
Email automations read the runtime's durable event inbox: the host's mail watcher appends each new message
|
|
367
|
+
(`abstractruntime.email.feeder`) and wakes the controller, and the `email.received@1` adapter batches the messages
|
|
368
|
+
after the automation's cursor. Tool calls resolve the executing run's email account through the host's per-runtime
|
|
369
|
+
resolver at call time. See [email.md](email.md).
|
|
370
|
+
|
|
364
371
|
Invariants the design rests on:
|
|
365
372
|
|
|
366
373
|
- **Create-if-absent.** Controllers, occurrences and discussions are created under explicit ids through
|
|
@@ -409,6 +416,7 @@ AbstractRuntime includes a compiler and a portable bundle format:
|
|
|
409
416
|
- `getting-started.md` — first steps
|
|
410
417
|
- `api.md` — public API surface (imports + pointers)
|
|
411
418
|
- `automations.md` — automations: controller, triggers, commands, context, discussions, storage guarantees
|
|
419
|
+
- `email.md` — email accounts per run, the event inbox, the `email.received@1` trigger, the send-email action
|
|
412
420
|
- `limits.md` — `_limits` and RuntimeConfig
|
|
413
421
|
- `snapshots.md` — snapshot/bookmark stores
|
|
414
422
|
- `provenance.md` — hash chain and verification
|
|
@@ -105,7 +105,12 @@ Offload applies to:
|
|
|
105
105
|
- `read_file` content above the inline threshold;
|
|
106
106
|
- `execute_command` `stdout` and `stderr`, regardless of exit code (verbose
|
|
107
107
|
failures are offloaded like verbose successes);
|
|
108
|
-
- any other host tool whose string output exceeds the inline threshold
|
|
108
|
+
- any other host tool whose string output exceeds the inline threshold;
|
|
109
|
+
- any other host tool whose structured (dict) output exceeds the inline threshold as JSON: its largest string
|
|
110
|
+
values, at any depth, are stored one by one (largest first) until the output fits, each replaced by
|
|
111
|
+
`{"$artifact": id, "offloaded": true, "bytes": n, "open": "open_attachment(...)"}`; when many small values make
|
|
112
|
+
it too large, the whole output is stored as one JSON attachment and replaced by its reference. The result lists
|
|
113
|
+
the stored ids in `output_offloaded_artifact_ids`, and reading the run back resolves the references.
|
|
109
114
|
|
|
110
115
|
Thresholds (environment-configurable):
|
|
111
116
|
|