AbstractRuntime 0.10.3__tar.gz → 0.10.5__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 (708) hide show
  1. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/CHANGELOG.md +30 -0
  2. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/PKG-INFO +1 -1
  3. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/api.md +1 -0
  4. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/llms-full.txt +1 -0
  5. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/pyproject.toml +1 -1
  6. abstractruntime-0.10.5/release-notes.md +9 -0
  7. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +11 -41
  8. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/llm_client.py +31 -27
  9. abstractruntime-0.10.5/tests/test_endpoint_profile_media_end_to_end.py +159 -0
  10. abstractruntime-0.10.5/tests/test_endpoint_profile_media_specs_keep_provider.py +153 -0
  11. abstractruntime-0.10.3/release-notes.md +0 -8
  12. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/.github/workflows/ci.yml +0 -0
  13. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/.github/workflows/release.yml +0 -0
  14. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/.gitignore +0 -0
  15. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/ACKNOWLEDGMENTS.md +0 -0
  16. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/CODE_OF_CONDUCT.md +0 -0
  17. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/CONTRIBUTING.md +0 -0
  18. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/LICENSE +0 -0
  19. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/README.md +0 -0
  20. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/ROADMAP.md +0 -0
  21. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/SECURITY.md +0 -0
  22. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/README.md +0 -0
  23. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  24. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  25. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  26. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  27. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  28. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  29. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  30. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/adr/README.md +0 -0
  31. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/architecture.md +0 -0
  32. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/artifacts.md +0 -0
  33. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/automations.md +0 -0
  34. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/README.md +0 -0
  35. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  36. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  37. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  38. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  39. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  40. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  41. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  42. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  43. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/003_wait_primitives.md +0 -0
  44. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  45. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  46. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  47. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  48. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  49. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  50. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  51. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  52. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/009_artifact_store.md +0 -0
  53. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  54. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  55. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  56. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  57. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  58. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  59. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  60. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  61. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  62. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  63. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  64. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  65. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  66. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  67. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  68. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  69. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  70. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  71. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  72. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  73. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  74. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  75. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  76. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  77. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  78. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/004_tests.md +0 -0
  79. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  80. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  81. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  82. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  83. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/README.md +0 -0
  84. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  85. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  86. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  87. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  88. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  89. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  90. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  91. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  92. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  93. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  94. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  95. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  96. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  97. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  98. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  99. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_portability/README.md +0 -0
  100. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  101. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  102. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  103. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  104. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  105. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  106. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  107. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  108. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  109. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  110. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  111. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  112. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  113. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  114. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  115. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  116. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  117. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  118. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  119. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  120. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  121. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  122. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  123. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  124. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  125. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  126. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  127. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  128. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  129. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/email.md +0 -0
  130. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/entity-runtime.md +0 -0
  131. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/evidence.md +0 -0
  132. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/faq.md +0 -0
  133. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/getting-started.md +0 -0
  134. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/integrations/abstractcore.md +0 -0
  135. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/limits.md +0 -0
  136. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/manual_testing.md +0 -0
  137. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/mcp-worker.md +0 -0
  138. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/proposal.md +0 -0
  139. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/provenance.md +0 -0
  140. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/snapshots.md +0 -0
  141. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/tool-approval.md +0 -0
  142. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/tools-comms.md +0 -0
  143. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/troubleshooting.md +0 -0
  144. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/docs/workflow-bundles.md +0 -0
  145. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/01_hello_world.py +0 -0
  146. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/02_ask_user.py +0 -0
  147. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/03_wait_until.py +0 -0
  148. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/04_multi_step.py +0 -0
  149. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/05_persistence.py +0 -0
  150. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/06_llm_integration.py +0 -0
  151. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/07_react_agent.py +0 -0
  152. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/examples/README.md +0 -0
  153. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/llms.txt +0 -0
  154. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/mkdocs.yml +0 -0
  155. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/pytest.ini +0 -0
  156. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/scripts/backfill_diary_edges.py +0 -0
  157. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/scripts/generate_llms_full.py +0 -0
  158. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/__init__.py +0 -0
  159. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automation_queries.py +0 -0
  160. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/__init__.py +0 -0
  161. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/adapters.py +0 -0
  162. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/attention.py +0 -0
  163. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/bundle.py +0 -0
  164. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  165. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  166. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/commands.py +0 -0
  167. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/controller.py +0 -0
  168. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/ledger.py +0 -0
  169. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/models.py +0 -0
  170. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/automations/service.py +0 -0
  171. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/__init__.py +0 -0
  172. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/config.py +0 -0
  173. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/effect_cancellation.py +0 -0
  174. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/event_keys.py +0 -0
  175. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/health.py +0 -0
  176. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/live_deltas.py +0 -0
  177. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/models.py +0 -0
  178. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/policy.py +0 -0
  179. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/progress_channel.py +0 -0
  180. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/run_attribution.py +0 -0
  181. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/run_identity.py +0 -0
  182. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/run_lifecycle.py +0 -0
  183. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/runtime.py +0 -0
  184. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/spec.py +0 -0
  185. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/tool_scope.py +0 -0
  186. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/core/vars.py +0 -0
  187. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/documents/__init__.py +0 -0
  188. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/documents/charts.py +0 -0
  189. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/documents/docx.py +0 -0
  190. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/documents/pdf.py +0 -0
  191. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/__init__.py +0 -0
  192. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/actions.py +0 -0
  193. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/automations.py +0 -0
  194. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/binding.py +0 -0
  195. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/feeder.py +0 -0
  196. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/frame.py +0 -0
  197. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/email/inbox.py +0 -0
  198. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/evidence/__init__.py +0 -0
  199. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/evidence/recorder.py +0 -0
  200. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/history_bundle.py +0 -0
  201. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/__init__.py +0 -0
  202. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/act_only.py +0 -0
  203. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/chat.py +0 -0
  204. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/communities.py +0 -0
  205. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/diary.py +0 -0
  206. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/digest.py +0 -0
  207. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/entity_runtime.py +0 -0
  208. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/fingerprint.py +0 -0
  209. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/lease.py +0 -0
  210. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/life.py +0 -0
  211. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/memory_reader.py +0 -0
  212. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/night_voice.py +0 -0
  213. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/phase_graph.py +0 -0
  214. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/phase_spec.py +0 -0
  215. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/prelude.py +0 -0
  216. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  217. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/reflection.py +0 -0
  218. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  219. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/substrate.py +0 -0
  220. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/tool_effects.py +0 -0
  221. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/tool_policy.py +0 -0
  222. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/tools.py +0 -0
  223. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/identity/visit_workflow.py +0 -0
  224. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/__init__.py +0 -0
  225. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  226. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  227. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  228. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  229. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  230. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  231. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  232. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  233. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  234. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  235. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  236. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  237. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  238. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  239. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  240. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  241. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  242. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  243. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  244. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  245. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  246. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  247. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  248. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  249. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  250. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  251. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  252. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  253. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  254. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  255. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  256. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  257. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  258. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  259. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  260. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  261. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/__init__.py +0 -0
  262. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/active_context.py +0 -0
  263. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/active_memory.py +0 -0
  264. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/compaction.py +0 -0
  265. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/kg_packets.py +0 -0
  266. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/memact_composer.py +0 -0
  267. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/recall_levels.py +0 -0
  268. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/memory/token_budget.py +0 -0
  269. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/rendering/__init__.py +0 -0
  270. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  271. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/rendering/json_stringify.py +0 -0
  272. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/scheduler/__init__.py +0 -0
  273. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/scheduler/convenience.py +0 -0
  274. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/scheduler/multi_store.py +0 -0
  275. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/scheduler/registry.py +0 -0
  276. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/scheduler/scheduler.py +0 -0
  277. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/session_history.py +0 -0
  278. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/session_turns.py +0 -0
  279. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/__init__.py +0 -0
  280. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/artifacts.py +0 -0
  281. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/base.py +0 -0
  282. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/commands.py +0 -0
  283. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/in_memory.py +0 -0
  284. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/json_files.py +0 -0
  285. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/lease.py +0 -0
  286. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/ledger_chain.py +0 -0
  287. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/ledger_slim.py +0 -0
  288. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/observable.py +0 -0
  289. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/offloading.py +0 -0
  290. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/serialize.py +0 -0
  291. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/snapshots.py +0 -0
  292. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/sqlite.py +0 -0
  293. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  294. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/__init__.py +0 -0
  295. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/email_received.py +0 -0
  296. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/manual.py +0 -0
  297. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/protocol.py +0 -0
  298. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/registry.py +0 -0
  299. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/triggers/schedule.py +0 -0
  300. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/turn_grounding.py +0 -0
  301. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/utils/__init__.py +0 -0
  302. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/utils/atomic_files.py +0 -0
  303. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/utils/file_filters.py +0 -0
  304. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/utils/workspace_paths.py +0 -0
  305. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  306. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  307. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  308. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  309. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  310. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  311. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  312. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  313. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  314. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  315. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  316. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  317. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  318. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  319. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  320. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  321. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  322. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  323. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  324. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  325. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  326. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  327. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  328. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  329. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  330. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  331. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  332. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/workflow_bundle/models.py +0 -0
  333. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  334. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  335. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  336. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/README.md +0 -0
  337. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/automation_harness.py +0 -0
  338. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/conftest.py +0 -0
  339. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/email_wp2_support.py +0 -0
  340. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/fixtures/schedule_v1_corpus.json +0 -0
  341. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/live_email/conftest.py +0 -0
  342. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/live_email/live_email_support.py +0 -0
  343. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/live_email/test_email_live_runtime.py +0 -0
  344. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_comms_facade.py +0 -0
  345. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_discovery_facade.py +0 -0
  346. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_host_facade.py +0 -0
  347. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_run_facade.py +0 -0
  348. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_server_facade.py +0 -0
  349. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_structured_facade.py +0 -0
  350. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_abstractcore_telegram_facade.py +0 -0
  351. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_active_context_policy.py +0 -0
  352. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_active_index.py +0 -0
  353. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_active_memory.py +0 -0
  354. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_agora_agent_alias_identity.py +0 -0
  355. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_agora_tools_http.py +0 -0
  356. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  357. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_answer_user_effect.py +0 -0
  358. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_artifacts.py +0 -0
  359. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_calendar_schedule.py +0 -0
  360. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_commands.py +0 -0
  361. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_controller.py +0 -0
  362. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_controller_recovery.py +0 -0
  363. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_definition.py +0 -0
  364. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_discussion_isolation.py +0 -0
  365. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_email_results.py +0 -0
  366. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_growing_context.py +0 -0
  367. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_index.py +0 -0
  368. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_next_fire.py +0 -0
  369. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_occurrence_input_resolver.py +0 -0
  370. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_occurrence_recovery.py +0 -0
  371. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_replay_read_only.py +0 -0
  372. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_retry.py +0 -0
  373. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_session_turns.py +0 -0
  374. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_status.py +0 -0
  375. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_automation_tool_approval.py +0 -0
  376. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_browser_probe_target_walling.py +0 -0
  377. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  378. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_capability_default_reasoning.py +0 -0
  379. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_chat_summarizer_integration.py +0 -0
  380. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_code_node_imports.py +0 -0
  381. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_code_node_restricted_python.py +0 -0
  382. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_command_sandbox_host_facade.py +0 -0
  383. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_command_store.py +0 -0
  384. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_compaction_helpers.py +0 -0
  385. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_compaction_summarizer_route.py +0 -0
  386. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_config_facade_models_engines.py +0 -0
  387. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_config_facade_voice_input_hint.py +0 -0
  388. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_control_adapter_while.py +0 -0
  389. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_controller_bundle_packaged.py +0 -0
  390. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_crash_ordering_inversions.py +0 -0
  391. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_create_if_absent.py +0 -0
  392. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_data_registry_facade.py +0 -0
  393. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_camera_gating.py +0 -0
  394. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_comms_gating.py +0 -0
  395. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_include_skim_files.py +0 -0
  396. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_include_skim_folders.py +0 -0
  397. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_include_skim_web.py +0 -0
  398. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_default_tools_search_files_executor.py +0 -0
  399. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_diary_capture.py +0 -0
  400. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_diary_write_rescue.py +0 -0
  401. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_directory_lease.py +0 -0
  402. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_disabled_toolsets_seam.py +0 -0
  403. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  404. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  405. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_discovery_voice_openai_api_key.py +0 -0
  406. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_discussion_session_anchor.py +0 -0
  407. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_document_markdown_tables.py +0 -0
  408. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_document_renderers_hr_quote.py +0 -0
  409. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_durable_toolsets.py +0 -0
  410. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_durable_write_discipline.py +0 -0
  411. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  412. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_effect_cancellation.py +0 -0
  413. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_effect_issuance_idempotency.py +0 -0
  414. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  415. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_election_consequence_teaching.py +0 -0
  416. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_binding_and_refiner.py +0 -0
  417. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_gate_fixes.py +0 -0
  418. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_inbox_and_trigger.py +0 -0
  419. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_regate_fixes.py +0 -0
  420. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_review_fixes.py +0 -0
  421. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_self_trigger_loop.py +0 -0
  422. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_email_toolset_and_walls.py +0 -0
  423. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_emergence_experiment.py +0 -0
  424. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_emit_event_uses_wait_index.py +0 -0
  425. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_emit_event_without_workflow_registry.py +0 -0
  426. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_endpoint_profile_media_in_process.py +0 -0
  427. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_endpoint_profile_route_context.py +0 -0
  428. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_awake_memory_fixes.py +0 -0
  429. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_brain_effects.py +0 -0
  430. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_chat_driver.py +0 -0
  431. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_chat_tools_reflection.py +0 -0
  432. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_diary.py +0 -0
  433. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_execute_tool.py +0 -0
  434. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_fetch_url_tool.py +0 -0
  435. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_history_window.py +0 -0
  436. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_life_loop.py +0 -0
  437. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_memory_richness.py +0 -0
  438. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_phase_graph_conformance.py +0 -0
  439. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_react_visit_window.py +0 -0
  440. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_recent_memories.py +0 -0
  441. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_runtime.py +0 -0
  442. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_search_memory.py +0 -0
  443. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  444. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_substrate_resolution.py +0 -0
  445. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_visit_honesty.py +0 -0
  446. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_workspace_cap.py +0 -0
  447. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_entity_workspace_tools.py +0 -0
  448. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_event_wait_index.py +0 -0
  449. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  450. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_evidence_recorder.py +0 -0
  451. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  452. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_execute_command_output_offload.py +0 -0
  453. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_execution_capability_discovery.py +0 -0
  454. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_explicit_eject_other_clients.py +0 -0
  455. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_factory_default_retry_policy.py +0 -0
  456. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  457. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_format_repair_nudge.py +0 -0
  458. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_fresh_install_no_provider.py +0 -0
  459. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_gateway_facades_c4899.py +0 -0
  460. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_git_read_only_refiner.py +0 -0
  461. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_hf_process_residency_merge.py +0 -0
  462. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_history_window_multimodal.py +0 -0
  463. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_hot_path_store_reads.py +0 -0
  464. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_indexed_idempotency_lookup.py +0 -0
  465. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_integration_abstractcore.py +0 -0
  466. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_integrations_abstractcore.py +0 -0
  467. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_json_file_run_store_children_index.py +0 -0
  468. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_json_run_cache_bound.py +0 -0
  469. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_json_store_scan_memo.py +0 -0
  470. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_jsonl_ledger_recovery.py +0 -0
  471. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_kg_learn_and_recall_contract.py +0 -0
  472. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_ledger_chain.py +0 -0
  473. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_ledger_record_slimming.py +0 -0
  474. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_ledger_subscription.py +0 -0
  475. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_live_token_deltas.py +0 -0
  476. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_media_artifact_refs.py +0 -0
  477. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  478. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  479. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  480. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_requires_prompt.py +0 -0
  481. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_response_schema_normalization.py +0 -0
  482. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_structured_output_fallback.py +0 -0
  483. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_text_phase_progress.py +0 -0
  484. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  485. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  486. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  487. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_client_grounding_tail.py +0 -0
  488. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_client_media_artifacts.py +0 -0
  489. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_client_system_context.py +0 -0
  490. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_client_tool_call_parsing.py +0 -0
  491. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_retry_classification.py +0 -0
  492. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_llm_streaming_on_token.py +0 -0
  493. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_local_helper_tool_exposure.py +0 -0
  494. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_local_residency_host_sweep.py +0 -0
  495. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  496. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_max_iterations_ceiling.py +0 -0
  497. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mcp_remote_tool_executor.py +0 -0
  498. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  499. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mcp_worker_logging.py +0 -0
  500. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mcp_worker_security.py +0 -0
  501. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mcp_worker_stdio.py +0 -0
  502. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_media_artifact_resolution.py +0 -0
  503. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_media_capability_default_routing.py +0 -0
  504. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_media_only_requests_skip_text_client.py +0 -0
  505. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_media_subprocess.py +0 -0
  506. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memact_composer_from_kg_result.py +0 -0
  507. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_appraise_handler.py +0 -0
  508. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_communities.py +0 -0
  509. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  510. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_packets.py +0 -0
  511. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  512. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  513. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  514. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  515. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_note_effect.py +0 -0
  516. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_query_effect.py +0 -0
  517. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_query_rich_filters.py +0 -0
  518. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  519. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_seam_handlers.py +0 -0
  520. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_seam_sqlite_durability.py +0 -0
  521. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_memory_tag_effect.py +0 -0
  522. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mlx_generation_serialization.py +0 -0
  523. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_mlx_process_residency_merge.py +0 -0
  524. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_model_eject_cancel.py +0 -0
  525. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_model_residency_clean_switch.py +0 -0
  526. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_model_residency_control_plane.py +0 -0
  527. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  528. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_multi_store_scheduler.py +0 -0
  529. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_multimodal_abstractcore_integration.py +0 -0
  530. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_native_mlx_application_wiring.py +0 -0
  531. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_native_mlx_execution_controls_live.py +0 -0
  532. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_native_tool_channel.py +0 -0
  533. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_night_voice.py +0 -0
  534. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_no_default_provider_refusal_ux.py +0 -0
  535. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_offload_answer_chain_c4978.py +0 -0
  536. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  537. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_offloading.py +0 -0
  538. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_packaging_extras.py +0 -0
  539. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_parallel_readonly_tool_execution.py +0 -0
  540. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_pause_resume.py +0 -0
  541. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_pdf_unicode_rendering.py +0 -0
  542. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_personal_cycle.py +0 -0
  543. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_phantom_attachment_index.py +0 -0
  544. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_phase_graph_artifact_control.py +0 -0
  545. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_phase_graph_obedience.py +0 -0
  546. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_phase_vocabulary_migration.py +0 -0
  547. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  548. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_cache_export_import.py +0 -0
  549. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  550. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_cache_modules.py +0 -0
  551. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  552. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  553. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_prompt_overlay.py +0 -0
  554. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  555. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_provider_pin_routing_isolation.py +0 -0
  556. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_queryable_run_store.py +0 -0
  557. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_r12_workspace_sandbox.py +0 -0
  558. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  559. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_read_idle_threading.py +0 -0
  560. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_readoption_experiment.py +0 -0
  561. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_real_integration.py +0 -0
  562. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_realize_election.py +0 -0
  563. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_recall_levels_policy.py +0 -0
  564. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_remote_client_cancel.py +0 -0
  565. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_remote_llm_client.py +0 -0
  566. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_remote_speculation_defaults.py +0 -0
  567. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_rendering_agent_trace_report.py +0 -0
  568. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_rendering_json_stringify.py +0 -0
  569. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_report_branding.py +0 -0
  570. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_resident_media_generation.py +0 -0
  571. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_resume_concurrent_same_wait.py +0 -0
  572. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_retry_idempotency.py +0 -0
  573. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_run_history_bundle.py +0 -0
  574. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_run_index_workspace_root.py +0 -0
  575. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_run_mutation_lock.py +0 -0
  576. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_run_scoped_tool_policy.py +0 -0
  577. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_run_tool_scope_ceiling.py +0 -0
  578. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_browser_session_boundary.py +0 -0
  579. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  580. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  581. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_effect_invocation_trace.py +0 -0
  582. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  583. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_install_boundary.py +0 -0
  584. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  585. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_node_traces.py +0 -0
  586. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  587. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_runtime_tick_step_gate.py +0 -0
  588. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_schedule_v1_corpus.py +0 -0
  589. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_schedule_v2_calendar.py +0 -0
  590. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_scheduler.py +0 -0
  591. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_send_email_refiner.py +0 -0
  592. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_send_email_self_default_policy.py +0 -0
  593. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  594. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_history.py +0 -0
  595. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_prompt_cache_attribution.py +0 -0
  596. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_prompt_cache_visibility.py +0 -0
  597. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_route_stamp.py +0 -0
  598. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_session_start_cost.py +0 -0
  599. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_shell_tool_exposure.py +0 -0
  600. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_snapshots.py +0 -0
  601. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_speculation_inheritance.py +0 -0
  602. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_speculation_reaches_provider_construction.py +0 -0
  603. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_sqlite_ledger_store.py +0 -0
  604. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_start_subworkflow_async_wait.py +0 -0
  605. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  606. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  607. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_steer_sidecar.py +0 -0
  608. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_storage_deletion.py +0 -0
  609. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_structured_output_schema_enum.py +0 -0
  610. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_subworkflow.py +0 -0
  611. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_terminal_effect_completion.py +0 -0
  612. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  613. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_thinking_inheritance.py +0 -0
  614. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  615. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_approval_executor.py +0 -0
  616. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_approval_resume_executes.py +0 -0
  617. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_approval_wait_key_identity.py +0 -0
  618. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_calls_idempotency_keys.py +0 -0
  619. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_catalog.py +0 -0
  620. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_descriptor_registry.py +0 -0
  621. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_argument_sanitization.py +0 -0
  622. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_error_output_detection.py +0 -0
  623. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_filename_alias.py +0 -0
  624. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  625. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_read_file_aliases.py +0 -0
  626. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_executor_timeout.py +0 -0
  627. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_inventory_facade.py +0 -0
  628. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_invoke_effect.py +0 -0
  629. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_policy_and_mounts.py +0 -0
  630. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_tool_wait_allowlist_safety.py +0 -0
  631. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_topic_election_world_model.py +0 -0
  632. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_trace_context_propagation.py +0 -0
  633. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_trigger_registry.py +0 -0
  634. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_trigger_schedule_math.py +0 -0
  635. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_turn_grounding_byte_stability.py +0 -0
  636. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_turn_grounding_carriers_a3.py +0 -0
  637. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_vars_query_effect.py +0 -0
  638. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visit_ab_fixture.py +0 -0
  639. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visit_midturn_elections.py +0 -0
  640. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visit_midturn_resume.py +0 -0
  641. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visit_workflow.py +0 -0
  642. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  643. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  644. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  645. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  646. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  647. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  648. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_entity_memory_nodes.py +0 -0
  649. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  650. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_llm_call_partial_override.py +0 -0
  651. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  652. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_loop_back_out_of_body.py +0 -0
  653. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  654. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_loop_limit_on_wire.py +0 -0
  655. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_memact_compose_node.py +0 -0
  656. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  657. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  658. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  659. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_reroute_lowering.py +0 -0
  660. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_set_vars_pins.py +0 -0
  661. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  662. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  663. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_add_message_builtin.py +0 -0
  664. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  665. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_agora_react_agent.py +0 -0
  666. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_call_tool_node.py +0 -0
  667. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  668. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_compiler_basic.py +0 -0
  669. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  670. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_continue_on_error.py +0 -0
  671. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  672. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  673. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  674. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_function_library.py +0 -0
  675. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_get_element_node.py +0 -0
  676. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_get_random_element_node.py +0 -0
  677. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_get_var_node.py +0 -0
  678. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_has_tools_builtin.py +0 -0
  679. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  680. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  681. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_make_object_node.py +0 -0
  682. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_media_nodes.py +0 -0
  683. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  684. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_memory_source_pins.py +0 -0
  685. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_pin_expressions.py +0 -0
  686. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_prompt_only.py +0 -0
  687. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_random_nodes.py +0 -0
  688. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_schema_enum_switch.py +0 -0
  689. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_string_contains_replace.py +0 -0
  690. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_visualflow_tool_parameters_node.py +0 -0
  691. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_voice_openai_api_key_path.py +0 -0
  692. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  693. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_w4_feelings_lens.py +0 -0
  694. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_wait_event_deadline.py +0 -0
  695. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_wait_event_prompt_metadata.py +0 -0
  696. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_wait_until_streak.py +0 -0
  697. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_wait_until_utc_normalization.py +0 -0
  698. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workflow_bundle_registry.py +0 -0
  699. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_builtin_deny.py +0 -0
  700. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  701. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  702. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  703. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  704. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  705. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_prompt_context.py +0 -0
  706. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_read_only.py +0 -0
  707. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_workspace_writable_paths.py +0 -0
  708. {abstractruntime-0.10.3 → abstractruntime-0.10.5}/tests/test_write_chart.py +0 -0
@@ -5,6 +5,36 @@ 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.10.5] - 2026-10-18
9
+
10
+ ### Changed
11
+
12
+ - The pooled client wires every client it builds in one place (`_adopt_client`): the residency core, the
13
+ Core execution context, the host's endpoint-profile resolver and the pool-wide token callback reach the
14
+ text clients, the per-call override clients and the media host through the same path, and a setting
15
+ applied later reaches all of them through `_owned_clients`. No behaviour change. Tests:
16
+ `tests/test_endpoint_profile_media_end_to_end.py` (an image spec on an `endpoint:<id>` profile reaches
17
+ that endpoint through the `LLM_CALL` handler, the pooled client and AbstractCore's capability host, with
18
+ and without a text provider on the call).
19
+
20
+ ## [0.10.4] - 2026-10-18
21
+
22
+ ### Fixed
23
+
24
+ - An image, video or voice spec whose provider is an endpoint profile (`endpoint:<id>`) keeps that provider
25
+ all the way to the media plugin. The `LLM_CALL` handler resolved the first output spec's endpoint as if it
26
+ were the call's text provider: it rewrote the spec to the bare provider family and put the endpoint's URL
27
+ and key into text-client routing params that the media path never reads, so an image generation routed to
28
+ a gateway endpoint profile (the web console's sandbox, an image route set to an OpenAI-compatible relay
29
+ serving `gpt-image-2`) reached AbstractVision as a keyless `openai-compatible` request with no base URL
30
+ and failed with "Missing vision_base_url / OPENAI_BASE_URL" -- in the one-shot media subprocess, since
31
+ the spec no longer said `endpoint:`. Only the call's own `provider` (`_provider`) is resolved now; the
32
+ spec's endpoint is resolved by the media plugin through the host's resolver, in process. The pooled
33
+ client's media host (the client every media-only call runs on) now carries the host's endpoint-profile
34
+ resolver, whether it is built before or after `set_provider_endpoint_profile_resolver`. Affects every
35
+ host that attaches an endpoint-profile resolver (AbstractGateway). Tests:
36
+ `tests/test_endpoint_profile_media_specs_keep_provider.py`.
37
+
8
38
  ## [0.10.3] - 2026-10-18
9
39
 
10
40
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.10.3
3
+ Version: 0.10.5
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
@@ -356,6 +356,7 @@ Multimodal support:
356
356
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
357
357
  - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
358
358
  - a media spec whose `provider` is an endpoint profile (`endpoint:<id>`) never uses the one-shot subprocess: it is an HTTP call to that endpoint, and the host's endpoint-profile resolver (`set_provider_endpoint_profile_resolver`) exists only in this process
359
+ - the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client. Every client the pooled client builds carries that resolver: the text clients, the per-call override clients and the media host that serves media-only calls
359
360
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
360
361
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
361
362
 
@@ -1226,6 +1226,7 @@ Multimodal support:
1226
1226
  - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
1227
1227
  - local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
1228
1228
  - a media spec whose `provider` is an endpoint profile (`endpoint:<id>`) never uses the one-shot subprocess: it is an HTTP call to that endpoint, and the host's endpoint-profile resolver (`set_provider_endpoint_profile_resolver`) exists only in this process
1229
+ - the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client. Every client the pooled client builds carries that resolver: the text clients, the per-call override clients and the media host that serves media-only calls
1229
1230
  - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
1230
1231
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
1231
1232
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.10.3"
7
+ version = "0.10.5"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,9 @@
1
+ ### Changed
2
+
3
+ - The pooled client wires every client it builds in one place (`_adopt_client`): the residency core, the
4
+ Core execution context, the host's endpoint-profile resolver and the pool-wide token callback reach the
5
+ text clients, the per-call override clients and the media host through the same path, and a setting
6
+ applied later reaches all of them through `_owned_clients`. No behaviour change. Tests:
7
+ `tests/test_endpoint_profile_media_end_to_end.py` (an image spec on an `endpoint:<id>` profile reaches
8
+ that endpoint through the `LLM_CALL` handler, the pooled client and AbstractCore's capability host, with
9
+ and without a text provider on the call).
@@ -228,56 +228,28 @@ def _observability_params(params: Dict[str, Any]) -> Dict[str, Any]:
228
228
  _MISSING = object()
229
229
 
230
230
 
231
- def _first_output_provider(value: Any) -> Optional[str]:
232
- if isinstance(value, dict):
233
- provider = value.get("provider")
234
- if isinstance(provider, str) and provider.strip():
235
- return provider.strip()
236
- specs = value.get("specs")
237
- if isinstance(specs, list):
238
- for item in specs:
239
- found = _first_output_provider(item)
240
- if found:
241
- return found
242
- elif isinstance(value, list):
243
- for item in value:
244
- found = _first_output_provider(item)
245
- if found:
246
- return found
247
- return None
248
-
249
-
250
- def _replace_output_provider(value: Any, *, old_provider: str, new_provider: str) -> Any:
251
- old_norm = str(old_provider or "").strip().lower()
252
- if not old_norm or not isinstance(new_provider, str) or not new_provider.strip():
253
- return value
254
- if isinstance(value, dict):
255
- out = dict(value)
256
- provider = out.get("provider")
257
- if isinstance(provider, str) and provider.strip().lower() == old_norm:
258
- out["provider"] = new_provider.strip()
259
- if isinstance(out.get("specs"), list):
260
- out["specs"] = [_replace_output_provider(item, old_provider=old_provider, new_provider=new_provider) for item in out["specs"]]
261
- return out
262
- if isinstance(value, list):
263
- return [_replace_output_provider(item, old_provider=old_provider, new_provider=new_provider) for item in value]
264
- return value
265
-
266
-
267
231
  def _apply_provider_endpoint_profile_resolution(*, llm: AbstractCoreLLMClient, params: Dict[str, Any]) -> None:
268
- """Resolve a host-provided virtual provider profile into Core routing params.
232
+ """Resolve the call's own `endpoint:<id>` text provider into Core routing params.
269
233
 
270
234
  Hosts can attach `resolve_provider_endpoint_profile(provider_id)` to the LLM
271
235
  client. Runtime keeps this as a generic optional hook so it does not import
272
236
  Gateway, and only the transient `params` dict receives the raw provider key.
237
+
238
+ Only `_provider` (the text route of THIS call) is resolved here. An output
239
+ spec that names an `endpoint:<id>` provider (an image, video or voice
240
+ generation through a named endpoint connection) keeps it: the media
241
+ plugins resolve the profile themselves through the resolver the host
242
+ attached to the client, and the runtime keeps such a spec in process
243
+ (`_is_subprocess_safe_image_specs`). Rewriting it to the bare provider
244
+ family used to lose the endpoint -- the spec reached the media backend as
245
+ a keyless `openai-compatible` request with no base URL, while the URL and
246
+ key sat in text-client kwargs the media path never reads.
273
247
  """
274
248
 
275
249
  resolver = getattr(llm, "resolve_provider_endpoint_profile", None)
276
250
  if not callable(resolver):
277
251
  return
278
252
  provider = params.get("_provider")
279
- if not (isinstance(provider, str) and provider.strip()):
280
- provider = _first_output_provider(params.get("output"))
281
253
  if not (isinstance(provider, str) and provider.strip()):
282
254
  return
283
255
  try:
@@ -292,8 +264,6 @@ def _apply_provider_endpoint_profile_resolution(*, llm: AbstractCoreLLMClient, p
292
264
  raise RuntimeError(f"Provider endpoint profile {provider!r} did not resolve to a provider family.")
293
265
 
294
266
  params["_provider"] = provider_family
295
- if "output" in params:
296
- params["output"] = _replace_output_provider(params.get("output"), old_provider=provider, new_provider=provider_family)
297
267
 
298
268
  base_url = resolved.get("base_url")
299
269
  if isinstance(base_url, str) and base_url.strip() and not str(params.get("base_url") or "").strip():
@@ -10635,15 +10635,29 @@ class MultiLocalAbstractCoreLLMClient:
10635
10635
  if last_exc is not None:
10636
10636
  raise last_exc
10637
10637
  raise TypeError("Failed to construct LocalAbstractCoreLLMClient")
10638
- # Media generation on the pooled client finds the models explicitly
10639
- # loaded into THIS pool's residency core (`_resident_capability_core_for`).
10638
+ return self._adopt_client(client)
10639
+
10640
+ def _adopt_client(self, client: LocalAbstractCoreLLMClient) -> LocalAbstractCoreLLMClient:
10641
+ """Wire a client this pool just built -- the ONE place for everything a
10642
+ client inherits from its pool, so a client built on a new path cannot
10643
+ miss part of it (the media host missed the resolver in 0.10.3):
10644
+
10645
+ - the residency core: media generation on the client finds the models
10646
+ explicitly loaded into THIS pool (`_resident_capability_core_for`);
10647
+ - the Core execution context (config store, capability defaults);
10648
+ - the host's endpoint-profile resolver: the media plugins resolve an
10649
+ `endpoint:<id>` spec through the resolver on their owner, this client;
10650
+ - the pool-wide token callback.
10651
+
10652
+ A setting that arrives after construction reaches every client the
10653
+ pool owns through its setter (`_owned_clients`)."""
10640
10654
  client._capability_residency_parent = weakref.ref(self)
10641
- if self._core_config_file or getattr(self, "_capability_defaults_explicit", bool(self._capability_defaults)):
10655
+ explicit = getattr(self, "_capability_defaults_explicit", bool(self._capability_defaults))
10656
+ if self._core_config_file or explicit:
10642
10657
  _attach_core_execution_context_to_client(
10643
10658
  client,
10644
10659
  core_config_file=self._core_config_file,
10645
- capability_defaults=self._capability_defaults
10646
- if getattr(self, "_capability_defaults_explicit", bool(self._capability_defaults)) else None,
10660
+ capability_defaults=self._capability_defaults if explicit else None,
10647
10661
  )
10648
10662
  resolver = getattr(self, "_provider_endpoint_profile_resolver", None)
10649
10663
  if callable(resolver):
@@ -10653,19 +10667,21 @@ class MultiLocalAbstractCoreLLMClient:
10653
10667
  client.set_on_token(pool_on_token)
10654
10668
  return client
10655
10669
 
10670
+ def _owned_clients(self) -> List[Any]:
10671
+ """Every client this pool built and still serves: the pooled text
10672
+ clients (`_pooled_clients`) and the media host. A pool-wide setting
10673
+ applied after construction goes to all of them."""
10674
+ media_host = self.__dict__.get("_media_host")
10675
+ return [*self._pooled_clients(), *([media_host] if media_host is not None else [])]
10676
+
10656
10677
  def set_on_token(self, callback: Optional[Any]) -> None:
10657
10678
  """Pool-wide token callback (code seat c1009 ask 3): registers on every
10658
10679
  pooled client — existing AND future (per-request provider/model
10659
10680
  overrides create clients lazily; without the fan-out they would
10660
10681
  silently not stream). Same contract as the per-client setter."""
10661
10682
  self._pool_on_token = callback if callable(callback) else None
10662
- for client in list(getattr(self, "_clients", {}).values()):
10683
+ for client in self._owned_clients():
10663
10684
  client.set_on_token(self._pool_on_token)
10664
- for client in list(getattr(self, "_override_clients", {}).values()):
10665
- client.set_on_token(self._pool_on_token)
10666
- default_client = getattr(self, "_default_client", None)
10667
- if default_client is not None:
10668
- default_client.set_on_token(self._pool_on_token)
10669
10685
 
10670
10686
  def _get_client(
10671
10687
  self,
@@ -10762,15 +10778,8 @@ class MultiLocalAbstractCoreLLMClient:
10762
10778
  capability_defaults=self._capability_defaults if explicit else None,
10763
10779
  llm_factory=create_capability_host,
10764
10780
  )
10765
- client._capability_residency_parent = weakref.ref(self)
10766
- if self._core_config_file or explicit:
10767
- _attach_core_execution_context_to_client(
10768
- client,
10769
- core_config_file=self._core_config_file,
10770
- capability_defaults=self._capability_defaults if explicit else None,
10771
- )
10772
- self._media_host = client
10773
- return client
10781
+ self._media_host = self._adopt_client(client)
10782
+ return self._media_host
10774
10783
 
10775
10784
  @contextmanager
10776
10785
  def _building_claim(self, key: Tuple[str, str]):
@@ -10837,14 +10846,9 @@ class MultiLocalAbstractCoreLLMClient:
10837
10846
  def set_provider_endpoint_profile_resolver(self, resolver: Any) -> None:
10838
10847
  self._provider_endpoint_profile_resolver = resolver
10839
10848
  _attach_provider_endpoint_profile_resolver_to_client(self, resolver)
10840
- for client in list(getattr(self, "_clients", {}).values()):
10841
- _attach_provider_endpoint_profile_resolver_to_client(client, resolver)
10842
- for client in list(getattr(self, "_override_clients", {}).values()):
10849
+ for client in self._owned_clients():
10843
10850
  _attach_provider_endpoint_profile_resolver_to_client(client, resolver)
10844
- default_client = getattr(self, "_default_client", None)
10845
- if default_client is not None:
10846
- _attach_provider_endpoint_profile_resolver_to_client(default_client, resolver)
10847
- self._llm = getattr(default_client, "_llm", None)
10851
+ self._llm = getattr(getattr(self, "_default_client", None), "_llm", None)
10848
10852
 
10849
10853
  def get_provider_instance(self, *, provider: str, model: str) -> Any:
10850
10854
  """Return the underlying AbstractCore provider instance for (provider, model)."""
@@ -0,0 +1,159 @@
1
+ """A media spec on an `endpoint:<id>` profile reaches that endpoint, end to end.
2
+
3
+ The LLM_CALL handler, the pooled client, AbstractCore's capability host and
4
+ the vision plugin's owner-resolver contract are real; only the vision backend
5
+ is a fake that records which endpoint it was given. Both production paths:
6
+ the media-only call without a text provider (the web console sandbox) and
7
+ the call that names its text provider (the Assistant orchestrator).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import base64
13
+ import socket
14
+ import subprocess
15
+ from typing import Any, Dict, List, Optional
16
+
17
+ import pytest
18
+
19
+ from abstractruntime.core.models import Effect, EffectType, RunState
20
+ from abstractruntime.integrations.abstractcore.effect_handlers import make_llm_call_handler
21
+ from abstractruntime.integrations.abstractcore.llm_client import MultiLocalAbstractCoreLLMClient
22
+ from abstractruntime.storage.artifacts import InMemoryArtifactStore
23
+
24
+ PNG = base64.b64decode(
25
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+/l9sAAAAASUVORK5CYII="
26
+ )
27
+
28
+
29
+ def _resolver(key: str):
30
+ def resolve(provider_id: str) -> Optional[Dict[str, Any]]:
31
+ if provider_id != "endpoint:relay":
32
+ return None
33
+ return {
34
+ "id": "relay",
35
+ "virtual_provider": "endpoint:relay",
36
+ "provider": "openai-compatible",
37
+ "base_url": "http://127.0.0.1:18921/v1",
38
+ "api_key": key,
39
+ }
40
+
41
+ return resolve
42
+
43
+
44
+ @pytest.fixture
45
+ def pool(tmp_path, monkeypatch):
46
+ def forbidden(*args, **kwargs):
47
+ raise AssertionError("an endpoint-profile media spec never opens a socket or spawns the media subprocess")
48
+
49
+ monkeypatch.setattr(socket.socket, "connect", forbidden)
50
+ monkeypatch.setattr(subprocess, "Popen", forbidden)
51
+ monkeypatch.setenv("ABSTRACTRUNTIME_LOCAL_IMAGE_SUBPROCESS", "1")
52
+ from abstractcore.capabilities.registry import CapabilityRegistry
53
+ from abstractcore.config import manager
54
+
55
+ config_file = str(tmp_path / "core.json")
56
+ monkeypatch.setattr(manager, "_config_manager", manager.ConfigurationManager(config_file=config_file, apply_env=False))
57
+ calls: List[tuple[str, str, str]] = []
58
+
59
+ class RecordingVision:
60
+ backend_id = "test-recording-vision"
61
+
62
+ def __init__(self, owner: Any) -> None:
63
+ self.owner = owner
64
+
65
+ def t2i(self, prompt: str, **kwargs: Any) -> bytes:
66
+ # The vision plugin's contract: `endpoint:<id>` resolves through the
67
+ # resolver on the OWNING Core provider (the media host's), never
68
+ # through the Core config file (a gateway profile has no row there).
69
+ resolved = self.owner.resolve_provider_endpoint_profile(kwargs["provider"])
70
+ calls.append((kwargs["model"], resolved["base_url"], resolved["api_key"]))
71
+ return PNG
72
+
73
+ monkeypatch.setattr(
74
+ CapabilityRegistry,
75
+ "_ensure_plugins_loaded",
76
+ lambda registry: registry.register_vision_backend(
77
+ backend_id=RecordingVision.backend_id, factory=RecordingVision, priority=1000
78
+ ),
79
+ )
80
+ store = InMemoryArtifactStore()
81
+ client = MultiLocalAbstractCoreLLMClient(
82
+ provider="lmstudio", model="local-model", artifact_store=store, core_config_file=config_file
83
+ )
84
+ return client, store, calls
85
+
86
+
87
+ def _image_effect(*, provider: Optional[str] = None) -> Effect:
88
+ payload: Dict[str, Any] = {
89
+ "prompt": "a red circle",
90
+ "output": {
91
+ "modality": "image",
92
+ "task": "image_generation",
93
+ "format": "png",
94
+ "provider": "endpoint:relay",
95
+ "model": "gpt-image-2",
96
+ },
97
+ }
98
+ if provider:
99
+ payload["provider"] = provider
100
+ payload["model"] = "local-model"
101
+ return Effect(type=EffectType.LLM_CALL, payload=payload, result_key="llm")
102
+
103
+
104
+ def _run() -> RunState:
105
+ run = RunState.new(workflow_id="wf", entry_node="node-1", vars={})
106
+ run.current_node = "node-1"
107
+ return run
108
+
109
+
110
+ @pytest.mark.parametrize("call_provider", [None, "lmstudio"], ids=["sandbox-media-only", "orchestrator-text-provider"])
111
+ def test_llm_call_image_on_an_endpoint_profile_reaches_it(pool, call_provider) -> None:
112
+ client, store, calls = pool
113
+ client.set_provider_endpoint_profile_resolver(_resolver("relay-key"))
114
+ handler = make_llm_call_handler(llm=client, artifact_store=store)
115
+
116
+ outcome = handler(_run(), _image_effect(provider=call_provider), None)
117
+
118
+ assert outcome.status == "completed", outcome.error
119
+ assert calls == [("gpt-image-2", "http://127.0.0.1:18921/v1", "relay-key")]
120
+ image = outcome.result["outputs"]["image"][0]
121
+ assert store.load(image["artifact_ref"]["$artifact"]).content == PNG
122
+ assert "relay-key" not in str(outcome.result)
123
+
124
+
125
+ def test_resolver_set_after_the_media_host_exists_and_kept_across_rebuilds(pool) -> None:
126
+ client, _store, calls = pool
127
+ media_host = client._media_host_client()
128
+ client.set_provider_endpoint_profile_resolver(_resolver("first-key"))
129
+ handler = make_llm_call_handler(llm=client, artifact_store=_store)
130
+
131
+ assert handler(_run(), _image_effect(), None).status == "completed"
132
+ assert calls[-1] == ("gpt-image-2", "http://127.0.0.1:18921/v1", "first-key")
133
+ assert client._media_host_client() is media_host
134
+
135
+ # A profile refresh rotates the resolver on the host that already exists.
136
+ client.set_provider_endpoint_profile_resolver(_resolver("rotated-key"))
137
+ assert handler(_run(), _image_effect(), None).status == "completed"
138
+ assert calls[-1][2] == "rotated-key"
139
+
140
+ # Changing the capability routes rebuilds the media host; it is wired like any pooled client.
141
+ assert client.set_capability_defaults({"output.image": {"provider": "endpoint:relay", "model": "gpt-image-2"}})
142
+ assert client._media_host_client() is not media_host
143
+ assert handler(_run(), _image_effect(), None).status == "completed"
144
+ assert calls[-1][2] == "rotated-key"
145
+
146
+
147
+ def test_pool_wide_settings_reach_every_owned_client(pool) -> None:
148
+ client, _store, _calls = pool
149
+ media_host = client._media_host_client()
150
+ assert media_host in client._owned_clients()
151
+
152
+ on_token = lambda delta, meta: None # noqa: E731
153
+ client.set_on_token(on_token)
154
+ assert media_host._on_token is on_token
155
+
156
+ resolver = _resolver("key")
157
+ client.set_provider_endpoint_profile_resolver(resolver)
158
+ assert media_host.resolve_provider_endpoint_profile is resolver
159
+ assert media_host._llm.resolve_provider_endpoint_profile is resolver
@@ -0,0 +1,153 @@
1
+ """An output spec that names an `endpoint:<id>` provider keeps it.
2
+
3
+ The LLM_CALL handler resolves the call's OWN text provider (`_provider`) into
4
+ Core routing params. It used to fall back to the first output spec's provider
5
+ and rewrite that spec to the bare provider family, moving the endpoint's URL
6
+ and key into text-client kwargs the media path never reads: an image
7
+ generation routed to a gateway endpoint profile (the web console's sandbox,
8
+ the image route set to an OpenAI-compatible relay serving `gpt-image-2`)
9
+ reached AbstractVision as a keyless `openai-compatible` request with no base
10
+ URL and failed with "Missing vision_base_url / OPENAI_BASE_URL" -- in the
11
+ one-shot media subprocess, since the spec no longer said `endpoint:`.
12
+ Regression for the operator report of 2026-10-18.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Dict, List, Optional
18
+
19
+ from abstractruntime.core.models import Effect, EffectType, RunState
20
+ from abstractruntime.integrations.abstractcore.effect_handlers import make_llm_call_handler
21
+ from abstractruntime.storage.artifacts import InMemoryArtifactStore
22
+
23
+ _PROFILE = {
24
+ "id": "airelays",
25
+ "virtual_provider": "endpoint:airelays",
26
+ "display_name": "airelays",
27
+ "provider": "openai-compatible",
28
+ "base_url": "http://127.0.0.1:18921/v1",
29
+ "api_key": "relay-secret-key",
30
+ "scope": "gateway",
31
+ }
32
+
33
+
34
+ class _ProfileResolvingLLM:
35
+ def __init__(self) -> None:
36
+ self.calls: list[dict[str, Any]] = []
37
+ self.resolved: list[str] = []
38
+
39
+ def resolve_provider_endpoint_profile(self, provider_id: str) -> dict[str, Any] | None:
40
+ self.resolved.append(provider_id)
41
+ return dict(_PROFILE) if provider_id == "endpoint:airelays" else None
42
+
43
+ def generate(
44
+ self,
45
+ *,
46
+ prompt: str,
47
+ messages: Optional[List[Dict[str, str]]] = None,
48
+ system_prompt: Optional[str] = None,
49
+ tools: Optional[List[Dict[str, Any]]] = None,
50
+ media: Optional[List[Any]] = None,
51
+ params: Optional[Dict[str, Any]] = None,
52
+ ) -> Dict[str, Any]:
53
+ self.calls.append({"prompt": prompt, "media": media, "params": dict(params or {})})
54
+ return {"content": "", "metadata": {}}
55
+
56
+
57
+ def _image_effect(*, provider: Optional[str] = None) -> Effect:
58
+ payload: Dict[str, Any] = {
59
+ "prompt": "a red circle",
60
+ "output": {
61
+ "modality": "image",
62
+ "task": "image_generation",
63
+ "format": "png",
64
+ "provider": "endpoint:airelays",
65
+ "model": "gpt-image-2",
66
+ },
67
+ }
68
+ if provider:
69
+ payload["provider"] = provider
70
+ return Effect(type=EffectType.LLM_CALL, payload=payload, result_key="llm")
71
+
72
+
73
+ def _run() -> RunState:
74
+ run = RunState.new(workflow_id="wf", entry_node="node-1", vars={})
75
+ run.current_node = "node-1"
76
+ return run
77
+
78
+
79
+ def test_media_spec_endpoint_provider_reaches_the_client_untouched() -> None:
80
+ llm = _ProfileResolvingLLM()
81
+ handler = make_llm_call_handler(llm=llm, artifact_store=InMemoryArtifactStore())
82
+
83
+ outcome = handler(_run(), _image_effect(), None)
84
+
85
+ assert outcome.status == "completed"
86
+ params = llm.calls[-1]["params"]
87
+ assert params["output"]["provider"] == "endpoint:airelays"
88
+ assert params["output"]["model"] == "gpt-image-2"
89
+ # The endpoint is the SPEC's, not the call's text route: no text routing
90
+ # params are minted from it, and nothing is resolved on its behalf.
91
+ assert "_provider" not in params
92
+ assert "base_url" not in params
93
+ assert "provider_api_key" not in params
94
+ assert "_provider_endpoint_profile" not in params
95
+ assert llm.resolved == []
96
+
97
+
98
+ def test_text_endpoint_provider_is_resolved_while_the_media_spec_keeps_its_own() -> None:
99
+ llm = _ProfileResolvingLLM()
100
+ handler = make_llm_call_handler(llm=llm, artifact_store=InMemoryArtifactStore())
101
+
102
+ outcome = handler(_run(), _image_effect(provider="endpoint:airelays"), None)
103
+
104
+ assert outcome.status == "completed"
105
+ params = llm.calls[-1]["params"]
106
+ assert params["_provider"] == "openai-compatible"
107
+ assert params["base_url"] == "http://127.0.0.1:18921/v1"
108
+ assert params["provider_api_key"] == "relay-secret-key"
109
+ assert params["_provider_endpoint_profile"]["virtual_provider"] == "endpoint:airelays"
110
+ assert params["output"]["provider"] == "endpoint:airelays"
111
+ assert llm.resolved == ["endpoint:airelays"]
112
+
113
+
114
+ def test_media_host_client_carries_the_endpoint_profile_resolver(monkeypatch) -> None:
115
+ """The pooled client's media host serves every media-only call; the media
116
+ plugins resolve `endpoint:<id>` through the resolver on THAT client."""
117
+ from abstractruntime.integrations.abstractcore import llm_client as llm_client_mod
118
+
119
+ created: list[Any] = []
120
+
121
+ class FakeUnderlyingLLM:
122
+ pass
123
+
124
+ class FakeLocalClient:
125
+ def __init__(self, *, provider, model, llm_kwargs=None, **kwargs):
126
+ _ = provider, model, llm_kwargs, kwargs
127
+ self._llm = FakeUnderlyingLLM()
128
+ created.append(self)
129
+
130
+ def generate(self, *, prompt, messages=None, system_prompt=None, tools=None, media=None, params=None):
131
+ _ = prompt, messages, system_prompt, tools, media, params
132
+ return {"content": "ok"}
133
+
134
+ def get_model_capabilities(self, model_name=None):
135
+ _ = model_name
136
+ return {"max_tokens": 8192}
137
+
138
+ monkeypatch.setattr(llm_client_mod, "LocalAbstractCoreLLMClient", FakeLocalClient)
139
+ resolver = lambda provider_id: {"provider": "openai-compatible", "id": provider_id} # noqa: E731
140
+
141
+ # Resolver set BEFORE the media host is built (the gateway's boot order).
142
+ client = llm_client_mod.MultiLocalAbstractCoreLLMClient(provider="lmstudio", model="local-model")
143
+ client.set_provider_endpoint_profile_resolver(resolver)
144
+ media_host = client._media_host_client()
145
+ assert getattr(media_host, "resolve_provider_endpoint_profile") is resolver
146
+ assert getattr(media_host._llm, "resolve_provider_endpoint_profile") is resolver
147
+
148
+ # Resolver (re)set AFTER the media host exists (a profile refresh).
149
+ later = lambda provider_id: {"provider": "openai", "id": provider_id} # noqa: E731
150
+ client.set_provider_endpoint_profile_resolver(later)
151
+ assert client._media_host_client() is media_host
152
+ assert getattr(media_host, "resolve_provider_endpoint_profile") is later
153
+ assert getattr(media_host._llm, "resolve_provider_endpoint_profile") is later
@@ -1,8 +0,0 @@
1
- ### Fixed
2
-
3
- - Image and video specs whose provider is an endpoint profile (`endpoint:<id>`) run in process instead of in
4
- the one-shot local media subprocess. The subprocess isolates local pipelines and has no host
5
- endpoint-profile resolver, so a gateway profile (for example an OpenAI-compatible relay serving
6
- `gpt-image-2` selected on the gateway's image route) could not be resolved there; in process,
7
- AbstractVision resolves it through the resolver the host attached to the client. Tests:
8
- `tests/test_endpoint_profile_media_in_process.py`.