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
@@ -72,14 +72,30 @@ class ACP::Types::SessionUpdate::ToolCall
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::SessionUpdate::ToolCall
74
74
  def self.from_h(hash)
75
+ content = ACP::Types::Check.array(hash['content'], 'content', allow_nil: true) do |item, path|
76
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallContent)
77
+ end
78
+ locations = ACP::Types::Check.array(hash['locations'], 'locations', allow_nil: true) do |item, path|
79
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallLocation)
80
+ end
75
81
  new(
76
- tool_call_id: hash.fetch('toolCallId'),
77
- title: hash.fetch('title'),
78
- name: hash['name'],
79
- kind: hash['kind'],
80
- status: hash['status'],
81
- content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
82
- locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
82
+ tool_call_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'toolCallId'), 'toolCallId'),
83
+ title: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'title'), 'title'),
84
+ name: ACP::Types::Check.string(hash['name'], 'name', allow_nil: true),
85
+ kind: ACP::Types::Check.enum(
86
+ hash['kind'],
87
+ 'kind',
88
+ %w[read edit delete move search execute think fetch switch_mode other],
89
+ allow_nil: true
90
+ ),
91
+ status: ACP::Types::Check.enum(
92
+ hash['status'],
93
+ 'status',
94
+ %w[pending in_progress completed failed],
95
+ allow_nil: true
96
+ ),
97
+ content:,
98
+ locations:,
83
99
  raw_input: hash['rawInput'],
84
100
  raw_output: hash['rawOutput'],
85
101
  meta: hash['_meta']
@@ -72,14 +72,30 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::SessionUpdate::ToolCallUpdate
74
74
  def self.from_h(hash)
75
+ content = ACP::Types::Check.array(hash['content'], 'content', allow_nil: true) do |item, path|
76
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallContent)
77
+ end
78
+ locations = ACP::Types::Check.array(hash['locations'], 'locations', allow_nil: true) do |item, path|
79
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallLocation)
80
+ end
75
81
  new(
76
- tool_call_id: hash.fetch('toolCallId'),
77
- kind: hash['kind'],
78
- status: hash['status'],
79
- title: hash['title'],
80
- name: hash['name'],
81
- content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
82
- locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
82
+ tool_call_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'toolCallId'), 'toolCallId'),
83
+ kind: ACP::Types::Check.enum(
84
+ hash['kind'],
85
+ 'kind',
86
+ %w[read edit delete move search execute think fetch switch_mode other],
87
+ allow_nil: true
88
+ ),
89
+ status: ACP::Types::Check.enum(
90
+ hash['status'],
91
+ 'status',
92
+ %w[pending in_progress completed failed],
93
+ allow_nil: true
94
+ ),
95
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
96
+ name: ACP::Types::Check.string(hash['name'], 'name', allow_nil: true),
97
+ content:,
98
+ locations:,
83
99
  raw_input: hash['rawInput'],
84
100
  raw_output: hash['rawOutput'],
85
101
  meta: hash['_meta']
@@ -32,9 +32,9 @@ class ACP::Types::SessionUpdate::UsageUpdate
32
32
  # @rbs return: ACP::Types::SessionUpdate::UsageUpdate
33
33
  def self.from_h(hash)
34
34
  new(
35
- used: hash.fetch('used'),
36
- size: hash.fetch('size'),
37
- cost: hash['cost']&.then { |value| ACP::Types::Cost.from_h(value) },
35
+ used: ACP::Types::Check.integer(ACP::Types::Check.key(hash, 'used'), 'used', min: 0),
36
+ size: ACP::Types::Check.integer(ACP::Types::Check.key(hash, 'size'), 'size', min: 0),
37
+ cost: ACP::Types::Check.object(hash['cost'], 'cost', ACP::Types::Cost, allow_nil: true),
38
38
  meta: hash['_meta']
39
39
  )
40
40
  end
@@ -27,8 +27,8 @@ class ACP::Types::SessionUpdate::UserMessageChunk
27
27
  # @rbs return: ACP::Types::SessionUpdate::UserMessageChunk
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
@@ -16,7 +16,7 @@ class ACP::Types::SetSessionConfigOptionRequest::Value::Boolean
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::SetSessionConfigOptionRequest::Value::Boolean
18
18
  def self.from_h(hash)
19
- new(value: hash.fetch('value'))
19
+ new(value: ACP::Types::Check.boolean(ACP::Types::Check.key(hash, 'value'), 'value'))
20
20
  end
21
21
 
22
22
  # @rbs return: Hash[String, untyped]
@@ -16,7 +16,7 @@ class ACP::Types::SetSessionConfigOptionRequest::Value::ValueId
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::SetSessionConfigOptionRequest::Value::ValueId
18
18
  def self.from_h(hash)
19
- new(value: hash.fetch('value'))
19
+ new(value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'value'), 'value'))
20
20
  end
21
21
 
22
22
  # @rbs return: Hash[String, untyped]
@@ -32,8 +32,8 @@ class ACP::Types::SetSessionConfigOptionRequest
32
32
  # @rbs return: ACP::Types::SetSessionConfigOptionRequest
33
33
  def self.from_h(hash)
34
34
  new(
35
- session_id: hash.fetch('sessionId'),
36
- config_id: hash.fetch('configId'),
35
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
36
+ config_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'configId'), 'configId'),
37
37
  meta: hash['_meta'],
38
38
  value: ACP::Types::SetSessionConfigOptionRequest::Value.from_h(hash)
39
39
  )
@@ -21,10 +21,13 @@ class ACP::Types::SetSessionConfigOptionResponse
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SetSessionConfigOptionResponse
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]
@@ -26,7 +26,11 @@ class ACP::Types::SetSessionModeRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::SetSessionModeRequest
28
28
  def self.from_h(hash)
29
- new(session_id: hash.fetch('sessionId'), mode_id: hash.fetch('modeId'), meta: hash['_meta'])
29
+ new(
30
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
31
+ mode_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'modeId'), 'modeId'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::StringMultiSelectItems
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::StringMultiSelectItems
23
23
  def self.from_h(hash)
24
- new(enum: hash.fetch('enum'), meta: hash['_meta'])
24
+ enum = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'enum'), 'enum') do |item, path|
25
+ ACP::Types::Check.string(item, path)
26
+ end
27
+ new(enum:, meta: hash['_meta'])
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -72,16 +72,22 @@ class ACP::Types::StringPropertySchema
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::StringPropertySchema
74
74
  def self.from_h(hash)
75
+ enum = ACP::Types::Check.array(hash['enum'], 'enum', allow_nil: true) do |item, path|
76
+ ACP::Types::Check.string(item, path)
77
+ end
78
+ one_of = ACP::Types::Check.array(hash['oneOf'], 'oneOf', allow_nil: true) do |item, path|
79
+ ACP::Types::Check.object(item, path, ACP::Types::EnumOption)
80
+ end
75
81
  new(
76
- title: hash['title'],
77
- description: hash['description'],
78
- min_length: hash['minLength'],
79
- max_length: hash['maxLength'],
80
- pattern: hash['pattern'],
81
- format: hash['format'],
82
- default: hash['default'],
83
- enum: hash['enum'],
84
- one_of: hash['oneOf']&.map { |item| ACP::Types::EnumOption.from_h(item) },
82
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
83
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
84
+ min_length: ACP::Types::Check.integer(hash['minLength'], 'minLength', min: 0, allow_nil: true),
85
+ max_length: ACP::Types::Check.integer(hash['maxLength'], 'maxLength', min: 0, allow_nil: true),
86
+ pattern: ACP::Types::Check.string(hash['pattern'], 'pattern', allow_nil: true),
87
+ format: ACP::Types::Check.enum(hash['format'], 'format', %w[email uri date date-time], allow_nil: true),
88
+ default: ACP::Types::Check.string(hash['default'], 'default', allow_nil: true),
89
+ enum:,
90
+ one_of:,
85
91
  meta: hash['_meta']
86
92
  )
87
93
  end
@@ -21,7 +21,10 @@ class ACP::Types::Terminal
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::Terminal
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]
@@ -26,7 +26,11 @@ class ACP::Types::TerminalExitStatus
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::TerminalExitStatus
28
28
  def self.from_h(hash)
29
- new(exit_code: hash['exitCode'], signal: hash['signal'], meta: hash['_meta'])
29
+ new(
30
+ exit_code: ACP::Types::Check.integer(hash['exitCode'], 'exitCode', min: 0, allow_nil: true),
31
+ signal: ACP::Types::Check.string(hash['signal'], 'signal', allow_nil: true),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -26,7 +26,11 @@ class ACP::Types::TerminalOutputRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::TerminalOutputRequest
28
28
  def self.from_h(hash)
29
- new(session_id: hash.fetch('sessionId'), terminal_id: hash.fetch('terminalId'), meta: hash['_meta'])
29
+ new(
30
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
31
+ terminal_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'terminalId'), 'terminalId'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,14 @@ class ACP::Types::TerminalOutputResponse
32
32
  # @rbs return: ACP::Types::TerminalOutputResponse
33
33
  def self.from_h(hash)
34
34
  new(
35
- output: hash.fetch('output'),
36
- truncated: hash.fetch('truncated'),
37
- exit_status: hash['exitStatus']&.then { |value| ACP::Types::TerminalExitStatus.from_h(value) },
35
+ output: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'output'), 'output'),
36
+ truncated: ACP::Types::Check.boolean(ACP::Types::Check.key(hash, 'truncated'), 'truncated'),
37
+ exit_status: ACP::Types::Check.object(
38
+ hash['exitStatus'],
39
+ 'exitStatus',
40
+ ACP::Types::TerminalExitStatus,
41
+ allow_nil: true
42
+ ),
38
43
  meta: hash['_meta']
39
44
  )
40
45
  end
@@ -27,8 +27,13 @@ class ACP::Types::TextContent
27
27
  # @rbs return: ACP::Types::TextContent
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
@@ -31,7 +31,12 @@ class ACP::Types::TextResourceContents
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::TextResourceContents
33
33
  def self.from_h(hash)
34
- new(mime_type: hash['mimeType'], text: hash.fetch('text'), uri: hash.fetch('uri'), meta: hash['_meta'])
34
+ new(
35
+ mime_type: ACP::Types::Check.string(hash['mimeType'], 'mimeType', allow_nil: true),
36
+ text: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'text'), 'text'),
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]
@@ -21,7 +21,10 @@ class ACP::Types::TitledMultiSelectItems
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::TitledMultiSelectItems
23
23
  def self.from_h(hash)
24
- new(any_of: hash.fetch('anyOf').map { |item| ACP::Types::EnumOption.from_h(item) }, meta: hash['_meta'])
24
+ any_of = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'anyOf'), 'anyOf') do |item, path|
25
+ ACP::Types::Check.object(item, path, ACP::Types::EnumOption)
26
+ end
27
+ new(any_of:, meta: hash['_meta'])
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -72,14 +72,30 @@ class ACP::Types::ToolCall
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::ToolCall
74
74
  def self.from_h(hash)
75
+ content = ACP::Types::Check.array(hash['content'], 'content', allow_nil: true) do |item, path|
76
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallContent)
77
+ end
78
+ locations = ACP::Types::Check.array(hash['locations'], 'locations', allow_nil: true) do |item, path|
79
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallLocation)
80
+ end
75
81
  new(
76
- tool_call_id: hash.fetch('toolCallId'),
77
- title: hash.fetch('title'),
78
- name: hash['name'],
79
- kind: hash['kind'],
80
- status: hash['status'],
81
- content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
82
- locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
82
+ tool_call_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'toolCallId'), 'toolCallId'),
83
+ title: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'title'), 'title'),
84
+ name: ACP::Types::Check.string(hash['name'], 'name', allow_nil: true),
85
+ kind: ACP::Types::Check.enum(
86
+ hash['kind'],
87
+ 'kind',
88
+ %w[read edit delete move search execute think fetch switch_mode other],
89
+ allow_nil: true
90
+ ),
91
+ status: ACP::Types::Check.enum(
92
+ hash['status'],
93
+ 'status',
94
+ %w[pending in_progress completed failed],
95
+ allow_nil: true
96
+ ),
97
+ content:,
98
+ locations:,
83
99
  raw_input: hash['rawInput'],
84
100
  raw_output: hash['rawOutput'],
85
101
  meta: hash['_meta']
@@ -21,7 +21,10 @@ class ACP::Types::ToolCallContent::Content
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::ToolCallContent::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]
@@ -31,7 +31,12 @@ class ACP::Types::ToolCallContent::Diff
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::ToolCallContent::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]
@@ -21,7 +21,10 @@ class ACP::Types::ToolCallContent::Terminal
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::ToolCallContent::Terminal
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]
@@ -26,7 +26,11 @@ class ACP::Types::ToolCallLocation
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::ToolCallLocation
28
28
  def self.from_h(hash)
29
- new(path: hash.fetch('path'), line: hash['line'], meta: hash['_meta'])
29
+ new(
30
+ path: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'path'), 'path'),
31
+ line: ACP::Types::Check.integer(hash['line'], 'line', min: 0, allow_nil: true),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -72,14 +72,30 @@ class ACP::Types::ToolCallUpdate
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::ToolCallUpdate
74
74
  def self.from_h(hash)
75
+ content = ACP::Types::Check.array(hash['content'], 'content', allow_nil: true) do |item, path|
76
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallContent)
77
+ end
78
+ locations = ACP::Types::Check.array(hash['locations'], 'locations', allow_nil: true) do |item, path|
79
+ ACP::Types::Check.object(item, path, ACP::Types::ToolCallLocation)
80
+ end
75
81
  new(
76
- tool_call_id: hash.fetch('toolCallId'),
77
- kind: hash['kind'],
78
- status: hash['status'],
79
- title: hash['title'],
80
- name: hash['name'],
81
- content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
82
- locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
82
+ tool_call_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'toolCallId'), 'toolCallId'),
83
+ kind: ACP::Types::Check.enum(
84
+ hash['kind'],
85
+ 'kind',
86
+ %w[read edit delete move search execute think fetch switch_mode other],
87
+ allow_nil: true
88
+ ),
89
+ status: ACP::Types::Check.enum(
90
+ hash['status'],
91
+ 'status',
92
+ %w[pending in_progress completed failed],
93
+ allow_nil: true
94
+ ),
95
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
96
+ name: ACP::Types::Check.string(hash['name'], 'name', allow_nil: true),
97
+ content:,
98
+ locations:,
83
99
  raw_input: hash['rawInput'],
84
100
  raw_output: hash['rawOutput'],
85
101
  meta: hash['_meta']
@@ -21,7 +21,7 @@ class ACP::Types::UnstructuredCommandInput
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::UnstructuredCommandInput
23
23
  def self.from_h(hash)
24
- new(hint: hash.fetch('hint'), meta: hash['_meta'])
24
+ new(hint: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'hint'), 'hint'), meta: hash['_meta'])
25
25
  end
26
26
 
27
27
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,9 @@ class ACP::Types::UsageUpdate
32
32
  # @rbs return: ACP::Types::UsageUpdate
33
33
  def self.from_h(hash)
34
34
  new(
35
- used: hash.fetch('used'),
36
- size: hash.fetch('size'),
37
- cost: hash['cost']&.then { |value| ACP::Types::Cost.from_h(value) },
35
+ used: ACP::Types::Check.integer(ACP::Types::Check.key(hash, 'used'), 'used', min: 0),
36
+ size: ACP::Types::Check.integer(ACP::Types::Check.key(hash, 'size'), 'size', min: 0),
37
+ cost: ACP::Types::Check.object(hash['cost'], 'cost', ACP::Types::Cost, allow_nil: true),
38
38
  meta: hash['_meta']
39
39
  )
40
40
  end
@@ -26,7 +26,11 @@ class ACP::Types::WaitForTerminalExitRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::WaitForTerminalExitRequest
28
28
  def self.from_h(hash)
29
- new(session_id: hash.fetch('sessionId'), terminal_id: hash.fetch('terminalId'), meta: hash['_meta'])
29
+ new(
30
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
31
+ terminal_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'terminalId'), 'terminalId'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -26,7 +26,11 @@ class ACP::Types::WaitForTerminalExitResponse
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::WaitForTerminalExitResponse
28
28
  def self.from_h(hash)
29
- new(exit_code: hash['exitCode'], signal: hash['signal'], meta: hash['_meta'])
29
+ new(
30
+ exit_code: ACP::Types::Check.integer(hash['exitCode'], 'exitCode', min: 0, allow_nil: true),
31
+ signal: ACP::Types::Check.string(hash['signal'], 'signal', allow_nil: true),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,9 @@ class ACP::Types::WriteTextFileRequest
32
32
  # @rbs return: ACP::Types::WriteTextFileRequest
33
33
  def self.from_h(hash)
34
34
  new(
35
- session_id: hash.fetch('sessionId'),
36
- path: hash.fetch('path'),
37
- content: hash.fetch('content'),
35
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
36
+ path: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'path'), 'path'),
37
+ content: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'content'), 'content'),
38
38
  meta: hash['_meta']
39
39
  )
40
40
  end