acp-sdk 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59dca9a568751a3b4c29c1ff4afdd9ad12e997689d5eb3a4782f2a4c5ced81b0
4
- data.tar.gz: 99bde6bbc81d16012a6d9b3654bf15f15a35a40713f3d6dbbe686557f182ac50
3
+ metadata.gz: f0121ff621c45deb5578a15051611ea98d8d174193528c3df214fe4e036561ff
4
+ data.tar.gz: e26701095772e5bbf41a18a8e2bc9f4ac9609657aae1dee7c82891de6cf5b48c
5
5
  SHA512:
6
- metadata.gz: f803ca1e9d3dae3b791cebe930d49c221b2cd3f68df6cc5734bc3e40103af0d101db4447851596c2f6834b855f08a110c24455b06c517aa62e51b95a23cbdfd2
7
- data.tar.gz: 844f53d23060359a77314f196fdeab023a7ded7c67fdea9f1a75b80bb28db3efb2421977001c13b3ec37f84479f6b9bf816e53a4a8da92c89bc58ee211b88ab8
6
+ metadata.gz: 66f390b3cf58c661064fe12ca5c7bbf04f560a81187f8cd37cce6d820870eb9f83717b655d04305a9a926e3cc08af618c1956acb7c2425899d2d3238e05d2651
7
+ data.tar.gz: 13853bc47c5c15a249296d9418fb951f52d512fea28f92fe9bf601c1a3e43d98840cbbbbfc181ff53150572db0393388553bf27f3c1746ca135f0467905d4270
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.0](https://github.com/bottrall/acp-sdk/compare/v0.3.0...v0.4.0) (2026-10-02)
4
+
5
+
6
+ ### Features
7
+
8
+ * bump the vendored schema to v1.24.1 ([#58](https://github.com/bottrall/acp-sdk/issues/58)) ([56d8505](https://github.com/bottrall/acp-sdk/commit/56d85057a1c34f1a089580a78b7b66973c92a9e8))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * return a RequestError for malformed peer responses ([#57](https://github.com/bottrall/acp-sdk/issues/57)) ([e52d479](https://github.com/bottrall/acp-sdk/commit/e52d479ce8cd6de37f753e7580d5562f1ace2d7d)), closes [#27](https://github.com/bottrall/acp-sdk/issues/27)
14
+ * route logout on ACP::AgentConnection ([#55](https://github.com/bottrall/acp-sdk/issues/55)) ([3b2b144](https://github.com/bottrall/acp-sdk/commit/3b2b1444c502380a058231884c66efe26bb3770a)), closes [#26](https://github.com/bottrall/acp-sdk/issues/26)
15
+
3
16
  ## [0.3.0](https://github.com/bottrall/acp-sdk/compare/v0.2.0...v0.3.0) (2026-10-02)
4
17
 
5
18
 
data/README.md CHANGED
@@ -48,7 +48,7 @@ connection.start.join
48
48
 
49
49
  The agent's contract:
50
50
 
51
- - It defines `new_session`, `prompt` and `cancel`. `load_session`, `list_sessions`, `resume_session`, `close_session` and `delete_session` are required only when `capabilities` advertises `load_session` or `session_capabilities.list`, `.resume`, `.close` or `.delete`, and `authenticate` only when `auth_methods` is non-empty; `start` raises `ArgumentError` when one is advertised but missing, and a method that is not advertised is answered with `-32601`. `change_session_mode` and `change_session_config_option` are optional, since modes and config options are offered per session rather than in `initialize`; `session/set_mode` and `session/set_config_option` are answered with `-32601` when the agent does not define them. `session_created`, if defined, runs right after the `session/new` reply is sent.
51
+ - It defines `new_session`, `prompt` and `cancel`. `load_session`, `list_sessions`, `resume_session`, `close_session` and `delete_session` are required only when `capabilities` advertises `load_session` or `session_capabilities.list`, `.resume`, `.close` or `.delete`, and `authenticate` only when `auth_methods` is non-empty, and `logout` only when `capabilities` advertises `auth.logout`; `start` raises `ArgumentError` when one is advertised but missing, and a method that is not advertised is answered with `-32601`. `change_session_mode` and `change_session_config_option` are optional, since modes and config options are offered per session rather than in `initialize`; `session/set_mode` and `session/set_config_option` are answered with `-32601` when the agent does not define them. `session_created`, if defined, runs right after the `session/new` reply is sent.
52
52
  - Each request method returns its response type or an `ACP::RequestError`, which is sent as the error reply. Params that do not match the schema are answered with `-32602` before the agent sees them.
53
53
  - `cancel` runs on the transport's reader thread, so it must return quickly: set a flag and let the prompt notice it.
54
54
  - After a cancel, the agent must itself end the turn with `stopReason: cancelled`. `ACP::AgentConnection` does not enforce it.
@@ -93,6 +93,8 @@ class ACP::AgentConnection::Client
93
93
  return result if result.is_a?(ACP::RequestError)
94
94
 
95
95
  type.from_h(result)
96
+ rescue KeyError, TypeError, NoMethodError
97
+ ACP::RequestError.invalid_response(result)
96
98
  end
97
99
 
98
100
  # @rbs rpc_method: String
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ACP::AgentConnection::OptionalMethod::Logout
4
+ extend self
5
+
6
+ # @rbs return: String
7
+ def rpc_method
8
+ 'logout'
9
+ end
10
+
11
+ # @rbs return: Symbol
12
+ def agent_method
13
+ :logout
14
+ end
15
+
16
+ # @rbs initialize_response: ACP::Types::InitializeResponse
17
+ # @rbs return: bool
18
+ def advertised?(initialize_response)
19
+ initialize_response.agent_capabilities&.auth&.logout ? true : false
20
+ end
21
+ end
@@ -12,7 +12,8 @@ class ACP::AgentConnection
12
12
  ACP::AgentConnection::OptionalMethod::Authenticate,
13
13
  ACP::AgentConnection::OptionalMethod::ResumeSession,
14
14
  ACP::AgentConnection::OptionalMethod::CloseSession,
15
- ACP::AgentConnection::OptionalMethod::DeleteSession
15
+ ACP::AgentConnection::OptionalMethod::DeleteSession,
16
+ ACP::AgentConnection::OptionalMethod::Logout
16
17
  ].freeze #: Array[ACP::AgentConnection::_OptionalMethod]
17
18
  # The schema has no initialize capability for modes or config options: an
18
19
  # agent offers them per session, in its session responses, so they are
@@ -70,6 +71,7 @@ class ACP::AgentConnection
70
71
  'session/resume' => route(ACP::Types::ResumeSessionRequest) { |request| full.resume_session(request) },
71
72
  'session/close' => route(ACP::Types::CloseSessionRequest) { |request| full.close_session(request) },
72
73
  'session/delete' => route(ACP::Types::DeleteSessionRequest) { |request| full.delete_session(request) },
74
+ 'logout' => route(ACP::Types::LogoutRequest) { |request| full.logout(request) },
73
75
  'session/set_mode' => route(ACP::Types::SetSessionModeRequest) { |request| full.change_session_mode(request) },
74
76
  'session/set_config_option' => route(ACP::Types::SetSessionConfigOptionRequest) do |request|
75
77
  full.change_session_config_option(request)
@@ -79,6 +79,8 @@ class ACP::ClientConnection
79
79
  return result if result.is_a?(ACP::RequestError)
80
80
 
81
81
  type.from_h(result)
82
+ rescue KeyError, TypeError, NoMethodError
83
+ ACP::RequestError.invalid_response(result)
82
84
  end
83
85
 
84
86
  # The request waits on its own thread so the caller's thread can yield each
@@ -63,6 +63,15 @@ class ACP::RequestError
63
63
  new(code: INTERNAL_ERROR, message: 'Internal error')
64
64
  end
65
65
 
66
+ # The message tells a malformed peer reply apart from an internal error a
67
+ # handler raised, though both use the -32603 code.
68
+ #
69
+ # @rbs response: untyped
70
+ # @rbs return: ACP::RequestError
71
+ def self.invalid_response(response)
72
+ new(code: INTERNAL_ERROR, message: 'Invalid response', data: response)
73
+ end
74
+
66
75
  # @rbs return: ACP::RequestError
67
76
  def self.request_cancelled
68
77
  new(code: REQUEST_CANCELLED, message: 'Request cancelled')
@@ -9,6 +9,9 @@ class ACP::Types::SessionUpdate::ToolCall
9
9
  # @dynamic title
10
10
  attr_reader :title #: String
11
11
 
12
+ # @dynamic name
13
+ attr_reader :name #: String?
14
+
12
15
  # @dynamic kind
13
16
  attr_reader :kind #: String?
14
17
 
@@ -32,6 +35,7 @@ class ACP::Types::SessionUpdate::ToolCall
32
35
 
33
36
  # @rbs tool_call_id: String
34
37
  # @rbs title: String
38
+ # @rbs name: String?
35
39
  # @rbs kind: String?
36
40
  # @rbs status: String?
37
41
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
@@ -43,6 +47,7 @@ class ACP::Types::SessionUpdate::ToolCall
43
47
  def initialize(
44
48
  tool_call_id:,
45
49
  title:,
50
+ name: nil,
46
51
  kind: nil,
47
52
  status: nil,
48
53
  content: nil,
@@ -53,6 +58,7 @@ class ACP::Types::SessionUpdate::ToolCall
53
58
  )
54
59
  @tool_call_id = tool_call_id
55
60
  @title = title
61
+ @name = name
56
62
  @kind = kind
57
63
  @status = status
58
64
  @content = content
@@ -69,6 +75,7 @@ class ACP::Types::SessionUpdate::ToolCall
69
75
  new(
70
76
  tool_call_id: hash.fetch('toolCallId'),
71
77
  title: hash.fetch('title'),
78
+ name: hash['name'],
72
79
  kind: hash['kind'],
73
80
  status: hash['status'],
74
81
  content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
@@ -85,6 +92,7 @@ class ACP::Types::SessionUpdate::ToolCall
85
92
  'sessionUpdate' => 'tool_call',
86
93
  'toolCallId' => tool_call_id,
87
94
  'title' => title,
95
+ 'name' => name,
88
96
  'kind' => kind,
89
97
  'status' => status,
90
98
  'content' => content&.map(&:to_h),
@@ -15,6 +15,9 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
15
15
  # @dynamic title
16
16
  attr_reader :title #: String?
17
17
 
18
+ # @dynamic name
19
+ attr_reader :name #: String?
20
+
18
21
  # @dynamic content
19
22
  attr_reader :content #: Array[ACP::Types::ToolCallContent::t]?
20
23
 
@@ -34,6 +37,7 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
34
37
  # @rbs kind: String?
35
38
  # @rbs status: String?
36
39
  # @rbs title: String?
40
+ # @rbs name: String?
37
41
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
38
42
  # @rbs locations: Array[ACP::Types::ToolCallLocation]?
39
43
  # @rbs raw_input: untyped
@@ -45,6 +49,7 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
45
49
  kind: nil,
46
50
  status: nil,
47
51
  title: nil,
52
+ name: nil,
48
53
  content: nil,
49
54
  locations: nil,
50
55
  raw_input: nil,
@@ -55,6 +60,7 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
55
60
  @kind = kind
56
61
  @status = status
57
62
  @title = title
63
+ @name = name
58
64
  @content = content
59
65
  @locations = locations
60
66
  @raw_input = raw_input
@@ -71,6 +77,7 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
71
77
  kind: hash['kind'],
72
78
  status: hash['status'],
73
79
  title: hash['title'],
80
+ name: hash['name'],
74
81
  content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
75
82
  locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
76
83
  raw_input: hash['rawInput'],
@@ -87,6 +94,7 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
87
94
  'kind' => kind,
88
95
  'status' => status,
89
96
  'title' => title,
97
+ 'name' => name,
90
98
  'content' => content&.map(&:to_h),
91
99
  'locations' => locations&.map(&:to_h),
92
100
  'rawInput' => raw_input,
@@ -9,6 +9,9 @@ class ACP::Types::ToolCall
9
9
  # @dynamic title
10
10
  attr_reader :title #: String
11
11
 
12
+ # @dynamic name
13
+ attr_reader :name #: String?
14
+
12
15
  # @dynamic kind
13
16
  attr_reader :kind #: String?
14
17
 
@@ -32,6 +35,7 @@ class ACP::Types::ToolCall
32
35
 
33
36
  # @rbs tool_call_id: String
34
37
  # @rbs title: String
38
+ # @rbs name: String?
35
39
  # @rbs kind: String?
36
40
  # @rbs status: String?
37
41
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
@@ -43,6 +47,7 @@ class ACP::Types::ToolCall
43
47
  def initialize(
44
48
  tool_call_id:,
45
49
  title:,
50
+ name: nil,
46
51
  kind: nil,
47
52
  status: nil,
48
53
  content: nil,
@@ -53,6 +58,7 @@ class ACP::Types::ToolCall
53
58
  )
54
59
  @tool_call_id = tool_call_id
55
60
  @title = title
61
+ @name = name
56
62
  @kind = kind
57
63
  @status = status
58
64
  @content = content
@@ -69,6 +75,7 @@ class ACP::Types::ToolCall
69
75
  new(
70
76
  tool_call_id: hash.fetch('toolCallId'),
71
77
  title: hash.fetch('title'),
78
+ name: hash['name'],
72
79
  kind: hash['kind'],
73
80
  status: hash['status'],
74
81
  content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
@@ -84,6 +91,7 @@ class ACP::Types::ToolCall
84
91
  {
85
92
  'toolCallId' => tool_call_id,
86
93
  'title' => title,
94
+ 'name' => name,
87
95
  'kind' => kind,
88
96
  'status' => status,
89
97
  'content' => content&.map(&:to_h),
@@ -15,6 +15,9 @@ class ACP::Types::ToolCallUpdate
15
15
  # @dynamic title
16
16
  attr_reader :title #: String?
17
17
 
18
+ # @dynamic name
19
+ attr_reader :name #: String?
20
+
18
21
  # @dynamic content
19
22
  attr_reader :content #: Array[ACP::Types::ToolCallContent::t]?
20
23
 
@@ -34,6 +37,7 @@ class ACP::Types::ToolCallUpdate
34
37
  # @rbs kind: String?
35
38
  # @rbs status: String?
36
39
  # @rbs title: String?
40
+ # @rbs name: String?
37
41
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
38
42
  # @rbs locations: Array[ACP::Types::ToolCallLocation]?
39
43
  # @rbs raw_input: untyped
@@ -45,6 +49,7 @@ class ACP::Types::ToolCallUpdate
45
49
  kind: nil,
46
50
  status: nil,
47
51
  title: nil,
52
+ name: nil,
48
53
  content: nil,
49
54
  locations: nil,
50
55
  raw_input: nil,
@@ -55,6 +60,7 @@ class ACP::Types::ToolCallUpdate
55
60
  @kind = kind
56
61
  @status = status
57
62
  @title = title
63
+ @name = name
58
64
  @content = content
59
65
  @locations = locations
60
66
  @raw_input = raw_input
@@ -71,6 +77,7 @@ class ACP::Types::ToolCallUpdate
71
77
  kind: hash['kind'],
72
78
  status: hash['status'],
73
79
  title: hash['title'],
80
+ name: hash['name'],
74
81
  content: hash['content']&.map { |item| ACP::Types::ToolCallContent.from_h(item) },
75
82
  locations: hash['locations']&.map { |item| ACP::Types::ToolCallLocation.from_h(item) },
76
83
  raw_input: hash['rawInput'],
@@ -86,6 +93,7 @@ class ACP::Types::ToolCallUpdate
86
93
  'kind' => kind,
87
94
  'status' => status,
88
95
  'title' => title,
96
+ 'name' => name,
89
97
  'content' => content&.map(&:to_h),
90
98
  'locations' => locations&.map(&:to_h),
91
99
  'rawInput' => raw_input,
data/lib/acp/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ACP
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -0,0 +1,13 @@
1
+ # Generated from lib/acp/agent_connection/optional_method/logout.rb with RBS::Inline
2
+
3
+ module ACP::AgentConnection::OptionalMethod::Logout
4
+ # @rbs return: String
5
+ def rpc_method: () -> String
6
+
7
+ # @rbs return: Symbol
8
+ def agent_method: () -> Symbol
9
+
10
+ # @rbs initialize_response: ACP::Types::InitializeResponse
11
+ # @rbs return: bool
12
+ def advertised?: (ACP::Types::InitializeResponse initialize_response) -> bool
13
+ end
@@ -53,6 +53,13 @@ class ACP::RequestError
53
53
  # @rbs return: ACP::RequestError
54
54
  def self.internal_error: () -> ACP::RequestError
55
55
 
56
+ # The message tells a malformed peer reply apart from an internal error a
57
+ # handler raised, though both use the -32603 code.
58
+ #
59
+ # @rbs response: untyped
60
+ # @rbs return: ACP::RequestError
61
+ def self.invalid_response: (untyped response) -> ACP::RequestError
62
+
56
63
  # @rbs return: ACP::RequestError
57
64
  def self.request_cancelled: () -> ACP::RequestError
58
65
 
@@ -7,6 +7,9 @@ class ACP::Types::SessionUpdate::ToolCall
7
7
  # @dynamic title
8
8
  attr_reader title: String
9
9
 
10
+ # @dynamic name
11
+ attr_reader name: String?
12
+
10
13
  # @dynamic kind
11
14
  attr_reader kind: String?
12
15
 
@@ -30,6 +33,7 @@ class ACP::Types::SessionUpdate::ToolCall
30
33
 
31
34
  # @rbs tool_call_id: String
32
35
  # @rbs title: String
36
+ # @rbs name: String?
33
37
  # @rbs kind: String?
34
38
  # @rbs status: String?
35
39
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
@@ -38,7 +42,7 @@ class ACP::Types::SessionUpdate::ToolCall
38
42
  # @rbs raw_output: untyped
39
43
  # @rbs meta: Hash[String, untyped]?
40
44
  # @rbs return: void
41
- def initialize: (tool_call_id: String, title: String, ?kind: String?, ?status: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
45
+ def initialize: (tool_call_id: String, title: String, ?name: String?, ?kind: String?, ?status: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
42
46
 
43
47
  # @rbs hash: Hash[String, untyped]
44
48
  # @rbs return: ACP::Types::SessionUpdate::ToolCall
@@ -13,6 +13,9 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
13
13
  # @dynamic title
14
14
  attr_reader title: String?
15
15
 
16
+ # @dynamic name
17
+ attr_reader name: String?
18
+
16
19
  # @dynamic content
17
20
  attr_reader content: Array[ACP::Types::ToolCallContent::t]?
18
21
 
@@ -32,13 +35,14 @@ class ACP::Types::SessionUpdate::ToolCallUpdate
32
35
  # @rbs kind: String?
33
36
  # @rbs status: String?
34
37
  # @rbs title: String?
38
+ # @rbs name: String?
35
39
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
36
40
  # @rbs locations: Array[ACP::Types::ToolCallLocation]?
37
41
  # @rbs raw_input: untyped
38
42
  # @rbs raw_output: untyped
39
43
  # @rbs meta: Hash[String, untyped]?
40
44
  # @rbs return: void
41
- def initialize: (tool_call_id: String, ?kind: String?, ?status: String?, ?title: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
45
+ def initialize: (tool_call_id: String, ?kind: String?, ?status: String?, ?title: String?, ?name: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
42
46
 
43
47
  # @rbs hash: Hash[String, untyped]
44
48
  # @rbs return: ACP::Types::SessionUpdate::ToolCallUpdate
@@ -7,6 +7,9 @@ class ACP::Types::ToolCall
7
7
  # @dynamic title
8
8
  attr_reader title: String
9
9
 
10
+ # @dynamic name
11
+ attr_reader name: String?
12
+
10
13
  # @dynamic kind
11
14
  attr_reader kind: String?
12
15
 
@@ -30,6 +33,7 @@ class ACP::Types::ToolCall
30
33
 
31
34
  # @rbs tool_call_id: String
32
35
  # @rbs title: String
36
+ # @rbs name: String?
33
37
  # @rbs kind: String?
34
38
  # @rbs status: String?
35
39
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
@@ -38,7 +42,7 @@ class ACP::Types::ToolCall
38
42
  # @rbs raw_output: untyped
39
43
  # @rbs meta: Hash[String, untyped]?
40
44
  # @rbs return: void
41
- def initialize: (tool_call_id: String, title: String, ?kind: String?, ?status: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
45
+ def initialize: (tool_call_id: String, title: String, ?name: String?, ?kind: String?, ?status: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
42
46
 
43
47
  # @rbs hash: Hash[String, untyped]
44
48
  # @rbs return: ACP::Types::ToolCall
@@ -13,6 +13,9 @@ class ACP::Types::ToolCallUpdate
13
13
  # @dynamic title
14
14
  attr_reader title: String?
15
15
 
16
+ # @dynamic name
17
+ attr_reader name: String?
18
+
16
19
  # @dynamic content
17
20
  attr_reader content: Array[ACP::Types::ToolCallContent::t]?
18
21
 
@@ -32,13 +35,14 @@ class ACP::Types::ToolCallUpdate
32
35
  # @rbs kind: String?
33
36
  # @rbs status: String?
34
37
  # @rbs title: String?
38
+ # @rbs name: String?
35
39
  # @rbs content: Array[ACP::Types::ToolCallContent::t]?
36
40
  # @rbs locations: Array[ACP::Types::ToolCallLocation]?
37
41
  # @rbs raw_input: untyped
38
42
  # @rbs raw_output: untyped
39
43
  # @rbs meta: Hash[String, untyped]?
40
44
  # @rbs return: void
41
- def initialize: (tool_call_id: String, ?kind: String?, ?status: String?, ?title: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
45
+ def initialize: (tool_call_id: String, ?kind: String?, ?status: String?, ?title: String?, ?name: String?, ?content: Array[ACP::Types::ToolCallContent::t]?, ?locations: Array[ACP::Types::ToolCallLocation]?, ?raw_input: untyped, ?raw_output: untyped, ?meta: Hash[String, untyped]?) -> void
42
46
 
43
47
  # @rbs hash: Hash[String, untyped]
44
48
  # @rbs return: ACP::Types::ToolCallUpdate
@@ -0,0 +1,6 @@
1
+ # rbs-inline does not emit `extend self`, so without this reopen the module's
2
+ # methods aren't visible as singleton methods.
3
+
4
+ module ACP::AgentConnection::OptionalMethod::Logout
5
+ extend ::ACP::AgentConnection::OptionalMethod::Logout
6
+ end
@@ -32,6 +32,10 @@ class ACP::AgentConnection
32
32
  def delete_session: (ACP::Types::DeleteSessionRequest) -> (ACP::Types::DeleteSessionResponse | ACP::RequestError)
33
33
  end
34
34
 
35
+ interface _Logout
36
+ def logout: (ACP::Types::LogoutRequest) -> (ACP::Types::LogoutResponse | ACP::RequestError)
37
+ end
38
+
35
39
  interface _ChangeSessionMode
36
40
  def change_session_mode: (ACP::Types::SetSessionModeRequest) -> (ACP::Types::SetSessionModeResponse | ACP::RequestError)
37
41
  end
@@ -48,6 +52,7 @@ class ACP::AgentConnection
48
52
  include _ResumeSession
49
53
  include _CloseSession
50
54
  include _DeleteSession
55
+ include _Logout
51
56
  include _ChangeSessionMode
52
57
  include _ChangeSessionConfigOption
53
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acp-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -40,6 +40,7 @@ files:
40
40
  - lib/acp/agent_connection/optional_method/delete_session.rb
41
41
  - lib/acp/agent_connection/optional_method/list_sessions.rb
42
42
  - lib/acp/agent_connection/optional_method/load_session.rb
43
+ - lib/acp/agent_connection/optional_method/logout.rb
43
44
  - lib/acp/agent_connection/optional_method/resume_session.rb
44
45
  - lib/acp/agent_process.rb
45
46
  - lib/acp/client_connection.rb
@@ -253,6 +254,7 @@ files:
253
254
  - sig/generated/acp/agent_connection/optional_method/delete_session.rbs
254
255
  - sig/generated/acp/agent_connection/optional_method/list_sessions.rbs
255
256
  - sig/generated/acp/agent_connection/optional_method/load_session.rbs
257
+ - sig/generated/acp/agent_connection/optional_method/logout.rbs
256
258
  - sig/generated/acp/agent_connection/optional_method/resume_session.rbs
257
259
  - sig/generated/acp/agent_process.rbs
258
260
  - sig/generated/acp/client_connection.rbs
@@ -464,6 +466,7 @@ files:
464
466
  - sig/manual/acp/agent_connection/optional_method/delete_session.rbs
465
467
  - sig/manual/acp/agent_connection/optional_method/list_sessions.rbs
466
468
  - sig/manual/acp/agent_connection/optional_method/load_session.rbs
469
+ - sig/manual/acp/agent_connection/optional_method/logout.rbs
467
470
  - sig/manual/acp/agent_connection/optional_method/resume_session.rbs
468
471
  - sig/manual/acp/agent_process.rbs
469
472
  - sig/manual/acp/client_connection.rbs