AbstractRuntime 0.12.0__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (762) hide show
  1. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CHANGELOG.md +28 -0
  2. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/PKG-INFO +1 -1
  3. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/api.md +2 -1
  4. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/README.md +3 -1
  5. abstractruntime-0.13.0/docs/backlog/completed/0851_per_account_voice_stores.md +51 -0
  6. abstractruntime-0.13.0/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +44 -0
  7. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/integrations/abstractcore.md +58 -0
  8. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/llms-full.txt +60 -1
  9. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/llms.txt +1 -1
  10. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/pyproject.toml +1 -1
  11. abstractruntime-0.13.0/release-notes.md +25 -0
  12. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/__init__.py +9 -0
  13. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +6 -2
  14. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +24 -1
  15. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +26 -0
  16. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +73 -1
  17. abstractruntime-0.13.0/src/abstractruntime/integrations/abstractcore/voice_facade.py +154 -0
  18. abstractruntime-0.13.0/src/abstractruntime/integrations/abstractcore/voice_library.py +361 -0
  19. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_discovery_facade.py +1 -1
  20. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_retry_classification.py +39 -0
  21. abstractruntime-0.13.0/tests/test_voice_library_facade.py +437 -0
  22. abstractruntime-0.12.0/release-notes.md +0 -52
  23. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.github/workflows/ci.yml +0 -0
  24. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.github/workflows/release.yml +0 -0
  25. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.gitignore +0 -0
  26. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/ACKNOWLEDGMENTS.md +0 -0
  27. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CODE_OF_CONDUCT.md +0 -0
  28. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CONTRIBUTING.md +0 -0
  29. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/LICENSE +0 -0
  30. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/README.md +0 -0
  31. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/ROADMAP.md +0 -0
  32. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/SECURITY.md +0 -0
  33. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/README.md +0 -0
  34. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  35. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  36. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  37. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  38. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  39. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  40. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  41. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/README.md +0 -0
  42. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/architecture.md +0 -0
  43. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/artifacts.md +0 -0
  44. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/automations.md +0 -0
  45. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  46. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  47. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  48. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  49. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  50. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  51. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  52. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  53. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
  54. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  55. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  56. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  57. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  58. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  59. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  60. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  61. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  62. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/009_artifact_store.md +0 -0
  63. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  64. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  65. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  66. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  67. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  68. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  69. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  70. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  71. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  72. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  73. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  74. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  75. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  76. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  77. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  78. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  79. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  80. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  81. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  82. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  83. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  84. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  85. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  86. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  87. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  88. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/004_tests.md +0 -0
  89. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  90. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  91. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  92. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  93. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/README.md +0 -0
  94. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  95. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  96. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  97. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  98. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  99. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  100. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  101. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  102. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  103. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  104. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  105. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  106. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  107. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  108. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  109. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
  110. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  111. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  112. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  113. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  114. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  115. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  116. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  117. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  118. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  119. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  120. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  121. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  122. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  123. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  124. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  125. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  126. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  127. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  128. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  129. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  130. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  131. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  132. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  133. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  134. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  135. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  136. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  137. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  138. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  139. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  140. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  141. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/email.md +0 -0
  142. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/entity-runtime.md +0 -0
  143. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/evidence.md +0 -0
  144. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/faq.md +0 -0
  145. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/getting-started.md +0 -0
  146. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/limits.md +0 -0
  147. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/manual_testing.md +0 -0
  148. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/mcp-worker.md +0 -0
  149. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/proposal.md +0 -0
  150. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/provenance.md +0 -0
  151. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/snapshots.md +0 -0
  152. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/tool-approval.md +0 -0
  153. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/tools-comms.md +0 -0
  154. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/troubleshooting.md +0 -0
  155. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/workflow-bundles.md +0 -0
  156. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/01_hello_world.py +0 -0
  157. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/02_ask_user.py +0 -0
  158. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/03_wait_until.py +0 -0
  159. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/04_multi_step.py +0 -0
  160. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/05_persistence.py +0 -0
  161. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/06_llm_integration.py +0 -0
  162. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/07_react_agent.py +0 -0
  163. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/README.md +0 -0
  164. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/mkdocs.yml +0 -0
  165. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/pytest.ini +0 -0
  166. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/scripts/backfill_diary_edges.py +0 -0
  167. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/scripts/generate_llms_full.py +0 -0
  168. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/__init__.py +0 -0
  169. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automation_queries.py +0 -0
  170. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/__init__.py +0 -0
  171. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/adapters.py +0 -0
  172. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/attention.py +0 -0
  173. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundle.py +0 -0
  174. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  175. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  176. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/commands.py +0 -0
  177. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/consumers.py +0 -0
  178. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/controller.py +0 -0
  179. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/ledger.py +0 -0
  180. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/models.py +0 -0
  181. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/samples.py +0 -0
  182. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/service.py +0 -0
  183. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/wakes.py +0 -0
  184. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/conversation_search.py +0 -0
  185. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/__init__.py +0 -0
  186. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/config.py +0 -0
  187. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
  188. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/event_keys.py +0 -0
  189. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/health.py +0 -0
  190. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/live_deltas.py +0 -0
  191. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/models.py +0 -0
  192. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/policy.py +0 -0
  193. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/progress_channel.py +0 -0
  194. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/publish.py +0 -0
  195. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_attribution.py +0 -0
  196. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_identity.py +0 -0
  197. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
  198. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_origin.py +0 -0
  199. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/runtime.py +0 -0
  200. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/spec.py +0 -0
  201. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/tool_scope.py +0 -0
  202. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/vars.py +0 -0
  203. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/__init__.py +0 -0
  204. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/charts.py +0 -0
  205. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/docx.py +0 -0
  206. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/pdf.py +0 -0
  207. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/__init__.py +0 -0
  208. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/actions.py +0 -0
  209. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/automations.py +0 -0
  210. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/binding.py +0 -0
  211. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/feeder.py +0 -0
  212. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/frame.py +0 -0
  213. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/inbox.py +0 -0
  214. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/evidence/__init__.py +0 -0
  215. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/evidence/recorder.py +0 -0
  216. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/history_bundle.py +0 -0
  217. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/__init__.py +0 -0
  218. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/act_only.py +0 -0
  219. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/chat.py +0 -0
  220. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/communities.py +0 -0
  221. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/diary.py +0 -0
  222. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/digest.py +0 -0
  223. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
  224. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/fingerprint.py +0 -0
  225. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/lease.py +0 -0
  226. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/life.py +0 -0
  227. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/memory_reader.py +0 -0
  228. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/night_voice.py +0 -0
  229. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/phase_graph.py +0 -0
  230. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/phase_spec.py +0 -0
  231. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/prelude.py +0 -0
  232. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  233. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/reflection.py +0 -0
  234. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  235. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/substrate.py +0 -0
  236. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tool_effects.py +0 -0
  237. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tool_policy.py +0 -0
  238. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tools.py +0 -0
  239. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
  240. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/__init__.py +0 -0
  241. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  242. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  243. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  244. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  245. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  246. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  247. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  248. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  249. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  250. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  251. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  252. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  253. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  254. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  255. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  256. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  257. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  258. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  259. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  260. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  261. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  262. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  263. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  264. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  265. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  266. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  267. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  268. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  269. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  270. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  271. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  272. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  273. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  274. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/mail_verbs.py +0 -0
  275. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/__init__.py +0 -0
  276. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/active_context.py +0 -0
  277. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/active_memory.py +0 -0
  278. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/compaction.py +0 -0
  279. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/kg_packets.py +0 -0
  280. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/memact_composer.py +0 -0
  281. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/recall_levels.py +0 -0
  282. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/token_budget.py +0 -0
  283. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/__init__.py +0 -0
  284. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  285. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
  286. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/__init__.py +0 -0
  287. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/convenience.py +0 -0
  288. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
  289. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/registry.py +0 -0
  290. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
  291. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/session_history.py +0 -0
  292. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/session_turns.py +0 -0
  293. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/__init__.py +0 -0
  294. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/artifacts.py +0 -0
  295. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/base.py +0 -0
  296. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/change_ring.py +0 -0
  297. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/commands.py +0 -0
  298. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/in_memory.py +0 -0
  299. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/json_files.py +0 -0
  300. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/lease.py +0 -0
  301. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
  302. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
  303. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/observable.py +0 -0
  304. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/offloading.py +0 -0
  305. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/serialize.py +0 -0
  306. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/snapshots.py +0 -0
  307. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/sqlite.py +0 -0
  308. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  309. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/__init__.py +0 -0
  310. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
  311. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/connection_events.py +0 -0
  312. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/connections.py +0 -0
  313. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/email_received.py +0 -0
  314. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/event_frame.py +0 -0
  315. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/feed.py +0 -0
  316. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/manual.py +0 -0
  317. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/protocol.py +0 -0
  318. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/registry.py +0 -0
  319. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/schedule.py +0 -0
  320. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/webhook.py +0 -0
  321. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/turn_grounding.py +0 -0
  322. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/__init__.py +0 -0
  323. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/atomic_files.py +0 -0
  324. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/file_filters.py +0 -0
  325. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
  326. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  327. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  328. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  329. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  330. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  331. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  332. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  333. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  334. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  335. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  336. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  337. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  338. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  339. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  340. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  341. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  342. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  343. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  344. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  345. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  346. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  347. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  348. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  349. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  350. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  351. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  352. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  353. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
  354. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  355. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  356. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  357. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/README.md +0 -0
  358. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/automation_harness.py +0 -0
  359. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/conftest.py +0 -0
  360. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/email_wp2_support.py +0 -0
  361. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/atom.xml +0 -0
  362. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  363. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  364. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss1.xml +0 -0
  365. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss2.xml +0 -0
  366. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
  367. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/conftest.py +0 -0
  368. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/live_email_support.py +0 -0
  369. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/test_email_live_runtime.py +0 -0
  370. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/media_endpoint_profile_probe.py +0 -0
  371. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_comms_facade.py +0 -0
  372. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_host_facade.py +0 -0
  373. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_run_facade.py +0 -0
  374. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_server_facade.py +0 -0
  375. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_structured_facade.py +0 -0
  376. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_telegram_facade.py +0 -0
  377. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_consumers_index.py +0 -0
  378. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_context_policy.py +0 -0
  379. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_index.py +0 -0
  380. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_memory.py +0 -0
  381. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_agora_agent_alias_identity.py +0 -0
  382. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_agora_tools_http.py +0 -0
  383. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  384. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_answer_user_effect.py +0 -0
  385. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_artifact_session_candidates.py +0 -0
  386. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_artifacts.py +0 -0
  387. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_calendar_schedule.py +0 -0
  388. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_commands.py +0 -0
  389. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_controller.py +0 -0
  390. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_controller_recovery.py +0 -0
  391. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_definition.py +0 -0
  392. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_discussion_isolation.py +0 -0
  393. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_email_results.py +0 -0
  394. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_growing_context.py +0 -0
  395. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_index.py +0 -0
  396. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_list_reads.py +0 -0
  397. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_named_policy_compiler.py +0 -0
  398. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_next_fire.py +0 -0
  399. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
  400. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_occurrence_recovery.py +0 -0
  401. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_replay_read_only.py +0 -0
  402. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_retry.py +0 -0
  403. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_session_turns.py +0 -0
  404. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_status.py +0 -0
  405. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_tool_approval.py +0 -0
  406. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_browser_probe_target_walling.py +0 -0
  407. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  408. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_capability_default_reasoning.py +0 -0
  409. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_chat_summarizer_integration.py +0 -0
  410. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_code_node_imports.py +0 -0
  411. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_code_node_restricted_python.py +0 -0
  412. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_command_sandbox_host_facade.py +0 -0
  413. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_command_store.py +0 -0
  414. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_compaction_helpers.py +0 -0
  415. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_compaction_summarizer_route.py +0 -0
  416. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_config_facade_models_engines.py +0 -0
  417. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_config_facade_voice_input_hint.py +0 -0
  418. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_control_adapter_while.py +0 -0
  419. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_controller_bundle_packaged.py +0 -0
  420. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_conversation_search.py +0 -0
  421. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_crash_ordering_inversions.py +0 -0
  422. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_create_if_absent.py +0 -0
  423. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_data_registry_facade.py +0 -0
  424. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_model_warmup_switch.py +0 -0
  425. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_camera_gating.py +0 -0
  426. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_comms_gating.py +0 -0
  427. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_files.py +0 -0
  428. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_folders.py +0 -0
  429. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_web.py +0 -0
  430. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_search_files_executor.py +0 -0
  431. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_diary_capture.py +0 -0
  432. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_diary_write_rescue.py +0 -0
  433. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_directory_lease.py +0 -0
  434. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_disabled_toolsets_seam.py +0 -0
  435. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  436. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  437. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
  438. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discussion_session_anchor.py +0 -0
  439. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_document_markdown_tables.py +0 -0
  440. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_document_renderers_hr_quote.py +0 -0
  441. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_durable_toolsets.py +0 -0
  442. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_durable_write_discipline.py +0 -0
  443. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  444. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_cancellation.py +0 -0
  445. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_issuance_idempotency.py +0 -0
  446. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  447. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_election_consequence_teaching.py +0 -0
  448. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_binding_and_refiner.py +0 -0
  449. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_feeder_batched.py +0 -0
  450. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_feeder_flags.py +0 -0
  451. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_gate_fixes.py +0 -0
  452. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_inbox_and_trigger.py +0 -0
  453. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_received_mailbox_id.py +0 -0
  454. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_regate_fixes.py +0 -0
  455. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_review_fixes.py +0 -0
  456. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_self_trigger_loop.py +0 -0
  457. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_stream_consumers.py +0 -0
  458. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_toolset_and_walls.py +0 -0
  459. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emergence_experiment.py +0 -0
  460. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emit_event_uses_wait_index.py +0 -0
  461. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
  462. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  463. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
  464. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  465. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_route_context.py +0 -0
  466. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_awake_memory_fixes.py +0 -0
  467. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_brain_effects.py +0 -0
  468. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_chat_driver.py +0 -0
  469. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_chat_tools_reflection.py +0 -0
  470. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_diary.py +0 -0
  471. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_execute_tool.py +0 -0
  472. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_fetch_url_tool.py +0 -0
  473. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_history_window.py +0 -0
  474. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_life_loop.py +0 -0
  475. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_memory_richness.py +0 -0
  476. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_phase_graph_conformance.py +0 -0
  477. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_react_visit_window.py +0 -0
  478. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_recent_memories.py +0 -0
  479. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_runtime.py +0 -0
  480. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_search_memory.py +0 -0
  481. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  482. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_substrate_resolution.py +0 -0
  483. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_visit_honesty.py +0 -0
  484. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_workspace_cap.py +0 -0
  485. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_workspace_tools.py +0 -0
  486. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_event_index_cross_process.py +0 -0
  487. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_event_wait_index.py +0 -0
  488. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  489. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_evidence_recorder.py +0 -0
  490. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  491. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_execute_command_output_offload.py +0 -0
  492. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_execution_capability_discovery.py +0 -0
  493. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_explicit_eject_other_clients.py +0 -0
  494. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_factory_default_retry_policy.py +0 -0
  495. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  496. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_format_repair_nudge.py +0 -0
  497. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_fresh_install_no_provider.py +0 -0
  498. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_gateway_facades_c4899.py +0 -0
  499. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_git_read_only_refiner.py +0 -0
  500. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_hf_process_residency_merge.py +0 -0
  501. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_history_window_multimodal.py +0 -0
  502. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_hot_path_store_reads.py +0 -0
  503. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_indexed_idempotency_lookup.py +0 -0
  504. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_integration_abstractcore.py +0 -0
  505. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_integrations_abstractcore.py +0 -0
  506. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_file_run_store_children_index.py +0 -0
  507. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_run_cache_bound.py +0 -0
  508. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_store_scan_memo.py +0 -0
  509. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_jsonl_ledger_recovery.py +0 -0
  510. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
  511. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_chain.py +0 -0
  512. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_record_slimming.py +0 -0
  513. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_subscription.py +0 -0
  514. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_live_token_deltas.py +0 -0
  515. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
  516. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  517. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  518. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  519. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_requires_prompt.py +0 -0
  520. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
  521. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
  522. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_text_phase_progress.py +0 -0
  523. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  524. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  525. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  526. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_grounding_tail.py +0 -0
  527. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_media_artifacts.py +0 -0
  528. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_system_context.py +0 -0
  529. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
  530. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_streaming_on_token.py +0 -0
  531. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_helper_tool_exposure.py +0 -0
  532. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_residency_host_sweep.py +0 -0
  533. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  534. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mail_verbs.py +0 -0
  535. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mailbox_index.py +0 -0
  536. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_max_iterations_ceiling.py +0 -0
  537. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_remote_tool_executor.py +0 -0
  538. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  539. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_logging.py +0 -0
  540. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_security.py +0 -0
  541. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_stdio.py +0 -0
  542. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_artifact_resolution.py +0 -0
  543. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_capability_default_routing.py +0 -0
  544. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_host_endpoint_resolver.py +0 -0
  545. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
  546. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_subprocess.py +0 -0
  547. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memact_composer_from_kg_result.py +0 -0
  548. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_appraise_handler.py +0 -0
  549. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_communities.py +0 -0
  550. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  551. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_packets.py +0 -0
  552. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  553. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  554. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  555. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  556. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_note_effect.py +0 -0
  557. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_query_effect.py +0 -0
  558. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_query_rich_filters.py +0 -0
  559. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  560. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_seam_handlers.py +0 -0
  561. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
  562. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_tag_effect.py +0 -0
  563. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mlx_generation_serialization.py +0 -0
  564. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mlx_process_residency_merge.py +0 -0
  565. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_eject_cancel.py +0 -0
  566. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_clean_switch.py +0 -0
  567. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_control_plane.py +0 -0
  568. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  569. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_multi_store_scheduler.py +0 -0
  570. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
  571. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_mlx_application_wiring.py +0 -0
  572. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
  573. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_tool_channel.py +0 -0
  574. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_night_voice.py +0 -0
  575. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
  576. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_occurrence_named_inputs.py +0 -0
  577. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_occurrence_samples.py +0 -0
  578. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offload_answer_chain_c4978.py +0 -0
  579. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  580. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offloading.py +0 -0
  581. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_packaging_extras.py +0 -0
  582. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
  583. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pause_resume.py +0 -0
  584. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pdf_unicode_rendering.py +0 -0
  585. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_personal_cycle.py +0 -0
  586. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phantom_attachment_index.py +0 -0
  587. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_graph_artifact_control.py +0 -0
  588. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_graph_obedience.py +0 -0
  589. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_vocabulary_migration.py +0 -0
  590. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  591. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_export_import.py +0 -0
  592. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  593. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_modules.py +0 -0
  594. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  595. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  596. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_overlay.py +0 -0
  597. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  598. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_provider_pin_routing_isolation.py +0 -0
  599. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_publish_event.py +0 -0
  600. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_queryable_run_store.py +0 -0
  601. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_r12_workspace_sandbox.py +0 -0
  602. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  603. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_read_idle_threading.py +0 -0
  604. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_readoption_experiment.py +0 -0
  605. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_real_integration.py +0 -0
  606. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_realize_election.py +0 -0
  607. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_recall_levels_policy.py +0 -0
  608. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_client_cancel.py +0 -0
  609. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_llm_client.py +0 -0
  610. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_speculation_defaults.py +0 -0
  611. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_rendering_agent_trace_report.py +0 -0
  612. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_rendering_json_stringify.py +0 -0
  613. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_report_branding.py +0 -0
  614. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_resident_media_generation.py +0 -0
  615. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_resume_concurrent_same_wait.py +0 -0
  616. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_retry_idempotency.py +0 -0
  617. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_history_bundle.py +0 -0
  618. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_index_workspace_root.py +0 -0
  619. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_mutation_lock.py +0 -0
  620. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_origin.py +0 -0
  621. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_scoped_tool_policy.py +0 -0
  622. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_store_change_token.py +0 -0
  623. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_tool_scope_ceiling.py +0 -0
  624. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_browser_session_boundary.py +0 -0
  625. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  626. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  627. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
  628. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  629. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_install_boundary.py +0 -0
  630. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  631. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_node_traces.py +0 -0
  632. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  633. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_tick_step_gate.py +0 -0
  634. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_run.py +0 -0
  635. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_v1_corpus.py +0 -0
  636. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_v2_calendar.py +0 -0
  637. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_scheduler.py +0 -0
  638. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_send_email_refiner.py +0 -0
  639. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_send_email_self_default_policy.py +0 -0
  640. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  641. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_history.py +0 -0
  642. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_prompt_cache_attribution.py +0 -0
  643. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_prompt_cache_visibility.py +0 -0
  644. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_route_stamp.py +0 -0
  645. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_start_cost.py +0 -0
  646. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_shell_tool_exposure.py +0 -0
  647. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_snapshots.py +0 -0
  648. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_speculation_inheritance.py +0 -0
  649. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
  650. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_sqlite_ledger_store.py +0 -0
  651. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_async_wait.py +0 -0
  652. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  653. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  654. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_steer_sidecar.py +0 -0
  655. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_storage_deletion.py +0 -0
  656. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_streamed_voice_namespace.py +0 -0
  657. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_structured_output_schema_enum.py +0 -0
  658. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_subworkflow.py +0 -0
  659. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_terminal_effect_completion.py +0 -0
  660. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  661. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_thinking_inheritance.py +0 -0
  662. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  663. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_executor.py +0 -0
  664. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_resume_executes.py +0 -0
  665. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
  666. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
  667. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_catalog.py +0 -0
  668. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_descriptor_registry.py +0 -0
  669. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
  670. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_error_output_detection.py +0 -0
  671. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_filename_alias.py +0 -0
  672. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  673. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
  674. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_timeout.py +0 -0
  675. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_inventory_facade.py +0 -0
  676. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_invoke_effect.py +0 -0
  677. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_policy_and_mounts.py +0 -0
  678. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
  679. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_topic_election_world_model.py +0 -0
  680. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trace_context_propagation.py +0 -0
  681. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_cloudevents.py +0 -0
  682. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_connection_listening.py +0 -0
  683. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_connections.py +0 -0
  684. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_feed.py +0 -0
  685. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_registry.py +0 -0
  686. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_schedule_math.py +0 -0
  687. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_webhook.py +0 -0
  688. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trusted_run_index.py +0 -0
  689. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_turn_grounding_byte_stability.py +0 -0
  690. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
  691. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_vars_query_effect.py +0 -0
  692. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_ab_fixture.py +0 -0
  693. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_midturn_elections.py +0 -0
  694. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_midturn_resume.py +0 -0
  695. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_workflow.py +0 -0
  696. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  697. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  698. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  699. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  700. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  701. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  702. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_entity_memory_nodes.py +0 -0
  703. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  704. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_llm_call_partial_override.py +0 -0
  705. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  706. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
  707. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  708. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
  709. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memact_compose_node.py +0 -0
  710. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  711. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  712. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  713. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_reroute_lowering.py +0 -0
  714. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_set_vars_pins.py +0 -0
  715. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  716. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  717. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_add_message_builtin.py +0 -0
  718. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  719. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_agora_react_agent.py +0 -0
  720. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_call_tool_node.py +0 -0
  721. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  722. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_compiler_basic.py +0 -0
  723. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  724. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_continue_on_error.py +0 -0
  725. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  726. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  727. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  728. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_function_library.py +0 -0
  729. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_element_node.py +0 -0
  730. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_random_element_node.py +0 -0
  731. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_var_node.py +0 -0
  732. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
  733. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  734. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  735. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_make_object_node.py +0 -0
  736. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_media_nodes.py +0 -0
  737. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  738. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_memory_source_pins.py +0 -0
  739. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_pin_expressions.py +0 -0
  740. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_prompt_only.py +0 -0
  741. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_random_nodes.py +0 -0
  742. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
  743. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_string_contains_replace.py +0 -0
  744. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
  745. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_voice_openai_api_key_path.py +0 -0
  746. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  747. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_w4_feelings_lens.py +0 -0
  748. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_event_deadline.py +0 -0
  749. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_event_prompt_metadata.py +0 -0
  750. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_until_streak.py +0 -0
  751. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_until_utc_normalization.py +0 -0
  752. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workflow_bundle_registry.py +0 -0
  753. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_builtin_deny.py +0 -0
  754. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  755. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  756. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  757. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  758. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  759. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_prompt_context.py +0 -0
  760. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_read_only.py +0 -0
  761. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_writable_paths.py +0 -0
  762. {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_write_chart.py +0 -0
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.13.0] - 2026-10-27
11
+
12
+ Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
13
+
14
+ ### Added
15
+
16
+ - The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
17
+ stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
18
+ `clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
19
+ server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
20
+ - **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
21
+ it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
22
+ stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
23
+ [Voice library](docs/integrations/abstractcore.md#voice-library).
24
+
25
+ - **Voice library facade**: `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`, `VoiceLibraryError`) lists the languages each voice engine accepts, lists cloned voices (designed and built-in ones included, optionally by language), reads, renames, replaces the reference transcript of and deletes a cloned voice, creates a voice from a recording (`clone_voice`) or from a written description (`design_voice`), and returns the capability catalog (which engine and model supports `speed`, `one_shot`, design... and how). Local runtimes run it in process; remote runtimes call the AbstractCore server's `/v1` voice routes. Refusals carry an HTTP-like `status_code`. See [Voice library](docs/integrations/abstractcore.md#voice-library).
26
+ - **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
27
+ - **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
28
+
29
+ ### Changed
30
+
31
+ - A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
32
+ `one_shot` over an engine's length limit or an unknown voice id) and a missing capability
33
+ (`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
34
+ message. Other media lanes keep their retries.
35
+ - A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
36
+ the HTTP error's response.
37
+
10
38
  ## [0.12.0] - 2026-10-27
11
39
 
12
40
  Requires AbstractCore 2.30.0 or newer (`EmailClient` mailbox verbs; Gmail labels on message summaries) and AbstractMemory 0.3.2 or newer.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -338,12 +338,13 @@ Entry points:
338
338
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
339
339
  - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
340
340
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
341
+ - public voice library facade: `AbstractCoreVoiceFacade`, `get_abstractcore_voice_facade(...)`, `VoiceLibraryError` (`src/abstractruntime/integrations/abstractcore/voice_facade.py`): languages, cloned voices (list by language, read, rename or replace the transcript, delete), cloning from a recording, voice design, the capability catalog; local in process, remote over the AbstractCore server's `/v1` voice routes (see [Voice library](integrations/abstractcore.md#voice-library))
341
342
  - email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
342
343
  - public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
343
344
  - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
344
345
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
345
346
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
346
- - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
347
+ - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog` (with `language=`), `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
347
348
  - the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
348
349
  - host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
349
350
  - `integrations.abstractcore.llm_client.set_default_model_warmup(enabled)` (process-wide, no environment variable): whether a new `MultiLocalAbstractCoreLLMClient` builds (for a local model: loads) its default model at construction and on a default switch. Default on. A process that serves no model turns it off once at boot (the gateway's `serve --no-runner`); the default client is then built at its first call. `default_model_warmup()` reads the setting (see `integrations/abstractcore.md#unloading-and-switching-models`)
@@ -14,7 +14,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
14
14
 
15
15
  - Planned: 29
16
16
  - Proposed: 14
17
- - Completed: 35
17
+ - Completed: 37
18
18
  - Deprecated: 13
19
19
  - Recurrent: 0
20
20
 
@@ -93,6 +93,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
93
93
 
94
94
  | ID | Item |
95
95
  |----|------|
96
+ | 0851 | [Per-account voice stores](completed/0851_per_account_voice_stores.md): completed 2026-10-27 (0.13.0); the runtime's voice catalog and voice library use its `voice_store_dir` / `voice_library_dirs`; real-weights E2E 9/9. |
97
+ | 0852 | [Capability refusals are not retried](completed/0852_capability_refusals_are_not_retried.md): completed 2026-10-27 (0.13.0); one engine call for a refused request. |
96
98
  | 0847 | [Automations v1: controller, contracts, occurrences, triggers](completed/0847_automations_v1_controller_contracts_occurrences_triggers.md): completed 2026-09-27, moved from planned; UNRELEASED; `79d9bf6`…`d02578a`, 2957 passed / 26 skipped; reviews GO after fixes; E2E 9/9. |
97
99
  | 0846 | [Existing MLX instance scheduling and execution controls](completed/0846_mlx_instance_scheduling_and_execution_controls.md): completed 2026-09-20; moved from planned, 237 Runtime tests + 616 Core tests and four real-model integration cases; independent review approved, unreleased. |
98
100
  | 001 | `completed/001_runtime_kernel.md` |
@@ -0,0 +1,51 @@
1
+ # 0851 — Per-account voice stores: the voice settings of each account's runtime, and the scope in the voice facade
2
+
3
+ **Status**: completed (2026-10-27, 0.13.0) · **Priority**: P1 · **Created**: 2026-10-27
4
+ **Cross-package**: AbstractVoice backlog 0065 (personal stores and a shared library), AbstractGateway backlog 0942 (personal voices per account, admin library, an AI's voice in its profile).
5
+
6
+ ## Why
7
+ Operator, 2026-10-27: each person registers the voices they want (clone, design) and they are
8
+ personal, not shared by every account; an administrator can still deploy voices for everyone;
9
+ an AI (assistant, coder, entity) gets its voice as part of its profile. Today AbstractVoice keeps
10
+ one store per machine user, so every account of a gateway shares every cloned voice, and the
11
+ gateway's voice changes are admin-only until this lands.
12
+
13
+ ## Current code reality (2026-10-27)
14
+ - `integrations/abstractcore/voice_facade.py` / `voice_library.py` (0.12.1): the voice library
15
+ facade; local clients build a capability registry from `discovery_queries._runtime_capability_registry`
16
+ (owner config: discovery settings only), remote clients call the AbstractCore server's `/v1` routes.
17
+ - Synthesis uses the LLM client's provider config (`create_local_runtime(llm_kwargs=...)` keys
18
+ become the capability-plugin config, see `voice_openai_api_key`).
19
+ - No setting names a voice store; AbstractVoice reads its machine-user folder.
20
+
21
+ ## Scope
22
+ - In: accept AbstractVoice's `voice_store_dir` and `voice_library_dirs` (0065) in the runtime's
23
+ AbstractCore config so synthesis and the voice facade of one runtime use the same stores; the
24
+ facade passes them to the local registry; records carry `scope: personal|library`; a
25
+ `deploy_to_library` facade call for hosts that allow it; remote mode forwards nothing (a remote
26
+ AbstractCore server keeps its own stores) and says so.
27
+ - Out: who may deploy (the host's policy), the gateway routes (0942).
28
+
29
+ ## Validation
30
+ Two runtimes with two store folders: a voice designed in one is spoken by it and not listed by the
31
+ other; both list and speak a library voice; the library refuses changes from a personal runtime.
32
+
33
+ ## Report (completed 2026-10-27, 0.13.0)
34
+ `discovery_queries._runtime_capability_owner_config` / `_runtime_capability_registry` / `local_get_voice_catalog` take
35
+ `voice_store_dir` and `voice_library_dirs`; `voice_library.voice_store_settings(llm_kwargs)` reads them from the local
36
+ clients' `_llm_kwargs` (the settings their synthesis already hands the voice plugin), so the voice catalog and the voice
37
+ library facade use the runtime's own stores. `deploy_voice_to_library` op and facade method (local; 501 remote). Remote
38
+ mode forwards nothing: the AbstractCore server keeps its stores.
39
+
40
+ Validation: `tests/test_voice_library_facade.py` (settings reach the registry owner config for the library and the
41
+ catalog; absent when unset; deploy 501 remote). Real weights, two local runtimes with personal stores and one library,
42
+ 9/9: design through the facade, listed by its runtime only (library and catalog), the other runtime cannot delete it
43
+ (404), deploy, library voice listed by both and read-only (422).
44
+
45
+ Adversarial review (2026-10-27), fixed before release: the voice library built its own registry from the discovery
46
+ settings (a second voice manager, weights loaded twice, a 5 s remote timeout): it now runs on the client's own
47
+ AbstractCore instance (`llm.capabilities`; a model pool on its media host), the registry synthesis uses. Also: one flat
48
+ record shape for `clone_voice` on both sides, `language` forwarded, remote statuses passed through, `voice_library_dirs`
49
+ as an `os.pathsep` string, empty voice ids refused (422), a created voice whose record cannot be read back is still
50
+ reported created. Real weights rerun with real local clients: 9/9 and 14/14.
51
+
@@ -0,0 +1,44 @@
1
+ # 0852 — A capability's refusal of the request is not retried and reaches the host as a refusal
2
+
3
+ **Status**: completed (2026-10-27, 0.13.0) · **Priority**: P2 · **Created**: 2026-10-27
4
+
5
+ ## Why
6
+ Measured 2026-10-27 through the gateway (`POST /runs/{id}/voice/tts`, Qwen3-TTS, `one_shot: true`
7
+ with 2,399 characters): AbstractVoice refuses at once ("one_shot synthesis takes at most 1000
8
+ characters in a single generation"), the media effect retries it three times, and the host
9
+ answers HTTP 500 "Effect failed after 3 attempts". The refusal is the caller's input, not a
10
+ transient failure: retrying wastes three engine calls and the host cannot answer 422.
11
+
12
+ ## Current code reality
13
+ - The LLM_CALL media path (`llm_client.py` `_run_multimodal_spec` → AbstractCore
14
+ `providers/base.py` → plugin) raises `ValueError` for refused input; the effect's retry policy
15
+ treats every exception alike.
16
+ - The voice library facade already maps `ValueError` to a 422 `VoiceLibraryError`
17
+ (`voice_library.py`), so the two surfaces disagree.
18
+
19
+ ## Scope
20
+ - In: classify refused input (`ValueError`, AbstractCore `CapabilityUnavailableError`) as
21
+ non-retryable in the media effects; record it on the child run with a code (`invalid_request`,
22
+ `capability_unavailable`) the host maps to 422 / 501.
23
+ - Out: engine limits themselves (AbstractVoice).
24
+
25
+ ## Validation
26
+ A one_shot request over the limit makes one engine call and the child run records
27
+ `invalid_request`; a transient error is still retried; mutants: drop the classification and the
28
+ test sees three calls.
29
+
30
+ ## Report (completed 2026-10-27, 0.13.0)
31
+ `effect_handlers._llm_error_is_retryable`: a plain `ValueError`, a `KeyError` and AbstractCore's
32
+ `CapabilityUnavailableError` are non-retryable (one engine call). Subclasses of `ValueError` such as
33
+ `json.JSONDecodeError` keep the retryable default. Not done here: an error code on the child run for the host to map to
34
+ 422/501 (the run failure record carries prose only); AbstractGateway backlog 0942 tracks the 422 answer of
35
+ `/voice/tts`.
36
+
37
+ Validation: `tests/test_llm_retry_classification.py::test_a_capability_refusal_is_not_retried` (refusals non-retryable;
38
+ a JSON decode error and a connection error still retried).
39
+
40
+ Adversarial review (2026-10-27): a plain ValueError is also how other media lanes report failures a retry can fix (a
41
+ failed remote image job, an empty or black image, non-finite music audio), so the rule was narrowed before release:
42
+ plain `ValueError` / `KeyError` are non-retryable only on a `modality: voice` output (`effect_handlers._is_voice_refusal`);
43
+ `CapabilityUnavailableError` stays non-retryable everywhere.
44
+
@@ -1024,6 +1024,64 @@ adapters = facade.list_vision_adapters(
1024
1024
  )
1025
1025
  ```
1026
1026
 
1027
+ ## Voice library
1028
+
1029
+ `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`) manages the voices AbstractCore can speak with:
1030
+
1031
+ - `list_languages(kind=None, provider=None)`: `{"languages": {kind: {provider: {provider, languages, open, declared}}}}`
1032
+ for `tts`, `stt` and `cloning`, read without loading a model;
1033
+ - `list_cloned_voices(provider=None, model=None, language=None)`: `{"voices": [...], "count": n}`, designed and
1034
+ built-in voices included (`tags.designed`, `tags.builtin`); `language` keeps the voices that can speak it, native
1035
+ speakers first;
1036
+ - `get_cloned_voice(voice_id)`, `update_cloned_voice(voice_id, name=None, reference_text=None)` (both fields checked
1037
+ before either is applied) and `delete_cloned_voice(voice_id)`; built-in voices are read-only;
1038
+ - `clone_voice(audio_bytes, filename=None, content_type=None, name=None, reference_text=None, provider=None, model=None)`:
1039
+ a voice from a reference recording (`provider` = the cloning engine, e.g. `qwen3-tts`, `omnivoice`);
1040
+ - `design_voice(description, name=None, language=None, text=None)`: a voice from a written description, stored as a
1041
+ cloned voice (needs `abstractvoice[qwen3-tts]` and `abstractvoice[stt]` where the voice capability runs);
1042
+ - `deploy_voice_to_library(voice_id)`: copies one of the runtime's personal voices into its first library (see below);
1043
+ - `compatibility_catalog()`: per kind, provider, model and surface, the support level of each feature (`native`,
1044
+ `emulated`, `conditional`, `unsupported`), e.g. which engines honour `speed` or `one_shot`.
1045
+
1046
+ Local clients run these in process on the same AbstractCore capability registry their synthesis uses (same voice
1047
+ manager, settings and voice stores; a model pool uses its media host), AbstractCore 2.30.0+ and AbstractVoice 0.18.2+.
1048
+ `clone_voice` answers the stored record, flat, with its `voice_id`, on both sides; `clone_voice(..., language=)` records
1049
+ the recording's language in process (AbstractVoice 0.19.0). A remote AbstractCore 2.30.0 server does not take the
1050
+ language yet (its clone form has no such field), so a remotely cloned voice's language is identified from its transcript. The remote client calls the AbstractCore server's `/v1/audio/languages`, `/v1/voice/clones[/{id}]`
1051
+ (`GET`, `PATCH`, `DELETE`), `/v1/voice/clone` and `/v1/voice/design`, and reads the capability catalog from
1052
+ `/v1/audio/voices`; the server's changes need its operator token in the runtime's headers. Every refusal is a
1053
+ `VoiceLibraryError` with `status_code` (404 unknown voice, 422 refused input, 401 server token missing, 501 capability
1054
+ or engine runtime missing; a remote server's own 400, 403, 409, 413, 429 and 503 pass through; 502 for any other remote
1055
+ failure) and `detail`, so a host maps it to its own answer.
1056
+
1057
+ Cloned voices live in AbstractVoice's store. By default that is one store per machine user, shared by every account a
1058
+ host serves. A runtime can instead have its own personal voice store in front of read-only libraries: put
1059
+ `voice_store_dir` (and optionally `voice_library_dirs`, a list of folders) in its AbstractCore client settings, e.g.
1060
+ `create_local_runtime(llm_kwargs={"voice_store_dir": "/data/alice/voices", "voice_library_dirs": ["/data/voice-library"]})`.
1061
+ Synthesis, the voice catalog and the voice library facade of that runtime then use the same stores: voices cloned or
1062
+ designed go to the personal store, library voices (built-in ones included) are listed and spoken but read-only (422), and
1063
+ `deploy_voice_to_library(voice_id)` copies a personal voice into the first library (local runtimes; 501 remote, where the
1064
+ AbstractCore server keeps its own store). Who may deploy is the host's decision. Needs AbstractVoice 0.19.0; with an older
1065
+ AbstractVoice, these settings are not honoured. Records carry `meta.scope` (`personal` | `library`).
1066
+
1067
+ The voice catalog takes the same language filter: `get_abstractcore_discovery_facade(rt).get_voice_catalog(language="fr")`.
1068
+ A remote run's buffered TTS forwards `one_shot` (the whole text as one take, refused beyond an engine's limit); the
1069
+ streamed lane never sends it, as AbstractCore refuses `one_shot` on a stream.
1070
+
1071
+ ```python
1072
+ from abstractruntime.integrations.abstractcore import VoiceLibraryError, get_abstractcore_voice_facade
1073
+
1074
+ voices = get_abstractcore_voice_facade(rt)
1075
+ french = voices.list_cloned_voices(language="fr")["voices"]
1076
+ designed = voices.design_voice("A calm, warm low female voice", name="Calm", language="en")
1077
+ voices.update_cloned_voice(designed["voice_id"], name="Calm narrator")
1078
+ voices.delete_cloned_voice(designed["voice_id"])
1079
+ try:
1080
+ voices.get_cloned_voice(designed["voice_id"])
1081
+ except VoiceLibraryError as err:
1082
+ print(err.status_code, err.detail) # 404: the voice is gone
1083
+ ```
1084
+
1027
1085
  ## Durable run-scoped media and comms execution
1028
1086
 
1029
1087
  Hosts sometimes need to trigger image/TTS/music/STT work or outbound comms sends for an existing run. That work should still execute through Runtime so the child run ledger, artifact ownership, and replay surface remain Runtime-authored.
@@ -1307,12 +1307,13 @@ Entry points:
1307
1307
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
1308
1308
  - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
1309
1309
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
1310
+ - public voice library facade: `AbstractCoreVoiceFacade`, `get_abstractcore_voice_facade(...)`, `VoiceLibraryError` (`src/abstractruntime/integrations/abstractcore/voice_facade.py`): languages, cloned voices (list by language, read, rename or replace the transcript, delete), cloning from a recording, voice design, the capability catalog; local in process, remote over the AbstractCore server's `/v1` voice routes (see [Voice library](integrations/abstractcore.md#voice-library))
1310
1311
  - email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
1311
1312
  - public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
1312
1313
  - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
1313
1314
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
1314
1315
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
1315
- - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
1316
+ - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog` (with `language=`), `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
1316
1317
  - the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
1317
1318
  - host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
1318
1319
  - `integrations.abstractcore.llm_client.set_default_model_warmup(enabled)` (process-wide, no environment variable): whether a new `MultiLocalAbstractCoreLLMClient` builds (for a local model: loads) its default model at construction and on a default switch. Default on. A process that serves no model turns it off once at boot (the gateway's `serve --no-runner`); the default client is then built at its first call. `default_model_warmup()` reads the setting (see `integrations/abstractcore.md#unloading-and-switching-models`)
@@ -3232,6 +3233,64 @@ adapters = facade.list_vision_adapters(
3232
3233
  )
3233
3234
  ```
3234
3235
 
3236
+ ## Voice library
3237
+
3238
+ `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`) manages the voices AbstractCore can speak with:
3239
+
3240
+ - `list_languages(kind=None, provider=None)`: `{"languages": {kind: {provider: {provider, languages, open, declared}}}}`
3241
+ for `tts`, `stt` and `cloning`, read without loading a model;
3242
+ - `list_cloned_voices(provider=None, model=None, language=None)`: `{"voices": [...], "count": n}`, designed and
3243
+ built-in voices included (`tags.designed`, `tags.builtin`); `language` keeps the voices that can speak it, native
3244
+ speakers first;
3245
+ - `get_cloned_voice(voice_id)`, `update_cloned_voice(voice_id, name=None, reference_text=None)` (both fields checked
3246
+ before either is applied) and `delete_cloned_voice(voice_id)`; built-in voices are read-only;
3247
+ - `clone_voice(audio_bytes, filename=None, content_type=None, name=None, reference_text=None, provider=None, model=None)`:
3248
+ a voice from a reference recording (`provider` = the cloning engine, e.g. `qwen3-tts`, `omnivoice`);
3249
+ - `design_voice(description, name=None, language=None, text=None)`: a voice from a written description, stored as a
3250
+ cloned voice (needs `abstractvoice[qwen3-tts]` and `abstractvoice[stt]` where the voice capability runs);
3251
+ - `deploy_voice_to_library(voice_id)`: copies one of the runtime's personal voices into its first library (see below);
3252
+ - `compatibility_catalog()`: per kind, provider, model and surface, the support level of each feature (`native`,
3253
+ `emulated`, `conditional`, `unsupported`), e.g. which engines honour `speed` or `one_shot`.
3254
+
3255
+ Local clients run these in process on the same AbstractCore capability registry their synthesis uses (same voice
3256
+ manager, settings and voice stores; a model pool uses its media host), AbstractCore 2.30.0+ and AbstractVoice 0.18.2+.
3257
+ `clone_voice` answers the stored record, flat, with its `voice_id`, on both sides; `clone_voice(..., language=)` records
3258
+ the recording's language in process (AbstractVoice 0.19.0). A remote AbstractCore 2.30.0 server does not take the
3259
+ language yet (its clone form has no such field), so a remotely cloned voice's language is identified from its transcript. The remote client calls the AbstractCore server's `/v1/audio/languages`, `/v1/voice/clones[/{id}]`
3260
+ (`GET`, `PATCH`, `DELETE`), `/v1/voice/clone` and `/v1/voice/design`, and reads the capability catalog from
3261
+ `/v1/audio/voices`; the server's changes need its operator token in the runtime's headers. Every refusal is a
3262
+ `VoiceLibraryError` with `status_code` (404 unknown voice, 422 refused input, 401 server token missing, 501 capability
3263
+ or engine runtime missing; a remote server's own 400, 403, 409, 413, 429 and 503 pass through; 502 for any other remote
3264
+ failure) and `detail`, so a host maps it to its own answer.
3265
+
3266
+ Cloned voices live in AbstractVoice's store. By default that is one store per machine user, shared by every account a
3267
+ host serves. A runtime can instead have its own personal voice store in front of read-only libraries: put
3268
+ `voice_store_dir` (and optionally `voice_library_dirs`, a list of folders) in its AbstractCore client settings, e.g.
3269
+ `create_local_runtime(llm_kwargs={"voice_store_dir": "/data/alice/voices", "voice_library_dirs": ["/data/voice-library"]})`.
3270
+ Synthesis, the voice catalog and the voice library facade of that runtime then use the same stores: voices cloned or
3271
+ designed go to the personal store, library voices (built-in ones included) are listed and spoken but read-only (422), and
3272
+ `deploy_voice_to_library(voice_id)` copies a personal voice into the first library (local runtimes; 501 remote, where the
3273
+ AbstractCore server keeps its own store). Who may deploy is the host's decision. Needs AbstractVoice 0.19.0; with an older
3274
+ AbstractVoice, these settings are not honoured. Records carry `meta.scope` (`personal` | `library`).
3275
+
3276
+ The voice catalog takes the same language filter: `get_abstractcore_discovery_facade(rt).get_voice_catalog(language="fr")`.
3277
+ A remote run's buffered TTS forwards `one_shot` (the whole text as one take, refused beyond an engine's limit); the
3278
+ streamed lane never sends it, as AbstractCore refuses `one_shot` on a stream.
3279
+
3280
+ ```python
3281
+ from abstractruntime.integrations.abstractcore import VoiceLibraryError, get_abstractcore_voice_facade
3282
+
3283
+ voices = get_abstractcore_voice_facade(rt)
3284
+ french = voices.list_cloned_voices(language="fr")["voices"]
3285
+ designed = voices.design_voice("A calm, warm low female voice", name="Calm", language="en")
3286
+ voices.update_cloned_voice(designed["voice_id"], name="Calm narrator")
3287
+ voices.delete_cloned_voice(designed["voice_id"])
3288
+ try:
3289
+ voices.get_cloned_voice(designed["voice_id"])
3290
+ except VoiceLibraryError as err:
3291
+ print(err.status_code, err.detail) # 404: the voice is gone
3292
+ ```
3293
+
3235
3294
  ## Durable run-scoped media and comms execution
3236
3295
 
3237
3296
  Hosts sometimes need to trigger image/TTS/music/STT work or outbound comms sends for an existing run. That work should still execute through Runtime so the child run ledger, artifact ownership, and replay surface remain Runtime-authored.
@@ -47,7 +47,7 @@
47
47
  - VisualFlow LLM Call and Agent nodes forward Core generation controls such as `thinking`; Provider Models nodes can apply Core `capability_route` filters during runtime discovery.
48
48
  - Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort text/chat session reuse; use `LLM_CALL.params.prompt_cache_binding` for durable exact bloc-backed reuse; and use `get_abstractcore_host_facade(runtime).list_prompt_cache_exports(...)`, `prompt_cache_export(...)`, and `prompt_cache_import(...)` only for host-local operator/admin export-import workflows around live local provider caches. Runtime does not auto-derive prompt-cache keys for image/video/voice/music/STT output selectors. Derived session keys are stamped with session attribution after each generate so hosts can use `list_session_prompt_caches(...)` / `clear_session_prompt_caches(...)` per session; caller-owned keys are never stamped, and completing a run does not clear session caches. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
49
49
  - Durable bloc lifecycle: Runtime exposes `list_blocs(...)`, `list_bloc_kv_artifacts(...)`, `delete_bloc_kv_artifact(...)`, `prune_bloc_kv_artifacts(...)`, and `delete_bloc(...)`, with `dry_run`, `clear_loaded`, and `force` safety controls on the host facade.
50
- - Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, and `get_abstractcore_run_facade(...)`
50
+ - Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, `get_abstractcore_voice_facade(...)` ([voice library](docs/integrations/abstractcore.md#voice-library): languages, cloned voices, cloning, voice design, the capability catalog) and `get_abstractcore_run_facade(...)`
51
51
  - Host-local operator wrappers: the host facade exposes single-user email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), `abstractruntime.integrations.abstractcore.email_facade` re-exports AbstractCore's mail library for multi-user hosts, and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
52
52
  - Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
53
53
  - [Artifacts](docs/artifacts.md): Runtime artifact identity, JSON-safe refs, canonical descriptors, generated-media provenance, tool-output offload thresholds, catalog search/stats, access counters, and Gateway/Observer retrieval boundaries.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.12.0"
7
+ version = "0.13.0"
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,25 @@
1
+ Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
2
+
3
+ ### Added
4
+
5
+ - The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
6
+ stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
7
+ `clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
8
+ server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
9
+ - **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
10
+ it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
11
+ stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
12
+ [Voice library](docs/integrations/abstractcore.md#voice-library).
13
+
14
+ - **Voice library facade**: `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`, `VoiceLibraryError`) lists the languages each voice engine accepts, lists cloned voices (designed and built-in ones included, optionally by language), reads, renames, replaces the reference transcript of and deletes a cloned voice, creates a voice from a recording (`clone_voice`) or from a written description (`design_voice`), and returns the capability catalog (which engine and model supports `speed`, `one_shot`, design... and how). Local runtimes run it in process; remote runtimes call the AbstractCore server's `/v1` voice routes. Refusals carry an HTTP-like `status_code`. See [Voice library](docs/integrations/abstractcore.md#voice-library).
15
+ - **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
16
+ - **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
17
+
18
+ ### Changed
19
+
20
+ - A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
21
+ `one_shot` over an engine's length limit or an unknown voice id) and a missing capability
22
+ (`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
23
+ message. Other media lanes keep their retries.
24
+ - A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
25
+ the HTTP error's response.
@@ -8,6 +8,7 @@ Provides:
8
8
  - Effect handlers wiring
9
9
  - Convenience runtime factories for local/remote/hybrid modes
10
10
  - Public discovery facade for provider/media/catalog snapshot queries
11
+ - Public voice library facade (`voice_facade`): languages, cloned voices, voice design and cloning, the capability catalog
11
12
  - Public host facade for prompt-cache, durable bloc/KV, and model-residency control operations
12
13
  - Public config facade for AbstractCore capability-default routes and config API keys
13
14
  - Public structured-output facade (`structured_facade`): `parse_response_format` / `ResponseFormatError` for hosts
@@ -45,6 +46,11 @@ from .discovery_facade import (
45
46
  AbstractCoreDiscoveryFacade,
46
47
  get_abstractcore_discovery_facade,
47
48
  )
49
+ from .voice_facade import (
50
+ AbstractCoreVoiceFacade,
51
+ VoiceLibraryError,
52
+ get_abstractcore_voice_facade,
53
+ )
48
54
  from .run_facade import (
49
55
  LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX,
50
56
  AbstractCoreRunFacade,
@@ -82,6 +88,8 @@ __all__ = [
82
88
  "AbstractCoreDiscoveryFacade",
83
89
  "AbstractCoreHostFacade",
84
90
  "AbstractCoreRunFacade",
91
+ "AbstractCoreVoiceFacade",
92
+ "VoiceLibraryError",
85
93
  "LocalAbstractCoreLLMClient",
86
94
  "MultiLocalAbstractCoreLLMClient",
87
95
  "RemoteAbstractCoreLLMClient",
@@ -100,6 +108,7 @@ __all__ = [
100
108
  "bootstrap_telegram_auth_from_env",
101
109
  "get_abstractcore_discovery_facade",
102
110
  "get_abstractcore_host_facade",
111
+ "get_abstractcore_voice_facade",
103
112
  "capability_default_config_file",
104
113
  "capability_default_specs",
105
114
  "clear_capability_default",
@@ -7,7 +7,7 @@ Scope:
7
7
  - provider discovery
8
8
  - provider model discovery
9
9
  - model capability lookup
10
- - audio/voice/TTS/STT catalogs
10
+ - audio/voice/TTS/STT catalogs (voice library changes: `voice_facade.AbstractCoreVoiceFacade`)
11
11
  - music provider/model catalogs
12
12
  - vision provider catalogs
13
13
  - vision adapter catalogs
@@ -287,10 +287,14 @@ class AbstractCoreDiscoveryFacade:
287
287
  model: Optional[str] = None,
288
288
  providers_only: bool = False,
289
289
  voice_openai_api_key: Optional[str] = None,
290
+ language: Optional[str] = None,
290
291
  **kwargs: Any,
291
292
  ) -> Dict[str, Any]:
292
293
  """Voice catalog. `voice_openai_api_key` is the host's OpenAI credential for
293
- AbstractVoice's `openai` engines (plugin setting of the same name)."""
294
+ AbstractVoice's `openai` engines (plugin setting of the same name). `language` keeps
295
+ the voices that can speak it, native speakers first (AbstractCore 2.30.0+)."""
296
+ if language is not None:
297
+ kwargs["language"] = language
294
298
  return self._client.get_voice_catalog(
295
299
  base_url=base_url,
296
300
  provider_api_key=provider_api_key,
@@ -624,8 +624,17 @@ def _runtime_capability_owner_config(
624
624
  vision_api_key: Optional[str] = None,
625
625
  music_base_url: Optional[str] = None,
626
626
  music_api_key: Optional[str] = None,
627
+ voice_store_dir: Optional[str] = None,
628
+ voice_library_dirs: Optional[list] = None,
627
629
  ) -> Dict[str, Any]:
628
630
  cfg: Dict[str, Any] = {}
631
+ # The runtime's voice stores (AbstractVoice 0.19.0 plugin settings; runtime backlog 0851):
632
+ # a personal store in front of read-only libraries, so this runtime lists and manages the
633
+ # voices its own synthesis speaks with.
634
+ if isinstance(voice_store_dir, str) and voice_store_dir.strip():
635
+ cfg["voice_store_dir"] = voice_store_dir.strip()
636
+ if voice_library_dirs:
637
+ cfg["voice_library_dirs"] = [str(d) for d in voice_library_dirs if str(d or "").strip()]
629
638
  if isinstance(voice_base_url, str) and voice_base_url.strip():
630
639
  cfg["voice_remote_base_url"] = voice_base_url.strip()
631
640
  if isinstance(voice_api_key, str) and voice_api_key.strip():
@@ -715,6 +724,8 @@ def _runtime_capability_registry(
715
724
  vision_api_key: Optional[str] = None,
716
725
  music_base_url: Optional[str] = None,
717
726
  music_api_key: Optional[str] = None,
727
+ voice_store_dir: Optional[str] = None,
728
+ voice_library_dirs: Optional[list] = None,
718
729
  ) -> Any:
719
730
  from abstractcore.capabilities import CapabilityRegistry
720
731
 
@@ -735,6 +746,8 @@ def _runtime_capability_registry(
735
746
  vision_api_key=vision_api_key,
736
747
  music_base_url=music_base_url,
737
748
  music_api_key=music_api_key,
749
+ voice_store_dir=voice_store_dir,
750
+ voice_library_dirs=voice_library_dirs,
738
751
  )
739
752
  },
740
753
  )()
@@ -1074,15 +1087,25 @@ def local_get_voice_catalog(
1074
1087
  provider: Optional[str] = None,
1075
1088
  model: Optional[str] = None,
1076
1089
  providers_only: bool = False,
1090
+ language: Optional[str] = None,
1091
+ voice_store_dir: Optional[str] = None,
1092
+ voice_library_dirs: Optional[list] = None,
1077
1093
  ) -> Dict[str, Any]:
1078
1094
  try:
1079
1095
  voice = _runtime_capability_registry(
1080
1096
  voice_base_url=base_url,
1081
1097
  voice_api_key=provider_api_key,
1082
1098
  voice_openai_api_key=voice_openai_api_key,
1099
+ voice_store_dir=voice_store_dir,
1100
+ voice_library_dirs=voice_library_dirs,
1083
1101
  ).voice
1102
+ # `language` (AbstractCore 2.30.0+) keeps the voices that speak it, natives first; it is
1103
+ # passed only when asked, and AbstractCore raises if its backend cannot filter.
1104
+ lang = str(language or "").strip() or None
1084
1105
  catalog = (
1085
- voice.voice_catalog(provider=provider, model=model, providers_only=providers_only)
1106
+ voice.voice_catalog(
1107
+ provider=provider, model=model, providers_only=providers_only, **({"language": lang} if lang else {})
1108
+ )
1086
1109
  if hasattr(voice, "voice_catalog")
1087
1110
  else {}
1088
1111
  )
@@ -2542,6 +2542,8 @@ def make_llm_call_handler(*, llm: AbstractCoreLLMClient, artifact_store: Optiona
2542
2542
  logger.info("LLM_CALL stopped by cancel", detail=str(e))
2543
2543
  return EffectOutcome.failed(str(e), retryable=False)
2544
2544
  logger.error("LLM_CALL failed", error=str(e))
2545
+ if _is_voice_refusal(e, params.get("output") if isinstance(params, dict) else None):
2546
+ return EffectOutcome.failed(str(e), retryable=False)
2545
2547
  return EffectOutcome.failed(str(e), retryable=_llm_error_is_retryable(e))
2546
2548
 
2547
2549
  return _handler
@@ -2558,6 +2560,17 @@ _HARMONY_ARTIFACT_RE = re.compile(
2558
2560
  )
2559
2561
 
2560
2562
 
2563
+ def _is_voice_refusal(exc: Exception, output: Any) -> bool:
2564
+ """A voice request the voice plugin refused (runtime backlog 0852): AbstractVoice raises a plain
2565
+ ValueError for input it cannot honour (`one_shot` over an engine's limit, an unsupported
2566
+ option) and KeyError for an unknown voice id; both answer the same on every attempt. Other
2567
+ media lanes keep their retries (a failed remote job or an empty image can succeed again)."""
2568
+ if not (type(exc) is ValueError or type(exc) is KeyError):
2569
+ return False
2570
+ specs = output if isinstance(output, list) else [output]
2571
+ return any(isinstance(spec, dict) and str(spec.get("modality") or "").strip().lower() == "voice" for spec in specs)
2572
+
2573
+
2561
2574
  def _llm_error_is_retryable(exc: Exception) -> bool:
2562
2575
  """Classify LLM provider failures for the retry policy.
2563
2576
 
@@ -2620,11 +2633,24 @@ def _llm_error_is_retryable(exc: Exception) -> bool:
2620
2633
  pass
2621
2634
 
2622
2635
  status = getattr(exc, "status_code", None)
2636
+ if not isinstance(status, int):
2637
+ # An HTTP client error (httpx.HTTPStatusError from a remote AbstractCore server) carries
2638
+ # the status on its response: a server's 4xx refusal is not retried either.
2639
+ status = getattr(getattr(exc, "response", None), "status_code", None)
2623
2640
  if isinstance(status, int):
2624
2641
  if 400 <= status < 500 and status not in _TRANSIENT_4XX:
2625
2642
  return False
2626
2643
  return True
2627
2644
 
2645
+ # A capability that is not installed answers the same on every attempt.
2646
+ try:
2647
+ from abstractcore.capabilities.errors import CapabilityUnavailableError # type: ignore
2648
+
2649
+ if isinstance(exc, CapabilityUnavailableError):
2650
+ return False
2651
+ except ImportError:
2652
+ pass
2653
+
2628
2654
  try:
2629
2655
  from abstractcore.exceptions import ( # type: ignore
2630
2656
  AuthenticationError,