AbstractRuntime 0.12.0__tar.gz → 0.13.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/CHANGELOG.md +35 -0
  2. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/PKG-INFO +1 -1
  3. abstractruntime-0.13.1/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +74 -0
  4. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/README.md +2 -0
  5. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/api.md +2 -1
  6. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/README.md +3 -1
  7. abstractruntime-0.13.1/docs/backlog/completed/0851_per_account_voice_stores.md +51 -0
  8. abstractruntime-0.13.1/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +44 -0
  9. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/integrations/abstractcore.md +58 -0
  10. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/llms-full.txt +62 -1
  11. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/llms.txt +1 -1
  12. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/pyproject.toml +1 -1
  13. abstractruntime-0.13.1/release-notes.md +4 -0
  14. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/__init__.py +9 -0
  15. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +6 -2
  16. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +24 -1
  17. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +26 -0
  18. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/email_facade.py +5 -2
  19. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +73 -1
  20. abstractruntime-0.13.1/src/abstractruntime/integrations/abstractcore/voice_facade.py +154 -0
  21. abstractruntime-0.13.1/src/abstractruntime/integrations/abstractcore/voice_library.py +361 -0
  22. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_discovery_facade.py +1 -1
  23. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_review_fixes.py +4 -1
  24. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_retry_classification.py +39 -0
  25. abstractruntime-0.13.1/tests/test_voice_library_facade.py +437 -0
  26. abstractruntime-0.12.0/release-notes.md +0 -52
  27. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.github/workflows/ci.yml +0 -0
  28. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.github/workflows/release.yml +0 -0
  29. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.gitignore +0 -0
  30. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/ACKNOWLEDGMENTS.md +0 -0
  31. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/CODE_OF_CONDUCT.md +0 -0
  32. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/CONTRIBUTING.md +0 -0
  33. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/LICENSE +0 -0
  34. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/README.md +0 -0
  35. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/ROADMAP.md +0 -0
  36. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/SECURITY.md +0 -0
  37. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/README.md +0 -0
  38. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  39. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  40. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  41. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  42. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  43. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  44. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  45. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/architecture.md +0 -0
  46. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/artifacts.md +0 -0
  47. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/automations.md +0 -0
  48. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  49. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  50. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  51. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  52. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  53. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  54. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  55. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  56. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
  57. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  58. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  59. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  60. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  61. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  62. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  63. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  64. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  65. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/009_artifact_store.md +0 -0
  66. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  67. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  68. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  69. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  70. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  71. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  72. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  73. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  74. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  75. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  76. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  77. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  78. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  79. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  80. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  81. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  82. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  83. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  84. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  85. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  86. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  87. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  88. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  89. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  90. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  91. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/004_tests.md +0 -0
  92. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  93. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  94. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  95. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  96. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/README.md +0 -0
  97. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  98. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  99. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  100. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  101. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  102. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  103. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  104. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  105. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  106. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  107. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  108. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  109. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  110. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  111. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  112. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
  113. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  114. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  115. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  116. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  117. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  118. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  119. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  120. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  121. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  122. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  123. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  124. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  125. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  126. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  127. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  128. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  129. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  130. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  131. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  132. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  133. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  134. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  135. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  136. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  137. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  138. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  139. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  140. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  141. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  142. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  143. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  144. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/email.md +0 -0
  145. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/entity-runtime.md +0 -0
  146. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/evidence.md +0 -0
  147. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/faq.md +0 -0
  148. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/getting-started.md +0 -0
  149. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/limits.md +0 -0
  150. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/manual_testing.md +0 -0
  151. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/mcp-worker.md +0 -0
  152. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/proposal.md +0 -0
  153. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/provenance.md +0 -0
  154. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/snapshots.md +0 -0
  155. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/tool-approval.md +0 -0
  156. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/tools-comms.md +0 -0
  157. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/troubleshooting.md +0 -0
  158. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/workflow-bundles.md +0 -0
  159. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/01_hello_world.py +0 -0
  160. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/02_ask_user.py +0 -0
  161. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/03_wait_until.py +0 -0
  162. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/04_multi_step.py +0 -0
  163. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/05_persistence.py +0 -0
  164. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/06_llm_integration.py +0 -0
  165. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/07_react_agent.py +0 -0
  166. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/README.md +0 -0
  167. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/mkdocs.yml +0 -0
  168. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/pytest.ini +0 -0
  169. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/scripts/backfill_diary_edges.py +0 -0
  170. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/scripts/generate_llms_full.py +0 -0
  171. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/__init__.py +0 -0
  172. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automation_queries.py +0 -0
  173. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/__init__.py +0 -0
  174. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/adapters.py +0 -0
  175. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/attention.py +0 -0
  176. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundle.py +0 -0
  177. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  178. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  179. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/commands.py +0 -0
  180. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/consumers.py +0 -0
  181. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/controller.py +0 -0
  182. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/ledger.py +0 -0
  183. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/models.py +0 -0
  184. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/samples.py +0 -0
  185. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/service.py +0 -0
  186. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/wakes.py +0 -0
  187. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/conversation_search.py +0 -0
  188. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/__init__.py +0 -0
  189. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/config.py +0 -0
  190. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
  191. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/event_keys.py +0 -0
  192. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/health.py +0 -0
  193. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/live_deltas.py +0 -0
  194. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/models.py +0 -0
  195. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/policy.py +0 -0
  196. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/progress_channel.py +0 -0
  197. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/publish.py +0 -0
  198. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_attribution.py +0 -0
  199. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_identity.py +0 -0
  200. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
  201. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_origin.py +0 -0
  202. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/runtime.py +0 -0
  203. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/spec.py +0 -0
  204. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/tool_scope.py +0 -0
  205. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/vars.py +0 -0
  206. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/__init__.py +0 -0
  207. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/charts.py +0 -0
  208. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/docx.py +0 -0
  209. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/pdf.py +0 -0
  210. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/__init__.py +0 -0
  211. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/actions.py +0 -0
  212. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/automations.py +0 -0
  213. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/binding.py +0 -0
  214. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/feeder.py +0 -0
  215. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/frame.py +0 -0
  216. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/inbox.py +0 -0
  217. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/evidence/__init__.py +0 -0
  218. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/evidence/recorder.py +0 -0
  219. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/history_bundle.py +0 -0
  220. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/__init__.py +0 -0
  221. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/act_only.py +0 -0
  222. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/chat.py +0 -0
  223. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/communities.py +0 -0
  224. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/diary.py +0 -0
  225. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/digest.py +0 -0
  226. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
  227. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/fingerprint.py +0 -0
  228. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/lease.py +0 -0
  229. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/life.py +0 -0
  230. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/memory_reader.py +0 -0
  231. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/night_voice.py +0 -0
  232. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/phase_graph.py +0 -0
  233. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/phase_spec.py +0 -0
  234. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/prelude.py +0 -0
  235. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  236. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/reflection.py +0 -0
  237. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  238. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/substrate.py +0 -0
  239. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tool_effects.py +0 -0
  240. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tool_policy.py +0 -0
  241. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tools.py +0 -0
  242. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
  243. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/__init__.py +0 -0
  244. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  245. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  246. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  247. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  248. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  249. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  250. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  251. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  252. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  253. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  254. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  255. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  256. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  257. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  258. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  259. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  260. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  261. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  262. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  263. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  264. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  265. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  266. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  267. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  268. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  269. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  270. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  271. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  272. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  273. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  274. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  275. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  276. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/mail_verbs.py +0 -0
  277. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/__init__.py +0 -0
  278. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/active_context.py +0 -0
  279. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/active_memory.py +0 -0
  280. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/compaction.py +0 -0
  281. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/kg_packets.py +0 -0
  282. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/memact_composer.py +0 -0
  283. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/recall_levels.py +0 -0
  284. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/token_budget.py +0 -0
  285. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/__init__.py +0 -0
  286. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  287. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
  288. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/__init__.py +0 -0
  289. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/convenience.py +0 -0
  290. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
  291. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/registry.py +0 -0
  292. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
  293. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/session_history.py +0 -0
  294. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/session_turns.py +0 -0
  295. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/__init__.py +0 -0
  296. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/artifacts.py +0 -0
  297. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/base.py +0 -0
  298. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/change_ring.py +0 -0
  299. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/commands.py +0 -0
  300. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/in_memory.py +0 -0
  301. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/json_files.py +0 -0
  302. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/lease.py +0 -0
  303. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
  304. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
  305. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/observable.py +0 -0
  306. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/offloading.py +0 -0
  307. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/serialize.py +0 -0
  308. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/snapshots.py +0 -0
  309. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/sqlite.py +0 -0
  310. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  311. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/__init__.py +0 -0
  312. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/cloudevents.py +0 -0
  313. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/connection_events.py +0 -0
  314. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/connections.py +0 -0
  315. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/email_received.py +0 -0
  316. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/event_frame.py +0 -0
  317. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/feed.py +0 -0
  318. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/manual.py +0 -0
  319. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/protocol.py +0 -0
  320. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/registry.py +0 -0
  321. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/schedule.py +0 -0
  322. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/webhook.py +0 -0
  323. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/turn_grounding.py +0 -0
  324. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/__init__.py +0 -0
  325. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/atomic_files.py +0 -0
  326. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/file_filters.py +0 -0
  327. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
  328. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  329. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  330. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  331. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  332. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  333. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  334. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  335. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  336. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  337. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  338. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  339. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  340. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  341. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  342. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  343. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  344. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  345. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  346. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  347. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  348. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  349. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  350. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  351. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  352. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  353. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  354. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  355. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
  356. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  357. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  358. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  359. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/README.md +0 -0
  360. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/automation_harness.py +0 -0
  361. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/conftest.py +0 -0
  362. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/email_wp2_support.py +0 -0
  363. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/atom.xml +0 -0
  364. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  365. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  366. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss1.xml +0 -0
  367. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss2.xml +0 -0
  368. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/schedule_v1_corpus.json +0 -0
  369. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/conftest.py +0 -0
  370. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/live_email_support.py +0 -0
  371. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/test_email_live_runtime.py +0 -0
  372. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/media_endpoint_profile_probe.py +0 -0
  373. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_comms_facade.py +0 -0
  374. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_host_facade.py +0 -0
  375. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_run_facade.py +0 -0
  376. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_server_facade.py +0 -0
  377. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_structured_facade.py +0 -0
  378. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_telegram_facade.py +0 -0
  379. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_consumers_index.py +0 -0
  380. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_context_policy.py +0 -0
  381. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_index.py +0 -0
  382. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_memory.py +0 -0
  383. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_agora_agent_alias_identity.py +0 -0
  384. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_agora_tools_http.py +0 -0
  385. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  386. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_answer_user_effect.py +0 -0
  387. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_artifact_session_candidates.py +0 -0
  388. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_artifacts.py +0 -0
  389. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_calendar_schedule.py +0 -0
  390. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_commands.py +0 -0
  391. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_controller.py +0 -0
  392. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_controller_recovery.py +0 -0
  393. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_definition.py +0 -0
  394. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_discussion_isolation.py +0 -0
  395. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_email_results.py +0 -0
  396. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_growing_context.py +0 -0
  397. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_index.py +0 -0
  398. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_list_reads.py +0 -0
  399. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_named_policy_compiler.py +0 -0
  400. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_next_fire.py +0 -0
  401. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_occurrence_input_resolver.py +0 -0
  402. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_occurrence_recovery.py +0 -0
  403. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_replay_read_only.py +0 -0
  404. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_retry.py +0 -0
  405. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_session_turns.py +0 -0
  406. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_status.py +0 -0
  407. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_tool_approval.py +0 -0
  408. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_browser_probe_target_walling.py +0 -0
  409. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  410. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_capability_default_reasoning.py +0 -0
  411. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_chat_summarizer_integration.py +0 -0
  412. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_code_node_imports.py +0 -0
  413. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_code_node_restricted_python.py +0 -0
  414. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_command_sandbox_host_facade.py +0 -0
  415. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_command_store.py +0 -0
  416. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_compaction_helpers.py +0 -0
  417. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_compaction_summarizer_route.py +0 -0
  418. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_config_facade_models_engines.py +0 -0
  419. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_config_facade_voice_input_hint.py +0 -0
  420. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_control_adapter_while.py +0 -0
  421. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_controller_bundle_packaged.py +0 -0
  422. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_conversation_search.py +0 -0
  423. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_crash_ordering_inversions.py +0 -0
  424. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_create_if_absent.py +0 -0
  425. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_data_registry_facade.py +0 -0
  426. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_model_warmup_switch.py +0 -0
  427. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_camera_gating.py +0 -0
  428. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_comms_gating.py +0 -0
  429. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_files.py +0 -0
  430. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_folders.py +0 -0
  431. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_web.py +0 -0
  432. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_search_files_executor.py +0 -0
  433. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_diary_capture.py +0 -0
  434. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_diary_write_rescue.py +0 -0
  435. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_directory_lease.py +0 -0
  436. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_disabled_toolsets_seam.py +0 -0
  437. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  438. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  439. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
  440. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discussion_session_anchor.py +0 -0
  441. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_document_markdown_tables.py +0 -0
  442. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_document_renderers_hr_quote.py +0 -0
  443. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_durable_toolsets.py +0 -0
  444. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_durable_write_discipline.py +0 -0
  445. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  446. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_cancellation.py +0 -0
  447. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_issuance_idempotency.py +0 -0
  448. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  449. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_election_consequence_teaching.py +0 -0
  450. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_binding_and_refiner.py +0 -0
  451. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_feeder_batched.py +0 -0
  452. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_feeder_flags.py +0 -0
  453. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_gate_fixes.py +0 -0
  454. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_inbox_and_trigger.py +0 -0
  455. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_received_mailbox_id.py +0 -0
  456. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_regate_fixes.py +0 -0
  457. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_self_trigger_loop.py +0 -0
  458. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_stream_consumers.py +0 -0
  459. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_toolset_and_walls.py +0 -0
  460. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emergence_experiment.py +0 -0
  461. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emit_event_uses_wait_index.py +0 -0
  462. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
  463. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  464. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_in_process.py +0 -0
  465. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  466. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_route_context.py +0 -0
  467. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_awake_memory_fixes.py +0 -0
  468. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_brain_effects.py +0 -0
  469. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_chat_driver.py +0 -0
  470. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_chat_tools_reflection.py +0 -0
  471. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_diary.py +0 -0
  472. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_execute_tool.py +0 -0
  473. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_fetch_url_tool.py +0 -0
  474. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_history_window.py +0 -0
  475. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_life_loop.py +0 -0
  476. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_memory_richness.py +0 -0
  477. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_phase_graph_conformance.py +0 -0
  478. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_react_visit_window.py +0 -0
  479. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_recent_memories.py +0 -0
  480. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_runtime.py +0 -0
  481. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_search_memory.py +0 -0
  482. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  483. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_substrate_resolution.py +0 -0
  484. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_visit_honesty.py +0 -0
  485. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_workspace_cap.py +0 -0
  486. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_workspace_tools.py +0 -0
  487. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_event_index_cross_process.py +0 -0
  488. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_event_wait_index.py +0 -0
  489. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  490. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_evidence_recorder.py +0 -0
  491. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  492. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_execute_command_output_offload.py +0 -0
  493. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_execution_capability_discovery.py +0 -0
  494. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_explicit_eject_other_clients.py +0 -0
  495. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_factory_default_retry_policy.py +0 -0
  496. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  497. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_format_repair_nudge.py +0 -0
  498. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_fresh_install_no_provider.py +0 -0
  499. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_gateway_facades_c4899.py +0 -0
  500. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_git_read_only_refiner.py +0 -0
  501. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_hf_process_residency_merge.py +0 -0
  502. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_history_window_multimodal.py +0 -0
  503. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_hot_path_store_reads.py +0 -0
  504. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_indexed_idempotency_lookup.py +0 -0
  505. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_integration_abstractcore.py +0 -0
  506. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_integrations_abstractcore.py +0 -0
  507. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_file_run_store_children_index.py +0 -0
  508. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_run_cache_bound.py +0 -0
  509. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_store_scan_memo.py +0 -0
  510. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_jsonl_ledger_recovery.py +0 -0
  511. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
  512. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_chain.py +0 -0
  513. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_record_slimming.py +0 -0
  514. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_subscription.py +0 -0
  515. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_live_token_deltas.py +0 -0
  516. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
  517. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  518. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  519. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  520. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_requires_prompt.py +0 -0
  521. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
  522. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
  523. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_text_phase_progress.py +0 -0
  524. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  525. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  526. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  527. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_grounding_tail.py +0 -0
  528. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_media_artifacts.py +0 -0
  529. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_system_context.py +0 -0
  530. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
  531. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_streaming_on_token.py +0 -0
  532. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_helper_tool_exposure.py +0 -0
  533. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_residency_host_sweep.py +0 -0
  534. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  535. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mail_verbs.py +0 -0
  536. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mailbox_index.py +0 -0
  537. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_max_iterations_ceiling.py +0 -0
  538. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_remote_tool_executor.py +0 -0
  539. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  540. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_logging.py +0 -0
  541. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_security.py +0 -0
  542. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_stdio.py +0 -0
  543. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_artifact_resolution.py +0 -0
  544. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_capability_default_routing.py +0 -0
  545. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_host_endpoint_resolver.py +0 -0
  546. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_only_requests_skip_text_client.py +0 -0
  547. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_subprocess.py +0 -0
  548. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memact_composer_from_kg_result.py +0 -0
  549. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_appraise_handler.py +0 -0
  550. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_communities.py +0 -0
  551. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  552. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_packets.py +0 -0
  553. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  554. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  555. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  556. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  557. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_note_effect.py +0 -0
  558. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_query_effect.py +0 -0
  559. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_query_rich_filters.py +0 -0
  560. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  561. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_seam_handlers.py +0 -0
  562. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
  563. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_tag_effect.py +0 -0
  564. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mlx_generation_serialization.py +0 -0
  565. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mlx_process_residency_merge.py +0 -0
  566. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_eject_cancel.py +0 -0
  567. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_clean_switch.py +0 -0
  568. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_control_plane.py +0 -0
  569. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  570. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_multi_store_scheduler.py +0 -0
  571. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
  572. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_mlx_application_wiring.py +0 -0
  573. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
  574. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_tool_channel.py +0 -0
  575. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_night_voice.py +0 -0
  576. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
  577. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_occurrence_named_inputs.py +0 -0
  578. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_occurrence_samples.py +0 -0
  579. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offload_answer_chain_c4978.py +0 -0
  580. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  581. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offloading.py +0 -0
  582. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_packaging_extras.py +0 -0
  583. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
  584. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pause_resume.py +0 -0
  585. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pdf_unicode_rendering.py +0 -0
  586. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_personal_cycle.py +0 -0
  587. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phantom_attachment_index.py +0 -0
  588. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_graph_artifact_control.py +0 -0
  589. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_graph_obedience.py +0 -0
  590. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_vocabulary_migration.py +0 -0
  591. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  592. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_export_import.py +0 -0
  593. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  594. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_modules.py +0 -0
  595. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  596. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  597. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_overlay.py +0 -0
  598. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  599. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_provider_pin_routing_isolation.py +0 -0
  600. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_publish_event.py +0 -0
  601. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_queryable_run_store.py +0 -0
  602. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_r12_workspace_sandbox.py +0 -0
  603. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  604. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_read_idle_threading.py +0 -0
  605. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_readoption_experiment.py +0 -0
  606. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_real_integration.py +0 -0
  607. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_realize_election.py +0 -0
  608. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_recall_levels_policy.py +0 -0
  609. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_client_cancel.py +0 -0
  610. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_llm_client.py +0 -0
  611. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_speculation_defaults.py +0 -0
  612. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_rendering_agent_trace_report.py +0 -0
  613. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_rendering_json_stringify.py +0 -0
  614. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_report_branding.py +0 -0
  615. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_resident_media_generation.py +0 -0
  616. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_resume_concurrent_same_wait.py +0 -0
  617. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_retry_idempotency.py +0 -0
  618. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_history_bundle.py +0 -0
  619. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_index_workspace_root.py +0 -0
  620. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_mutation_lock.py +0 -0
  621. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_origin.py +0 -0
  622. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_scoped_tool_policy.py +0 -0
  623. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_store_change_token.py +0 -0
  624. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_tool_scope_ceiling.py +0 -0
  625. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_browser_session_boundary.py +0 -0
  626. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  627. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  628. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
  629. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  630. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_install_boundary.py +0 -0
  631. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  632. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_node_traces.py +0 -0
  633. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  634. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_tick_step_gate.py +0 -0
  635. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_run.py +0 -0
  636. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_v1_corpus.py +0 -0
  637. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_v2_calendar.py +0 -0
  638. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_scheduler.py +0 -0
  639. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_send_email_refiner.py +0 -0
  640. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_send_email_self_default_policy.py +0 -0
  641. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  642. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_history.py +0 -0
  643. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_prompt_cache_attribution.py +0 -0
  644. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_prompt_cache_visibility.py +0 -0
  645. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_route_stamp.py +0 -0
  646. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_start_cost.py +0 -0
  647. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_shell_tool_exposure.py +0 -0
  648. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_snapshots.py +0 -0
  649. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_speculation_inheritance.py +0 -0
  650. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
  651. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_sqlite_ledger_store.py +0 -0
  652. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_async_wait.py +0 -0
  653. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  654. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  655. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_steer_sidecar.py +0 -0
  656. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_storage_deletion.py +0 -0
  657. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_streamed_voice_namespace.py +0 -0
  658. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_structured_output_schema_enum.py +0 -0
  659. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_subworkflow.py +0 -0
  660. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_terminal_effect_completion.py +0 -0
  661. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  662. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_thinking_inheritance.py +0 -0
  663. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  664. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_executor.py +0 -0
  665. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_resume_executes.py +0 -0
  666. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
  667. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
  668. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_catalog.py +0 -0
  669. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_descriptor_registry.py +0 -0
  670. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
  671. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_error_output_detection.py +0 -0
  672. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_filename_alias.py +0 -0
  673. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  674. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
  675. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_timeout.py +0 -0
  676. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_inventory_facade.py +0 -0
  677. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_invoke_effect.py +0 -0
  678. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_policy_and_mounts.py +0 -0
  679. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
  680. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_topic_election_world_model.py +0 -0
  681. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trace_context_propagation.py +0 -0
  682. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_cloudevents.py +0 -0
  683. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_connection_listening.py +0 -0
  684. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_connections.py +0 -0
  685. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_feed.py +0 -0
  686. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_registry.py +0 -0
  687. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_schedule_math.py +0 -0
  688. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_webhook.py +0 -0
  689. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trusted_run_index.py +0 -0
  690. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_turn_grounding_byte_stability.py +0 -0
  691. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
  692. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_vars_query_effect.py +0 -0
  693. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_ab_fixture.py +0 -0
  694. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_midturn_elections.py +0 -0
  695. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_midturn_resume.py +0 -0
  696. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_workflow.py +0 -0
  697. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  698. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  699. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  700. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  701. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  702. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  703. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_entity_memory_nodes.py +0 -0
  704. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  705. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_llm_call_partial_override.py +0 -0
  706. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  707. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_back_out_of_body.py +0 -0
  708. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  709. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_limit_on_wire.py +0 -0
  710. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memact_compose_node.py +0 -0
  711. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  712. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  713. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  714. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_reroute_lowering.py +0 -0
  715. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_set_vars_pins.py +0 -0
  716. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  717. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  718. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_add_message_builtin.py +0 -0
  719. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  720. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_agora_react_agent.py +0 -0
  721. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_call_tool_node.py +0 -0
  722. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  723. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_compiler_basic.py +0 -0
  724. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  725. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_continue_on_error.py +0 -0
  726. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  727. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  728. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  729. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_function_library.py +0 -0
  730. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_element_node.py +0 -0
  731. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_random_element_node.py +0 -0
  732. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_var_node.py +0 -0
  733. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
  734. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  735. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  736. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_make_object_node.py +0 -0
  737. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_media_nodes.py +0 -0
  738. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  739. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_memory_source_pins.py +0 -0
  740. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_pin_expressions.py +0 -0
  741. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_prompt_only.py +0 -0
  742. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_random_nodes.py +0 -0
  743. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
  744. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_string_contains_replace.py +0 -0
  745. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
  746. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_voice_openai_api_key_path.py +0 -0
  747. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  748. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_w4_feelings_lens.py +0 -0
  749. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_event_deadline.py +0 -0
  750. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_event_prompt_metadata.py +0 -0
  751. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_until_streak.py +0 -0
  752. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_until_utc_normalization.py +0 -0
  753. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workflow_bundle_registry.py +0 -0
  754. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_builtin_deny.py +0 -0
  755. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  756. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  757. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  758. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  759. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  760. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_prompt_context.py +0 -0
  761. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_read_only.py +0 -0
  762. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_writable_paths.py +0 -0
  763. {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_write_chart.py +0 -0
@@ -7,6 +7,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.13.1] - 2026-10-27
11
+
12
+ ### Added
13
+
14
+ - `email_facade.resolve_srv_default` (AbstractCore's mailbox SRV lookup) is re-exported, so a host's mail code imports
15
+ it from the runtime facade like every other mail name.
16
+
17
+ ## [0.13.0] - 2026-10-27
18
+
19
+ Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
20
+
21
+ ### Added
22
+
23
+ - The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
24
+ stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
25
+ `clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
26
+ server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
27
+ - **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
28
+ it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
29
+ stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
30
+ [Voice library](docs/integrations/abstractcore.md#voice-library).
31
+
32
+ - **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).
33
+ - **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
34
+ - **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
35
+
36
+ ### Changed
37
+
38
+ - A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
39
+ `one_shot` over an engine's length limit or an unknown voice id) and a missing capability
40
+ (`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
41
+ message. Other media lanes keep their retries.
42
+ - A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
43
+ the HTTP error's response.
44
+
10
45
  ## [0.12.0] - 2026-10-27
11
46
 
12
47
  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.1
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -0,0 +1,74 @@
1
+ # ADR 0008: Runtime integration facades are the complete host surface for AbstractCore
2
+
3
+ Status: Accepted.
4
+ Date: 2026-10-27
5
+
6
+ ## Context
7
+
8
+ Hosts (AbstractGateway first) depend on AbstractRuntime, and AbstractRuntime owns the
9
+ AbstractCore integration (ADR 0001, 0004-0007). The gateway enforces its side with a test that
10
+ fails on any direct `abstractcore` import. That rule only holds if every AbstractCore name a host
11
+ legitimately needs is reachable through a runtime facade. On 2026-10-27 the gateway's mailbox
12
+ code needed AbstractCore's SRV lookup (`resolve_srv_default`), the email facade did not re-export
13
+ it, and the host imported AbstractCore directly: the boundary test went red and stayed red
14
+ across a release line. The hole was not the import; it was a facade that lagged behind what the
15
+ host needed, with no rule saying whose job it was to close the gap.
16
+
17
+ ## Decision
18
+
19
+ 1. The modules under `abstractruntime.integrations.abstractcore` whose name ends in `_facade`
20
+ (discovery, host, config, run, email, structured, voice, telegram, comms, mcp, tool inventory,
21
+ server, data registry) are the ONLY surface through which a host reaches AbstractCore. They
22
+ are complete by contract: a name a host needs and cannot import from a facade is a runtime
23
+ defect, fixed by adding the re-export or method in the runtime and cutting a patch release.
24
+ 2. A host never works around a missing name by importing `abstractcore` directly, vendoring the
25
+ code, or guessing a replacement. It raises the gap to the runtime (backlog item or PR) and
26
+ pins the runtime floor that carries the fix.
27
+ 3. A re-export is unchanged in identity (`facade.name is abstractcore.module.name`) and listed in
28
+ the facade's `__all__`; the facade documents which AbstractCore version introduced the name.
29
+ 4. The facades are additive within a minor line: a name, once exported, is not removed without
30
+ a deprecation note and a major or minor bump.
31
+
32
+ ## Consequences
33
+
34
+ ### Positive
35
+ - The host's boundary test is a true gate: green means every AbstractCore access is a runtime
36
+ facade, so a Core change breaks at most one package.
37
+ - Version floors stay layered: a host pins the runtime, the runtime pins Core.
38
+
39
+ ### Negative
40
+ - A host feature that needs one new Core name waits for a runtime patch release (about 20
41
+ minutes with the release workflow), and the host's runtime floor moves with it.
42
+ - The runtime carries thin re-exports it does not use itself.
43
+
44
+ ### Neutral
45
+ - Patch releases of the runtime for facade additions are normal, not exceptional.
46
+
47
+ ## Enforcement
48
+ - Code review: a runtime PR that adds a host-facing Core name adds it to the facade's `__all__`
49
+ (and to a names list such as `email_facade.GATEWAY_NAMES` where one exists) with a one-line
50
+ comment naming the Core version and the host need.
51
+ - Hosts cite this ADR in their own boundary rule (AbstractGateway ADR 0001) and never add an
52
+ exemption to their import-boundary test for a name a facade could carry.
53
+ - A facade gap found during host work becomes a runtime backlog item or PR before the host
54
+ ships; the host's changelog names the runtime version that closes it.
55
+
56
+ ## Validation
57
+ - `tests/test_email_review_fixes.py`: the email facade's export set equals Core's plus the
58
+ runtime's additions, every `GATEWAY_NAMES` entry imports, and re-exports keep identity.
59
+ - AbstractGateway `tests/test_gateway_import_boundary.py` stays green against the released
60
+ runtime floor the gateway pins.
61
+ - Release check: the runtime's docs list each facade's host-facing names
62
+ (`docs/integrations/abstractcore.md`, `docs/api.md`).
63
+
64
+ ## Backlog links
65
+ - Originating: AbstractGateway backlog 1044 (mailbox Read and write access) needed
66
+ `resolve_srv_default`; closed by runtime 0.13.1 (`email_facade.resolve_srv_default`).
67
+ - Adoption: AbstractGateway `tests/test_gateway_import_boundary.py` (backlog 0059).
68
+
69
+ ## Related
70
+ - ADR 0001 (layered coupling), 0004 (media execution), 0005 (discovery queries), 0006 (bloc
71
+ prompt cache): the per-area facades this ADR generalises.
72
+ - `src/abstractruntime/integrations/abstractcore/email_facade.py`, `voice_facade.py`,
73
+ `discovery_facade.py`.
74
+ - AbstractGateway ADR 0001: AbstractCore access goes through AbstractRuntime facades.
@@ -20,6 +20,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
20
20
  | 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
21
21
  | 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
22
22
  | 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
23
+ | 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is a runtime facade re-export; a gap is a runtime patch, never a host import |
23
24
 
24
25
  ## Relationship to Backlog
25
26
 
@@ -34,6 +35,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
34
35
  | 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
35
36
  | 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
36
37
  | 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
38
+ | 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
37
39
 
38
40
  ## Adding New ADRs
39
41
 
@@ -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.
@@ -6228,6 +6287,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
6228
6287
  | 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
6229
6288
  | 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
6230
6289
  | 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
6290
+ | 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is a runtime facade re-export; a gap is a runtime patch, never a host import |
6231
6291
 
6232
6292
  ## Relationship to Backlog
6233
6293
 
@@ -6242,6 +6302,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
6242
6302
  | 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
6243
6303
  | 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
6244
6304
  | 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
6305
+ | 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
6245
6306
 
6246
6307
  ## Adding New ADRs
6247
6308
 
@@ -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.1"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,4 @@
1
+ ### Added
2
+
3
+ - `email_facade.resolve_srv_default` (AbstractCore's mailbox SRV lookup) is re-exported, so a host's mail code imports
4
+ it from the runtime facade like every other mail name.
@@ -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
  )