AbstractRuntime 0.7.2__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/.github/workflows/ci.yml +11 -1
  2. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/ACKNOWLEDGMENTS.md +1 -1
  3. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CHANGELOG.md +144 -0
  4. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CONTRIBUTING.md +24 -0
  5. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/PKG-INFO +10 -8
  6. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/README.md +5 -4
  7. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/README.md +3 -2
  8. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/api.md +32 -6
  9. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/architecture.md +10 -2
  10. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/artifacts.md +6 -1
  11. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/automations.md +82 -13
  12. abstractruntime-0.8.0/docs/email.md +270 -0
  13. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/faq.md +13 -4
  14. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/getting-started.md +1 -1
  15. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/integrations/abstractcore.md +14 -13
  16. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/tool-approval.md +30 -4
  17. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/tools-comms.md +26 -14
  18. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/troubleshooting.md +1 -1
  19. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/llms-full.txt +525 -66
  20. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/llms.txt +6 -5
  21. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/mkdocs.yml +2 -0
  22. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/pyproject.toml +10 -5
  23. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/pytest.ini +1 -1
  24. abstractruntime-0.8.0/release-notes.md +105 -0
  25. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/scripts/generate_llms_full.py +1 -0
  26. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/attention.py +2 -0
  27. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/commands.py +25 -2
  28. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/controller.py +347 -26
  29. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/models.py +151 -8
  30. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/service.py +23 -0
  31. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/runtime.py +135 -5
  32. abstractruntime-0.8.0/src/abstractruntime/email/__init__.py +98 -0
  33. abstractruntime-0.8.0/src/abstractruntime/email/actions.py +363 -0
  34. abstractruntime-0.8.0/src/abstractruntime/email/automations.py +104 -0
  35. abstractruntime-0.8.0/src/abstractruntime/email/binding.py +283 -0
  36. abstractruntime-0.8.0/src/abstractruntime/email/feeder.py +304 -0
  37. abstractruntime-0.8.0/src/abstractruntime/email/frame.py +109 -0
  38. abstractruntime-0.8.0/src/abstractruntime/email/inbox.py +433 -0
  39. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/__init__.py +1 -11
  40. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +9 -4
  41. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +69 -28
  42. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +313 -19
  43. abstractruntime-0.8.0/src/abstractruntime/integrations/abstractcore/email_facade.py +36 -0
  44. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +142 -1
  45. abstractruntime-0.8.0/src/abstractruntime/integrations/abstractcore/tool_effects.py +360 -0
  46. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +28 -2
  47. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/__init__.py +4 -1
  48. abstractruntime-0.8.0/src/abstractruntime/triggers/email_received.py +420 -0
  49. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/protocol.py +23 -5
  50. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/registry.py +3 -1
  51. abstractruntime-0.8.0/tests/email_wp2_support.py +121 -0
  52. abstractruntime-0.8.0/tests/live_email/conftest.py +53 -0
  53. abstractruntime-0.8.0/tests/live_email/live_email_support.py +265 -0
  54. abstractruntime-0.8.0/tests/live_email/test_email_live_runtime.py +299 -0
  55. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_comms_facade.py +10 -13
  56. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_definition.py +4 -2
  57. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_tool_approval.py +100 -3
  58. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_comms_gating.py +4 -3
  59. abstractruntime-0.8.0/tests/test_email_binding_and_refiner.py +364 -0
  60. abstractruntime-0.8.0/tests/test_email_gate_fixes.py +377 -0
  61. abstractruntime-0.8.0/tests/test_email_inbox_and_trigger.py +698 -0
  62. abstractruntime-0.8.0/tests/test_email_regate_fixes.py +386 -0
  63. abstractruntime-0.8.0/tests/test_email_review_fixes.py +541 -0
  64. abstractruntime-0.8.0/tests/test_email_toolset_and_walls.py +98 -0
  65. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_every_path_bearing_tool_is_walled.py +1 -0
  66. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_packaging_extras.py +3 -3
  67. abstractruntime-0.8.0/tests/test_resident_media_generation.py +310 -0
  68. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_send_email_refiner.py +4 -0
  69. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_catalog.py +10 -7
  70. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trigger_registry.py +2 -2
  71. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_read_only.py +2 -2
  72. abstractruntime-0.7.2/emails.config.example.yaml +0 -44
  73. abstractruntime-0.7.2/release-notes.md +0 -24
  74. abstractruntime-0.7.2/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -160
  75. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/.github/workflows/release.yml +0 -0
  76. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/.gitignore +0 -0
  77. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  78. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/LICENSE +0 -0
  79. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/ROADMAP.md +0 -0
  80. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/SECURITY.md +0 -0
  81. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  82. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  83. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  84. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  85. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  86. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  87. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  88. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/adr/README.md +0 -0
  89. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/README.md +0 -0
  90. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  91. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  92. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  93. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  94. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  95. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  96. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  97. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  98. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
  99. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  100. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  101. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  102. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  103. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  104. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  105. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  106. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  107. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/009_artifact_store.md +0 -0
  108. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  109. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  110. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  111. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  112. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  113. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  114. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  115. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  116. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  117. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  118. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  119. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  120. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  121. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  122. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  123. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  124. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  125. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  126. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  127. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  128. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  129. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  130. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  131. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  132. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  133. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/004_tests.md +0 -0
  134. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  135. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  136. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  137. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  138. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/README.md +0 -0
  139. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  140. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  141. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  142. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  143. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  144. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  145. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  146. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  147. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  148. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  149. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  150. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  151. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  152. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  153. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  154. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
  155. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  156. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  157. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  158. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  159. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  160. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  161. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  162. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  163. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  164. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  165. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  166. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  167. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  168. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  169. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  170. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  171. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  172. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  173. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  174. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  175. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  176. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  177. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  178. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  179. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  180. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  181. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  182. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  183. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  184. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/entity-runtime.md +0 -0
  185. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/evidence.md +0 -0
  186. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/limits.md +0 -0
  187. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/manual_testing.md +0 -0
  188. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/mcp-worker.md +0 -0
  189. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/proposal.md +0 -0
  190. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/provenance.md +0 -0
  191. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/snapshots.md +0 -0
  192. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/docs/workflow-bundles.md +0 -0
  193. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/01_hello_world.py +0 -0
  194. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/02_ask_user.py +0 -0
  195. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/03_wait_until.py +0 -0
  196. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/04_multi_step.py +0 -0
  197. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/05_persistence.py +0 -0
  198. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/06_llm_integration.py +0 -0
  199. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/07_react_agent.py +0 -0
  200. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/examples/README.md +0 -0
  201. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/scripts/backfill_diary_edges.py +0 -0
  202. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/__init__.py +0 -0
  203. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automation_queries.py +0 -0
  204. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/__init__.py +0 -0
  205. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/adapters.py +0 -0
  206. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundle.py +0 -0
  207. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  208. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  209. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/automations/ledger.py +0 -0
  210. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/__init__.py +0 -0
  211. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/config.py +0 -0
  212. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
  213. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/event_keys.py +0 -0
  214. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/health.py +0 -0
  215. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/live_deltas.py +0 -0
  216. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/models.py +0 -0
  217. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/policy.py +0 -0
  218. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/progress_channel.py +0 -0
  219. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_attribution.py +0 -0
  220. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_identity.py +0 -0
  221. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
  222. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/spec.py +0 -0
  223. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/tool_scope.py +0 -0
  224. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/core/vars.py +0 -0
  225. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/__init__.py +0 -0
  226. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/charts.py +0 -0
  227. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/docx.py +0 -0
  228. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/documents/pdf.py +0 -0
  229. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/evidence/__init__.py +0 -0
  230. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/evidence/recorder.py +0 -0
  231. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/history_bundle.py +0 -0
  232. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/__init__.py +0 -0
  233. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/act_only.py +0 -0
  234. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/chat.py +0 -0
  235. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/communities.py +0 -0
  236. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/diary.py +0 -0
  237. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/digest.py +0 -0
  238. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
  239. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/fingerprint.py +0 -0
  240. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/lease.py +0 -0
  241. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/life.py +0 -0
  242. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/memory_reader.py +0 -0
  243. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/night_voice.py +0 -0
  244. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/phase_graph.py +0 -0
  245. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/phase_spec.py +0 -0
  246. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/prelude.py +0 -0
  247. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  248. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/reflection.py +0 -0
  249. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  250. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/substrate.py +0 -0
  251. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tool_effects.py +0 -0
  252. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tool_policy.py +0 -0
  253. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/tools.py +0 -0
  254. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
  255. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/__init__.py +0 -0
  256. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  257. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  258. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  259. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  260. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  261. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  262. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  263. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  264. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  265. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  266. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  267. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  268. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  269. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  270. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  271. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  272. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  273. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  274. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  275. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  276. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  277. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  278. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  279. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  280. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  281. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  282. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/__init__.py +0 -0
  283. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/active_context.py +0 -0
  284. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/active_memory.py +0 -0
  285. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/compaction.py +0 -0
  286. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/kg_packets.py +0 -0
  287. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/memact_composer.py +0 -0
  288. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/recall_levels.py +0 -0
  289. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/memory/token_budget.py +0 -0
  290. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/__init__.py +0 -0
  291. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  292. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
  293. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/__init__.py +0 -0
  294. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/convenience.py +0 -0
  295. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
  296. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/registry.py +0 -0
  297. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
  298. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/session_history.py +0 -0
  299. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/session_turns.py +0 -0
  300. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/__init__.py +0 -0
  301. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/artifacts.py +0 -0
  302. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/base.py +0 -0
  303. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/commands.py +0 -0
  304. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/in_memory.py +0 -0
  305. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/json_files.py +0 -0
  306. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/lease.py +0 -0
  307. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
  308. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
  309. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/observable.py +0 -0
  310. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/offloading.py +0 -0
  311. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/serialize.py +0 -0
  312. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/snapshots.py +0 -0
  313. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/sqlite.py +0 -0
  314. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  315. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/manual.py +0 -0
  316. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/triggers/schedule.py +0 -0
  317. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/turn_grounding.py +0 -0
  318. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/__init__.py +0 -0
  319. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/atomic_files.py +0 -0
  320. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/file_filters.py +0 -0
  321. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
  322. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  323. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  324. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  325. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  326. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  327. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  328. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  329. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  330. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  331. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  332. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  333. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  334. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  335. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  336. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  337. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  338. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  339. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  340. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  341. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  342. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  343. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  344. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  345. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  346. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
  347. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  348. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  349. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  350. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/README.md +0 -0
  351. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/automation_harness.py +0 -0
  352. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/conftest.py +0 -0
  353. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_discovery_facade.py +0 -0
  354. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_host_facade.py +0 -0
  355. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_run_facade.py +0 -0
  356. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_abstractcore_telegram_facade.py +0 -0
  357. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_active_context_policy.py +0 -0
  358. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_active_memory.py +0 -0
  359. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_agora_agent_alias_identity.py +0 -0
  360. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_agora_tools_http.py +0 -0
  361. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  362. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_answer_user_effect.py +0 -0
  363. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_artifacts.py +0 -0
  364. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_commands.py +0 -0
  365. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_controller.py +0 -0
  366. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_controller_recovery.py +0 -0
  367. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_discussion_isolation.py +0 -0
  368. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_growing_context.py +0 -0
  369. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_index.py +0 -0
  370. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_next_fire.py +0 -0
  371. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_occurrence_recovery.py +0 -0
  372. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_replay_read_only.py +0 -0
  373. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_retry.py +0 -0
  374. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_session_turns.py +0 -0
  375. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_automation_status.py +0 -0
  376. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_browser_probe_target_walling.py +0 -0
  377. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  378. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_capability_default_reasoning.py +0 -0
  379. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_chat_summarizer_integration.py +0 -0
  380. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_code_node_restricted_python.py +0 -0
  381. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_command_store.py +0 -0
  382. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_compaction_helpers.py +0 -0
  383. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_compaction_summarizer_route.py +0 -0
  384. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_config_facade_models_engines.py +0 -0
  385. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_control_adapter_while.py +0 -0
  386. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_controller_bundle_packaged.py +0 -0
  387. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_crash_ordering_inversions.py +0 -0
  388. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_create_if_absent.py +0 -0
  389. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_data_registry_facade.py +0 -0
  390. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_camera_gating.py +0 -0
  391. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_files.py +0 -0
  392. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_folders.py +0 -0
  393. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_include_skim_web.py +0 -0
  394. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_default_tools_search_files_executor.py +0 -0
  395. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_diary_capture.py +0 -0
  396. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_diary_write_rescue.py +0 -0
  397. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_directory_lease.py +0 -0
  398. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_disabled_toolsets_seam.py +0 -0
  399. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  400. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  401. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
  402. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_discussion_session_anchor.py +0 -0
  403. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_document_markdown_tables.py +0 -0
  404. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_document_renderers_hr_quote.py +0 -0
  405. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_durable_toolsets.py +0 -0
  406. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_durable_write_discipline.py +0 -0
  407. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  408. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_cancellation.py +0 -0
  409. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_issuance_idempotency.py +0 -0
  410. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  411. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_election_consequence_teaching.py +0 -0
  412. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emergence_experiment.py +0 -0
  413. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emit_event_uses_wait_index.py +0 -0
  414. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
  415. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_endpoint_profile_route_context.py +0 -0
  416. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_awake_memory_fixes.py +0 -0
  417. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_brain_effects.py +0 -0
  418. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_chat_driver.py +0 -0
  419. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_chat_tools_reflection.py +0 -0
  420. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_diary.py +0 -0
  421. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_execute_tool.py +0 -0
  422. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_fetch_url_tool.py +0 -0
  423. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_history_window.py +0 -0
  424. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_life_loop.py +0 -0
  425. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_memory_richness.py +0 -0
  426. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_phase_graph_conformance.py +0 -0
  427. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_react_visit_window.py +0 -0
  428. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_recent_memories.py +0 -0
  429. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_runtime.py +0 -0
  430. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_search_memory.py +0 -0
  431. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  432. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_substrate_resolution.py +0 -0
  433. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_visit_honesty.py +0 -0
  434. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_workspace_cap.py +0 -0
  435. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_entity_workspace_tools.py +0 -0
  436. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_event_wait_index.py +0 -0
  437. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_evidence_recorder.py +0 -0
  438. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  439. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_execute_command_output_offload.py +0 -0
  440. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_execution_capability_discovery.py +0 -0
  441. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_explicit_eject_other_clients.py +0 -0
  442. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_factory_default_retry_policy.py +0 -0
  443. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  444. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_format_repair_nudge.py +0 -0
  445. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_fresh_install_no_provider.py +0 -0
  446. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_gateway_facades_c4899.py +0 -0
  447. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_git_read_only_refiner.py +0 -0
  448. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_hf_process_residency_merge.py +0 -0
  449. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_history_window_multimodal.py +0 -0
  450. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_hot_path_store_reads.py +0 -0
  451. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_indexed_idempotency_lookup.py +0 -0
  452. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_integration_abstractcore.py +0 -0
  453. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_integrations_abstractcore.py +0 -0
  454. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_file_run_store_children_index.py +0 -0
  455. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_run_cache_bound.py +0 -0
  456. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_json_store_scan_memo.py +0 -0
  457. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_jsonl_ledger_recovery.py +0 -0
  458. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
  459. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_chain.py +0 -0
  460. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_record_slimming.py +0 -0
  461. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_ledger_subscription.py +0 -0
  462. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_live_token_deltas.py +0 -0
  463. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
  464. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  465. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  466. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  467. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_requires_prompt.py +0 -0
  468. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
  469. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
  470. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_text_phase_progress.py +0 -0
  471. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  472. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  473. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  474. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_grounding_tail.py +0 -0
  475. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_media_artifacts.py +0 -0
  476. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_system_context.py +0 -0
  477. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
  478. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_retry_classification.py +0 -0
  479. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_llm_streaming_on_token.py +0 -0
  480. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_helper_tool_exposure.py +0 -0
  481. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_residency_host_sweep.py +0 -0
  482. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  483. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_max_iterations_ceiling.py +0 -0
  484. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_remote_tool_executor.py +0 -0
  485. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_logging.py +0 -0
  486. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_security.py +0 -0
  487. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mcp_worker_stdio.py +0 -0
  488. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_artifact_resolution.py +0 -0
  489. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_capability_default_routing.py +0 -0
  490. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_media_subprocess.py +0 -0
  491. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memact_composer_from_kg_result.py +0 -0
  492. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_appraise_handler.py +0 -0
  493. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_communities.py +0 -0
  494. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  495. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_packets.py +0 -0
  496. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  497. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  498. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  499. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  500. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_note_effect.py +0 -0
  501. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_query_effect.py +0 -0
  502. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_query_rich_filters.py +0 -0
  503. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  504. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_seam_handlers.py +0 -0
  505. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
  506. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_memory_tag_effect.py +0 -0
  507. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mlx_generation_serialization.py +0 -0
  508. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_mlx_process_residency_merge.py +0 -0
  509. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_eject_cancel.py +0 -0
  510. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_clean_switch.py +0 -0
  511. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_control_plane.py +0 -0
  512. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  513. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_multi_store_scheduler.py +0 -0
  514. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
  515. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_mlx_application_wiring.py +0 -0
  516. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
  517. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_native_tool_channel.py +0 -0
  518. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_night_voice.py +0 -0
  519. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
  520. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offload_answer_chain_c4978.py +0 -0
  521. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  522. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_offloading.py +0 -0
  523. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
  524. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pause_resume.py +0 -0
  525. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pdf_unicode_rendering.py +0 -0
  526. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_personal_cycle.py +0 -0
  527. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phantom_attachment_index.py +0 -0
  528. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_graph_artifact_control.py +0 -0
  529. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_graph_obedience.py +0 -0
  530. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_phase_vocabulary_migration.py +0 -0
  531. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  532. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_export_import.py +0 -0
  533. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  534. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_modules.py +0 -0
  535. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  536. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  537. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_prompt_overlay.py +0 -0
  538. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  539. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_provider_pin_routing_isolation.py +0 -0
  540. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_queryable_run_store.py +0 -0
  541. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  542. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_read_idle_threading.py +0 -0
  543. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_readoption_experiment.py +0 -0
  544. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_real_integration.py +0 -0
  545. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_realize_election.py +0 -0
  546. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_recall_levels_policy.py +0 -0
  547. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_client_cancel.py +0 -0
  548. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_llm_client.py +0 -0
  549. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_remote_speculation_defaults.py +0 -0
  550. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_rendering_agent_trace_report.py +0 -0
  551. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_rendering_json_stringify.py +0 -0
  552. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_report_branding.py +0 -0
  553. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_resume_concurrent_same_wait.py +0 -0
  554. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_retry_idempotency.py +0 -0
  555. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_history_bundle.py +0 -0
  556. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_index_workspace_root.py +0 -0
  557. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_mutation_lock.py +0 -0
  558. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_scoped_tool_policy.py +0 -0
  559. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_run_tool_scope_ceiling.py +0 -0
  560. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_browser_session_boundary.py +0 -0
  561. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  562. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  563. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
  564. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  565. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_install_boundary.py +0 -0
  566. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  567. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_node_traces.py +0 -0
  568. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  569. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_runtime_tick_step_gate.py +0 -0
  570. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_scheduler.py +0 -0
  571. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  572. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_history.py +0 -0
  573. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_prompt_cache_attribution.py +0 -0
  574. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_prompt_cache_visibility.py +0 -0
  575. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_route_stamp.py +0 -0
  576. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_session_start_cost.py +0 -0
  577. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_shell_tool_exposure.py +0 -0
  578. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_snapshots.py +0 -0
  579. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_speculation_inheritance.py +0 -0
  580. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
  581. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_sqlite_ledger_store.py +0 -0
  582. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_async_wait.py +0 -0
  583. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  584. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  585. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_steer_sidecar.py +0 -0
  586. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_storage_deletion.py +0 -0
  587. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_structured_output_schema_enum.py +0 -0
  588. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_subworkflow.py +0 -0
  589. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_terminal_effect_completion.py +0 -0
  590. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  591. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_thinking_inheritance.py +0 -0
  592. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  593. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_executor.py +0 -0
  594. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_resume_executes.py +0 -0
  595. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
  596. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
  597. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_descriptor_registry.py +0 -0
  598. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
  599. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_error_output_detection.py +0 -0
  600. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_filename_alias.py +0 -0
  601. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  602. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
  603. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_executor_timeout.py +0 -0
  604. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_inventory_facade.py +0 -0
  605. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_invoke_effect.py +0 -0
  606. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_policy_and_mounts.py +0 -0
  607. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
  608. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_topic_election_world_model.py +0 -0
  609. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trace_context_propagation.py +0 -0
  610. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_trigger_schedule_math.py +0 -0
  611. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_turn_grounding_byte_stability.py +0 -0
  612. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
  613. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_vars_query_effect.py +0 -0
  614. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_ab_fixture.py +0 -0
  615. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_midturn_elections.py +0 -0
  616. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_midturn_resume.py +0 -0
  617. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visit_workflow.py +0 -0
  618. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  619. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  620. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  621. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  622. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  623. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  624. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_entity_memory_nodes.py +0 -0
  625. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  626. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_llm_call_partial_override.py +0 -0
  627. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  628. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memact_compose_node.py +0 -0
  629. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  630. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  631. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  632. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  633. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  634. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_add_message_builtin.py +0 -0
  635. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  636. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_agora_react_agent.py +0 -0
  637. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_call_tool_node.py +0 -0
  638. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  639. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_compiler_basic.py +0 -0
  640. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  641. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_continue_on_error.py +0 -0
  642. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  643. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  644. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  645. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_function_library.py +0 -0
  646. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_element_node.py +0 -0
  647. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_random_element_node.py +0 -0
  648. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_get_var_node.py +0 -0
  649. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
  650. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  651. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  652. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_make_object_node.py +0 -0
  653. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_media_nodes.py +0 -0
  654. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  655. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_memory_source_pins.py +0 -0
  656. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_pin_expressions.py +0 -0
  657. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_prompt_only.py +0 -0
  658. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_random_nodes.py +0 -0
  659. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
  660. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_string_contains_replace.py +0 -0
  661. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
  662. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_voice_openai_api_key_path.py +0 -0
  663. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_w4_feelings_lens.py +0 -0
  664. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_event_deadline.py +0 -0
  665. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_event_prompt_metadata.py +0 -0
  666. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_until_streak.py +0 -0
  667. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_wait_until_utc_normalization.py +0 -0
  668. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workflow_bundle_registry.py +0 -0
  669. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_builtin_deny.py +0 -0
  670. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  671. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  672. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  673. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  674. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_workspace_prompt_context.py +0 -0
  675. {abstractruntime-0.7.2 → abstractruntime-0.8.0}/tests/test_write_chart.py +0 -0
@@ -56,7 +56,17 @@ jobs:
56
56
  tests/test_budget_law_no_unrequested_caps.py \
57
57
  tests/test_discovery_voice_openai_api_key.py \
58
58
  tests/test_voice_openai_api_key_path.py \
59
- tests/test_discovery_tts_unavailable_reason.py
59
+ tests/test_discovery_tts_unavailable_reason.py \
60
+ tests/test_abstractcore_comms_facade.py \
61
+ tests/test_abstractcore_discovery_facade.py \
62
+ tests/test_automation_definition.py \
63
+ tests/test_automation_tool_approval.py \
64
+ tests/test_default_tools_comms_gating.py \
65
+ tests/test_every_path_bearing_tool_is_walled.py \
66
+ tests/test_packaging_extras.py \
67
+ tests/test_tool_catalog.py \
68
+ tests/test_trigger_registry.py \
69
+ tests/test_workspace_read_only.py
60
70
 
61
71
  build:
62
72
  name: Build distributions
@@ -11,7 +11,7 @@ The canonical dependency list lives in `pyproject.toml`.
11
11
  - **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
12
12
 
13
13
  ## Runtime integrations
14
- - **abstractcore** (`abstractcore>=2.19.0`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
14
+ - **abstractcore** (`abstractcore>=2.19.2`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
15
15
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
16
16
  - The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
17
17
  - **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
@@ -7,6 +7,150 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] - 2026-09-30
11
+
12
+ ### Added
13
+
14
+ - **Email for each user** (see `docs/email.md`). A run acts for one account: its non-secret binding
15
+ `_runtime.email_account = {account_ref, address}` is resolved at the moment a tool needs it through the host's
16
+ per-runtime resolver (`Runtime.set_email_context_resolver(fn)`), so credentials never enter run vars, the ledger,
17
+ tool arguments or results. `Runtime.set_email_binding(...)` binds automation occurrences; hosts set root runs with
18
+ `bind_email_account(...)` after `strip_client_email_keys(...)`. Child runs inherit the binding and the
19
+ pre-authorised recipients (the parent's value wins). Once a runtime has a resolver, AbstractCore's email tools in
20
+ that process never fall back to the local AbstractCore settings.
21
+ - **`send_email_recipient@v2` approval refiner.** A `send_email` runs without an approval wait only when every
22
+ recipient is the registered address (`_runtime.operator_email`) or is listed in `_runtime.email_allowed_recipients`;
23
+ `reply_email`, unknown argument keys and anything unproven ask. The account's recipient policy and send limits
24
+ (AbstractCore `guarded_send`) still apply to every send.
25
+ - **Durable event inbox and mail feeder** (`abstractruntime.email`): `JsonFileEventInbox` / `InMemoryEventInbox`
26
+ (append-only, unique event ids, per-stream dedupe keys and state, crash-repaired index), attached with
27
+ `Runtime.set_event_inbox(...)`; `EmailInboxFeeder.poll(ctx)` appends each new message whole, advances its
28
+ UIDVALIDITY + UID cursor only after a durable append, resynchronises after a folder rebuild without loss or
29
+ duplicates, passes a message that fails three polls, and reports connection failures as typed
30
+ `{code, cause, fix, retryable}` with a capped backoff (60 s to 15 min). `email_trigger_consumers(...)` and
31
+ `wake_email_automations(...)` serve the host's watcher.
32
+ - **`email.received@1` trigger source.** Typed filters (`from_in`, `from_domain_in`, `to_in`, `subject_contains`,
33
+ `has_attachment`), batches no more often than `every` (default `1h` for automations that run a model, `60s`
34
+ otherwise; at least `60s`), up to `max_batch` messages, each message at most once per automation across restarts
35
+ and folder rebuilds. Occurrences receive the messages as `input_data.trigger` marked `content_trust: "untrusted"`
36
+ and, for a string `prompt`, inside a fixed untrusted frame whose markers carry a boundary token drawn at random
37
+ for each occurrence (a body cannot fake the end of its email). The messages and the framed prompt are stored as
38
+ artifacts at admission: `automation.admitted`, `pending_occurrence` and the dispatch effect carry refs, metadata and
39
+ event ids, never bodies, and the occurrence run resolves the refs when it starts. Creating this trigger on a
40
+ runtime without an artifact store is refused (`unsupported_feature`).
41
+ - **Send-email action** (`abstractframework.email-actions@1.0.0:send_email`, `register_email_action_workflow`,
42
+ `email_action_target`): automations without a model send templated mail (fixed placeholders, `each` or `digest`
43
+ mode) through an ordinary `send_email` tool call, under the same approval rule, policy and limits.
44
+ - **Automation definition schema v2**: `policy.email_allowed_recipients` (`"self"` and exact addresses, default
45
+ `["self"]`, frozen into each occurrence) and `notify.channels` (`["console"]` or `["console", "email"]`), which
46
+ attention items carry as `channels`. Stored v1 definitions read with the defaults.
47
+ - **Email tools follow the host's decision**: `email_enabled=` on `get_default_toolsets`, `get_default_tools`,
48
+ `list_default_tool_specs`, `build_default_tool_map` and `list_tool_catalog`; the email kind adds `reply_email`,
49
+ `search_emails`, `get_email_attachment` and the read-only `list_email_folders`.
50
+ - **Oversized mail never blocks the feeder**: a message over AbstractCore's reading limit is appended with its headers,
51
+ attachment list and typed `body_skipped` record (bodies `null`, never cut), listed in `PollReport.body_skipped`,
52
+ passed to occurrences in `input_data.trigger.emails[].body_skipped` and shown as `Body (not fetched)` in the frame.
53
+ - **The resolver learns who is sending** (`use="agent_tool"` or `use="action"`), so a host applies its users'
54
+ "agent email tools" choice to agent tools only; the send-email action is identified by its node function.
55
+ - **`email_facade`** (`abstractruntime.integrations.abstractcore.email_facade`): AbstractCore's mail library for hosts.
56
+ - **Event-inbox retention**: `EventInboxRetention` (default 90 days and 10,000 events), `inbox.prune(...)` and
57
+ `prune_email_inbox(runtime, retention=...)`, which never removes an event an active email automation has not read.
58
+ - **`policy.untrusted_input_tools`**: tools named one by one that an email-triggered occurrence may run without asking
59
+ although "allow all tools" does not cover them there; message-sending tools are never granted this way.
60
+ - **`START_SUBWORKFLOW` `payload.resolve_vars`**: top-level vars whose artifact refs are resolved for the child only
61
+ (strict: a missing artifact fails the start), so the parent's ledger and node traces keep the refs.
62
+ - **Tool facts for untrusted input** (`tool_effects`): `TOOL_NETWORK_REACH` (`none`, `configured`, `open`, `send`) and
63
+ `TOOL_WRITE_SCOPE` (`workspace`, `workspace_only_mode`, `host`, and for the memory tools `run` and `memory`) for
64
+ every tool the runtime exposes, with `untrusted_input_grantable(...)`.
65
+ - `list_tool_catalog(email_off_reason=...)` names why email is off (`not_connected`, `admin_disabled`,
66
+ `not_available` — the administrator has not made agent email tools available to this user — and `agent_tools_off`).
67
+
68
+ ### Changed
69
+
70
+ - **Requires AbstractCore 2.20.0 or newer** (`abstractcore.comms.email`, the email tools on a per-run resolver).
71
+ - **Email-triggered automations act only within the user's mission** (operator decision 2026-09-30). Under
72
+ "allow all tools", an automation triggered by `email.received@1` grants by kind, decided on tool facts and never on
73
+ names: only tools with no network egress beyond configured services, no code or command execution, no message
74
+ sending, no writes outside the run's workspace and no delegation run unattended (file reads, workspace-confined
75
+ file writes, mailbox reads, `get_email_attachment`, `recall_memory` and `update_plan`). `fetch_url`,
76
+ `browser_probe`, `skim_url`, `skim_websearch`, `web_search`, `execute_command`, `shell_exec`, `execute_python`,
77
+ `delegate_agent`, `channel_fs_write`, `agora_post_message`, `agora_send_dm`, the camera tools, the memory-writing
78
+ tools (`remember`, `remember_note` including `scope: "global"`, `compact_memory`: they write the user's lasting
79
+ memory, outside the run's workspace, so a stranger's email cannot plant a note later runs obey), MCP tools and
80
+ every other tool ask, unless the user named them one by one in `policy.untrusted_input_tools`; message-sending
81
+ tools (`send_email`, `reply_email`, `agora_post_message`, `agora_send_dm`, WhatsApp and Telegram sends) are never
82
+ granted, named or not. Schedule and manual automations keep the full grant. `reply_email` is withheld like
83
+ `send_email` everywhere.
84
+ - **Email-triggered automations under "ask" run nothing unasked** (re-gate 2026-09-30). Their occurrences always carry
85
+ a per-run tool policy: under `policy.tool_approval: "ask"` it auto-approves only the tools the user named in
86
+ `policy.untrusted_input_tools` (sending tools never) and requires approval for every other tool, so neither the
87
+ executor's static defaults (which auto-run `skim_url`, `web_search`, the agora posts and the Telegram sends) nor a
88
+ per-call refiner decide there. The policy replaces any `tool_policy` the target inputs carried
89
+ (`replaced_target_policy: true`) and is marked `untrusted_input: true`, beside the run flag
90
+ `_runtime.untrusted_input`. Child runs inherit both, the parent's value winning over the child's own. Defence in
91
+ depth: for a run with that flag the approval executor never consults its static policy or a tier ceiling, runs a
92
+ listed tool unasked only when the user named it or (under "auto") its facts pass `untrusted_input_allow_all`,
93
+ never runs a sending tool unasked, and applies the per-call refiners only under "auto".
94
+ - `send_email` / `reply_email` `attachments` and `get_email_attachment`'s `output_dir` are confined to the run's
95
+ workspace in every workspace access mode (ignored paths and the host's protection still apply);
96
+ `get_email_attachment` is a `write` tool.
97
+ - A run policy that only withholds tools (`tool_policy.withheld_tools`) is applied like any other run policy, so the
98
+ per-call refiners run for it.
99
+ - The per-call refiners (`send_email_recipient@v2`) also run when a run carries no `_runtime.tool_policy`, on top of
100
+ the executor's static policy (its `require_approval_tools` still wins), and decide per call: one `send_email` that
101
+ needs a person makes the batch wait.
102
+ - No environment variable enables the email tools: `ABSTRACT_ENABLE_EMAIL_TOOLS` is gone and
103
+ `ABSTRACT_ENABLE_COMMS_TOOLS` enables WhatsApp and Telegram only; pass `email_enabled=True`.
104
+ - The untrusted frame tells the agent not to follow links or instructions contained in the emails and to act only
105
+ on the automation's mission.
106
+ - After a folder rebuild with nothing to resynchronise, the feeder stores the new baseline AbstractCore returns
107
+ (`reset` and `baseline`) instead of fetching one itself.
108
+ - Large structured tool outputs (for example a `read_email` with a big HTML body) are offloaded to session
109
+ attachments under the same inline limit as text outputs; the result carries artifact references.
110
+ - The process-local email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`) are no longer
111
+ exported from `abstractruntime.integrations.abstractcore`; they remain on the host facade for single-user installs.
112
+
113
+ ### Removed
114
+
115
+ - `emails.config.example.yaml` (environment-variable email setup) is no longer shipped; email is configured through
116
+ the host's per-user settings.
117
+
118
+ ## [0.7.3] - 2026-09-29
119
+
120
+ ### Security
121
+
122
+ - **An automation's tool grant no longer pre-approves sending messages** (framework backlog 0992
123
+ WP0). With the default `policy.tool_approval: "auto"`, the grant listed every tool the runtime
124
+ classifies, `send_email` included, and an explicit name in the grant overrides the
125
+ `model_controlled_destination` belt: an occurrence that read an inbound email or a web page could
126
+ mail data to any address that text named. The grant now withholds every tool whose inventory row
127
+ carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
128
+ `send_telegram_artifact`), even when the target's `allowed_tools` names it, and lists them in
129
+ `tool_policy.withheld_tools`. Their calls take the normal approval point: a `send_email` whose
130
+ every recipient is the registered user's address (`_runtime.operator_email`) still runs
131
+ unattended; any other recipient parks the occurrence on a `tool_approval` wait until a person
132
+ approves or refuses it (the behaviour of `"ask"`). Recipients named in an automation's definition
133
+ are not auto-approved yet; that allowlist is part of backlog 0992.
134
+
135
+ ### Fixed
136
+
137
+ - **A resident image/video model serves generation.** After `load_model_residency(task="image_generation")`
138
+ (the Gateway's `POST /models/load`, the console Load button, a flow's model residency node), a local
139
+ image or video request whose every media output names a resident model runs in-process on the loaded
140
+ pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`) instead of loading the model
141
+ again in a one-shot subprocess. Measured through AbstractGateway with FLUX.2 [klein] 4B on a 16 GB
142
+ NVIDIA card: 17-19 s per image on the resident pipeline against 54-59 s with a reload per request, and
143
+ no second copy of the weights on the GPU. Pooled clients of `create_local_runtime(...)` use their pool's residency core. Models that
144
+ were not explicitly loaded keep the isolated subprocess (crash isolation for native Metal/CUDA
145
+ failures), so the explicit load is the opt-in.
146
+
147
+ ### Changed
148
+
149
+ - **Requires AbstractCore 2.19.2 or newer** (`abstractcore`, `abstractcore[apple]`, `abstractcore[gpu]`).
150
+ It brings AbstractVision 0.3.33, whose loads report `loaded_new` (a fresh image-model load reads as
151
+ `loaded`, not `already_loaded`) and whose unload frees the model's memory, which the resident path
152
+ above relies on.
153
+
10
154
  ## [0.7.2] - 2026-09-29
11
155
 
12
156
  ### Changed
@@ -27,6 +27,30 @@ Inside the AbstractFramework workspace, prefer `python -P -m pytest tests -q`: `
27
27
 
28
28
  If you cloned **only** this repo (without the AbstractFramework workspace), make sure the sibling packages above are importable (install them or clone them next to this repo) before running the full test suite.
29
29
 
30
+ ### Live email tests (opt-in)
31
+
32
+ `tests/live_email/` runs the email integration against a **real test mailbox** (framework backlog 0992 WP2): an
33
+ `email.received@1` automation admits one uniquely tagged self-sent message exactly once (not again on a second poll,
34
+ a later wake or a restarted runtime), and a `send_email` tool call to the account's own address runs unattended while
35
+ one to another address parks on a `tool_approval` wait and is never sent. The tests carry the `live_email` marker, are
36
+ not `basic` (CI never selects them), and are skipped unless every variable below is set.
37
+
38
+ The test harness reads the mailbox from environment variables (the tests' input only; the runtime still gets its
39
+ account from the host resolver): `AF_TEST_EMAIL_IMAP_HOST`, `AF_TEST_EMAIL_IMAP_PORT`, `AF_TEST_EMAIL_IMAP_SECURITY`,
40
+ `AF_TEST_EMAIL_SMTP_HOST`, `AF_TEST_EMAIL_SMTP_PORT`, `AF_TEST_EMAIL_SMTP_SECURITY`, `AF_TEST_EMAIL_USERNAME`,
41
+ `AF_TEST_EMAIL_ADDRESS`, `AF_TEST_EMAIL_PASSWORD`. Keep them in a private file (mode 0600) and load it into the test
42
+ process only:
43
+
44
+ ```bash
45
+ set -a; . ~/.config/abstractframework-test/email.env; set +a; \
46
+ python -P -m pytest tests/live_email -m live_email -s --durations=0
47
+ ```
48
+
49
+ No credential value is printed (redacting objects, scrubbed failure reports), mail only goes to the test account's
50
+ own address (a guard refuses any other recipient before `MAIL FROM`), and messages are small and tagged
51
+ `[af-live-test]`: the mailbox is read-only, so nothing can be cleaned up. Use a dedicated test mailbox. AbstractCore's
52
+ `tests/email/live/` covers the mail library itself.
53
+
30
54
  ## Repo map (source of truth)
31
55
 
32
56
  - Public exports: `src/abstractruntime/__init__.py` (keep this consistent with `docs/api.md`)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.19.0
23
+ Requires-Dist: abstractcore>=2.20.0
24
24
  Requires-Dist: abstractmemory>=0.3.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
@@ -35,16 +35,17 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
35
35
  Requires-Dist: restrictedpython>=7.0
36
36
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
37
37
  Provides-Extra: apple
38
- Requires-Dist: abstractcore[apple]>=2.19.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.20.0; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[gpu]>=2.19.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.20.0; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
+ Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
48
49
  Requires-Dist: pytest>=7.0.0; extra == 'test'
49
50
  Description-Content-Type: text/markdown
50
51
 
@@ -54,7 +55,7 @@ Description-Content-Type: text/markdown
54
55
 
55
56
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
56
57
 
57
- **Version:** 0.7.2 • **Python:** 3.10+
58
+ **Version:** 0.8.0 • **Python:** 3.10+
58
59
 
59
60
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
60
61
 
@@ -82,7 +83,7 @@ Remote-light runtime:
82
83
  pip install abstractruntime
83
84
  ```
84
85
 
85
- The base install includes AbstractCore 2.19.0 or newer (its light install:
86
+ The base install includes AbstractCore 2.20.0 or newer (its light install:
86
87
  remote providers, tools, vision, voice, audio, and music integration), plus the
87
88
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
88
89
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -146,7 +147,7 @@ state = rt.resume(
146
147
  assert state.status.value == "completed"
147
148
  ```
148
149
 
149
- ## What’s included (v0.7.2)
150
+ ## What’s included (v0.8.0)
150
151
 
151
152
  Kernel (import-light):
152
153
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -158,7 +159,7 @@ Kernel (import-light):
158
159
  - Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
159
160
  - host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
160
161
  - run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
161
- - automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
162
+ - automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals), when mail arrives (`email.received@1`, `docs/email.md`) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
162
163
  - explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
163
164
 
164
165
  Durability + storage:
@@ -239,6 +240,7 @@ sr = create_scheduled_runtime(
239
240
  | [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
240
241
  | [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
241
242
  | [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
243
+ | [Email](docs/email.md) | Email for each user: run-scoped account binding, sending without asking, the event inbox and mail feeder, the `email.received@1` trigger, the send-email action |
242
244
  | [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
243
245
  | [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
244
246
  | [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.7.2 • **Python:** 3.10+
7
+ **Version:** 0.8.0 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -32,7 +32,7 @@ Remote-light runtime:
32
32
  pip install abstractruntime
33
33
  ```
34
34
 
35
- The base install includes AbstractCore 2.19.0 or newer (its light install:
35
+ The base install includes AbstractCore 2.20.0 or newer (its light install:
36
36
  remote providers, tools, vision, voice, audio, and music integration), plus the
37
37
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
38
38
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -96,7 +96,7 @@ state = rt.resume(
96
96
  assert state.status.value == "completed"
97
97
  ```
98
98
 
99
- ## What’s included (v0.7.2)
99
+ ## What’s included (v0.8.0)
100
100
 
101
101
  Kernel (import-light):
102
102
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -108,7 +108,7 @@ Kernel (import-light):
108
108
  - Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
109
109
  - host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
110
110
  - run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
111
- - automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
111
+ - automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals), when mail arrives (`email.received@1`, `docs/email.md`) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
112
112
  - explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
113
113
 
114
114
  Durability + storage:
@@ -189,6 +189,7 @@ sr = create_scheduled_runtime(
189
189
  | [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
190
190
  | [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
191
191
  | [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
192
+ | [Email](docs/email.md) | Email for each user: run-scoped account binding, sending without asking, the event inbox and mail feeder, the `email.received@1` trigger, the send-email action |
192
193
  | [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
193
194
  | [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
194
195
  | [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
@@ -28,14 +28,15 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
28
28
  - `artifacts.md` — Runtime artifact identity, descriptors, provenance, catalog search, and access stats
29
29
  - `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, the `config_facade` models/engines/host-jobs passthroughs for hosts, cached sessions with per-session prompt-cache listing/clearing, host memory snapshots, model-residency listings, locks and model switching, live token streaming, workspace-scoped tools, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
30
30
  - `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
31
- - `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.0 or newer is part of the base install).
305
+ Requires: `pip install abstractruntime` (AbstractCore 2.20.0 or newer is part of the base install).
281
306
 
282
307
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
283
308
 
@@ -285,7 +310,7 @@ Entry points:
285
310
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
286
311
  - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
287
312
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
288
- - 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
315
  - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
291
316
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
@@ -298,7 +323,7 @@ Entry points:
298
323
  - the `MODEL_RESIDENCY` effect supports `list_loaded`, `load`, `unload`, `lock`, and `unlock` operations with the same soft-fail semantics; on `unload`, `force` is forwarded only when authored in the effect payload
299
324
  - local `list_model_residency` merges AbstractCore's host-wide loaded-model sweep into text-generation listings (sweep-only rows carry `source: "provider_server"` and no `task` label), and residency rows normalize provider size extras to `size_bytes` / `size_vram_bytes` while keeping the originals; local text rows also carry registry-declared `modalities` (omitted on a registry miss), host identity (`host_id` / `host_name`), and runtime-owned lock truth (`locked` / `lockable`, with `pinned` a truthful alias of `locked` — never the default-identity flag, which `default` alone carries), while remote listings keep the Core server's row identity
300
325
  - host-local prompt-cache export/import admin also lives on the host facade and client delegation layer (`list_prompt_cache_exports`, `prompt_cache_export`, `prompt_cache_import`) and is intentionally local-only
301
- - host-facade email helpers 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
@@ -324,7 +349,8 @@ Multimodal support:
324
349
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
325
350
  - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
326
351
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
327
- - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and generated image/video tasks also report `execution_mode="local_one_shot_subprocess"`
352
+ - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
353
+ - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
328
354
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
329
355
 
330
356
  Prompt cache / cached sessions:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-09-29
4
- > Version: 0.7.2
4
+ > Version: 0.8.0
5
5
  > Scope: this describes **what is implemented in this repository**.
6
6
 
7
7
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -332,7 +332,8 @@ flowchart LR
332
332
  subgraph Automations["automations/ + triggers/"]
333
333
  Commands["apply_automation_command"]
334
334
  Controller["controller run<br/>(automation-controller@1.0.0)"]
335
- Triggers["trigger registry<br/>schedule@1, manual@1,<br/>entry-point sources"]
335
+ Triggers["trigger registry<br/>schedule@1, manual@1, email.received@1,<br/>entry-point sources"]
336
+ Inbox["event inbox<br/>(email/, filled by the host's watcher)"]
336
337
  Queries["get_automation / list_occurrences /<br/>list_attention / pending_waits /<br/>list_automations"]
337
338
  end
338
339
  subgraph Runs["runs"]
@@ -351,6 +352,7 @@ flowchart LR
351
352
  Loop --> Controller
352
353
  Loop --> Occ
353
354
  Controller -->|"prepare / admit / rearm"| Triggers
355
+ Controller -->|"events after its cursor"| Inbox
354
356
  Controller -->|"START_SUBWORKFLOW run_id"| Occ
355
357
  Occ --> Desc
356
358
  Controller --> RS
@@ -361,6 +363,11 @@ flowchart LR
361
363
  Queries --> LS
362
364
  ```
363
365
 
366
+ Email automations read the runtime's durable event inbox: the host's mail watcher appends each new message
367
+ (`abstractruntime.email.feeder`) and wakes the controller, and the `email.received@1` adapter batches the messages
368
+ after the automation's cursor. Tool calls resolve the executing run's email account through the host's per-runtime
369
+ resolver at call time. See [email.md](email.md).
370
+
364
371
  Invariants the design rests on:
365
372
 
366
373
  - **Create-if-absent.** Controllers, occurrences and discussions are created under explicit ids through
@@ -409,6 +416,7 @@ AbstractRuntime includes a compiler and a portable bundle format:
409
416
  - `getting-started.md` — first steps
410
417
  - `api.md` — public API surface (imports + pointers)
411
418
  - `automations.md` — automations: controller, triggers, commands, context, discussions, storage guarantees
419
+ - `email.md` — email accounts per run, the event inbox, the `email.received@1` trigger, the send-email action
412
420
  - `limits.md` — `_limits` and RuntimeConfig
413
421
  - `snapshots.md` — snapshot/bookmark stores
414
422
  - `provenance.md` — hash chain and verification
@@ -105,7 +105,12 @@ Offload applies to:
105
105
  - `read_file` content above the inline threshold;
106
106
  - `execute_command` `stdout` and `stderr`, regardless of exit code (verbose
107
107
  failures are offloaded like verbose successes);
108
- - any other host tool whose string output exceeds the inline threshold.
108
+ - any other host tool whose string output exceeds the inline threshold;
109
+ - any other host tool whose structured (dict) output exceeds the inline threshold as JSON: its largest string
110
+ values, at any depth, are stored one by one (largest first) until the output fits, each replaced by
111
+ `{"$artifact": id, "offloaded": true, "bytes": n, "open": "open_attachment(...)"}`; when many small values make
112
+ it too large, the whole output is stored as one JSON attachment and replaced by its reference. The result lists
113
+ the stored ids in `output_offloaded_artifact_ids`, and reading the run back resolves the references.
109
114
 
110
115
  Thresholds (environment-configurable):
111
116