AbstractRuntime 0.8.0__tar.gz → 0.8.2__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 (676) hide show
  1. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/CHANGELOG.md +50 -0
  2. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/PKG-INFO +7 -7
  3. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/README.md +3 -3
  4. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/api.md +3 -2
  5. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/architecture.md +2 -2
  6. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/automations.md +1 -1
  7. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/email.md +20 -1
  8. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/getting-started.md +1 -1
  9. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/troubleshooting.md +1 -1
  10. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/llms-full.txt +31 -11
  11. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/llms.txt +2 -2
  12. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/pyproject.toml +4 -4
  13. abstractruntime-0.8.2/release-notes.md +11 -0
  14. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/commands.py +12 -3
  15. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/controller.py +4 -1
  16. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/binding.py +55 -5
  17. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/feeder.py +34 -1
  18. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +12 -4
  19. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/llm_client.py +104 -2
  20. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/run_facade.py +54 -9
  21. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/tool_executor.py +4 -0
  22. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/email_received.py +36 -2
  23. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/live_email/test_email_live_runtime.py +54 -0
  24. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_commands.py +66 -0
  25. abstractruntime-0.8.2/tests/test_email_self_trigger_loop.py +240 -0
  26. abstractruntime-0.8.2/tests/test_media_only_requests_skip_text_client.py +114 -0
  27. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_packaging_extras.py +3 -3
  28. abstractruntime-0.8.2/tests/test_send_email_self_default_policy.py +109 -0
  29. abstractruntime-0.8.0/release-notes.md +0 -105
  30. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/.github/workflows/ci.yml +0 -0
  31. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/.github/workflows/release.yml +0 -0
  32. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/.gitignore +0 -0
  33. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/ACKNOWLEDGMENTS.md +0 -0
  34. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/CODE_OF_CONDUCT.md +0 -0
  35. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/CONTRIBUTING.md +0 -0
  36. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/LICENSE +0 -0
  37. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/ROADMAP.md +0 -0
  38. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/SECURITY.md +0 -0
  39. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/README.md +0 -0
  40. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  41. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  42. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  43. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  44. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  45. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  46. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  47. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/adr/README.md +0 -0
  48. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/artifacts.md +0 -0
  49. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/README.md +0 -0
  50. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  51. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  52. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  53. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  54. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  55. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  56. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  57. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  58. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/003_wait_primitives.md +0 -0
  59. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  60. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  61. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  62. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  63. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  64. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  65. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  66. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  67. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/009_artifact_store.md +0 -0
  68. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  69. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  70. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  71. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  72. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  73. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  74. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  75. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  76. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  77. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  78. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  79. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  80. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  81. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  82. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  83. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  84. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  85. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  86. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  87. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  88. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  89. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  90. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  91. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  92. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  93. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/004_tests.md +0 -0
  94. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  95. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  96. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  97. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  98. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/README.md +0 -0
  99. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  100. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  101. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  102. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  103. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  104. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  105. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  106. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  107. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  108. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  109. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  110. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  111. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  112. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  113. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  114. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_portability/README.md +0 -0
  115. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  116. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  117. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  118. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  119. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  120. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  121. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  122. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  123. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  124. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  125. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  126. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  127. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  128. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  129. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  130. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  131. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  132. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  133. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  134. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  135. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  136. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  137. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  138. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  139. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  140. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  141. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  142. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  143. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  144. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/entity-runtime.md +0 -0
  145. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/evidence.md +0 -0
  146. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/faq.md +0 -0
  147. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/integrations/abstractcore.md +0 -0
  148. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/limits.md +0 -0
  149. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/manual_testing.md +0 -0
  150. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/mcp-worker.md +0 -0
  151. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/proposal.md +0 -0
  152. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/provenance.md +0 -0
  153. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/snapshots.md +0 -0
  154. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/tool-approval.md +0 -0
  155. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/tools-comms.md +0 -0
  156. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/docs/workflow-bundles.md +0 -0
  157. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/01_hello_world.py +0 -0
  158. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/02_ask_user.py +0 -0
  159. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/03_wait_until.py +0 -0
  160. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/04_multi_step.py +0 -0
  161. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/05_persistence.py +0 -0
  162. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/06_llm_integration.py +0 -0
  163. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/07_react_agent.py +0 -0
  164. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/examples/README.md +0 -0
  165. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/mkdocs.yml +0 -0
  166. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/pytest.ini +0 -0
  167. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/scripts/backfill_diary_edges.py +0 -0
  168. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/scripts/generate_llms_full.py +0 -0
  169. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/__init__.py +0 -0
  170. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automation_queries.py +0 -0
  171. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/__init__.py +0 -0
  172. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/adapters.py +0 -0
  173. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/attention.py +0 -0
  174. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/bundle.py +0 -0
  175. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  176. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  177. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/ledger.py +0 -0
  178. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/models.py +0 -0
  179. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/automations/service.py +0 -0
  180. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/__init__.py +0 -0
  181. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/config.py +0 -0
  182. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/effect_cancellation.py +0 -0
  183. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/event_keys.py +0 -0
  184. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/health.py +0 -0
  185. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/live_deltas.py +0 -0
  186. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/models.py +0 -0
  187. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/policy.py +0 -0
  188. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/progress_channel.py +0 -0
  189. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/run_attribution.py +0 -0
  190. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/run_identity.py +0 -0
  191. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/run_lifecycle.py +0 -0
  192. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/runtime.py +0 -0
  193. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/spec.py +0 -0
  194. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/tool_scope.py +0 -0
  195. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/core/vars.py +0 -0
  196. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/documents/__init__.py +0 -0
  197. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/documents/charts.py +0 -0
  198. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/documents/docx.py +0 -0
  199. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/documents/pdf.py +0 -0
  200. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/__init__.py +0 -0
  201. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/actions.py +0 -0
  202. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/automations.py +0 -0
  203. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/frame.py +0 -0
  204. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/email/inbox.py +0 -0
  205. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/evidence/__init__.py +0 -0
  206. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/evidence/recorder.py +0 -0
  207. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/history_bundle.py +0 -0
  208. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/__init__.py +0 -0
  209. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/act_only.py +0 -0
  210. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/chat.py +0 -0
  211. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/communities.py +0 -0
  212. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/diary.py +0 -0
  213. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/digest.py +0 -0
  214. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/entity_runtime.py +0 -0
  215. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/fingerprint.py +0 -0
  216. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/lease.py +0 -0
  217. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/life.py +0 -0
  218. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/memory_reader.py +0 -0
  219. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/night_voice.py +0 -0
  220. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/phase_graph.py +0 -0
  221. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/phase_spec.py +0 -0
  222. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/prelude.py +0 -0
  223. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  224. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/reflection.py +0 -0
  225. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  226. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/substrate.py +0 -0
  227. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/tool_effects.py +0 -0
  228. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/tool_policy.py +0 -0
  229. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/tools.py +0 -0
  230. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/identity/visit_workflow.py +0 -0
  231. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/__init__.py +0 -0
  232. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  233. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  234. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  235. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  236. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  237. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  238. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  239. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  240. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  241. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  242. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  243. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  244. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  245. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  246. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  247. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  248. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  249. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  250. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  251. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  252. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  253. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  254. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  255. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  256. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  257. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  258. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  259. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  260. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  261. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  262. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/__init__.py +0 -0
  263. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/active_context.py +0 -0
  264. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/active_memory.py +0 -0
  265. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/compaction.py +0 -0
  266. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/kg_packets.py +0 -0
  267. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/memact_composer.py +0 -0
  268. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/recall_levels.py +0 -0
  269. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/memory/token_budget.py +0 -0
  270. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/rendering/__init__.py +0 -0
  271. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  272. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/rendering/json_stringify.py +0 -0
  273. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/scheduler/__init__.py +0 -0
  274. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/scheduler/convenience.py +0 -0
  275. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/scheduler/multi_store.py +0 -0
  276. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/scheduler/registry.py +0 -0
  277. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/scheduler/scheduler.py +0 -0
  278. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/session_history.py +0 -0
  279. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/session_turns.py +0 -0
  280. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/__init__.py +0 -0
  281. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/artifacts.py +0 -0
  282. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/base.py +0 -0
  283. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/commands.py +0 -0
  284. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/in_memory.py +0 -0
  285. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/json_files.py +0 -0
  286. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/lease.py +0 -0
  287. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/ledger_chain.py +0 -0
  288. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/ledger_slim.py +0 -0
  289. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/observable.py +0 -0
  290. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/offloading.py +0 -0
  291. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/serialize.py +0 -0
  292. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/snapshots.py +0 -0
  293. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/sqlite.py +0 -0
  294. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  295. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/__init__.py +0 -0
  296. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/manual.py +0 -0
  297. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/protocol.py +0 -0
  298. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/registry.py +0 -0
  299. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/triggers/schedule.py +0 -0
  300. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/turn_grounding.py +0 -0
  301. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/utils/__init__.py +0 -0
  302. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/utils/atomic_files.py +0 -0
  303. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/utils/file_filters.py +0 -0
  304. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/utils/workspace_paths.py +0 -0
  305. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  306. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  307. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  308. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  309. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  310. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  311. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  312. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  313. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  314. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  315. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  316. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  317. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  318. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  319. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  320. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  321. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  322. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  323. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  324. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  325. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  326. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  327. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  328. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  329. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/workflow_bundle/models.py +0 -0
  330. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  331. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  332. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  333. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/README.md +0 -0
  334. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/automation_harness.py +0 -0
  335. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/conftest.py +0 -0
  336. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/email_wp2_support.py +0 -0
  337. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/live_email/conftest.py +0 -0
  338. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/live_email/live_email_support.py +0 -0
  339. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_abstractcore_comms_facade.py +0 -0
  340. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_abstractcore_discovery_facade.py +0 -0
  341. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_abstractcore_host_facade.py +0 -0
  342. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_abstractcore_run_facade.py +0 -0
  343. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_abstractcore_telegram_facade.py +0 -0
  344. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_active_context_policy.py +0 -0
  345. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_active_memory.py +0 -0
  346. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_agora_agent_alias_identity.py +0 -0
  347. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_agora_tools_http.py +0 -0
  348. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  349. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_answer_user_effect.py +0 -0
  350. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_artifacts.py +0 -0
  351. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_controller.py +0 -0
  352. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_controller_recovery.py +0 -0
  353. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_definition.py +0 -0
  354. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_discussion_isolation.py +0 -0
  355. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_growing_context.py +0 -0
  356. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_index.py +0 -0
  357. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_next_fire.py +0 -0
  358. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_occurrence_recovery.py +0 -0
  359. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_replay_read_only.py +0 -0
  360. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_retry.py +0 -0
  361. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_session_turns.py +0 -0
  362. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_status.py +0 -0
  363. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_automation_tool_approval.py +0 -0
  364. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_browser_probe_target_walling.py +0 -0
  365. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  366. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_capability_default_reasoning.py +0 -0
  367. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_chat_summarizer_integration.py +0 -0
  368. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_code_node_restricted_python.py +0 -0
  369. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_command_store.py +0 -0
  370. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_compaction_helpers.py +0 -0
  371. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_compaction_summarizer_route.py +0 -0
  372. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_config_facade_models_engines.py +0 -0
  373. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_control_adapter_while.py +0 -0
  374. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_controller_bundle_packaged.py +0 -0
  375. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_crash_ordering_inversions.py +0 -0
  376. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_create_if_absent.py +0 -0
  377. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_data_registry_facade.py +0 -0
  378. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_camera_gating.py +0 -0
  379. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_comms_gating.py +0 -0
  380. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_include_skim_files.py +0 -0
  381. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_include_skim_folders.py +0 -0
  382. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_include_skim_web.py +0 -0
  383. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_default_tools_search_files_executor.py +0 -0
  384. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_diary_capture.py +0 -0
  385. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_diary_write_rescue.py +0 -0
  386. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_directory_lease.py +0 -0
  387. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_disabled_toolsets_seam.py +0 -0
  388. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  389. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  390. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_discovery_voice_openai_api_key.py +0 -0
  391. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_discussion_session_anchor.py +0 -0
  392. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_document_markdown_tables.py +0 -0
  393. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_document_renderers_hr_quote.py +0 -0
  394. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_durable_toolsets.py +0 -0
  395. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_durable_write_discipline.py +0 -0
  396. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  397. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_effect_cancellation.py +0 -0
  398. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_effect_issuance_idempotency.py +0 -0
  399. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  400. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_election_consequence_teaching.py +0 -0
  401. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_binding_and_refiner.py +0 -0
  402. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_gate_fixes.py +0 -0
  403. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_inbox_and_trigger.py +0 -0
  404. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_regate_fixes.py +0 -0
  405. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_review_fixes.py +0 -0
  406. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_email_toolset_and_walls.py +0 -0
  407. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_emergence_experiment.py +0 -0
  408. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_emit_event_uses_wait_index.py +0 -0
  409. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_emit_event_without_workflow_registry.py +0 -0
  410. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_endpoint_profile_route_context.py +0 -0
  411. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_awake_memory_fixes.py +0 -0
  412. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_brain_effects.py +0 -0
  413. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_chat_driver.py +0 -0
  414. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_chat_tools_reflection.py +0 -0
  415. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_diary.py +0 -0
  416. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_execute_tool.py +0 -0
  417. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_fetch_url_tool.py +0 -0
  418. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_history_window.py +0 -0
  419. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_life_loop.py +0 -0
  420. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_memory_richness.py +0 -0
  421. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_phase_graph_conformance.py +0 -0
  422. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_react_visit_window.py +0 -0
  423. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_recent_memories.py +0 -0
  424. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_runtime.py +0 -0
  425. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_search_memory.py +0 -0
  426. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  427. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_substrate_resolution.py +0 -0
  428. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_visit_honesty.py +0 -0
  429. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_workspace_cap.py +0 -0
  430. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_entity_workspace_tools.py +0 -0
  431. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_event_wait_index.py +0 -0
  432. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  433. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_evidence_recorder.py +0 -0
  434. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  435. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_execute_command_output_offload.py +0 -0
  436. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_execution_capability_discovery.py +0 -0
  437. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_explicit_eject_other_clients.py +0 -0
  438. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_factory_default_retry_policy.py +0 -0
  439. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  440. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_format_repair_nudge.py +0 -0
  441. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_fresh_install_no_provider.py +0 -0
  442. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_gateway_facades_c4899.py +0 -0
  443. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_git_read_only_refiner.py +0 -0
  444. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_hf_process_residency_merge.py +0 -0
  445. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_history_window_multimodal.py +0 -0
  446. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_hot_path_store_reads.py +0 -0
  447. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_indexed_idempotency_lookup.py +0 -0
  448. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_integration_abstractcore.py +0 -0
  449. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_integrations_abstractcore.py +0 -0
  450. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_json_file_run_store_children_index.py +0 -0
  451. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_json_run_cache_bound.py +0 -0
  452. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_json_store_scan_memo.py +0 -0
  453. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_jsonl_ledger_recovery.py +0 -0
  454. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_kg_learn_and_recall_contract.py +0 -0
  455. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_ledger_chain.py +0 -0
  456. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_ledger_record_slimming.py +0 -0
  457. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_ledger_subscription.py +0 -0
  458. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_live_token_deltas.py +0 -0
  459. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_media_artifact_refs.py +0 -0
  460. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  461. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  462. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  463. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_requires_prompt.py +0 -0
  464. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_response_schema_normalization.py +0 -0
  465. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_structured_output_fallback.py +0 -0
  466. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_text_phase_progress.py +0 -0
  467. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  468. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  469. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  470. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_client_grounding_tail.py +0 -0
  471. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_client_media_artifacts.py +0 -0
  472. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_client_system_context.py +0 -0
  473. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_client_tool_call_parsing.py +0 -0
  474. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_retry_classification.py +0 -0
  475. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_llm_streaming_on_token.py +0 -0
  476. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_local_helper_tool_exposure.py +0 -0
  477. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_local_residency_host_sweep.py +0 -0
  478. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  479. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_max_iterations_ceiling.py +0 -0
  480. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mcp_remote_tool_executor.py +0 -0
  481. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mcp_worker_logging.py +0 -0
  482. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mcp_worker_security.py +0 -0
  483. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mcp_worker_stdio.py +0 -0
  484. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_media_artifact_resolution.py +0 -0
  485. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_media_capability_default_routing.py +0 -0
  486. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_media_subprocess.py +0 -0
  487. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memact_composer_from_kg_result.py +0 -0
  488. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_appraise_handler.py +0 -0
  489. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_communities.py +0 -0
  490. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  491. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_packets.py +0 -0
  492. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  493. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  494. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  495. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  496. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_note_effect.py +0 -0
  497. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_query_effect.py +0 -0
  498. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_query_rich_filters.py +0 -0
  499. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  500. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_seam_handlers.py +0 -0
  501. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_seam_sqlite_durability.py +0 -0
  502. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_memory_tag_effect.py +0 -0
  503. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mlx_generation_serialization.py +0 -0
  504. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_mlx_process_residency_merge.py +0 -0
  505. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_model_eject_cancel.py +0 -0
  506. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_model_residency_clean_switch.py +0 -0
  507. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_model_residency_control_plane.py +0 -0
  508. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  509. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_multi_store_scheduler.py +0 -0
  510. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_multimodal_abstractcore_integration.py +0 -0
  511. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_native_mlx_application_wiring.py +0 -0
  512. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_native_mlx_execution_controls_live.py +0 -0
  513. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_native_tool_channel.py +0 -0
  514. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_night_voice.py +0 -0
  515. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_no_default_provider_refusal_ux.py +0 -0
  516. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_offload_answer_chain_c4978.py +0 -0
  517. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  518. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_offloading.py +0 -0
  519. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_parallel_readonly_tool_execution.py +0 -0
  520. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_pause_resume.py +0 -0
  521. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_pdf_unicode_rendering.py +0 -0
  522. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_personal_cycle.py +0 -0
  523. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_phantom_attachment_index.py +0 -0
  524. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_phase_graph_artifact_control.py +0 -0
  525. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_phase_graph_obedience.py +0 -0
  526. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_phase_vocabulary_migration.py +0 -0
  527. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  528. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_cache_export_import.py +0 -0
  529. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  530. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_cache_modules.py +0 -0
  531. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  532. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  533. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_prompt_overlay.py +0 -0
  534. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  535. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_provider_pin_routing_isolation.py +0 -0
  536. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_queryable_run_store.py +0 -0
  537. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  538. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_read_idle_threading.py +0 -0
  539. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_readoption_experiment.py +0 -0
  540. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_real_integration.py +0 -0
  541. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_realize_election.py +0 -0
  542. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_recall_levels_policy.py +0 -0
  543. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_remote_client_cancel.py +0 -0
  544. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_remote_llm_client.py +0 -0
  545. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_remote_speculation_defaults.py +0 -0
  546. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_rendering_agent_trace_report.py +0 -0
  547. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_rendering_json_stringify.py +0 -0
  548. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_report_branding.py +0 -0
  549. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_resident_media_generation.py +0 -0
  550. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_resume_concurrent_same_wait.py +0 -0
  551. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_retry_idempotency.py +0 -0
  552. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_run_history_bundle.py +0 -0
  553. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_run_index_workspace_root.py +0 -0
  554. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_run_mutation_lock.py +0 -0
  555. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_run_scoped_tool_policy.py +0 -0
  556. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_run_tool_scope_ceiling.py +0 -0
  557. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_browser_session_boundary.py +0 -0
  558. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  559. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  560. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_effect_invocation_trace.py +0 -0
  561. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  562. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_install_boundary.py +0 -0
  563. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  564. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_node_traces.py +0 -0
  565. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  566. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_runtime_tick_step_gate.py +0 -0
  567. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_scheduler.py +0 -0
  568. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_send_email_refiner.py +0 -0
  569. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  570. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_history.py +0 -0
  571. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_prompt_cache_attribution.py +0 -0
  572. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_prompt_cache_visibility.py +0 -0
  573. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_route_stamp.py +0 -0
  574. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_session_start_cost.py +0 -0
  575. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_shell_tool_exposure.py +0 -0
  576. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_snapshots.py +0 -0
  577. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_speculation_inheritance.py +0 -0
  578. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_speculation_reaches_provider_construction.py +0 -0
  579. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_sqlite_ledger_store.py +0 -0
  580. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_start_subworkflow_async_wait.py +0 -0
  581. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  582. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  583. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_steer_sidecar.py +0 -0
  584. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_storage_deletion.py +0 -0
  585. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_structured_output_schema_enum.py +0 -0
  586. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_subworkflow.py +0 -0
  587. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_terminal_effect_completion.py +0 -0
  588. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  589. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_thinking_inheritance.py +0 -0
  590. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  591. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_approval_executor.py +0 -0
  592. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_approval_resume_executes.py +0 -0
  593. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_approval_wait_key_identity.py +0 -0
  594. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_calls_idempotency_keys.py +0 -0
  595. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_catalog.py +0 -0
  596. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_descriptor_registry.py +0 -0
  597. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_argument_sanitization.py +0 -0
  598. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_error_output_detection.py +0 -0
  599. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_filename_alias.py +0 -0
  600. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  601. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_read_file_aliases.py +0 -0
  602. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_executor_timeout.py +0 -0
  603. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_inventory_facade.py +0 -0
  604. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_invoke_effect.py +0 -0
  605. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_policy_and_mounts.py +0 -0
  606. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_tool_wait_allowlist_safety.py +0 -0
  607. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_topic_election_world_model.py +0 -0
  608. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_trace_context_propagation.py +0 -0
  609. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_trigger_registry.py +0 -0
  610. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_trigger_schedule_math.py +0 -0
  611. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_turn_grounding_byte_stability.py +0 -0
  612. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_turn_grounding_carriers_a3.py +0 -0
  613. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_vars_query_effect.py +0 -0
  614. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visit_ab_fixture.py +0 -0
  615. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visit_midturn_elections.py +0 -0
  616. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visit_midturn_resume.py +0 -0
  617. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visit_workflow.py +0 -0
  618. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  619. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  620. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  621. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  622. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  623. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  624. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_entity_memory_nodes.py +0 -0
  625. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  626. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_llm_call_partial_override.py +0 -0
  627. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  628. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_memact_compose_node.py +0 -0
  629. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  630. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  631. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  632. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  633. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  634. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_add_message_builtin.py +0 -0
  635. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  636. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_agora_react_agent.py +0 -0
  637. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_call_tool_node.py +0 -0
  638. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  639. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_compiler_basic.py +0 -0
  640. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  641. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_continue_on_error.py +0 -0
  642. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  643. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  644. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  645. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_function_library.py +0 -0
  646. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_get_element_node.py +0 -0
  647. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_get_random_element_node.py +0 -0
  648. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_get_var_node.py +0 -0
  649. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_has_tools_builtin.py +0 -0
  650. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  651. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  652. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_make_object_node.py +0 -0
  653. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_media_nodes.py +0 -0
  654. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  655. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_memory_source_pins.py +0 -0
  656. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_pin_expressions.py +0 -0
  657. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_prompt_only.py +0 -0
  658. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_random_nodes.py +0 -0
  659. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_schema_enum_switch.py +0 -0
  660. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_string_contains_replace.py +0 -0
  661. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_visualflow_tool_parameters_node.py +0 -0
  662. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_voice_openai_api_key_path.py +0 -0
  663. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_w4_feelings_lens.py +0 -0
  664. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_wait_event_deadline.py +0 -0
  665. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_wait_event_prompt_metadata.py +0 -0
  666. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_wait_until_streak.py +0 -0
  667. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_wait_until_utc_normalization.py +0 -0
  668. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workflow_bundle_registry.py +0 -0
  669. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_builtin_deny.py +0 -0
  670. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  671. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  672. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  673. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  674. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_prompt_context.py +0 -0
  675. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_workspace_read_only.py +0 -0
  676. {abstractruntime-0.8.0 → abstractruntime-0.8.2}/tests/test_write_chart.py +0 -0
@@ -7,6 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.2] - 2026-10-01
11
+
12
+ Pausing an automation also stops its retries. Requires AbstractCore 2.20.2 (unchanged).
13
+
14
+ ### Changed
15
+ - `automation.pause` also stops retries: an occurrence waiting in retry backoff is cancelled
16
+ (quietly, like `stop_current`), and a scheduled attempt that fails while the automation is paused
17
+ completes `failed` without a retry. An attempt already running still finishes, and a manual run
18
+ (`run_now`, allowed while paused) keeps its retries.
19
+
20
+ ### Notes
21
+ - A retry that is waiting in backoff when you pause an automation is cancelled instead of starting
22
+ after its backoff. Resume the automation, or use `run_now`, to run it again.
23
+
24
+ ## [0.8.1] - 2026-09-30
25
+
26
+ Email automations never trigger themselves, speech and images work without a buildable text model,
27
+ and a chat's mail to its owner runs without asking. Requires AbstractCore 2.20.2.
28
+
29
+ ### Added
30
+ - Mail sent by an automation run (controller, occurrence, any run it starts, the send-email action)
31
+ is automatic mail: the run's `EmailContext` gets `automation_marker =
32
+ "automation:<automation id>/run:<run id>"`, so every send carries `Auto-Submitted` and
33
+ `X-AbstractFramework-Automation`. `automation_marker_for(vars, run_id)` is exported from
34
+ `abstractruntime.email.binding`. Chats and discussions send ordinary mail.
35
+ - `email.received@1` config `auto_submitted`: `"skip"` (default) never admits a message whose
36
+ `Auto-Submitted` header is present and not `no`; `"admit"` lets it reach the filters. Stored
37
+ configs without the key behave like `"skip"`.
38
+ - `EmailInboxFeeder(..., is_own_sent=callable)` and `PollReport.own_automatic`: the account's own
39
+ automatic mail (the framework marker from its own address, or a Message-ID the host recorded as
40
+ sent) never enters the event inbox.
41
+ - `abstractruntime.integrations.abstractcore.run_facade.inline_run_active(run_id)`: true while the
42
+ run facade executes a child run in this process; host runners skip such runs.
43
+ - `ToolApprovalPolicy.default_require_approval_tools`: the names on the require list only because
44
+ no list was given (the default caution list).
45
+
46
+ ### Changed
47
+ - The pooled local client runs media-only requests (image, video, voice, music, transcription, no
48
+ tools) and streaming TTS on AbstractCore's capability host instead of building the default text
49
+ client: text-to-speech no longer fails when the text default cannot be built (for example an
50
+ MLX route on an install without MLX), and no text model is loaded for a media request.
51
+ - Without a per-run tool policy, the `send_email_recipient@v2` refiner now also lowers a name that
52
+ is on the executor's default caution list (`send_email` under `ToolApprovalPolicy()`): a chat
53
+ run's send to its owner's own address runs without an approval wait. An explicitly passed
54
+ require list and a per-run policy's still win; email-triggered runs under `approval: "ask"` are
55
+ unchanged.
56
+
57
+ ### Dependencies
58
+ - `abstractcore>=2.20.2` (also `[apple]` and `[gpu]`).
59
+
10
60
  ## [0.8.0] - 2026-09-30
11
61
 
12
62
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.20.0
23
+ Requires-Dist: abstractcore>=2.20.2
24
24
  Requires-Dist: abstractmemory>=0.3.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
@@ -35,14 +35,14 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
35
35
  Requires-Dist: restrictedpython>=7.0
36
36
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
37
37
  Provides-Extra: apple
38
- Requires-Dist: abstractcore[apple]>=2.20.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.20.2; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[gpu]>=2.20.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.20.2; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
48
  Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
57
57
 
58
- **Version:** 0.8.0 • **Python:** 3.10+
58
+ **Version:** 0.8.2 • **Python:** 3.10+
59
59
 
60
60
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
61
61
 
@@ -83,7 +83,7 @@ Remote-light runtime:
83
83
  pip install abstractruntime
84
84
  ```
85
85
 
86
- The base install includes AbstractCore 2.20.0 or newer (its light install:
86
+ The base install includes AbstractCore 2.20.2 or newer (its light install:
87
87
  remote providers, tools, vision, voice, audio, and music integration), plus the
88
88
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
89
89
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -147,7 +147,7 @@ state = rt.resume(
147
147
  assert state.status.value == "completed"
148
148
  ```
149
149
 
150
- ## What’s included (v0.8.0)
150
+ ## What’s included (v0.8.2)
151
151
 
152
152
  Kernel (import-light):
153
153
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.8.0 • **Python:** 3.10+
7
+ **Version:** 0.8.2 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -32,7 +32,7 @@ Remote-light runtime:
32
32
  pip install abstractruntime
33
33
  ```
34
34
 
35
- The base install includes AbstractCore 2.20.0 or newer (its light install:
35
+ The base install includes AbstractCore 2.20.2 or newer (its light install:
36
36
  remote providers, tools, vision, voice, audio, and music integration), plus the
37
37
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
38
38
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -96,7 +96,7 @@ state = rt.resume(
96
96
  assert state.status.value == "completed"
97
97
  ```
98
98
 
99
- ## What’s included (v0.8.0)
99
+ ## What’s included (v0.8.2)
100
100
 
101
101
  Kernel (import-light):
102
102
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -302,7 +302,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
302
302
 
303
303
  ### AbstractCore (LLM + tools)
304
304
 
305
- Requires: `pip install abstractruntime` (AbstractCore 2.20.0 or newer is part of the base install).
305
+ Requires: `pip install abstractruntime` (AbstractCore 2.20.2 or newer is part of the base install).
306
306
 
307
307
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
308
308
 
@@ -312,7 +312,7 @@ Entry points:
312
312
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
313
313
  - email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
314
314
  - public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
315
- - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
315
+ - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
316
316
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
317
317
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
318
318
  - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
@@ -348,6 +348,7 @@ Multimodal support:
348
348
  - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
349
349
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
350
350
  - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
351
+ - with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
351
352
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
352
353
  - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
353
354
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-09-29
4
- > Version: 0.8.0
3
+ > Updated: 2026-10-01
4
+ > Version: 0.8.2
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.
@@ -286,7 +286,7 @@ expected_revision=None, now=None)` is the only way to change an automation. It r
286
286
 
287
287
  | Type | Effect | Rejected with |
288
288
  |---|---|---|
289
- | `automation.pause` | Stops **scheduled** admissions. The current occurrence and its retries finish, and `run_now` still works. This is separate from the runtime's own pause. | `invalid_state` when archived or finished |
289
+ | `automation.pause` | Stops **scheduled** admissions. An attempt already running finishes, but no retry follows: an occurrence waiting in retry backoff is cancelled (quietly), and a scheduled attempt that fails while paused completes `failed` without a retry. `run_now` still works (a manual run keeps its retries). This is separate from the runtime's own pause. | `invalid_state` when archived or finished |
290
290
  | `automation.resume` | Re-arms the schedule at the first tick after now. It never fires on resume and never catches up the paused time. Resuming an automation that is not paused is an applied no-op. | `invalid_state` when archived or finished |
291
291
  | `automation.run_now` | Runs one occurrence at the controller's next step, even while paused (the automation stays paused). There is no queue. | `automation_busy` while an occurrence or a manual run is pending; `invalid_state` when archived, finished or exhausted |
292
292
  | `automation.revise` | `payload.changes = {title?, target?, trigger?, context?, policy?}` (at least one). `title`, `target`, `trigger` and `context` are replaced whole; `policy` fields are merged, so a field you do not send keeps its value. The next revision applies from the controller's next step. A changed trigger gets a new binding and is re-armed after now, so no past tick fires; an unchanged trigger keeps its binding. | `invalid_state` when archived or finished; the definition's own reason codes for invalid changes |
@@ -108,7 +108,9 @@ stored ids in `output_offloaded_artifact_ids`.
108
108
 
109
109
  Any other recipient, a `reply_email` call (its recipients come from the original message), or a call the refiner
110
110
  cannot read waits for a person on a `tool_approval` wait. The rule applies whether or not the run carries a per-run
111
- tool policy (`_runtime.tool_policy`); an executor's explicit `require_approval_tools` entry still wins. In a batch,
111
+ tool policy (`_runtime.tool_policy`), including under the executor's default policy (`ToolApprovalPolicy()`, whose
112
+ default caution list names `send_email`); a `require_approval_tools` list the host passes explicitly, or a per-run
113
+ policy's, still wins. Email-triggered runs under `approval: "ask"` never use the refiner. In a batch,
112
114
  one `send_email` that needs a person makes every `send_email` of that batch wait.
113
115
 
114
116
  Approval is separate from the account's recipient policy (allowlist or denylist): AbstractCore's `guarded_send`
@@ -118,6 +120,15 @@ control that decides who can receive mail at all. A client that approves every t
118
120
  the approval wait for that user's own runs, never the recipient policy. See
119
121
  [tool-approval.md](tool-approval.md#per-call-refiners).
120
122
 
123
+ ## Mail sent by automations
124
+
125
+ Every message a run of an automation sends (its controller, an occurrence or any run it starts, including the
126
+ send-email action) is automatic mail: the runtime hands AbstractCore the run's account with
127
+ `EmailContext.automation_marker = "automation:<automation id>/run:<run id>"`, so each send carries
128
+ `Auto-Submitted: auto-generated` (`auto-replied` for a reply) and `X-AbstractFramework-Automation`. Chats and
129
+ discussions (a person is there) send ordinary mail. The marker is decided on the run's automation attribution, which
130
+ the runtime sets and a client cannot write (`automation_marker_for(vars, run_id)`).
131
+
121
132
  ## Running an automation when mail arrives
122
133
 
123
134
  ### The inbox and the watcher
@@ -155,6 +166,10 @@ if email_trigger_consumers(runtime): # at least one email automation
155
166
  `Body (not fetched):` with the cause and fix.
156
167
  - A message that cannot be fetched on three polls in a row is recorded in `feeder.status()["unprocessable"]` with its
157
168
  code, cause and fix, and the feeder moves past it.
169
+ - The account's own automatic mail never becomes an event, so an automation can never trigger itself: a message
170
+ that carries the framework marker (`X-AbstractFramework-Automation`) and comes from the account's own address, or
171
+ whose Message-ID the host reports as sent by the framework (`EmailInboxFeeder(..., is_own_sent=callable)`), is
172
+ passed before its body is fetched and counted in `report.own_automatic`.
158
173
  - A connection or sign-in failure never raises: the report and `feeder.status()` carry `{code, cause, fix,
159
174
  retryable}`, and the next poll waits 60 seconds, doubling up to 15 minutes (`poll(..., force=True)` polls at once).
160
175
  No automation is paused.
@@ -174,6 +189,7 @@ trigger = {
174
189
  "every": "1h", # batch interval, at least "60s"
175
190
  "folder": "INBOX",
176
191
  "max_batch": 100,
192
+ "auto_submitted": "skip", # default; "admit" runs on automatic mail too
177
193
  "filter": {"from_domain_in": ["example.test"], "subject_contains": "invoice"},
178
194
  },
179
195
  }
@@ -182,6 +198,9 @@ trigger = {
182
198
  - **Filters** are typed: `from_in` (addresses), `from_domain_in` (exact domains; list a subdomain to match it),
183
199
  `to_in` (any To or Cc address), `subject_contains` (one literal, case-insensitive substring) and `has_attachment`.
184
200
  There are no patterns or expressions.
201
+ - **Automatic mail** (RFC 3834): with `auto_submitted: "skip"` (the default) a message whose `Auto-Submitted` header
202
+ is present and not `no` (auto-responders, notifications, other automations) is never admitted; `"admit"` lets it
203
+ reach the filters. The account's own automatic mail is kept out of the inbox whatever this option says.
185
204
  - **Batches**: the automation runs at most once per `every`, with every matching message received since its previous
186
205
  run (up to `max_batch`; the rest go to the next run). An automation that runs a model defaults to once an hour; one
187
206
  that needs no model defaults to every minute.
@@ -12,7 +12,7 @@ Remote-light runtime:
12
12
  pip install abstractruntime
13
13
  ```
14
14
 
15
- This installs AbstractCore 2.20.0 or newer with remote provider, vision,
15
+ This installs AbstractCore 2.20.2 or newer with remote provider, vision,
16
16
  voice, audio, music, tool, and MCP-worker support. The base install is
17
17
  remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
18
18
  endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
@@ -20,7 +20,7 @@ Fix:
20
20
  - Install or upgrade the base Runtime package. LLM/tools integration, common
21
21
  remote-light multimodal dependencies, and the MCP worker entry point are part
22
22
  of the base install.
23
- - The current AbstractCore integration expects `abstractcore>=2.20.0`.
23
+ - The current AbstractCore integration expects `abstractcore>=2.20.2`.
24
24
 
25
25
  Verify:
26
26
 
@@ -53,7 +53,7 @@ See llms.txt for the linked index.
53
53
 
54
54
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
55
55
 
56
- **Version:** 0.8.0 • **Python:** 3.10+
56
+ **Version:** 0.8.2 • **Python:** 3.10+
57
57
 
58
58
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
59
59
 
@@ -81,7 +81,7 @@ Remote-light runtime:
81
81
  pip install abstractruntime
82
82
  ```
83
83
 
84
- The base install includes AbstractCore 2.20.0 or newer (its light install:
84
+ The base install includes AbstractCore 2.20.2 or newer (its light install:
85
85
  remote providers, tools, vision, voice, audio, and music integration), plus the
86
86
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
87
87
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -145,7 +145,7 @@ state = rt.resume(
145
145
  assert state.status.value == "completed"
146
146
  ```
147
147
 
148
- ## What’s included (v0.8.0)
148
+ ## What’s included (v0.8.2)
149
149
 
150
150
  Kernel (import-light):
151
151
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -287,7 +287,7 @@ Remote-light runtime:
287
287
  pip install abstractruntime
288
288
  ```
289
289
 
290
- This installs AbstractCore 2.20.0 or newer with remote provider, vision,
290
+ This installs AbstractCore 2.20.2 or newer with remote provider, vision,
291
291
  voice, audio, music, tool, and MCP-worker support. The base install is
292
292
  remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
293
293
  endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
@@ -431,8 +431,8 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
431
431
 
432
432
  # AbstractRuntime — Architecture
433
433
 
434
- > Updated: 2026-09-29
435
- > Version: 0.8.0
434
+ > Updated: 2026-10-01
435
+ > Version: 0.8.2
436
436
  > Scope: this describes **what is implemented in this repository**.
437
437
 
438
438
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -1167,7 +1167,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
1167
1167
 
1168
1168
  ### AbstractCore (LLM + tools)
1169
1169
 
1170
- Requires: `pip install abstractruntime` (AbstractCore 2.20.0 or newer is part of the base install).
1170
+ Requires: `pip install abstractruntime` (AbstractCore 2.20.2 or newer is part of the base install).
1171
1171
 
1172
1172
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
1173
1173
 
@@ -1177,7 +1177,7 @@ Entry points:
1177
1177
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
1178
1178
  - email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
1179
1179
  - public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
1180
- - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
1180
+ - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
1181
1181
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
1182
1182
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
1183
1183
  - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
@@ -1213,6 +1213,7 @@ Multimodal support:
1213
1213
  - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
1214
1214
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
1215
1215
  - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
1216
+ - with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
1216
1217
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
1217
1218
  - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
1218
1219
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
@@ -1678,7 +1679,7 @@ Fix:
1678
1679
  - Install or upgrade the base Runtime package. LLM/tools integration, common
1679
1680
  remote-light multimodal dependencies, and the MCP worker entry point are part
1680
1681
  of the base install.
1681
- - The current AbstractCore integration expects `abstractcore>=2.20.0`.
1682
+ - The current AbstractCore integration expects `abstractcore>=2.20.2`.
1682
1683
 
1683
1684
  Verify:
1684
1685
 
@@ -3806,7 +3807,7 @@ expected_revision=None, now=None)` is the only way to change an automation. It r
3806
3807
 
3807
3808
  | Type | Effect | Rejected with |
3808
3809
  |---|---|---|
3809
- | `automation.pause` | Stops **scheduled** admissions. The current occurrence and its retries finish, and `run_now` still works. This is separate from the runtime's own pause. | `invalid_state` when archived or finished |
3810
+ | `automation.pause` | Stops **scheduled** admissions. An attempt already running finishes, but no retry follows: an occurrence waiting in retry backoff is cancelled (quietly), and a scheduled attempt that fails while paused completes `failed` without a retry. `run_now` still works (a manual run keeps its retries). This is separate from the runtime's own pause. | `invalid_state` when archived or finished |
3810
3811
  | `automation.resume` | Re-arms the schedule at the first tick after now. It never fires on resume and never catches up the paused time. Resuming an automation that is not paused is an applied no-op. | `invalid_state` when archived or finished |
3811
3812
  | `automation.run_now` | Runs one occurrence at the controller's next step, even while paused (the automation stays paused). There is no queue. | `automation_busy` while an occurrence or a manual run is pending; `invalid_state` when archived, finished or exhausted |
3812
3813
  | `automation.revise` | `payload.changes = {title?, target?, trigger?, context?, policy?}` (at least one). `title`, `target`, `trigger` and `context` are replaced whole; `policy` fields are merged, so a field you do not send keeps its value. The next revision applies from the controller's next step. A changed trigger gets a new binding and is re-armed after now, so no past tick fires; an unchanged trigger keeps its binding. | `invalid_state` when archived or finished; the definition's own reason codes for invalid changes |
@@ -4566,7 +4567,9 @@ stored ids in `output_offloaded_artifact_ids`.
4566
4567
 
4567
4568
  Any other recipient, a `reply_email` call (its recipients come from the original message), or a call the refiner
4568
4569
  cannot read waits for a person on a `tool_approval` wait. The rule applies whether or not the run carries a per-run
4569
- tool policy (`_runtime.tool_policy`); an executor's explicit `require_approval_tools` entry still wins. In a batch,
4570
+ tool policy (`_runtime.tool_policy`), including under the executor's default policy (`ToolApprovalPolicy()`, whose
4571
+ default caution list names `send_email`); a `require_approval_tools` list the host passes explicitly, or a per-run
4572
+ policy's, still wins. Email-triggered runs under `approval: "ask"` never use the refiner. In a batch,
4570
4573
  one `send_email` that needs a person makes every `send_email` of that batch wait.
4571
4574
 
4572
4575
  Approval is separate from the account's recipient policy (allowlist or denylist): AbstractCore's `guarded_send`
@@ -4576,6 +4579,15 @@ control that decides who can receive mail at all. A client that approves every t
4576
4579
  the approval wait for that user's own runs, never the recipient policy. See
4577
4580
  [tool-approval.md](tool-approval.md#per-call-refiners).
4578
4581
 
4582
+ ## Mail sent by automations
4583
+
4584
+ Every message a run of an automation sends (its controller, an occurrence or any run it starts, including the
4585
+ send-email action) is automatic mail: the runtime hands AbstractCore the run's account with
4586
+ `EmailContext.automation_marker = "automation:<automation id>/run:<run id>"`, so each send carries
4587
+ `Auto-Submitted: auto-generated` (`auto-replied` for a reply) and `X-AbstractFramework-Automation`. Chats and
4588
+ discussions (a person is there) send ordinary mail. The marker is decided on the run's automation attribution, which
4589
+ the runtime sets and a client cannot write (`automation_marker_for(vars, run_id)`).
4590
+
4579
4591
  ## Running an automation when mail arrives
4580
4592
 
4581
4593
  ### The inbox and the watcher
@@ -4613,6 +4625,10 @@ if email_trigger_consumers(runtime): # at least one email automation
4613
4625
  `Body (not fetched):` with the cause and fix.
4614
4626
  - A message that cannot be fetched on three polls in a row is recorded in `feeder.status()["unprocessable"]` with its
4615
4627
  code, cause and fix, and the feeder moves past it.
4628
+ - The account's own automatic mail never becomes an event, so an automation can never trigger itself: a message
4629
+ that carries the framework marker (`X-AbstractFramework-Automation`) and comes from the account's own address, or
4630
+ whose Message-ID the host reports as sent by the framework (`EmailInboxFeeder(..., is_own_sent=callable)`), is
4631
+ passed before its body is fetched and counted in `report.own_automatic`.
4616
4632
  - A connection or sign-in failure never raises: the report and `feeder.status()` carry `{code, cause, fix,
4617
4633
  retryable}`, and the next poll waits 60 seconds, doubling up to 15 minutes (`poll(..., force=True)` polls at once).
4618
4634
  No automation is paused.
@@ -4632,6 +4648,7 @@ trigger = {
4632
4648
  "every": "1h", # batch interval, at least "60s"
4633
4649
  "folder": "INBOX",
4634
4650
  "max_batch": 100,
4651
+ "auto_submitted": "skip", # default; "admit" runs on automatic mail too
4635
4652
  "filter": {"from_domain_in": ["example.test"], "subject_contains": "invoice"},
4636
4653
  },
4637
4654
  }
@@ -4640,6 +4657,9 @@ trigger = {
4640
4657
  - **Filters** are typed: `from_in` (addresses), `from_domain_in` (exact domains; list a subdomain to match it),
4641
4658
  `to_in` (any To or Cc address), `subject_contains` (one literal, case-insensitive substring) and `has_attachment`.
4642
4659
  There are no patterns or expressions.
4660
+ - **Automatic mail** (RFC 3834): with `auto_submitted: "skip"` (the default) a message whose `Auto-Submitted` header
4661
+ is present and not `no` (auto-responders, notifications, other automations) is never admitted; `"admit"` lets it
4662
+ reach the filters. The account's own automatic mail is kept out of the inbox whatever this option says.
4643
4663
  - **Batches**: the automation runs at most once per `every`, with every matching message received since its previous
4644
4664
  run (up to `max_batch`; the rest go to the next run). An automation that runs a model defaults to once an hour; one
4645
4665
  that needs no model defaults to every minute.
@@ -3,10 +3,10 @@
3
3
  > Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
4
 
5
5
  - Python: 3.10+ (see `pyproject.toml`)
6
- - Version: 0.8.0
6
+ - Version: 0.8.2
7
7
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
8
8
  - Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
9
- - Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.20.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
9
+ - Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.20.2 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
10
10
  - Install profiles: base `abstractruntime` is remote-light with MCP, generated media routing, and Runtime-owned permissive PDF read/write nodes; `abstractruntime[apple]` and `abstractruntime[gpu]` add local inferencer stacks.
11
11
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names. Hosts can attach `resolve_provider_endpoint_profile(provider_id)` to the LLM client; Runtime treats it as an optional resolver hook, injects transient provider/base URL/key params for the call, and redacts secret-like params from persisted observability.
12
12
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.8.0"
7
+ version = "0.8.2"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -53,7 +53,7 @@ dependencies = [
53
53
  # plugins) without selecting local inference engines. 2.19.2 floors
54
54
  # abstractvision>=0.3.33, whose resident loads report `loaded_new` and whose
55
55
  # unload frees the pipeline (the resident media path relies on both).
56
- "abstractcore>=2.20.0",
56
+ "abstractcore>=2.20.2",
57
57
  "openai<3.0.0,>=1.109.1",
58
58
  "httpx<1.0.0,>=0.28.1",
59
59
  "anyio<5.0.0,>=4.12.1",
@@ -70,12 +70,12 @@ dependencies = [
70
70
 
71
71
  [project.optional-dependencies]
72
72
  apple = [
73
- "abstractcore[apple]>=2.20.0",
73
+ "abstractcore[apple]>=2.20.2",
74
74
  "setuptools<82.0.0,>=80.10.2",
75
75
  ]
76
76
 
77
77
  gpu = [
78
- "abstractcore[gpu]>=2.20.0",
78
+ "abstractcore[gpu]>=2.20.2",
79
79
  # vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
80
80
  "setuptools<82.0.0,>=77.0.3",
81
81
  ]
@@ -0,0 +1,11 @@
1
+ Pausing an automation also stops its retries. Requires AbstractCore 2.20.2 (unchanged).
2
+
3
+ ### Changed
4
+ - `automation.pause` also stops retries: an occurrence waiting in retry backoff is cancelled
5
+ (quietly, like `stop_current`), and a scheduled attempt that fails while the automation is paused
6
+ completes `failed` without a retry. An attempt already running still finishes, and a manual run
7
+ (`run_now`, allowed while paused) keeps its retries.
8
+
9
+ ### Notes
10
+ - A retry that is waiting in backoff when you pause an automation is cancelled instead of starting
11
+ after its backoff. Resume the automation, or use `run_now`, to run it again.
@@ -13,8 +13,11 @@ record, controller wake, child cancellation), so a crash after the decision
13
13
  never loses them. Domain rejections are returned, never raised.
14
14
 
15
15
  Semantics:
16
- - pause: gates SCHEDULED admission only (never the runtime pause gate); the
17
- current occurrence, including its retries, finishes; run_now stays allowed.
16
+ - pause: gates SCHEDULED admission (never the runtime pause gate); an attempt
17
+ already running finishes, but no retry follows while paused: an occurrence
18
+ waiting in retry backoff is cancelled (quiet), and a scheduled attempt that
19
+ fails while paused completes `failed` without a retry. run_now stays allowed
20
+ (a manual occurrence started while paused keeps its retries).
18
21
  - resume: re-arms the trigger at the first tick after now; never fires.
19
22
  - run_now: records `manual_pending` (admitted at the controller's next
20
23
  boundary); rejected `automation_busy` while an occurrence or a manual run is
@@ -91,7 +94,13 @@ def _decide(
91
94
  if command_type == "automation.pause":
92
95
  if archived or terminal:
93
96
  return _reject("invalid_state", "An archived or finished automation cannot be paused.")
94
- return {"delta": {"state": {"paused": True}}}
97
+ pause_state: Dict[str, Any] = {"paused": True}
98
+ pending = state.get("pending_occurrence")
99
+ if not state.get("paused") and isinstance(pending, dict) and pending.get("phase") == "backoff":
100
+ # A retry only waiting for its backoff never starts after a pause (N3): the
101
+ # occurrence is cancelled at the controller's next boundary, like stop_current.
102
+ pause_state["pending_occurrence"] = {**pending, "stop_requested": True}
103
+ return {"delta": {"state": pause_state}}
95
104
 
96
105
  if command_type == "automation.resume":
97
106
  if archived or terminal:
@@ -856,7 +856,10 @@ def record_outcome(turn: Turn) -> str:
856
856
  return "next"
857
857
  retry = pending.get("retry") or {"max_attempts": 1}
858
858
  attempt = int(pending["attempt"])
859
- if attempt < int(retry["max_attempts"]):
859
+ # Paused: a SCHEDULED occurrence gets no further attempt (N3); a manual one (run_now,
860
+ # allowed while paused, `command_id` set) keeps its retries.
861
+ retry_blocked = bool(state.get("paused")) and pending.get("command_id") is None
862
+ if attempt < int(retry["max_attempts"]) and not retry_blocked:
860
863
  retry_at = add_delay(turn.now, backoff_delay({"retry": retry}, attempt))
861
864
  turn.decide(
862
865
  "automation.retry_scheduled",
@@ -129,11 +129,59 @@ def bind_email_account(
129
129
 
130
130
  Resolver = Callable[[EmailBinding], Any]
131
131
 
132
- # (resolver of the executing run's Runtime, the run's binding, the use). Unset outside a tool batch.
133
- _SCOPE: "ContextVar[Optional[Tuple[Optional[Resolver], Optional[EmailBinding], str]]]" = ContextVar(
132
+ # (resolver of the executing run's Runtime, the run's binding, the use, the automation marker).
133
+ # Unset outside a tool batch.
134
+ _SCOPE: "ContextVar[Optional[Tuple[Optional[Resolver], Optional[EmailBinding], str, str]]]" = ContextVar(
134
135
  "abstractruntime_email_scope", default=None
135
136
  )
136
137
 
138
+ AUTOMATION_MARKER_MAX = 200
139
+
140
+
141
+ def automation_marker_for(vars_obj: Any, run_id: Any = None) -> str:
142
+ """The framework marker for mail a run sends automatically, or "" for a person's run.
143
+
144
+ A run of an automation (its controller, an occurrence or any descendant of one, decided on
145
+ the runtime-set attribution in `_meta`, which a client cannot write) sends automatically:
146
+ `automation:<automation id>/run:<run id>`; a legacy scheduled run: `schedule:<run id>`.
147
+ Chats and discussions (a person is there) get "" and their mail is sent unmarked.
148
+ AbstractCore stamps the marker and RFC 3834 `Auto-Submitted` on every message sent through
149
+ the run's `EmailContext`, and the mail watcher never admits them back (no self-trigger).
150
+ """
151
+ from ..core.run_attribution import automation_index_fields
152
+
153
+ rid = str(run_id or "").strip()
154
+ fields = automation_index_fields(vars_obj, run_id=rid or None)
155
+ role = fields.get("role")
156
+ if role in ("controller", "occurrence", "descendant"):
157
+ aid = str(fields.get("automation_id") or "").strip()
158
+ marker = f"automation:{aid}/run:{rid}" if rid else f"automation:{aid}"
159
+ elif role == "legacy_schedule":
160
+ marker = f"schedule:{rid}"
161
+ else:
162
+ return ""
163
+ if len(marker) > AUTOMATION_MARKER_MAX or any(not (32 <= ord(c) < 127) for c in marker):
164
+ return "automation"
165
+ return marker
166
+
167
+
168
+ def _with_marker(ctx: Any, marker: str) -> Any:
169
+ """`ctx` carrying `automation_marker` (a copy; the host's object is never changed)."""
170
+ if not marker or ctx is None:
171
+ return ctx
172
+ import dataclasses
173
+
174
+ if not dataclasses.is_dataclass(ctx) or "automation_marker" not in {f.name for f in dataclasses.fields(ctx)}:
175
+ # An AbstractCore without the marker field would send automatic mail unmarked and the
176
+ # watcher would admit it again: refuse loudly instead of looping silently.
177
+ raise RuntimeError(
178
+ "This AbstractCore cannot mark automatic mail (EmailContext.automation_marker is missing); "
179
+ "upgrade abstractcore to 2.20.2 or later."
180
+ )
181
+ if getattr(ctx, "automation_marker", ""):
182
+ return ctx
183
+ return dataclasses.replace(ctx, automation_marker=marker)
184
+
137
185
 
138
186
  def resolver_accepts_use(resolver: Any) -> bool:
139
187
  """True when `resolver` takes a `use` keyword (or `**kwargs`); decided on its signature."""
@@ -175,7 +223,7 @@ def resolve_scoped_context() -> Any:
175
223
  scope = _SCOPE.get()
176
224
  if scope is None:
177
225
  return None
178
- resolver, binding, use = scope
226
+ resolver, binding, use, marker = scope
179
227
  if resolver is None or binding is None:
180
228
  return None
181
229
  from abstractcore.comms.email import EmailError, EmailSecretUnavailable
@@ -189,7 +237,7 @@ def resolve_scoped_context() -> Any:
189
237
  "The email account of this run could not be loaded.",
190
238
  "Open Settings -> Email and Test the account; connect it again if the test fails.",
191
239
  ) from None
192
- return ctx
240
+ return _with_marker(ctx, marker)
193
241
 
194
242
 
195
243
  def install_core_resolver() -> None:
@@ -242,7 +290,8 @@ def email_run_scope(run: Any, *, resolver: Optional[Resolver] = None, use: Optio
242
290
  if use not in EMAIL_USES:
243
291
  raise ValueError(f"use must be one of {EMAIL_USES}, got {use!r}")
244
292
  vars_obj = getattr(run, "vars", None)
245
- token = _SCOPE.set((resolver if callable(resolver) else None, binding_of(vars_obj), use))
293
+ marker = automation_marker_for(vars_obj, getattr(run, "run_id", None))
294
+ token = _SCOPE.set((resolver if callable(resolver) else None, binding_of(vars_obj), use, marker))
246
295
  try:
247
296
  yield
248
297
  finally:
@@ -270,6 +319,7 @@ __all__ = [
270
319
  "EMAIL_USE_ACTION",
271
320
  "EMAIL_USE_AGENT_TOOL",
272
321
  "EmailBinding",
322
+ "automation_marker_for",
273
323
  "bind_email_account",
274
324
  "binding_of",
275
325
  "core_resolver_installed",