acp-sdk 0.6.0 → 0.8.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 (157) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +5 -2
  4. data/lib/acp/agent_connection/client.rb +1 -1
  5. data/lib/acp/agent_connection.rb +3 -1
  6. data/lib/acp/client_connection.rb +220 -4
  7. data/lib/acp/request_error.rb +18 -4
  8. data/lib/acp/transport/stdio.rb +21 -6
  9. data/lib/acp/types/agent_auth_capabilities.rb +4 -1
  10. data/lib/acp/types/agent_capabilities.rb +20 -5
  11. data/lib/acp/types/annotations.rb +6 -3
  12. data/lib/acp/types/audio_content.rb +8 -3
  13. data/lib/acp/types/auth_capabilities.rb +1 -1
  14. data/lib/acp/types/auth_method/terminal.rb +11 -5
  15. data/lib/acp/types/auth_method_agent.rb +6 -1
  16. data/lib/acp/types/auth_method_terminal.rb +11 -5
  17. data/lib/acp/types/authenticate_request.rb +1 -1
  18. data/lib/acp/types/available_command.rb +3 -3
  19. data/lib/acp/types/available_commands_update.rb +7 -4
  20. data/lib/acp/types/blob_resource_contents.rb +6 -1
  21. data/lib/acp/types/boolean_property_schema.rb +6 -1
  22. data/lib/acp/types/cancel_notification.rb +4 -1
  23. data/lib/acp/types/cancel_request_notification.rb +9 -1
  24. data/lib/acp/types/client_capabilities.rb +15 -5
  25. data/lib/acp/types/client_session_capabilities.rb +6 -3
  26. data/lib/acp/types/close_session_request.rb +4 -1
  27. data/lib/acp/types/complete_elicitation_notification.rb +4 -1
  28. data/lib/acp/types/config_option_update.rb +7 -4
  29. data/lib/acp/types/content.rb +4 -1
  30. data/lib/acp/types/content_block/audio.rb +8 -3
  31. data/lib/acp/types/content_block/image.rb +9 -4
  32. data/lib/acp/types/content_block/resource.rb +11 -2
  33. data/lib/acp/types/content_block/resource_link.rb +12 -7
  34. data/lib/acp/types/content_block/text.rb +7 -2
  35. data/lib/acp/types/content_chunk.rb +2 -2
  36. data/lib/acp/types/cost.rb +5 -1
  37. data/lib/acp/types/create_elicitation_request/mode/form.rb +5 -1
  38. data/lib/acp/types/create_elicitation_request/mode/url.rb +2 -2
  39. data/lib/acp/types/create_elicitation_request.rb +1 -1
  40. data/lib/acp/types/create_elicitation_response/action/accept.rb +6 -1
  41. data/lib/acp/types/create_terminal_request.rb +12 -6
  42. data/lib/acp/types/create_terminal_response.rb +4 -1
  43. data/lib/acp/types/current_mode_update.rb +4 -1
  44. data/lib/acp/types/delete_session_request.rb +4 -1
  45. data/lib/acp/types/diff.rb +6 -1
  46. data/lib/acp/types/elicitation_accept_action.rb +6 -1
  47. data/lib/acp/types/elicitation_capabilities.rb +2 -2
  48. data/lib/acp/types/elicitation_form_mode.rb +5 -1
  49. data/lib/acp/types/elicitation_property_schema/boolean_property_schema.rb +6 -1
  50. data/lib/acp/types/elicitation_property_schema/integer_property_schema.rb +5 -5
  51. data/lib/acp/types/elicitation_property_schema/multi_select_property_schema.rb +9 -6
  52. data/lib/acp/types/elicitation_property_schema/number_property_schema.rb +5 -5
  53. data/lib/acp/types/elicitation_property_schema/string_property_schema.rb +15 -9
  54. data/lib/acp/types/elicitation_request_scope.rb +8 -1
  55. data/lib/acp/types/elicitation_schema.rb +11 -5
  56. data/lib/acp/types/elicitation_session_scope.rb +4 -1
  57. data/lib/acp/types/elicitation_url_mode.rb +2 -2
  58. data/lib/acp/types/embedded_resource.rb +11 -2
  59. data/lib/acp/types/enum_option.rb +6 -1
  60. data/lib/acp/types/env_variable.rb +5 -1
  61. data/lib/acp/types/file_system_capabilities.rb +5 -1
  62. data/lib/acp/types/http_header.rb +5 -1
  63. data/lib/acp/types/image_content.rb +9 -4
  64. data/lib/acp/types/implementation.rb +6 -1
  65. data/lib/acp/types/initialize_request.rb +18 -3
  66. data/lib/acp/types/initialize_response.rb +17 -4
  67. data/lib/acp/types/integer_property_schema.rb +5 -5
  68. data/lib/acp/types/kill_terminal_request.rb +5 -1
  69. data/lib/acp/types/list_sessions_request.rb +5 -1
  70. data/lib/acp/types/list_sessions_response.rb +5 -2
  71. data/lib/acp/types/load_session_request.rb +14 -4
  72. data/lib/acp/types/load_session_response.rb +5 -2
  73. data/lib/acp/types/mcp_capabilities.rb +5 -1
  74. data/lib/acp/types/mcp_server/http.rb +6 -3
  75. data/lib/acp/types/mcp_server/sse.rb +6 -3
  76. data/lib/acp/types/mcp_server_http.rb +6 -3
  77. data/lib/acp/types/mcp_server_sse.rb +6 -3
  78. data/lib/acp/types/mcp_server_stdio.rb +10 -4
  79. data/lib/acp/types/multi_select_items/string_multi_select_items.rb +4 -1
  80. data/lib/acp/types/multi_select_property_schema.rb +9 -6
  81. data/lib/acp/types/new_session_request.rb +13 -3
  82. data/lib/acp/types/new_session_response.rb +6 -3
  83. data/lib/acp/types/number_property_schema.rb +5 -5
  84. data/lib/acp/types/permission_option.rb +10 -1
  85. data/lib/acp/types/plan.rb +4 -1
  86. data/lib/acp/types/plan_entry.rb +7 -3
  87. data/lib/acp/types/prompt_capabilities.rb +6 -1
  88. data/lib/acp/types/prompt_request.rb +5 -2
  89. data/lib/acp/types/prompt_response.rb +8 -1
  90. data/lib/acp/types/read_text_file_request.rb +4 -4
  91. data/lib/acp/types/read_text_file_response.rb +1 -1
  92. data/lib/acp/types/release_terminal_request.rb +5 -1
  93. data/lib/acp/types/request_permission_outcome/selected.rb +1 -1
  94. data/lib/acp/types/request_permission_request.rb +10 -3
  95. data/lib/acp/types/request_permission_response.rb +8 -1
  96. data/lib/acp/types/resource_link.rb +12 -7
  97. data/lib/acp/types/resume_session_request.rb +14 -4
  98. data/lib/acp/types/resume_session_response.rb +5 -2
  99. data/lib/acp/types/selected_permission_outcome.rb +1 -1
  100. data/lib/acp/types/session_capabilities.rb +20 -7
  101. data/lib/acp/types/session_config_boolean.rb +1 -1
  102. data/lib/acp/types/session_config_option/kind/boolean.rb +1 -1
  103. data/lib/acp/types/session_config_option/kind/select.rb +6 -2
  104. data/lib/acp/types/session_config_option.rb +3 -3
  105. data/lib/acp/types/session_config_options_capabilities.rb +6 -1
  106. data/lib/acp/types/session_config_select.rb +6 -2
  107. data/lib/acp/types/session_config_select_group.rb +6 -3
  108. data/lib/acp/types/session_config_select_option.rb +6 -1
  109. data/lib/acp/types/session_config_select_options.rb +6 -2
  110. data/lib/acp/types/session_info.rb +12 -5
  111. data/lib/acp/types/session_info_update.rb +10 -1
  112. data/lib/acp/types/session_mode.rb +6 -1
  113. data/lib/acp/types/session_mode_state.rb +8 -2
  114. data/lib/acp/types/session_notification.rb +2 -2
  115. data/lib/acp/types/session_update/agent_message_chunk.rb +2 -2
  116. data/lib/acp/types/session_update/agent_thought_chunk.rb +2 -2
  117. data/lib/acp/types/session_update/available_commands_update.rb +7 -4
  118. data/lib/acp/types/session_update/config_option_update.rb +7 -4
  119. data/lib/acp/types/session_update/current_mode_update.rb +4 -1
  120. data/lib/acp/types/session_update/plan.rb +4 -1
  121. data/lib/acp/types/session_update/session_info_update.rb +10 -1
  122. data/lib/acp/types/session_update/tool_call.rb +23 -7
  123. data/lib/acp/types/session_update/tool_call_update.rb +23 -7
  124. data/lib/acp/types/session_update/usage_update.rb +3 -3
  125. data/lib/acp/types/session_update/user_message_chunk.rb +2 -2
  126. data/lib/acp/types/set_session_config_option_request/value/boolean.rb +1 -1
  127. data/lib/acp/types/set_session_config_option_request/value/value_id.rb +1 -1
  128. data/lib/acp/types/set_session_config_option_request.rb +2 -2
  129. data/lib/acp/types/set_session_config_option_response.rb +7 -4
  130. data/lib/acp/types/set_session_mode_request.rb +5 -1
  131. data/lib/acp/types/string_multi_select_items.rb +4 -1
  132. data/lib/acp/types/string_property_schema.rb +15 -9
  133. data/lib/acp/types/terminal.rb +4 -1
  134. data/lib/acp/types/terminal_exit_status.rb +5 -1
  135. data/lib/acp/types/terminal_output_request.rb +5 -1
  136. data/lib/acp/types/terminal_output_response.rb +8 -3
  137. data/lib/acp/types/text_content.rb +7 -2
  138. data/lib/acp/types/text_resource_contents.rb +6 -1
  139. data/lib/acp/types/titled_multi_select_items.rb +4 -1
  140. data/lib/acp/types/tool_call.rb +23 -7
  141. data/lib/acp/types/tool_call_content/content.rb +4 -1
  142. data/lib/acp/types/tool_call_content/diff.rb +6 -1
  143. data/lib/acp/types/tool_call_content/terminal.rb +4 -1
  144. data/lib/acp/types/tool_call_location.rb +5 -1
  145. data/lib/acp/types/tool_call_update.rb +23 -7
  146. data/lib/acp/types/unstructured_command_input.rb +1 -1
  147. data/lib/acp/types/usage_update.rb +3 -3
  148. data/lib/acp/types/wait_for_terminal_exit_request.rb +5 -1
  149. data/lib/acp/types/wait_for_terminal_exit_response.rb +5 -1
  150. data/lib/acp/types/write_text_file_request.rb +3 -3
  151. data/lib/acp/types.rb +247 -0
  152. data/lib/acp/version.rb +1 -1
  153. data/sig/generated/acp/client_connection.rbs +101 -12
  154. data/sig/generated/acp/request_error.rbs +14 -2
  155. data/sig/generated/acp/transport/stdio.rbs +13 -2
  156. data/sig/generated/acp/types.rbs +143 -0
  157. metadata +1 -1
@@ -31,7 +31,12 @@ class ACP::Types::AuthMethodAgent
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::AuthMethodAgent
33
33
  def self.from_h(hash)
34
- new(id: hash.fetch('id'), name: hash.fetch('name'), description: hash['description'], meta: hash['_meta'])
34
+ new(
35
+ id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'id'), 'id'),
36
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
37
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -41,12 +41,18 @@ class ACP::Types::AuthMethodTerminal
41
41
  # @rbs hash: Hash[String, untyped]
42
42
  # @rbs return: ACP::Types::AuthMethodTerminal
43
43
  def self.from_h(hash)
44
+ args = ACP::Types::Check.array(hash['args'], 'args', allow_nil: true) do |item, path|
45
+ ACP::Types::Check.string(item, path)
46
+ end
47
+ env = ACP::Types::Check.hash(hash['env'], 'env', allow_nil: true) do |value, path|
48
+ ACP::Types::Check.string(value, path)
49
+ end
44
50
  new(
45
- id: hash.fetch('id'),
46
- name: hash.fetch('name'),
47
- description: hash['description'],
48
- args: hash['args'],
49
- env: hash['env'],
51
+ id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'id'), 'id'),
52
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
53
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
54
+ args:,
55
+ env:,
50
56
  meta: hash['_meta']
51
57
  )
52
58
  end
@@ -21,7 +21,7 @@ class ACP::Types::AuthenticateRequest
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::AuthenticateRequest
23
23
  def self.from_h(hash)
24
- new(method_id: hash.fetch('methodId'), meta: hash['_meta'])
24
+ new(method_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'methodId'), 'methodId'), meta: hash['_meta'])
25
25
  end
26
26
 
27
27
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,9 @@ class ACP::Types::AvailableCommand
32
32
  # @rbs return: ACP::Types::AvailableCommand
33
33
  def self.from_h(hash)
34
34
  new(
35
- name: hash.fetch('name'),
36
- description: hash.fetch('description'),
37
- input: hash['input']&.then { |value| ACP::Types::AvailableCommandInput.from_h(value) },
35
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
36
+ description: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'description'), 'description'),
37
+ input: ACP::Types::Check.object(hash['input'], 'input', ACP::Types::AvailableCommandInput, allow_nil: true),
38
38
  meta: hash['_meta']
39
39
  )
40
40
  end
@@ -21,10 +21,13 @@ class ACP::Types::AvailableCommandsUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::AvailableCommandsUpdate
23
23
  def self.from_h(hash)
24
- new(
25
- available_commands: hash.fetch('availableCommands').map { |item| ACP::Types::AvailableCommand.from_h(item) },
26
- meta: hash['_meta']
27
- )
24
+ available_commands = ACP::Types::Check.array(
25
+ ACP::Types::Check.key(hash, 'availableCommands'),
26
+ 'availableCommands'
27
+ ) do |item, path|
28
+ ACP::Types::Check.object(item, path, ACP::Types::AvailableCommand)
29
+ end
30
+ new(available_commands:, meta: hash['_meta'])
28
31
  end
29
32
 
30
33
  # @rbs return: Hash[String, untyped]
@@ -31,7 +31,12 @@ class ACP::Types::BlobResourceContents
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::BlobResourceContents
33
33
  def self.from_h(hash)
34
- new(blob: hash.fetch('blob'), mime_type: hash['mimeType'], uri: hash.fetch('uri'), meta: hash['_meta'])
34
+ new(
35
+ blob: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'blob'), 'blob'),
36
+ mime_type: ACP::Types::Check.string(hash['mimeType'], 'mimeType', allow_nil: true),
37
+ uri: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'uri'), 'uri'),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -31,7 +31,12 @@ class ACP::Types::BooleanPropertySchema
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::BooleanPropertySchema
33
33
  def self.from_h(hash)
34
- new(title: hash['title'], description: hash['description'], default: hash['default'], meta: hash['_meta'])
34
+ new(
35
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
36
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
37
+ default: ACP::Types::Check.boolean(hash['default'], 'default', allow_nil: true),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::CancelNotification
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CancelNotification
23
23
  def self.from_h(hash)
24
- new(session_id: hash.fetch('sessionId'), meta: hash['_meta'])
24
+ new(
25
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,15 @@ class ACP::Types::CancelRequestNotification
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CancelRequestNotification
23
23
  def self.from_h(hash)
24
- new(request_id: hash.fetch('requestId'), meta: hash['_meta'])
24
+ new(
25
+ request_id: ACP::Types::Check.one_of(
26
+ ACP::Types::Check.key(hash, 'requestId'),
27
+ 'requestId',
28
+ [Integer, String],
29
+ allow_nil: true
30
+ ),
31
+ meta: hash['_meta']
32
+ )
25
33
  end
26
34
 
27
35
  # @rbs return: Hash[String, untyped]
@@ -42,11 +42,21 @@ class ACP::Types::ClientCapabilities
42
42
  # @rbs return: ACP::Types::ClientCapabilities
43
43
  def self.from_h(hash)
44
44
  new(
45
- fs: hash['fs']&.then { |value| ACP::Types::FileSystemCapabilities.from_h(value) },
46
- terminal: hash['terminal'],
47
- session: hash['session']&.then { |value| ACP::Types::ClientSessionCapabilities.from_h(value) },
48
- auth: hash['auth']&.then { |value| ACP::Types::AuthCapabilities.from_h(value) },
49
- elicitation: hash['elicitation']&.then { |value| ACP::Types::ElicitationCapabilities.from_h(value) },
45
+ fs: ACP::Types::Check.object(hash['fs'], 'fs', ACP::Types::FileSystemCapabilities, allow_nil: true),
46
+ terminal: ACP::Types::Check.boolean(hash['terminal'], 'terminal', allow_nil: true),
47
+ session: ACP::Types::Check.object(
48
+ hash['session'],
49
+ 'session',
50
+ ACP::Types::ClientSessionCapabilities,
51
+ allow_nil: true
52
+ ),
53
+ auth: ACP::Types::Check.object(hash['auth'], 'auth', ACP::Types::AuthCapabilities, allow_nil: true),
54
+ elicitation: ACP::Types::Check.object(
55
+ hash['elicitation'],
56
+ 'elicitation',
57
+ ACP::Types::ElicitationCapabilities,
58
+ allow_nil: true
59
+ ),
50
60
  meta: hash['_meta']
51
61
  )
52
62
  end
@@ -22,9 +22,12 @@ class ACP::Types::ClientSessionCapabilities
22
22
  # @rbs return: ACP::Types::ClientSessionCapabilities
23
23
  def self.from_h(hash)
24
24
  new(
25
- config_options: hash['configOptions']&.then do |value|
26
- ACP::Types::SessionConfigOptionsCapabilities.from_h(value)
27
- end,
25
+ config_options: ACP::Types::Check.object(
26
+ hash['configOptions'],
27
+ 'configOptions',
28
+ ACP::Types::SessionConfigOptionsCapabilities,
29
+ allow_nil: true
30
+ ),
28
31
  meta: hash['_meta']
29
32
  )
30
33
  end
@@ -21,7 +21,10 @@ class ACP::Types::CloseSessionRequest
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CloseSessionRequest
23
23
  def self.from_h(hash)
24
- new(session_id: hash.fetch('sessionId'), meta: hash['_meta'])
24
+ new(
25
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::CompleteElicitationNotification
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CompleteElicitationNotification
23
23
  def self.from_h(hash)
24
- new(elicitation_id: hash.fetch('elicitationId'), meta: hash['_meta'])
24
+ new(
25
+ elicitation_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'elicitationId'), 'elicitationId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -21,10 +21,13 @@ class ACP::Types::ConfigOptionUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::ConfigOptionUpdate
23
23
  def self.from_h(hash)
24
- new(
25
- config_options: hash.fetch('configOptions').map { |item| ACP::Types::SessionConfigOption.from_h(item) },
26
- meta: hash['_meta']
27
- )
24
+ config_options = ACP::Types::Check.array(
25
+ ACP::Types::Check.key(hash, 'configOptions'),
26
+ 'configOptions'
27
+ ) do |item, path|
28
+ ACP::Types::Check.object(item, path, ACP::Types::SessionConfigOption)
29
+ end
30
+ new(config_options:, meta: hash['_meta'])
28
31
  end
29
32
 
30
33
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::Content
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::Content
23
23
  def self.from_h(hash)
24
- new(content: ACP::Types::ContentBlock.from_h(hash.fetch('content')), meta: hash['_meta'])
24
+ new(
25
+ content: ACP::Types::Check.object(ACP::Types::Check.key(hash, 'content'), 'content', ACP::Types::ContentBlock),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,14 @@ class ACP::Types::ContentBlock::Audio
32
32
  # @rbs return: ACP::Types::ContentBlock::Audio
33
33
  def self.from_h(hash)
34
34
  new(
35
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
36
- data: hash.fetch('data'),
37
- mime_type: hash.fetch('mimeType'),
35
+ annotations: ACP::Types::Check.object(
36
+ hash['annotations'],
37
+ 'annotations',
38
+ ACP::Types::Annotations,
39
+ allow_nil: true
40
+ ),
41
+ data: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'data'), 'data'),
42
+ mime_type: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'mimeType'), 'mimeType'),
38
43
  meta: hash['_meta']
39
44
  )
40
45
  end
@@ -37,10 +37,15 @@ class ACP::Types::ContentBlock::Image
37
37
  # @rbs return: ACP::Types::ContentBlock::Image
38
38
  def self.from_h(hash)
39
39
  new(
40
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
41
- data: hash.fetch('data'),
42
- mime_type: hash.fetch('mimeType'),
43
- uri: hash['uri'],
40
+ annotations: ACP::Types::Check.object(
41
+ hash['annotations'],
42
+ 'annotations',
43
+ ACP::Types::Annotations,
44
+ allow_nil: true
45
+ ),
46
+ data: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'data'), 'data'),
47
+ mime_type: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'mimeType'), 'mimeType'),
48
+ uri: ACP::Types::Check.string(hash['uri'], 'uri', allow_nil: true),
44
49
  meta: hash['_meta']
45
50
  )
46
51
  end
@@ -27,8 +27,17 @@ class ACP::Types::ContentBlock::Resource
27
27
  # @rbs return: ACP::Types::ContentBlock::Resource
28
28
  def self.from_h(hash)
29
29
  new(
30
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
31
- resource: ACP::Types::EmbeddedResourceResource.from_h(hash.fetch('resource')),
30
+ annotations: ACP::Types::Check.object(
31
+ hash['annotations'],
32
+ 'annotations',
33
+ ACP::Types::Annotations,
34
+ allow_nil: true
35
+ ),
36
+ resource: ACP::Types::Check.object(
37
+ ACP::Types::Check.key(hash, 'resource'),
38
+ 'resource',
39
+ ACP::Types::EmbeddedResourceResource
40
+ ),
32
41
  meta: hash['_meta']
33
42
  )
34
43
  end
@@ -52,13 +52,18 @@ class ACP::Types::ContentBlock::ResourceLink
52
52
  # @rbs return: ACP::Types::ContentBlock::ResourceLink
53
53
  def self.from_h(hash)
54
54
  new(
55
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
56
- description: hash['description'],
57
- mime_type: hash['mimeType'],
58
- name: hash.fetch('name'),
59
- size: hash['size'],
60
- title: hash['title'],
61
- uri: hash.fetch('uri'),
55
+ annotations: ACP::Types::Check.object(
56
+ hash['annotations'],
57
+ 'annotations',
58
+ ACP::Types::Annotations,
59
+ allow_nil: true
60
+ ),
61
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
62
+ mime_type: ACP::Types::Check.string(hash['mimeType'], 'mimeType', allow_nil: true),
63
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
64
+ size: ACP::Types::Check.integer(hash['size'], 'size', allow_nil: true),
65
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
66
+ uri: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'uri'), 'uri'),
62
67
  meta: hash['_meta']
63
68
  )
64
69
  end
@@ -27,8 +27,13 @@ class ACP::Types::ContentBlock::Text
27
27
  # @rbs return: ACP::Types::ContentBlock::Text
28
28
  def self.from_h(hash)
29
29
  new(
30
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
31
- text: hash.fetch('text'),
30
+ annotations: ACP::Types::Check.object(
31
+ hash['annotations'],
32
+ 'annotations',
33
+ ACP::Types::Annotations,
34
+ allow_nil: true
35
+ ),
36
+ text: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'text'), 'text'),
32
37
  meta: hash['_meta']
33
38
  )
34
39
  end
@@ -27,8 +27,8 @@ class ACP::Types::ContentChunk
27
27
  # @rbs return: ACP::Types::ContentChunk
28
28
  def self.from_h(hash)
29
29
  new(
30
- content: ACP::Types::ContentBlock.from_h(hash.fetch('content')),
31
- message_id: hash['messageId'],
30
+ content: ACP::Types::Check.object(ACP::Types::Check.key(hash, 'content'), 'content', ACP::Types::ContentBlock),
31
+ message_id: ACP::Types::Check.string(hash['messageId'], 'messageId', allow_nil: true),
32
32
  meta: hash['_meta']
33
33
  )
34
34
  end
@@ -26,7 +26,11 @@ class ACP::Types::Cost
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::Cost
28
28
  def self.from_h(hash)
29
- new(amount: hash.fetch('amount'), currency: hash.fetch('currency'), meta: hash['_meta'])
29
+ new(
30
+ amount: ACP::Types::Check.number(ACP::Types::Check.key(hash, 'amount'), 'amount'),
31
+ currency: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'currency'), 'currency'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -22,7 +22,11 @@ class ACP::Types::CreateElicitationRequest::Mode::Form
22
22
  # @rbs return: ACP::Types::CreateElicitationRequest::Mode::Form
23
23
  def self.from_h(hash)
24
24
  new(
25
- requested_schema: ACP::Types::ElicitationSchema.from_h(hash.fetch('requestedSchema')),
25
+ requested_schema: ACP::Types::Check.object(
26
+ ACP::Types::Check.key(hash, 'requestedSchema'),
27
+ 'requestedSchema',
28
+ ACP::Types::ElicitationSchema
29
+ ),
26
30
  scope: ACP::Types::ElicitationFormMode::Scope.from_h(hash)
27
31
  )
28
32
  end
@@ -27,8 +27,8 @@ class ACP::Types::CreateElicitationRequest::Mode::Url
27
27
  # @rbs return: ACP::Types::CreateElicitationRequest::Mode::Url
28
28
  def self.from_h(hash)
29
29
  new(
30
- elicitation_id: hash.fetch('elicitationId'),
31
- url: hash.fetch('url'),
30
+ elicitation_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'elicitationId'), 'elicitationId'),
31
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
32
32
  scope: ACP::Types::ElicitationUrlMode::Scope.from_h(hash)
33
33
  )
34
34
  end
@@ -27,7 +27,7 @@ class ACP::Types::CreateElicitationRequest
27
27
  # @rbs return: ACP::Types::CreateElicitationRequest
28
28
  def self.from_h(hash)
29
29
  new(
30
- message: hash.fetch('message'),
30
+ message: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'message'), 'message'),
31
31
  meta: hash['_meta'],
32
32
  mode: ACP::Types::CreateElicitationRequest::Mode.from_h(hash)
33
33
  )
@@ -16,7 +16,12 @@ class ACP::Types::CreateElicitationResponse::Action::Accept
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::CreateElicitationResponse::Action::Accept
18
18
  def self.from_h(hash)
19
- new(content: hash['content'])
19
+ content = ACP::Types::Check.hash(hash['content'], 'content', allow_nil: true) do |value, path|
20
+ ACP::Types::Check.one_of(value, path, [String, Integer, Numeric, TrueClass, FalseClass, Array]) do |item, path|
21
+ ACP::Types::Check.string(item, path)
22
+ end
23
+ end
24
+ new(content:)
20
25
  end
21
26
 
22
27
  # @rbs return: Hash[String, untyped]
@@ -46,13 +46,19 @@ class ACP::Types::CreateTerminalRequest
46
46
  # @rbs hash: Hash[String, untyped]
47
47
  # @rbs return: ACP::Types::CreateTerminalRequest
48
48
  def self.from_h(hash)
49
+ args = ACP::Types::Check.array(hash['args'], 'args', allow_nil: true) do |item, path|
50
+ ACP::Types::Check.string(item, path)
51
+ end
52
+ env = ACP::Types::Check.array(hash['env'], 'env', allow_nil: true) do |item, path|
53
+ ACP::Types::Check.object(item, path, ACP::Types::EnvVariable)
54
+ end
49
55
  new(
50
- session_id: hash.fetch('sessionId'),
51
- command: hash.fetch('command'),
52
- args: hash['args'],
53
- env: hash['env']&.map { |item| ACP::Types::EnvVariable.from_h(item) },
54
- cwd: hash['cwd'],
55
- output_byte_limit: hash['outputByteLimit'],
56
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
57
+ command: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'command'), 'command'),
58
+ args:,
59
+ env:,
60
+ cwd: ACP::Types::Check.string(hash['cwd'], 'cwd', allow_nil: true),
61
+ output_byte_limit: ACP::Types::Check.integer(hash['outputByteLimit'], 'outputByteLimit', min: 0, allow_nil: true),
56
62
  meta: hash['_meta']
57
63
  )
58
64
  end
@@ -21,7 +21,10 @@ class ACP::Types::CreateTerminalResponse
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CreateTerminalResponse
23
23
  def self.from_h(hash)
24
- new(terminal_id: hash.fetch('terminalId'), meta: hash['_meta'])
24
+ new(
25
+ terminal_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'terminalId'), 'terminalId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::CurrentModeUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::CurrentModeUpdate
23
23
  def self.from_h(hash)
24
- new(current_mode_id: hash.fetch('currentModeId'), meta: hash['_meta'])
24
+ new(
25
+ current_mode_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'currentModeId'), 'currentModeId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::DeleteSessionRequest
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::DeleteSessionRequest
23
23
  def self.from_h(hash)
24
- new(session_id: hash.fetch('sessionId'), meta: hash['_meta'])
24
+ new(
25
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
26
+ meta: hash['_meta']
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -31,7 +31,12 @@ class ACP::Types::Diff
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::Diff
33
33
  def self.from_h(hash)
34
- new(path: hash.fetch('path'), old_text: hash['oldText'], new_text: hash.fetch('newText'), meta: hash['_meta'])
34
+ new(
35
+ path: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'path'), 'path'),
36
+ old_text: ACP::Types::Check.string(hash['oldText'], 'oldText', allow_nil: true),
37
+ new_text: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'newText'), 'newText'),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -16,7 +16,12 @@ class ACP::Types::ElicitationAcceptAction
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::ElicitationAcceptAction
18
18
  def self.from_h(hash)
19
- new(content: hash['content'])
19
+ content = ACP::Types::Check.hash(hash['content'], 'content', allow_nil: true) do |value, path|
20
+ ACP::Types::Check.one_of(value, path, [String, Integer, Numeric, TrueClass, FalseClass, Array]) do |item, path|
21
+ ACP::Types::Check.string(item, path)
22
+ end
23
+ end
24
+ new(content:)
20
25
  end
21
26
 
22
27
  # @rbs return: Hash[String, untyped]
@@ -27,8 +27,8 @@ class ACP::Types::ElicitationCapabilities
27
27
  # @rbs return: ACP::Types::ElicitationCapabilities
28
28
  def self.from_h(hash)
29
29
  new(
30
- form: hash['form']&.then { |value| ACP::Types::ElicitationFormCapabilities.from_h(value) },
31
- url: hash['url']&.then { |value| ACP::Types::ElicitationUrlCapabilities.from_h(value) },
30
+ form: ACP::Types::Check.object(hash['form'], 'form', ACP::Types::ElicitationFormCapabilities, allow_nil: true),
31
+ url: ACP::Types::Check.object(hash['url'], 'url', ACP::Types::ElicitationUrlCapabilities, allow_nil: true),
32
32
  meta: hash['_meta']
33
33
  )
34
34
  end
@@ -22,7 +22,11 @@ class ACP::Types::ElicitationFormMode
22
22
  # @rbs return: ACP::Types::ElicitationFormMode
23
23
  def self.from_h(hash)
24
24
  new(
25
- requested_schema: ACP::Types::ElicitationSchema.from_h(hash.fetch('requestedSchema')),
25
+ requested_schema: ACP::Types::Check.object(
26
+ ACP::Types::Check.key(hash, 'requestedSchema'),
27
+ 'requestedSchema',
28
+ ACP::Types::ElicitationSchema
29
+ ),
26
30
  scope: ACP::Types::ElicitationFormMode::Scope.from_h(hash)
27
31
  )
28
32
  end
@@ -31,7 +31,12 @@ class ACP::Types::ElicitationPropertySchema::BooleanPropertySchema
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::ElicitationPropertySchema::BooleanPropertySchema
33
33
  def self.from_h(hash)
34
- new(title: hash['title'], description: hash['description'], default: hash['default'], meta: hash['_meta'])
34
+ new(
35
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
36
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
37
+ default: ACP::Types::Check.boolean(hash['default'], 'default', allow_nil: true),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -42,11 +42,11 @@ class ACP::Types::ElicitationPropertySchema::IntegerPropertySchema
42
42
  # @rbs return: ACP::Types::ElicitationPropertySchema::IntegerPropertySchema
43
43
  def self.from_h(hash)
44
44
  new(
45
- title: hash['title'],
46
- description: hash['description'],
47
- minimum: hash['minimum'],
48
- maximum: hash['maximum'],
49
- default: hash['default'],
45
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
46
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
47
+ minimum: ACP::Types::Check.integer(hash['minimum'], 'minimum', allow_nil: true),
48
+ maximum: ACP::Types::Check.integer(hash['maximum'], 'maximum', allow_nil: true),
49
+ default: ACP::Types::Check.integer(hash['default'], 'default', allow_nil: true),
50
50
  meta: hash['_meta']
51
51
  )
52
52
  end
@@ -46,13 +46,16 @@ class ACP::Types::ElicitationPropertySchema::MultiSelectPropertySchema
46
46
  # @rbs hash: Hash[String, untyped]
47
47
  # @rbs return: ACP::Types::ElicitationPropertySchema::MultiSelectPropertySchema
48
48
  def self.from_h(hash)
49
+ default = ACP::Types::Check.array(hash['default'], 'default', allow_nil: true) do |item, path|
50
+ ACP::Types::Check.string(item, path)
51
+ end
49
52
  new(
50
- title: hash['title'],
51
- description: hash['description'],
52
- min_items: hash['minItems'],
53
- max_items: hash['maxItems'],
54
- items: ACP::Types::MultiSelectItems.from_h(hash.fetch('items')),
55
- default: hash['default'],
53
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
54
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
55
+ min_items: ACP::Types::Check.integer(hash['minItems'], 'minItems', min: 0, allow_nil: true),
56
+ max_items: ACP::Types::Check.integer(hash['maxItems'], 'maxItems', min: 0, allow_nil: true),
57
+ items: ACP::Types::Check.object(ACP::Types::Check.key(hash, 'items'), 'items', ACP::Types::MultiSelectItems),
58
+ default:,
56
59
  meta: hash['_meta']
57
60
  )
58
61
  end
@@ -42,11 +42,11 @@ class ACP::Types::ElicitationPropertySchema::NumberPropertySchema
42
42
  # @rbs return: ACP::Types::ElicitationPropertySchema::NumberPropertySchema
43
43
  def self.from_h(hash)
44
44
  new(
45
- title: hash['title'],
46
- description: hash['description'],
47
- minimum: hash['minimum'],
48
- maximum: hash['maximum'],
49
- default: hash['default'],
45
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
46
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
47
+ minimum: ACP::Types::Check.number(hash['minimum'], 'minimum', allow_nil: true),
48
+ maximum: ACP::Types::Check.number(hash['maximum'], 'maximum', allow_nil: true),
49
+ default: ACP::Types::Check.number(hash['default'], 'default', allow_nil: true),
50
50
  meta: hash['_meta']
51
51
  )
52
52
  end