runtype 0.3.0 → 0.11.1

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 (572) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +919 -0
  3. data/README.md +118 -12
  4. data/generated/lib/runtype/agent_aliases/client.rb +153 -0
  5. data/generated/lib/runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_bindings_request.rb +17 -0
  6. data/generated/lib/runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_bindings_response.rb +19 -0
  7. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_alias_bindings_request.rb +13 -0
  8. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_alias_bindings_response.rb +19 -0
  9. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_alias_response.rb +2 -0
  10. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_response.rb +2 -0
  11. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_response_data_item.rb +2 -0
  12. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_deployments_response_data_item.rb +2 -0
  13. data/generated/lib/runtype/agent_aliases/types/post_v1agents_id_aliases_alias_rollback_response.rb +2 -0
  14. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_request.rb +21 -0
  15. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_response.rb +19 -0
  16. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_response.rb +2 -0
  17. data/generated/lib/runtype/agent_feedback/client.rb +58 -0
  18. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_request.rb +19 -0
  19. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_request_category.rb +19 -0
  20. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_response.rb +13 -0
  21. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_response_status.rb +13 -0
  22. data/generated/lib/runtype/agent_versions/client.rb +13 -1
  23. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request.rb +6 -0
  24. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment.rb +11 -0
  25. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment_action.rb +14 -0
  26. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_response.rb +1 -1
  27. data/generated/lib/runtype/agents/client.rb +127 -14
  28. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request.rb +17 -0
  29. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config.rb +59 -0
  30. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_advisor.rb +13 -0
  31. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_artifacts.rb +13 -0
  32. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_artifacts_types_item.rb +14 -0
  33. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management.rb +13 -0
  34. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_compaction.rb +23 -0
  35. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_compaction_strategy.rb +15 -0
  36. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_tool_results.rb +15 -0
  37. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_tool_results_prune_mode.rb +14 -0
  38. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_durability.rb +15 -0
  39. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_durability_forced.rb +14 -0
  40. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling.rb +15 -0
  41. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item.rb +19 -0
  42. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_message.rb +13 -0
  43. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_model.rb +17 -0
  44. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_retry.rb +11 -0
  45. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_on_error.rb +15 -0
  46. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_triggers_item.rb +11 -0
  47. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_triggers_item_type.rb +14 -0
  48. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_logging_policy.rb +15 -0
  49. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_loop_config.rb +19 -0
  50. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_memory.rb +17 -0
  51. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_memory_pointer_scope.rb +15 -0
  52. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_pii_redaction.rb +15 -0
  53. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning.rb +15 -0
  54. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens.rb +25 -0
  55. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens_reasoning_effort.rb +17 -0
  56. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens_reasoning_summary.rb +14 -0
  57. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox.rb +29 -0
  58. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_coding_agents_item.rb +13 -0
  59. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_instance_type.rb +16 -0
  60. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access.rb +15 -0
  61. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_allow.rb +13 -0
  62. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_allow_profile.rb +15 -0
  63. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_zero.rb +15 -0
  64. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_persistence.rb +15 -0
  65. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_provider.rb +14 -0
  66. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_sleep_after.rb +16 -0
  67. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_ttl.rb +16 -0
  68. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state.rb +17 -0
  69. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state_merge_strategy.rb +14 -0
  70. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state_predict_state_item.rb +15 -0
  71. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_temporal.rb +17 -0
  72. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy.rb +13 -0
  73. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor.rb +13 -0
  74. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor_end_user.rb +14 -0
  75. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor_tenant.rb +14 -0
  76. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_preset.rb +15 -0
  77. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools.rb +31 -0
  78. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval.rb +17 -0
  79. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval_choices.rb +13 -0
  80. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval_require.rb +15 -0
  81. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_code_mode_config.rb +15 -0
  82. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item.rb +25 -0
  83. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_auth.rb +21 -0
  84. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_auth_type.rb +18 -0
  85. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_transport.rb +14 -0
  86. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_per_tool_limits_value.rb +13 -0
  87. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_runtime_tools_item.rb +23 -0
  88. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_runtime_tools_item_tool_type.rb +19 -0
  89. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config.rb +33 -0
  90. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_default_execution_mode.rb +14 -0
  91. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_default_notify.rb +15 -0
  92. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_execution_modes_item.rb +14 -0
  93. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_tool_call_strategy.rb +15 -0
  94. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_tool_search.rb +15 -0
  95. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice.rb +25 -0
  96. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_eleven_labs.rb +17 -0
  97. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_endpointing.rb +13 -0
  98. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_endpointing_strategy.rb +16 -0
  99. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_interruption_mode.rb +15 -0
  100. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech.rb +15 -0
  101. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_mode.rb +15 -0
  102. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_synthesizer.rb +17 -0
  103. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_synthesizer_settings.rb +13 -0
  104. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_transcriber.rb +13 -0
  105. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response.rb +6 -0
  106. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_execution_lane.rb +14 -0
  107. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry.rb +17 -0
  108. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry_completeness.rb +16 -0
  109. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry_source.rb +13 -0
  110. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_tool_calls_response_tool_calls_item.rb +14 -0
  111. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_request.rb +2 -0
  112. data/generated/lib/runtype/agents/types/{get_v1agents_id_export_runtime_response_agent_type.rb → get_v1agents_id_executions_request_agent_source.rb} +4 -2
  113. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_response_data_item.rb +2 -0
  114. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_response_data_item_otel_producer.rb +20 -0
  115. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_request.rb +6 -0
  116. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_request_format.rb +14 -0
  117. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_request.rb +13 -0
  118. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response.rb +13 -0
  119. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data.rb +27 -0
  120. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_cost.rb +11 -0
  121. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_tokens.rb +13 -0
  122. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_tools_item.rb +17 -0
  123. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_versions_item.rb +19 -0
  124. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_window.rb +15 -0
  125. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request.rb +4 -0
  126. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_sandbox.rb +2 -0
  127. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_sandbox_coding_agents_item.rb +13 -0
  128. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools.rb +2 -0
  129. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools_runtime_tools_item.rb +4 -0
  130. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools_tool_search.rb +15 -0
  131. data/generated/lib/runtype/agents/types/post_v1agents_id_execute_request_x_runtype_concurrency.rb +1 -1
  132. data/generated/lib/runtype/agents/types/post_v1agents_request_claude_managed_config.rb +2 -0
  133. data/generated/lib/runtype/agents/types/post_v1agents_request_config_sandbox.rb +2 -0
  134. data/generated/lib/runtype/agents/types/post_v1agents_request_config_sandbox_coding_agents_item.rb +13 -0
  135. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools.rb +2 -0
  136. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools_runtime_tools_item.rb +4 -0
  137. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools_tool_search.rb +15 -0
  138. data/generated/lib/runtype/agents/types/put_v1agents_id_request_claude_managed_config.rb +2 -0
  139. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_sandbox.rb +2 -0
  140. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_sandbox_coding_agents_item.rb +13 -0
  141. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools.rb +2 -0
  142. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools_runtime_tools_item.rb +4 -0
  143. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools_tool_search.rb +15 -0
  144. data/generated/lib/runtype/agents/types/put_v1agents_id_response.rb +2 -0
  145. data/generated/lib/runtype/client.rb +25 -5
  146. data/generated/lib/runtype/client_runtime/client.rb +57 -6
  147. data/generated/lib/runtype/client_runtime/types/post_v1client_agents_agent_id_voice_prewarm_request.rb +15 -0
  148. data/generated/lib/runtype/client_runtime/types/post_v1client_chat_request_submit_mode.rb +1 -1
  149. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id.rb +1 -1
  150. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id_identity_proof.rb +19 -0
  151. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id_identity_proof_provider.rb +17 -0
  152. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three.rb +1 -1
  153. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three_identity_proof.rb +19 -0
  154. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three_identity_proof_provider.rb +17 -0
  155. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two.rb +1 -1
  156. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two_identity_proof.rb +19 -0
  157. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two_identity_proof_provider.rb +17 -0
  158. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero.rb +1 -1
  159. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero_identity_proof.rb +19 -0
  160. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero_identity_proof_provider.rb +17 -0
  161. data/generated/lib/runtype/client_runtime/types/post_v1client_init_response_durable_recovery.rb +1 -1
  162. data/generated/lib/runtype/client_tokens/types/post_v1client_tokens_request.rb +2 -0
  163. data/generated/lib/runtype/conversations/client.rb +28 -10
  164. data/generated/lib/runtype/conversations/types/get_v1conversations_id_response.rb +3 -1
  165. data/generated/lib/runtype/conversations/types/post_v1conversations_request.rb +6 -0
  166. data/generated/lib/runtype/conversations/types/post_v1conversations_response.rb +3 -1
  167. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request.rb +7 -1
  168. data/generated/lib/runtype/conversations/types/{put_v1conversations_id_request_messages_item_content_one_item_asset_ref_ref_kind.rb → put_v1conversations_id_request_messages_mode.rb} +3 -3
  169. data/generated/lib/runtype/conversations/types/put_v1conversations_id_response.rb +3 -1
  170. data/generated/lib/runtype/dispatch/client.rb +5 -4
  171. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item.rb +4 -0
  172. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_role.rb +1 -0
  173. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_tool_calls_item.rb +17 -0
  174. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_tool_results_item.rb +17 -0
  175. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item.rb +4 -0
  176. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_role.rb +1 -0
  177. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_tool_calls_item.rb +17 -0
  178. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_tool_results_item.rb +17 -0
  179. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one.rb +2 -0
  180. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_agent_sandbox.rb +2 -0
  181. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_agent_sandbox_coding_agents_item.rb +13 -0
  182. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_history.rb +14 -0
  183. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item.rb +4 -0
  184. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_role.rb +1 -0
  185. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_calls_item.rb +17 -0
  186. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_results_item.rb +17 -0
  187. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero.rb +2 -0
  188. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_agent_sandbox.rb +2 -0
  189. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_agent_sandbox_coding_agents_item.rb +13 -0
  190. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_history.rb +14 -0
  191. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item.rb +4 -0
  192. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_role.rb +1 -0
  193. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_calls_item.rb +17 -0
  194. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_results_item.rb +17 -0
  195. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item.rb +4 -0
  196. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_role.rb +1 -0
  197. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_tool_calls_item.rb +17 -0
  198. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_tool_results_item.rb +17 -0
  199. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item.rb +4 -0
  200. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_role.rb +1 -0
  201. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_tool_calls_item.rb +17 -0
  202. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_tool_results_item.rb +17 -0
  203. data/generated/lib/runtype/documentation/client.rb +2 -3
  204. data/generated/lib/runtype/documentation/types/post_v1documentation_build_instructions_request.rb +2 -0
  205. data/generated/lib/runtype/evals/client.rb +4 -1
  206. data/generated/lib/runtype/executions/client.rb +3 -1
  207. data/generated/lib/runtype/executions/types/get_v1executions_execution_id_status_response.rb +6 -0
  208. data/generated/lib/runtype/executions/types/get_v1executions_execution_id_status_response_execution_lane.rb +14 -0
  209. data/generated/lib/runtype/identity_integrations/client.rb +39 -0
  210. data/generated/lib/runtype/logs/client.rb +166 -8
  211. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_blocks_request.rb +13 -0
  212. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_blocks_response.rb +13 -0
  213. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_request.rb +11 -0
  214. data/generated/lib/runtype/logs/types/{get_v1logs_debug_response.rb → get_v1logs_context_execution_id_response.rb} +2 -2
  215. data/generated/lib/runtype/logs/types/get_v1logs_entry_request.rb +15 -0
  216. data/generated/lib/runtype/logs/types/get_v1logs_entry_response.rb +13 -0
  217. data/generated/lib/runtype/logs/types/get_v1logs_entry_response_data.rb +11 -0
  218. data/generated/lib/runtype/logs/types/get_v1logs_request.rb +8 -0
  219. data/generated/lib/runtype/logs/types/get_v1logs_response.rb +2 -0
  220. data/generated/lib/runtype/logs/types/get_v1logs_response_data.rb +2 -0
  221. data/generated/lib/runtype/logs/types/get_v1logs_response_data_live.rb +17 -0
  222. data/generated/lib/runtype/logs/types/get_v1logs_response_data_live_reason.rb +14 -0
  223. data/generated/lib/runtype/logs/types/get_v1logs_response_data_pagination.rb +2 -0
  224. data/generated/lib/runtype/logs/types/get_v1logs_response_window.rb +14 -0
  225. data/generated/lib/runtype/logs/types/get_v1logs_stats_request.rb +8 -0
  226. data/generated/lib/runtype/logs/types/get_v1logs_stats_response.rb +2 -0
  227. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_data.rb +4 -0
  228. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_data_stats_source.rb +15 -0
  229. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_window.rb +14 -0
  230. data/generated/lib/runtype/logs/types/get_v1logs_trace_conversation_conversation_id_response.rb +1 -1
  231. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_request.rb +11 -0
  232. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_response.rb +15 -0
  233. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_response_data_item.rb +19 -0
  234. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_response.rb +1 -1
  235. data/generated/lib/runtype/messaging_conversations/client.rb +2 -0
  236. data/generated/lib/runtype/messaging_conversations/types/get_v1messaging_conversations_id_messages_request.rb +2 -0
  237. data/generated/lib/runtype/model_configs/types/post_v1model_configs_request_settings_custom_model.rb +2 -0
  238. data/generated/lib/runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_mid_conversation_system_messages.rb +14 -0
  239. data/generated/lib/runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model.rb +2 -0
  240. data/generated/lib/runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_mid_conversation_system_messages.rb +14 -0
  241. data/generated/lib/runtype/products/client.rb +345 -4
  242. data/generated/lib/runtype/products/types/create_product_comment_request.rb +19 -0
  243. data/generated/lib/runtype/{conversations/types/put_v1conversations_id_request_messages_item_role.rb → products/types/create_product_comment_request_author_kind.rb} +2 -3
  244. data/generated/lib/runtype/products/types/create_product_comment_thread_request.rb +17 -0
  245. data/generated/lib/runtype/products/types/declare_product_stack_request.rb +15 -0
  246. data/generated/lib/runtype/products/types/declare_product_stack_request_source.rb +15 -0
  247. data/generated/lib/runtype/products/types/get_v1products_id_activity_request.rb +13 -0
  248. data/generated/lib/runtype/products/types/get_v1products_id_activity_response.rb +13 -0
  249. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data.rb +13 -0
  250. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item.rb +17 -0
  251. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item.rb +109 -0
  252. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_completeness.rb +17 -0
  253. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_kind.rb +14 -0
  254. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_origin.rb +15 -0
  255. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_source.rb +14 -0
  256. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_status.rb +18 -0
  257. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_error.rb +11 -0
  258. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item.rb +19 -0
  259. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item.rb +15 -0
  260. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_agent_mode.rb +45 -0
  261. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields.rb +39 -0
  262. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields_metadata_schema.rb +11 -0
  263. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_error.rb +11 -0
  264. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_source.rb +14 -0
  265. data/generated/lib/runtype/products/types/get_v1products_id_comments_request.rb +19 -0
  266. data/generated/lib/runtype/products/types/get_v1products_id_comments_request_status.rb +15 -0
  267. data/generated/lib/runtype/products/types/get_v1products_id_response.rb +2 -0
  268. data/generated/lib/runtype/products/types/get_v1products_id_response_editor_context.rb +6 -0
  269. data/generated/lib/runtype/products/types/get_v1products_id_response_editor_context_flow_steps_map_value_item.rb +2 -0
  270. data/generated/lib/runtype/products/types/get_v1products_id_surfaces_surface_id_response.rb +2 -0
  271. data/generated/lib/runtype/products/types/get_v1products_response_data_item_capabilities_item.rb +4 -0
  272. data/generated/lib/runtype/products/types/post_v1products_ensure_request_definition_spec_internal_docs_resources_item.rb +6 -0
  273. data/generated/lib/runtype/products/types/post_v1products_request_canvas.rb +2 -0
  274. data/generated/lib/runtype/products/types/post_v1products_request_spec.rb +2 -0
  275. data/generated/lib/runtype/products/types/post_v1products_request_spec_internal_docs_resources_item.rb +6 -0
  276. data/generated/lib/runtype/products/types/put_v1products_id_request_canvas.rb +2 -0
  277. data/generated/lib/runtype/products/types/put_v1products_id_request_spec.rb +2 -0
  278. data/generated/lib/runtype/products/types/put_v1products_id_request_spec_internal_docs_resources_item.rb +6 -0
  279. data/generated/lib/runtype/products/types/put_v1products_id_surfaces_surface_id_entry_point_request.rb +15 -0
  280. data/generated/lib/runtype/products/types/put_v1products_id_surfaces_surface_id_entry_point_response.rb +13 -0
  281. data/generated/lib/runtype/products/types/update_product_comment_thread_request.rb +15 -0
  282. data/generated/lib/runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item.rb +2 -0
  283. data/generated/lib/runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item_mid_conversation_system_messages.rb +14 -0
  284. data/generated/lib/runtype/question_sets/client.rb +416 -0
  285. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_request.rb +11 -0
  286. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_resolved_request.rb +13 -0
  287. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_response.rb +13 -0
  288. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_request.rb +11 -0
  289. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_response.rb +11 -0
  290. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_version_number_calibrations_request.rb +17 -0
  291. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_version_number_calibrations_response.rb +13 -0
  292. data/generated/lib/runtype/question_sets/types/get_v1question_sets_request.rb +17 -0
  293. data/generated/lib/runtype/question_sets/types/get_v1question_sets_request_direction.rb +14 -0
  294. data/generated/lib/runtype/question_sets/types/get_v1question_sets_response.rb +13 -0
  295. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request.rb +17 -0
  296. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request_record.rb +15 -0
  297. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request_record_per_question_value.rb +19 -0
  298. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_response.rb +13 -0
  299. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_publish_request.rb +13 -0
  300. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_publish_response.rb +13 -0
  301. data/generated/lib/runtype/question_sets/types/post_v1question_sets_request.rb +21 -0
  302. data/generated/lib/runtype/question_sets/types/post_v1question_sets_response.rb +13 -0
  303. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_request.rb +21 -0
  304. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_response.rb +13 -0
  305. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_response_version.rb +30 -0
  306. data/generated/lib/runtype/runs/client.rb +150 -0
  307. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request.rb +15 -0
  308. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request_overlay.rb +14 -0
  309. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request_view.rb +14 -0
  310. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_response.rb +11 -0
  311. data/generated/lib/runtype/runs/types/get_v1runs_request.rb +47 -0
  312. data/generated/lib/runtype/runs/types/get_v1runs_request_include_children.rb +14 -0
  313. data/generated/lib/runtype/runs/types/get_v1runs_request_overlay.rb +14 -0
  314. data/generated/lib/runtype/runs/types/get_v1runs_request_source.rb +14 -0
  315. data/generated/lib/runtype/runs/types/get_v1runs_request_status.rb +15 -0
  316. data/generated/lib/runtype/runs/types/get_v1runs_request_view.rb +14 -0
  317. data/generated/lib/runtype/runs/types/get_v1runs_response.rb +15 -0
  318. data/generated/lib/runtype/runs/types/get_v1runs_response_pagination.rb +19 -0
  319. data/generated/lib/runtype/runs/types/get_v1runs_response_window.rb +14 -0
  320. data/generated/lib/runtype/schedules/client.rb +97 -0
  321. data/generated/lib/runtype/schedules/types/get_v1schedules_id_runs_response_data_item.rb +2 -0
  322. data/generated/lib/runtype/schedules/types/get_v1schedules_pull_request.rb +19 -0
  323. data/generated/lib/runtype/schedules/types/get_v1schedules_runs_all_response_data_item.rb +2 -0
  324. data/generated/lib/runtype/schedules/types/post_v1schedules_ensure_request.rb +23 -0
  325. data/generated/lib/runtype/schedules/types/post_v1schedules_ensure_request_on_conflict.rb +14 -0
  326. data/generated/lib/runtype/skills/client.rb +39 -0
  327. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_request.rb +11 -0
  328. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response.rb +11 -0
  329. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response_data_item.rb +25 -0
  330. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response_data_item_agent.rb +15 -0
  331. data/generated/lib/runtype/surfaces/client.rb +48 -0
  332. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound.rb +16 -0
  333. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value.rb +13 -0
  334. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value_channel_response_mode.rb +15 -0
  335. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value_eagerness.rb +15 -0
  336. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_response_mode.rb +15 -0
  337. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_context_backfill.rb +19 -0
  338. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_context_backfill_mode.rb +15 -0
  339. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_eagerness.rb +15 -0
  340. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_keywords.rb +15 -0
  341. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_on_uncertain.rb +14 -0
  342. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_request.rb +13 -0
  343. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_response.rb +19 -0
  344. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_response_provider.rb +15 -0
  345. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_response.rb +2 -0
  346. data/generated/lib/runtype/telemetry/client.rb +58 -0
  347. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_request.rb +11 -0
  348. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response.rb +27 -0
  349. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_admission.rb +17 -0
  350. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_errors_item.rb +13 -0
  351. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_status.rb +16 -0
  352. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers.rb +15 -0
  353. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_canonical.rb +21 -0
  354. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_hot.rb +20 -0
  355. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_raw.rb +21 -0
  356. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_totals.rb +27 -0
  357. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_trace.rb +23 -0
  358. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_trace_delivery.rb +23 -0
  359. data/generated/lib/runtype/tools/types/post_v1tools_flows_flow_id_convert_to_tool_response_validation.rb +2 -0
  360. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_request.rb +2 -0
  361. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_response.rb +3 -7
  362. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_response_error.rb +19 -0
  363. data/generated/lib/runtype/tools/types/{post_v1tools_id_execute_response_status.rb → post_v1tools_id_execute_response_error_status.rb} +1 -1
  364. data/generated/lib/runtype/tools/types/post_v1tools_id_test_response.rb +3 -7
  365. data/generated/lib/runtype/tools/types/post_v1tools_id_test_response_error.rb +19 -0
  366. data/generated/lib/runtype/tools/types/{post_v1tools_id_test_response_status.rb → post_v1tools_id_test_response_error_status.rb} +1 -1
  367. data/generated/lib/runtype/tools/types/post_v1tools_response_validation.rb +2 -0
  368. data/generated/lib/runtype/tools/types/put_v1tools_id_response_validation.rb +2 -0
  369. data/generated/lib/runtype/types/agent_ensure_capability.rb +21 -0
  370. data/generated/lib/runtype/types/agent_ensure_capability_change.rb +17 -0
  371. data/generated/lib/runtype/types/agent_ensure_capability_change_action.rb +14 -0
  372. data/generated/lib/runtype/types/agent_ensure_capability_change_kind.rb +13 -0
  373. data/generated/lib/runtype/types/agent_ensure_deploy_target.rb +2 -0
  374. data/generated/lib/runtype/types/agent_ensure_response_changed_keys.rb +4 -0
  375. data/generated/lib/runtype/types/agent_ensure_response_version_id.rb +4 -0
  376. data/generated/lib/runtype/types/agent_ensure_skill_binding.rb +13 -0
  377. data/generated/lib/runtype/types/agent_ensure_skill_binding_change.rb +17 -0
  378. data/generated/lib/runtype/types/agent_ensure_skill_binding_change_action.rb +14 -0
  379. data/generated/lib/runtype/types/agent_pull_response.rb +4 -0
  380. data/generated/lib/runtype/types/agent_pull_response_definition_config_sandbox.rb +2 -0
  381. data/generated/lib/runtype/types/agent_pull_response_definition_config_sandbox_coding_agents_item.rb +11 -0
  382. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools.rb +2 -0
  383. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools_runtime_tools_item.rb +4 -0
  384. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools_tool_search.rb +13 -0
  385. data/generated/lib/runtype/types/builtin_tool_execute_result.rb +15 -0
  386. data/generated/lib/runtype/types/channel_context_decision.rb +17 -0
  387. data/generated/lib/runtype/types/channel_context_decision_capability.rb +15 -0
  388. data/generated/lib/runtype/types/channel_context_decision_capability_outcome.rb +14 -0
  389. data/generated/lib/runtype/types/channel_context_decision_decision.rb +14 -0
  390. data/generated/lib/runtype/types/channel_context_decision_failure.rb +17 -0
  391. data/generated/lib/runtype/types/channel_context_label.rb +17 -0
  392. data/generated/lib/runtype/types/channel_context_label_label.rb +13 -0
  393. data/generated/lib/runtype/types/channel_context_label_source.rb +15 -0
  394. data/generated/lib/runtype/types/channel_context_message.rb +25 -0
  395. data/generated/lib/runtype/types/channel_context_message_author_kind.rb +13 -0
  396. data/generated/lib/runtype/types/collection_lookup_failed_error.rb +17 -0
  397. data/generated/lib/runtype/types/collection_lookup_failed_error_code.rb +11 -0
  398. data/generated/lib/runtype/types/conflict_error_body_candidate_count.rb +21 -0
  399. data/generated/lib/runtype/types/conflict_error_body_candidate_count_code.rb +11 -0
  400. data/generated/lib/runtype/types/context_blocks.rb +11 -0
  401. data/generated/lib/runtype/types/context_blocks_blocks_item.rb +13 -0
  402. data/generated/lib/runtype/types/context_manifest_entry.rb +27 -0
  403. data/generated/lib/runtype/types/context_manifest_entry_category.rb +16 -0
  404. data/generated/lib/runtype/types/context_manifest_entry_flags_item.rb +13 -0
  405. data/generated/lib/runtype/types/context_manifest_entry_kind.rb +19 -0
  406. data/generated/lib/runtype/types/context_manifest_entry_role.rb +14 -0
  407. data/generated/lib/runtype/types/context_snapshot.rb +33 -0
  408. data/generated/lib/runtype/types/context_snapshot_removed_since_previous_item.rb +11 -0
  409. data/generated/lib/runtype/types/context_snapshot_removed_since_previous_item_reason.rb +14 -0
  410. data/generated/lib/runtype/types/context_snapshot_reported.rb +13 -0
  411. data/generated/lib/runtype/types/context_snapshots.rb +13 -0
  412. data/generated/lib/runtype/types/conversation_message_author.rb +16 -0
  413. data/generated/lib/runtype/types/conversation_message_author_type.rb +14 -0
  414. data/generated/lib/runtype/types/conversation_modified_error.rb +13 -0
  415. data/generated/lib/runtype/types/conversation_modified_error_code.rb +11 -0
  416. data/generated/lib/runtype/types/conversation_source.rb +14 -0
  417. data/generated/lib/runtype/types/conversation_trace.rb +17 -0
  418. data/generated/lib/runtype/types/conversation_trace_executions_item.rb +13 -0
  419. data/generated/lib/runtype/types/conversation_trace_produced_by.rb +38 -0
  420. data/generated/lib/runtype/types/conversation_trace_produced_by_source.rb +12 -0
  421. data/generated/lib/runtype/types/conversation_trace_truncation.rb +13 -0
  422. data/generated/lib/runtype/types/conversation_trace_truncation_reason.rb +11 -0
  423. data/generated/lib/runtype/types/conversation_transcript_message.rb +23 -0
  424. data/generated/lib/runtype/types/conversation_transcript_message_content.rb +14 -0
  425. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item.rb +21 -0
  426. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_asset_ref.rb +19 -0
  427. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_asset_ref_ref_kind.rb +12 -0
  428. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_file.rb +13 -0
  429. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_image.rb +11 -0
  430. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_reasoning.rb +11 -0
  431. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_text.rb +9 -0
  432. data/generated/lib/runtype/types/conversation_transcript_message_role.rb +14 -0
  433. data/generated/lib/runtype/types/conversation_transcript_message_tool_calls_item.rb +15 -0
  434. data/generated/lib/runtype/types/conversation_transcript_message_tool_results_item.rb +15 -0
  435. data/generated/lib/runtype/types/create_voice_agent_draft_response.rb +11 -0
  436. data/generated/lib/runtype/types/declare_product_stack_response.rb +15 -0
  437. data/generated/lib/runtype/types/declare_product_stack_response_source.rb +13 -0
  438. data/generated/lib/runtype/types/dispatch_agent_json_response.rb +6 -0
  439. data/generated/lib/runtype/types/dispatch_agent_json_response_agent_target_resolution.rb +13 -0
  440. data/generated/lib/runtype/types/dispatch_detached_tool_output_json_response.rb +6 -0
  441. data/generated/lib/runtype/types/dispatch_detached_tool_output_json_response_agent_target_resolution.rb +13 -0
  442. data/generated/lib/runtype/types/dispatch_tool_output_continuation_json_response.rb +6 -0
  443. data/generated/lib/runtype/types/dispatch_tool_output_continuation_json_response_agent_target_resolution.rb +13 -0
  444. data/generated/lib/runtype/types/eval_run_scores_response.rb +2 -0
  445. data/generated/lib/runtype/types/eval_run_scores_response_cases_item.rb +2 -0
  446. data/generated/lib/runtype/types/eval_run_scores_response_cases_item_failure_kind.rb +11 -0
  447. data/generated/lib/runtype/types/eval_suite_detail.rb +2 -0
  448. data/generated/lib/runtype/types/eval_suite_detail_warnings_item.rb +13 -0
  449. data/generated/lib/runtype/types/eval_suite_latest_run.rb +2 -0
  450. data/generated/lib/runtype/types/eval_suite_summary.rb +2 -0
  451. data/generated/lib/runtype/types/eval_suite_summary_warnings_item.rb +13 -0
  452. data/generated/lib/runtype/types/execution_stream_event.rb +4 -0
  453. data/generated/lib/runtype/types/execution_stream_event_model_call_complete.rb +41 -0
  454. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_attributes_value.rb +15 -0
  455. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_subagent.rb +13 -0
  456. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_tokens.rb +17 -0
  457. data/generated/lib/runtype/types/execution_stream_event_model_call_start.rb +29 -0
  458. data/generated/lib/runtype/types/execution_stream_event_model_call_start_subagent.rb +13 -0
  459. data/generated/lib/runtype/types/execution_stream_event_turn_complete.rb +2 -0
  460. data/generated/lib/runtype/types/execution_stream_event_turn_complete_attributes_value.rb +15 -0
  461. data/generated/lib/runtype/types/external_observed_approvals.rb +17 -0
  462. data/generated/lib/runtype/types/external_observed_approvals_availability.rb +11 -0
  463. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item.rb +23 -0
  464. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_decision.rb +14 -0
  465. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item.rb +15 -0
  466. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source.rb +15 -0
  467. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source_attribute.rb +11 -0
  468. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source_kind.rb +11 -0
  469. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_state.rb +13 -0
  470. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_raw_states_item.rb +13 -0
  471. data/generated/lib/runtype/types/identity_assertion_jwks.rb +9 -0
  472. data/generated/lib/runtype/types/identity_assertion_public_jwk.rb +21 -0
  473. data/generated/lib/runtype/types/judgment_calibration_record.rb +23 -0
  474. data/generated/lib/runtype/types/judgment_calibration_record_source.rb +12 -0
  475. data/generated/lib/runtype/types/list_product_comments_response.rb +13 -0
  476. data/generated/lib/runtype/types/product_canvas_block.rb +23 -0
  477. data/generated/lib/runtype/types/product_comment.rb +23 -0
  478. data/generated/lib/runtype/types/product_comment_author_kind.rb +12 -0
  479. data/generated/lib/runtype/types/product_comment_thread.rb +27 -0
  480. data/generated/lib/runtype/types/product_declared_stack.rb +15 -0
  481. data/generated/lib/runtype/types/product_pull_response_definition_spec_internal_docs_resources_item.rb +6 -0
  482. data/generated/lib/runtype/types/product_stack.rb +18 -0
  483. data/generated/lib/runtype/types/product_stack_declared.rb +14 -0
  484. data/generated/lib/runtype/types/product_stack_detected.rb +12 -0
  485. data/generated/lib/runtype/types/product_stack_item.rb +21 -0
  486. data/generated/lib/runtype/types/question_set.rb +25 -0
  487. data/generated/lib/runtype/types/question_set_error.rb +13 -0
  488. data/generated/lib/runtype/types/question_set_list_item.rb +29 -0
  489. data/generated/lib/runtype/types/question_set_version.rb +27 -0
  490. data/generated/lib/runtype/types/resolved_question_set.rb +21 -0
  491. data/generated/lib/runtype/types/resolved_question_set_calibration.rb +17 -0
  492. data/generated/lib/runtype/types/resolved_question_set_calibration_source.rb +12 -0
  493. data/generated/lib/runtype/types/run_eval_response.rb +2 -0
  494. data/generated/lib/runtype/types/run_eval_response_cases_item.rb +2 -0
  495. data/generated/lib/runtype/types/run_eval_response_cases_item_failure_kind.rb +11 -0
  496. data/generated/lib/runtype/types/run_list_pagination.rb +15 -0
  497. data/generated/lib/runtype/types/run_list_row.rb +107 -0
  498. data/generated/lib/runtype/types/run_list_row_completeness.rb +15 -0
  499. data/generated/lib/runtype/types/run_list_row_kind.rb +12 -0
  500. data/generated/lib/runtype/types/run_list_row_origin.rb +13 -0
  501. data/generated/lib/runtype/types/run_list_row_source.rb +12 -0
  502. data/generated/lib/runtype/types/run_list_row_status.rb +16 -0
  503. data/generated/lib/runtype/types/runtime_exported_skill.rb +21 -0
  504. data/generated/lib/runtype/types/schedule_ensure_conflict.rb +17 -0
  505. data/generated/lib/runtype/types/schedule_ensure_conflict_code.rb +12 -0
  506. data/generated/lib/runtype/types/schedule_ensure_definition.rb +27 -0
  507. data/generated/lib/runtype/types/schedule_ensure_definition_execution_options.rb +27 -0
  508. data/generated/lib/runtype/types/schedule_ensure_definition_execution_options_logging_policy.rb +13 -0
  509. data/generated/lib/runtype/types/schedule_ensure_definition_trigger.rb +15 -0
  510. data/generated/lib/runtype/types/schedule_ensure_definition_trigger_type.rb +12 -0
  511. data/generated/lib/runtype/types/schedule_ensure_hash_mismatch.rb +13 -0
  512. data/generated/lib/runtype/types/schedule_ensure_hash_mismatch_code.rb +11 -0
  513. data/generated/lib/runtype/types/schedule_ensure_response.rb +15 -0
  514. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys.rb +19 -0
  515. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys_changes.rb +13 -0
  516. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys_result.rb +11 -0
  517. data/generated/lib/runtype/types/schedule_ensure_response_one.rb +9 -0
  518. data/generated/lib/runtype/types/schedule_ensure_response_one_result.rb +11 -0
  519. data/generated/lib/runtype/types/schedule_ensure_response_zero.rb +13 -0
  520. data/generated/lib/runtype/types/schedule_ensure_response_zero_result.rb +13 -0
  521. data/generated/lib/runtype/types/schedule_ensure_target.rb +15 -0
  522. data/generated/lib/runtype/types/schedule_pull_response.rb +17 -0
  523. data/generated/lib/runtype/types/schedule_run_link.rb +15 -0
  524. data/generated/lib/runtype/types/schedule_run_link_kind.rb +13 -0
  525. data/generated/lib/runtype/types/tool_execute_error.rb +13 -0
  526. data/generated/lib/runtype/types/trace_log_entry.rb +145 -0
  527. data/generated/lib/runtype/types/trace_log_entry_estimated_context_breakdown.rb +15 -0
  528. data/generated/lib/runtype/types/trace_log_entry_estimated_context_breakdown_categories_value.rb +11 -0
  529. data/generated/lib/runtype/types/trace_log_entry_estimated_cost.rb +14 -0
  530. data/generated/lib/runtype/types/trace_log_entry_level.rb +14 -0
  531. data/generated/lib/runtype/types/trace_log_entry_logging_policy.rb +11 -0
  532. data/generated/lib/runtype/types/trace_log_entry_otlp_incomplete_activity.rb +13 -0
  533. data/generated/lib/runtype/types/trace_log_entry_otlp_instrumentation_warning.rb +11 -0
  534. data/generated/lib/runtype/types/trace_log_entry_otlp_record_kind.rb +13 -0
  535. data/generated/lib/runtype/types/trace_log_entry_status.rb +16 -0
  536. data/generated/lib/runtype/types/trace_log_entry_type.rb +19 -0
  537. data/generated/lib/runtype/types/trace_node.rb +35 -0
  538. data/generated/lib/runtype/types/trace_node_lifecycle.rb +14 -0
  539. data/generated/lib/runtype/types/trace_node_node_type.rb +16 -0
  540. data/generated/lib/runtype/types/trace_produced_by.rb +37 -0
  541. data/generated/lib/runtype/types/trace_produced_by_source.rb +12 -0
  542. data/generated/lib/runtype/types/trace_tree.rb +41 -0
  543. data/generated/lib/runtype/types/trace_tree_availability.rb +13 -0
  544. data/generated/lib/runtype/types/trace_tree_availability_reason.rb +11 -0
  545. data/generated/lib/runtype/types/trace_tree_child_truncation.rb +15 -0
  546. data/generated/lib/runtype/types/trace_tree_child_truncation_reason.rb +11 -0
  547. data/generated/lib/runtype/types/trace_tree_source.rb +13 -0
  548. data/generated/lib/runtype/types/trace_tree_totals_source.rb +12 -0
  549. data/generated/lib/runtype/types/trace_tree_truncation.rb +13 -0
  550. data/generated/lib/runtype/types/trace_tree_truncation_reason.rb +11 -0
  551. data/generated/lib/runtype/users/types/get_v1users_profile_response_features.rb +2 -0
  552. data/generated/lib/runtype.rb +3506 -2863
  553. data/lib/runtype/agent_ensure.rb +97 -10
  554. data/lib/runtype/agent_release_aliases.rb +146 -2
  555. data/lib/runtype/client.rb +22 -1
  556. data/lib/runtype/config_ensure.rb +272 -0
  557. data/lib/runtype/content_hash.rb +257 -0
  558. data/lib/runtype/detached_follow.rb +12 -0
  559. data/lib/runtype/errors.rb +56 -10
  560. data/lib/runtype/local_tool_runner.rb +3 -1
  561. data/lib/runtype/raw_client_timeout.rb +56 -0
  562. data/lib/runtype/sdk_version.rb +2 -1
  563. data/lib/runtype.rb +3 -0
  564. metadata +422 -15
  565. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_response.rb +0 -25
  566. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item.rb +0 -17
  567. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content.rb +0 -15
  568. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item.rb +0 -21
  569. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_asset_ref.rb +0 -21
  570. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_file.rb +0 -15
  571. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_image.rb +0 -13
  572. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_text.rb +0 -11
@@ -16,6 +16,10 @@ module Runtype
16
16
  "use deploy: { alias: \"live\" } instead of release: \"publish\", " \
17
17
  "and omit both to save without activating."
18
18
 
19
+ # The keys a `version:` hash may carry, mirroring the API's strict
20
+ # `EnsureVersionMetadata` schema (apps/api/src/lib/ensure-version-metadata.ts).
21
+ VERSION_METADATA_KEYS = %i[label notes].freeze
22
+
19
23
  # Idempotently makes the platform's definition of this agent match
20
24
  # `definition`. Identity is the agent name within the API key's account
21
25
  # scope. Hash-first: probes with the local content hash and only ships the
@@ -32,9 +36,22 @@ module Runtype
32
36
  # `deploy:`: `"publish"` also re-aims the `live` alias; default `"none"`.
33
37
  # @param deploy [Hash, String, Symbol, nil] activates the saved version at a
34
38
  # release alias, e.g. `{ alias: "pr-482" }` or the bare `"live"`. Omit
35
- # both `release:` and `deploy:` to save without activating.
39
+ # both `release:` and `deploy:` to save without activating. `bindings:`
40
+ # (`{ "API_URL" => "https://staging..." }`) replaces the alias's
41
+ # per-alias secret overrides, as in the TypeScript SDK.
36
42
  # @param expected_remote_hash [String, nil] binds a dry run to its apply:
37
43
  # the write proceeds only if the remote still hashes to this value.
44
+ # @param version [Hash, nil] provenance recorded on the version row this
45
+ # converge appends, e.g. `{ label: "a1b2c3d", notes: "CI run 4821" }`.
46
+ # Omit to keep the default `"sdk-ensure"` label and the server's notes.
47
+ # @param skills [Array<Hash>, nil] the complete set of skills bound to the
48
+ # agent, in load order, e.g. `[{ name: "refund-policy", version: 3 }]`.
49
+ # `version:` pins a skill versionNumber; omit it to follow the published
50
+ # version. Bound skills absent here are unbound; `nil` leaves them alone.
51
+ # @param capabilities [Array<Hash>, nil] the complete set of capabilities in
52
+ # display order, e.g. `[{ toolName: "lookup_order", flow: "Order Lookup" }]`.
53
+ # Each names exactly one `flow:`, `agent:` or `tool:` source by name.
54
+ # Capabilities absent here are removed; `nil` leaves them alone.
38
55
  # @param request_options [Hash] see {Runtype::Client#dispatch}.
39
56
  # @return [Hash] `{"result" => "unchanged"|"created"|"updated", "agentId",
40
57
  # "versionId", "contentHash"}`, or for a dry run `{"result" => "plan",
@@ -43,10 +60,13 @@ module Runtype
43
60
  # @raise [Runtype::EnsureConflictError] on a 409 (`external_modification`
44
61
  # or `remote_changed`).
45
62
  # @raise [Runtype::DriftError] with `expect_no_changes:` when the plan is
46
- # not `"none"`.
47
- # @raise [ArgumentError] when both `release:` and `deploy:` are given.
63
+ # not `"none"`, would change a skill binding or, with `release:` or
64
+ # `deploy:`, would move the alias or change its binding names.
65
+ # @raise [ArgumentError] when both `release:` and `deploy:` are given, or
66
+ # when `version:` carries a key other than `label:` and `notes:`.
48
67
  def ensure_agent(definition, dry_run: false, expect_no_changes: false, on_conflict: nil, release: nil,
49
- deploy: nil, expected_remote_hash: nil, request_options: {})
68
+ deploy: nil, expected_remote_hash: nil, version: nil, skills: nil, capabilities: nil,
69
+ request_options: {})
50
70
  raise ArgumentError, RELEASE_DEPLOY_CONFLICT_MESSAGE if release && deploy
51
71
 
52
72
  definition = Runtype::AgentDefinition.from(definition)
@@ -54,7 +74,10 @@ module Runtype
54
74
  onConflict: on_conflict&.to_s,
55
75
  release: release&.to_s,
56
76
  deploy: deploy_intent(deploy),
57
- expectedRemoteHash: expected_remote_hash
77
+ expectedRemoteHash: expected_remote_hash,
78
+ version: version_metadata(version),
79
+ skills: skills&.map(&:to_h),
80
+ capabilities: capabilities&.map(&:to_h)
58
81
  }.compact
59
82
 
60
83
  if dry_run || expect_no_changes
@@ -64,7 +87,7 @@ module Runtype
64
87
  unless plan["result"] == "plan"
65
88
  raise Runtype::Error, "Expected a plan result from dryRun, got #{plan["result"].inspect}"
66
89
  end
67
- raise Runtype::DriftError.new(plan, name: definition.name) if expect_no_changes && plan["changes"] != "none"
90
+ raise Runtype::DriftError.new(plan, name: definition.name) if expect_no_changes && drifted?(plan, passthrough)
68
91
 
69
92
  return plan
70
93
  end
@@ -98,13 +121,28 @@ module Runtype
98
121
 
99
122
  private
100
123
 
124
+ # Whether a dry-run plan fails the drift gate: content or skill-binding
125
+ # changes, or, when the converge asked to activate an alias, a pointer move
126
+ # or a binding-name change at that alias.
127
+ #
128
+ # @param plan [Hash]
129
+ # @param passthrough [Hash] the options this converge sends.
130
+ # @return [Boolean]
131
+ def drifted?(plan, passthrough)
132
+ return true if plan["changes"] != "none" || Runtype::DriftError.skill_changes(plan).any?
133
+
134
+ deploy_requested = passthrough.key?(:deploy) || passthrough[:release] == "publish"
135
+ deploy_requested && Runtype::DriftError.deployment_changes(plan).any?
136
+ end
137
+
101
138
  # Normalizes the two accepted spellings of `deploy:` into the wire shape.
102
- # A bare String or Symbol names the alias; a Hash may spell its key either
139
+ # A bare String or Symbol names the alias; a Hash may spell its keys either
103
140
  # way. The alias name itself is never resolved client-side.
104
141
  #
105
142
  # @param deploy [Hash, String, Symbol, nil]
106
- # @return [Hash, nil] `{ alias: "<name>" }`, or nil when nothing was asked.
107
- # @raise [ArgumentError] when a Hash carries no alias name.
143
+ # @return [Hash, nil] `{ alias: "<name>", bindings: {...}? }`, or nil when nothing was asked.
144
+ # @raise [ArgumentError] when a Hash carries no alias name, or a supplied
145
+ # `bindings:` (nil included) is not a Hash of String names to String values.
108
146
  def deploy_intent(deploy)
109
147
  return nil if deploy.nil?
110
148
  return { alias: deploy.to_s } unless deploy.is_a?(Hash)
@@ -112,7 +150,56 @@ module Runtype
112
150
  name = deploy[:alias] || deploy["alias"]
113
151
  raise ArgumentError, "deploy: needs an alias name, e.g. deploy: { alias: \"live\" }." if name.nil?
114
152
 
115
- { alias: name.to_s }
153
+ return { alias: name.to_s } unless deploy.key?(:bindings) || deploy.key?("bindings")
154
+
155
+ bindings = deploy.key?(:bindings) ? deploy[:bindings] : deploy["bindings"]
156
+ { alias: name.to_s, bindings: deploy_bindings(bindings) }
157
+ end
158
+
159
+ # Validates `deploy: { bindings: }`, the per-alias `{{secret:NAME}}`
160
+ # overrides. Names may be Symbols; values must already be Strings so a
161
+ # stray nil or number fails here rather than binding its `to_s`.
162
+ #
163
+ # @param bindings [Hash]
164
+ # @return [Hash{String => String}]
165
+ # @raise [ArgumentError] on a non-Hash or a non-String value.
166
+ def deploy_bindings(bindings)
167
+ unless bindings.is_a?(Hash)
168
+ raise ArgumentError,
169
+ "deploy: bindings: needs a Hash of secret names to values, e.g. { \"API_URL\" => \"https://...\" }."
170
+ end
171
+
172
+ bindings.each_with_object({}) do |(key, value), acc|
173
+ unless (key.is_a?(String) || key.is_a?(Symbol)) && value.is_a?(String)
174
+ raise ArgumentError,
175
+ "deploy: bindings: maps String names to String values; got #{key.inspect} => #{value.class}."
176
+ end
177
+
178
+ acc[key.to_s] = value
179
+ end
180
+ end
181
+
182
+ # Normalizes `version:` into the wire shape. Keys may be Symbols or Strings;
183
+ # an unknown key raises here rather than reaching the server's strict 400.
184
+ # A hash whose values are all nil is treated as omitted, so
185
+ # `version: { label: ENV["GIT_SHA"] }` outside CI still saves — the same
186
+ # reading the API gives an empty label, which falls back to `"sdk-ensure"`.
187
+ #
188
+ # @param version [Hash, nil]
189
+ # @return [Hash, nil] `{ label:, notes: }`, or nil when nothing was asked.
190
+ # @raise [ArgumentError] on a non-Hash or an unrecognized key.
191
+ def version_metadata(version)
192
+ return nil if version.nil?
193
+ raise ArgumentError, "version: needs a Hash, e.g. version: { label: \"a1b2c3d\" }." unless version.is_a?(Hash)
194
+
195
+ metadata = version.each_with_object({}) do |(key, value), acc|
196
+ name = key.to_sym
197
+ raise ArgumentError, "version: accepts label: and notes:, not #{key.inspect}." unless
198
+ VERSION_METADATA_KEYS.include?(name)
199
+
200
+ acc[name] = value.to_s unless value.nil?
201
+ end
202
+ metadata.empty? ? nil : metadata
116
203
  end
117
204
 
118
205
  # @return [Hash{String => String}] `name:localHash` => server hash, so a
@@ -1,11 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "openssl"
4
+ require "socket"
5
+ require "timeout"
6
+
3
7
  module Runtype
4
8
  # Release aliases and deployment receipts on {Runtype::Client}. An agent runs
5
9
  # an immutable version; a named mutable alias (`live`, `pr-482`) selects which
6
10
  # one, and every activation appends a deployment receipt. Protocol:
7
11
  # `docs/adr/0025-agent-release-aliases.md`.
8
12
  module AgentReleaseAliases
13
+ # The fields a `promotion:` hash may carry, mirroring the API's strict
14
+ # `AgentDeploymentPromotion` schema (apps/api/src/routes/agents/alias-routes.ts)
15
+ # and the generated {Runtype::Types::AgentDeploymentPromotion} model.
16
+ PROMOTION_FIELDS = %i[source_agent_id source_version_id source_content_hash source_commit].freeze
17
+
18
+ # The failures one {#archive_agent_alias_everywhere} row may absorb: the
19
+ # curated API tree, plus the transport exceptions Net::HTTP raises below
20
+ # {Runtype.wrap_errors} (the same set {Runtype::Streaming::Connection}
21
+ # translates). Everything else is an SDK defect rather than a per-agent
22
+ # outcome and aborts the sweep loudly instead of becoming a failure row.
23
+ SWEEP_ISOLATED_ERRORS = [
24
+ Runtype::Error, Timeout::Error, OpenSSL::SSL::SSLError, SocketError, SystemCallError, IOError
25
+ ].freeze
26
+
9
27
  # The named pointers of one agent: `live` first, then the preview aliases by
10
28
  # name. Archived aliases are omitted unless asked for. Omitting `limit:`
11
29
  # returns every pointer; supplying it pages through the same order.
@@ -52,13 +70,20 @@ module Runtype
52
70
  # sent as `If-Match`; required when moving an existing `live` pointer.
53
71
  # @param idempotency_key [String, nil] replays the same activation safely.
54
72
  # @param reason [String, nil] recorded on the receipt.
73
+ # @param promotion [Hash, Runtype::Types::AgentDeploymentPromotion, nil] the
74
+ # source-organization ids and hashes a cross-organization promotion came
75
+ # from, e.g. `{ source_version_id: "agv_9", source_commit: sha }`, linked
76
+ # on the receipt. Provenance only: it authorizes nothing, and the
77
+ # activating credentials alone decide what the activation may do.
55
78
  # @param request_options [Hash]
56
79
  # @return [Runtype::AgentAliases::Types::PutV1AgentsIDAliasesAliasResponse]
80
+ # @raise [ArgumentError] when `promotion:` carries an unrecognized key.
57
81
  def activate_agent_alias(agent_id, alias_name, version_id:, revision: nil, idempotency_key: nil, reason: nil,
58
- request_options: {})
82
+ promotion: nil, request_options: {})
59
83
  params = {
60
84
  id: agent_id, alias_: alias_name, version_id: version_id,
61
- if_match: revision, idempotency_key: idempotency_key, reason: reason
85
+ if_match: revision, idempotency_key: idempotency_key, reason: reason,
86
+ promotion: promotion_provenance(promotion)
62
87
  }.compact
63
88
  Runtype.wrap_errors do
64
89
  release_alias_client.activate_a_version_at_a_release_alias(request_options: request_options, **params)
@@ -127,6 +152,59 @@ module Runtype
127
152
  end
128
153
  end
129
154
 
155
+ # Every agent in the caller's organization carrying a pointer with this
156
+ # name, each with the revision to quote back as `If-Match`. This is the read
157
+ # a "pull request closed" cleanup makes before archiving each pointer; the
158
+ # per-agent list would need every agent id first. Unpaginated, and `live` is
159
+ # readable here like any other name.
160
+ #
161
+ # @param alias_name [String] e.g. `"pr-482"`.
162
+ # @param include_archived [Boolean]
163
+ # @param request_options [Hash]
164
+ # @return [Runtype::AgentAliases::Types::GetV1AgentAliasesResponse]
165
+ def list_agent_aliases_by_name(alias_name, include_archived: false, request_options: {})
166
+ params = { alias_: alias_name }
167
+ params[:include_archived] = "true" if include_archived
168
+ Runtype.wrap_errors do
169
+ release_alias_client.list_release_aliases_with_one_name_across_the_organization(
170
+ request_options: request_options, **params
171
+ )
172
+ end
173
+ end
174
+
175
+ # Archives this pointer on every agent in the organization that carries it,
176
+ # each under the revision just read, so a concurrent deploy answers 412
177
+ # instead of racing. An API refusal or transport failure on one agent is
178
+ # reported in `"failed"` and the sweep continues; any other exception is an
179
+ # SDK defect and propagates, so a broken response contract never reads as a
180
+ # completed sweep. Only active pointers are listed, so a second run archives
181
+ # nothing.
182
+ #
183
+ # @param alias_name [String]
184
+ # @param dry_run [Boolean] report what would be archived and archive nothing.
185
+ # @param request_options [Hash]
186
+ # @return [Hash] `{"alias", "archived" => [{"agentId", "agentName",
187
+ # "revision", "receiptId"}], "failed" => [{"agentId", "agentName",
188
+ # "error", "code"?}]}`, or for a dry run `{"alias", "dryRun" => true,
189
+ # "wouldArchive" => [<row>]}` carrying the listed rows unchanged.
190
+ def archive_agent_alias_everywhere(alias_name, dry_run: false, request_options: {})
191
+ rows = list_agent_aliases_by_name(alias_name, request_options: request_options).data
192
+ return { "alias" => alias_name, "dryRun" => true, "wouldArchive" => rows } if dry_run
193
+
194
+ rows.each_with_object({ "alias" => alias_name, "archived" => [], "failed" => [] }) do |row, sweep|
195
+ sweep["archived"] << archive_one_everywhere(row, alias_name, request_options)
196
+ # Wider than Runtype::Error: a DNS, TLS or connection-reset failure is
197
+ # raised by Net::HTTP and never reaches Runtype.wrap_errors, so rescuing
198
+ # the curated tree alone would abort the sweep on one bad row and leave the
199
+ # remaining pointers active — the opposite of what this method promises.
200
+ rescue *SWEEP_ISOLATED_ERRORS => e
201
+ sweep["failed"] << {
202
+ "agentId" => row.agent_id, "agentName" => row.agent_name,
203
+ "error" => e.message, "code" => alias_failure_code(e)
204
+ }.compact
205
+ end
206
+ end
207
+
130
208
  private
131
209
 
132
210
  # @return [Runtype::AgentAliases::Client] the generated sub-client these
@@ -134,5 +212,71 @@ module Runtype
134
212
  def release_alias_client
135
213
  api.agent_aliases
136
214
  end
215
+
216
+ # One row of an {#archive_agent_alias_everywhere} sweep. The revision and
217
+ # receipt reported are the archive response's, not the listed row's.
218
+ #
219
+ # @param row [Runtype::AgentAliases::Types::GetV1AgentAliasesResponseDataItem]
220
+ # @param alias_name [String]
221
+ # @param request_options [Hash]
222
+ # @return [Hash]
223
+ def archive_one_everywhere(row, alias_name, request_options)
224
+ archived = archive_agent_alias(
225
+ row.agent_id, alias_name, revision: row.revision.to_s, request_options: request_options
226
+ )
227
+ {
228
+ "agentId" => row.agent_id, "agentName" => row.agent_name,
229
+ "revision" => archived.revision, "receiptId" => archived.receipt_id
230
+ }
231
+ end
232
+
233
+ # The alias plane's refusal code for a failed sweep row, matching the
234
+ # TypeScript helper's `code` field. 428 carries no code of its own, so the
235
+ # one the typed error uses is supplied here.
236
+ #
237
+ # @param error [Runtype::Error]
238
+ # @return [String, nil]
239
+ def alias_failure_code(error)
240
+ body = error.respond_to?(:body) ? error.body : nil
241
+ code = body["code"] if body.is_a?(Hash)
242
+ return code.to_s if code
243
+
244
+ "alias_revision_required" if error.respond_to?(:status_code) && error.status_code == 428
245
+ end
246
+
247
+ # Normalizes `promotion:` into the wire shape. A generated
248
+ # {Runtype::Types::AgentDeploymentPromotion} passes through; a Hash may spell
249
+ # its keys either way, and an unknown key raises here rather than reaching
250
+ # the server's strict 400 — or, worse, being absorbed as an extra field on
251
+ # the generated request model. An all-nil hash is treated as omitted, the
252
+ # same reading the API gives an empty promotion object.
253
+ #
254
+ # @param promotion [Hash, Runtype::Types::AgentDeploymentPromotion, nil]
255
+ # @return [Hash, Runtype::Types::AgentDeploymentPromotion, nil]
256
+ # @raise [ArgumentError] on a non-Hash or an unrecognized key.
257
+ def promotion_provenance(promotion)
258
+ return nil if promotion.nil?
259
+ return promotion if promotion.is_a?(Runtype::Types::AgentDeploymentPromotion)
260
+
261
+ unless promotion.is_a?(Hash)
262
+ raise ArgumentError,
263
+ "promotion: needs a Hash of source ids, e.g. promotion: { source_version_id: \"agv_9\" }."
264
+ end
265
+
266
+ provenance = promotion.each_with_object({}) do |(key, value), acc|
267
+ field = promotion_field(key)
268
+ raise ArgumentError, "promotion: accepts #{PROMOTION_FIELDS.join(", ")}, not #{key.inspect}." unless field
269
+
270
+ acc[field] = value.to_s unless value.nil?
271
+ end
272
+ provenance.empty? ? nil : provenance
273
+ end
274
+
275
+ # @param key [String, Symbol] either spelling of a promotion field.
276
+ # @return [Symbol, nil] the snake_case field name, or nil when unrecognized.
277
+ def promotion_field(key)
278
+ field = key.to_s.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase.to_sym
279
+ PROMOTION_FIELDS.include?(field) ? field : nil
280
+ end
137
281
  end
138
282
  end
@@ -26,6 +26,7 @@ module Runtype
26
26
  # clients with different keys or base URLs can coexist in one process.
27
27
  class Client
28
28
  include Runtype::AgentEnsure
29
+ include Runtype::ConfigEnsure
29
30
  include Runtype::AgentReleaseAliases
30
31
  include Runtype::LocalToolRunner
31
32
 
@@ -53,7 +54,10 @@ module Runtype
53
54
 
54
55
  # @param api_key [String, nil] defaults to `RUNTYPE_API_KEY`.
55
56
  # @param base_url [String] defaults to `RUNTYPE_BASE_URL`, then production.
56
- # @param timeout [Numeric, nil] per-operation socket timeout in seconds.
57
+ # @param timeout [Numeric, nil] per-operation socket timeout in seconds,
58
+ # defaulting to {DEFAULT_TIMEOUT}. Governs the dispatch and streaming
59
+ # paths and every generated resource call alike; a single call overrides
60
+ # it with `request_options: { timeout_in_seconds: n }`.
57
61
  # @param max_retries [Integer] retries for generated resource calls. The
58
62
  # dispatch paths never retry: replaying an execution would run it twice.
59
63
  # @raise [Runtype::AuthenticationError] when no API key is available.
@@ -79,6 +83,8 @@ module Runtype
79
83
  authorization: bearer_token,
80
84
  max_retries: max_retries
81
85
  )
86
+ # WORKAROUND(fern ruby generator): BaseClient takes no timeout, so seed the transport it just built.
87
+ Runtype::RawClientTimeout.apply(generated_raw_client, timeout: @timeout)
82
88
  end
83
89
 
84
90
  # Executes a flow or agent and waits for the complete JSON response.
@@ -193,6 +199,21 @@ module Runtype
193
199
 
194
200
  private
195
201
 
202
+ # The transport {#api} shares with every resource sub-client it builds.
203
+ # Read once at construction, before any sub-client has memoized it.
204
+ #
205
+ # @return [Runtype::Internal::Http::RawClient]
206
+ # @raise [Runtype::Error] when the generated core no longer holds one, which
207
+ # means the timeout can no longer be applied to generated calls.
208
+ def generated_raw_client
209
+ raw = @api.instance_variable_get(:@raw_client)
210
+ return raw if raw.is_a?(Runtype::Internal::Http::RawClient)
211
+
212
+ raise Runtype::Error,
213
+ "Runtype::BaseClient no longer exposes @raw_client, so Runtype::Client cannot apply its timeout " \
214
+ "to generated calls. Rewire Runtype::RawClientTimeout against the generated core's new shape."
215
+ end
216
+
196
217
  # @return [String]
197
218
  def bearer_token
198
219
  "Bearer #{@api_key}"
@@ -0,0 +1,272 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "uri"
5
+
6
+ module Runtype
7
+ # Config-as-code on {Runtype::Client} for skills, flows, tools, surfaces,
8
+ # products and evals: the same hash-first ensure protocol as
9
+ # {AgentEnsure#ensure_agent}, mirroring the TypeScript SDK's `*-ensure.ts`
10
+ # modules option for option. Protocol: `docs/adr/0003-agent-config-as-code-ensure.md`.
11
+ #
12
+ # Definitions are plain Hashes in wire shape (camelCase keys, Symbol or
13
+ # String). Every converge probes with the content hash, ships the full
14
+ # definition only on `definitionRequired`, memoizes the server's hash per
15
+ # client, raises {Runtype::EnsureConflictError} on the protocol's 409 and
16
+ # {Runtype::DriftError} under `expect_no_changes:`.
17
+ module ConfigEnsure
18
+ Kind = Struct.new(:label, :pull_hint, :ensure_hint, :hasher, :drift, keyword_init: true)
19
+
20
+ SKILL = Kind.new(label: "Skill", pull_hint: "client.pull_skill(name)", ensure_hint: "ensure_skill",
21
+ hasher: ContentHash.method(:skill), drift: true)
22
+ FLOW = Kind.new(label: "Flow", pull_hint: "client.pull_flow(name)", ensure_hint: "ensure_flow",
23
+ hasher: ->(definition) { ContentHash.flow(definition["steps"] || []) }, drift: true)
24
+ TOOL = Kind.new(label: "Tool", pull_hint: "client.pull_tool(name)", ensure_hint: "ensure_tool",
25
+ hasher: ContentHash.method(:tool), drift: true)
26
+ SURFACE = Kind.new(label: "Surface", pull_hint: "client.pull_surface(product_id, name)",
27
+ ensure_hint: "ensure_surface", hasher: ContentHash.method(:surface), drift: true)
28
+ PRODUCT = Kind.new(label: "Product", pull_hint: "client.pull_product(name)", ensure_hint: "ensure_product",
29
+ hasher: ContentHash.method(:product), drift: true)
30
+ EVAL = Kind.new(label: "Eval", pull_hint: "client.pull_eval(name)", ensure_hint: "ensure_eval",
31
+ hasher: ContentHash.method(:eval_suite), drift: false)
32
+
33
+ # Converges `{ name:, manifest: { frontmatter:, runtype:?, body: } }`. Every
34
+ # change appends an immutable version.
35
+ #
36
+ # @param definition [Hash]
37
+ # @param dry_run [Boolean] plan without writing (the CI drift gate).
38
+ # @param expect_no_changes [Boolean] implies `dry_run`; raises {Runtype::DriftError} unless the plan is `"none"`.
39
+ # @param on_conflict [String, Symbol, nil] `"error"` (default) or `"overwrite"`.
40
+ # @param release [String, Symbol, nil] `"publish"` also re-aims the published-version pointer.
41
+ # @param expected_remote_hash [String, nil] the write proceeds only if the remote still hashes to this.
42
+ # @param request_options [Hash] see {Runtype::Client#dispatch}.
43
+ # @return [Hash] `{"result", "skillId", "versionId", "contentHash"}`, or the dry-run plan.
44
+ # @raise [Runtype::EnsureConflictError] on the protocol's 409.
45
+ # @raise [Runtype::DriftError] with `expect_no_changes:` when the plan is not `"none"`.
46
+ def ensure_skill(definition, dry_run: false, expect_no_changes: false, on_conflict: nil, release: nil,
47
+ expected_remote_hash: nil, request_options: {})
48
+ wire = config_wire(definition)
49
+ options = { onConflict: on_conflict&.to_s, release: release&.to_s, expectedRemoteHash: expected_remote_hash }
50
+ converge_config(SKILL, "v1/skills/ensure", wire, skill_wire(wire), options.compact,
51
+ dry_run: dry_run, expect_no_changes: expect_no_changes, request_options: request_options)
52
+ end
53
+
54
+ # @param name [String]
55
+ # @return [Hash] `{"skillId", "definition", "contentHash", "lastModifiedSource", "updatedAt", "versionId"}`.
56
+ def pull_skill(name, request_options: {})
57
+ get_json("v1/skills/pull", { name: name }, request_options)
58
+ end
59
+
60
+ # Converges `{ name:, steps: [...], evals:? }`. Inline `evals` are not part
61
+ # of the flow wire: each converges through {#ensure_eval} after the flow and
62
+ # is reported as `result["evals"]`; a dry run skips them.
63
+ #
64
+ # @param version [Hash, nil] provenance for the version row, `{ label:, notes: }`.
65
+ # @return [Hash] `{"result", "flowId", "versionId", "contentHash", "evals"?}`, or the dry-run plan.
66
+ # @see #ensure_skill for the shared options and errors.
67
+ def ensure_flow(definition, dry_run: false, expect_no_changes: false, on_conflict: nil, release: nil,
68
+ expected_remote_hash: nil, version: nil, request_options: {})
69
+ wire = config_wire(definition)
70
+ options = { onConflict: on_conflict&.to_s, release: release&.to_s, expectedRemoteHash: expected_remote_hash,
71
+ version: version_metadata(version) }
72
+ flow_wire = { "name" => wire["name"], "steps" => wire["steps"] || [] }
73
+ result = converge_config(FLOW, "v1/flows/ensure", wire, flow_wire, options.compact,
74
+ dry_run: dry_run, expect_no_changes: expect_no_changes,
75
+ request_options: request_options)
76
+ inline_evals = Array(wire["evals"])
77
+ return result if result["result"] == "plan" || inline_evals.empty?
78
+
79
+ result.merge("evals" => inline_evals.map { |suite| ensure_eval(suite, request_options: request_options) })
80
+ end
81
+
82
+ # @param name [String]
83
+ # @return [Hash] `{"flowId", "definition", "contentHash", "lastModifiedSource", "updatedAt", "versionId"}`.
84
+ def pull_flow(name, request_options: {})
85
+ get_json("v1/flows/pull", { name: name }, request_options)
86
+ end
87
+
88
+ # Converges `{ name:, description:, toolType:, parametersSchema:, config: }`. Never deletes.
89
+ #
90
+ # @return [Hash] `{"result", "toolId", "contentHash"}`, or the dry-run plan.
91
+ # @see #ensure_skill for the shared options and errors.
92
+ def ensure_tool(definition, dry_run: false, expect_no_changes: false, on_conflict: nil,
93
+ expected_remote_hash: nil, request_options: {})
94
+ wire = config_wire(definition)
95
+ options = { onConflict: on_conflict&.to_s, expectedRemoteHash: expected_remote_hash }
96
+ converge_config(TOOL, "v1/tools/ensure", wire, wire, options.compact,
97
+ dry_run: dry_run, expect_no_changes: expect_no_changes, request_options: request_options)
98
+ end
99
+
100
+ # @param name [String]
101
+ # @return [Hash] `{"toolId", "definition", "contentHash", "lastModifiedSource", "updatedAt"}`.
102
+ def pull_tool(name, request_options: {})
103
+ get_json("v1/tools/pull", { name: name }, request_options)
104
+ end
105
+
106
+ # Converges `{ name:, type:, behavior:?, inbound:?, outbound:?, status:? }`
107
+ # as a surface of `product_id`; identity is the name within that product.
108
+ #
109
+ # @param product_id [String]
110
+ # @return [Hash] `{"result", "surfaceId", "contentHash"}`, or the dry-run plan.
111
+ # @see #ensure_skill for the shared options and errors.
112
+ def ensure_surface(product_id, definition, dry_run: false, expect_no_changes: false, on_conflict: nil,
113
+ expected_remote_hash: nil, request_options: {})
114
+ wire = config_wire(definition)
115
+ options = { onConflict: on_conflict&.to_s, expectedRemoteHash: expected_remote_hash }
116
+ converge_config(SURFACE, surface_path(product_id, "ensure"), wire, wire, options.compact,
117
+ dry_run: dry_run, expect_no_changes: expect_no_changes, request_options: request_options,
118
+ memo_scope: product_id.to_s,
119
+ probe_first: !(wire.key?("inbound") || wire.key?("outbound")))
120
+ end
121
+
122
+ # @param product_id [String]
123
+ # @param name [String]
124
+ # @return [Hash] `{"surfaceId", "definition", "contentHash", "lastModifiedSource", "updatedAt"}`.
125
+ def pull_surface(product_id, name, request_options: {})
126
+ get_json(surface_path(product_id, "pull"), { name: name }, request_options)
127
+ end
128
+
129
+ # Converges the product row `{ name:, description:?, icon:?, spec:? }`.
130
+ #
131
+ # @return [Hash] `{"result", "productId", "contentHash"}`, or the dry-run plan.
132
+ # @see #ensure_skill for the shared options and errors.
133
+ def ensure_product(definition, dry_run: false, expect_no_changes: false, on_conflict: nil,
134
+ expected_remote_hash: nil, request_options: {})
135
+ wire = config_wire(definition)
136
+ options = { onConflict: on_conflict&.to_s, expectedRemoteHash: expected_remote_hash }
137
+ converge_config(PRODUCT, "v1/products/ensure", wire, wire, options.compact,
138
+ dry_run: dry_run, expect_no_changes: expect_no_changes, request_options: request_options)
139
+ end
140
+
141
+ # @param name [String]
142
+ # @return [Hash] `{"productId", "definition", "contentHash", "lastModifiedSource", "updatedAt"}`.
143
+ def pull_product(name, request_options: {})
144
+ get_json("v1/products/pull", { name: name }, request_options)
145
+ end
146
+
147
+ # Converges a whole Full Product Object; the server fans out per entity.
148
+ # Ships the full FPO (no hash probe). Non-atomic: inspect `"hasFailures"`
149
+ # and `"entities"` and re-run to self-heal.
150
+ #
151
+ # @param fpo [Hash]
152
+ # @param prune [Boolean] remove product-scoped capabilities and surfaces absent from the FPO.
153
+ # @return [Hash] `{"result", "productId", "contentHash", "entities", "hasFailures"}`.
154
+ def ensure_fpo(fpo, dry_run: false, on_conflict: nil, prune: false, request_options: {})
155
+ body = { fpo: fpo }
156
+ body[:dryRun] = true if dry_run
157
+ body[:onConflict] = on_conflict.to_s if on_conflict
158
+ body[:prune] = true if prune
159
+ config_ensure_request("v1/products/ensure-fpo", body, request_options)
160
+ end
161
+
162
+ # @param name [String]
163
+ # @return [Hash] `{"productId", "fpo", "contentHash", "warnings"?}`.
164
+ def pull_fpo(name, request_options: {})
165
+ get_json("v1/products/pull-fpo", { name: name }, request_options)
166
+ end
167
+
168
+ # Converges an eval suite `{ name:, target:, cases:, virtual:, ... }`
169
+ # (cases carry their merged graders in `expect`). Never executes it.
170
+ #
171
+ # @return [Hash] `{"result", "suiteId", "contentHash"}`.
172
+ # @raise [ArgumentError] for a virtual suite, which has nothing durable to converge.
173
+ def ensure_eval(definition, request_options: {})
174
+ wire = config_wire(definition)
175
+ if wire["virtual"]
176
+ raise ArgumentError, "Cannot ensure a virtual eval: virtual evals are ephemeral (nothing is persisted to " \
177
+ "converge). Remove virtual: true to converge a durable suite, or run it directly."
178
+ end
179
+
180
+ converge_config(EVAL, "v1/eval/ensure", wire, wire, {}, request_options: request_options)
181
+ end
182
+
183
+ # @param name [String]
184
+ # @return [Hash] `{"suiteId", "definition", "contentHash", "lastModifiedSource", "updatedAt"}`.
185
+ def pull_eval(name, request_options: {})
186
+ get_json("v1/eval/pull", { name: name }, request_options)
187
+ end
188
+
189
+ private
190
+
191
+ # Round-trips through JSON so Symbol keys and values hash exactly as they will be sent.
192
+ def config_wire(definition)
193
+ JSON.parse(JSON.generate(definition.to_h))
194
+ end
195
+
196
+ def skill_wire(wire)
197
+ manifest = wire["manifest"].is_a?(Hash) ? wire["manifest"] : {}
198
+ frontmatter = (manifest["frontmatter"] || {}).dup
199
+ runtype_block = flatten_unknown_extensions(manifest["runtype"])
200
+ frontmatter["runtype"] = runtype_block unless runtype_block.empty?
201
+ { "frontmatter" => frontmatter, "body" => manifest["body"] || "" }
202
+ end
203
+
204
+ # Spreads a pulled `unknownExtensions` back to top-level `runtype` keys, as SKILL.md stores them.
205
+ def flatten_unknown_extensions(runtype_block)
206
+ return {} unless runtype_block.is_a?(Hash)
207
+
208
+ extensions = runtype_block["unknownExtensions"]
209
+ flattened = runtype_block.except("unknownExtensions")
210
+ extensions.is_a?(Hash) ? flattened.merge(extensions) : flattened
211
+ end
212
+
213
+ def surface_path(product_id, action)
214
+ "v1/products/#{URI.encode_uri_component(product_id.to_s)}/surfaces/#{action}"
215
+ end
216
+
217
+ def converge_config(kind, path, wire, sent, options, request_options:, dry_run: false,
218
+ expect_no_changes: false, memo_scope: "", probe_first: true)
219
+ name = wire["name"]
220
+ raise ArgumentError, "#{kind.label} ensure requires a definition with a non-empty name" unless
221
+ name.is_a?(String) && !name.empty?
222
+
223
+ if dry_run || expect_no_changes
224
+ plan = config_ensure_request(path, { name: name, definition: sent, dryRun: true, **options },
225
+ request_options)
226
+ return check_config_plan(kind, plan, name, expect_no_changes)
227
+ end
228
+
229
+ local_hash = kind.hasher.call(wire)
230
+ memo_key = "#{memo_scope}\0#{name}\0#{local_hash}"
231
+ probe = { "result" => "definitionRequired" }
232
+ if probe_first
233
+ probe = config_ensure_request(
234
+ path, { name: name, contentHash: config_ensure_memo[memo_key] || local_hash, **options },
235
+ request_options
236
+ )
237
+ end
238
+ if probe["result"] == "definitionRequired"
239
+ probe = config_ensure_request(path, { name: name, definition: sent, **options }, request_options)
240
+ if probe["result"] == "definitionRequired"
241
+ raise Runtype::Error, "Server reported definitionRequired for a full-definition request"
242
+ end
243
+ end
244
+ config_ensure_memo[memo_key] = probe["contentHash"] if probe["result"] != "plan" && probe["contentHash"]
245
+ probe
246
+ end
247
+
248
+ def check_config_plan(kind, plan, name, expect_no_changes)
249
+ raise Runtype::Error, "Expected a plan result from dryRun, got #{plan["result"].inspect}" unless
250
+ plan["result"] == "plan"
251
+ if expect_no_changes && kind.drift && (plan["changes"] != "none" || plan["publishPending"] == true)
252
+ raise Runtype::DriftError.new(plan, name: name, entity: kind.label, pull_hint: kind.pull_hint,
253
+ ensure_hint: kind.ensure_hint)
254
+ end
255
+
256
+ plan
257
+ end
258
+
259
+ # @return [Hash{String => String}] `scope\0name\0localHash` => server hash.
260
+ def config_ensure_memo
261
+ @config_ensure_memo ||= {}
262
+ end
263
+
264
+ def config_ensure_request(path, body, request_options)
265
+ post_json(path, body, request_options)
266
+ rescue Runtype::APIStatusError => e
267
+ raise Runtype::EnsureConflictError.from_status_error(e) if Runtype::EnsureConflictError.protocol_conflict?(e)
268
+
269
+ raise
270
+ end
271
+ end
272
+ end