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,16 +72,22 @@ class ACP::Types::ElicitationPropertySchema::StringPropertySchema
72
72
  # @rbs hash: Hash[String, untyped]
73
73
  # @rbs return: ACP::Types::ElicitationPropertySchema::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
@@ -16,7 +16,14 @@ class ACP::Types::ElicitationRequestScope
16
16
  # @rbs hash: Hash[String, untyped]
17
17
  # @rbs return: ACP::Types::ElicitationRequestScope
18
18
  def self.from_h(hash)
19
- new(request_id: hash.fetch('requestId'))
19
+ new(
20
+ request_id: ACP::Types::Check.one_of(
21
+ ACP::Types::Check.key(hash, 'requestId'),
22
+ 'requestId',
23
+ [Integer, String],
24
+ allow_nil: true
25
+ )
26
+ )
20
27
  end
21
28
 
22
29
  # @rbs return: Hash[String, untyped]
@@ -41,12 +41,18 @@ class ACP::Types::ElicitationSchema
41
41
  # @rbs hash: Hash[String, untyped]
42
42
  # @rbs return: ACP::Types::ElicitationSchema
43
43
  def self.from_h(hash)
44
+ properties = ACP::Types::Check.hash(hash['properties'], 'properties', allow_nil: true) do |value, path|
45
+ ACP::Types::Check.object(value, path, ACP::Types::ElicitationPropertySchema)
46
+ end
47
+ required = ACP::Types::Check.array(hash['required'], 'required', allow_nil: true) do |item, path|
48
+ ACP::Types::Check.string(item, path)
49
+ end
44
50
  new(
45
- type: hash['type'],
46
- title: hash['title'],
47
- properties: hash['properties']&.transform_values { |item| ACP::Types::ElicitationPropertySchema.from_h(item) },
48
- required: hash['required'],
49
- description: hash['description'],
51
+ type: ACP::Types::Check.enum(hash['type'], 'type', ['object'], allow_nil: true),
52
+ title: ACP::Types::Check.string(hash['title'], 'title', allow_nil: true),
53
+ properties:,
54
+ required:,
55
+ description: ACP::Types::Check.string(hash['description'], 'description', allow_nil: true),
50
56
  meta: hash['_meta']
51
57
  )
52
58
  end
@@ -21,7 +21,10 @@ class ACP::Types::ElicitationSessionScope
21
21
  # @rbs hash: Hash[String, untyped]
22
22
  # @rbs return: ACP::Types::ElicitationSessionScope
23
23
  def self.from_h(hash)
24
- new(session_id: hash.fetch('sessionId'), tool_call_id: hash['toolCallId'])
24
+ new(
25
+ session_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'sessionId'), 'sessionId'),
26
+ tool_call_id: ACP::Types::Check.string(hash['toolCallId'], 'toolCallId', allow_nil: true)
27
+ )
25
28
  end
26
29
 
27
30
  # @rbs return: Hash[String, untyped]
@@ -27,8 +27,8 @@ class ACP::Types::ElicitationUrlMode
27
27
  # @rbs return: ACP::Types::ElicitationUrlMode
28
28
  def self.from_h(hash)
29
29
  new(
30
- elicitation_id: hash.fetch('elicitationId'),
31
- url: hash.fetch('url'),
30
+ elicitation_id: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'elicitationId'), 'elicitationId'),
31
+ url: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'url'), 'url'),
32
32
  scope: ACP::Types::ElicitationUrlMode::Scope.from_h(hash)
33
33
  )
34
34
  end
@@ -27,8 +27,17 @@ class ACP::Types::EmbeddedResource
27
27
  # @rbs return: ACP::Types::EmbeddedResource
28
28
  def self.from_h(hash)
29
29
  new(
30
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
31
- resource: ACP::Types::EmbeddedResourceResource.from_h(hash.fetch('resource')),
30
+ annotations: ACP::Types::Check.object(
31
+ hash['annotations'],
32
+ 'annotations',
33
+ ACP::Types::Annotations,
34
+ allow_nil: true
35
+ ),
36
+ resource: ACP::Types::Check.object(
37
+ ACP::Types::Check.key(hash, 'resource'),
38
+ 'resource',
39
+ ACP::Types::EmbeddedResourceResource
40
+ ),
32
41
  meta: hash['_meta']
33
42
  )
34
43
  end
@@ -31,7 +31,12 @@ class ACP::Types::EnumOption
31
31
  # @rbs hash: Hash[String, untyped]
32
32
  # @rbs return: ACP::Types::EnumOption
33
33
  def self.from_h(hash)
34
- new(const: hash.fetch('const'), title: hash.fetch('title'), description: hash['description'], meta: hash['_meta'])
34
+ new(
35
+ const: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'const'), 'const'),
36
+ title: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'title'), 'title'),
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,7 +26,11 @@ class ACP::Types::EnvVariable
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::EnvVariable
28
28
  def self.from_h(hash)
29
- new(name: hash.fetch('name'), value: hash.fetch('value'), meta: hash['_meta'])
29
+ new(
30
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
31
+ value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'value'), 'value'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -26,7 +26,11 @@ class ACP::Types::FileSystemCapabilities
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::FileSystemCapabilities
28
28
  def self.from_h(hash)
29
- new(read_text_file: hash['readTextFile'], write_text_file: hash['writeTextFile'], meta: hash['_meta'])
29
+ new(
30
+ read_text_file: ACP::Types::Check.boolean(hash['readTextFile'], 'readTextFile', allow_nil: true),
31
+ write_text_file: ACP::Types::Check.boolean(hash['writeTextFile'], 'writeTextFile', 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::HttpHeader
26
26
  # @rbs hash: Hash[String, untyped]
27
27
  # @rbs return: ACP::Types::HttpHeader
28
28
  def self.from_h(hash)
29
- new(name: hash.fetch('name'), value: hash.fetch('value'), meta: hash['_meta'])
29
+ new(
30
+ name: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'name'), 'name'),
31
+ value: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'value'), 'value'),
32
+ meta: hash['_meta']
33
+ )
30
34
  end
31
35
 
32
36
  # @rbs return: Hash[String, untyped]
@@ -37,10 +37,15 @@ class ACP::Types::ImageContent
37
37
  # @rbs return: ACP::Types::ImageContent
38
38
  def self.from_h(hash)
39
39
  new(
40
- annotations: hash['annotations']&.then { |value| ACP::Types::Annotations.from_h(value) },
41
- data: hash.fetch('data'),
42
- mime_type: hash.fetch('mimeType'),
43
- uri: hash['uri'],
40
+ annotations: ACP::Types::Check.object(
41
+ hash['annotations'],
42
+ 'annotations',
43
+ ACP::Types::Annotations,
44
+ allow_nil: true
45
+ ),
46
+ data: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'data'), 'data'),
47
+ mime_type: ACP::Types::Check.string(ACP::Types::Check.key(hash, 'mimeType'), 'mimeType'),
48
+ uri: ACP::Types::Check.string(hash['uri'], 'uri', allow_nil: true),
44
49
  meta: hash['_meta']
45
50
  )
46
51
  end
@@ -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]