AbstractRuntime 0.9.0__tar.gz → 0.9.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/CHANGELOG.md +15 -0
  2. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/PKG-INFO +4 -4
  3. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/integrations/abstractcore.md +9 -2
  4. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/llms-full.txt +9 -2
  5. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/llms.txt +1 -1
  6. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/pyproject.toml +6 -4
  7. abstractruntime-0.9.1/release-notes.md +12 -0
  8. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/__init__.py +4 -0
  9. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +117 -114
  10. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +7 -0
  11. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_browser_probe_target_walling.py +15 -0
  12. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_packaging_extras.py +3 -3
  13. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_r12_workspace_sandbox.py +36 -2
  14. abstractruntime-0.9.1/tests/test_voice_stream_is_not_a_wait.py +256 -0
  15. abstractruntime-0.9.0/release-notes.md +0 -23
  16. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.github/workflows/ci.yml +0 -0
  17. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.github/workflows/release.yml +0 -0
  18. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.gitignore +0 -0
  19. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/ACKNOWLEDGMENTS.md +0 -0
  20. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/CODE_OF_CONDUCT.md +0 -0
  21. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/CONTRIBUTING.md +0 -0
  22. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/LICENSE +0 -0
  23. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/README.md +0 -0
  24. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/ROADMAP.md +0 -0
  25. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/SECURITY.md +0 -0
  26. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/README.md +0 -0
  27. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  28. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  29. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  30. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  31. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  32. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  33. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  34. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/README.md +0 -0
  35. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/api.md +0 -0
  36. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/architecture.md +0 -0
  37. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/artifacts.md +0 -0
  38. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/automations.md +0 -0
  39. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/README.md +0 -0
  40. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  41. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  42. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  43. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  44. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  45. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  46. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  47. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  48. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
  49. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  50. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  51. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  52. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  53. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  54. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  55. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  56. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  57. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/009_artifact_store.md +0 -0
  58. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  59. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  60. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  61. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  62. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  63. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  64. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  65. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  66. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  67. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  68. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  69. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  70. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  71. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  72. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  73. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  74. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  75. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  76. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  77. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  78. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  79. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  80. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  81. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  82. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  83. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/004_tests.md +0 -0
  84. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  85. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  86. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  87. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  88. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/README.md +0 -0
  89. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  90. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  91. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  92. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  93. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  94. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  95. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  96. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  97. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  98. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  99. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  100. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  101. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  102. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  103. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  104. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
  105. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  106. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  107. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  108. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  109. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  110. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  111. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  112. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  113. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  114. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  115. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  116. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  117. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  118. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  119. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  120. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  121. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  122. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  123. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  124. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  125. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  126. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  127. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  128. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  129. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  130. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  131. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  132. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  133. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  134. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/email.md +0 -0
  135. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/entity-runtime.md +0 -0
  136. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/evidence.md +0 -0
  137. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/faq.md +0 -0
  138. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/getting-started.md +0 -0
  139. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/limits.md +0 -0
  140. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/manual_testing.md +0 -0
  141. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/mcp-worker.md +0 -0
  142. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/proposal.md +0 -0
  143. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/provenance.md +0 -0
  144. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/snapshots.md +0 -0
  145. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/tool-approval.md +0 -0
  146. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/tools-comms.md +0 -0
  147. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/troubleshooting.md +0 -0
  148. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/workflow-bundles.md +0 -0
  149. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/01_hello_world.py +0 -0
  150. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/02_ask_user.py +0 -0
  151. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/03_wait_until.py +0 -0
  152. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/04_multi_step.py +0 -0
  153. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/05_persistence.py +0 -0
  154. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/06_llm_integration.py +0 -0
  155. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/07_react_agent.py +0 -0
  156. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/README.md +0 -0
  157. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/mkdocs.yml +0 -0
  158. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/pytest.ini +0 -0
  159. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/scripts/backfill_diary_edges.py +0 -0
  160. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/scripts/generate_llms_full.py +0 -0
  161. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/__init__.py +0 -0
  162. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automation_queries.py +0 -0
  163. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/__init__.py +0 -0
  164. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/adapters.py +0 -0
  165. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/attention.py +0 -0
  166. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundle.py +0 -0
  167. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  168. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  169. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/commands.py +0 -0
  170. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/controller.py +0 -0
  171. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/ledger.py +0 -0
  172. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/models.py +0 -0
  173. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/service.py +0 -0
  174. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/__init__.py +0 -0
  175. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/config.py +0 -0
  176. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
  177. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/event_keys.py +0 -0
  178. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/health.py +0 -0
  179. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/live_deltas.py +0 -0
  180. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/models.py +0 -0
  181. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/policy.py +0 -0
  182. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/progress_channel.py +0 -0
  183. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_attribution.py +0 -0
  184. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_identity.py +0 -0
  185. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
  186. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/runtime.py +0 -0
  187. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/spec.py +0 -0
  188. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/tool_scope.py +0 -0
  189. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/vars.py +0 -0
  190. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/__init__.py +0 -0
  191. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/charts.py +0 -0
  192. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/docx.py +0 -0
  193. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/pdf.py +0 -0
  194. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/__init__.py +0 -0
  195. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/actions.py +0 -0
  196. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/automations.py +0 -0
  197. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/binding.py +0 -0
  198. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/feeder.py +0 -0
  199. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/frame.py +0 -0
  200. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/inbox.py +0 -0
  201. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/evidence/__init__.py +0 -0
  202. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/evidence/recorder.py +0 -0
  203. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/history_bundle.py +0 -0
  204. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/__init__.py +0 -0
  205. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/act_only.py +0 -0
  206. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/chat.py +0 -0
  207. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/communities.py +0 -0
  208. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/diary.py +0 -0
  209. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/digest.py +0 -0
  210. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
  211. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/fingerprint.py +0 -0
  212. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/lease.py +0 -0
  213. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/life.py +0 -0
  214. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/memory_reader.py +0 -0
  215. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/night_voice.py +0 -0
  216. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/phase_graph.py +0 -0
  217. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/phase_spec.py +0 -0
  218. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/prelude.py +0 -0
  219. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  220. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/reflection.py +0 -0
  221. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  222. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/substrate.py +0 -0
  223. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tool_effects.py +0 -0
  224. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tool_policy.py +0 -0
  225. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tools.py +0 -0
  226. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
  227. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/__init__.py +0 -0
  228. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  229. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  230. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  231. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  232. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  233. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  234. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  235. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  236. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  237. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  238. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  239. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  240. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  241. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  242. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  243. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  244. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  245. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  246. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  247. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  248. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  249. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  250. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  251. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  252. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  253. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  254. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  255. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  256. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  257. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  258. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  259. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  260. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  261. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  262. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  263. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/__init__.py +0 -0
  264. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/active_context.py +0 -0
  265. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/active_memory.py +0 -0
  266. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/compaction.py +0 -0
  267. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/kg_packets.py +0 -0
  268. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/memact_composer.py +0 -0
  269. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/recall_levels.py +0 -0
  270. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/token_budget.py +0 -0
  271. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/__init__.py +0 -0
  272. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  273. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
  274. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/__init__.py +0 -0
  275. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/convenience.py +0 -0
  276. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
  277. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/registry.py +0 -0
  278. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
  279. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/session_history.py +0 -0
  280. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/session_turns.py +0 -0
  281. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/__init__.py +0 -0
  282. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/artifacts.py +0 -0
  283. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/base.py +0 -0
  284. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/commands.py +0 -0
  285. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/in_memory.py +0 -0
  286. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/json_files.py +0 -0
  287. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/lease.py +0 -0
  288. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
  289. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
  290. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/observable.py +0 -0
  291. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/offloading.py +0 -0
  292. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/serialize.py +0 -0
  293. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/snapshots.py +0 -0
  294. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/sqlite.py +0 -0
  295. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  296. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/__init__.py +0 -0
  297. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/email_received.py +0 -0
  298. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/manual.py +0 -0
  299. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/protocol.py +0 -0
  300. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/registry.py +0 -0
  301. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/schedule.py +0 -0
  302. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/turn_grounding.py +0 -0
  303. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/__init__.py +0 -0
  304. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/atomic_files.py +0 -0
  305. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/file_filters.py +0 -0
  306. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
  307. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  308. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  309. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  310. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  311. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  312. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  313. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  314. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  315. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  316. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  317. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  318. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  319. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  320. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  321. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  322. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  323. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  324. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  325. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  326. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  327. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  328. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  329. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  330. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  331. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
  332. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  333. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  334. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  335. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/README.md +0 -0
  336. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/automation_harness.py +0 -0
  337. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/conftest.py +0 -0
  338. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/email_wp2_support.py +0 -0
  339. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/conftest.py +0 -0
  340. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/live_email_support.py +0 -0
  341. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/test_email_live_runtime.py +0 -0
  342. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_comms_facade.py +0 -0
  343. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_discovery_facade.py +0 -0
  344. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_host_facade.py +0 -0
  345. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_run_facade.py +0 -0
  346. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_server_facade.py +0 -0
  347. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_structured_facade.py +0 -0
  348. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_telegram_facade.py +0 -0
  349. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_active_context_policy.py +0 -0
  350. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_active_memory.py +0 -0
  351. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_agora_agent_alias_identity.py +0 -0
  352. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_agora_tools_http.py +0 -0
  353. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  354. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_answer_user_effect.py +0 -0
  355. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_artifacts.py +0 -0
  356. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_commands.py +0 -0
  357. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_controller.py +0 -0
  358. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_controller_recovery.py +0 -0
  359. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_definition.py +0 -0
  360. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_discussion_isolation.py +0 -0
  361. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_email_results.py +0 -0
  362. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_growing_context.py +0 -0
  363. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_index.py +0 -0
  364. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_next_fire.py +0 -0
  365. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_occurrence_input_resolver.py +0 -0
  366. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_occurrence_recovery.py +0 -0
  367. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_replay_read_only.py +0 -0
  368. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_retry.py +0 -0
  369. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_session_turns.py +0 -0
  370. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_status.py +0 -0
  371. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_tool_approval.py +0 -0
  372. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  373. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_capability_default_reasoning.py +0 -0
  374. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_chat_summarizer_integration.py +0 -0
  375. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_code_node_restricted_python.py +0 -0
  376. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_command_sandbox_host_facade.py +0 -0
  377. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_command_store.py +0 -0
  378. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_compaction_helpers.py +0 -0
  379. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_compaction_summarizer_route.py +0 -0
  380. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_config_facade_models_engines.py +0 -0
  381. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_control_adapter_while.py +0 -0
  382. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_controller_bundle_packaged.py +0 -0
  383. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_crash_ordering_inversions.py +0 -0
  384. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_create_if_absent.py +0 -0
  385. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_data_registry_facade.py +0 -0
  386. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_camera_gating.py +0 -0
  387. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_comms_gating.py +0 -0
  388. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_files.py +0 -0
  389. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_folders.py +0 -0
  390. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_web.py +0 -0
  391. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_search_files_executor.py +0 -0
  392. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_diary_capture.py +0 -0
  393. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_diary_write_rescue.py +0 -0
  394. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_directory_lease.py +0 -0
  395. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_disabled_toolsets_seam.py +0 -0
  396. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  397. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  398. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
  399. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discussion_session_anchor.py +0 -0
  400. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_document_markdown_tables.py +0 -0
  401. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_document_renderers_hr_quote.py +0 -0
  402. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_durable_toolsets.py +0 -0
  403. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_durable_write_discipline.py +0 -0
  404. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  405. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_cancellation.py +0 -0
  406. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_issuance_idempotency.py +0 -0
  407. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  408. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_election_consequence_teaching.py +0 -0
  409. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_binding_and_refiner.py +0 -0
  410. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_gate_fixes.py +0 -0
  411. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_inbox_and_trigger.py +0 -0
  412. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_regate_fixes.py +0 -0
  413. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_review_fixes.py +0 -0
  414. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_self_trigger_loop.py +0 -0
  415. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_toolset_and_walls.py +0 -0
  416. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emergence_experiment.py +0 -0
  417. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emit_event_uses_wait_index.py +0 -0
  418. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
  419. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_endpoint_profile_route_context.py +0 -0
  420. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_awake_memory_fixes.py +0 -0
  421. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_brain_effects.py +0 -0
  422. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_chat_driver.py +0 -0
  423. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_chat_tools_reflection.py +0 -0
  424. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_diary.py +0 -0
  425. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_execute_tool.py +0 -0
  426. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_fetch_url_tool.py +0 -0
  427. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_history_window.py +0 -0
  428. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_life_loop.py +0 -0
  429. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_memory_richness.py +0 -0
  430. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_phase_graph_conformance.py +0 -0
  431. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_react_visit_window.py +0 -0
  432. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_recent_memories.py +0 -0
  433. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_runtime.py +0 -0
  434. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_search_memory.py +0 -0
  435. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  436. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_substrate_resolution.py +0 -0
  437. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_visit_honesty.py +0 -0
  438. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_workspace_cap.py +0 -0
  439. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_workspace_tools.py +0 -0
  440. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_event_wait_index.py +0 -0
  441. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  442. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_evidence_recorder.py +0 -0
  443. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  444. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_execute_command_output_offload.py +0 -0
  445. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_execution_capability_discovery.py +0 -0
  446. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_explicit_eject_other_clients.py +0 -0
  447. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_factory_default_retry_policy.py +0 -0
  448. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  449. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_format_repair_nudge.py +0 -0
  450. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_fresh_install_no_provider.py +0 -0
  451. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_gateway_facades_c4899.py +0 -0
  452. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_git_read_only_refiner.py +0 -0
  453. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_hf_process_residency_merge.py +0 -0
  454. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_history_window_multimodal.py +0 -0
  455. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_hot_path_store_reads.py +0 -0
  456. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_indexed_idempotency_lookup.py +0 -0
  457. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_integration_abstractcore.py +0 -0
  458. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_integrations_abstractcore.py +0 -0
  459. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_file_run_store_children_index.py +0 -0
  460. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_run_cache_bound.py +0 -0
  461. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_store_scan_memo.py +0 -0
  462. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_jsonl_ledger_recovery.py +0 -0
  463. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
  464. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_chain.py +0 -0
  465. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_record_slimming.py +0 -0
  466. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_subscription.py +0 -0
  467. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_live_token_deltas.py +0 -0
  468. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
  469. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  470. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  471. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  472. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_requires_prompt.py +0 -0
  473. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
  474. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
  475. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_text_phase_progress.py +0 -0
  476. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  477. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  478. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  479. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_grounding_tail.py +0 -0
  480. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_media_artifacts.py +0 -0
  481. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_system_context.py +0 -0
  482. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
  483. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_retry_classification.py +0 -0
  484. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_streaming_on_token.py +0 -0
  485. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_helper_tool_exposure.py +0 -0
  486. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_residency_host_sweep.py +0 -0
  487. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  488. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_max_iterations_ceiling.py +0 -0
  489. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_remote_tool_executor.py +0 -0
  490. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  491. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_logging.py +0 -0
  492. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_security.py +0 -0
  493. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_stdio.py +0 -0
  494. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_artifact_resolution.py +0 -0
  495. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_capability_default_routing.py +0 -0
  496. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_only_requests_skip_text_client.py +0 -0
  497. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_subprocess.py +0 -0
  498. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memact_composer_from_kg_result.py +0 -0
  499. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_appraise_handler.py +0 -0
  500. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_communities.py +0 -0
  501. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  502. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_packets.py +0 -0
  503. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  504. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  505. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  506. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  507. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_note_effect.py +0 -0
  508. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_query_effect.py +0 -0
  509. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_query_rich_filters.py +0 -0
  510. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  511. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_seam_handlers.py +0 -0
  512. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
  513. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_tag_effect.py +0 -0
  514. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mlx_generation_serialization.py +0 -0
  515. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mlx_process_residency_merge.py +0 -0
  516. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_eject_cancel.py +0 -0
  517. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_clean_switch.py +0 -0
  518. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_control_plane.py +0 -0
  519. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  520. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_multi_store_scheduler.py +0 -0
  521. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
  522. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_mlx_application_wiring.py +0 -0
  523. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
  524. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_tool_channel.py +0 -0
  525. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_night_voice.py +0 -0
  526. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
  527. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offload_answer_chain_c4978.py +0 -0
  528. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  529. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offloading.py +0 -0
  530. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
  531. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pause_resume.py +0 -0
  532. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pdf_unicode_rendering.py +0 -0
  533. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_personal_cycle.py +0 -0
  534. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phantom_attachment_index.py +0 -0
  535. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_graph_artifact_control.py +0 -0
  536. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_graph_obedience.py +0 -0
  537. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_vocabulary_migration.py +0 -0
  538. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  539. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_export_import.py +0 -0
  540. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  541. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_modules.py +0 -0
  542. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  543. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  544. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_overlay.py +0 -0
  545. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  546. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_provider_pin_routing_isolation.py +0 -0
  547. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_queryable_run_store.py +0 -0
  548. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  549. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_read_idle_threading.py +0 -0
  550. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_readoption_experiment.py +0 -0
  551. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_real_integration.py +0 -0
  552. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_realize_election.py +0 -0
  553. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_recall_levels_policy.py +0 -0
  554. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_client_cancel.py +0 -0
  555. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_llm_client.py +0 -0
  556. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_speculation_defaults.py +0 -0
  557. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_rendering_agent_trace_report.py +0 -0
  558. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_rendering_json_stringify.py +0 -0
  559. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_report_branding.py +0 -0
  560. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_resident_media_generation.py +0 -0
  561. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_resume_concurrent_same_wait.py +0 -0
  562. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_retry_idempotency.py +0 -0
  563. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_history_bundle.py +0 -0
  564. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_index_workspace_root.py +0 -0
  565. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_mutation_lock.py +0 -0
  566. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_scoped_tool_policy.py +0 -0
  567. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_tool_scope_ceiling.py +0 -0
  568. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_browser_session_boundary.py +0 -0
  569. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  570. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  571. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
  572. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  573. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_install_boundary.py +0 -0
  574. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  575. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_node_traces.py +0 -0
  576. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  577. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_tick_step_gate.py +0 -0
  578. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_scheduler.py +0 -0
  579. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_send_email_refiner.py +0 -0
  580. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_send_email_self_default_policy.py +0 -0
  581. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  582. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_history.py +0 -0
  583. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_prompt_cache_attribution.py +0 -0
  584. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_prompt_cache_visibility.py +0 -0
  585. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_route_stamp.py +0 -0
  586. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_start_cost.py +0 -0
  587. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_shell_tool_exposure.py +0 -0
  588. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_snapshots.py +0 -0
  589. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_speculation_inheritance.py +0 -0
  590. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
  591. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_sqlite_ledger_store.py +0 -0
  592. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_async_wait.py +0 -0
  593. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  594. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  595. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_steer_sidecar.py +0 -0
  596. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_storage_deletion.py +0 -0
  597. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_structured_output_schema_enum.py +0 -0
  598. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_subworkflow.py +0 -0
  599. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_terminal_effect_completion.py +0 -0
  600. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  601. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_thinking_inheritance.py +0 -0
  602. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  603. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_executor.py +0 -0
  604. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_resume_executes.py +0 -0
  605. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
  606. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
  607. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_catalog.py +0 -0
  608. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_descriptor_registry.py +0 -0
  609. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
  610. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_error_output_detection.py +0 -0
  611. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_filename_alias.py +0 -0
  612. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  613. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
  614. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_timeout.py +0 -0
  615. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_inventory_facade.py +0 -0
  616. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_invoke_effect.py +0 -0
  617. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_policy_and_mounts.py +0 -0
  618. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
  619. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_topic_election_world_model.py +0 -0
  620. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trace_context_propagation.py +0 -0
  621. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trigger_registry.py +0 -0
  622. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trigger_schedule_math.py +0 -0
  623. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_turn_grounding_byte_stability.py +0 -0
  624. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
  625. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_vars_query_effect.py +0 -0
  626. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_ab_fixture.py +0 -0
  627. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_midturn_elections.py +0 -0
  628. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_midturn_resume.py +0 -0
  629. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_workflow.py +0 -0
  630. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  631. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  632. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  633. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  634. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  635. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  636. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_entity_memory_nodes.py +0 -0
  637. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  638. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_llm_call_partial_override.py +0 -0
  639. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  640. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memact_compose_node.py +0 -0
  641. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  642. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  643. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  644. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  645. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  646. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_add_message_builtin.py +0 -0
  647. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  648. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_agora_react_agent.py +0 -0
  649. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_call_tool_node.py +0 -0
  650. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  651. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_compiler_basic.py +0 -0
  652. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  653. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_continue_on_error.py +0 -0
  654. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  655. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  656. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  657. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_function_library.py +0 -0
  658. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_element_node.py +0 -0
  659. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_random_element_node.py +0 -0
  660. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_var_node.py +0 -0
  661. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
  662. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  663. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  664. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_make_object_node.py +0 -0
  665. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_media_nodes.py +0 -0
  666. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  667. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_memory_source_pins.py +0 -0
  668. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_pin_expressions.py +0 -0
  669. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_prompt_only.py +0 -0
  670. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_random_nodes.py +0 -0
  671. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
  672. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_string_contains_replace.py +0 -0
  673. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
  674. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_voice_openai_api_key_path.py +0 -0
  675. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_w4_feelings_lens.py +0 -0
  676. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_event_deadline.py +0 -0
  677. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_event_prompt_metadata.py +0 -0
  678. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_until_streak.py +0 -0
  679. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_until_utc_normalization.py +0 -0
  680. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workflow_bundle_registry.py +0 -0
  681. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_builtin_deny.py +0 -0
  682. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  683. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  684. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  685. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  686. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  687. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_prompt_context.py +0 -0
  688. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_read_only.py +0 -0
  689. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_writable_paths.py +0 -0
  690. {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_write_chart.py +0 -0
@@ -5,6 +5,21 @@ All notable changes to AbstractRuntime will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.9.1] - 2026-10-08
9
+
10
+ ### Security
11
+
12
+ - `browser_probe`: a local target (path or `file://` URL) now carries the run's `_sandbox` stamp, the same scope the commands get. AbstractCore 2.25.1 serves the page from a loopback origin limited to that scope instead of `file://`, so a page cannot load refused files as subresources. Needs AbstractCore 2.25.1 (an older `browser_probe` refuses the unknown argument and runs nothing). Test: `tests/test_browser_probe_target_walling.py`.
13
+
14
+ ### Fixed
15
+
16
+ - `stream_voice(...)` is never a wait. It used to start the child run parked on `WAIT_EVENT abstractcore.voice.tts.stream:<uuid>` for the whole stream: hosts folded that waiting record into the CALLER'S run (a Read aloud during a live turn read as "Waiting for an event"), and a host that died mid-stream left the child waiting forever. Now nothing durable exists while audio streams; when the stream ends (done, error, cancel or the consumer closing it) the child run is created already COMPLETED with the outcome. Its id is allocated up front: `runtime_start` carries it as `child_run_id` (schema `abstractruntime.tts_stream.start.v2`, no `wait_key`), as does the trace metadata. A stream cut by a crash leaves no run.
17
+ - `AbstractCoreRunFacade.close_interrupted_voice_stream(child_run_id, *, reason)` finishes a legacy streamed-speech wait left by an older process (completed, `errors[0] = {"code": "interrupted", "message": reason}`); `is_interrupted_voice_stream_wait(waiting)` and `LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX` recognise one (exported from `integrations.abstractcore`). AbstractGateway calls it at startup.
18
+
19
+ ### Changed
20
+
21
+ - Requires AbstractCore 2.25.1 or newer (`abstractcore>=2.25.1` in the base install and the `[apple]`/`[gpu]` extras): the Linux command sandbox reaches an allowed folder inside a refused one, and `browser_probe` accepts the run's `_sandbox` stamp.
22
+
8
23
  ## [0.9.0] - 2026-10-05
9
24
 
10
25
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.25.0
23
+ Requires-Dist: abstractcore>=2.25.1
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.25.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.25.1; 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.25.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.25.1; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
48
  Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
@@ -506,6 +506,7 @@ Lists accept a JSON array, a JSON array pasted as a string, or newline-separated
506
506
  - Child runs (subworkflows and agent delegation) inherit the workspace vars unless they set their own; VisualFlow file and document nodes (`read_file`, `write_file`, `read_pdf`, `write_pdf`, `write_docx`, `write_chart`) apply the same scope.
507
507
  - **Nesting (most specific row wins).** For a path P (symlinks resolved), the candidates are `workspace_root` (read & write), `workspace_allowed_paths` (not under `workspace_only`) and `workspace_ignored_paths`. The longest candidate that contains P decides: a refused entry refuses, the root or an allowed entry allows; a tie between a refused entry and an allowed one (or the root) at the same path refuses; no candidate falls back to the access mode (`all_except_ignored` allows, the others refuse). The host's built-in protection is absolute: under a `workspace_builtin_deny_prefixes` entry and not under a `workspace_builtin_allow` entry is refused whatever the rows say. So refusing `/Users/me` and allowing `/Users/me/project` makes the project reachable and the rest of `/Users/me` refused; a refused folder inside an allowed one refuses that subtree. AbstractGateway applies the same rule when it validates and computes a run's workspaces.
508
508
  - **Command sandbox.** `execute_command`, `shell_exec` (the whole persistent session), `local_helper_start` and AbstractAgent's `execute_python` (0.3.18 or newer) start in the workspace and run inside an OS sandbox built from the SAME scope (`sandbox_stamp(scope)`, stamped on every call as the hidden `_sandbox` argument; a model- or payload-supplied value is always replaced). AbstractCore (`abstractcore.tools.sandbox`) applies it: macOS `sandbox-exec`, Linux `bwrap`, or Linux Landlock for "Deny everything, allow listed workspaces". Mapping: `all_except_ignored` → "Allow everything, refuse listed workspaces" (`any_except_denied`), otherwise "Deny everything, allow listed workspaces" (`allowed_only`); a `"/"` read-only root → read-only default; each allowed workspace with its mode; refused paths and the built-in protection as they are. The command string is never parsed — `cd ..`, absolute paths, `$(…)`, symlinks and scripts are stopped by the kernel. With no sandbox on the host, or an AbstractCore without `abstractcore.tools.sandbox`, the command is refused with one sentence and the run continues. The entity exec tool runs inside a sandbox limited to the entity's workspace and its whitelisted mounts. The tool result carries `sandbox: {kind, …}` and a `Sandbox: …` line; the stamp rides the tool call in the run's evidence. Hosts set the host policy (the scrubbed environment commands start from, and whether unsandboxed commands are allowed on a host with no sandbox) once at boot through `abstractruntime.integrations.abstractcore.command_sandbox_host` (`configure_host`, `host_policy`, `host_sandbox_kind`), never by importing AbstractCore.
509
+ - **Browser probe.** A local `browser_probe` target (a path or a `file://` URL) is walled like `read_file`'s path and carries the same `_sandbox` stamp: AbstractCore 2.25.1 serves the page to the browser from a loopback origin that answers only for files this scope can read (never `file://`). Remote `http(s)://` targets carry no stamp.
509
510
 
510
511
  ## Prompt-cache control plane and durable blocs
511
512
 
@@ -1048,8 +1049,14 @@ Public durable entry points:
1048
1049
  These helpers create child runs under an existing parent run and execute the real
1049
1050
  `LLM_CALL`, `TOOL_CALLS`, or stream finalization through Runtime rather than
1050
1051
  doing external work in host/controller code. `stream_voice(...)` yields TTS
1051
- stream events for progressive playback and completes the child run with the
1052
- final audio artifact when the stream succeeds.
1052
+ stream events for progressive playback; it is never a wait: nothing durable
1053
+ exists while audio streams, and when the stream ends (done, error, cancel or
1054
+ the consumer closing it) the child run is created already completed with the
1055
+ outcome (the final audio artifact on success). The child's id is announced up
1056
+ front in the `runtime_start` event (`child_run_id`). A host that finds a
1057
+ streamed-speech wait left by a runtime before this behaviour
1058
+ (`is_interrupted_voice_stream_wait`) closes it with
1059
+ `close_interrupted_voice_stream(child_run_id, reason=...)`.
1053
1060
 
1054
1061
  Example:
1055
1062
 
@@ -2480,6 +2480,7 @@ Lists accept a JSON array, a JSON array pasted as a string, or newline-separated
2480
2480
  - Child runs (subworkflows and agent delegation) inherit the workspace vars unless they set their own; VisualFlow file and document nodes (`read_file`, `write_file`, `read_pdf`, `write_pdf`, `write_docx`, `write_chart`) apply the same scope.
2481
2481
  - **Nesting (most specific row wins).** For a path P (symlinks resolved), the candidates are `workspace_root` (read & write), `workspace_allowed_paths` (not under `workspace_only`) and `workspace_ignored_paths`. The longest candidate that contains P decides: a refused entry refuses, the root or an allowed entry allows; a tie between a refused entry and an allowed one (or the root) at the same path refuses; no candidate falls back to the access mode (`all_except_ignored` allows, the others refuse). The host's built-in protection is absolute: under a `workspace_builtin_deny_prefixes` entry and not under a `workspace_builtin_allow` entry is refused whatever the rows say. So refusing `/Users/me` and allowing `/Users/me/project` makes the project reachable and the rest of `/Users/me` refused; a refused folder inside an allowed one refuses that subtree. AbstractGateway applies the same rule when it validates and computes a run's workspaces.
2482
2482
  - **Command sandbox.** `execute_command`, `shell_exec` (the whole persistent session), `local_helper_start` and AbstractAgent's `execute_python` (0.3.18 or newer) start in the workspace and run inside an OS sandbox built from the SAME scope (`sandbox_stamp(scope)`, stamped on every call as the hidden `_sandbox` argument; a model- or payload-supplied value is always replaced). AbstractCore (`abstractcore.tools.sandbox`) applies it: macOS `sandbox-exec`, Linux `bwrap`, or Linux Landlock for "Deny everything, allow listed workspaces". Mapping: `all_except_ignored` → "Allow everything, refuse listed workspaces" (`any_except_denied`), otherwise "Deny everything, allow listed workspaces" (`allowed_only`); a `"/"` read-only root → read-only default; each allowed workspace with its mode; refused paths and the built-in protection as they are. The command string is never parsed — `cd ..`, absolute paths, `$(…)`, symlinks and scripts are stopped by the kernel. With no sandbox on the host, or an AbstractCore without `abstractcore.tools.sandbox`, the command is refused with one sentence and the run continues. The entity exec tool runs inside a sandbox limited to the entity's workspace and its whitelisted mounts. The tool result carries `sandbox: {kind, …}` and a `Sandbox: …` line; the stamp rides the tool call in the run's evidence. Hosts set the host policy (the scrubbed environment commands start from, and whether unsandboxed commands are allowed on a host with no sandbox) once at boot through `abstractruntime.integrations.abstractcore.command_sandbox_host` (`configure_host`, `host_policy`, `host_sandbox_kind`), never by importing AbstractCore.
2483
+ - **Browser probe.** A local `browser_probe` target (a path or a `file://` URL) is walled like `read_file`'s path and carries the same `_sandbox` stamp: AbstractCore 2.25.1 serves the page to the browser from a loopback origin that answers only for files this scope can read (never `file://`). Remote `http(s)://` targets carry no stamp.
2483
2484
 
2484
2485
  ## Prompt-cache control plane and durable blocs
2485
2486
 
@@ -3022,8 +3023,14 @@ Public durable entry points:
3022
3023
  These helpers create child runs under an existing parent run and execute the real
3023
3024
  `LLM_CALL`, `TOOL_CALLS`, or stream finalization through Runtime rather than
3024
3025
  doing external work in host/controller code. `stream_voice(...)` yields TTS
3025
- stream events for progressive playback and completes the child run with the
3026
- final audio artifact when the stream succeeds.
3026
+ stream events for progressive playback; it is never a wait: nothing durable
3027
+ exists while audio streams, and when the stream ends (done, error, cancel or
3028
+ the consumer closing it) the child run is created already completed with the
3029
+ outcome (the final audio artifact on success). The child's id is announced up
3030
+ front in the `runtime_start` event (`child_run_id`). A host that finds a
3031
+ streamed-speech wait left by a runtime before this behaviour
3032
+ (`is_interrupted_voice_stream_wait`) closes it with
3033
+ `close_interrupted_voice_stream(child_run_id, reason=...)`.
3027
3034
 
3028
3035
  Example:
3029
3036
 
@@ -3,7 +3,7 @@
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.9.0
6
+ - Version: 0.9.1
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
9
  - Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.24.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`)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.9.0"
7
+ version = "0.9.1"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -53,7 +53,9 @@ dependencies = [
53
53
  # plugins) without selecting local inference engines. 2.19.2 floors
54
54
  # abstractvision>=0.3.33, whose resident loads report `loaded_new` and whose
55
55
  # unload frees the pipeline (the resident media path relies on both).
56
- "abstractcore>=2.25.0",
56
+ # 2.25.1: the Linux bwrap profile binds an allowed child of a refused folder,
57
+ # and browser_probe takes the _sandbox stamp (scoped loopback origin).
58
+ "abstractcore>=2.25.1",
57
59
  "openai<3.0.0,>=1.109.1",
58
60
  "httpx<1.0.0,>=0.28.1",
59
61
  "anyio<5.0.0,>=4.12.1",
@@ -70,12 +72,12 @@ dependencies = [
70
72
 
71
73
  [project.optional-dependencies]
72
74
  apple = [
73
- "abstractcore[apple]>=2.25.0",
75
+ "abstractcore[apple]>=2.25.1",
74
76
  "setuptools<82.0.0,>=80.10.2",
75
77
  ]
76
78
 
77
79
  gpu = [
78
- "abstractcore[gpu]>=2.25.0",
80
+ "abstractcore[gpu]>=2.25.1",
79
81
  # vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
80
82
  "setuptools<82.0.0,>=77.0.3",
81
83
  ]
@@ -0,0 +1,12 @@
1
+ ### Security
2
+
3
+ - `browser_probe`: a local target (path or `file://` URL) now carries the run's `_sandbox` stamp, the same scope the commands get. AbstractCore 2.25.1 serves the page from a loopback origin limited to that scope instead of `file://`, so a page cannot load refused files as subresources. Needs AbstractCore 2.25.1 (an older `browser_probe` refuses the unknown argument and runs nothing). Test: `tests/test_browser_probe_target_walling.py`.
4
+
5
+ ### Fixed
6
+
7
+ - `stream_voice(...)` is never a wait. It used to start the child run parked on `WAIT_EVENT abstractcore.voice.tts.stream:<uuid>` for the whole stream: hosts folded that waiting record into the CALLER'S run (a Read aloud during a live turn read as "Waiting for an event"), and a host that died mid-stream left the child waiting forever. Now nothing durable exists while audio streams; when the stream ends (done, error, cancel or the consumer closing it) the child run is created already COMPLETED with the outcome. Its id is allocated up front: `runtime_start` carries it as `child_run_id` (schema `abstractruntime.tts_stream.start.v2`, no `wait_key`), as does the trace metadata. A stream cut by a crash leaves no run.
8
+ - `AbstractCoreRunFacade.close_interrupted_voice_stream(child_run_id, *, reason)` finishes a legacy streamed-speech wait left by an older process (completed, `errors[0] = {"code": "interrupted", "message": reason}`); `is_interrupted_voice_stream_wait(waiting)` and `LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX` recognise one (exported from `integrations.abstractcore`). AbstractGateway calls it at startup.
9
+
10
+ ### Changed
11
+
12
+ - Requires AbstractCore 2.25.1 or newer (`abstractcore>=2.25.1` in the base install and the `[apple]`/`[gpu]` extras): the Linux command sandbox reaches an allowed folder inside a refused one, and `browser_probe` accepts the run's `_sandbox` stamp.
@@ -46,8 +46,10 @@ from .discovery_facade import (
46
46
  get_abstractcore_discovery_facade,
47
47
  )
48
48
  from .run_facade import (
49
+ LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX,
49
50
  AbstractCoreRunFacade,
50
51
  get_abstractcore_run_facade,
52
+ is_interrupted_voice_stream_wait,
51
53
  )
52
54
  from .telegram_facade import (
53
55
  TelegramTdlibNotAvailable,
@@ -108,6 +110,8 @@ __all__ = [
108
110
  "ResponseFormatError",
109
111
  "get_global_telegram_client",
110
112
  "get_abstractcore_run_facade",
113
+ "is_interrupted_voice_stream_wait",
114
+ "LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX",
111
115
  "create_local_runtime",
112
116
  "create_remote_runtime",
113
117
  "create_hybrid_runtime",
@@ -191,30 +191,26 @@ def _build_tool_calls_resume_workflow(
191
191
  )
192
192
 
193
193
 
194
- def _build_stream_wait_workflow(
195
- *,
196
- workflow_id: str,
197
- wait_key: str,
198
- payload: Dict[str, Any],
199
- result_key: str,
200
- ) -> WorkflowSpec:
201
- def wait(run: RunState, ctx: Any) -> StepPlan:
202
- _ = run, ctx
203
- return StepPlan(
204
- node_id="wait",
205
- effect=Effect(
206
- type=EffectType.WAIT_EVENT,
207
- payload={
208
- "wait_key": wait_key,
209
- "resume_to_node": "done",
210
- "prompt": "Streaming voice synthesis is running.",
211
- "allow_free_text": False,
212
- "details": copy.deepcopy(payload),
213
- },
214
- result_key=result_key,
215
- ),
216
- next_node="done",
217
- )
194
+ # Legacy (runtimes before R13.1): the streamed-speech child run waited on this
195
+ # key prefix for the whole stream. No new run waits on it; hosts finish the
196
+ # ones a dead process left behind (`close_interrupted_voice_stream`).
197
+ LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX = "abstractcore.voice.tts.stream:"
198
+
199
+
200
+ def is_interrupted_voice_stream_wait(waiting: Any) -> bool:
201
+ """True for a legacy streamed-speech wait (by key prefix or the stream's details mode)."""
202
+
203
+ key = str(getattr(waiting, "wait_key", "") or "")
204
+ details = getattr(waiting, "details", None)
205
+ mode = details.get("mode") if isinstance(details, dict) else None
206
+ return key.startswith(LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX) or mode == "abstractcore_voice_stream"
207
+
208
+
209
+ def _build_stream_record_workflow(*, workflow_id: str, result_key: str) -> WorkflowSpec:
210
+ """One node that completes with ``vars[result_key]`` (the stream's outcome).
211
+
212
+ Also the resume target for a legacy stream wait (its resume node was
213
+ ``done``)."""
218
214
 
219
215
  def done(run: RunState, ctx: Any) -> StepPlan:
220
216
  _ = ctx
@@ -225,8 +221,8 @@ def _build_stream_wait_workflow(
225
221
 
226
222
  return WorkflowSpec(
227
223
  workflow_id=workflow_id,
228
- entry_node="wait",
229
- nodes={"wait": wait, "done": done},
224
+ entry_node="done",
225
+ nodes={"done": done},
230
226
  )
231
227
 
232
228
 
@@ -572,7 +568,19 @@ class AbstractCoreRunFacade:
572
568
  params: Optional[Dict[str, Any]] = None,
573
569
  child_vars: Optional[Dict[str, Any]] = None,
574
570
  ):
575
- """Create a durable child run and yield Runtime-owned TTS stream events."""
571
+ """Yield Runtime-owned TTS stream events; record a durable child run when the stream ends.
572
+
573
+ The stream is NOT a wait (R13.1, 2026-10-04). It used to start a child
574
+ run parked on ``WAIT_EVENT abstractcore.voice.tts.stream:<uuid>`` for
575
+ the whole stream: clients folded that waiting record into the parent
576
+ run (a Read aloud during a live turn showed "Waiting for an event"),
577
+ and a gateway restart mid-stream left the child WAITING forever with
578
+ nothing able to resume it. Now nothing durable exists while audio is
579
+ produced; when the stream ends (done, error, cancel or disconnect) the
580
+ child run is created already COMPLETED with the outcome — the id is
581
+ allocated up front and announced in the ``runtime_start`` event and
582
+ the trace metadata. A crash mid-stream leaves no run behind.
583
+ """
576
584
 
577
585
  client = getattr(self._runtime, "_abstractcore_llm_client", None)
578
586
  stream_fn = getattr(client, "stream_tts", None)
@@ -584,40 +592,39 @@ class AbstractCoreRunFacade:
584
592
  if isinstance(output, dict):
585
593
  spec.update(copy.deepcopy(output))
586
594
  stream_params = copy.deepcopy(params) if isinstance(params, dict) else {}
587
- wait_key = f"abstractcore.voice.tts.stream:{uuid.uuid4()}"
588
595
  result_key = _RESULT_KEY
589
- payload = {
590
- "mode": "abstractcore_voice_stream",
591
- "text": str(text or ""),
592
- "output": copy.deepcopy(spec),
593
- "params": copy.deepcopy(stream_params),
594
- }
595
- workflow = _build_stream_wait_workflow(
596
+ child_run_id = str(uuid.uuid4())
597
+ workflow = _build_stream_record_workflow(
596
598
  workflow_id=f"{_workflow_id_for_output(spec)}_stream",
597
- wait_key=wait_key,
598
- payload=payload,
599
599
  result_key=result_key,
600
600
  )
601
- child_run_id = self._runtime.start(
602
- workflow=workflow,
603
- vars=_build_child_vars(parent=parent, child_vars=child_vars),
604
- actor_id=parent.actor_id,
605
- session_id=parent.session_id,
606
- parent_run_id=parent.run_id,
607
- )
608
- child = self._tick(workflow=workflow, run_id=child_run_id)
609
- if child.status != RunStatus.WAITING or child.waiting is None:
610
- raise ValueError("Runtime failed to initialize streaming voice child run.")
601
+ recorded: Dict[str, Any] = {"state": None}
602
+
603
+ def _record(final_result: Dict[str, Any]) -> RunState:
604
+ if recorded["state"] is not None:
605
+ return recorded["state"]
606
+ record_vars = _build_child_vars(parent=parent, child_vars=child_vars)
607
+ record_vars[result_key] = copy.deepcopy(final_result)
608
+ started = self._runtime.start(
609
+ workflow=workflow,
610
+ vars=record_vars,
611
+ actor_id=parent.actor_id,
612
+ session_id=parent.session_id,
613
+ parent_run_id=parent.run_id,
614
+ run_id=child_run_id,
615
+ )
616
+ recorded["state"] = self._tick(workflow=workflow, run_id=started)
617
+ return recorded["state"]
611
618
 
612
619
  cancel_event = threading.Event()
613
620
  trace_metadata = dict(stream_params.get("trace_metadata") or {}) if isinstance(stream_params.get("trace_metadata"), dict) else {}
614
- trace_metadata.setdefault("run_id", child.run_id)
621
+ trace_metadata.setdefault("run_id", child_run_id)
615
622
  trace_metadata.setdefault("parent_run_id", parent.run_id)
616
623
  if parent.session_id is not None:
617
624
  trace_metadata.setdefault("session_id", parent.session_id)
618
625
  if parent.actor_id is not None:
619
626
  trace_metadata.setdefault("actor_id", parent.actor_id)
620
- trace_metadata.setdefault("workflow_id", child.workflow_id)
627
+ trace_metadata.setdefault("workflow_id", workflow.workflow_id)
621
628
  stream_params["trace_metadata"] = trace_metadata
622
629
  stream_params["output"] = copy.deepcopy(spec)
623
630
  stream_params["cancel_event"] = cancel_event
@@ -649,82 +656,43 @@ class AbstractCoreRunFacade:
649
656
  "metadata": {"streaming": True, "terminal_event": copy.deepcopy(event)},
650
657
  }
651
658
 
652
- def _resume_cancelled(reason: str) -> None:
653
- event = {
654
- "type": "cancelled",
655
- "ok": False,
656
- "cancelled": True,
657
- "error": str(reason or "TTS stream was cancelled."),
658
- "child_run_id": child.run_id,
659
- "run_id": parent.run_id,
660
- }
661
- try:
662
- self._resume(
663
- workflow=workflow,
664
- run_id=child.run_id,
665
- wait_key=wait_key,
666
- payload=_final_result_for_event(event),
667
- max_steps=100,
668
- )
669
- return
670
- except Exception:
671
- pass
672
- cancel_run = getattr(self._runtime, "cancel_run", None)
673
- if callable(cancel_run):
674
- try:
675
- cancel_run(child.run_id, reason=str(reason or "TTS stream was cancelled."))
676
- except Exception:
677
- pass
659
+ def _status(state: RunState) -> str:
660
+ return str(state.status.value if hasattr(state.status, "value") else state.status)
678
661
 
679
662
  def _events():
680
663
  terminal_seen = False
681
664
  try:
682
665
  yield {
683
666
  "type": "runtime_start",
684
- "schema": "abstractruntime.tts_stream.start.v1",
667
+ "schema": "abstractruntime.tts_stream.start.v2",
685
668
  "ok": True,
686
669
  "run_id": parent.run_id,
687
- "child_run_id": child.run_id,
688
- "wait_key": wait_key,
689
- "durability": "runtime_child_run",
670
+ "child_run_id": child_run_id,
671
+ "durability": "runtime_child_run_on_completion",
690
672
  "transport": "jsonl",
691
673
  "chunk_format": "wav-segment",
692
674
  }
693
675
  for raw_event in stream:
694
676
  event = dict(raw_event) if isinstance(raw_event, dict) else {"type": "event", "value": str(raw_event)}
695
- event.setdefault("child_run_id", child.run_id)
677
+ event.setdefault("child_run_id", child_run_id)
696
678
  event.setdefault("run_id", parent.run_id)
697
679
  event_type = str(event.get("type") or "").strip().lower()
698
680
  if event_type in {"done", "cancelled", "error"}:
699
681
  terminal_seen = True
700
- final_result = _final_result_for_event(event)
701
- final_state = self._resume(
702
- workflow=workflow,
703
- run_id=child.run_id,
704
- wait_key=wait_key,
705
- payload=final_result,
706
- max_steps=100,
707
- )
708
- event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
682
+ event["child_run_status"] = _status(_record(_final_result_for_event(event)))
709
683
  yield event
710
684
  return
711
685
  yield event
712
686
  if not terminal_seen:
687
+ terminal_seen = True
713
688
  event = {
714
689
  "type": "error",
715
690
  "ok": False,
716
691
  "error": "TTS stream ended without a terminal event.",
717
- "child_run_id": child.run_id,
692
+ "child_run_id": child_run_id,
718
693
  "run_id": parent.run_id,
719
694
  }
720
- final_state = self._resume(
721
- workflow=workflow,
722
- run_id=child.run_id,
723
- wait_key=wait_key,
724
- payload=_final_result_for_event(event),
725
- max_steps=100,
726
- )
727
- event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
695
+ event["child_run_status"] = _status(_record(_final_result_for_event(event)))
728
696
  yield event
729
697
  except GeneratorExit:
730
698
  cancel_event.set()
@@ -735,36 +703,69 @@ class AbstractCoreRunFacade:
735
703
  except Exception:
736
704
  pass
737
705
  if not terminal_seen:
738
- _resume_cancelled("TTS stream disconnected before completion")
706
+ try:
707
+ _record(
708
+ _final_result_for_event(
709
+ {
710
+ "type": "cancelled",
711
+ "ok": False,
712
+ "cancelled": True,
713
+ "error": "TTS stream disconnected before completion",
714
+ "child_run_id": child_run_id,
715
+ "run_id": parent.run_id,
716
+ }
717
+ )
718
+ )
719
+ except Exception:
720
+ pass
739
721
  raise
740
722
  except Exception as exc:
741
723
  event = {
742
724
  "type": "error",
743
725
  "ok": False,
744
726
  "error": str(exc),
745
- "child_run_id": child.run_id,
727
+ "child_run_id": child_run_id,
746
728
  "run_id": parent.run_id,
747
729
  }
748
730
  try:
749
- final_state = self._resume(
750
- workflow=workflow,
751
- run_id=child.run_id,
752
- wait_key=wait_key,
753
- payload=_final_result_for_event(event),
754
- max_steps=100,
755
- )
756
- event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
731
+ event["child_run_status"] = _status(_record(_final_result_for_event(event)))
757
732
  except Exception:
758
- cancel_run = getattr(self._runtime, "cancel_run", None)
759
- if callable(cancel_run):
760
- try:
761
- cancel_run(child.run_id, reason=str(exc))
762
- except Exception:
763
- pass
733
+ pass
764
734
  yield event
765
735
 
766
736
  return _events()
767
737
 
738
+ def close_interrupted_voice_stream(self, child_run_id: str, *, reason: str) -> RunState:
739
+ """Finish a LEGACY streamed-speech child run left WAITING by a process that died.
740
+
741
+ Runtimes before R13.1 parked the stream's child run on
742
+ ``WAIT_EVENT abstractcore.voice.tts.stream:<uuid>`` while audio
743
+ streamed; only the process holding the stream could resume it, so a
744
+ gateway restart mid-stream left it waiting forever. Hosts call this at
745
+ boot for such runs (``is_interrupted_voice_stream_wait``): the run
746
+ completes with ``errors[0] = {"code": "interrupted", "message": reason}``
747
+ and is never waiting again.
748
+ """
749
+
750
+ child = self._runtime.get_state(child_run_id)
751
+ waiting = child.waiting
752
+ if child.status != RunStatus.WAITING or waiting is None or not is_interrupted_voice_stream_wait(waiting):
753
+ raise ValueError(f"Run '{child_run_id}' is not waiting on a streamed-speech event")
754
+ result_key = str(waiting.result_key or _RESULT_KEY).strip() or _RESULT_KEY
755
+ workflow = _build_stream_record_workflow(workflow_id=str(child.workflow_id or "voice_stream"), result_key=result_key)
756
+ return self._resume(
757
+ workflow=workflow,
758
+ run_id=child.run_id,
759
+ wait_key=waiting.wait_key,
760
+ payload={
761
+ "content": None,
762
+ "outputs": {},
763
+ "errors": [{"message": str(reason or "The speech stream was interrupted."), "code": "interrupted"}],
764
+ "metadata": {"streaming": True, "interrupted": True},
765
+ },
766
+ max_steps=10,
767
+ )
768
+
768
769
  def generate_music(
769
770
  self,
770
771
  run_id: str,
@@ -896,7 +897,9 @@ def get_abstractcore_run_facade(runtime: Any) -> AbstractCoreRunFacade:
896
897
 
897
898
 
898
899
  __all__ = [
900
+ "LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX",
899
901
  "AbstractCoreRunFacade",
902
+ "is_interrupted_voice_stream_wait",
900
903
  "get_abstractcore_run_facade",
901
904
  "inline_run_active",
902
905
  ]
@@ -1153,8 +1153,15 @@ def _rewrite_tool_arguments(*, tool_name: str, args: Dict[str, Any], scope: Work
1153
1153
  inner = t[len("file://"):]
1154
1154
  resolved = resolve_user_path(scope=scope, user_path=inner)
1155
1155
  out["target"] = f"file://{resolved}"
1156
+ # Round 14: a local page is served to the browser from a loopback origin
1157
+ # limited to the run's scope (never file://), so a page cannot pull refused
1158
+ # files as subresources. The scope is the same stamp the commands get.
1159
+ core_sandbox_module()
1160
+ out[SANDBOX_STAMP_ARG] = sandbox_stamp(scope)
1156
1161
  else:
1157
1162
  out["target"] = str(resolve_user_path(scope=scope, user_path=t))
1163
+ core_sandbox_module()
1164
+ out[SANDBOX_STAMP_ARG] = sandbox_stamp(scope)
1158
1165
  return out
1159
1166
 
1160
1167
  return out
@@ -69,3 +69,18 @@ def test_http_targets_pass_untouched(tmp_path: Path) -> None:
69
69
  tool_name="browser_probe", args={"target": url}, scope=scope
70
70
  )
71
71
  assert out["target"] == url
72
+
73
+
74
+ def test_local_targets_carry_the_run_scope_stamp_remote_targets_do_not(tmp_path: Path) -> None:
75
+ """Round 14 (backlog 1002 item 3): a local page is served from a loopback origin
76
+ limited to the run's scope; the runtime stamps that scope (the commands' `_sandbox`
77
+ stamp, built from the same keys the file tools read) on every local target."""
78
+ from abstractruntime.integrations.abstractcore.workspace_scoped_tools import sandbox_stamp
79
+
80
+ scope = _scope(tmp_path)
81
+ (tmp_path / "ws" / "page.html").write_text("<p>hi</p>", encoding="utf-8")
82
+ for target in ("page.html", f"file://{tmp_path / 'ws' / 'page.html'}"):
83
+ out = rewrite_tool_arguments(tool_name="browser_probe", args={"target": target, "_sandbox": {"forged": True}}, scope=scope)
84
+ assert out["_sandbox"] == sandbox_stamp(scope), target
85
+ out = rewrite_tool_arguments(tool_name="browser_probe", args={"target": "https://example.org/"}, scope=scope)
86
+ assert "_sandbox" not in out
@@ -52,7 +52,7 @@ def test_runtime_base_is_remote_light_with_multimodal_and_mcp_support() -> None:
52
52
  assert "abstractcore = [" not in text
53
53
  assert "multimodal = [" not in text
54
54
  assert "mcp-worker = [" not in text
55
- assert '"abstractcore>=2.25.0"' in text
55
+ assert '"abstractcore>=2.25.1"' in text
56
56
  # Only AbstractCore's three install settings: light (no extra), apple, gpu.
57
57
  assert re.findall(r'"abstractcore\[([^\]]*)\]', text) == ["apple", "gpu"]
58
58
  assert '"openai<3.0.0,>=1.109.1"' in text
@@ -89,8 +89,8 @@ def test_runtime_exposes_only_apple_and_gpu_user_install_profiles() -> None:
89
89
  apple_block = _extract_optional_dependency_block(text, key="apple")
90
90
  gpu_block = _extract_optional_dependency_block(text, key="gpu")
91
91
 
92
- assert '"abstractcore[apple]>=2.25.0"' in apple_block
93
- assert '"abstractcore[gpu]>=2.25.0"' in gpu_block
92
+ assert '"abstractcore[apple]>=2.25.1"' in apple_block
93
+ assert '"abstractcore[gpu]>=2.25.1"' in gpu_block
94
94
  assert '"setuptools<82.0.0,>=80.10.2"' in apple_block
95
95
  assert '"setuptools<82.0.0,>=77.0.3"' in gpu_block
96
96
  assert "pymupdf" not in apple_block.lower()
@@ -66,7 +66,10 @@ def _fresh_host():
66
66
 
67
67
  @pytest.fixture
68
68
  def t(tmp_path, monkeypatch):
69
- root = Path(os.path.realpath(tmp_path))
69
+ return _tree(Path(os.path.realpath(tmp_path)), monkeypatch)
70
+
71
+
72
+ def _tree(root: Path, monkeypatch) -> Path:
70
73
  for d in ("data/workspaces/session-1", "data/other", "home/.ssh", "home/parent/child", "home/parent/child/deny", "ro", "rw", "refused"):
71
74
  (root / d).mkdir(parents=True, exist_ok=True)
72
75
  (root / "refused/secret.txt").write_text(MARK)
@@ -283,8 +286,39 @@ def test_e2e_fail_closed_keeps_the_run_going(t, monkeypatch):
283
286
  assert MARK not in str(res)
284
287
 
285
288
 
289
+ @pytest.fixture(params=["temp_root", "user_data_root"])
290
+ def t_anywhere(request, tmp_path, monkeypatch):
291
+ """The same tree under pytest's temp root (macOS: /private/var/folders or /private/tmp,
292
+ Linux: /tmp) AND under a user-data root (the real home), so the entity test cannot flip
293
+ on where TMPDIR points: an unlisted folder must be unreadable in both."""
294
+ if request.param == "temp_root":
295
+ yield _tree(Path(os.path.realpath(tmp_path)), monkeypatch)
296
+ return
297
+ import pwd
298
+ import shutil
299
+ import tempfile
300
+
301
+ real_home = Path(pwd.getpwuid(os.getuid()).pw_dir)
302
+ base = real_home / ".cache" / "abstractruntime-tests"
303
+ base.mkdir(parents=True, exist_ok=True)
304
+ root = Path(os.path.realpath(tempfile.mkdtemp(prefix="r12-", dir=str(base))))
305
+ try:
306
+ yield _tree(root, monkeypatch)
307
+ finally:
308
+ shutil.rmtree(root, ignore_errors=True)
309
+
310
+
311
+ def test_macos_allow_list_denies_the_shared_temp_roots():
312
+ """macOS "Deny everything, allow listed workspaces" denies the shared temp roots too
313
+ (where pytest's tmp tree and other processes' files live), not only /Users."""
314
+ roots = core_sandbox._USER_DATA_ROOTS_DARWIN
315
+ for r in ("/Users", "/Volumes", "/private/var/root", "/private/tmp", "/private/var/folders"):
316
+ assert r in roots, r
317
+
318
+
286
319
  @real_sandbox
287
- def test_e2e_entity_exec_is_sandboxed(t):
320
+ def test_e2e_entity_exec_is_sandboxed(t_anywhere):
321
+ t = t_anywhere
288
322
  from abstractruntime.identity.tools import WorkspaceRoot, _run_execute_command
289
323
 
290
324
  home = t / "entity"