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
@@ -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
@@ -26,9 +26,12 @@ class ACP::Types::ResumeSessionResponse
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::ResumeSessionResponse
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
@@ -21,7 +21,7 @@ class ACP::Types::SelectedPermissionOutcome
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SelectedPermissionOutcome
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]
@@ -42,13 +42,26 @@ class ACP::Types::SessionCapabilities
42
42
  # @rbs return: ACP::Types::SessionCapabilities
43
43
  def self.from_h(hash)
44
44
  new(
45
- list: hash['list']&.then { |value| ACP::Types::SessionListCapabilities.from_h(value) },
46
- delete: hash['delete']&.then { |value| ACP::Types::SessionDeleteCapabilities.from_h(value) },
47
- additional_directories: hash['additionalDirectories']&.then do |value|
48
- ACP::Types::SessionAdditionalDirectoriesCapabilities.from_h(value)
49
- end,
50
- resume: hash['resume']&.then { |value| ACP::Types::SessionResumeCapabilities.from_h(value) },
51
- close: hash['close']&.then { |value| ACP::Types::SessionCloseCapabilities.from_h(value) },
45
+ list: ACP::Types::Check.object(hash['list'], 'list', ACP::Types::SessionListCapabilities, allow_nil: true),
46
+ delete: ACP::Types::Check.object(
47
+ hash['delete'],
48
+ 'delete',
49
+ ACP::Types::SessionDeleteCapabilities,
50
+ allow_nil: true
51
+ ),
52
+ additional_directories: ACP::Types::Check.object(
53
+ hash['additionalDirectories'],
54
+ 'additionalDirectories',
55
+ ACP::Types::SessionAdditionalDirectoriesCapabilities,
56
+ allow_nil: true
57
+ ),
58
+ resume: ACP::Types::Check.object(
59
+ hash['resume'],
60
+ 'resume',
61
+ ACP::Types::SessionResumeCapabilities,
62
+ allow_nil: true
63
+ ),
64
+ close: ACP::Types::Check.object(hash['close'], 'close', ACP::Types::SessionCloseCapabilities, allow_nil: true),
52
65
  meta: hash['_meta']
53
66
  )
54
67
  end
@@ -16,7 +16,7 @@ class ACP::Types::SessionConfigBoolean
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::SessionConfigBoolean
18
18
  def self.from_h(hash)
19
- new(current_value: hash.fetch('currentValue'))
19
+ new(current_value: ACP::Types::Check.boolean(ACP::Types::Check.key(hash, 'currentValue'), 'currentValue'))
20
20
  end
21
21
 
22
22
  # @rbs return: Hash[String, untyped]
@@ -16,7 +16,7 @@ class ACP::Types::SessionConfigOption::Kind::Boolean
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::SessionConfigOption::Kind::Boolean
18
18
  def self.from_h(hash)
19
- new(current_value: hash.fetch('currentValue'))
19
+ new(current_value: ACP::Types::Check.boolean(ACP::Types::Check.key(hash, 'currentValue'), 'currentValue'))
20
20
  end
21
21
 
22
22
  # @rbs return: Hash[String, untyped]
@@ -22,8 +22,12 @@ class ACP::Types::SessionConfigOption::Kind::Select
22
22
  # @rbs return: ACP::Types::SessionConfigOption::Kind::Select
23
23
  def self.from_h(hash)
24
24
  new(
25
- current_value: hash.fetch('currentValue'),
26
- options: ACP::Types::SessionConfigSelectOptions.from_a(hash.fetch('options'))
25
+ current_value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'currentValue'), 'currentValue'),
26
+ options: ACP::Types::Check.objects(
27
+ ACP::Types::Check.key(hash, 'options'),
28
+ 'options',
29
+ ACP::Types::SessionConfigSelectOptions
30
+ )
27
31
  )
28
32
  end
29
33
 
@@ -42,9 +42,9 @@ class ACP::Types::SessionConfigOption
42
42
  # @rbs return: ACP::Types::SessionConfigOption
43
43
  def self.from_h(hash)
44
44
  new(
45
- id: hash.fetch('id'),
46
- name: hash.fetch('name'),
47
- description: hash['description'],
45
+ id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'id'), 'id'),
46
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
47
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
48
48
  category: hash['category'],
49
49
  meta: hash['_meta'],
50
50
  kind: ACP::Types::SessionConfigOption::Kind.from_h(hash)
@@ -22,7 +22,12 @@ class ACP::Types::SessionConfigOptionsCapabilities
22
22
  # @rbs return: ACP::Types::SessionConfigOptionsCapabilities
23
23
  def self.from_h(hash)
24
24
  new(
25
- boolean: hash['boolean']&.then { |value| ACP::Types::BooleanConfigOptionCapabilities.from_h(value) },
25
+ boolean: ACP::Types::Check.object(
26
+ hash['boolean'],
27
+ 'boolean',
28
+ ACP::Types::BooleanConfigOptionCapabilities,
29
+ allow_nil: true
30
+ ),
26
31
  meta: hash['_meta']
27
32
  )
28
33
  end
@@ -22,8 +22,12 @@ class ACP::Types::SessionConfigSelect
22
22
  # @rbs return: ACP::Types::SessionConfigSelect
23
23
  def self.from_h(hash)
24
24
  new(
25
- current_value: hash.fetch('currentValue'),
26
- options: ACP::Types::SessionConfigSelectOptions.from_a(hash.fetch('options'))
25
+ current_value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'currentValue'), 'currentValue'),
26
+ options: ACP::Types::Check.objects(
27
+ ACP::Types::Check.key(hash, 'options'),
28
+ 'options',
29
+ ACP::Types::SessionConfigSelectOptions
30
+ )
27
31
  )
28
32
  end
29
33
 
@@ -31,10 +31,13 @@ class ACP::Types::SessionConfigSelectGroup
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::SessionConfigSelectGroup
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::SessionConfigSelectOption)
36
+ end
34
37
  new(
35
- group: hash.fetch('group'),
36
- name: hash.fetch('name'),
37
- options: hash.fetch('options').map { |item| ACP::Types::SessionConfigSelectOption.from_h(item) },
38
+ group: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'group'), 'group'),
39
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
40
+ options:,
38
41
  meta: hash['_meta']
39
42
  )
40
43
  end
@@ -31,7 +31,12 @@ class ACP::Types::SessionConfigSelectOption
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::SessionConfigSelectOption
33
33
  def self.from_h(hash)
34
- new(value: hash.fetch('value'), name: hash.fetch('name'), description: hash['description'], meta: hash['_meta'])
34
+ new(
35
+ value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'value'), 'value'),
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]
@@ -12,9 +12,13 @@ module ACP::Types::SessionConfigSelectOptions
12
12
  # @rbs return: t
13
13
  def self.from_a(items)
14
14
  if items.all? { |item| item.key?('value') }
15
- items.map { |item| ACP::Types::SessionConfigSelectOption.from_h(item) } #: Array[ACP::Types::SessionConfigSelectOption]
15
+ items.each_with_index.map do |item, index|
16
+ ACP::Types::Check.object(item, [index], ACP::Types::SessionConfigSelectOption)
17
+ end #: Array[ACP::Types::SessionConfigSelectOption]
16
18
  elsif items.all? { |item| item.key?('group') }
17
- items.map { |item| ACP::Types::SessionConfigSelectGroup.from_h(item) } #: Array[ACP::Types::SessionConfigSelectGroup]
19
+ items.each_with_index.map do |item, index|
20
+ ACP::Types::Check.object(item, [index], ACP::Types::SessionConfigSelectGroup)
21
+ end #: Array[ACP::Types::SessionConfigSelectGroup]
18
22
  else
19
23
  items
20
24
  end
@@ -41,12 +41,19 @@ class ACP::Types::SessionInfo
41
41
  # @rbs hash: Hash[String, untyped]
42
42
  # @rbs return: ACP::Types::SessionInfo
43
43
  def self.from_h(hash)
44
+ additional_directories = ACP::Types::Check.array(
45
+ hash['additionalDirectories'],
46
+ 'additionalDirectories',
47
+ allow_nil: true
48
+ ) do |item, path|
49
+ ACP::Types::Check.string(item, path)
50
+ end
44
51
  new(
45
- session_id: hash.fetch('sessionId'),
46
- cwd: hash.fetch('cwd'),
47
- additional_directories: hash['additionalDirectories'],
48
- title: hash['title'],
49
- updated_at: hash['updatedAt'],
52
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
53
+ cwd: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'cwd'), 'cwd'),
54
+ additional_directories:,
55
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
56
+ updated_at: ACP::Types::Check.string(hash['updatedAt'], 'updatedAt', allow_nil: true),
50
57
  meta: hash['_meta']
51
58
  )
52
59
  end
@@ -26,7 +26,16 @@ class ACP::Types::SessionInfoUpdate
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::SessionInfoUpdate
28
28
  def self.from_h(hash)
29
- new(title: hash.fetch('title', :unset), updated_at: hash.fetch('updatedAt', :unset), meta: hash['_meta'])
29
+ new(
30
+ title: ACP::Types::Check.string(hash.fetch('title', :unset), 'title', allow_nil: true, allow_unset: true),
31
+ updated_at: ACP::Types::Check.string(
32
+ hash.fetch('updatedAt', :unset),
33
+ 'updatedAt',
34
+ allow_nil: true,
35
+ allow_unset: true
36
+ ),
37
+ meta: hash['_meta']
38
+ )
30
39
  end
31
40
 
32
41
  # @rbs return: Hash[String, untyped]
@@ -31,7 +31,12 @@ class ACP::Types::SessionMode
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::SessionMode
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]
@@ -26,9 +26,15 @@ class ACP::Types::SessionModeState
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::SessionModeState
28
28
  def self.from_h(hash)
29
+ available_modes = ACP::Types::Check.array(
30
+ ACP::Types::Check.key(hash, 'availableModes'),
31
+ 'availableModes'
32
+ ) do |item, path|
33
+ ACP::Types::Check.object(item, path, ACP::Types::SessionMode)
34
+ end
29
35
  new(
30
- current_mode_id: hash.fetch('currentModeId'),
31
- available_modes: hash.fetch('availableModes').map { |item| ACP::Types::SessionMode.from_h(item) },
36
+ current_mode_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'currentModeId'), 'currentModeId'),
37
+ available_modes:,
32
38
  meta: hash['_meta']
33
39
  )
34
40
  end
@@ -27,8 +27,8 @@ class ACP::Types::SessionNotification
27
27
  # @rbs return: ACP::Types::SessionNotification
28
28
  def self.from_h(hash)
29
29
  new(
30
- session_id: hash.fetch('sessionId'),
31
- update: ACP::Types::SessionUpdate.from_h(hash.fetch('update')),
30
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
31
+ update: ACP::Types::Check.object(ACP::Types::Check.key(hash, 'update'), 'update', ACP::Types::SessionUpdate),
32
32
  meta: hash['_meta']
33
33
  )
34
34
  end
@@ -27,8 +27,8 @@ class ACP::Types::SessionUpdate::AgentMessageChunk
27
27
  # @rbs return: ACP::Types::SessionUpdate::AgentMessageChunk
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
@@ -27,8 +27,8 @@ class ACP::Types::SessionUpdate::AgentThoughtChunk
27
27
  # @rbs return: ACP::Types::SessionUpdate::AgentThoughtChunk
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
@@ -21,10 +21,13 @@ class ACP::Types::SessionUpdate::AvailableCommandsUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SessionUpdate::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]
@@ -21,10 +21,13 @@ class ACP::Types::SessionUpdate::ConfigOptionUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SessionUpdate::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::SessionUpdate::CurrentModeUpdate
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SessionUpdate::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::SessionUpdate::Plan
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::SessionUpdate::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]
@@ -26,7 +26,16 @@ class ACP::Types::SessionUpdate::SessionInfoUpdate
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::SessionUpdate::SessionInfoUpdate
28
28
  def self.from_h(hash)
29
- new(title: hash.fetch('title', :unset), updated_at: hash.fetch('updatedAt', :unset), meta: hash['_meta'])
29
+ new(
30
+ title: ACP::Types::Check.string(hash.fetch('title', :unset), 'title', allow_nil: true, allow_unset: true),
31
+ updated_at: ACP::Types::Check.string(
32
+ hash.fetch('updatedAt', :unset),
33
+ 'updatedAt',
34
+ allow_nil: true,
35
+ allow_unset: true
36
+ ),
37
+ meta: hash['_meta']
38
+ )
30
39
  end
31
40
 
32
41
  # @rbs return: Hash[String, untyped]