AbstractRuntime 0.7.2__tar.gz → 0.7.3__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 (654) hide show
  1. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/ACKNOWLEDGMENTS.md +1 -1
  2. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/CHANGELOG.md +36 -0
  3. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/PKG-INFO +7 -7
  4. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/README.md +3 -3
  5. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/api.md +3 -2
  6. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/architecture.md +1 -1
  7. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/automations.md +11 -1
  8. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/faq.md +8 -4
  9. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/integrations/abstractcore.md +5 -3
  10. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/troubleshooting.md +1 -1
  11. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/llms-full.txt +33 -16
  12. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/llms.txt +2 -2
  13. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/pyproject.toml +7 -5
  14. abstractruntime-0.7.3/release-notes.md +33 -0
  15. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/controller.py +29 -2
  16. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/llm_client.py +142 -1
  17. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_tool_approval.py +100 -3
  18. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_packaging_extras.py +3 -3
  19. abstractruntime-0.7.3/tests/test_resident_media_generation.py +310 -0
  20. abstractruntime-0.7.2/release-notes.md +0 -24
  21. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/.github/workflows/ci.yml +0 -0
  22. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/.github/workflows/release.yml +0 -0
  23. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/.gitignore +0 -0
  24. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/CODE_OF_CONDUCT.md +0 -0
  25. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/CONTRIBUTING.md +0 -0
  26. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/LICENSE +0 -0
  27. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/ROADMAP.md +0 -0
  28. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/SECURITY.md +0 -0
  29. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/README.md +0 -0
  30. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  31. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  32. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  33. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  34. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  35. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  36. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  37. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/adr/README.md +0 -0
  38. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/artifacts.md +0 -0
  39. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/README.md +0 -0
  40. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  41. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  42. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  43. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  44. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  45. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  46. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  47. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  48. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/003_wait_primitives.md +0 -0
  49. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  50. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  51. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  52. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  53. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  54. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  55. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  56. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  57. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/009_artifact_store.md +0 -0
  58. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  59. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  60. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  61. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  62. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  63. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  64. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  65. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  66. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  67. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  68. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  69. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  70. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  71. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  72. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  73. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  74. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  75. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  76. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  77. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  78. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  79. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  80. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  81. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  82. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  83. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/004_tests.md +0 -0
  84. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  85. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  86. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  87. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  88. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/README.md +0 -0
  89. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  90. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  91. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  92. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  93. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  94. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  95. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  96. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  97. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  98. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  99. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  100. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  101. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  102. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  103. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  104. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_portability/README.md +0 -0
  105. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  106. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  107. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  108. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  109. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  110. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  111. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  112. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  113. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  114. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  115. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  116. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  117. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  118. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  119. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  120. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  121. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  122. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  123. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  124. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  125. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  126. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  127. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  128. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  129. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  130. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  131. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  132. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  133. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  134. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/entity-runtime.md +0 -0
  135. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/evidence.md +0 -0
  136. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/getting-started.md +0 -0
  137. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/limits.md +0 -0
  138. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/manual_testing.md +0 -0
  139. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/mcp-worker.md +0 -0
  140. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/proposal.md +0 -0
  141. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/provenance.md +0 -0
  142. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/snapshots.md +0 -0
  143. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/tool-approval.md +0 -0
  144. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/tools-comms.md +0 -0
  145. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/docs/workflow-bundles.md +0 -0
  146. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/emails.config.example.yaml +0 -0
  147. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/01_hello_world.py +0 -0
  148. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/02_ask_user.py +0 -0
  149. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/03_wait_until.py +0 -0
  150. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/04_multi_step.py +0 -0
  151. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/05_persistence.py +0 -0
  152. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/06_llm_integration.py +0 -0
  153. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/07_react_agent.py +0 -0
  154. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/examples/README.md +0 -0
  155. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/mkdocs.yml +0 -0
  156. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/pytest.ini +0 -0
  157. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/scripts/backfill_diary_edges.py +0 -0
  158. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/scripts/generate_llms_full.py +0 -0
  159. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/__init__.py +0 -0
  160. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automation_queries.py +0 -0
  161. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/__init__.py +0 -0
  162. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/adapters.py +0 -0
  163. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/attention.py +0 -0
  164. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/bundle.py +0 -0
  165. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  166. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  167. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/commands.py +0 -0
  168. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/ledger.py +0 -0
  169. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/models.py +0 -0
  170. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/automations/service.py +0 -0
  171. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/__init__.py +0 -0
  172. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/config.py +0 -0
  173. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/effect_cancellation.py +0 -0
  174. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/event_keys.py +0 -0
  175. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/health.py +0 -0
  176. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/live_deltas.py +0 -0
  177. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/models.py +0 -0
  178. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/policy.py +0 -0
  179. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/progress_channel.py +0 -0
  180. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/run_attribution.py +0 -0
  181. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/run_identity.py +0 -0
  182. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/run_lifecycle.py +0 -0
  183. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/runtime.py +0 -0
  184. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/spec.py +0 -0
  185. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/tool_scope.py +0 -0
  186. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/core/vars.py +0 -0
  187. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/documents/__init__.py +0 -0
  188. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/documents/charts.py +0 -0
  189. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/documents/docx.py +0 -0
  190. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/documents/pdf.py +0 -0
  191. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/evidence/__init__.py +0 -0
  192. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/evidence/recorder.py +0 -0
  193. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/history_bundle.py +0 -0
  194. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/__init__.py +0 -0
  195. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/act_only.py +0 -0
  196. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/chat.py +0 -0
  197. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/communities.py +0 -0
  198. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/diary.py +0 -0
  199. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/digest.py +0 -0
  200. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/entity_runtime.py +0 -0
  201. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/fingerprint.py +0 -0
  202. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/lease.py +0 -0
  203. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/life.py +0 -0
  204. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/memory_reader.py +0 -0
  205. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/night_voice.py +0 -0
  206. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/phase_graph.py +0 -0
  207. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/phase_spec.py +0 -0
  208. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/prelude.py +0 -0
  209. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  210. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/reflection.py +0 -0
  211. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  212. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/substrate.py +0 -0
  213. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/tool_effects.py +0 -0
  214. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/tool_policy.py +0 -0
  215. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/tools.py +0 -0
  216. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/identity/visit_workflow.py +0 -0
  217. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/__init__.py +0 -0
  218. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  219. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  220. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  221. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  222. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  223. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  224. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  225. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  226. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  227. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  228. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  229. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  230. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  231. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  232. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  233. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  234. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  235. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  236. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  237. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  238. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  239. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  240. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  241. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  242. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  243. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  244. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  245. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  246. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  247. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  248. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  249. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  250. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/__init__.py +0 -0
  251. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/active_context.py +0 -0
  252. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/active_memory.py +0 -0
  253. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/compaction.py +0 -0
  254. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/kg_packets.py +0 -0
  255. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/memact_composer.py +0 -0
  256. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/recall_levels.py +0 -0
  257. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/memory/token_budget.py +0 -0
  258. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/rendering/__init__.py +0 -0
  259. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  260. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/rendering/json_stringify.py +0 -0
  261. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/scheduler/__init__.py +0 -0
  262. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/scheduler/convenience.py +0 -0
  263. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/scheduler/multi_store.py +0 -0
  264. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/scheduler/registry.py +0 -0
  265. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/scheduler/scheduler.py +0 -0
  266. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/session_history.py +0 -0
  267. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/session_turns.py +0 -0
  268. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/__init__.py +0 -0
  269. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/artifacts.py +0 -0
  270. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/base.py +0 -0
  271. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/commands.py +0 -0
  272. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/in_memory.py +0 -0
  273. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/json_files.py +0 -0
  274. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/lease.py +0 -0
  275. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/ledger_chain.py +0 -0
  276. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/ledger_slim.py +0 -0
  277. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/observable.py +0 -0
  278. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/offloading.py +0 -0
  279. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/serialize.py +0 -0
  280. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/snapshots.py +0 -0
  281. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/sqlite.py +0 -0
  282. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  283. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/triggers/__init__.py +0 -0
  284. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/triggers/manual.py +0 -0
  285. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/triggers/protocol.py +0 -0
  286. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/triggers/registry.py +0 -0
  287. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/triggers/schedule.py +0 -0
  288. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/turn_grounding.py +0 -0
  289. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/utils/__init__.py +0 -0
  290. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/utils/atomic_files.py +0 -0
  291. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/utils/file_filters.py +0 -0
  292. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/utils/workspace_paths.py +0 -0
  293. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  294. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  295. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  296. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  297. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  298. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  299. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  300. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  301. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  302. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  303. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  304. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  305. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  306. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  307. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  308. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  309. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  310. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  311. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  312. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  313. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  314. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  315. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  316. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  317. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/workflow_bundle/models.py +0 -0
  318. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  319. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  320. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  321. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/README.md +0 -0
  322. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/automation_harness.py +0 -0
  323. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/conftest.py +0 -0
  324. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_abstractcore_comms_facade.py +0 -0
  325. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_abstractcore_discovery_facade.py +0 -0
  326. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_abstractcore_host_facade.py +0 -0
  327. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_abstractcore_run_facade.py +0 -0
  328. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_abstractcore_telegram_facade.py +0 -0
  329. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_active_context_policy.py +0 -0
  330. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_active_memory.py +0 -0
  331. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_agora_agent_alias_identity.py +0 -0
  332. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_agora_tools_http.py +0 -0
  333. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  334. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_answer_user_effect.py +0 -0
  335. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_artifacts.py +0 -0
  336. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_commands.py +0 -0
  337. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_controller.py +0 -0
  338. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_controller_recovery.py +0 -0
  339. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_definition.py +0 -0
  340. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_discussion_isolation.py +0 -0
  341. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_growing_context.py +0 -0
  342. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_index.py +0 -0
  343. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_next_fire.py +0 -0
  344. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_occurrence_recovery.py +0 -0
  345. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_replay_read_only.py +0 -0
  346. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_retry.py +0 -0
  347. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_session_turns.py +0 -0
  348. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_automation_status.py +0 -0
  349. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_browser_probe_target_walling.py +0 -0
  350. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  351. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_capability_default_reasoning.py +0 -0
  352. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_chat_summarizer_integration.py +0 -0
  353. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_code_node_restricted_python.py +0 -0
  354. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_command_store.py +0 -0
  355. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_compaction_helpers.py +0 -0
  356. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_compaction_summarizer_route.py +0 -0
  357. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_config_facade_models_engines.py +0 -0
  358. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_control_adapter_while.py +0 -0
  359. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_controller_bundle_packaged.py +0 -0
  360. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_crash_ordering_inversions.py +0 -0
  361. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_create_if_absent.py +0 -0
  362. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_data_registry_facade.py +0 -0
  363. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_camera_gating.py +0 -0
  364. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_comms_gating.py +0 -0
  365. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_include_skim_files.py +0 -0
  366. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_include_skim_folders.py +0 -0
  367. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_include_skim_web.py +0 -0
  368. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_default_tools_search_files_executor.py +0 -0
  369. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_diary_capture.py +0 -0
  370. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_diary_write_rescue.py +0 -0
  371. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_directory_lease.py +0 -0
  372. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_disabled_toolsets_seam.py +0 -0
  373. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  374. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  375. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_discovery_voice_openai_api_key.py +0 -0
  376. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_discussion_session_anchor.py +0 -0
  377. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_document_markdown_tables.py +0 -0
  378. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_document_renderers_hr_quote.py +0 -0
  379. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_durable_toolsets.py +0 -0
  380. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_durable_write_discipline.py +0 -0
  381. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  382. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_effect_cancellation.py +0 -0
  383. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_effect_issuance_idempotency.py +0 -0
  384. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  385. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_election_consequence_teaching.py +0 -0
  386. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_emergence_experiment.py +0 -0
  387. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_emit_event_uses_wait_index.py +0 -0
  388. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_emit_event_without_workflow_registry.py +0 -0
  389. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_endpoint_profile_route_context.py +0 -0
  390. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_awake_memory_fixes.py +0 -0
  391. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_brain_effects.py +0 -0
  392. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_chat_driver.py +0 -0
  393. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_chat_tools_reflection.py +0 -0
  394. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_diary.py +0 -0
  395. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_execute_tool.py +0 -0
  396. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_fetch_url_tool.py +0 -0
  397. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_history_window.py +0 -0
  398. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_life_loop.py +0 -0
  399. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_memory_richness.py +0 -0
  400. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_phase_graph_conformance.py +0 -0
  401. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_react_visit_window.py +0 -0
  402. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_recent_memories.py +0 -0
  403. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_runtime.py +0 -0
  404. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_search_memory.py +0 -0
  405. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  406. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_substrate_resolution.py +0 -0
  407. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_visit_honesty.py +0 -0
  408. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_workspace_cap.py +0 -0
  409. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_entity_workspace_tools.py +0 -0
  410. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_event_wait_index.py +0 -0
  411. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  412. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_evidence_recorder.py +0 -0
  413. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  414. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_execute_command_output_offload.py +0 -0
  415. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_execution_capability_discovery.py +0 -0
  416. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_explicit_eject_other_clients.py +0 -0
  417. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_factory_default_retry_policy.py +0 -0
  418. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  419. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_format_repair_nudge.py +0 -0
  420. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_fresh_install_no_provider.py +0 -0
  421. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_gateway_facades_c4899.py +0 -0
  422. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_git_read_only_refiner.py +0 -0
  423. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_hf_process_residency_merge.py +0 -0
  424. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_history_window_multimodal.py +0 -0
  425. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_hot_path_store_reads.py +0 -0
  426. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_indexed_idempotency_lookup.py +0 -0
  427. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_integration_abstractcore.py +0 -0
  428. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_integrations_abstractcore.py +0 -0
  429. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_json_file_run_store_children_index.py +0 -0
  430. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_json_run_cache_bound.py +0 -0
  431. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_json_store_scan_memo.py +0 -0
  432. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_jsonl_ledger_recovery.py +0 -0
  433. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_kg_learn_and_recall_contract.py +0 -0
  434. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_ledger_chain.py +0 -0
  435. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_ledger_record_slimming.py +0 -0
  436. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_ledger_subscription.py +0 -0
  437. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_live_token_deltas.py +0 -0
  438. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_media_artifact_refs.py +0 -0
  439. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  440. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  441. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  442. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_requires_prompt.py +0 -0
  443. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_response_schema_normalization.py +0 -0
  444. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_structured_output_fallback.py +0 -0
  445. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_text_phase_progress.py +0 -0
  446. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  447. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  448. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  449. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_client_grounding_tail.py +0 -0
  450. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_client_media_artifacts.py +0 -0
  451. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_client_system_context.py +0 -0
  452. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_client_tool_call_parsing.py +0 -0
  453. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_retry_classification.py +0 -0
  454. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_llm_streaming_on_token.py +0 -0
  455. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_local_helper_tool_exposure.py +0 -0
  456. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_local_residency_host_sweep.py +0 -0
  457. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  458. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_max_iterations_ceiling.py +0 -0
  459. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mcp_remote_tool_executor.py +0 -0
  460. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mcp_worker_logging.py +0 -0
  461. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mcp_worker_security.py +0 -0
  462. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mcp_worker_stdio.py +0 -0
  463. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_media_artifact_resolution.py +0 -0
  464. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_media_capability_default_routing.py +0 -0
  465. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_media_subprocess.py +0 -0
  466. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memact_composer_from_kg_result.py +0 -0
  467. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_appraise_handler.py +0 -0
  468. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_communities.py +0 -0
  469. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  470. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_packets.py +0 -0
  471. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  472. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  473. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  474. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  475. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_note_effect.py +0 -0
  476. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_query_effect.py +0 -0
  477. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_query_rich_filters.py +0 -0
  478. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  479. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_seam_handlers.py +0 -0
  480. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_seam_sqlite_durability.py +0 -0
  481. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_memory_tag_effect.py +0 -0
  482. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mlx_generation_serialization.py +0 -0
  483. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_mlx_process_residency_merge.py +0 -0
  484. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_model_eject_cancel.py +0 -0
  485. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_model_residency_clean_switch.py +0 -0
  486. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_model_residency_control_plane.py +0 -0
  487. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  488. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_multi_store_scheduler.py +0 -0
  489. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_multimodal_abstractcore_integration.py +0 -0
  490. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_native_mlx_application_wiring.py +0 -0
  491. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_native_mlx_execution_controls_live.py +0 -0
  492. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_native_tool_channel.py +0 -0
  493. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_night_voice.py +0 -0
  494. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_no_default_provider_refusal_ux.py +0 -0
  495. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_offload_answer_chain_c4978.py +0 -0
  496. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  497. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_offloading.py +0 -0
  498. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_parallel_readonly_tool_execution.py +0 -0
  499. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_pause_resume.py +0 -0
  500. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_pdf_unicode_rendering.py +0 -0
  501. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_personal_cycle.py +0 -0
  502. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_phantom_attachment_index.py +0 -0
  503. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_phase_graph_artifact_control.py +0 -0
  504. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_phase_graph_obedience.py +0 -0
  505. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_phase_vocabulary_migration.py +0 -0
  506. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  507. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_cache_export_import.py +0 -0
  508. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  509. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_cache_modules.py +0 -0
  510. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  511. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  512. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_prompt_overlay.py +0 -0
  513. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  514. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_provider_pin_routing_isolation.py +0 -0
  515. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_queryable_run_store.py +0 -0
  516. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  517. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_read_idle_threading.py +0 -0
  518. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_readoption_experiment.py +0 -0
  519. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_real_integration.py +0 -0
  520. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_realize_election.py +0 -0
  521. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_recall_levels_policy.py +0 -0
  522. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_remote_client_cancel.py +0 -0
  523. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_remote_llm_client.py +0 -0
  524. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_remote_speculation_defaults.py +0 -0
  525. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_rendering_agent_trace_report.py +0 -0
  526. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_rendering_json_stringify.py +0 -0
  527. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_report_branding.py +0 -0
  528. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_resume_concurrent_same_wait.py +0 -0
  529. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_retry_idempotency.py +0 -0
  530. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_run_history_bundle.py +0 -0
  531. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_run_index_workspace_root.py +0 -0
  532. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_run_mutation_lock.py +0 -0
  533. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_run_scoped_tool_policy.py +0 -0
  534. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_run_tool_scope_ceiling.py +0 -0
  535. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_browser_session_boundary.py +0 -0
  536. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  537. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  538. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_effect_invocation_trace.py +0 -0
  539. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  540. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_install_boundary.py +0 -0
  541. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  542. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_node_traces.py +0 -0
  543. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  544. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_runtime_tick_step_gate.py +0 -0
  545. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_scheduler.py +0 -0
  546. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_send_email_refiner.py +0 -0
  547. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  548. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_history.py +0 -0
  549. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_prompt_cache_attribution.py +0 -0
  550. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_prompt_cache_visibility.py +0 -0
  551. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_route_stamp.py +0 -0
  552. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_session_start_cost.py +0 -0
  553. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_shell_tool_exposure.py +0 -0
  554. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_snapshots.py +0 -0
  555. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_speculation_inheritance.py +0 -0
  556. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_speculation_reaches_provider_construction.py +0 -0
  557. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_sqlite_ledger_store.py +0 -0
  558. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_start_subworkflow_async_wait.py +0 -0
  559. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  560. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  561. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_steer_sidecar.py +0 -0
  562. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_storage_deletion.py +0 -0
  563. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_structured_output_schema_enum.py +0 -0
  564. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_subworkflow.py +0 -0
  565. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_terminal_effect_completion.py +0 -0
  566. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  567. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_thinking_inheritance.py +0 -0
  568. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  569. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_approval_executor.py +0 -0
  570. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_approval_resume_executes.py +0 -0
  571. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_approval_wait_key_identity.py +0 -0
  572. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_calls_idempotency_keys.py +0 -0
  573. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_catalog.py +0 -0
  574. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_descriptor_registry.py +0 -0
  575. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_argument_sanitization.py +0 -0
  576. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_error_output_detection.py +0 -0
  577. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_filename_alias.py +0 -0
  578. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  579. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_read_file_aliases.py +0 -0
  580. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_executor_timeout.py +0 -0
  581. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_inventory_facade.py +0 -0
  582. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_invoke_effect.py +0 -0
  583. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_policy_and_mounts.py +0 -0
  584. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_tool_wait_allowlist_safety.py +0 -0
  585. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_topic_election_world_model.py +0 -0
  586. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_trace_context_propagation.py +0 -0
  587. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_trigger_registry.py +0 -0
  588. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_trigger_schedule_math.py +0 -0
  589. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_turn_grounding_byte_stability.py +0 -0
  590. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_turn_grounding_carriers_a3.py +0 -0
  591. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_vars_query_effect.py +0 -0
  592. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visit_ab_fixture.py +0 -0
  593. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visit_midturn_elections.py +0 -0
  594. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visit_midturn_resume.py +0 -0
  595. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visit_workflow.py +0 -0
  596. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  597. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  598. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  599. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  600. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  601. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  602. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_entity_memory_nodes.py +0 -0
  603. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  604. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_llm_call_partial_override.py +0 -0
  605. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  606. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_memact_compose_node.py +0 -0
  607. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  608. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  609. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  610. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  611. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  612. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_add_message_builtin.py +0 -0
  613. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  614. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_agora_react_agent.py +0 -0
  615. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_call_tool_node.py +0 -0
  616. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  617. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_compiler_basic.py +0 -0
  618. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  619. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_continue_on_error.py +0 -0
  620. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  621. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  622. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  623. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_function_library.py +0 -0
  624. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_get_element_node.py +0 -0
  625. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_get_random_element_node.py +0 -0
  626. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_get_var_node.py +0 -0
  627. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_has_tools_builtin.py +0 -0
  628. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  629. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  630. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_make_object_node.py +0 -0
  631. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_media_nodes.py +0 -0
  632. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  633. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_memory_source_pins.py +0 -0
  634. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_pin_expressions.py +0 -0
  635. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_prompt_only.py +0 -0
  636. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_random_nodes.py +0 -0
  637. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_schema_enum_switch.py +0 -0
  638. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_string_contains_replace.py +0 -0
  639. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_visualflow_tool_parameters_node.py +0 -0
  640. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_voice_openai_api_key_path.py +0 -0
  641. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_w4_feelings_lens.py +0 -0
  642. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_wait_event_deadline.py +0 -0
  643. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_wait_event_prompt_metadata.py +0 -0
  644. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_wait_until_streak.py +0 -0
  645. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_wait_until_utc_normalization.py +0 -0
  646. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workflow_bundle_registry.py +0 -0
  647. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_builtin_deny.py +0 -0
  648. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  649. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  650. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  651. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  652. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_prompt_context.py +0 -0
  653. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_workspace_read_only.py +0 -0
  654. {abstractruntime-0.7.2 → abstractruntime-0.7.3}/tests/test_write_chart.py +0 -0
@@ -11,7 +11,7 @@ The canonical dependency list lives in `pyproject.toml`.
11
11
  - **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
12
12
 
13
13
  ## Runtime integrations
14
- - **abstractcore** (`abstractcore>=2.19.0`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
14
+ - **abstractcore** (`abstractcore>=2.19.2`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
15
15
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
16
16
  - The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
17
17
  - **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.3] - 2026-09-29
11
+
12
+ ### Security
13
+
14
+ - **An automation's tool grant no longer pre-approves sending messages** (framework backlog 0992
15
+ WP0). With the default `policy.tool_approval: "auto"`, the grant listed every tool the runtime
16
+ classifies, `send_email` included, and an explicit name in the grant overrides the
17
+ `model_controlled_destination` belt: an occurrence that read an inbound email or a web page could
18
+ mail data to any address that text named. The grant now withholds every tool whose inventory row
19
+ carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
20
+ `send_telegram_artifact`), even when the target's `allowed_tools` names it, and lists them in
21
+ `tool_policy.withheld_tools`. Their calls take the normal approval point: a `send_email` whose
22
+ every recipient is the registered user's address (`_runtime.operator_email`) still runs
23
+ unattended; any other recipient parks the occurrence on a `tool_approval` wait until a person
24
+ approves or refuses it (the behaviour of `"ask"`). Recipients named in an automation's definition
25
+ are not auto-approved yet; that allowlist is part of backlog 0992.
26
+
27
+ ### Fixed
28
+
29
+ - **A resident image/video model serves generation.** After `load_model_residency(task="image_generation")`
30
+ (the Gateway's `POST /models/load`, the console Load button, a flow's model residency node), a local
31
+ image or video request whose every media output names a resident model runs in-process on the loaded
32
+ pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`) instead of loading the model
33
+ again in a one-shot subprocess. Measured through AbstractGateway with FLUX.2 [klein] 4B on a 16 GB
34
+ NVIDIA card: 17-19 s per image on the resident pipeline against 54-59 s with a reload per request, and
35
+ no second copy of the weights on the GPU. Pooled clients of `create_local_runtime(...)` use their pool's residency core. Models that
36
+ were not explicitly loaded keep the isolated subprocess (crash isolation for native Metal/CUDA
37
+ failures), so the explicit load is the opt-in.
38
+
39
+ ### Changed
40
+
41
+ - **Requires AbstractCore 2.19.2 or newer** (`abstractcore`, `abstractcore[apple]`, `abstractcore[gpu]`).
42
+ It brings AbstractVision 0.3.33, whose loads report `loaded_new` (a fresh image-model load reads as
43
+ `loaded`, not `already_loaded`) and whose unload frees the model's memory, which the resident path
44
+ above relies on.
45
+
10
46
  ## [0.7.2] - 2026-09-29
11
47
 
12
48
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.19.0
23
+ Requires-Dist: abstractcore>=2.19.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.19.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.19.2; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[gpu]>=2.19.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.19.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: pytest>=7.0.0; extra == 'test'
@@ -54,7 +54,7 @@ Description-Content-Type: text/markdown
54
54
 
55
55
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
56
56
 
57
- **Version:** 0.7.2 • **Python:** 3.10+
57
+ **Version:** 0.7.3 • **Python:** 3.10+
58
58
 
59
59
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
60
60
 
@@ -82,7 +82,7 @@ Remote-light runtime:
82
82
  pip install abstractruntime
83
83
  ```
84
84
 
85
- The base install includes AbstractCore 2.19.0 or newer (its light install:
85
+ The base install includes AbstractCore 2.19.2 or newer (its light install:
86
86
  remote providers, tools, vision, voice, audio, and music integration), plus the
87
87
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
88
88
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -146,7 +146,7 @@ state = rt.resume(
146
146
  assert state.status.value == "completed"
147
147
  ```
148
148
 
149
- ## What’s included (v0.7.2)
149
+ ## What’s included (v0.7.3)
150
150
 
151
151
  Kernel (import-light):
152
152
  - 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.7.2 • **Python:** 3.10+
7
+ **Version:** 0.7.3 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -32,7 +32,7 @@ Remote-light runtime:
32
32
  pip install abstractruntime
33
33
  ```
34
34
 
35
- The base install includes AbstractCore 2.19.0 or newer (its light install:
35
+ The base install includes AbstractCore 2.19.2 or newer (its light install:
36
36
  remote providers, tools, vision, voice, audio, and music integration), plus the
37
37
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
38
38
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -96,7 +96,7 @@ state = rt.resume(
96
96
  assert state.status.value == "completed"
97
97
  ```
98
98
 
99
- ## What’s included (v0.7.2)
99
+ ## What’s included (v0.7.3)
100
100
 
101
101
  Kernel (import-light):
102
102
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -277,7 +277,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
277
277
 
278
278
  ### AbstractCore (LLM + tools)
279
279
 
280
- Requires: `pip install abstractruntime` (AbstractCore 2.19.0 or newer is part of the base install).
280
+ Requires: `pip install abstractruntime` (AbstractCore 2.19.2 or newer is part of the base install).
281
281
 
282
282
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
283
283
 
@@ -324,7 +324,8 @@ Multimodal support:
324
324
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
325
325
  - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
326
326
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
327
- - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and generated image/video tasks also report `execution_mode="local_one_shot_subprocess"`
327
+ - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
328
+ - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
328
329
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
329
330
 
330
331
  Prompt cache / cached sessions:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
3
  > Updated: 2026-09-29
4
- > Version: 0.7.2
4
+ > Version: 0.7.3
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.
@@ -26,7 +26,8 @@ sources), `abstractruntime.automation_queries` (listing), `abstractruntime.sessi
26
26
  - **Automations are quiet.** An occurrence asks for attention only when its output says `notify`, when it still
27
27
  fails after its last retry, or while it waits on a person.
28
28
  - **Creating an automation is consent for its tools.** With the default `tool_approval: "auto"` an occurrence's tools
29
- run without asking; set `"ask"` to approve them one batch at a time.
29
+ run without asking, except messages to anyone but the registered user (those wait for approval); set `"ask"` to
30
+ approve every batch.
30
31
  - **Everything is recorded.** Every admission, dispatch, retry, completion and command is an `automation.*` record in
31
32
  the controller's ledger. A crash at any point never loses an occurrence and never starts one twice.
32
33
 
@@ -413,6 +414,15 @@ returns the refusal message for a tool, or `None` when it is allowed.
413
414
  - A name outside the run's tool ceiling (`allowed_tools`) grants nothing: approval never widens the ceiling.
414
415
  - A tool outside `TOOL_EFFECT_CLASSES` (a third-party MCP tool, for example) is not in the grant and still asks.
415
416
  - A `tool_policy` that the target's own `input_data._runtime` already carries is left as it is.
417
+ - **Tools that message model-chosen recipients are never granted** (framework backlog 0992 WP0): every tool
418
+ whose inventory row carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
419
+ `send_telegram_artifact`), even when `allowed_tools` names it. They are listed in the grant's
420
+ `withheld_tools` and go through the normal approval point: a `send_email` whose every recipient is the
421
+ registered user's address (`_runtime.operator_email`, set by the host; the gateway freezes it into the
422
+ target's inputs) runs; any other recipient parks the occurrence on a `tool_approval` wait, as under `"ask"`,
423
+ until a person approves or refuses it. An occurrence that reads untrusted text (an inbound email, a fetched
424
+ page) therefore cannot mail data to an address that text names. When the inventory cannot be read, every
425
+ `comms` tool is withheld.
416
426
  - **`"ask"`.** No grant. A tool call that needs approval waits on a `tool_approval` wait, as in a chat.
417
427
 
418
428
  The grant is frozen with the rest of the occurrence's inputs: a revision of `tool_approval` applies from the next
@@ -79,8 +79,12 @@ Docs: `automations.md#runs-sessions-and-history`, `api.md#sessions-and-history`.
79
79
 
80
80
  Not by default. With `policy.tool_approval: "auto"`, creating the automation is the consent: each occurrence gets a
81
81
  frozen grant for the target's tools (its `allowed_tools`, or every tool the runtime classifies). Tools the runtime
82
- does not classify, such as third-party MCP tools, still ask, and `ask_user` questions still wait for a person. Use
83
- `"ask"` to approve each tool batch; pending approvals appear in `pending_waits` as `tool_approval` waits.
82
+ does not classify, such as third-party MCP tools, still ask, and `ask_user` questions still wait for a person.
83
+ Tools that send messages to recipients the model chooses (`send_email`, `send_whatsapp_message`,
84
+ `send_telegram_*`) are never in the grant: a `send_email` to the registered user's own address runs, any other
85
+ recipient waits for approval, so text an occurrence reads (an inbound email, a web page) cannot make it mail data
86
+ elsewhere. Use `"ask"` to approve each tool batch; pending approvals appear in `pending_waits` as `tool_approval`
87
+ waits.
84
88
 
85
89
  Docs: `automations.md#tool-approval`, `automations.md#waits-on-a-person`.
86
90
 
@@ -282,9 +286,9 @@ Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/ab
282
286
 
283
287
  ## Why can local media residency return `ok:false` without failing the run?
284
288
 
285
- Because local media warmup is not always a meaningful reusable state. In particular, local image generation may execute through a one-shot subprocess isolation boundary, so a prior warmup cannot be reused by the next request. Runtime therefore reports unsupported local media residency explicitly instead of pretending success.
289
+ Because a local media load can fail or have nothing to load into: no capability plugin serves the task, or the plugin refused the model. Runtime reports that explicitly instead of pretending success. A load that succeeds is used: local image and video requests normally run in a one-shot subprocess (crash isolation, one model load per request), but a request whose model is resident runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`).
286
290
 
287
- For optional residency (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true`. Unsupported local media responses also report `requires_long_lived_server=true` and a `config_hint` that points at `ABSTRACTCORE_SERVER_BASE_URL`; image generation additionally reports `execution_mode="local_one_shot_subprocess"`.
291
+ For optional residency (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true`. Unsupported local media responses also report `requires_long_lived_server=true` and a `config_hint` that points at `ABSTRACTCORE_SERVER_BASE_URL`; image generation additionally reports `execution_mode="local_one_shot_subprocess"`, the path those requests then take.
288
292
  Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/effect_handlers.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
289
293
 
290
294
  ## What are “local / remote / hybrid” execution modes?
@@ -301,7 +301,9 @@ Media-only normalized results distinguish orchestration identity from the actual
301
301
  - `runtime_provider` / `runtime_model`: the runtime-side orchestration identity, when relevant
302
302
  - `media_provider` / `media_model`: the actual image/video/voice/music backend identity surfaced from the generated output
303
303
 
304
- For local one-shot subprocess image generation, runtime metadata also records `execution_mode="local_one_shot_subprocess"`.
304
+ Local image and video generation runs in a one-shot subprocess by default: a native backend failure (a Metal abort, a CUDA crash) ends the worker, not the Gateway/Runtime process, and the worker's memory is returned when it exits. The price is a full model load per request. Runtime metadata records `execution_mode="local_one_shot_subprocess"`.
305
+
306
+ A model you load explicitly (`load_model_residency(task="image_generation", provider=..., model=...)`, the Gateway's `POST /models/load`, the console Load button, a flow's model residency node) is the exception: when every media output of a request names a model resident in the client's capability residency core, the request runs in-process on that loaded pipeline, with no subprocess and no second copy of the weights. The metadata then records `execution_mode="resident_in_process"` and `resident_load_ids`. A pooled client of `create_local_runtime(...)` uses its pool's residency core. Unloading the model (`unload_model_residency`, `POST /models/unload`) returns generation to the subprocess. Requests for a model that is not resident keep the subprocess, so an explicit load is how you opt into in-process execution for that model.
305
307
 
306
308
  Long-running generated media may expose provider progress callbacks. Runtime offers a transient `on_progress` callback during `LLM_CALL` execution and persists each callback as an `EMIT_EVENT` ledger record named `abstract.progress`. The callback itself is never stored in the effect payload or run vars.
307
309
 
@@ -335,13 +337,13 @@ Remote runtimes support chat media by sending OpenAI-compatible data URL content
335
337
 
336
338
  Remote multimodal generation currently supports one `output` selector per `LLM_CALL`. Hybrid runtimes use the same remote LLM/media path as remote mode while executing tools locally. Local runtimes can use AbstractCore's in-process multimodal dispatcher for richer capability plugin behavior.
337
339
 
338
- Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` return:
340
+ Local media residency goes through the installed AbstractCore capability plugins (AbstractVision for image/upscale/video, AbstractVoice for TTS/STT, AbstractMusic for music): `load_model_residency` preloads the model in-process and `list_model_residency` lists it. When no plugin can serve the task, the result is explicit rather than a pretend success:
339
341
 
340
342
  - `code="model_residency_unsupported"`
341
343
  - `requires_long_lived_server=true`
342
344
  - `config_hint` pointing to `ABSTRACTCORE_SERVER_BASE_URL`
343
345
 
344
- Image/video-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local generated media can be isolated into one-shot workers unless a long-lived Core server owns the media backend.
346
+ Image/video-generation unsupported responses also include `execution_mode="local_one_shot_subprocess"`, the path those requests then take.
345
347
 
346
348
  When the workflow marks residency as optional (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true` so hosts can render the no-op honestly.
347
349
 
@@ -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.19.0`.
23
+ - The current AbstractCore integration expects `abstractcore>=2.19.2`.
24
24
 
25
25
  Verify:
26
26
 
@@ -52,7 +52,7 @@ See llms.txt for the linked index.
52
52
 
53
53
  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.
54
54
 
55
- **Version:** 0.7.2 • **Python:** 3.10+
55
+ **Version:** 0.7.3 • **Python:** 3.10+
56
56
 
57
57
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
58
58
 
@@ -80,7 +80,7 @@ Remote-light runtime:
80
80
  pip install abstractruntime
81
81
  ```
82
82
 
83
- The base install includes AbstractCore 2.19.0 or newer (its light install:
83
+ The base install includes AbstractCore 2.19.2 or newer (its light install:
84
84
  remote providers, tools, vision, voice, audio, and music integration), plus the
85
85
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
86
86
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -144,7 +144,7 @@ state = rt.resume(
144
144
  assert state.status.value == "completed"
145
145
  ```
146
146
 
147
- ## What’s included (v0.7.2)
147
+ ## What’s included (v0.7.3)
148
148
 
149
149
  Kernel (import-light):
150
150
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -430,7 +430,7 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
430
430
  # AbstractRuntime — Architecture
431
431
 
432
432
  > Updated: 2026-09-29
433
- > Version: 0.7.2
433
+ > Version: 0.7.3
434
434
  > Scope: this describes **what is implemented in this repository**.
435
435
 
436
436
  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.
@@ -1132,7 +1132,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
1132
1132
 
1133
1133
  ### AbstractCore (LLM + tools)
1134
1134
 
1135
- Requires: `pip install abstractruntime` (AbstractCore 2.19.0 or newer is part of the base install).
1135
+ Requires: `pip install abstractruntime` (AbstractCore 2.19.2 or newer is part of the base install).
1136
1136
 
1137
1137
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
1138
1138
 
@@ -1179,7 +1179,8 @@ Multimodal support:
1179
1179
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
1180
1180
  - generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
1181
1181
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
1182
- - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and generated image/video tasks also report `execution_mode="local_one_shot_subprocess"`
1182
+ - 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`)
1183
+ - 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"`
1183
1184
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
1184
1185
 
1185
1186
  Prompt cache / cached sessions:
@@ -1306,8 +1307,12 @@ Docs: `automations.md#runs-sessions-and-history`, `api.md#sessions-and-history`.
1306
1307
 
1307
1308
  Not by default. With `policy.tool_approval: "auto"`, creating the automation is the consent: each occurrence gets a
1308
1309
  frozen grant for the target's tools (its `allowed_tools`, or every tool the runtime classifies). Tools the runtime
1309
- does not classify, such as third-party MCP tools, still ask, and `ask_user` questions still wait for a person. Use
1310
- `"ask"` to approve each tool batch; pending approvals appear in `pending_waits` as `tool_approval` waits.
1310
+ does not classify, such as third-party MCP tools, still ask, and `ask_user` questions still wait for a person.
1311
+ Tools that send messages to recipients the model chooses (`send_email`, `send_whatsapp_message`,
1312
+ `send_telegram_*`) are never in the grant: a `send_email` to the registered user's own address runs, any other
1313
+ recipient waits for approval, so text an occurrence reads (an inbound email, a web page) cannot make it mail data
1314
+ elsewhere. Use `"ask"` to approve each tool batch; pending approvals appear in `pending_waits` as `tool_approval`
1315
+ waits.
1311
1316
 
1312
1317
  Docs: `automations.md#tool-approval`, `automations.md#waits-on-a-person`.
1313
1318
 
@@ -1509,9 +1514,9 @@ Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/ab
1509
1514
 
1510
1515
  ## Why can local media residency return `ok:false` without failing the run?
1511
1516
 
1512
- Because local media warmup is not always a meaningful reusable state. In particular, local image generation may execute through a one-shot subprocess isolation boundary, so a prior warmup cannot be reused by the next request. Runtime therefore reports unsupported local media residency explicitly instead of pretending success.
1517
+ Because a local media load can fail or have nothing to load into: no capability plugin serves the task, or the plugin refused the model. Runtime reports that explicitly instead of pretending success. A load that succeeds is used: local image and video requests normally run in a one-shot subprocess (crash isolation, one model load per request), but a request whose model is resident runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`).
1513
1518
 
1514
- For optional residency (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true`. Unsupported local media responses also report `requires_long_lived_server=true` and a `config_hint` that points at `ABSTRACTCORE_SERVER_BASE_URL`; image generation additionally reports `execution_mode="local_one_shot_subprocess"`.
1519
+ For optional residency (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true`. Unsupported local media responses also report `requires_long_lived_server=true` and a `config_hint` that points at `ABSTRACTCORE_SERVER_BASE_URL`; image generation additionally reports `execution_mode="local_one_shot_subprocess"`, the path those requests then take.
1515
1520
  Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/effect_handlers.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
1516
1521
 
1517
1522
  ## What are “local / remote / hybrid” execution modes?
@@ -1633,7 +1638,7 @@ Fix:
1633
1638
  - Install or upgrade the base Runtime package. LLM/tools integration, common
1634
1639
  remote-light multimodal dependencies, and the MCP worker entry point are part
1635
1640
  of the base install.
1636
- - The current AbstractCore integration expects `abstractcore>=2.19.0`.
1641
+ - The current AbstractCore integration expects `abstractcore>=2.19.2`.
1637
1642
 
1638
1643
  Verify:
1639
1644
 
@@ -2217,7 +2222,9 @@ Media-only normalized results distinguish orchestration identity from the actual
2217
2222
  - `runtime_provider` / `runtime_model`: the runtime-side orchestration identity, when relevant
2218
2223
  - `media_provider` / `media_model`: the actual image/video/voice/music backend identity surfaced from the generated output
2219
2224
 
2220
- For local one-shot subprocess image generation, runtime metadata also records `execution_mode="local_one_shot_subprocess"`.
2225
+ Local image and video generation runs in a one-shot subprocess by default: a native backend failure (a Metal abort, a CUDA crash) ends the worker, not the Gateway/Runtime process, and the worker's memory is returned when it exits. The price is a full model load per request. Runtime metadata records `execution_mode="local_one_shot_subprocess"`.
2226
+
2227
+ A model you load explicitly (`load_model_residency(task="image_generation", provider=..., model=...)`, the Gateway's `POST /models/load`, the console Load button, a flow's model residency node) is the exception: when every media output of a request names a model resident in the client's capability residency core, the request runs in-process on that loaded pipeline, with no subprocess and no second copy of the weights. The metadata then records `execution_mode="resident_in_process"` and `resident_load_ids`. A pooled client of `create_local_runtime(...)` uses its pool's residency core. Unloading the model (`unload_model_residency`, `POST /models/unload`) returns generation to the subprocess. Requests for a model that is not resident keep the subprocess, so an explicit load is how you opt into in-process execution for that model.
2221
2228
 
2222
2229
  Long-running generated media may expose provider progress callbacks. Runtime offers a transient `on_progress` callback during `LLM_CALL` execution and persists each callback as an `EMIT_EVENT` ledger record named `abstract.progress`. The callback itself is never stored in the effect payload or run vars.
2223
2230
 
@@ -2251,13 +2258,13 @@ Remote runtimes support chat media by sending OpenAI-compatible data URL content
2251
2258
 
2252
2259
  Remote multimodal generation currently supports one `output` selector per `LLM_CALL`. Hybrid runtimes use the same remote LLM/media path as remote mode while executing tools locally. Local runtimes can use AbstractCore's in-process multimodal dispatcher for richer capability plugin behavior.
2253
2260
 
2254
- Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` return:
2261
+ Local media residency goes through the installed AbstractCore capability plugins (AbstractVision for image/upscale/video, AbstractVoice for TTS/STT, AbstractMusic for music): `load_model_residency` preloads the model in-process and `list_model_residency` lists it. When no plugin can serve the task, the result is explicit rather than a pretend success:
2255
2262
 
2256
2263
  - `code="model_residency_unsupported"`
2257
2264
  - `requires_long_lived_server=true`
2258
2265
  - `config_hint` pointing to `ABSTRACTCORE_SERVER_BASE_URL`
2259
2266
 
2260
- Image/video-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local generated media can be isolated into one-shot workers unless a long-lived Core server owns the media backend.
2267
+ Image/video-generation unsupported responses also include `execution_mode="local_one_shot_subprocess"`, the path those requests then take.
2261
2268
 
2262
2269
  When the workflow marks residency as optional (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true` so hosts can render the no-op honestly.
2263
2270
 
@@ -3495,7 +3502,8 @@ sources), `abstractruntime.automation_queries` (listing), `abstractruntime.sessi
3495
3502
  - **Automations are quiet.** An occurrence asks for attention only when its output says `notify`, when it still
3496
3503
  fails after its last retry, or while it waits on a person.
3497
3504
  - **Creating an automation is consent for its tools.** With the default `tool_approval: "auto"` an occurrence's tools
3498
- run without asking; set `"ask"` to approve them one batch at a time.
3505
+ run without asking, except messages to anyone but the registered user (those wait for approval); set `"ask"` to
3506
+ approve every batch.
3499
3507
  - **Everything is recorded.** Every admission, dispatch, retry, completion and command is an `automation.*` record in
3500
3508
  the controller's ledger. A crash at any point never loses an occurrence and never starts one twice.
3501
3509
 
@@ -3882,6 +3890,15 @@ returns the refusal message for a tool, or `None` when it is allowed.
3882
3890
  - A name outside the run's tool ceiling (`allowed_tools`) grants nothing: approval never widens the ceiling.
3883
3891
  - A tool outside `TOOL_EFFECT_CLASSES` (a third-party MCP tool, for example) is not in the grant and still asks.
3884
3892
  - A `tool_policy` that the target's own `input_data._runtime` already carries is left as it is.
3893
+ - **Tools that message model-chosen recipients are never granted** (framework backlog 0992 WP0): every tool
3894
+ whose inventory row carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
3895
+ `send_telegram_artifact`), even when `allowed_tools` names it. They are listed in the grant's
3896
+ `withheld_tools` and go through the normal approval point: a `send_email` whose every recipient is the
3897
+ registered user's address (`_runtime.operator_email`, set by the host; the gateway freezes it into the
3898
+ target's inputs) runs; any other recipient parks the occurrence on a `tool_approval` wait, as under `"ask"`,
3899
+ until a person approves or refuses it. An occurrence that reads untrusted text (an inbound email, a fetched
3900
+ page) therefore cannot mail data to an address that text names. When the inventory cannot be read, every
3901
+ `comms` tool is withheld.
3885
3902
  - **`"ask"`.** No grant. A tool call that needs approval waits on a `tool_approval` wait, as in a chat.
3886
3903
 
3887
3904
  The grant is frozen with the rest of the occurrence's inputs: a revision of `tool_approval` applies from the next
@@ -5266,7 +5283,7 @@ The canonical dependency list lives in `pyproject.toml`.
5266
5283
  - **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
5267
5284
 
5268
5285
  ## Runtime integrations
5269
- - **abstractcore** (`abstractcore>=2.19.0`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
5286
+ - **abstractcore** (`abstractcore>=2.19.2`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
5270
5287
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
5271
5288
  - The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
5272
5289
  - **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
@@ -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.7.2
6
+ - Version: 0.7.3
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.19.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.19.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.7.2"
7
+ version = "0.7.3"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -50,8 +50,10 @@ dependencies = [
50
50
  # Runtime's base install is the remote-light workflow host: LLM/tool effects,
51
51
  # MCP worker support, and multimodal routing come with AbstractCore's light
52
52
  # install (remote providers, built-in tools, media inputs, voice/vision/music
53
- # plugins) without selecting local inference engines.
54
- "abstractcore>=2.19.0",
53
+ # plugins) without selecting local inference engines. 2.19.2 floors
54
+ # abstractvision>=0.3.33, whose resident loads report `loaded_new` and whose
55
+ # unload frees the pipeline (the resident media path relies on both).
56
+ "abstractcore>=2.19.2",
55
57
  "openai<3.0.0,>=1.109.1",
56
58
  "httpx<1.0.0,>=0.28.1",
57
59
  "anyio<5.0.0,>=4.12.1",
@@ -68,12 +70,12 @@ dependencies = [
68
70
 
69
71
  [project.optional-dependencies]
70
72
  apple = [
71
- "abstractcore[apple]>=2.19.0",
73
+ "abstractcore[apple]>=2.19.2",
72
74
  "setuptools<82.0.0,>=80.10.2",
73
75
  ]
74
76
 
75
77
  gpu = [
76
- "abstractcore[gpu]>=2.19.0",
78
+ "abstractcore[gpu]>=2.19.2",
77
79
  # vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
78
80
  "setuptools<82.0.0,>=77.0.3",
79
81
  ]
@@ -0,0 +1,33 @@
1
+ ### Security
2
+
3
+ - **An automation's tool grant no longer pre-approves sending messages** (framework backlog 0992
4
+ WP0). With the default `policy.tool_approval: "auto"`, the grant listed every tool the runtime
5
+ classifies, `send_email` included, and an explicit name in the grant overrides the
6
+ `model_controlled_destination` belt: an occurrence that read an inbound email or a web page could
7
+ mail data to any address that text named. The grant now withholds every tool whose inventory row
8
+ carries `comms_send` (`send_email`, `send_whatsapp_message`, `send_telegram_message`,
9
+ `send_telegram_artifact`), even when the target's `allowed_tools` names it, and lists them in
10
+ `tool_policy.withheld_tools`. Their calls take the normal approval point: a `send_email` whose
11
+ every recipient is the registered user's address (`_runtime.operator_email`) still runs
12
+ unattended; any other recipient parks the occurrence on a `tool_approval` wait until a person
13
+ approves or refuses it (the behaviour of `"ask"`). Recipients named in an automation's definition
14
+ are not auto-approved yet; that allowlist is part of backlog 0992.
15
+
16
+ ### Fixed
17
+
18
+ - **A resident image/video model serves generation.** After `load_model_residency(task="image_generation")`
19
+ (the Gateway's `POST /models/load`, the console Load button, a flow's model residency node), a local
20
+ image or video request whose every media output names a resident model runs in-process on the loaded
21
+ pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`) instead of loading the model
22
+ again in a one-shot subprocess. Measured through AbstractGateway with FLUX.2 [klein] 4B on a 16 GB
23
+ NVIDIA card: 17-19 s per image on the resident pipeline against 54-59 s with a reload per request, and
24
+ no second copy of the weights on the GPU. Pooled clients of `create_local_runtime(...)` use their pool's residency core. Models that
25
+ were not explicitly loaded keep the isolated subprocess (crash isolation for native Metal/CUDA
26
+ failures), so the explicit load is the opt-in.
27
+
28
+ ### Changed
29
+
30
+ - **Requires AbstractCore 2.19.2 or newer** (`abstractcore`, `abstractcore[apple]`, `abstractcore[gpu]`).
31
+ It brings AbstractVision 0.3.33, whose loads report `loaded_new` (a fresh image-model load reads as
32
+ `loaded`, not `already_loaded`) and whose unload frees the model's memory, which the resident path
33
+ above relies on.
@@ -193,6 +193,24 @@ def _render_prompt(input_data: Dict[str, Any], *, envelope: Dict[str, Any], inde
193
193
  AUTOMATION_GRANT_SOURCE = "automation-policy"
194
194
 
195
195
 
196
+ def _grant_excludes(name: str) -> bool:
197
+ """True for a tool the automation grant never pre-approves: one that sends a message people
198
+ receive to recipients the MODEL chooses (the served row's `comms_send` fact: `send_email`,
199
+ `send_whatsapp_message`, `send_telegram_*`). Framework backlog 0992 WP0: an unattended
200
+ occurrence reading untrusted input (an inbound email, a fetched page) must not be able to mail
201
+ data to an address that input names. Decided on the row's typed facts, never on the name; an
202
+ unreadable inventory withholds every `comms` tool (fail closed)."""
203
+ try:
204
+ from ..integrations.abstractcore.effect_handlers import _risk_row_for_tool
205
+
206
+ row = _risk_row_for_tool(name)
207
+ except Exception: # noqa: BLE001 - no facts: withhold the whole comms class
208
+ from ..integrations.abstractcore.tool_effects import COMMS, TOOL_EFFECT_CLASSES
209
+
210
+ return TOOL_EFFECT_CLASSES.get(name) == COMMS
211
+ return bool(row is not None and row.get("comms_send"))
212
+
213
+
196
214
  def grant_tool_approval(input_data: Dict[str, Any]) -> None:
197
215
  """`policy.tool_approval == "auto"`: pre-approve the target's tools for this occurrence.
198
216
 
@@ -204,6 +222,13 @@ def grant_tool_approval(input_data: Dict[str, Any]) -> None:
204
222
  outside the run's tool ceiling grants nothing. A tool_policy the target
205
223
  already carries is the target author's word and is left untouched.
206
224
  `ask_user` questions are not tool approvals and still wait for a person.
225
+
226
+ Never granted (listed in `withheld_tools`): tools that send messages to
227
+ model-chosen recipients (`_grant_excludes`). Their calls go through the
228
+ normal approval point: the per-call refiner still auto-approves a
229
+ `send_email` whose every recipient is the registered user's own address
230
+ (`_runtime.operator_email`, set by the host); any other recipient parks the
231
+ occurrence on a `tool_approval` wait, exactly as under `"ask"`.
207
232
  """
208
233
  from ..integrations.abstractcore.tool_effects import TOOL_EFFECT_CLASSES
209
234
 
@@ -212,10 +237,12 @@ def grant_tool_approval(input_data: Dict[str, Any]) -> None:
212
237
  return
213
238
  allowed = runtime_ns.get("allowed_tools")
214
239
  names = allowed if isinstance(allowed, list) else list(TOOL_EFFECT_CLASSES)
215
- tools = sorted({n.strip() for n in names if isinstance(n, str) and n.strip()})
240
+ candidates = sorted({n.strip() for n in names if isinstance(n, str) and n.strip()})
241
+ withheld = [n for n in candidates if _grant_excludes(n)]
242
+ tools = [n for n in candidates if n not in withheld]
216
243
  input_data["_runtime"] = {
217
244
  **runtime_ns,
218
- "tool_policy": {"auto_approve_tools": tools, "source": AUTOMATION_GRANT_SOURCE},
245
+ "tool_policy": {"auto_approve_tools": tools, "withheld_tools": withheld, "source": AUTOMATION_GRANT_SOURCE},
219
246
  }
220
247
 
221
248