runtype 0.3.0 → 0.5.0

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +152 -0
  3. data/README.md +88 -10
  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_data_item.rb +2 -0
  11. data/generated/lib/runtype/agent_aliases/types/get_v1agents_id_deployments_response_data_item.rb +2 -0
  12. data/generated/lib/runtype/agent_aliases/types/post_v1agents_id_aliases_alias_rollback_response.rb +2 -0
  13. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_request.rb +21 -0
  14. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_response.rb +19 -0
  15. data/generated/lib/runtype/agent_aliases/types/put_v1agents_id_aliases_alias_response.rb +2 -0
  16. data/generated/lib/runtype/agent_versions/client.rb +13 -1
  17. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request.rb +6 -0
  18. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment.rb +11 -0
  19. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment_action.rb +14 -0
  20. data/generated/lib/runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_response.rb +1 -1
  21. data/generated/lib/runtype/conversations/client.rb +28 -10
  22. data/generated/lib/runtype/conversations/types/get_v1conversations_id_response.rb +3 -1
  23. data/generated/lib/runtype/conversations/types/post_v1conversations_request.rb +6 -0
  24. data/generated/lib/runtype/conversations/types/post_v1conversations_response.rb +3 -1
  25. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request.rb +7 -1
  26. 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
  27. data/generated/lib/runtype/conversations/types/put_v1conversations_id_response.rb +3 -1
  28. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one.rb +2 -0
  29. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_history.rb +14 -0
  30. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item.rb +4 -0
  31. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_role.rb +1 -0
  32. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_calls_item.rb +17 -0
  33. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_results_item.rb +17 -0
  34. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero.rb +2 -0
  35. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_history.rb +14 -0
  36. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item.rb +4 -0
  37. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_role.rb +1 -0
  38. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_calls_item.rb +17 -0
  39. data/generated/lib/runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_results_item.rb +17 -0
  40. data/generated/lib/runtype/model_configs/types/post_v1model_configs_request_settings_custom_model.rb +2 -0
  41. data/generated/lib/runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_mid_conversation_system_messages.rb +14 -0
  42. data/generated/lib/runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model.rb +2 -0
  43. data/generated/lib/runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_mid_conversation_system_messages.rb +14 -0
  44. data/generated/lib/runtype/products/client.rb +45 -0
  45. data/generated/lib/runtype/products/types/get_v1products_id_activity_request.rb +13 -0
  46. data/generated/lib/runtype/products/types/get_v1products_id_activity_response.rb +13 -0
  47. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data.rb +13 -0
  48. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item.rb +17 -0
  49. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item.rb +77 -0
  50. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_agent_target_resolution.rb +15 -0
  51. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_agent_version.rb +17 -0
  52. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_execution_mode.rb +14 -0
  53. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_notification_mode.rb +15 -0
  54. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_pending_approval.rb +27 -0
  55. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_status.rb +19 -0
  56. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_agents_item_error.rb +11 -0
  57. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item.rb +19 -0
  58. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item.rb +15 -0
  59. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_agent_mode.rb +45 -0
  60. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields.rb +39 -0
  61. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields_metadata_schema.rb +11 -0
  62. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_error.rb +11 -0
  63. data/generated/lib/runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_source.rb +14 -0
  64. data/generated/lib/runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item.rb +2 -0
  65. data/generated/lib/runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item_mid_conversation_system_messages.rb +14 -0
  66. data/generated/lib/runtype/types/agent_ensure_deploy_target.rb +2 -0
  67. data/generated/lib/runtype/types/conflict_error_body_candidate_count.rb +21 -0
  68. data/generated/lib/runtype/types/conflict_error_body_candidate_count_code.rb +11 -0
  69. data/generated/lib/runtype/types/conversation_message_author.rb +16 -0
  70. data/generated/lib/runtype/types/conversation_message_author_type.rb +14 -0
  71. data/generated/lib/runtype/types/conversation_modified_error.rb +13 -0
  72. data/generated/lib/runtype/types/conversation_modified_error_code.rb +11 -0
  73. data/generated/lib/runtype/types/conversation_source.rb +14 -0
  74. data/generated/lib/runtype/types/conversation_transcript_message.rb +23 -0
  75. data/generated/lib/runtype/types/conversation_transcript_message_content.rb +14 -0
  76. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item.rb +21 -0
  77. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_asset_ref.rb +19 -0
  78. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_asset_ref_ref_kind.rb +12 -0
  79. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_file.rb +13 -0
  80. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_image.rb +11 -0
  81. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_reasoning.rb +11 -0
  82. data/generated/lib/runtype/types/conversation_transcript_message_content_one_item_text.rb +9 -0
  83. data/generated/lib/runtype/types/conversation_transcript_message_role.rb +14 -0
  84. data/generated/lib/runtype/types/conversation_transcript_message_tool_calls_item.rb +15 -0
  85. data/generated/lib/runtype/types/conversation_transcript_message_tool_results_item.rb +15 -0
  86. data/generated/lib/runtype.rb +59 -12
  87. data/lib/runtype/agent_ensure.rb +35 -3
  88. data/lib/runtype/agent_release_aliases.rb +146 -2
  89. data/lib/runtype/client.rb +21 -1
  90. data/lib/runtype/errors.rb +14 -2
  91. data/lib/runtype/raw_client_timeout.rb +56 -0
  92. data/lib/runtype/sdk_version.rb +2 -1
  93. data/lib/runtype.rb +1 -0
  94. metadata +58 -10
  95. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item.rb +0 -17
  96. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content.rb +0 -15
  97. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item.rb +0 -21
  98. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_asset_ref.rb +0 -21
  99. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_file.rb +0 -15
  100. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_image.rb +0 -13
  101. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_text.rb +0 -11
  102. data/generated/lib/runtype/conversations/types/put_v1conversations_id_request_messages_item_role.rb +0 -15
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module Types
5
+ class ConversationTranscriptMessageContentOneItemText < Internal::Types::Model
6
+ field :text, -> { String }, optional: false, nullable: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module Types
5
+ module ConversationTranscriptMessageRole
6
+ extend Runtype::Internal::Types::Enum
7
+
8
+ SYSTEM = "system"
9
+ USER = "user"
10
+ ASSISTANT = "assistant"
11
+ TOOL = "tool"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module Types
5
+ class ConversationTranscriptMessageToolCallsItem < Internal::Types::Model
6
+ field :args, -> { Internal::Types::Hash[String, Object] }, optional: true, nullable: false
7
+
8
+ field :provider_options, -> { Internal::Types::Hash[String, Object] }, optional: true, nullable: false, api_name: "providerOptions"
9
+
10
+ field :tool_call_id, -> { String }, optional: false, nullable: false, api_name: "toolCallId"
11
+
12
+ field :tool_name, -> { String }, optional: false, nullable: false, api_name: "toolName"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module Types
5
+ class ConversationTranscriptMessageToolResultsItem < Internal::Types::Model
6
+ field :provider_options, -> { Internal::Types::Hash[String, Object] }, optional: true, nullable: false, api_name: "providerOptions"
7
+
8
+ field :result, -> { Object }, optional: true, nullable: false
9
+
10
+ field :tool_call_id, -> { String }, optional: false, nullable: false, api_name: "toolCallId"
11
+
12
+ field :tool_name, -> { String }, optional: false, nullable: false, api_name: "toolName"
13
+ end
14
+ end
15
+ end
@@ -42,12 +42,17 @@ require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_response"
42
42
  require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_alias_response"
43
43
  require_relative "runtype/agent_aliases/types/put_v1agents_id_aliases_alias_response"
44
44
  require_relative "runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_response"
45
+ require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_alias_bindings_response"
46
+ require_relative "runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_response"
47
+ require_relative "runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_bindings_response"
45
48
  require_relative "runtype/agent_aliases/types/post_v1agents_id_aliases_alias_rollback_response"
46
49
  require_relative "runtype/agent_aliases/types/get_v1agents_id_deployments_response_data_item"
47
50
  require_relative "runtype/agent_aliases/types/get_v1agents_id_deployments_response"
48
51
  require_relative "runtype/agent_versions/types/get_v1agent_versions_agent_id_request_type"
49
52
  require_relative "runtype/agent_versions/types/get_v1agent_versions_agent_id_response_versions_item"
50
53
  require_relative "runtype/agent_versions/types/get_v1agent_versions_agent_id_response"
54
+ require_relative "runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment_action"
55
+ require_relative "runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_deployment"
51
56
  require_relative "runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_request_on_conflict"
52
57
  require_relative "runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_response_last_modified_source"
53
58
  require_relative "runtype/agent_versions/types/post_v1agent_versions_agent_id_publish_response"
@@ -593,19 +598,25 @@ require_relative "runtype/conversations/types/get_v1conversations_response_pagin
593
598
  require_relative "runtype/conversations/types/get_v1conversations_response"
594
599
  require_relative "runtype/conversations/types/post_v1conversations_response_schema_warnings_item"
595
600
  require_relative "runtype/conversations/types/post_v1conversations_response_source"
601
+ require_relative "runtype/types/conversation_message_author_type"
602
+ require_relative "runtype/types/conversation_message_author"
603
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_text"
604
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_image"
605
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_file"
606
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_reasoning"
607
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_asset_ref_ref_kind"
608
+ require_relative "runtype/types/conversation_transcript_message_content_one_item_asset_ref"
609
+ require_relative "runtype/types/conversation_transcript_message_content_one_item"
610
+ require_relative "runtype/types/conversation_transcript_message_content"
611
+ require_relative "runtype/types/conversation_transcript_message_role"
612
+ require_relative "runtype/types/conversation_transcript_message_tool_calls_item"
613
+ require_relative "runtype/types/conversation_transcript_message_tool_results_item"
614
+ require_relative "runtype/types/conversation_transcript_message"
596
615
  require_relative "runtype/conversations/types/post_v1conversations_response"
597
616
  require_relative "runtype/conversations/types/get_v1conversations_id_response_schema_warnings_item"
598
617
  require_relative "runtype/conversations/types/get_v1conversations_id_response_source"
599
618
  require_relative "runtype/conversations/types/get_v1conversations_id_response"
600
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_text"
601
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_image"
602
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_file"
603
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_asset_ref_ref_kind"
604
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item_asset_ref"
605
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content_one_item"
606
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_content"
607
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item_role"
608
- require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_item"
619
+ require_relative "runtype/conversations/types/put_v1conversations_id_request_messages_mode"
609
620
  require_relative "runtype/conversations/types/put_v1conversations_id_response_schema_warnings_item"
610
621
  require_relative "runtype/conversations/types/put_v1conversations_id_response_source"
611
622
  require_relative "runtype/conversations/types/put_v1conversations_id_response"
@@ -715,6 +726,7 @@ require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_credential
715
726
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_credential_proxies_item"
716
727
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_end_user"
717
728
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_flow"
729
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_history"
718
730
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_identity_proof"
719
731
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_content_one_item_text"
720
732
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_content_one_item_image"
@@ -723,6 +735,8 @@ require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_i
723
735
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_content_one_item"
724
736
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_content"
725
737
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_role"
738
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_calls_item"
739
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item_tool_results_item"
726
740
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_messages_item"
727
741
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_options_environment"
728
742
  require_relative "runtype/dispatch/types/post_v1dispatch_request_zero_options_flow_mode"
@@ -815,6 +829,7 @@ require_relative "runtype/dispatch/types/post_v1dispatch_request_one_credential_
815
829
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_credential_proxies_item"
816
830
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_end_user"
817
831
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_flow"
832
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_one_history"
818
833
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_identity_proof"
819
834
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_content_one_item_text"
820
835
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_content_one_item_image"
@@ -823,6 +838,8 @@ require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_it
823
838
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_content_one_item"
824
839
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_content"
825
840
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_role"
841
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_calls_item"
842
+ require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item_tool_results_item"
826
843
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_messages_item"
827
844
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_options_environment"
828
845
  require_relative "runtype/dispatch/types/post_v1dispatch_request_one_options_flow_mode"
@@ -1215,6 +1232,7 @@ require_relative "runtype/model_configs/types/get_v1model_configs_response"
1215
1232
  require_relative "runtype/model_configs/types/post_v1model_configs_request_provider"
1216
1233
  require_relative "runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_executor_config"
1217
1234
  require_relative "runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_executor_provider"
1235
+ require_relative "runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_mid_conversation_system_messages"
1218
1236
  require_relative "runtype/model_configs/types/post_v1model_configs_request_settings_custom_model_reasoning"
1219
1237
  require_relative "runtype/model_configs/types/post_v1model_configs_request_settings_custom_model"
1220
1238
  require_relative "runtype/model_configs/types/post_v1model_configs_request_settings"
@@ -1251,6 +1269,7 @@ require_relative "runtype/model_configs/types/get_v1model_configs_usage_response
1251
1269
  require_relative "runtype/model_configs/types/get_v1model_configs_usage_response"
1252
1270
  require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_executor_config"
1253
1271
  require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_executor_provider"
1272
+ require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_mid_conversation_system_messages"
1254
1273
  require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model_reasoning"
1255
1274
  require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings_custom_model"
1256
1275
  require_relative "runtype/model_configs/types/put_v1model_configs_id_request_settings"
@@ -1342,6 +1361,24 @@ require_relative "runtype/products/types/put_v1products_id_request_spec_tech_sta
1342
1361
  require_relative "runtype/products/types/put_v1products_id_request_spec"
1343
1362
  require_relative "runtype/products/types/put_v1products_id_response"
1344
1363
  require_relative "runtype/products/types/delete_v1products_id_response"
1364
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_agent_target_resolution"
1365
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_agent_version"
1366
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_execution_mode"
1367
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_notification_mode"
1368
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_pending_approval"
1369
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item_status"
1370
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_data_item"
1371
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item_error"
1372
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_agents_item"
1373
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_agent_mode"
1374
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields_metadata_schema"
1375
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item_available_fields"
1376
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_data_item"
1377
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_error"
1378
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item_source"
1379
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data_surfaces_item"
1380
+ require_relative "runtype/products/types/get_v1products_id_activity_response_data"
1381
+ require_relative "runtype/products/types/get_v1products_id_activity_response"
1345
1382
  require_relative "runtype/products/types/post_v1products_id_capabilities_response"
1346
1383
  require_relative "runtype/products/types/put_v1products_id_capabilities_capability_id_response"
1347
1384
  require_relative "runtype/products/types/delete_v1products_id_capabilities_capability_id_response"
@@ -1564,6 +1601,7 @@ require_relative "runtype/provider_keys/types/patch_v1provider_keys_id_response_
1564
1601
  require_relative "runtype/provider_keys/types/patch_v1provider_keys_id_response"
1565
1602
  require_relative "runtype/provider_keys/types/post_v1provider_keys_id_discover_models_response_models_item"
1566
1603
  require_relative "runtype/provider_keys/types/post_v1provider_keys_id_discover_models_response"
1604
+ require_relative "runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item_mid_conversation_system_messages"
1567
1605
  require_relative "runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item_reasoning"
1568
1606
  require_relative "runtype/provider_keys/types/post_v1provider_keys_id_sync_models_request_models_item"
1569
1607
  require_relative "runtype/provider_keys/types/post_v1provider_keys_id_sync_models_response"
@@ -1916,16 +1954,17 @@ require_relative "runtype/types/conflict_error_body_last_modified_source"
1916
1954
  require_relative "runtype/types/conflict_error_body_organization_model_config_migrated"
1917
1955
  require_relative "runtype/types/conflict_error_body_organization_connection_migrated"
1918
1956
  require_relative "runtype/types/conflict_error_body"
1919
- require_relative "runtype/types/not_found_error_body_code"
1920
- require_relative "runtype/types/not_found_error_body"
1921
1957
  require_relative "runtype/types/precondition_failed_error_body_code"
1922
1958
  require_relative "runtype/types/error_details_item"
1923
1959
  require_relative "runtype/types/error"
1924
1960
  require_relative "runtype/types/precondition_failed_error_body"
1961
+ require_relative "runtype/types/not_found_error_body_code"
1962
+ require_relative "runtype/types/not_found_error_body"
1925
1963
  require_relative "runtype/types/unprocessable_entity_error_body_code"
1926
1964
  require_relative "runtype/types/unprocessable_entity_error_body"
1927
- require_relative "runtype/types/conflict_error_body_organization_model_config_needs_configuration"
1928
1965
  require_relative "runtype/types/bad_request_error_body_code"
1966
+ require_relative "runtype/types/conflict_error_body_candidate_count_code"
1967
+ require_relative "runtype/types/conflict_error_body_candidate_count"
1929
1968
  require_relative "runtype/types/service_unavailable_error_body_code"
1930
1969
  require_relative "runtype/types/service_unavailable_error_body"
1931
1970
  require_relative "runtype/types/forbidden_error_body_code"
@@ -1947,6 +1986,7 @@ require_relative "runtype/types/payment_required_error_body"
1947
1986
  require_relative "runtype/types/forbidden_error_body_error"
1948
1987
  require_relative "runtype/types/not_implemented_error_body_code"
1949
1988
  require_relative "runtype/types/not_implemented_error_body"
1989
+ require_relative "runtype/types/conflict_error_body_organization_model_config_needs_configuration"
1950
1990
  require_relative "runtype/types/bad_request_error_body_error"
1951
1991
  require_relative "runtype/types/internal_server_error_body_error"
1952
1992
  require_relative "runtype/types/internal_server_error_body_errors_item"
@@ -2121,6 +2161,9 @@ require_relative "runtype/types/client_input_delivery_receipt"
2121
2161
  require_relative "runtype/types/conversation_busy_error_code"
2122
2162
  require_relative "runtype/types/conversation_busy_error_phase"
2123
2163
  require_relative "runtype/types/conversation_busy_error"
2164
+ require_relative "runtype/types/conversation_modified_error_code"
2165
+ require_relative "runtype/types/conversation_modified_error"
2166
+ require_relative "runtype/types/conversation_source"
2124
2167
  require_relative "runtype/types/daily_usage_response_daily_execution_cap_reason"
2125
2168
  require_relative "runtype/types/daily_usage_response_daily"
2126
2169
  require_relative "runtype/types/daily_usage_response_monthly_execution_cap_reason"
@@ -2454,6 +2497,9 @@ require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_request"
2454
2497
  require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_alias_request"
2455
2498
  require_relative "runtype/agent_aliases/types/put_v1agents_id_aliases_alias_request"
2456
2499
  require_relative "runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_request"
2500
+ require_relative "runtype/agent_aliases/types/get_v1agents_id_aliases_alias_bindings_request"
2501
+ require_relative "runtype/agent_aliases/types/put_v1agents_id_aliases_alias_bindings_request"
2502
+ require_relative "runtype/agent_aliases/types/delete_v1agents_id_aliases_alias_bindings_request"
2457
2503
  require_relative "runtype/agent_aliases/types/post_v1agents_id_aliases_alias_rollback_request"
2458
2504
  require_relative "runtype/agent_aliases/types/get_v1agents_id_deployments_request"
2459
2505
  require_relative "runtype/agent_versions/client"
@@ -2728,6 +2774,7 @@ require_relative "runtype/products/types/get_v1products_pull_fpo_request"
2728
2774
  require_relative "runtype/products/types/get_v1products_id_request"
2729
2775
  require_relative "runtype/products/types/put_v1products_id_request"
2730
2776
  require_relative "runtype/products/types/delete_v1products_id_request"
2777
+ require_relative "runtype/products/types/get_v1products_id_activity_request"
2731
2778
  require_relative "runtype/products/types/post_v1products_id_capabilities_request"
2732
2779
  require_relative "runtype/products/types/put_v1products_id_capabilities_capability_id_request"
2733
2780
  require_relative "runtype/products/types/delete_v1products_id_capabilities_capability_id_request"
@@ -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
@@ -35,6 +39,9 @@ module Runtype
35
39
  # both `release:` and `deploy:` to save without activating.
36
40
  # @param expected_remote_hash [String, nil] binds a dry run to its apply:
37
41
  # the write proceeds only if the remote still hashes to this value.
42
+ # @param version [Hash, nil] provenance recorded on the version row this
43
+ # converge appends, e.g. `{ label: "a1b2c3d", notes: "CI run 4821" }`.
44
+ # Omit to keep the default `"sdk-ensure"` label and the server's notes.
38
45
  # @param request_options [Hash] see {Runtype::Client#dispatch}.
39
46
  # @return [Hash] `{"result" => "unchanged"|"created"|"updated", "agentId",
40
47
  # "versionId", "contentHash"}`, or for a dry run `{"result" => "plan",
@@ -44,9 +51,10 @@ module Runtype
44
51
  # or `remote_changed`).
45
52
  # @raise [Runtype::DriftError] with `expect_no_changes:` when the plan is
46
53
  # not `"none"`.
47
- # @raise [ArgumentError] when both `release:` and `deploy:` are given.
54
+ # @raise [ArgumentError] when both `release:` and `deploy:` are given, or
55
+ # when `version:` carries a key other than `label:` and `notes:`.
48
56
  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: {})
57
+ deploy: nil, expected_remote_hash: nil, version: nil, request_options: {})
50
58
  raise ArgumentError, RELEASE_DEPLOY_CONFLICT_MESSAGE if release && deploy
51
59
 
52
60
  definition = Runtype::AgentDefinition.from(definition)
@@ -54,7 +62,8 @@ module Runtype
54
62
  onConflict: on_conflict&.to_s,
55
63
  release: release&.to_s,
56
64
  deploy: deploy_intent(deploy),
57
- expectedRemoteHash: expected_remote_hash
65
+ expectedRemoteHash: expected_remote_hash,
66
+ version: version_metadata(version)
58
67
  }.compact
59
68
 
60
69
  if dry_run || expect_no_changes
@@ -115,6 +124,29 @@ module Runtype
115
124
  { alias: name.to_s }
116
125
  end
117
126
 
127
+ # Normalizes `version:` into the wire shape. Keys may be Symbols or Strings;
128
+ # an unknown key raises here rather than reaching the server's strict 400.
129
+ # A hash whose values are all nil is treated as omitted, so
130
+ # `version: { label: ENV["GIT_SHA"] }` outside CI still saves — the same
131
+ # reading the API gives an empty label, which falls back to `"sdk-ensure"`.
132
+ #
133
+ # @param version [Hash, nil]
134
+ # @return [Hash, nil] `{ label:, notes: }`, or nil when nothing was asked.
135
+ # @raise [ArgumentError] on a non-Hash or an unrecognized key.
136
+ def version_metadata(version)
137
+ return nil if version.nil?
138
+ raise ArgumentError, "version: needs a Hash, e.g. version: { label: \"a1b2c3d\" }." unless version.is_a?(Hash)
139
+
140
+ metadata = version.each_with_object({}) do |(key, value), acc|
141
+ name = key.to_sym
142
+ raise ArgumentError, "version: accepts label: and notes:, not #{key.inspect}." unless
143
+ VERSION_METADATA_KEYS.include?(name)
144
+
145
+ acc[name] = value.to_s unless value.nil?
146
+ end
147
+ metadata.empty? ? nil : metadata
148
+ end
149
+
118
150
  # @return [Hash{String => String}] `name:localHash` => server hash, so a
119
151
  # hot process pays the probe once per definition.
120
152
  def ensure_memo
@@ -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
@@ -53,7 +53,10 @@ module Runtype
53
53
 
54
54
  # @param api_key [String, nil] defaults to `RUNTYPE_API_KEY`.
55
55
  # @param base_url [String] defaults to `RUNTYPE_BASE_URL`, then production.
56
- # @param timeout [Numeric, nil] per-operation socket timeout in seconds.
56
+ # @param timeout [Numeric, nil] per-operation socket timeout in seconds,
57
+ # defaulting to {DEFAULT_TIMEOUT}. Governs the dispatch and streaming
58
+ # paths and every generated resource call alike; a single call overrides
59
+ # it with `request_options: { timeout_in_seconds: n }`.
57
60
  # @param max_retries [Integer] retries for generated resource calls. The
58
61
  # dispatch paths never retry: replaying an execution would run it twice.
59
62
  # @raise [Runtype::AuthenticationError] when no API key is available.
@@ -79,6 +82,8 @@ module Runtype
79
82
  authorization: bearer_token,
80
83
  max_retries: max_retries
81
84
  )
85
+ # WORKAROUND(fern ruby generator): BaseClient takes no timeout, so seed the transport it just built.
86
+ Runtype::RawClientTimeout.apply(generated_raw_client, timeout: @timeout)
82
87
  end
83
88
 
84
89
  # Executes a flow or agent and waits for the complete JSON response.
@@ -193,6 +198,21 @@ module Runtype
193
198
 
194
199
  private
195
200
 
201
+ # The transport {#api} shares with every resource sub-client it builds.
202
+ # Read once at construction, before any sub-client has memoized it.
203
+ #
204
+ # @return [Runtype::Internal::Http::RawClient]
205
+ # @raise [Runtype::Error] when the generated core no longer holds one, which
206
+ # means the timeout can no longer be applied to generated calls.
207
+ def generated_raw_client
208
+ raw = @api.instance_variable_get(:@raw_client)
209
+ return raw if raw.is_a?(Runtype::Internal::Http::RawClient)
210
+
211
+ raise Runtype::Error,
212
+ "Runtype::BaseClient no longer exposes @raw_client, so Runtype::Client cannot apply its timeout " \
213
+ "to generated calls. Rewire Runtype::RawClientTimeout against the generated core's new shape."
214
+ end
215
+
196
216
  # @return [String]
197
217
  def bearer_token
198
218
  "Bearer #{@api_key}"
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "timeout"
4
+
3
5
  module Runtype
4
6
  # Base class for every error the overlay raises. Rescue this to catch all of
5
7
  # them regardless of which generated resource produced the failure.
@@ -28,12 +30,20 @@ module Runtype
28
30
  # Translates a Fern-generated error into the curated equivalent. Errors that
29
31
  # are not generated API errors are returned unchanged.
30
32
  #
33
+ # A socket timeout is translated too: the generated methods rescue
34
+ # `Net::HTTPRequestTimeout`, a 408 response class no socket ever raises, so
35
+ # `Net::OpenTimeout`, `Net::ReadTimeout` and `Net::WriteTimeout` reach here
36
+ # untranslated. They all descend from `Timeout::Error`, so one clause covers
37
+ # connect, read and write, matching {Runtype::Streaming::Connection}.
38
+ #
31
39
  # @param error [Exception]
32
40
  # @return [Exception]
33
41
  def self.from_generated(error)
34
42
  case error
35
43
  when Runtype::Errors::TimeoutError
36
44
  APITimeoutError.new("Request timed out")
45
+ when ::Timeout::Error
46
+ APITimeoutError.new("Request timed out: #{error.message}")
37
47
  when Runtype::Errors::ResponseError
38
48
  from_response(status: error.code, body: error.message)
39
49
  when Runtype::Errors::ApiError
@@ -235,7 +245,9 @@ module Runtype
235
245
  class APIConnectionError < Error; end
236
246
 
237
247
  # Runs a block, re-raising Fern-generated errors as their curated equivalents
238
- # so callers keep one stable rescue surface across regenerations.
248
+ # so callers keep one stable rescue surface across regenerations. A socket
249
+ # timeout raised inside a generated call is curated here too, as
250
+ # {Runtype::APITimeoutError}.
239
251
  #
240
252
  # @example
241
253
  # Runtype.wrap_errors { client.flows.list_flows }
@@ -243,7 +255,7 @@ module Runtype
243
255
  # @return [Object] whatever the block returns.
244
256
  def self.wrap_errors
245
257
  yield
246
- rescue Runtype::Errors::ApiError => e
258
+ rescue Runtype::Errors::ApiError, ::Timeout::Error => e
247
259
  raise Runtype::Error.from_generated(e)
248
260
  end
249
261
  end