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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d23cd0d2f0bdb92ba4fadac9b25290bd05bd56b768bd504ce72734ac55fa86a7
4
- data.tar.gz: 5e14e7acb3005a4fae7c6bfd6a0e9bba5d9743c2012e2a0235515aa72ff20da6
3
+ metadata.gz: d76301f01717eb2c8c268aa576abea7ab7281c9e333ef117bc8fd2786dffe4a4
4
+ data.tar.gz: 9e1210dc611fc2db3c7f2f949dbff9eb24cc3f1aeb7e2c8b64a5b62660cd4f8d
5
5
  SHA512:
6
- metadata.gz: 8fbe5f379329fd9dfb6b282c569f144154aeb4e786fb274a42256130dff35ab6e03a69689b747c95945806403eacfa862efcc74c93f1d8d9b0f7e1113cb866e0
7
- data.tar.gz: 3b1101e037ea23e8af4fbeb207464f91bf147a5ba7cb70bdb5a99d900815a137656c541b9b81dd72a44ff6e3728539af414f2db0e5c98fb643d60af14f22b393
6
+ metadata.gz: a24d85ce1007caa25806f38f04b6b3cd5f1f1eb1b0b71b77e3817b464501dfc7cfb151916d9f282a9252dad90018ee39871c1c39a97fab5659e6731289bbbb68
7
+ data.tar.gz: d909413a2c441648bf3b0387355e0479e549fa556cc4e13fe9ce9a0ac1592e0477066181d12e797868d672cf8f4a0e2f1bd05481a8b8a21f631c6353d5c0d806
data/CHANGELOG.md CHANGED
@@ -1,5 +1,157 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c6dee53: Regenerate the Java, Python and Ruby SDK cores from the OpenAPI spec (spec 1228fedfe63e -> 14f6826470f1, output aca7693058e4).
8
+
9
+ API changes:
10
+ - breaking: POST /v1/agent-versions/{agentId}/publish response 200: property "applied" is now optional
11
+ - breaking: POST /v1/agent-versions/{agentId}/publish response 409<allOf[0]>: property "lastModifiedSource" is now optional
12
+ - breaking: POST /v1/agents/{id}/execute response 409: anyOf composition changed (0 -> 1 branches)
13
+ - breaking: POST /v1/agents/{id}/execute response 409: property "candidateCount" removed
14
+ - breaking: POST /v1/agents/{id}/execute response 409: property "code" removed
15
+ - breaking: POST /v1/agents/{id}/execute response 409: property "configId" removed
16
+ - breaking: POST /v1/agents/{id}/execute response 409: property "details" removed
17
+ - breaking: POST /v1/agents/{id}/execute response 409: property "error" removed
18
+ - breaking: POST /v1/agents/{id}/execute response 409: property "modelId" removed
19
+ - breaking: POST /v1/agents/{id}/execute response 409: property "provider" removed
20
+ - breaking: POST /v1/agents/{id}/execute response 409: type changed object -> anyOf
21
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]: anyOf composition changed (4 -> 5 branches)
22
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "assetId" removed
23
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "filename" removed
24
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "mimeType" removed
25
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "orgKey" removed
26
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "refKind" removed
27
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: property "sizeBytes" removed
28
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>: required property "text" added
29
+ - breaking: PUT /v1/conversations/{id} request.messages[].content<anyOf[1]>[]<anyOf[3]>.type: enum value "asset_ref" removed
30
+ - breaking: schema ClientInputDeliveryReceipt: required property "initial" added
31
+ - breaking: schema InputDeliveryReceipt: required property "initial" added
32
+ - added: DELETE /v1/agents/{id}/aliases/{alias}/bindings: operation added
33
+ - added: GET /v1/agent-aliases: operation added
34
+ - added: GET /v1/agents/{id}/aliases response 200.data[]: required property "bindingNames" added
35
+ - added: GET /v1/agents/{id}/aliases/{alias} response 200: required property "bindingNames" added
36
+ - added: GET /v1/agents/{id}/aliases/{alias}/bindings: operation added
37
+ - added: GET /v1/agents/{id}/deployments response 200.data[]: required property "bindings" added
38
+ - added: GET /v1/conversations/{id} response 200: property "imported" added
39
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "author" added
40
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "createdAt" added
41
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "id" added
42
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "metadata" added
43
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "toolCalls" added
44
+ - added: GET /v1/conversations/{id} response 200.messages[]: property "toolResults" added
45
+ - added: GET /v1/conversations/{id} response 200.messages[]: required property "content" added
46
+ - added: GET /v1/conversations/{id} response 200.messages[]: required property "role" added
47
+ - added: GET /v1/products/{id}/activity: operation added
48
+ - added: POST /v1/agent-versions/{agentId}/publish: header parameter "idempotency-key" added
49
+ - added: POST /v1/agent-versions/{agentId}/publish: header parameter "if-match" added
50
+ - added: POST /v1/agent-versions/{agentId}/publish: response 412 added
51
+ - added: POST /v1/agent-versions/{agentId}/publish request: property "deployment" added
52
+ - added: POST /v1/agent-versions/{agentId}/publish response 409<allOf[0]>: property "expectedVersionId" added
53
+ - added: POST /v1/agent-versions/{agentId}/publish response 409<allOf[0]>.code: enum value "idempotency_key_reused" added
54
+ - added: POST /v1/agent-versions/{agentId}/publish response 409<allOf[0]>.code: enum value "rollback_target_mismatch" added
55
+ - added: POST /v1/agents/{id}/aliases/{alias}/rollback response 200: required property "activePreviewCount" added
56
+ - added: POST /v1/agents/{id}/aliases/{alias}/rollback response 200: required property "bindingNames" added
57
+ - added: POST /v1/agents/{id}/aliases/{alias}/rollback response 200: required property "previewLimit" added
58
+ - added: POST /v1/agents/{id}/execute: response 413 added
59
+ - added: POST /v1/agents/{id}/execute response 409: anyOf branch "ConversationBusyError" added
60
+ - added: POST /v1/agents/{id}/execute response 409: anyOf branch "ConversationModifiedError" added
61
+ - added: POST /v1/agents/ensure: response 429 added
62
+ - added: POST /v1/conversations: response 200 added
63
+ - added: POST /v1/conversations: response 404 added
64
+ - added: POST /v1/conversations request: property "agentId" added
65
+ - added: POST /v1/conversations request: property "messages" added
66
+ - added: POST /v1/conversations request: property "source" added
67
+ - added: POST /v1/conversations response 201: property "imported" added
68
+ - added: POST /v1/conversations response 201.messages[]: property "author" added
69
+ - added: POST /v1/conversations response 201.messages[]: property "createdAt" added
70
+ - … 68 more changes
71
+
72
+ SDK surface:
73
+ - java: 657 public symbols added, 156 removed
74
+ - removed: `Builder`
75
+ - removed: `Builder.additionalProperties`
76
+ - removed: `Builder.additionalProperty`
77
+ - removed: `Builder.build`
78
+ - removed: `Builder.content`
79
+ - removed: `Builder.createdAt`
80
+ - removed: `Builder.from`
81
+ - removed: `Builder.id`
82
+ - removed: `Builder.role`
83
+ - removed: `ContentStage`
84
+ - removed: `IdStage`
85
+ - removed: `PutV1ConversationsIdRequestMessagesItem`
86
+ - removed: `PutV1ConversationsIdRequestMessagesItem.builder`
87
+ - removed: `PutV1ConversationsIdRequestMessagesItem.equals`
88
+ - removed: `PutV1ConversationsIdRequestMessagesItem.getAdditionalProperties`
89
+ - removed: `PutV1ConversationsIdRequestMessagesItem.getContent`
90
+ - removed: `PutV1ConversationsIdRequestMessagesItem.getCreatedAt`
91
+ - removed: `PutV1ConversationsIdRequestMessagesItem.getId`
92
+ - removed: `PutV1ConversationsIdRequestMessagesItem.getRole`
93
+ - removed: `PutV1ConversationsIdRequestMessagesItem.hashCode`
94
+ - … 136 more removed
95
+ - python: 22 public symbols added, 9 removed
96
+ - removed: `PutV1ConversationsIdRequestMessagesItem`
97
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItem_AssetRef`
98
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItem_File`
99
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItem_Image`
100
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItem_Text`
101
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItemAssetRef`
102
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItemFile`
103
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItemImage`
104
+ - removed: `PutV1ConversationsIdRequestMessagesItemContentOneItemText`
105
+ - ruby: 113 public symbols added, 36 removed
106
+ - removed: `Conversations`
107
+ - removed: `PutV1ConversationsIDRequestMessagesItem`
108
+ - removed: `Runtype`
109
+ - removed: `Types`
110
+ - removed: `Conversations`
111
+ - removed: `PutV1ConversationsIDRequestMessagesItemContent`
112
+ - removed: `Runtype`
113
+ - removed: `Types`
114
+ - removed: `Conversations`
115
+ - removed: `PutV1ConversationsIDRequestMessagesItemContentOneItem`
116
+ - removed: `Runtype`
117
+ - removed: `Types`
118
+ - removed: `Conversations`
119
+ - removed: `PutV1ConversationsIDRequestMessagesItemContentOneItemAssetRef`
120
+ - removed: `Runtype`
121
+ - removed: `Types`
122
+ - removed: `Conversations`
123
+ - removed: `PutV1ConversationsIDRequestMessagesItemContentOneItemAssetRefRefKind`
124
+ - removed: `Runtype`
125
+ - removed: `Types`
126
+ - … 16 more removed
127
+
128
+ ### Patch Changes
129
+
130
+ - a2839fb: `Runtype::Client.new(timeout:)` now governs generated resource calls, not only the dispatch and streaming paths. The generated `BaseClient` accepts no timeout, so every `client.flows.*`, `client.evals.*` and delegated `client.api.*` call ran under the code generator's 60 second default no matter what the client was given; a synchronous eval run that took 80 seconds always timed out. The documented 600 second default now actually applies, and `request_options: { timeout_in_seconds: n }` overrides it for one call, on a copy of the transport so a client shared across threads is never mutated mid-call.
131
+
132
+ A socket timeout inside a generated call is also curated now. The generated methods rescue `Net::HTTPRequestTimeout`, a 408 response class no socket ever raises, so `Net::ReadTimeout` escaped the `Runtype::Error` tree entirely. `Runtype.wrap_errors` and `Runtype::Error.from_generated` translate `Timeout::Error` (which covers open, read and write timeouts) into `Runtype::APITimeoutError` carrying the original message, matching what the streaming path already did.
133
+
134
+ - ffccd92: `Runtype::Client#archive_agent_alias_everywhere` no longer absorbs an SDK defect
135
+ as an ordinary per-agent failure row. Its per-row rescue is now the curated
136
+ `Runtype::Error` tree plus the transport exceptions `Net::HTTP` raises below
137
+ `Runtype.wrap_errors` (`Timeout::Error`, `OpenSSL::SSL::SSLError`,
138
+ `SocketError`, `SystemCallError`, `IOError`) — the same set
139
+ `Runtype::Streaming::Connection` translates. A `NoMethodError` on a malformed
140
+ generated model, or any other programming error, now aborts the sweep loudly
141
+ instead of making it look complete with an extra `"failed"` row.
142
+
143
+ ## 0.4.0
144
+
145
+ ### Minor Changes
146
+
147
+ - fdeed1b: Ruby SDK release-alias parity. `Runtype::Client#ensure_agent(version:)` stamps the version row a converge appends with your own `label:` and `notes:`, which is what the agent page, the deployment receipts and the compare-to-live view key on; omit it and the label stays `"sdk-ensure"` with server-generated notes. It rides the hash probe, the full-definition request and a dry run alike.
148
+
149
+ `Runtype::Client#activate_agent_alias(promotion:)` links the source-organization ids and hashes a cross-organization promotion came from onto the deployment receipt, so a production receipt can name the staging version it was promoted from. Provenance only: it authorizes nothing, and the activating credentials alone decide what the activation may do. Takes either key spelling or a `Runtype::Types::AgentDeploymentPromotion`.
150
+
151
+ `Runtype::Client#list_agent_aliases_by_name` reads one pointer name across the whole organization (`GET /v1/agent-aliases`), with each agent's revision to quote back as `If-Match`, and `#archive_agent_alias_everywhere` sweeps that name off every agent carrying it — the cleanup a closed pull request runs. Each row is archived under the revision just read, so a concurrent deploy answers 412 instead of racing, and one agent's failure is reported in `"failed"` rather than aborting the rest — transport failures (DNS, TLS, a connection reset) included, since those are raised by `Net::HTTP` and never reach the curated error tree. `dry_run:` reports what would be archived and archives nothing.
152
+
153
+ Both `version:` and `promotion:` refuse an unrecognized key with an `ArgumentError` naming the accepted ones, rather than letting the server's strict schemas answer a 400; a hash whose values are all `nil` is treated as omitted, so building one from environment variables that may be absent still works.
154
+
3
155
  All notable changes to the Runtype Ruby SDK are documented here.
4
156
 
5
157
  ## 0.3.0
data/README.md CHANGED
@@ -119,6 +119,34 @@ client.archive_agent_alias(agent_id, "pr-482", revision: preview.revision)
119
119
  client.list_agent_deployments(agent_id, alias_name: "live", limit: 20)
120
120
  ```
121
121
 
122
+ ### Closing a pull request
123
+
124
+ One pointer name usually spans several agents, so the cleanup a closed pull
125
+ request runs is org-wide rather than per agent:
126
+
127
+ ```ruby
128
+ client.list_agent_aliases_by_name("pr-482") # every agent carrying it, with each revision
129
+ client.archive_agent_alias_everywhere("pr-482", dry_run: true) # report, archive nothing
130
+ client.archive_agent_alias_everywhere("pr-482")
131
+ ```
132
+
133
+ The sweep archives each pointer under the revision it just read, so a concurrent
134
+ deploy answers 412 instead of racing. One agent's failure is reported rather than
135
+ aborting the rest, transport failures included:
136
+
137
+ ```ruby
138
+ sweep = client.archive_agent_alias_everywhere("pr-482")
139
+ sweep["archived"] # [{"agentId", "agentName", "revision", "receiptId"}, ...]
140
+ sweep["failed"] # [{"agentId", "agentName", "error", "code" => "alias_revision_mismatch"}, ...]
141
+ ```
142
+
143
+ `"code"` is the alias plane's refusal code and is absent on a transport failure
144
+ (DNS, TLS, a connection reset), which is reported with its message alone.
145
+
146
+ Only active pointers are listed, so a second run archives nothing. A dry run
147
+ answers `{"alias", "dryRun" => true, "wouldArchive" => [<row>]}` with the listed
148
+ rows unchanged.
149
+
122
150
  `version_id` is sent exactly as given: the SDK never resolves an alias to a version
123
151
  for you. `revision:` is the alias revision you read back from `get_agent_alias`, sent
124
152
  as `If-Match`; moving an existing `live` pointer requires it, and a stale value is a
@@ -139,6 +167,20 @@ client.ensure_agent(assistant, deploy: "live") # a bare String name
139
167
  `release: "publish"` is the older spelling of `deploy: { alias: "live" }`. Passing both
140
168
  raises an `ArgumentError` with the same sentence the API answers a 400 with.
141
169
 
170
+ `version:` stamps the appended version row with your own provenance, which is what the
171
+ agent page, the receipts and the compare-to-live view key on. Omit it and the label is
172
+ `"sdk-ensure"` with server-generated notes:
173
+
174
+ ```ruby
175
+ client.ensure_agent(assistant, deploy: "live",
176
+ version: { label: ENV.fetch("GITHUB_SHA")[0, 7],
177
+ notes: "Promoted from CI run #{ENV.fetch("GITHUB_RUN_ID")}" })
178
+ ```
179
+
180
+ Both fields are optional (`label` up to 100 characters, `notes` up to 2000), and a hash
181
+ whose values are all `nil` is treated as omitted rather than refused, so building one
182
+ from environment variables that may be absent still saves.
183
+
142
184
  Dispatch against a pointer instead of pinning a version, and the run resolves it at
143
185
  admission:
144
186
 
@@ -160,8 +202,10 @@ staging = Runtype::Client.new(api_key: ENV.fetch("RUNTYPE_STAGING_KEY"))
160
202
  production = Runtype::Client.new(api_key: ENV.fetch("RUNTYPE_PRODUCTION_KEY"))
161
203
 
162
204
  # 1. Prepare. Same portable definition, destination account, no deploy: so live is untouched.
163
- definition = staging.pull_agent("Pricing Assistant")["definition"]
164
- prepared = production.ensure_agent(definition)
205
+ source = staging.pull_agent("Pricing Assistant")
206
+ prepared = production.ensure_agent(
207
+ source["definition"], version: { label: ENV.fetch("GITHUB_SHA")[0, 7] }
208
+ )
165
209
  agent_id, candidate = prepared["agentId"], prepared["versionId"]
166
210
 
167
211
  # 2. Validate the bindings in the destination, where the portable refs actually resolve.
@@ -173,13 +217,20 @@ report = production.evals.run_eval_suite_synchronously(
173
217
  suite_id: "evs_pricing", agent: { versionId: candidate }
174
218
  )
175
219
 
176
- # 4. Activate, quoting the revision you just read.
220
+ # 4. Activate, quoting the revision you just read, and name where this came from.
177
221
  production.activate_agent_alias(
178
222
  agent_id, "live", version_id: candidate, revision: live.revision,
179
- idempotency_key: "release-#{candidate}", reason: "promoted from staging"
223
+ idempotency_key: "release-#{candidate}", reason: "promoted from staging",
224
+ promotion: { source_agent_id: source["agentId"], source_version_id: source["versionId"],
225
+ source_content_hash: source["contentHash"], source_commit: ENV.fetch("GITHUB_SHA") }
180
226
  )
181
227
  ```
182
228
 
229
+ `promotion:` is what makes the production receipt name the staging version it came
230
+ from. It is provenance only: it authorizes nothing, and the destination credentials
231
+ alone decide what the activation may do. Every field is optional, and a hash whose
232
+ values are all `nil` is treated as omitted.
233
+
183
234
  Nothing gates step 4 on step 3. `evaluate` reports; it does not hold the pointer. If a
184
235
  score should stop a release, branch on `report` yourself before calling
185
236
  `activate_agent_alias`. An environment-specific rendering of the definition produces a
@@ -202,6 +253,26 @@ different accounts or environments can coexist in one process.
202
253
  A missing or blank key raises `Runtype::AuthenticationError` at construction, before
203
254
  any request goes out.
204
255
 
256
+ ## Timeouts
257
+
258
+ `timeout:` is the per-operation socket timeout in seconds, defaulting to 600. It is
259
+ generous on purpose: an execution stream can idle between events while a model is
260
+ thinking, and a synchronous eval run can take minutes. One value governs the dispatch
261
+ and streaming paths and every generated resource call alike.
262
+
263
+ ```ruby
264
+ client = Runtype::Client.new(timeout: 900) # ten minutes is not enough
265
+ client.evals.run_eval_suite_synchronously(suite_id: "evs_1") # runs under 900 seconds
266
+
267
+ # Override for one call, without touching the client other threads are sharing.
268
+ client.flows.list_flows(request_options: { timeout_in_seconds: 5 })
269
+ ```
270
+
271
+ A socket timeout raises `Runtype::APITimeoutError` on the dispatch and streaming
272
+ paths. On a generated resource call it raises the transport's own error, so wrap the
273
+ call in `Runtype.wrap_errors` to get `Runtype::APITimeoutError` there too, the same
274
+ way the curated hierarchy is reached for every other generated failure.
275
+
205
276
  ## Streaming
206
277
 
207
278
  `dispatch_stream` returns a `Runtype::Streaming::EventStream`, an `Enumerable` of
@@ -399,12 +470,19 @@ an empty `GEM_HOME` to prove the packaged layout loads.
399
470
 
400
471
  The gem is published by `.github/workflows/publish-ruby-sdk.yml` through RubyGems
401
472
  trusted publishing (OIDC against the `rubygems` GitHub environment; no API key).
402
- The SDK sits outside the monorepo's changesets flow, so a release is:
403
-
404
- 1. Bump `SDK_VERSION` in `lib/runtype/sdk_version.rb` and add a `## <version>`
405
- section to `CHANGELOG.md`, in a PR to `staging`.
406
- 2. After it merges, run the workflow from `staging` with that version, first with
407
- `dry_run` on, then off:
473
+ The version comes from the monorepo's changesets flow, so a release is:
474
+
475
+ 1. Land a changeset naming `@runtypelabs/ruby-sdk` (an overlay PR writes its
476
+ own; the Update SDKs bot writes one for every regenerated core, see
477
+ `docs/claude/sdk-release.md`). Never hand-edit `SDK_VERSION` in
478
+ `lib/runtype/sdk_version.rb`: it is a mirror of `package.json`, rewritten by
479
+ `scripts/sync-sdk-versions.mjs` on every Version Packages run, and
480
+ `pnpm check:release-config` reds on drift.
481
+ 2. Merge the Version Packages PR. That bumps `package.json`, mirrors the number
482
+ into `sdk_version.rb`, and prepends the `## <version>` section to
483
+ `CHANGELOG.md`.
484
+ 3. Run the workflow from `staging` with that version, first with `dry_run` on,
485
+ then off:
408
486
 
409
487
  ```bash
410
488
  gh workflow run publish-ruby-sdk.yml --ref staging -f version=<version> -f dry_run=true
@@ -260,6 +260,159 @@ module Runtype
260
260
  end
261
261
  end
262
262
 
263
+ # The per-alias secret binding NAMES this pointer carries. A binding value is write-only: no read surface returns
264
+ # it, and it never appears on a receipt, an audit envelope or a log line.
265
+ #
266
+ # @param request_options [Hash]
267
+ # @param params [Hash]
268
+ # @option request_options [String] :base_url
269
+ # @option request_options [Hash{String => Object}] :additional_headers
270
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
271
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
272
+ # @option request_options [Integer] :timeout_in_seconds
273
+ # @option params [String] :id
274
+ # @option params [String] :alias_
275
+ #
276
+ # @example
277
+ # client.agent_aliases.read_the_secret_binding_names_of_a_release_alias(
278
+ # id: "id",
279
+ # alias_: "alias"
280
+ # )
281
+ #
282
+ # @return [Runtype::AgentAliases::Types::GetV1AgentsIDAliasesAliasBindingsResponse]
283
+ def read_the_secret_binding_names_of_a_release_alias(request_options: {}, **params)
284
+ params = Runtype::Internal::Types::Utils.normalize_keys(params)
285
+ request = Runtype::Internal::JSON::Request.new(
286
+ base_url: request_options[:base_url],
287
+ method: "GET",
288
+ path: "v1/agents/#{URI.encode_uri_component(params[:id].to_s)}/aliases/#{URI.encode_uri_component(params[:alias_].to_s)}/bindings",
289
+ request_options: request_options
290
+ )
291
+ begin
292
+ response = @client.send(request)
293
+ rescue Net::HTTPRequestTimeout
294
+ raise Runtype::Errors::TimeoutError
295
+ end
296
+ code = response.code.to_i
297
+ if code.between?(200, 299)
298
+ Runtype::AgentAliases::Types::GetV1AgentsIDAliasesAliasBindingsResponse.load(response.body)
299
+ else
300
+ error_class = Runtype::Errors::ResponseError.subclass_for_code(code)
301
+ raise error_class.new(response.body, code: code)
302
+ end
303
+ end
304
+
305
+ # Replace the complete set of `{{secret:NAME}}` values executions resolve when they reach this agent through this
306
+ # pointer. A binding wins over the organization secret of the same name, so one preview per pull request can aim
307
+ # its HTTP tools at that pull request environment while the version content stays byte-identical to what `live`
308
+ # runs. Whole-set replacement: a name you stop sending stops resolving. Values are encrypted at rest and never
309
+ # returned. Names beginning RUNTYPE_, PLATFORM_, CLOUDFLARE_ or INTERNAL_ are refused because they are
310
+ # platform-resolved before the alias plane. A change bumps the alias revision and appends a `bind` receipt; an
311
+ # identical set writes nothing. Requires the same deploy scope as activating this alias.
312
+ #
313
+ # @param request_options [Hash]
314
+ # @param params [Runtype::AgentAliases::Types::PutV1AgentsIDAliasesAliasBindingsRequest]
315
+ # @option request_options [String] :base_url
316
+ # @option request_options [Hash{String => Object}] :additional_headers
317
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
318
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
319
+ # @option request_options [Integer] :timeout_in_seconds
320
+ # @option params [String] :id
321
+ # @option params [String] :alias_
322
+ # @option params [String, nil] :if_match
323
+ # @option params [String, nil] :idempotency_key
324
+ #
325
+ # @example
326
+ # client.agent_aliases.replace_the_secret_bindings_of_a_release_alias(
327
+ # id: "id",
328
+ # alias_: "alias",
329
+ # bindings: {
330
+ # key: "value"
331
+ # }
332
+ # )
333
+ #
334
+ # @return [Runtype::AgentAliases::Types::PutV1AgentsIDAliasesAliasBindingsResponse]
335
+ def replace_the_secret_bindings_of_a_release_alias(request_options: {}, **params)
336
+ params = Runtype::Internal::Types::Utils.normalize_keys(params)
337
+ request_data = Runtype::AgentAliases::Types::PutV1AgentsIDAliasesAliasBindingsRequest.new(params).to_h
338
+ non_body_param_names = %w[id alias if-match idempotency-key]
339
+ body = request_data.except(*non_body_param_names)
340
+
341
+ headers = {}
342
+ headers["if-match"] = params[:if_match] if params[:if_match]
343
+ headers["idempotency-key"] = params[:idempotency_key] if params[:idempotency_key]
344
+
345
+ request = Runtype::Internal::JSON::Request.new(
346
+ base_url: request_options[:base_url],
347
+ method: "PUT",
348
+ path: "v1/agents/#{URI.encode_uri_component(params[:id].to_s)}/aliases/#{URI.encode_uri_component(params[:alias_].to_s)}/bindings",
349
+ headers: headers,
350
+ body: body,
351
+ request_options: request_options
352
+ )
353
+ begin
354
+ response = @client.send(request)
355
+ rescue Net::HTTPRequestTimeout
356
+ raise Runtype::Errors::TimeoutError
357
+ end
358
+ code = response.code.to_i
359
+ if code.between?(200, 299)
360
+ Runtype::AgentAliases::Types::PutV1AgentsIDAliasesAliasBindingsResponse.load(response.body)
361
+ else
362
+ error_class = Runtype::Errors::ResponseError.subclass_for_code(code)
363
+ raise error_class.new(response.body, code: code)
364
+ end
365
+ end
366
+
367
+ # Remove every per-alias secret binding from this pointer, so its executions fall back to the organization
368
+ # secrets. Equivalent to replacing the set with an empty object.
369
+ #
370
+ # @param request_options [Hash]
371
+ # @param params [Hash]
372
+ # @option request_options [String] :base_url
373
+ # @option request_options [Hash{String => Object}] :additional_headers
374
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
375
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
376
+ # @option request_options [Integer] :timeout_in_seconds
377
+ # @option params [String] :id
378
+ # @option params [String] :alias_
379
+ # @option params [String, nil] :if_match
380
+ # @option params [String, nil] :idempotency_key
381
+ #
382
+ # @example
383
+ # client.agent_aliases.clear_the_secret_bindings_of_a_release_alias(
384
+ # id: "id",
385
+ # alias_: "alias"
386
+ # )
387
+ #
388
+ # @return [Runtype::AgentAliases::Types::DeleteV1AgentsIDAliasesAliasBindingsResponse]
389
+ def clear_the_secret_bindings_of_a_release_alias(request_options: {}, **params)
390
+ params = Runtype::Internal::Types::Utils.normalize_keys(params)
391
+ headers = {}
392
+ headers["if-match"] = params[:if_match] if params[:if_match]
393
+ headers["idempotency-key"] = params[:idempotency_key] if params[:idempotency_key]
394
+
395
+ request = Runtype::Internal::JSON::Request.new(
396
+ base_url: request_options[:base_url],
397
+ method: "DELETE",
398
+ path: "v1/agents/#{URI.encode_uri_component(params[:id].to_s)}/aliases/#{URI.encode_uri_component(params[:alias_].to_s)}/bindings",
399
+ headers: headers,
400
+ request_options: request_options
401
+ )
402
+ begin
403
+ response = @client.send(request)
404
+ rescue Net::HTTPRequestTimeout
405
+ raise Runtype::Errors::TimeoutError
406
+ end
407
+ code = response.code.to_i
408
+ if code.between?(200, 299)
409
+ Runtype::AgentAliases::Types::DeleteV1AgentsIDAliasesAliasBindingsResponse.load(response.body)
410
+ else
411
+ error_class = Runtype::Errors::ResponseError.subclass_for_code(code)
412
+ raise error_class.new(response.body, code: code)
413
+ end
414
+ end
415
+
263
416
  # Re-aim an alias at the version recorded as `previousVersionId` on its most recent pointer-moving receipt,
264
417
  # walking `steps` receipts back. Writes a `rollback` receipt. Rolling back `live` follows the same scope and
265
418
  # `If-Match` rules as activation, and restores configuration only: external data and side effects are not rolled
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class DeleteV1AgentsIDAliasesAliasBindingsRequest < Internal::Types::Model
7
+ field :id, -> { String }, optional: false, nullable: false
8
+
9
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
10
+
11
+ field :if_match, -> { String }, optional: true, nullable: false, api_name: "if-match"
12
+
13
+ field :idempotency_key, -> { String }, optional: true, nullable: false, api_name: "idempotency-key"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class DeleteV1AgentsIDAliasesAliasBindingsResponse < Internal::Types::Model
7
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
8
+
9
+ field :changed, -> { Internal::Types::Boolean }, optional: true, nullable: false
10
+
11
+ field :names, -> { Internal::Types::Array[String] }, optional: false, nullable: false
12
+
13
+ field :receipt_id, -> { String }, optional: true, nullable: false, api_name: "receiptId"
14
+
15
+ field :revision, -> { Integer }, optional: false, nullable: false
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class GetV1AgentsIDAliasesAliasBindingsRequest < Internal::Types::Model
7
+ field :id, -> { String }, optional: false, nullable: false
8
+
9
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class GetV1AgentsIDAliasesAliasBindingsResponse < Internal::Types::Model
7
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
8
+
9
+ field :changed, -> { Internal::Types::Boolean }, optional: true, nullable: false
10
+
11
+ field :names, -> { Internal::Types::Array[String] }, optional: false, nullable: false
12
+
13
+ field :receipt_id, -> { String }, optional: true, nullable: false, api_name: "receiptId"
14
+
15
+ field :revision, -> { Integer }, optional: false, nullable: false
16
+ end
17
+ end
18
+ end
19
+ end
@@ -8,6 +8,8 @@ module Runtype
8
8
 
9
9
  field :archived_at, -> { String }, optional: false, nullable: true, api_name: "archivedAt"
10
10
 
11
+ field :binding_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false, api_name: "bindingNames"
12
+
11
13
  field :content_hash, -> { String }, optional: false, nullable: true, api_name: "contentHash"
12
14
 
13
15
  field :created_at, -> { String }, optional: false, nullable: false, api_name: "createdAt"
@@ -8,6 +8,8 @@ module Runtype
8
8
 
9
9
  field :archived_at, -> { String }, optional: false, nullable: true, api_name: "archivedAt"
10
10
 
11
+ field :binding_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false, api_name: "bindingNames"
12
+
11
13
  field :content_hash, -> { String }, optional: false, nullable: true, api_name: "contentHash"
12
14
 
13
15
  field :created_at, -> { String }, optional: false, nullable: false, api_name: "createdAt"
@@ -12,6 +12,8 @@ module Runtype
12
12
 
13
13
  field :alias_revision, -> { Integer }, optional: false, nullable: false, api_name: "aliasRevision"
14
14
 
15
+ field :bindings, -> { Internal::Types::Hash[String, Object] }, optional: false, nullable: true
16
+
15
17
  field :created_at, -> { String }, optional: false, nullable: false, api_name: "createdAt"
16
18
 
17
19
  field :dependencies, -> { Internal::Types::Hash[String, Object] }, optional: false, nullable: true
@@ -8,6 +8,8 @@ module Runtype
8
8
 
9
9
  field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
10
10
 
11
+ field :binding_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false, api_name: "bindingNames"
12
+
11
13
  field :changed, -> { Internal::Types::Boolean }, optional: false, nullable: false
12
14
 
13
15
  field :preview_limit, -> { Integer }, optional: false, nullable: true, api_name: "previewLimit"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class PutV1AgentsIDAliasesAliasBindingsRequest < Internal::Types::Model
7
+ field :id, -> { String }, optional: false, nullable: false
8
+
9
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
10
+
11
+ field :if_match, -> { String }, optional: true, nullable: false, api_name: "if-match"
12
+
13
+ field :idempotency_key, -> { String }, optional: true, nullable: false, api_name: "idempotency-key"
14
+
15
+ field :bindings, -> { Internal::Types::Hash[String, String] }, optional: false, nullable: false
16
+
17
+ field :reason, -> { String }, optional: true, nullable: false
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runtype
4
+ module AgentAliases
5
+ module Types
6
+ class PutV1AgentsIDAliasesAliasBindingsResponse < Internal::Types::Model
7
+ field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
8
+
9
+ field :changed, -> { Internal::Types::Boolean }, optional: true, nullable: false
10
+
11
+ field :names, -> { Internal::Types::Array[String] }, optional: false, nullable: false
12
+
13
+ field :receipt_id, -> { String }, optional: true, nullable: false, api_name: "receiptId"
14
+
15
+ field :revision, -> { Integer }, optional: false, nullable: false
16
+ end
17
+ end
18
+ end
19
+ end
@@ -8,6 +8,8 @@ module Runtype
8
8
 
9
9
  field :alias_, -> { String }, optional: false, nullable: false, api_name: "alias"
10
10
 
11
+ field :binding_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false, api_name: "bindingNames"
12
+
11
13
  field :changed, -> { Internal::Types::Boolean }, optional: false, nullable: false
12
14
 
13
15
  field :preview_limit, -> { Integer }, optional: false, nullable: true, api_name: "previewLimit"