acp-sdk 0.7.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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +2 -1
  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 +93 -4
  7. data/lib/acp/request_error.rb +15 -2
  8. data/lib/acp/types/agent_auth_capabilities.rb +4 -1
  9. data/lib/acp/types/agent_capabilities.rb +20 -5
  10. data/lib/acp/types/annotations.rb +6 -3
  11. data/lib/acp/types/audio_content.rb +8 -3
  12. data/lib/acp/types/auth_capabilities.rb +1 -1
  13. data/lib/acp/types/auth_method/terminal.rb +11 -5
  14. data/lib/acp/types/auth_method_agent.rb +6 -1
  15. data/lib/acp/types/auth_method_terminal.rb +11 -5
  16. data/lib/acp/types/authenticate_request.rb +1 -1
  17. data/lib/acp/types/available_command.rb +3 -3
  18. data/lib/acp/types/available_commands_update.rb +7 -4
  19. data/lib/acp/types/blob_resource_contents.rb +6 -1
  20. data/lib/acp/types/boolean_property_schema.rb +6 -1
  21. data/lib/acp/types/cancel_notification.rb +4 -1
  22. data/lib/acp/types/cancel_request_notification.rb +9 -1
  23. data/lib/acp/types/client_capabilities.rb +15 -5
  24. data/lib/acp/types/client_session_capabilities.rb +6 -3
  25. data/lib/acp/types/close_session_request.rb +4 -1
  26. data/lib/acp/types/complete_elicitation_notification.rb +4 -1
  27. data/lib/acp/types/config_option_update.rb +7 -4
  28. data/lib/acp/types/content.rb +4 -1
  29. data/lib/acp/types/content_block/audio.rb +8 -3
  30. data/lib/acp/types/content_block/image.rb +9 -4
  31. data/lib/acp/types/content_block/resource.rb +11 -2
  32. data/lib/acp/types/content_block/resource_link.rb +12 -7
  33. data/lib/acp/types/content_block/text.rb +7 -2
  34. data/lib/acp/types/content_chunk.rb +2 -2
  35. data/lib/acp/types/cost.rb +5 -1
  36. data/lib/acp/types/create_elicitation_request/mode/form.rb +5 -1
  37. data/lib/acp/types/create_elicitation_request/mode/url.rb +2 -2
  38. data/lib/acp/types/create_elicitation_request.rb +1 -1
  39. data/lib/acp/types/create_elicitation_response/action/accept.rb +6 -1
  40. data/lib/acp/types/create_terminal_request.rb +12 -6
  41. data/lib/acp/types/create_terminal_response.rb +4 -1
  42. data/lib/acp/types/current_mode_update.rb +4 -1
  43. data/lib/acp/types/delete_session_request.rb +4 -1
  44. data/lib/acp/types/diff.rb +6 -1
  45. data/lib/acp/types/elicitation_accept_action.rb +6 -1
  46. data/lib/acp/types/elicitation_capabilities.rb +2 -2
  47. data/lib/acp/types/elicitation_form_mode.rb +5 -1
  48. data/lib/acp/types/elicitation_property_schema/boolean_property_schema.rb +6 -1
  49. data/lib/acp/types/elicitation_property_schema/integer_property_schema.rb +5 -5
  50. data/lib/acp/types/elicitation_property_schema/multi_select_property_schema.rb +9 -6
  51. data/lib/acp/types/elicitation_property_schema/number_property_schema.rb +5 -5
  52. data/lib/acp/types/elicitation_property_schema/string_property_schema.rb +15 -9
  53. data/lib/acp/types/elicitation_request_scope.rb +8 -1
  54. data/lib/acp/types/elicitation_schema.rb +11 -5
  55. data/lib/acp/types/elicitation_session_scope.rb +4 -1
  56. data/lib/acp/types/elicitation_url_mode.rb +2 -2
  57. data/lib/acp/types/embedded_resource.rb +11 -2
  58. data/lib/acp/types/enum_option.rb +6 -1
  59. data/lib/acp/types/env_variable.rb +5 -1
  60. data/lib/acp/types/file_system_capabilities.rb +5 -1
  61. data/lib/acp/types/http_header.rb +5 -1
  62. data/lib/acp/types/image_content.rb +9 -4
  63. data/lib/acp/types/implementation.rb +6 -1
  64. data/lib/acp/types/initialize_request.rb +18 -3
  65. data/lib/acp/types/initialize_response.rb +17 -4
  66. data/lib/acp/types/integer_property_schema.rb +5 -5
  67. data/lib/acp/types/kill_terminal_request.rb +5 -1
  68. data/lib/acp/types/list_sessions_request.rb +5 -1
  69. data/lib/acp/types/list_sessions_response.rb +5 -2
  70. data/lib/acp/types/load_session_request.rb +14 -4
  71. data/lib/acp/types/load_session_response.rb +5 -2
  72. data/lib/acp/types/mcp_capabilities.rb +5 -1
  73. data/lib/acp/types/mcp_server/http.rb +6 -3
  74. data/lib/acp/types/mcp_server/sse.rb +6 -3
  75. data/lib/acp/types/mcp_server_http.rb +6 -3
  76. data/lib/acp/types/mcp_server_sse.rb +6 -3
  77. data/lib/acp/types/mcp_server_stdio.rb +10 -4
  78. data/lib/acp/types/multi_select_items/string_multi_select_items.rb +4 -1
  79. data/lib/acp/types/multi_select_property_schema.rb +9 -6
  80. data/lib/acp/types/new_session_request.rb +13 -3
  81. data/lib/acp/types/new_session_response.rb +6 -3
  82. data/lib/acp/types/number_property_schema.rb +5 -5
  83. data/lib/acp/types/permission_option.rb +10 -1
  84. data/lib/acp/types/plan.rb +4 -1
  85. data/lib/acp/types/plan_entry.rb +7 -3
  86. data/lib/acp/types/prompt_capabilities.rb +6 -1
  87. data/lib/acp/types/prompt_request.rb +5 -2
  88. data/lib/acp/types/prompt_response.rb +8 -1
  89. data/lib/acp/types/read_text_file_request.rb +4 -4
  90. data/lib/acp/types/read_text_file_response.rb +1 -1
  91. data/lib/acp/types/release_terminal_request.rb +5 -1
  92. data/lib/acp/types/request_permission_outcome/selected.rb +1 -1
  93. data/lib/acp/types/request_permission_request.rb +10 -3
  94. data/lib/acp/types/request_permission_response.rb +8 -1
  95. data/lib/acp/types/resource_link.rb +12 -7
  96. data/lib/acp/types/resume_session_request.rb +14 -4
  97. data/lib/acp/types/resume_session_response.rb +5 -2
  98. data/lib/acp/types/selected_permission_outcome.rb +1 -1
  99. data/lib/acp/types/session_capabilities.rb +20 -7
  100. data/lib/acp/types/session_config_boolean.rb +1 -1
  101. data/lib/acp/types/session_config_option/kind/boolean.rb +1 -1
  102. data/lib/acp/types/session_config_option/kind/select.rb +6 -2
  103. data/lib/acp/types/session_config_option.rb +3 -3
  104. data/lib/acp/types/session_config_options_capabilities.rb +6 -1
  105. data/lib/acp/types/session_config_select.rb +6 -2
  106. data/lib/acp/types/session_config_select_group.rb +6 -3
  107. data/lib/acp/types/session_config_select_option.rb +6 -1
  108. data/lib/acp/types/session_config_select_options.rb +6 -2
  109. data/lib/acp/types/session_info.rb +12 -5
  110. data/lib/acp/types/session_info_update.rb +10 -1
  111. data/lib/acp/types/session_mode.rb +6 -1
  112. data/lib/acp/types/session_mode_state.rb +8 -2
  113. data/lib/acp/types/session_notification.rb +2 -2
  114. data/lib/acp/types/session_update/agent_message_chunk.rb +2 -2
  115. data/lib/acp/types/session_update/agent_thought_chunk.rb +2 -2
  116. data/lib/acp/types/session_update/available_commands_update.rb +7 -4
  117. data/lib/acp/types/session_update/config_option_update.rb +7 -4
  118. data/lib/acp/types/session_update/current_mode_update.rb +4 -1
  119. data/lib/acp/types/session_update/plan.rb +4 -1
  120. data/lib/acp/types/session_update/session_info_update.rb +10 -1
  121. data/lib/acp/types/session_update/tool_call.rb +23 -7
  122. data/lib/acp/types/session_update/tool_call_update.rb +23 -7
  123. data/lib/acp/types/session_update/usage_update.rb +3 -3
  124. data/lib/acp/types/session_update/user_message_chunk.rb +2 -2
  125. data/lib/acp/types/set_session_config_option_request/value/boolean.rb +1 -1
  126. data/lib/acp/types/set_session_config_option_request/value/value_id.rb +1 -1
  127. data/lib/acp/types/set_session_config_option_request.rb +2 -2
  128. data/lib/acp/types/set_session_config_option_response.rb +7 -4
  129. data/lib/acp/types/set_session_mode_request.rb +5 -1
  130. data/lib/acp/types/string_multi_select_items.rb +4 -1
  131. data/lib/acp/types/string_property_schema.rb +15 -9
  132. data/lib/acp/types/terminal.rb +4 -1
  133. data/lib/acp/types/terminal_exit_status.rb +5 -1
  134. data/lib/acp/types/terminal_output_request.rb +5 -1
  135. data/lib/acp/types/terminal_output_response.rb +8 -3
  136. data/lib/acp/types/text_content.rb +7 -2
  137. data/lib/acp/types/text_resource_contents.rb +6 -1
  138. data/lib/acp/types/titled_multi_select_items.rb +4 -1
  139. data/lib/acp/types/tool_call.rb +23 -7
  140. data/lib/acp/types/tool_call_content/content.rb +4 -1
  141. data/lib/acp/types/tool_call_content/diff.rb +6 -1
  142. data/lib/acp/types/tool_call_content/terminal.rb +4 -1
  143. data/lib/acp/types/tool_call_location.rb +5 -1
  144. data/lib/acp/types/tool_call_update.rb +23 -7
  145. data/lib/acp/types/unstructured_command_input.rb +1 -1
  146. data/lib/acp/types/usage_update.rb +3 -3
  147. data/lib/acp/types/wait_for_terminal_exit_request.rb +5 -1
  148. data/lib/acp/types/wait_for_terminal_exit_response.rb +5 -1
  149. data/lib/acp/types/write_text_file_request.rb +3 -3
  150. data/lib/acp/types.rb +247 -0
  151. data/lib/acp/version.rb +1 -1
  152. data/sig/generated/acp/client_connection.rbs +39 -1
  153. data/sig/generated/acp/request_error.rbs +12 -1
  154. data/sig/generated/acp/types.rbs +143 -0
  155. metadata +1 -1
@@ -31,7 +31,12 @@ class ACP::Types::Implementation
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::Implementation
33
33
  def self.from_h(hash)
34
- new(name: hash.fetch('name'), title: hash['title'], version: hash.fetch('version'), meta: hash['_meta'])
34
+ new(
35
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
36
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
37
+ version: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'version'), 'version'),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,24 @@ class ACP::Types::InitializeRequest
32
32
  # @rbs return: ACP::Types::InitializeRequest
33
33
  def self.from_h(hash)
34
34
  new(
35
- protocol_version: hash.fetch('protocolVersion'),
36
- client_capabilities: hash['clientCapabilities']&.then { |value| ACP::Types::ClientCapabilities.from_h(value) },
37
- client_info: hash['clientInfo']&.then { |value| ACP::Types::Implementation.from_h(value) },
35
+ protocol_version: ACP::Types::Check.integer(
36
+ ACP::Types::Check.key(hash, 'protocolVersion'),
37
+ 'protocolVersion',
38
+ min: 0,
39
+ max: 65_535
40
+ ),
41
+ client_capabilities: ACP::Types::Check.object(
42
+ hash['clientCapabilities'],
43
+ 'clientCapabilities',
44
+ ACP::Types::ClientCapabilities,
45
+ allow_nil: true
46
+ ),
47
+ client_info: ACP::Types::Check.object(
48
+ hash['clientInfo'],
49
+ 'clientInfo',
50
+ ACP::Types::Implementation,
51
+ allow_nil: true
52
+ ),
38
53
  meta: hash['_meta']
39
54
  )
40
55
  end
@@ -36,11 +36,24 @@ class ACP::Types::InitializeResponse
36
36
  # @rbs hash: Hash[String, untyped]
37
37
  # @rbs return: ACP::Types::InitializeResponse
38
38
  def self.from_h(hash)
39
+ auth_methods = ACP::Types::Check.array(hash['authMethods'], 'authMethods', allow_nil: true) do |item, path|
40
+ ACP::Types::Check.object(item, path, ACP::Types::AuthMethod)
41
+ end
39
42
  new(
40
- protocol_version: hash.fetch('protocolVersion'),
41
- agent_capabilities: hash['agentCapabilities']&.then { |value| ACP::Types::AgentCapabilities.from_h(value) },
42
- auth_methods: hash['authMethods']&.map { |item| ACP::Types::AuthMethod.from_h(item) },
43
- agent_info: hash['agentInfo']&.then { |value| ACP::Types::Implementation.from_h(value) },
43
+ protocol_version: ACP::Types::Check.integer(
44
+ ACP::Types::Check.key(hash, 'protocolVersion'),
45
+ 'protocolVersion',
46
+ min: 0,
47
+ max: 65_535
48
+ ),
49
+ agent_capabilities: ACP::Types::Check.object(
50
+ hash['agentCapabilities'],
51
+ 'agentCapabilities',
52
+ ACP::Types::AgentCapabilities,
53
+ allow_nil: true
54
+ ),
55
+ auth_methods:,
56
+ agent_info: ACP::Types::Check.object(hash['agentInfo'], 'agentInfo', ACP::Types::Implementation, allow_nil: true),
44
57
  meta: hash['_meta']
45
58
  )
46
59
  end
@@ -42,11 +42,11 @@ class ACP::Types::IntegerPropertySchema
42
42
  # @rbs return: ACP::Types::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
@@ -26,7 +26,11 @@ class ACP::Types::KillTerminalRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::KillTerminalRequest
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::ListSessionsRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::ListSessionsRequest
28
28
  def self.from_h(hash)
29
- new(cwd: hash['cwd'], cursor: hash['cursor'], meta: hash['_meta'])
29
+ new(
30
+ cwd: ACP::Types::Check.string(hash['cwd'], 'cwd', allow_nil: true),
31
+ cursor: ACP::Types::Check.string(hash['cursor'], 'cursor', allow_nil: true),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -26,9 +26,12 @@ class ACP::Types::ListSessionsResponse
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::ListSessionsResponse
28
28
  def self.from_h(hash)
29
+ sessions = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'sessions'), 'sessions') do |item, path|
30
+ ACP::Types::Check.object(item, path, ACP::Types::SessionInfo)
31
+ end
29
32
  new(
30
- sessions: hash.fetch('sessions').map { |item| ACP::Types::SessionInfo.from_h(item) },
31
- next_cursor: hash['nextCursor'],
33
+ sessions:,
34
+ next_cursor: ACP::Types::Check.string(hash['nextCursor'], 'nextCursor', allow_nil: true),
32
35
  meta: hash['_meta']
33
36
  )
34
37
  end
@@ -36,11 +36,21 @@ class ACP::Types::LoadSessionRequest
36
36
  # @rbs hash: Hash[String, untyped]
37
37
  # @rbs return: ACP::Types::LoadSessionRequest
38
38
  def self.from_h(hash)
39
+ mcp_servers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'mcpServers'), 'mcpServers') do |item, path|
40
+ ACP::Types::Check.object(item, path, ACP::Types::McpServer)
41
+ end
42
+ additional_directories = ACP::Types::Check.array(
43
+ hash['additionalDirectories'],
44
+ 'additionalDirectories',
45
+ allow_nil: true
46
+ ) do |item, path|
47
+ ACP::Types::Check.string(item, path)
48
+ end
39
49
  new(
40
- mcp_servers: hash.fetch('mcpServers').map { |item| ACP::Types::McpServer.from_h(item) },
41
- cwd: hash.fetch('cwd'),
42
- additional_directories: hash['additionalDirectories'],
43
- session_id: hash.fetch('sessionId'),
50
+ mcp_servers:,
51
+ cwd: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'cwd'), 'cwd'),
52
+ additional_directories:,
53
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
44
54
  meta: hash['_meta']
45
55
  )
46
56
  end
@@ -26,9 +26,12 @@ class ACP::Types::LoadSessionResponse
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::LoadSessionResponse
28
28
  def self.from_h(hash)
29
+ config_options = ACP::Types::Check.array(hash['configOptions'], 'configOptions', allow_nil: true) do |item, path|
30
+ ACP::Types::Check.object(item, path, ACP::Types::SessionConfigOption)
31
+ end
29
32
  new(
30
- modes: hash['modes']&.then { |value| ACP::Types::SessionModeState.from_h(value) },
31
- config_options: hash['configOptions']&.map { |item| ACP::Types::SessionConfigOption.from_h(item) },
33
+ modes: ACP::Types::Check.object(hash['modes'], 'modes', ACP::Types::SessionModeState, allow_nil: true),
34
+ config_options:,
32
35
  meta: hash['_meta']
33
36
  )
34
37
  end
@@ -26,7 +26,11 @@ class ACP::Types::McpCapabilities
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::McpCapabilities
28
28
  def self.from_h(hash)
29
- new(http: hash['http'], sse: hash['sse'], meta: hash['_meta'])
29
+ new(
30
+ http: ACP::Types::Check.boolean(hash['http'], 'http', allow_nil: true),
31
+ sse: ACP::Types::Check.boolean(hash['sse'], 'sse', allow_nil: true),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -31,10 +31,13 @@ class ACP::Types::McpServer::Http
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::McpServer::Http
33
33
  def self.from_h(hash)
34
+ headers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'headers'), 'headers') do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::HttpHeader)
36
+ end
34
37
  new(
35
- name: hash.fetch('name'),
36
- url: hash.fetch('url'),
37
- headers: hash.fetch('headers').map { |item| ACP::Types::HttpHeader.from_h(item) },
38
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
39
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
40
+ headers:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -31,10 +31,13 @@ class ACP::Types::McpServer::Sse
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::McpServer::Sse
33
33
  def self.from_h(hash)
34
+ headers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'headers'), 'headers') do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::HttpHeader)
36
+ end
34
37
  new(
35
- name: hash.fetch('name'),
36
- url: hash.fetch('url'),
37
- headers: hash.fetch('headers').map { |item| ACP::Types::HttpHeader.from_h(item) },
38
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
39
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
40
+ headers:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -31,10 +31,13 @@ class ACP::Types::McpServerHttp
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::McpServerHttp
33
33
  def self.from_h(hash)
34
+ headers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'headers'), 'headers') do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::HttpHeader)
36
+ end
34
37
  new(
35
- name: hash.fetch('name'),
36
- url: hash.fetch('url'),
37
- headers: hash.fetch('headers').map { |item| ACP::Types::HttpHeader.from_h(item) },
38
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
39
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
40
+ headers:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -31,10 +31,13 @@ class ACP::Types::McpServerSse
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::McpServerSse
33
33
  def self.from_h(hash)
34
+ headers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'headers'), 'headers') do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::HttpHeader)
36
+ end
34
37
  new(
35
- name: hash.fetch('name'),
36
- url: hash.fetch('url'),
37
- headers: hash.fetch('headers').map { |item| ACP::Types::HttpHeader.from_h(item) },
38
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
39
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
40
+ headers:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -36,11 +36,17 @@ class ACP::Types::McpServerStdio
36
36
  # @rbs hash: Hash[String, untyped]
37
37
  # @rbs return: ACP::Types::McpServerStdio
38
38
  def self.from_h(hash)
39
+ args = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'args'), 'args') do |item, path|
40
+ ACP::Types::Check.string(item, path)
41
+ end
42
+ env = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'env'), 'env') do |item, path|
43
+ ACP::Types::Check.object(item, path, ACP::Types::EnvVariable)
44
+ end
39
45
  new(
40
- name: hash.fetch('name'),
41
- command: hash.fetch('command'),
42
- args: hash.fetch('args'),
43
- env: hash.fetch('env').map { |item| ACP::Types::EnvVariable.from_h(item) },
46
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
47
+ command: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'command'), 'command'),
48
+ args:,
49
+ env:,
44
50
  meta: hash['_meta']
45
51
  )
46
52
  end
@@ -21,7 +21,10 @@ class ACP::Types::MultiSelectItems::StringMultiSelectItems
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::MultiSelectItems::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]
@@ -46,13 +46,16 @@ class ACP::Types::MultiSelectPropertySchema
46
46
  # @rbs hash: Hash[String, untyped]
47
47
  # @rbs return: ACP::Types::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
@@ -31,10 +31,20 @@ class ACP::Types::NewSessionRequest
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::NewSessionRequest
33
33
  def self.from_h(hash)
34
+ additional_directories = ACP::Types::Check.array(
35
+ hash['additionalDirectories'],
36
+ 'additionalDirectories',
37
+ allow_nil: true
38
+ ) do |item, path|
39
+ ACP::Types::Check.string(item, path)
40
+ end
41
+ mcp_servers = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'mcpServers'), 'mcpServers') do |item, path|
42
+ ACP::Types::Check.object(item, path, ACP::Types::McpServer)
43
+ end
34
44
  new(
35
- cwd: hash.fetch('cwd'),
36
- additional_directories: hash['additionalDirectories'],
37
- mcp_servers: hash.fetch('mcpServers').map { |item| ACP::Types::McpServer.from_h(item) },
45
+ cwd: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'cwd'), 'cwd'),
46
+ additional_directories:,
47
+ mcp_servers:,
38
48
  meta: hash['_meta']
39
49
  )
40
50
  end
@@ -31,10 +31,13 @@ class ACP::Types::NewSessionResponse
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::NewSessionResponse
33
33
  def self.from_h(hash)
34
+ config_options = ACP::Types::Check.array(hash['configOptions'], 'configOptions', allow_nil: true) do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::SessionConfigOption)
36
+ end
34
37
  new(
35
- session_id: hash.fetch('sessionId'),
36
- modes: hash['modes']&.then { |value| ACP::Types::SessionModeState.from_h(value) },
37
- config_options: hash['configOptions']&.map { |item| ACP::Types::SessionConfigOption.from_h(item) },
38
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
39
+ modes: ACP::Types::Check.object(hash['modes'], 'modes', ACP::Types::SessionModeState, allow_nil: true),
40
+ config_options:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -42,11 +42,11 @@ class ACP::Types::NumberPropertySchema
42
42
  # @rbs return: ACP::Types::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
@@ -31,7 +31,16 @@ class ACP::Types::PermissionOption
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::PermissionOption
33
33
  def self.from_h(hash)
34
- new(option_id: hash.fetch('optionId'), name: hash.fetch('name'), kind: hash.fetch('kind'), meta: hash['_meta'])
34
+ new(
35
+ option_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'optionId'), 'optionId'),
36
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
37
+ kind: ACP::Types::Check.enum(
38
+ ACP::Types::Check.key(hash, 'kind'),
39
+ 'kind',
40
+ %w[allow_once allow_always reject_once reject_always]
41
+ ),
42
+ meta: hash['_meta']
43
+ )
35
44
  end
36
45
 
37
46
  # @rbs return: Hash[String, untyped]
@@ -21,7 +21,10 @@ class ACP::Types::Plan
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::Plan
23
23
  def self.from_h(hash)
24
- new(entries: hash.fetch('entries').map { |item| ACP::Types::PlanEntry.from_h(item) }, meta: hash['_meta'])
24
+ entries = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'entries'), 'entries') do |item, path|
25
+ ACP::Types::Check.object(item, path, ACP::Types::PlanEntry)
26
+ end
27
+ new(entries:, meta: hash['_meta'])
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -32,9 +32,13 @@ class ACP::Types::PlanEntry
32
32
  # @rbs return: ACP::Types::PlanEntry
33
33
  def self.from_h(hash)
34
34
  new(
35
- content: hash.fetch('content'),
36
- priority: hash.fetch('priority'),
37
- status: hash.fetch('status'),
35
+ content: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'content'), 'content'),
36
+ priority: ACP::Types::Check.enum(ACP::Types::Check.key(hash, 'priority'), 'priority', %w[high medium low]),
37
+ status: ACP::Types::Check.enum(
38
+ ACP::Types::Check.key(hash, 'status'),
39
+ 'status',
40
+ %w[pending in_progress completed]
41
+ ),
38
42
  meta: hash['_meta']
39
43
  )
40
44
  end
@@ -31,7 +31,12 @@ class ACP::Types::PromptCapabilities
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::PromptCapabilities
33
33
  def self.from_h(hash)
34
- new(image: hash['image'], audio: hash['audio'], embedded_context: hash['embeddedContext'], meta: hash['_meta'])
34
+ new(
35
+ image: ACP::Types::Check.boolean(hash['image'], 'image', allow_nil: true),
36
+ audio: ACP::Types::Check.boolean(hash['audio'], 'audio', allow_nil: true),
37
+ embedded_context: ACP::Types::Check.boolean(hash['embeddedContext'], 'embeddedContext', allow_nil: true),
38
+ meta: hash['_meta']
39
+ )
35
40
  end
36
41
 
37
42
  # @rbs return: Hash[String, untyped]
@@ -26,9 +26,12 @@ class ACP::Types::PromptRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::PromptRequest
28
28
  def self.from_h(hash)
29
+ prompt = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'prompt'), 'prompt') do |item, path|
30
+ ACP::Types::Check.object(item, path, ACP::Types::ContentBlock)
31
+ end
29
32
  new(
30
- session_id: hash.fetch('sessionId'),
31
- prompt: hash.fetch('prompt').map { |item| ACP::Types::ContentBlock.from_h(item) },
33
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
34
+ prompt:,
32
35
  meta: hash['_meta']
33
36
  )
34
37
  end
@@ -21,7 +21,14 @@ class ACP::Types::PromptResponse
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::PromptResponse
23
23
  def self.from_h(hash)
24
- new(stop_reason: hash.fetch('stopReason'), meta: hash['_meta'])
24
+ new(
25
+ stop_reason: ACP::Types::Check.enum(
26
+ ACP::Types::Check.key(hash, 'stopReason'),
27
+ 'stopReason',
28
+ %w[end_turn max_tokens max_turn_requests refusal cancelled]
29
+ ),
30
+ meta: hash['_meta']
31
+ )
25
32
  end
26
33
 
27
34
  # @rbs return: Hash[String, untyped]
@@ -37,10 +37,10 @@ class ACP::Types::ReadTextFileRequest
37
37
  # @rbs return: ACP::Types::ReadTextFileRequest
38
38
  def self.from_h(hash)
39
39
  new(
40
- session_id: hash.fetch('sessionId'),
41
- path: hash.fetch('path'),
42
- line: hash['line'],
43
- limit: hash['limit'],
40
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
41
+ path: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'path'), 'path'),
42
+ line: ACP::Types::Check.integer(hash['line'], 'line', min: 0, allow_nil: true),
43
+ limit: ACP::Types::Check.integer(hash['limit'], 'limit', min: 0, allow_nil: true),
44
44
  meta: hash['_meta']
45
45
  )
46
46
  end
@@ -21,7 +21,7 @@ class ACP::Types::ReadTextFileResponse
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::ReadTextFileResponse
23
23
  def self.from_h(hash)
24
- new(content: hash.fetch('content'), meta: hash['_meta'])
24
+ new(content: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'content'), 'content'), meta: hash['_meta'])
25
25
  end
26
26
 
27
27
  # @rbs return: Hash[String, untyped]
@@ -26,7 +26,11 @@ class ACP::Types::ReleaseTerminalRequest
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::ReleaseTerminalRequest
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]
@@ -21,7 +21,7 @@ class ACP::Types::RequestPermissionOutcome::Selected
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::RequestPermissionOutcome::Selected
23
23
  def self.from_h(hash)
24
- new(option_id: hash.fetch('optionId'), meta: hash['_meta'])
24
+ new(option_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'optionId'), 'optionId'), meta: hash['_meta'])
25
25
  end
26
26
 
27
27
  # @rbs return: Hash[String, untyped]
@@ -31,10 +31,17 @@ class ACP::Types::RequestPermissionRequest
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::RequestPermissionRequest
33
33
  def self.from_h(hash)
34
+ options = ACP::Types::Check.array(ACP::Types::Check.key(hash, 'options'), 'options') do |item, path|
35
+ ACP::Types::Check.object(item, path, ACP::Types::PermissionOption)
36
+ end
34
37
  new(
35
- session_id: hash.fetch('sessionId'),
36
- tool_call: ACP::Types::ToolCallUpdate.from_h(hash.fetch('toolCall')),
37
- options: hash.fetch('options').map { |item| ACP::Types::PermissionOption.from_h(item) },
38
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
39
+ tool_call: ACP::Types::Check.object(
40
+ ACP::Types::Check.key(hash, 'toolCall'),
41
+ 'toolCall',
42
+ ACP::Types::ToolCallUpdate
43
+ ),
44
+ options:,
38
45
  meta: hash['_meta']
39
46
  )
40
47
  end
@@ -21,7 +21,14 @@ class ACP::Types::RequestPermissionResponse
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::RequestPermissionResponse
23
23
  def self.from_h(hash)
24
- new(outcome: ACP::Types::RequestPermissionOutcome.from_h(hash.fetch('outcome')), meta: hash['_meta'])
24
+ new(
25
+ outcome: ACP::Types::Check.object(
26
+ ACP::Types::Check.key(hash, 'outcome'),
27
+ 'outcome',
28
+ ACP::Types::RequestPermissionOutcome
29
+ ),
30
+ meta: hash['_meta']
31
+ )
25
32
  end
26
33
 
27
34
  # @rbs return: Hash[String, untyped]
@@ -52,13 +52,18 @@ class ACP::Types::ResourceLink
52
52
  # @rbs return: ACP::Types::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
@@ -36,11 +36,21 @@ class ACP::Types::ResumeSessionRequest
36
36
  # @rbs hash: Hash[String, untyped]
37
37
  # @rbs return: ACP::Types::ResumeSessionRequest
38
38
  def self.from_h(hash)
39
+ additional_directories = ACP::Types::Check.array(
40
+ hash['additionalDirectories'],
41
+ 'additionalDirectories',
42
+ allow_nil: true
43
+ ) do |item, path|
44
+ ACP::Types::Check.string(item, path)
45
+ end
46
+ mcp_servers = ACP::Types::Check.array(hash['mcpServers'], 'mcpServers', allow_nil: true) do |item, path|
47
+ ACP::Types::Check.object(item, path, ACP::Types::McpServer)
48
+ end
39
49
  new(
40
- session_id: hash.fetch('sessionId'),
41
- cwd: hash.fetch('cwd'),
42
- additional_directories: hash['additionalDirectories'],
43
- mcp_servers: hash['mcpServers']&.map { |item| ACP::Types::McpServer.from_h(item) },
50
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
51
+ cwd: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'cwd'), 'cwd'),
52
+ additional_directories:,
53
+ mcp_servers:,
44
54
  meta: hash['_meta']
45
55
  )
46
56
  end