AbstractRuntime 0.7.3__tar.gz → 0.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/.github/workflows/ci.yml +11 -1
  2. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/CHANGELOG.md +144 -0
  3. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/CONTRIBUTING.md +24 -0
  4. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/PKG-INFO +10 -8
  5. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/README.md +5 -4
  6. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/README.md +3 -2
  7. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/api.md +32 -6
  8. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/architecture.md +10 -2
  9. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/artifacts.md +6 -1
  10. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/automations.md +73 -14
  11. abstractruntime-0.8.1/docs/email.md +289 -0
  12. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/faq.md +10 -5
  13. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/getting-started.md +1 -1
  14. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/integrations/abstractcore.md +9 -10
  15. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/tool-approval.md +30 -4
  16. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/tools-comms.md +26 -14
  17. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/troubleshooting.md +1 -1
  18. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/llms-full.txt +526 -64
  19. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/llms.txt +6 -5
  20. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/mkdocs.yml +2 -0
  21. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/pyproject.toml +7 -4
  22. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/pytest.ini +1 -1
  23. abstractruntime-0.8.1/release-notes.md +33 -0
  24. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/scripts/generate_llms_full.py +1 -0
  25. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/attention.py +2 -0
  26. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/commands.py +25 -2
  27. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/controller.py +324 -30
  28. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/models.py +151 -8
  29. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/service.py +23 -0
  30. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/runtime.py +135 -5
  31. abstractruntime-0.8.1/src/abstractruntime/email/__init__.py +98 -0
  32. abstractruntime-0.8.1/src/abstractruntime/email/actions.py +363 -0
  33. abstractruntime-0.8.1/src/abstractruntime/email/automations.py +104 -0
  34. abstractruntime-0.8.1/src/abstractruntime/email/binding.py +333 -0
  35. abstractruntime-0.8.1/src/abstractruntime/email/feeder.py +337 -0
  36. abstractruntime-0.8.1/src/abstractruntime/email/frame.py +109 -0
  37. abstractruntime-0.8.1/src/abstractruntime/email/inbox.py +433 -0
  38. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/__init__.py +1 -11
  39. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +9 -4
  40. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +69 -28
  41. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +321 -19
  42. abstractruntime-0.8.1/src/abstractruntime/integrations/abstractcore/email_facade.py +36 -0
  43. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +104 -2
  44. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +54 -9
  45. abstractruntime-0.8.1/src/abstractruntime/integrations/abstractcore/tool_effects.py +360 -0
  46. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +4 -0
  47. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +28 -2
  48. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/triggers/__init__.py +4 -1
  49. abstractruntime-0.8.1/src/abstractruntime/triggers/email_received.py +454 -0
  50. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/triggers/protocol.py +23 -5
  51. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/triggers/registry.py +3 -1
  52. abstractruntime-0.8.1/tests/email_wp2_support.py +121 -0
  53. abstractruntime-0.8.1/tests/live_email/conftest.py +53 -0
  54. abstractruntime-0.8.1/tests/live_email/live_email_support.py +265 -0
  55. abstractruntime-0.8.1/tests/live_email/test_email_live_runtime.py +353 -0
  56. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_abstractcore_comms_facade.py +10 -13
  57. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_definition.py +4 -2
  58. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_tool_approval.py +1 -1
  59. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_comms_gating.py +4 -3
  60. abstractruntime-0.8.1/tests/test_email_binding_and_refiner.py +364 -0
  61. abstractruntime-0.8.1/tests/test_email_gate_fixes.py +377 -0
  62. abstractruntime-0.8.1/tests/test_email_inbox_and_trigger.py +698 -0
  63. abstractruntime-0.8.1/tests/test_email_regate_fixes.py +386 -0
  64. abstractruntime-0.8.1/tests/test_email_review_fixes.py +541 -0
  65. abstractruntime-0.8.1/tests/test_email_self_trigger_loop.py +240 -0
  66. abstractruntime-0.8.1/tests/test_email_toolset_and_walls.py +98 -0
  67. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_every_path_bearing_tool_is_walled.py +1 -0
  68. abstractruntime-0.8.1/tests/test_media_only_requests_skip_text_client.py +114 -0
  69. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_packaging_extras.py +3 -3
  70. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_send_email_refiner.py +4 -0
  71. abstractruntime-0.8.1/tests/test_send_email_self_default_policy.py +109 -0
  72. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_catalog.py +10 -7
  73. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_trigger_registry.py +2 -2
  74. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_read_only.py +2 -2
  75. abstractruntime-0.7.3/emails.config.example.yaml +0 -44
  76. abstractruntime-0.7.3/release-notes.md +0 -33
  77. abstractruntime-0.7.3/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -160
  78. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/.github/workflows/release.yml +0 -0
  79. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/.gitignore +0 -0
  80. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/ACKNOWLEDGMENTS.md +0 -0
  81. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/CODE_OF_CONDUCT.md +0 -0
  82. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/LICENSE +0 -0
  83. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/ROADMAP.md +0 -0
  84. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/SECURITY.md +0 -0
  85. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  86. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  87. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  88. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  89. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  90. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  91. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  92. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/adr/README.md +0 -0
  93. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/README.md +0 -0
  94. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  95. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  96. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  97. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  98. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  99. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  100. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  101. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  102. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
  103. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  104. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  105. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  106. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  107. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  108. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  109. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  110. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  111. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/009_artifact_store.md +0 -0
  112. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  113. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  114. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  115. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  116. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  117. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  118. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  119. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  120. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  121. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  122. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  123. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  124. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  125. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  126. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  127. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  128. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  129. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  130. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  131. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  132. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  133. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  134. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  135. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  136. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  137. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/004_tests.md +0 -0
  138. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  139. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  140. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  141. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  142. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/README.md +0 -0
  143. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  144. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  145. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  146. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  147. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  148. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  149. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  150. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  151. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  152. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  153. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  154. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  155. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  156. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  157. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  158. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
  159. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  160. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  161. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  162. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  163. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  164. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  165. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  166. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  167. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  168. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  169. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  170. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  171. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  172. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  173. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  174. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  175. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  176. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  177. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  178. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  179. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  180. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  181. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  182. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  183. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  184. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  185. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  186. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  187. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  188. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/entity-runtime.md +0 -0
  189. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/evidence.md +0 -0
  190. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/limits.md +0 -0
  191. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/manual_testing.md +0 -0
  192. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/mcp-worker.md +0 -0
  193. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/proposal.md +0 -0
  194. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/provenance.md +0 -0
  195. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/snapshots.md +0 -0
  196. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/docs/workflow-bundles.md +0 -0
  197. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/01_hello_world.py +0 -0
  198. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/02_ask_user.py +0 -0
  199. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/03_wait_until.py +0 -0
  200. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/04_multi_step.py +0 -0
  201. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/05_persistence.py +0 -0
  202. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/06_llm_integration.py +0 -0
  203. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/07_react_agent.py +0 -0
  204. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/examples/README.md +0 -0
  205. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/scripts/backfill_diary_edges.py +0 -0
  206. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/__init__.py +0 -0
  207. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automation_queries.py +0 -0
  208. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/__init__.py +0 -0
  209. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/adapters.py +0 -0
  210. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundle.py +0 -0
  211. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  212. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  213. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/automations/ledger.py +0 -0
  214. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/__init__.py +0 -0
  215. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/config.py +0 -0
  216. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
  217. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/event_keys.py +0 -0
  218. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/health.py +0 -0
  219. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/live_deltas.py +0 -0
  220. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/models.py +0 -0
  221. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/policy.py +0 -0
  222. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/progress_channel.py +0 -0
  223. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/run_attribution.py +0 -0
  224. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/run_identity.py +0 -0
  225. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
  226. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/spec.py +0 -0
  227. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/tool_scope.py +0 -0
  228. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/core/vars.py +0 -0
  229. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/documents/__init__.py +0 -0
  230. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/documents/charts.py +0 -0
  231. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/documents/docx.py +0 -0
  232. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/documents/pdf.py +0 -0
  233. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/evidence/__init__.py +0 -0
  234. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/evidence/recorder.py +0 -0
  235. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/history_bundle.py +0 -0
  236. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/__init__.py +0 -0
  237. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/act_only.py +0 -0
  238. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/chat.py +0 -0
  239. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/communities.py +0 -0
  240. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/diary.py +0 -0
  241. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/digest.py +0 -0
  242. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
  243. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/fingerprint.py +0 -0
  244. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/lease.py +0 -0
  245. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/life.py +0 -0
  246. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/memory_reader.py +0 -0
  247. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/night_voice.py +0 -0
  248. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/phase_graph.py +0 -0
  249. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/phase_spec.py +0 -0
  250. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/prelude.py +0 -0
  251. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  252. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/reflection.py +0 -0
  253. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  254. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/substrate.py +0 -0
  255. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/tool_effects.py +0 -0
  256. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/tool_policy.py +0 -0
  257. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/tools.py +0 -0
  258. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
  259. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/__init__.py +0 -0
  260. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  261. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  262. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  263. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  264. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  265. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  266. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  267. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  268. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  269. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  270. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  271. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  272. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  273. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  274. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  275. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  276. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  277. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  278. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  279. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  280. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  281. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  282. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  283. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  284. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/__init__.py +0 -0
  285. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/active_context.py +0 -0
  286. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/active_memory.py +0 -0
  287. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/compaction.py +0 -0
  288. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/kg_packets.py +0 -0
  289. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/memact_composer.py +0 -0
  290. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/recall_levels.py +0 -0
  291. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/memory/token_budget.py +0 -0
  292. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/rendering/__init__.py +0 -0
  293. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  294. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
  295. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/__init__.py +0 -0
  296. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/convenience.py +0 -0
  297. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
  298. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/registry.py +0 -0
  299. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
  300. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/session_history.py +0 -0
  301. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/session_turns.py +0 -0
  302. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/__init__.py +0 -0
  303. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/artifacts.py +0 -0
  304. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/base.py +0 -0
  305. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/commands.py +0 -0
  306. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/in_memory.py +0 -0
  307. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/json_files.py +0 -0
  308. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/lease.py +0 -0
  309. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
  310. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
  311. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/observable.py +0 -0
  312. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/offloading.py +0 -0
  313. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/serialize.py +0 -0
  314. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/snapshots.py +0 -0
  315. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/sqlite.py +0 -0
  316. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  317. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/triggers/manual.py +0 -0
  318. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/triggers/schedule.py +0 -0
  319. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/turn_grounding.py +0 -0
  320. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/utils/__init__.py +0 -0
  321. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/utils/atomic_files.py +0 -0
  322. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/utils/file_filters.py +0 -0
  323. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
  324. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  325. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  326. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  327. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  328. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  329. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  330. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  331. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  332. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  333. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  334. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  335. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  336. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  337. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  338. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  339. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  340. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  341. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  342. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  343. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  344. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  345. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  346. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  347. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  348. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
  349. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  350. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  351. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  352. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/README.md +0 -0
  353. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/automation_harness.py +0 -0
  354. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/conftest.py +0 -0
  355. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_abstractcore_discovery_facade.py +0 -0
  356. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_abstractcore_host_facade.py +0 -0
  357. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_abstractcore_run_facade.py +0 -0
  358. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_abstractcore_telegram_facade.py +0 -0
  359. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_active_context_policy.py +0 -0
  360. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_active_memory.py +0 -0
  361. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_agora_agent_alias_identity.py +0 -0
  362. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_agora_tools_http.py +0 -0
  363. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  364. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_answer_user_effect.py +0 -0
  365. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_artifacts.py +0 -0
  366. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_commands.py +0 -0
  367. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_controller.py +0 -0
  368. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_controller_recovery.py +0 -0
  369. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_discussion_isolation.py +0 -0
  370. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_growing_context.py +0 -0
  371. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_index.py +0 -0
  372. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_next_fire.py +0 -0
  373. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_occurrence_recovery.py +0 -0
  374. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_replay_read_only.py +0 -0
  375. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_retry.py +0 -0
  376. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_session_turns.py +0 -0
  377. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_automation_status.py +0 -0
  378. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_browser_probe_target_walling.py +0 -0
  379. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  380. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_capability_default_reasoning.py +0 -0
  381. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_chat_summarizer_integration.py +0 -0
  382. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_code_node_restricted_python.py +0 -0
  383. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_command_store.py +0 -0
  384. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_compaction_helpers.py +0 -0
  385. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_compaction_summarizer_route.py +0 -0
  386. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_config_facade_models_engines.py +0 -0
  387. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_control_adapter_while.py +0 -0
  388. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_controller_bundle_packaged.py +0 -0
  389. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_crash_ordering_inversions.py +0 -0
  390. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_create_if_absent.py +0 -0
  391. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_data_registry_facade.py +0 -0
  392. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_camera_gating.py +0 -0
  393. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_files.py +0 -0
  394. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_folders.py +0 -0
  395. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_include_skim_web.py +0 -0
  396. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_default_tools_search_files_executor.py +0 -0
  397. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_diary_capture.py +0 -0
  398. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_diary_write_rescue.py +0 -0
  399. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_directory_lease.py +0 -0
  400. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_disabled_toolsets_seam.py +0 -0
  401. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  402. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  403. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
  404. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_discussion_session_anchor.py +0 -0
  405. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_document_markdown_tables.py +0 -0
  406. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_document_renderers_hr_quote.py +0 -0
  407. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_durable_toolsets.py +0 -0
  408. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_durable_write_discipline.py +0 -0
  409. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  410. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_effect_cancellation.py +0 -0
  411. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_effect_issuance_idempotency.py +0 -0
  412. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  413. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_election_consequence_teaching.py +0 -0
  414. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_emergence_experiment.py +0 -0
  415. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_emit_event_uses_wait_index.py +0 -0
  416. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
  417. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_endpoint_profile_route_context.py +0 -0
  418. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_awake_memory_fixes.py +0 -0
  419. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_brain_effects.py +0 -0
  420. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_chat_driver.py +0 -0
  421. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_chat_tools_reflection.py +0 -0
  422. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_diary.py +0 -0
  423. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_execute_tool.py +0 -0
  424. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_fetch_url_tool.py +0 -0
  425. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_history_window.py +0 -0
  426. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_life_loop.py +0 -0
  427. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_memory_richness.py +0 -0
  428. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_phase_graph_conformance.py +0 -0
  429. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_react_visit_window.py +0 -0
  430. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_recent_memories.py +0 -0
  431. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_runtime.py +0 -0
  432. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_search_memory.py +0 -0
  433. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  434. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_substrate_resolution.py +0 -0
  435. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_visit_honesty.py +0 -0
  436. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_workspace_cap.py +0 -0
  437. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_entity_workspace_tools.py +0 -0
  438. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_event_wait_index.py +0 -0
  439. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_evidence_recorder.py +0 -0
  440. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  441. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_execute_command_output_offload.py +0 -0
  442. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_execution_capability_discovery.py +0 -0
  443. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_explicit_eject_other_clients.py +0 -0
  444. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_factory_default_retry_policy.py +0 -0
  445. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  446. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_format_repair_nudge.py +0 -0
  447. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_fresh_install_no_provider.py +0 -0
  448. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_gateway_facades_c4899.py +0 -0
  449. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_git_read_only_refiner.py +0 -0
  450. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_hf_process_residency_merge.py +0 -0
  451. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_history_window_multimodal.py +0 -0
  452. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_hot_path_store_reads.py +0 -0
  453. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_indexed_idempotency_lookup.py +0 -0
  454. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_integration_abstractcore.py +0 -0
  455. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_integrations_abstractcore.py +0 -0
  456. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_json_file_run_store_children_index.py +0 -0
  457. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_json_run_cache_bound.py +0 -0
  458. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_json_store_scan_memo.py +0 -0
  459. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_jsonl_ledger_recovery.py +0 -0
  460. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
  461. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_ledger_chain.py +0 -0
  462. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_ledger_record_slimming.py +0 -0
  463. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_ledger_subscription.py +0 -0
  464. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_live_token_deltas.py +0 -0
  465. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
  466. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  467. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  468. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  469. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_requires_prompt.py +0 -0
  470. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
  471. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
  472. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_text_phase_progress.py +0 -0
  473. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  474. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  475. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  476. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_client_grounding_tail.py +0 -0
  477. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_client_media_artifacts.py +0 -0
  478. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_client_system_context.py +0 -0
  479. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
  480. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_retry_classification.py +0 -0
  481. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_llm_streaming_on_token.py +0 -0
  482. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_local_helper_tool_exposure.py +0 -0
  483. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_local_residency_host_sweep.py +0 -0
  484. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  485. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_max_iterations_ceiling.py +0 -0
  486. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mcp_remote_tool_executor.py +0 -0
  487. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mcp_worker_logging.py +0 -0
  488. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mcp_worker_security.py +0 -0
  489. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mcp_worker_stdio.py +0 -0
  490. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_media_artifact_resolution.py +0 -0
  491. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_media_capability_default_routing.py +0 -0
  492. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_media_subprocess.py +0 -0
  493. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memact_composer_from_kg_result.py +0 -0
  494. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_appraise_handler.py +0 -0
  495. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_communities.py +0 -0
  496. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  497. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_packets.py +0 -0
  498. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  499. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  500. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  501. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  502. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_note_effect.py +0 -0
  503. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_query_effect.py +0 -0
  504. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_query_rich_filters.py +0 -0
  505. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  506. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_seam_handlers.py +0 -0
  507. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
  508. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_memory_tag_effect.py +0 -0
  509. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mlx_generation_serialization.py +0 -0
  510. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_mlx_process_residency_merge.py +0 -0
  511. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_model_eject_cancel.py +0 -0
  512. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_model_residency_clean_switch.py +0 -0
  513. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_model_residency_control_plane.py +0 -0
  514. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  515. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_multi_store_scheduler.py +0 -0
  516. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
  517. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_native_mlx_application_wiring.py +0 -0
  518. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
  519. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_native_tool_channel.py +0 -0
  520. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_night_voice.py +0 -0
  521. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
  522. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_offload_answer_chain_c4978.py +0 -0
  523. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  524. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_offloading.py +0 -0
  525. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
  526. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_pause_resume.py +0 -0
  527. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_pdf_unicode_rendering.py +0 -0
  528. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_personal_cycle.py +0 -0
  529. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_phantom_attachment_index.py +0 -0
  530. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_phase_graph_artifact_control.py +0 -0
  531. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_phase_graph_obedience.py +0 -0
  532. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_phase_vocabulary_migration.py +0 -0
  533. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  534. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_cache_export_import.py +0 -0
  535. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  536. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_cache_modules.py +0 -0
  537. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  538. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  539. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_prompt_overlay.py +0 -0
  540. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  541. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_provider_pin_routing_isolation.py +0 -0
  542. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_queryable_run_store.py +0 -0
  543. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  544. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_read_idle_threading.py +0 -0
  545. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_readoption_experiment.py +0 -0
  546. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_real_integration.py +0 -0
  547. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_realize_election.py +0 -0
  548. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_recall_levels_policy.py +0 -0
  549. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_remote_client_cancel.py +0 -0
  550. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_remote_llm_client.py +0 -0
  551. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_remote_speculation_defaults.py +0 -0
  552. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_rendering_agent_trace_report.py +0 -0
  553. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_rendering_json_stringify.py +0 -0
  554. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_report_branding.py +0 -0
  555. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_resident_media_generation.py +0 -0
  556. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_resume_concurrent_same_wait.py +0 -0
  557. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_retry_idempotency.py +0 -0
  558. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_run_history_bundle.py +0 -0
  559. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_run_index_workspace_root.py +0 -0
  560. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_run_mutation_lock.py +0 -0
  561. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_run_scoped_tool_policy.py +0 -0
  562. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_run_tool_scope_ceiling.py +0 -0
  563. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_browser_session_boundary.py +0 -0
  564. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  565. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  566. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
  567. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  568. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_install_boundary.py +0 -0
  569. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  570. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_node_traces.py +0 -0
  571. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  572. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_runtime_tick_step_gate.py +0 -0
  573. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_scheduler.py +0 -0
  574. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  575. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_history.py +0 -0
  576. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_prompt_cache_attribution.py +0 -0
  577. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_prompt_cache_visibility.py +0 -0
  578. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_route_stamp.py +0 -0
  579. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_session_start_cost.py +0 -0
  580. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_shell_tool_exposure.py +0 -0
  581. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_snapshots.py +0 -0
  582. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_speculation_inheritance.py +0 -0
  583. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
  584. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_sqlite_ledger_store.py +0 -0
  585. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_start_subworkflow_async_wait.py +0 -0
  586. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  587. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  588. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_steer_sidecar.py +0 -0
  589. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_storage_deletion.py +0 -0
  590. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_structured_output_schema_enum.py +0 -0
  591. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_subworkflow.py +0 -0
  592. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_terminal_effect_completion.py +0 -0
  593. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  594. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_thinking_inheritance.py +0 -0
  595. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  596. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_approval_executor.py +0 -0
  597. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_approval_resume_executes.py +0 -0
  598. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
  599. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
  600. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_descriptor_registry.py +0 -0
  601. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
  602. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_error_output_detection.py +0 -0
  603. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_filename_alias.py +0 -0
  604. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  605. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
  606. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_executor_timeout.py +0 -0
  607. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_inventory_facade.py +0 -0
  608. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_invoke_effect.py +0 -0
  609. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_policy_and_mounts.py +0 -0
  610. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
  611. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_topic_election_world_model.py +0 -0
  612. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_trace_context_propagation.py +0 -0
  613. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_trigger_schedule_math.py +0 -0
  614. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_turn_grounding_byte_stability.py +0 -0
  615. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
  616. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_vars_query_effect.py +0 -0
  617. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visit_ab_fixture.py +0 -0
  618. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visit_midturn_elections.py +0 -0
  619. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visit_midturn_resume.py +0 -0
  620. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visit_workflow.py +0 -0
  621. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  622. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  623. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  624. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  625. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  626. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  627. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_entity_memory_nodes.py +0 -0
  628. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  629. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_llm_call_partial_override.py +0 -0
  630. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  631. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_memact_compose_node.py +0 -0
  632. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  633. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  634. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  635. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  636. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  637. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_add_message_builtin.py +0 -0
  638. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  639. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_agora_react_agent.py +0 -0
  640. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_call_tool_node.py +0 -0
  641. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  642. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_compiler_basic.py +0 -0
  643. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  644. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_continue_on_error.py +0 -0
  645. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  646. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  647. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  648. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_function_library.py +0 -0
  649. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_get_element_node.py +0 -0
  650. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_get_random_element_node.py +0 -0
  651. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_get_var_node.py +0 -0
  652. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
  653. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  654. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  655. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_make_object_node.py +0 -0
  656. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_media_nodes.py +0 -0
  657. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  658. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_memory_source_pins.py +0 -0
  659. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_pin_expressions.py +0 -0
  660. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_prompt_only.py +0 -0
  661. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_random_nodes.py +0 -0
  662. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
  663. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_string_contains_replace.py +0 -0
  664. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
  665. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_voice_openai_api_key_path.py +0 -0
  666. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_w4_feelings_lens.py +0 -0
  667. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_wait_event_deadline.py +0 -0
  668. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_wait_event_prompt_metadata.py +0 -0
  669. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_wait_until_streak.py +0 -0
  670. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_wait_until_utc_normalization.py +0 -0
  671. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workflow_bundle_registry.py +0 -0
  672. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_builtin_deny.py +0 -0
  673. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  674. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  675. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  676. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  677. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/tests/test_workspace_prompt_context.py +0 -0
  678. {abstractruntime-0.7.3 → abstractruntime-0.8.1}/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
@@ -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.1] - 2026-09-30
11
+
12
+ Email automations never trigger themselves, speech and images work without a buildable text model,
13
+ and a chat's mail to its owner runs without asking. Requires AbstractCore 2.20.2.
14
+
15
+ ### Added
16
+ - Mail sent by an automation run (controller, occurrence, any run it starts, the send-email action)
17
+ is automatic mail: the run's `EmailContext` gets `automation_marker =
18
+ "automation:<automation id>/run:<run id>"`, so every send carries `Auto-Submitted` and
19
+ `X-AbstractFramework-Automation`. `automation_marker_for(vars, run_id)` is exported from
20
+ `abstractruntime.email.binding`. Chats and discussions send ordinary mail.
21
+ - `email.received@1` config `auto_submitted`: `"skip"` (default) never admits a message whose
22
+ `Auto-Submitted` header is present and not `no`; `"admit"` lets it reach the filters. Stored
23
+ configs without the key behave like `"skip"`.
24
+ - `EmailInboxFeeder(..., is_own_sent=callable)` and `PollReport.own_automatic`: the account's own
25
+ automatic mail (the framework marker from its own address, or a Message-ID the host recorded as
26
+ sent) never enters the event inbox.
27
+ - `abstractruntime.integrations.abstractcore.run_facade.inline_run_active(run_id)`: true while the
28
+ run facade executes a child run in this process; host runners skip such runs.
29
+ - `ToolApprovalPolicy.default_require_approval_tools`: the names on the require list only because
30
+ no list was given (the default caution list).
31
+
32
+ ### Changed
33
+ - The pooled local client runs media-only requests (image, video, voice, music, transcription, no
34
+ tools) and streaming TTS on AbstractCore's capability host instead of building the default text
35
+ client: text-to-speech no longer fails when the text default cannot be built (for example an
36
+ MLX route on an install without MLX), and no text model is loaded for a media request.
37
+ - Without a per-run tool policy, the `send_email_recipient@v2` refiner now also lowers a name that
38
+ is on the executor's default caution list (`send_email` under `ToolApprovalPolicy()`): a chat
39
+ run's send to its owner's own address runs without an approval wait. An explicitly passed
40
+ require list and a per-run policy's still win; email-triggered runs under `approval: "ask"` are
41
+ unchanged.
42
+
43
+ ### Dependencies
44
+ - `abstractcore>=2.20.2` (also `[apple]` and `[gpu]`).
45
+
46
+ ## [0.8.0] - 2026-09-30
47
+
48
+ ### Added
49
+
50
+ - **Email for each user** (see `docs/email.md`). A run acts for one account: its non-secret binding
51
+ `_runtime.email_account = {account_ref, address}` is resolved at the moment a tool needs it through the host's
52
+ per-runtime resolver (`Runtime.set_email_context_resolver(fn)`), so credentials never enter run vars, the ledger,
53
+ tool arguments or results. `Runtime.set_email_binding(...)` binds automation occurrences; hosts set root runs with
54
+ `bind_email_account(...)` after `strip_client_email_keys(...)`. Child runs inherit the binding and the
55
+ pre-authorised recipients (the parent's value wins). Once a runtime has a resolver, AbstractCore's email tools in
56
+ that process never fall back to the local AbstractCore settings.
57
+ - **`send_email_recipient@v2` approval refiner.** A `send_email` runs without an approval wait only when every
58
+ recipient is the registered address (`_runtime.operator_email`) or is listed in `_runtime.email_allowed_recipients`;
59
+ `reply_email`, unknown argument keys and anything unproven ask. The account's recipient policy and send limits
60
+ (AbstractCore `guarded_send`) still apply to every send.
61
+ - **Durable event inbox and mail feeder** (`abstractruntime.email`): `JsonFileEventInbox` / `InMemoryEventInbox`
62
+ (append-only, unique event ids, per-stream dedupe keys and state, crash-repaired index), attached with
63
+ `Runtime.set_event_inbox(...)`; `EmailInboxFeeder.poll(ctx)` appends each new message whole, advances its
64
+ UIDVALIDITY + UID cursor only after a durable append, resynchronises after a folder rebuild without loss or
65
+ duplicates, passes a message that fails three polls, and reports connection failures as typed
66
+ `{code, cause, fix, retryable}` with a capped backoff (60 s to 15 min). `email_trigger_consumers(...)` and
67
+ `wake_email_automations(...)` serve the host's watcher.
68
+ - **`email.received@1` trigger source.** Typed filters (`from_in`, `from_domain_in`, `to_in`, `subject_contains`,
69
+ `has_attachment`), batches no more often than `every` (default `1h` for automations that run a model, `60s`
70
+ otherwise; at least `60s`), up to `max_batch` messages, each message at most once per automation across restarts
71
+ and folder rebuilds. Occurrences receive the messages as `input_data.trigger` marked `content_trust: "untrusted"`
72
+ and, for a string `prompt`, inside a fixed untrusted frame whose markers carry a boundary token drawn at random
73
+ for each occurrence (a body cannot fake the end of its email). The messages and the framed prompt are stored as
74
+ artifacts at admission: `automation.admitted`, `pending_occurrence` and the dispatch effect carry refs, metadata and
75
+ event ids, never bodies, and the occurrence run resolves the refs when it starts. Creating this trigger on a
76
+ runtime without an artifact store is refused (`unsupported_feature`).
77
+ - **Send-email action** (`abstractframework.email-actions@1.0.0:send_email`, `register_email_action_workflow`,
78
+ `email_action_target`): automations without a model send templated mail (fixed placeholders, `each` or `digest`
79
+ mode) through an ordinary `send_email` tool call, under the same approval rule, policy and limits.
80
+ - **Automation definition schema v2**: `policy.email_allowed_recipients` (`"self"` and exact addresses, default
81
+ `["self"]`, frozen into each occurrence) and `notify.channels` (`["console"]` or `["console", "email"]`), which
82
+ attention items carry as `channels`. Stored v1 definitions read with the defaults.
83
+ - **Email tools follow the host's decision**: `email_enabled=` on `get_default_toolsets`, `get_default_tools`,
84
+ `list_default_tool_specs`, `build_default_tool_map` and `list_tool_catalog`; the email kind adds `reply_email`,
85
+ `search_emails`, `get_email_attachment` and the read-only `list_email_folders`.
86
+ - **Oversized mail never blocks the feeder**: a message over AbstractCore's reading limit is appended with its headers,
87
+ attachment list and typed `body_skipped` record (bodies `null`, never cut), listed in `PollReport.body_skipped`,
88
+ passed to occurrences in `input_data.trigger.emails[].body_skipped` and shown as `Body (not fetched)` in the frame.
89
+ - **The resolver learns who is sending** (`use="agent_tool"` or `use="action"`), so a host applies its users'
90
+ "agent email tools" choice to agent tools only; the send-email action is identified by its node function.
91
+ - **`email_facade`** (`abstractruntime.integrations.abstractcore.email_facade`): AbstractCore's mail library for hosts.
92
+ - **Event-inbox retention**: `EventInboxRetention` (default 90 days and 10,000 events), `inbox.prune(...)` and
93
+ `prune_email_inbox(runtime, retention=...)`, which never removes an event an active email automation has not read.
94
+ - **`policy.untrusted_input_tools`**: tools named one by one that an email-triggered occurrence may run without asking
95
+ although "allow all tools" does not cover them there; message-sending tools are never granted this way.
96
+ - **`START_SUBWORKFLOW` `payload.resolve_vars`**: top-level vars whose artifact refs are resolved for the child only
97
+ (strict: a missing artifact fails the start), so the parent's ledger and node traces keep the refs.
98
+ - **Tool facts for untrusted input** (`tool_effects`): `TOOL_NETWORK_REACH` (`none`, `configured`, `open`, `send`) and
99
+ `TOOL_WRITE_SCOPE` (`workspace`, `workspace_only_mode`, `host`, and for the memory tools `run` and `memory`) for
100
+ every tool the runtime exposes, with `untrusted_input_grantable(...)`.
101
+ - `list_tool_catalog(email_off_reason=...)` names why email is off (`not_connected`, `admin_disabled`,
102
+ `not_available` — the administrator has not made agent email tools available to this user — and `agent_tools_off`).
103
+
104
+ ### Changed
105
+
106
+ - **Requires AbstractCore 2.20.0 or newer** (`abstractcore.comms.email`, the email tools on a per-run resolver).
107
+ - **Email-triggered automations act only within the user's mission** (operator decision 2026-09-30). Under
108
+ "allow all tools", an automation triggered by `email.received@1` grants by kind, decided on tool facts and never on
109
+ names: only tools with no network egress beyond configured services, no code or command execution, no message
110
+ sending, no writes outside the run's workspace and no delegation run unattended (file reads, workspace-confined
111
+ file writes, mailbox reads, `get_email_attachment`, `recall_memory` and `update_plan`). `fetch_url`,
112
+ `browser_probe`, `skim_url`, `skim_websearch`, `web_search`, `execute_command`, `shell_exec`, `execute_python`,
113
+ `delegate_agent`, `channel_fs_write`, `agora_post_message`, `agora_send_dm`, the camera tools, the memory-writing
114
+ tools (`remember`, `remember_note` including `scope: "global"`, `compact_memory`: they write the user's lasting
115
+ memory, outside the run's workspace, so a stranger's email cannot plant a note later runs obey), MCP tools and
116
+ every other tool ask, unless the user named them one by one in `policy.untrusted_input_tools`; message-sending
117
+ tools (`send_email`, `reply_email`, `agora_post_message`, `agora_send_dm`, WhatsApp and Telegram sends) are never
118
+ granted, named or not. Schedule and manual automations keep the full grant. `reply_email` is withheld like
119
+ `send_email` everywhere.
120
+ - **Email-triggered automations under "ask" run nothing unasked** (re-gate 2026-09-30). Their occurrences always carry
121
+ a per-run tool policy: under `policy.tool_approval: "ask"` it auto-approves only the tools the user named in
122
+ `policy.untrusted_input_tools` (sending tools never) and requires approval for every other tool, so neither the
123
+ executor's static defaults (which auto-run `skim_url`, `web_search`, the agora posts and the Telegram sends) nor a
124
+ per-call refiner decide there. The policy replaces any `tool_policy` the target inputs carried
125
+ (`replaced_target_policy: true`) and is marked `untrusted_input: true`, beside the run flag
126
+ `_runtime.untrusted_input`. Child runs inherit both, the parent's value winning over the child's own. Defence in
127
+ depth: for a run with that flag the approval executor never consults its static policy or a tier ceiling, runs a
128
+ listed tool unasked only when the user named it or (under "auto") its facts pass `untrusted_input_allow_all`,
129
+ never runs a sending tool unasked, and applies the per-call refiners only under "auto".
130
+ - `send_email` / `reply_email` `attachments` and `get_email_attachment`'s `output_dir` are confined to the run's
131
+ workspace in every workspace access mode (ignored paths and the host's protection still apply);
132
+ `get_email_attachment` is a `write` tool.
133
+ - A run policy that only withholds tools (`tool_policy.withheld_tools`) is applied like any other run policy, so the
134
+ per-call refiners run for it.
135
+ - The per-call refiners (`send_email_recipient@v2`) also run when a run carries no `_runtime.tool_policy`, on top of
136
+ the executor's static policy (its `require_approval_tools` still wins), and decide per call: one `send_email` that
137
+ needs a person makes the batch wait.
138
+ - No environment variable enables the email tools: `ABSTRACT_ENABLE_EMAIL_TOOLS` is gone and
139
+ `ABSTRACT_ENABLE_COMMS_TOOLS` enables WhatsApp and Telegram only; pass `email_enabled=True`.
140
+ - The untrusted frame tells the agent not to follow links or instructions contained in the emails and to act only
141
+ on the automation's mission.
142
+ - After a folder rebuild with nothing to resynchronise, the feeder stores the new baseline AbstractCore returns
143
+ (`reset` and `baseline`) instead of fetching one itself.
144
+ - Large structured tool outputs (for example a `read_email` with a big HTML body) are offloaded to session
145
+ attachments under the same inline limit as text outputs; the result carries artifact references.
146
+ - The process-local email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`) are no longer
147
+ exported from `abstractruntime.integrations.abstractcore`; they remain on the host facade for single-user installs.
148
+
149
+ ### Removed
150
+
151
+ - `emails.config.example.yaml` (environment-variable email setup) is no longer shipped; email is configured through
152
+ the host's per-user settings.
153
+
10
154
  ## [0.7.3] - 2026-09-29
11
155
 
12
156
  ### Security
@@ -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.7.3
3
+ Version: 0.8.1
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.19.2
23
+ Requires-Dist: abstractcore>=2.20.2
24
24
  Requires-Dist: abstractmemory>=0.3.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
@@ -35,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.19.2; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.20.2; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[gpu]>=2.19.2; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.20.2; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
+ 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.7.3 • **Python:** 3.10+
58
+ **Version:** 0.8.1 • **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.19.2 or newer (its light install:
86
+ The base install includes AbstractCore 2.20.2 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.7.3)
150
+ ## What’s included (v0.8.1)
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.3 • **Python:** 3.10+
7
+ **Version:** 0.8.1 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -32,7 +32,7 @@ Remote-light runtime:
32
32
  pip install abstractruntime
33
33
  ```
34
34
 
35
- The base install includes AbstractCore 2.19.2 or newer (its light install:
35
+ The base install includes AbstractCore 2.20.2 or newer (its light install:
36
36
  remote providers, tools, vision, voice, audio, and music integration), plus the
37
37
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
38
38
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -96,7 +96,7 @@ state = rt.resume(
96
96
  assert state.status.value == "completed"
97
97
  ```
98
98
 
99
- ## What’s included (v0.7.3)
99
+ ## What’s included (v0.8.1)
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
- - `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` self-recipient rule)
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 `manual@1`, third-party sources through the `abstractruntime.trigger_sources` entry-point group
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.19.2 or newer is part of the base install).
305
+ Requires: `pip install abstractruntime` (AbstractCore 2.20.2 or newer is part of the base install).
281
306
 
282
307
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
283
308
 
@@ -285,9 +310,9 @@ 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
- - public email comms wrappers: `list_email_accounts(...)`, `list_emails(...)`, `read_email(...)`, `send_email(...)` (`src/abstractruntime/integrations/abstractcore/comms_facade.py`)
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
- - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
315
+ - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
291
316
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
292
317
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
293
318
  - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
@@ -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 delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
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
@@ -323,6 +348,7 @@ Multimodal support:
323
348
  - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
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
351
+ - with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
326
352
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
327
353
  - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
328
354
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-09-29
4
- > Version: 0.7.3
4
+ > Version: 0.8.1
5
5
  > Scope: this describes **what is implemented in this repository**.
6
6
 
7
7
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -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