runtype 0.5.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 (492) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +767 -0
  3. data/README.md +30 -2
  4. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_aliases_response.rb +2 -0
  5. data/generated/lib/runtype/agent_feedback/client.rb +58 -0
  6. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_request.rb +19 -0
  7. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_request_category.rb +19 -0
  8. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_response.rb +13 -0
  9. data/generated/lib/runtype/agent_feedback/types/post_v1agent_feedback_response_status.rb +13 -0
  10. data/generated/lib/runtype/agents/client.rb +127 -14
  11. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request.rb +17 -0
  12. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config.rb +59 -0
  13. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_advisor.rb +13 -0
  14. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_artifacts.rb +13 -0
  15. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_artifacts_types_item.rb +14 -0
  16. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management.rb +13 -0
  17. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_compaction.rb +23 -0
  18. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_compaction_strategy.rb +15 -0
  19. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_tool_results.rb +15 -0
  20. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_context_management_tool_results_prune_mode.rb +14 -0
  21. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_durability.rb +15 -0
  22. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_durability_forced.rb +14 -0
  23. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling.rb +15 -0
  24. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item.rb +19 -0
  25. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_message.rb +13 -0
  26. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_model.rb +17 -0
  27. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_fallbacks_item_retry.rb +11 -0
  28. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_on_error.rb +15 -0
  29. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_triggers_item.rb +11 -0
  30. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_error_handling_triggers_item_type.rb +14 -0
  31. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_logging_policy.rb +15 -0
  32. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_loop_config.rb +19 -0
  33. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_memory.rb +17 -0
  34. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_memory_pointer_scope.rb +15 -0
  35. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_pii_redaction.rb +15 -0
  36. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning.rb +15 -0
  37. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens.rb +25 -0
  38. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens_reasoning_effort.rb +17 -0
  39. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_reasoning_budget_tokens_reasoning_summary.rb +14 -0
  40. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox.rb +29 -0
  41. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_coding_agents_item.rb +13 -0
  42. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_instance_type.rb +16 -0
  43. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access.rb +15 -0
  44. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_allow.rb +13 -0
  45. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_allow_profile.rb +15 -0
  46. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_network_access_zero.rb +15 -0
  47. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_persistence.rb +15 -0
  48. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_provider.rb +14 -0
  49. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_sleep_after.rb +16 -0
  50. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_sandbox_ttl.rb +16 -0
  51. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state.rb +17 -0
  52. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state_merge_strategy.rb +14 -0
  53. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_state_predict_state_item.rb +15 -0
  54. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_temporal.rb +17 -0
  55. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy.rb +13 -0
  56. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor.rb +13 -0
  57. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor_end_user.rb +14 -0
  58. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_assurance_floor_tenant.rb +14 -0
  59. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tenancy_strategy_preset.rb +15 -0
  60. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools.rb +31 -0
  61. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval.rb +17 -0
  62. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval_choices.rb +13 -0
  63. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_approval_require.rb +15 -0
  64. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_code_mode_config.rb +15 -0
  65. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item.rb +25 -0
  66. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_auth.rb +21 -0
  67. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_auth_type.rb +18 -0
  68. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_mcp_servers_item_transport.rb +14 -0
  69. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_per_tool_limits_value.rb +13 -0
  70. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_runtime_tools_item.rb +23 -0
  71. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_runtime_tools_item_tool_type.rb +19 -0
  72. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config.rb +33 -0
  73. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_default_execution_mode.rb +14 -0
  74. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_default_notify.rb +15 -0
  75. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_subagent_config_execution_modes_item.rb +14 -0
  76. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_tool_call_strategy.rb +15 -0
  77. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_tools_tool_search.rb +15 -0
  78. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice.rb +25 -0
  79. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_eleven_labs.rb +17 -0
  80. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_endpointing.rb +13 -0
  81. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_endpointing_strategy.rb +16 -0
  82. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_interruption_mode.rb +15 -0
  83. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech.rb +15 -0
  84. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_mode.rb +15 -0
  85. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_synthesizer.rb +17 -0
  86. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_synthesizer_settings.rb +13 -0
  87. data/generated/lib/runtype/agents/types/create_voice_agent_draft_request_config_voice_speech_transcriber.rb +13 -0
  88. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response.rb +6 -0
  89. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_execution_lane.rb +14 -0
  90. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry.rb +17 -0
  91. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry_completeness.rb +16 -0
  92. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_response_external_telemetry_source.rb +13 -0
  93. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_execution_id_tool_calls_response_tool_calls_item.rb +14 -0
  94. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_request.rb +2 -0
  95. 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
  96. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_response_data_item.rb +2 -0
  97. data/generated/lib/runtype/agents/types/get_v1agents_id_executions_response_data_item_otel_producer.rb +20 -0
  98. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_request.rb +6 -0
  99. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_request_format.rb +14 -0
  100. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_request.rb +13 -0
  101. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response.rb +13 -0
  102. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data.rb +27 -0
  103. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_cost.rb +11 -0
  104. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_tokens.rb +13 -0
  105. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_tools_item.rb +17 -0
  106. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_versions_item.rb +19 -0
  107. data/generated/lib/runtype/agents/types/get_v1agents_id_run_insights_response_data_window.rb +15 -0
  108. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request.rb +4 -0
  109. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_sandbox.rb +2 -0
  110. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_sandbox_coding_agents_item.rb +13 -0
  111. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools.rb +2 -0
  112. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools_runtime_tools_item.rb +4 -0
  113. data/generated/lib/runtype/agents/types/post_v1agents_ensure_request_definition_config_tools_tool_search.rb +15 -0
  114. data/generated/lib/runtype/agents/types/post_v1agents_id_execute_request_x_runtype_concurrency.rb +1 -1
  115. data/generated/lib/runtype/agents/types/post_v1agents_request_claude_managed_config.rb +2 -0
  116. data/generated/lib/runtype/agents/types/post_v1agents_request_config_sandbox.rb +2 -0
  117. data/generated/lib/runtype/agents/types/post_v1agents_request_config_sandbox_coding_agents_item.rb +13 -0
  118. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools.rb +2 -0
  119. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools_runtime_tools_item.rb +4 -0
  120. data/generated/lib/runtype/agents/types/post_v1agents_request_config_tools_tool_search.rb +15 -0
  121. data/generated/lib/runtype/agents/types/put_v1agents_id_request_claude_managed_config.rb +2 -0
  122. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_sandbox.rb +2 -0
  123. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_sandbox_coding_agents_item.rb +13 -0
  124. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools.rb +2 -0
  125. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools_runtime_tools_item.rb +4 -0
  126. data/generated/lib/runtype/agents/types/put_v1agents_id_request_config_tools_tool_search.rb +15 -0
  127. data/generated/lib/runtype/agents/types/put_v1agents_id_response.rb +2 -0
  128. data/generated/lib/runtype/client.rb +25 -5
  129. data/generated/lib/runtype/client_runtime/client.rb +57 -6
  130. data/generated/lib/runtype/client_runtime/types/post_v1client_agents_agent_id_voice_prewarm_request.rb +15 -0
  131. data/generated/lib/runtype/client_runtime/types/post_v1client_chat_request_submit_mode.rb +1 -1
  132. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id.rb +1 -1
  133. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id_identity_proof.rb +19 -0
  134. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_session_id_identity_proof_provider.rb +17 -0
  135. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three.rb +1 -1
  136. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three_identity_proof.rb +19 -0
  137. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_three_identity_proof_provider.rb +17 -0
  138. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two.rb +1 -1
  139. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two_identity_proof.rb +19 -0
  140. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_two_identity_proof_provider.rb +17 -0
  141. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero.rb +1 -1
  142. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero_identity_proof.rb +19 -0
  143. data/generated/lib/runtype/client_runtime/types/post_v1client_init_request_zero_identity_proof_provider.rb +17 -0
  144. data/generated/lib/runtype/client_runtime/types/post_v1client_init_response_durable_recovery.rb +1 -1
  145. data/generated/lib/runtype/client_tokens/types/post_v1client_tokens_request.rb +2 -0
  146. data/generated/lib/runtype/dispatch/client.rb +5 -4
  147. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item.rb +4 -0
  148. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_role.rb +1 -0
  149. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_tool_calls_item.rb +17 -0
  150. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_request_continuation_tool_output_messages_item_tool_results_item.rb +17 -0
  151. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item.rb +4 -0
  152. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_role.rb +1 -0
  153. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_tool_calls_item.rb +17 -0
  154. data/generated/lib/runtype/dispatch/types/post_v1dispatch_continue_stream_request_continuation_tool_output_messages_item_tool_results_item.rb +17 -0
  155. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_agent_sandbox.rb +2 -0
  156. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_agent_sandbox_coding_agents_item.rb +13 -0
  157. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_agent_sandbox.rb +2 -0
  158. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_agent_sandbox_coding_agents_item.rb +13 -0
  159. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item.rb +4 -0
  160. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_role.rb +1 -0
  161. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_tool_calls_item.rb +17 -0
  162. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_request_messages_item_tool_results_item.rb +17 -0
  163. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item.rb +4 -0
  164. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_role.rb +1 -0
  165. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_tool_calls_item.rb +17 -0
  166. data/generated/lib/runtype/dispatch/types/post_v1dispatch_resume_stream_request_messages_item_tool_results_item.rb +17 -0
  167. data/generated/lib/runtype/documentation/client.rb +2 -3
  168. data/generated/lib/runtype/documentation/types/post_v1documentation_build_instructions_request.rb +2 -0
  169. data/generated/lib/runtype/evals/client.rb +4 -1
  170. data/generated/lib/runtype/executions/client.rb +3 -1
  171. data/generated/lib/runtype/executions/types/get_v1executions_execution_id_status_response.rb +6 -0
  172. data/generated/lib/runtype/executions/types/get_v1executions_execution_id_status_response_execution_lane.rb +14 -0
  173. data/generated/lib/runtype/identity_integrations/client.rb +39 -0
  174. data/generated/lib/runtype/logs/client.rb +166 -8
  175. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_blocks_request.rb +13 -0
  176. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_blocks_response.rb +13 -0
  177. data/generated/lib/runtype/logs/types/get_v1logs_context_execution_id_request.rb +11 -0
  178. data/generated/lib/runtype/logs/types/{get_v1logs_debug_response.rb → get_v1logs_context_execution_id_response.rb} +2 -2
  179. data/generated/lib/runtype/logs/types/get_v1logs_entry_request.rb +15 -0
  180. data/generated/lib/runtype/logs/types/get_v1logs_entry_response.rb +13 -0
  181. data/generated/lib/runtype/logs/types/get_v1logs_entry_response_data.rb +11 -0
  182. data/generated/lib/runtype/logs/types/get_v1logs_request.rb +8 -0
  183. data/generated/lib/runtype/logs/types/get_v1logs_response.rb +2 -0
  184. data/generated/lib/runtype/logs/types/get_v1logs_response_data.rb +2 -0
  185. data/generated/lib/runtype/logs/types/get_v1logs_response_data_live.rb +17 -0
  186. data/generated/lib/runtype/logs/types/get_v1logs_response_data_live_reason.rb +14 -0
  187. data/generated/lib/runtype/logs/types/get_v1logs_response_data_pagination.rb +2 -0
  188. data/generated/lib/runtype/logs/types/get_v1logs_response_window.rb +14 -0
  189. data/generated/lib/runtype/logs/types/get_v1logs_stats_request.rb +8 -0
  190. data/generated/lib/runtype/logs/types/get_v1logs_stats_response.rb +2 -0
  191. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_data.rb +4 -0
  192. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_data_stats_source.rb +15 -0
  193. data/generated/lib/runtype/logs/types/get_v1logs_stats_response_window.rb +14 -0
  194. data/generated/lib/runtype/logs/types/get_v1logs_trace_conversation_conversation_id_response.rb +1 -1
  195. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_request.rb +11 -0
  196. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_response.rb +15 -0
  197. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_children_response_data_item.rb +19 -0
  198. data/generated/lib/runtype/logs/types/get_v1logs_trace_execution_execution_id_response.rb +1 -1
  199. data/generated/lib/runtype/messaging_conversations/client.rb +2 -0
  200. data/generated/lib/runtype/messaging_conversations/types/get_v1messaging_conversations_id_messages_request.rb +2 -0
  201. data/generated/lib/runtype/products/client.rb +303 -7
  202. data/generated/lib/runtype/products/types/create_product_comment_request.rb +19 -0
  203. data/generated/lib/runtype/products/types/create_product_comment_request_author_kind.rb +14 -0
  204. data/generated/lib/runtype/products/types/create_product_comment_thread_request.rb +17 -0
  205. data/generated/lib/runtype/products/types/declare_product_stack_request.rb +15 -0
  206. data/generated/lib/runtype/products/types/declare_product_stack_request_source.rb +15 -0
  207. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item.rb +1 -1
  208. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item.rb +55 -23
  209. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_completeness.rb +17 -0
  210. data/generated/lib/runtype/products/types/{get_v1products_id_activity_response_data_agents_item_data_item_execution_mode.rb → get_v1products_id_activity_response_data_agents_item_data_item_kind.rb} +3 -3
  211. data/generated/lib/runtype/products/types/{get_v1products_id_activity_response_data_agents_item_data_item_notification_mode.rb → get_v1products_id_activity_response_data_agents_item_data_item_origin.rb} +4 -4
  212. data/generated/lib/runtype/products/types/{get_v1products_id_activity_response_data_agents_item_data_item_agent_target_resolution.rb → get_v1products_id_activity_response_data_agents_item_data_item_source.rb} +3 -4
  213. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_status.rb +1 -2
  214. data/generated/lib/runtype/products/types/get_v1products_id_comments_request.rb +19 -0
  215. data/generated/lib/runtype/products/types/get_v1products_id_comments_request_status.rb +15 -0
  216. data/generated/lib/runtype/products/types/get_v1products_id_response.rb +2 -0
  217. data/generated/lib/runtype/products/types/get_v1products_id_response_editor_context.rb +6 -0
  218. data/generated/lib/runtype/products/types/get_v1products_id_response_editor_context_flow_steps_map_value_item.rb +2 -0
  219. data/generated/lib/runtype/products/types/get_v1products_id_surfaces_surface_id_response.rb +2 -0
  220. data/generated/lib/runtype/products/types/get_v1products_response_data_item_capabilities_item.rb +4 -0
  221. data/generated/lib/runtype/products/types/post_v1products_ensure_request_definition_spec_internal_docs_resources_item.rb +6 -0
  222. data/generated/lib/runtype/products/types/post_v1products_request_canvas.rb +2 -0
  223. data/generated/lib/runtype/products/types/post_v1products_request_spec.rb +2 -0
  224. data/generated/lib/runtype/products/types/post_v1products_request_spec_internal_docs_resources_item.rb +6 -0
  225. data/generated/lib/runtype/products/types/put_v1products_id_request_canvas.rb +2 -0
  226. data/generated/lib/runtype/products/types/put_v1products_id_request_spec.rb +2 -0
  227. data/generated/lib/runtype/products/types/put_v1products_id_request_spec_internal_docs_resources_item.rb +6 -0
  228. data/generated/lib/runtype/products/types/put_v1products_id_surfaces_surface_id_entry_point_request.rb +15 -0
  229. data/generated/lib/runtype/products/types/put_v1products_id_surfaces_surface_id_entry_point_response.rb +13 -0
  230. data/generated/lib/runtype/products/types/update_product_comment_thread_request.rb +15 -0
  231. data/generated/lib/runtype/question_sets/client.rb +416 -0
  232. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_request.rb +11 -0
  233. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_resolved_request.rb +13 -0
  234. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_response.rb +13 -0
  235. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_request.rb +11 -0
  236. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_response.rb +11 -0
  237. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_version_number_calibrations_request.rb +17 -0
  238. data/generated/lib/runtype/question_sets/types/get_v1question_sets_id_versions_version_number_calibrations_response.rb +13 -0
  239. data/generated/lib/runtype/question_sets/types/get_v1question_sets_request.rb +17 -0
  240. data/generated/lib/runtype/question_sets/types/get_v1question_sets_request_direction.rb +14 -0
  241. data/generated/lib/runtype/question_sets/types/get_v1question_sets_response.rb +13 -0
  242. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request.rb +17 -0
  243. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request_record.rb +15 -0
  244. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_request_record_per_question_value.rb +19 -0
  245. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_calibrations_response.rb +13 -0
  246. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_publish_request.rb +13 -0
  247. data/generated/lib/runtype/question_sets/types/post_v1question_sets_id_versions_version_number_publish_response.rb +13 -0
  248. data/generated/lib/runtype/question_sets/types/post_v1question_sets_request.rb +21 -0
  249. data/generated/lib/runtype/question_sets/types/post_v1question_sets_response.rb +13 -0
  250. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_request.rb +21 -0
  251. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_response.rb +13 -0
  252. data/generated/lib/runtype/question_sets/types/put_v1question_sets_id_response_version.rb +30 -0
  253. data/generated/lib/runtype/runs/client.rb +150 -0
  254. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request.rb +15 -0
  255. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request_overlay.rb +14 -0
  256. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_request_view.rb +14 -0
  257. data/generated/lib/runtype/runs/types/get_v1runs_execution_id_response.rb +11 -0
  258. data/generated/lib/runtype/runs/types/get_v1runs_request.rb +47 -0
  259. data/generated/lib/runtype/runs/types/get_v1runs_request_include_children.rb +14 -0
  260. data/generated/lib/runtype/runs/types/get_v1runs_request_overlay.rb +14 -0
  261. data/generated/lib/runtype/runs/types/get_v1runs_request_source.rb +14 -0
  262. data/generated/lib/runtype/runs/types/get_v1runs_request_status.rb +15 -0
  263. data/generated/lib/runtype/runs/types/get_v1runs_request_view.rb +14 -0
  264. data/generated/lib/runtype/runs/types/get_v1runs_response.rb +15 -0
  265. data/generated/lib/runtype/runs/types/get_v1runs_response_pagination.rb +19 -0
  266. data/generated/lib/runtype/runs/types/get_v1runs_response_window.rb +14 -0
  267. data/generated/lib/runtype/schedules/client.rb +97 -0
  268. data/generated/lib/runtype/schedules/types/get_v1schedules_id_runs_response_data_item.rb +2 -0
  269. data/generated/lib/runtype/schedules/types/get_v1schedules_pull_request.rb +19 -0
  270. data/generated/lib/runtype/schedules/types/get_v1schedules_runs_all_response_data_item.rb +2 -0
  271. data/generated/lib/runtype/schedules/types/post_v1schedules_ensure_request.rb +23 -0
  272. data/generated/lib/runtype/schedules/types/post_v1schedules_ensure_request_on_conflict.rb +14 -0
  273. data/generated/lib/runtype/skills/client.rb +39 -0
  274. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_request.rb +11 -0
  275. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response.rb +11 -0
  276. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response_data_item.rb +25 -0
  277. data/generated/lib/runtype/skills/types/get_v1skills_id_bindings_response_data_item_agent.rb +15 -0
  278. data/generated/lib/runtype/surfaces/client.rb +48 -0
  279. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound.rb +16 -0
  280. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value.rb +13 -0
  281. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value_channel_response_mode.rb +15 -0
  282. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_overrides_value_eagerness.rb +15 -0
  283. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_channel_response_mode.rb +15 -0
  284. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_context_backfill.rb +19 -0
  285. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_context_backfill_mode.rb +15 -0
  286. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_eagerness.rb +15 -0
  287. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_keywords.rb +15 -0
  288. data/generated/lib/runtype/surfaces/types/get_v1surfaces_response_data_item_inbound_on_uncertain.rb +14 -0
  289. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_request.rb +13 -0
  290. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_response.rb +19 -0
  291. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_channel_context_response_provider.rb +15 -0
  292. data/generated/lib/runtype/surfaces/types/get_v1surfaces_surface_id_response.rb +2 -0
  293. data/generated/lib/runtype/telemetry/client.rb +58 -0
  294. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_request.rb +11 -0
  295. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response.rb +27 -0
  296. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_admission.rb +17 -0
  297. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_errors_item.rb +13 -0
  298. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_status.rb +16 -0
  299. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers.rb +15 -0
  300. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_canonical.rb +21 -0
  301. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_hot.rb +20 -0
  302. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_tiers_raw.rb +21 -0
  303. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_totals.rb +27 -0
  304. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_trace.rb +23 -0
  305. data/generated/lib/runtype/telemetry/types/get_otlp_ingest_health_response_trace_delivery.rb +23 -0
  306. data/generated/lib/runtype/tools/types/post_v1tools_flows_flow_id_convert_to_tool_response_validation.rb +2 -0
  307. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_request.rb +2 -0
  308. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_response.rb +3 -7
  309. data/generated/lib/runtype/tools/types/post_v1tools_id_execute_response_error.rb +19 -0
  310. data/generated/lib/runtype/tools/types/{post_v1tools_id_execute_response_status.rb → post_v1tools_id_execute_response_error_status.rb} +1 -1
  311. data/generated/lib/runtype/tools/types/post_v1tools_id_test_response.rb +3 -7
  312. data/generated/lib/runtype/tools/types/post_v1tools_id_test_response_error.rb +19 -0
  313. data/generated/lib/runtype/tools/types/{post_v1tools_id_test_response_status.rb → post_v1tools_id_test_response_error_status.rb} +1 -1
  314. data/generated/lib/runtype/tools/types/post_v1tools_response_validation.rb +2 -0
  315. data/generated/lib/runtype/tools/types/put_v1tools_id_response_validation.rb +2 -0
  316. data/generated/lib/runtype/types/agent_ensure_capability.rb +21 -0
  317. data/generated/lib/runtype/types/agent_ensure_capability_change.rb +17 -0
  318. data/generated/lib/runtype/types/agent_ensure_capability_change_action.rb +14 -0
  319. data/generated/lib/runtype/types/agent_ensure_capability_change_kind.rb +13 -0
  320. data/generated/lib/runtype/types/agent_ensure_response_changed_keys.rb +4 -0
  321. data/generated/lib/runtype/types/agent_ensure_response_version_id.rb +4 -0
  322. data/generated/lib/runtype/types/agent_ensure_skill_binding.rb +13 -0
  323. data/generated/lib/runtype/types/agent_ensure_skill_binding_change.rb +17 -0
  324. data/generated/lib/runtype/types/agent_ensure_skill_binding_change_action.rb +14 -0
  325. data/generated/lib/runtype/types/agent_pull_response.rb +4 -0
  326. data/generated/lib/runtype/types/agent_pull_response_definition_config_sandbox.rb +2 -0
  327. data/generated/lib/runtype/types/agent_pull_response_definition_config_sandbox_coding_agents_item.rb +11 -0
  328. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools.rb +2 -0
  329. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools_runtime_tools_item.rb +4 -0
  330. data/generated/lib/runtype/types/agent_pull_response_definition_config_tools_tool_search.rb +13 -0
  331. data/generated/lib/runtype/types/builtin_tool_execute_result.rb +15 -0
  332. data/generated/lib/runtype/types/channel_context_decision.rb +17 -0
  333. data/generated/lib/runtype/types/channel_context_decision_capability.rb +15 -0
  334. data/generated/lib/runtype/types/channel_context_decision_capability_outcome.rb +14 -0
  335. data/generated/lib/runtype/types/channel_context_decision_decision.rb +14 -0
  336. data/generated/lib/runtype/types/channel_context_decision_failure.rb +17 -0
  337. data/generated/lib/runtype/types/channel_context_label.rb +17 -0
  338. data/generated/lib/runtype/types/channel_context_label_label.rb +13 -0
  339. data/generated/lib/runtype/types/channel_context_label_source.rb +15 -0
  340. data/generated/lib/runtype/types/channel_context_message.rb +25 -0
  341. data/generated/lib/runtype/types/channel_context_message_author_kind.rb +13 -0
  342. data/generated/lib/runtype/types/collection_lookup_failed_error.rb +17 -0
  343. data/generated/lib/runtype/types/collection_lookup_failed_error_code.rb +11 -0
  344. data/generated/lib/runtype/types/context_blocks.rb +11 -0
  345. data/generated/lib/runtype/types/context_blocks_blocks_item.rb +13 -0
  346. data/generated/lib/runtype/types/context_manifest_entry.rb +27 -0
  347. data/generated/lib/runtype/types/context_manifest_entry_category.rb +16 -0
  348. data/generated/lib/runtype/types/context_manifest_entry_flags_item.rb +13 -0
  349. data/generated/lib/runtype/types/context_manifest_entry_kind.rb +19 -0
  350. data/generated/lib/runtype/types/context_manifest_entry_role.rb +14 -0
  351. data/generated/lib/runtype/types/context_snapshot.rb +33 -0
  352. data/generated/lib/runtype/types/context_snapshot_removed_since_previous_item.rb +11 -0
  353. data/generated/lib/runtype/types/context_snapshot_removed_since_previous_item_reason.rb +14 -0
  354. data/generated/lib/runtype/types/context_snapshot_reported.rb +13 -0
  355. data/generated/lib/runtype/types/context_snapshots.rb +13 -0
  356. data/generated/lib/runtype/types/conversation_trace.rb +17 -0
  357. data/generated/lib/runtype/types/conversation_trace_executions_item.rb +13 -0
  358. data/generated/lib/runtype/types/conversation_trace_produced_by.rb +38 -0
  359. data/generated/lib/runtype/types/conversation_trace_produced_by_source.rb +12 -0
  360. data/generated/lib/runtype/types/conversation_trace_truncation.rb +13 -0
  361. data/generated/lib/runtype/types/conversation_trace_truncation_reason.rb +11 -0
  362. data/generated/lib/runtype/types/create_voice_agent_draft_response.rb +11 -0
  363. data/generated/lib/runtype/types/declare_product_stack_response.rb +15 -0
  364. data/generated/lib/runtype/types/declare_product_stack_response_source.rb +13 -0
  365. data/generated/lib/runtype/types/dispatch_agent_json_response.rb +6 -0
  366. data/generated/lib/runtype/types/dispatch_agent_json_response_agent_target_resolution.rb +13 -0
  367. data/generated/lib/runtype/types/dispatch_detached_tool_output_json_response.rb +6 -0
  368. data/generated/lib/runtype/types/dispatch_detached_tool_output_json_response_agent_target_resolution.rb +13 -0
  369. data/generated/lib/runtype/types/dispatch_tool_output_continuation_json_response.rb +6 -0
  370. data/generated/lib/runtype/types/dispatch_tool_output_continuation_json_response_agent_target_resolution.rb +13 -0
  371. data/generated/lib/runtype/types/eval_run_scores_response.rb +2 -0
  372. data/generated/lib/runtype/types/eval_run_scores_response_cases_item.rb +2 -0
  373. data/generated/lib/runtype/types/eval_run_scores_response_cases_item_failure_kind.rb +11 -0
  374. data/generated/lib/runtype/types/eval_suite_detail.rb +2 -0
  375. data/generated/lib/runtype/types/eval_suite_detail_warnings_item.rb +13 -0
  376. data/generated/lib/runtype/types/eval_suite_latest_run.rb +2 -0
  377. data/generated/lib/runtype/types/eval_suite_summary.rb +2 -0
  378. data/generated/lib/runtype/types/eval_suite_summary_warnings_item.rb +13 -0
  379. data/generated/lib/runtype/types/execution_stream_event.rb +4 -0
  380. data/generated/lib/runtype/types/execution_stream_event_model_call_complete.rb +41 -0
  381. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_attributes_value.rb +15 -0
  382. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_subagent.rb +13 -0
  383. data/generated/lib/runtype/types/execution_stream_event_model_call_complete_tokens.rb +17 -0
  384. data/generated/lib/runtype/types/execution_stream_event_model_call_start.rb +29 -0
  385. data/generated/lib/runtype/types/execution_stream_event_model_call_start_subagent.rb +13 -0
  386. data/generated/lib/runtype/types/execution_stream_event_turn_complete.rb +2 -0
  387. data/generated/lib/runtype/types/execution_stream_event_turn_complete_attributes_value.rb +15 -0
  388. data/generated/lib/runtype/types/external_observed_approvals.rb +17 -0
  389. data/generated/lib/runtype/types/external_observed_approvals_availability.rb +11 -0
  390. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item.rb +23 -0
  391. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_decision.rb +14 -0
  392. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item.rb +15 -0
  393. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source.rb +15 -0
  394. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source_attribute.rb +11 -0
  395. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_source_kind.rb +11 -0
  396. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_observations_item_state.rb +13 -0
  397. data/generated/lib/runtype/types/external_observed_approvals_lifecycles_item_raw_states_item.rb +13 -0
  398. data/generated/lib/runtype/types/identity_assertion_jwks.rb +9 -0
  399. data/generated/lib/runtype/types/identity_assertion_public_jwk.rb +21 -0
  400. data/generated/lib/runtype/types/judgment_calibration_record.rb +23 -0
  401. data/generated/lib/runtype/types/judgment_calibration_record_source.rb +12 -0
  402. data/generated/lib/runtype/types/list_product_comments_response.rb +13 -0
  403. data/generated/lib/runtype/types/product_canvas_block.rb +23 -0
  404. data/generated/lib/runtype/types/product_comment.rb +23 -0
  405. data/generated/lib/runtype/types/product_comment_author_kind.rb +12 -0
  406. data/generated/lib/runtype/types/product_comment_thread.rb +27 -0
  407. data/generated/lib/runtype/types/product_declared_stack.rb +15 -0
  408. data/generated/lib/runtype/types/product_pull_response_definition_spec_internal_docs_resources_item.rb +6 -0
  409. data/generated/lib/runtype/types/product_stack.rb +18 -0
  410. data/generated/lib/runtype/types/product_stack_declared.rb +14 -0
  411. data/generated/lib/runtype/types/product_stack_detected.rb +12 -0
  412. data/generated/lib/runtype/types/product_stack_item.rb +21 -0
  413. data/generated/lib/runtype/types/question_set.rb +25 -0
  414. data/generated/lib/runtype/types/question_set_error.rb +13 -0
  415. data/generated/lib/runtype/types/question_set_list_item.rb +29 -0
  416. data/generated/lib/runtype/types/question_set_version.rb +27 -0
  417. data/generated/lib/runtype/types/resolved_question_set.rb +21 -0
  418. data/generated/lib/runtype/types/resolved_question_set_calibration.rb +17 -0
  419. data/generated/lib/runtype/types/resolved_question_set_calibration_source.rb +12 -0
  420. data/generated/lib/runtype/types/run_eval_response.rb +2 -0
  421. data/generated/lib/runtype/types/run_eval_response_cases_item.rb +2 -0
  422. data/generated/lib/runtype/types/run_eval_response_cases_item_failure_kind.rb +11 -0
  423. data/generated/lib/runtype/types/run_list_pagination.rb +15 -0
  424. data/generated/lib/runtype/types/run_list_row.rb +107 -0
  425. data/generated/lib/runtype/types/run_list_row_completeness.rb +15 -0
  426. data/generated/lib/runtype/types/run_list_row_kind.rb +12 -0
  427. data/generated/lib/runtype/types/run_list_row_origin.rb +13 -0
  428. data/generated/lib/runtype/types/run_list_row_source.rb +12 -0
  429. data/generated/lib/runtype/types/run_list_row_status.rb +16 -0
  430. data/generated/lib/runtype/types/runtime_exported_skill.rb +21 -0
  431. data/generated/lib/runtype/types/schedule_ensure_conflict.rb +17 -0
  432. data/generated/lib/runtype/types/schedule_ensure_conflict_code.rb +12 -0
  433. data/generated/lib/runtype/types/schedule_ensure_definition.rb +27 -0
  434. data/generated/lib/runtype/types/schedule_ensure_definition_execution_options.rb +27 -0
  435. data/generated/lib/runtype/types/schedule_ensure_definition_execution_options_logging_policy.rb +13 -0
  436. data/generated/lib/runtype/types/schedule_ensure_definition_trigger.rb +15 -0
  437. data/generated/lib/runtype/types/schedule_ensure_definition_trigger_type.rb +12 -0
  438. data/generated/lib/runtype/types/schedule_ensure_hash_mismatch.rb +13 -0
  439. data/generated/lib/runtype/types/schedule_ensure_hash_mismatch_code.rb +11 -0
  440. data/generated/lib/runtype/types/schedule_ensure_response.rb +15 -0
  441. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys.rb +19 -0
  442. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys_changes.rb +13 -0
  443. data/generated/lib/runtype/types/schedule_ensure_response_changed_keys_result.rb +11 -0
  444. data/generated/lib/runtype/types/schedule_ensure_response_one.rb +9 -0
  445. data/generated/lib/runtype/types/schedule_ensure_response_one_result.rb +11 -0
  446. data/generated/lib/runtype/types/schedule_ensure_response_zero.rb +13 -0
  447. data/generated/lib/runtype/types/schedule_ensure_response_zero_result.rb +13 -0
  448. data/generated/lib/runtype/types/schedule_ensure_target.rb +15 -0
  449. data/generated/lib/runtype/types/schedule_pull_response.rb +17 -0
  450. data/generated/lib/runtype/types/schedule_run_link.rb +15 -0
  451. data/generated/lib/runtype/types/schedule_run_link_kind.rb +13 -0
  452. data/generated/lib/runtype/types/tool_execute_error.rb +13 -0
  453. data/generated/lib/runtype/types/trace_log_entry.rb +145 -0
  454. data/generated/lib/runtype/types/trace_log_entry_estimated_context_breakdown.rb +15 -0
  455. data/generated/lib/runtype/types/trace_log_entry_estimated_context_breakdown_categories_value.rb +11 -0
  456. data/generated/lib/runtype/types/trace_log_entry_estimated_cost.rb +14 -0
  457. data/generated/lib/runtype/types/trace_log_entry_level.rb +14 -0
  458. data/generated/lib/runtype/types/trace_log_entry_logging_policy.rb +11 -0
  459. data/generated/lib/runtype/types/trace_log_entry_otlp_incomplete_activity.rb +13 -0
  460. data/generated/lib/runtype/types/trace_log_entry_otlp_instrumentation_warning.rb +11 -0
  461. data/generated/lib/runtype/types/trace_log_entry_otlp_record_kind.rb +13 -0
  462. data/generated/lib/runtype/types/trace_log_entry_status.rb +16 -0
  463. data/generated/lib/runtype/types/trace_log_entry_type.rb +19 -0
  464. data/generated/lib/runtype/types/trace_node.rb +35 -0
  465. data/generated/lib/runtype/types/trace_node_lifecycle.rb +14 -0
  466. data/generated/lib/runtype/types/trace_node_node_type.rb +16 -0
  467. data/generated/lib/runtype/types/trace_produced_by.rb +37 -0
  468. data/generated/lib/runtype/types/trace_produced_by_source.rb +12 -0
  469. data/generated/lib/runtype/types/trace_tree.rb +41 -0
  470. data/generated/lib/runtype/types/trace_tree_availability.rb +13 -0
  471. data/generated/lib/runtype/types/trace_tree_availability_reason.rb +11 -0
  472. data/generated/lib/runtype/types/trace_tree_child_truncation.rb +15 -0
  473. data/generated/lib/runtype/types/trace_tree_child_truncation_reason.rb +11 -0
  474. data/generated/lib/runtype/types/trace_tree_source.rb +13 -0
  475. data/generated/lib/runtype/types/trace_tree_totals_source.rb +12 -0
  476. data/generated/lib/runtype/types/trace_tree_truncation.rb +13 -0
  477. data/generated/lib/runtype/types/trace_tree_truncation_reason.rb +11 -0
  478. data/generated/lib/runtype/users/types/get_v1users_profile_response_features.rb +2 -0
  479. data/generated/lib/runtype.rb +3506 -2910
  480. data/lib/runtype/agent_ensure.rb +64 -9
  481. data/lib/runtype/client.rb +1 -0
  482. data/lib/runtype/config_ensure.rb +272 -0
  483. data/lib/runtype/content_hash.rb +257 -0
  484. data/lib/runtype/detached_follow.rb +12 -0
  485. data/lib/runtype/errors.rb +42 -8
  486. data/lib/runtype/local_tool_runner.rb +3 -1
  487. data/lib/runtype/sdk_version.rb +1 -1
  488. data/lib/runtype.rb +2 -0
  489. metadata +370 -11
  490. data/generated/lib/runtype/agents/types/get_v1agents_id_export_runtime_response.rb +0 -25
  491. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_agent_version.rb +0 -17
  492. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_pending_approval.rb +0 -27
@@ -36,12 +36,22 @@ module Runtype
36
36
  # `deploy:`: `"publish"` also re-aims the `live` alias; default `"none"`.
37
37
  # @param deploy [Hash, String, Symbol, nil] activates the saved version at a
38
38
  # release alias, e.g. `{ alias: "pr-482" }` or the bare `"live"`. Omit
39
- # 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.
40
42
  # @param expected_remote_hash [String, nil] binds a dry run to its apply:
41
43
  # the write proceeds only if the remote still hashes to this value.
42
44
  # @param version [Hash, nil] provenance recorded on the version row this
43
45
  # converge appends, e.g. `{ label: "a1b2c3d", notes: "CI run 4821" }`.
44
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.
45
55
  # @param request_options [Hash] see {Runtype::Client#dispatch}.
46
56
  # @return [Hash] `{"result" => "unchanged"|"created"|"updated", "agentId",
47
57
  # "versionId", "contentHash"}`, or for a dry run `{"result" => "plan",
@@ -50,11 +60,13 @@ module Runtype
50
60
  # @raise [Runtype::EnsureConflictError] on a 409 (`external_modification`
51
61
  # or `remote_changed`).
52
62
  # @raise [Runtype::DriftError] with `expect_no_changes:` when the plan is
53
- # not `"none"`.
63
+ # not `"none"`, would change a skill binding or, with `release:` or
64
+ # `deploy:`, would move the alias or change its binding names.
54
65
  # @raise [ArgumentError] when both `release:` and `deploy:` are given, or
55
66
  # when `version:` carries a key other than `label:` and `notes:`.
56
67
  def ensure_agent(definition, dry_run: false, expect_no_changes: false, on_conflict: nil, release: nil,
57
- deploy: nil, expected_remote_hash: nil, version: nil, request_options: {})
68
+ deploy: nil, expected_remote_hash: nil, version: nil, skills: nil, capabilities: nil,
69
+ request_options: {})
58
70
  raise ArgumentError, RELEASE_DEPLOY_CONFLICT_MESSAGE if release && deploy
59
71
 
60
72
  definition = Runtype::AgentDefinition.from(definition)
@@ -63,7 +75,9 @@ module Runtype
63
75
  release: release&.to_s,
64
76
  deploy: deploy_intent(deploy),
65
77
  expectedRemoteHash: expected_remote_hash,
66
- version: version_metadata(version)
78
+ version: version_metadata(version),
79
+ skills: skills&.map(&:to_h),
80
+ capabilities: capabilities&.map(&:to_h)
67
81
  }.compact
68
82
 
69
83
  if dry_run || expect_no_changes
@@ -73,7 +87,7 @@ module Runtype
73
87
  unless plan["result"] == "plan"
74
88
  raise Runtype::Error, "Expected a plan result from dryRun, got #{plan["result"].inspect}"
75
89
  end
76
- 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)
77
91
 
78
92
  return plan
79
93
  end
@@ -107,13 +121,28 @@ module Runtype
107
121
 
108
122
  private
109
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
+
110
138
  # Normalizes the two accepted spellings of `deploy:` into the wire shape.
111
- # 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
112
140
  # way. The alias name itself is never resolved client-side.
113
141
  #
114
142
  # @param deploy [Hash, String, Symbol, nil]
115
- # @return [Hash, nil] `{ alias: "<name>" }`, or nil when nothing was asked.
116
- # @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.
117
146
  def deploy_intent(deploy)
118
147
  return nil if deploy.nil?
119
148
  return { alias: deploy.to_s } unless deploy.is_a?(Hash)
@@ -121,7 +150,33 @@ module Runtype
121
150
  name = deploy[:alias] || deploy["alias"]
122
151
  raise ArgumentError, "deploy: needs an alias name, e.g. deploy: { alias: \"live\" }." if name.nil?
123
152
 
124
- { 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
125
180
  end
126
181
 
127
182
  # Normalizes `version:` into the wire shape. Keys may be Symbols or Strings;
@@ -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
 
@@ -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
@@ -0,0 +1,257 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "digest"
4
+
5
+ module Runtype
6
+ # Canonical content hashes for the config-as-code ensure surfaces other than
7
+ # agents (see {AgentDefinition.content_hash_for}). Each is a wire contract
8
+ # with the API and the TypeScript SDK, pinned by the corpora under
9
+ # `packages/shared/test-fixtures/*-content-hash/cases.json`. A key absent
10
+ # from a Hash plays JavaScript's `undefined` (dropped); `nil` plays `null`.
11
+ module ContentHash
12
+ MAX_ARRAY_INDEX = 4_294_967_294
13
+ FPO_OPTIONAL_SECTIONS = %w[records schedules secrets evals skills].freeze
14
+ SERVER_SET_STACK_FIELDS = %w[detected declared hiddenAt].freeze
15
+
16
+ module_function
17
+
18
+ # @param steps [Array<Hash>] a flow's steps.
19
+ # @return [String] SHA-256 hex over the canonical step list.
20
+ def flow(steps)
21
+ sha256(normalize_flow_steps(steps))
22
+ end
23
+
24
+ # @param steps [Array<Hash>]
25
+ # @return [Array<Hash>] the canonical steps, sorted by `order`.
26
+ def normalize_flow_steps(steps)
27
+ Array(steps).each_with_index
28
+ .map { |step, index| legacy_flow_step_identity(stringify(step), index) }
29
+ .each_with_index
30
+ .sort_by { |step, index| [step_order(step), index] }
31
+ .map { |step, _index| normalize_flow_step(step) }
32
+ end
33
+
34
+ # @param definition [Hash] `{ name:, manifest: { frontmatter:, runtype:, body: } }`.
35
+ # @return [String] SHA-256 hex; the frontmatter name is identity, not content.
36
+ def skill(definition)
37
+ manifest = plain(stringify(definition)["manifest"])
38
+ frontmatter = plain(manifest["frontmatter"]).except("name")
39
+ runtype_block = manifest["runtype"]
40
+ body = manifest["body"]
41
+ sha256(
42
+ "frontmatter" => normalize_value(frontmatter),
43
+ "runtype" => runtype_block.is_a?(Hash) ? normalize_value(runtype_block) : {},
44
+ "body" => body.is_a?(String) ? body : ""
45
+ )
46
+ end
47
+
48
+ # @param definition [Hash] `{ name:, description:, toolType:, parametersSchema:, config: }`.
49
+ # @return [String] SHA-256 hex; the name is identity, not content.
50
+ def tool(definition)
51
+ wire = stringify(definition)
52
+ normalized = {}
53
+ normalized["toolType"] = wire["toolType"] if wire.key?("toolType")
54
+ normalized["description"] = wire["description"] if truthy?(wire["description"])
55
+ normalized["parametersSchema"] = object_or_empty(wire["parametersSchema"])
56
+ normalized["config"] = object_or_empty(wire["config"])
57
+ sha256(normalized)
58
+ end
59
+
60
+ # @param definition [Hash] `{ name:, type:, behavior:?, inbound:?, outbound:?, status:? }`.
61
+ # @return [String] SHA-256 hex.
62
+ def surface(definition)
63
+ wire = stringify(definition)
64
+ type_entry = wire.key?("type") ? { "type" => wire["type"] } : {}
65
+ behavior = wire["behavior"]
66
+ normalized = type_entry.dup
67
+ normalized["behavior"] = behavior.is_a?(Hash) ? normalize_value(type_entry.merge(behavior)) : type_entry.dup
68
+ normalized["status"] = truthy?(wire["status"]) ? wire["status"] : "draft"
69
+ normalized["environment"] = "development"
70
+ sha256(normalized)
71
+ end
72
+
73
+ # @param definition [Hash] `{ name:, description:?, icon:?, spec:? }`.
74
+ # @return [String] SHA-256 hex; the name is identity, not content.
75
+ def product(definition)
76
+ wire = stringify(definition)
77
+ normalized = {}
78
+ normalized["description"] = wire["description"] if truthy?(wire["description"])
79
+ normalized["icon"] = wire["icon"] if truthy?(wire["icon"])
80
+ normalized["spec"] = object_or_empty(as_saved_stack(wire["spec"]))
81
+ sha256(normalized)
82
+ end
83
+
84
+ # @param fpo [Hash] a Full Product Object.
85
+ # @return [String] SHA-256 hex; `_meta` and `product.name` are excluded.
86
+ def fpo(fpo)
87
+ wire = stringify(fpo)
88
+ normalized = {}
89
+ normalized["version"] = normalize_value(wire["version"]) unless wire["version"].nil?
90
+ normalized["product"] = normalize_value(plain(wire["product"]).except("name"))
91
+ %w[capabilities tools surfaces].each { |section| normalized[section] = normalize_value(wire[section] || []) }
92
+ FPO_OPTIONAL_SECTIONS.each do |section|
93
+ normalized[section] = normalize_value(wire[section]) unless wire[section].nil?
94
+ end
95
+ sha256(normalized)
96
+ end
97
+
98
+ # @param definition [Hash] an eval suite `{ name:, target:, cases:, virtual:, ... }`.
99
+ # @return [String] SHA-256 hex; cases sort by name, grader order is kept.
100
+ def eval_suite(definition)
101
+ wire = stringify(definition)
102
+ mode = truthy?(wire["recordedToolMode"]) ? wire["recordedToolMode"] : "next_step"
103
+ policy = truthy?(wire["recordedToolUnmatchedPolicy"]) ? wire["recordedToolUnmatchedPolicy"] : "fail"
104
+ canonical = {}
105
+ canonical["target"] = sort_keeping_nil(wire["target"]) if wire.key?("target")
106
+ canonical["virtual"] = wire["virtual"] if wire.key?("virtual")
107
+ canonical["recordedToolMode"] = mode unless mode == "next_step"
108
+ canonical["recordedToolUnmatchedPolicy"] = policy unless policy == "fail"
109
+ cases = Array(wire["cases"]).map { |entry| plain(entry) }
110
+ canonical["cases"] = cases.each_with_index
111
+ .sort_by { |entry, index| [utf16(entry["name"].to_s), index] }
112
+ .map { |entry, _index| canonical_case(entry) }
113
+ sha256(canonical)
114
+ end
115
+
116
+ # Drops nil entries and orders object keys the way `JSON.stringify` emits
117
+ # sorted keys, recursively; arrays keep their order.
118
+ #
119
+ # @param value [Object]
120
+ # @return [Object]
121
+ def normalize_value(value)
122
+ case value
123
+ when Array then value.map { |entry| normalize_value(entry) }
124
+ when Hash
125
+ entries = stringify(value)
126
+ entries.keys.sort_by { |key| json_key_order(key) }.each_with_object({}) do |key, out|
127
+ out[key] = normalize_value(entries[key]) unless entries[key].nil?
128
+ end
129
+ else value
130
+ end
131
+ end
132
+
133
+ # @return [String]
134
+ def sha256(value)
135
+ Digest::SHA256.hexdigest(Runtype::CanonicalJSON.generate(value))
136
+ end
137
+
138
+ def canonical_case(entry)
139
+ canonical = {}
140
+ canonical["name"] = entry["name"] if entry.key?("name")
141
+ canonical["input"] = sort_keeping_nil(entry["input"]) if entry.key?("input")
142
+ canonical["expected"] = sort_keeping_nil(entry["expected"]) if entry.key?("expected")
143
+ canonical["expect"] = Array(entry["expect"]).map { |grader| sort_keeping_nil(grader) }
144
+ canonical
145
+ end
146
+
147
+ def normalize_flow_step(step)
148
+ normalized = {
149
+ "type" => step["type"].is_a?(String) ? step["type"] : "",
150
+ "name" => step["name"].is_a?(String) ? step["name"] : "",
151
+ "enabled" => step["enabled"] != false
152
+ }
153
+ normalized["when"] = step["when"] if step["when"].is_a?(String)
154
+ normalized["config"] = normalize_flow_config(step["config"])
155
+ normalized["order"] = step_order(step)
156
+ normalized
157
+ end
158
+
159
+ # Sorts keys and keeps nil; one level of array items is normalized, deeper
160
+ # arrays keep their insertion key order, exactly as the TypeScript SDK does.
161
+ def normalize_flow_config(config)
162
+ return {} unless config.is_a?(Hash)
163
+
164
+ entries = stringify(config)
165
+ entries.keys.sort_by { |key| json_key_order(key) }.each_with_object({}) do |key, out|
166
+ value = entries[key]
167
+ out[key] =
168
+ case value
169
+ when Hash then normalize_flow_config(value)
170
+ when Array then value.map { |item| item.is_a?(Hash) ? normalize_flow_config(item) : js_emission_order(item) }
171
+ else value
172
+ end
173
+ end
174
+ end
175
+
176
+ # The key order `JSON.stringify` gives an object nobody sorted: canonical
177
+ # array indexes first, then insertion order.
178
+ def js_emission_order(value)
179
+ case value
180
+ when Array then value.map { |entry| js_emission_order(entry) }
181
+ when Hash
182
+ entries = stringify(value)
183
+ indexes, others = entries.keys.partition { |key| json_key_order(key).first.zero? }
184
+ (indexes.sort_by { |key| json_key_order(key) } + others).to_h { |key| [key, js_emission_order(entries[key])] }
185
+ else value
186
+ end
187
+ end
188
+
189
+ def sort_keeping_nil(value)
190
+ case value
191
+ when Array then value.map { |entry| sort_keeping_nil(entry) }
192
+ when Hash
193
+ entries = stringify(value)
194
+ entries.keys.sort_by { |key| json_key_order(key) }.to_h { |key| [key, sort_keeping_nil(entries[key])] }
195
+ else value
196
+ end
197
+ end
198
+
199
+ # A legacy step missing `name`/`order` defaults to `Step N`/`N`, as flow pull emits.
200
+ def legacy_flow_step_identity(step, index)
201
+ step.merge(
202
+ "name" => step["name"].is_a?(String) ? step["name"] : "Step #{index + 1}",
203
+ "order" => step["order"].is_a?(Numeric) ? step["order"] : index + 1
204
+ )
205
+ end
206
+
207
+ def step_order(step)
208
+ order = step.is_a?(Hash) ? step["order"] : nil
209
+ order.is_a?(Numeric) ? order : 0
210
+ end
211
+
212
+ def json_key_order(key)
213
+ if key.match?(/\A(?:0|[1-9]\d*)\z/) && key.to_i <= MAX_ARRAY_INDEX
214
+ [0, key.to_i, []]
215
+ else
216
+ [1, 0, utf16(key)]
217
+ end
218
+ end
219
+
220
+ def utf16(value)
221
+ value.encode("UTF-16LE").unpack("v*")
222
+ end
223
+
224
+ def object_or_empty(value)
225
+ value.is_a?(Hash) ? normalize_value(value) : {}
226
+ end
227
+
228
+ # `spec` with its stack as a save stores it: server-set fields dropped, `hidden` deduplicated.
229
+ def as_saved_stack(spec)
230
+ return spec unless spec.is_a?(Hash)
231
+
232
+ wire = stringify(spec)
233
+ return wire unless wire["stack"].is_a?(Hash)
234
+
235
+ stack = stringify(wire["stack"]).except(*SERVER_SET_STACK_FIELDS)
236
+ stack["hidden"] = stack["hidden"].uniq if stack["hidden"].is_a?(Array)
237
+ wire.merge("stack" => stack)
238
+ end
239
+
240
+ def plain(value)
241
+ value.is_a?(Hash) ? stringify(value) : {}
242
+ end
243
+
244
+ def stringify(value)
245
+ value.is_a?(Hash) ? value.to_h { |key, entry| [key.to_s, entry] } : {}
246
+ end
247
+
248
+ # JavaScript truthiness for the values a definition can hold.
249
+ def truthy?(value)
250
+ !(value.nil? || value == false || value == "" || (value.is_a?(Numeric) && value.zero?))
251
+ end
252
+
253
+ private_class_method :canonical_case, :normalize_flow_step, :normalize_flow_config, :js_emission_order,
254
+ :sort_keeping_nil, :step_order, :json_key_order, :utf16, :object_or_empty, :plain,
255
+ :stringify, :truthy?
256
+ end
257
+ end