acp-sdk 0.1.0 → 0.3.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +66 -41
  4. data/lib/acp/agent_connection/client.rb +82 -3
  5. data/lib/acp/agent_connection/optional_method/authenticate.rb +21 -0
  6. data/lib/acp/agent_connection/optional_method/close_session.rb +21 -0
  7. data/lib/acp/agent_connection/optional_method/delete_session.rb +21 -0
  8. data/lib/acp/agent_connection/optional_method/list_sessions.rb +21 -0
  9. data/lib/acp/agent_connection/optional_method/load_session.rb +21 -0
  10. data/lib/acp/agent_connection/optional_method/resume_session.rb +21 -0
  11. data/lib/acp/agent_connection/optional_method.rb +1 -25
  12. data/lib/acp/agent_connection.rb +47 -47
  13. data/lib/acp/agent_process.rb +119 -0
  14. data/lib/acp/client_connection.rb +13 -15
  15. data/lib/acp/request_error.rb +81 -0
  16. data/lib/acp/transport/reply.rb +4 -4
  17. data/lib/acp/transport/stdio.rb +28 -25
  18. data/lib/acp/types.rb +4 -0
  19. data/lib/acp/version.rb +1 -1
  20. data/sig/generated/acp/agent_connection/client.rbs +51 -2
  21. data/sig/generated/acp/agent_connection/optional_method/authenticate.rbs +13 -0
  22. data/sig/generated/acp/agent_connection/optional_method/close_session.rbs +13 -0
  23. data/sig/generated/acp/agent_connection/optional_method/delete_session.rbs +13 -0
  24. data/sig/generated/acp/agent_connection/optional_method/list_sessions.rbs +13 -0
  25. data/sig/generated/acp/agent_connection/optional_method/load_session.rbs +13 -0
  26. data/sig/generated/acp/agent_connection/optional_method/resume_session.rbs +13 -0
  27. data/sig/generated/acp/agent_connection/optional_method.rbs +1 -18
  28. data/sig/generated/acp/agent_connection.rbs +17 -22
  29. data/sig/generated/acp/agent_process.rbs +72 -0
  30. data/sig/generated/acp/client_connection.rbs +16 -16
  31. data/sig/generated/acp/request_error.rbs +65 -0
  32. data/sig/generated/acp/transport/reply.rbs +5 -5
  33. data/sig/generated/acp/transport/stdio.rbs +14 -19
  34. data/sig/generated/acp/types.rbs +4 -0
  35. data/sig/manual/acp/agent_connection/optional_method/authenticate.rbs +6 -0
  36. data/sig/manual/acp/agent_connection/optional_method/close_session.rbs +6 -0
  37. data/sig/manual/acp/agent_connection/optional_method/delete_session.rbs +6 -0
  38. data/sig/manual/acp/agent_connection/optional_method/list_sessions.rbs +6 -0
  39. data/sig/manual/acp/agent_connection/optional_method/load_session.rbs +6 -0
  40. data/sig/manual/acp/agent_connection/optional_method/resume_session.rbs +6 -0
  41. data/sig/manual/acp/agent_connection.rbs +55 -6
  42. data/sig/manual/acp/agent_process.rbs +7 -0
  43. data/sig/manual/acp/client_connection.rbs +1 -1
  44. data/sig/manual/acp/transport/stdio.rbs +7 -1
  45. metadata +26 -8
  46. data/lib/acp/transport/response_error.rb +0 -28
  47. data/lib/acp/transport/result.rb +0 -35
  48. data/sig/generated/acp/transport/response_error.rbs +0 -21
  49. data/sig/generated/acp/transport/result.rbs +0 -25
  50. data/sig/manual/acp/types.rbs +0 -2
@@ -1,21 +1,20 @@
1
1
  # Generated from lib/acp/agent_connection.rb with RBS::Inline
2
2
 
3
3
  class ACP::AgentConnection
4
- @factory: ^(ACP::AgentConnection::Client) -> ACP::AgentConnection::_Agent
5
-
6
- @auth_methods: Array[ACP::Types::AuthMethod::t]
7
-
8
- @agent_info: ACP::Types::Implementation?
4
+ @transport: ACP::AgentConnection::_Transport
9
5
 
10
- @capabilities: ACP::Types::AgentCapabilities
6
+ @initialize_response: ACP::Types::InitializeResponse
11
7
 
12
- @transport: ACP::AgentConnection::_Transport
8
+ @factory: ^(ACP::AgentConnection::Client) -> ACP::AgentConnection::_Agent
13
9
 
14
10
  PROTOCOL_VERSION: Integer
15
11
 
16
- INVALID_PARAMS: ACP::Transport::ResponseError
12
+ OPTIONAL: Array[ACP::AgentConnection::_OptionalMethod]
17
13
 
18
- OPTIONAL: Array[ACP::AgentConnection::OptionalMethod]
14
+ # The schema has no initialize capability for modes or config options: an
15
+ # agent offers them per session, in its session responses, so they are
16
+ # routed whenever the agent defines them.
17
+ PER_SESSION: Hash[String, Symbol]
19
18
 
20
19
  # @rbs transport: ACP::AgentConnection::_Transport
21
20
  # @rbs capabilities: ACP::Types::AgentCapabilities
@@ -32,8 +31,8 @@ class ACP::AgentConnection
32
31
 
33
32
  # @rbs agent: ACP::AgentConnection::_Agent
34
33
  # @rbs client: ACP::AgentConnection::Client
35
- # @rbs return: Hash[String, ^(untyped) -> (ACP::Transport::Result | ACP::Transport::Reply)]
36
- def requests: (ACP::AgentConnection::_Agent agent, ACP::AgentConnection::Client client) -> Hash[String, ^(untyped) -> (ACP::Transport::Result | ACP::Transport::Reply)]
34
+ # @rbs return: Hash[String, ^(untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply)]
35
+ def requests: (ACP::AgentConnection::_Agent agent, ACP::AgentConnection::Client client) -> Hash[String, ^(untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply)]
37
36
 
38
37
  # @rbs agent: ACP::AgentConnection::_Agent
39
38
  # @rbs return: Hash[String, ^(untyped) -> void]
@@ -42,24 +41,20 @@ class ACP::AgentConnection
42
41
  # Generated from_h raises on a missing key or a value of the wrong shape.
43
42
  #
44
43
  # @rbs type: ACP::AgentConnection::_Parser
45
- # @rbs &handle: (untyped) -> (ACP::Transport::Result | ACP::Transport::Reply)
46
- # @rbs return: ^(untyped) -> (ACP::Transport::Result | ACP::Transport::Reply)
47
- def route: (ACP::AgentConnection::_Parser type) { (untyped) -> (ACP::Transport::Result | ACP::Transport::Reply) } -> ^(untyped) -> (ACP::Transport::Result | ACP::Transport::Reply)
48
-
49
- # @rbs response: ACP::AgentConnection::_Response | ACP::Transport::ResponseError
50
- # @rbs return: ACP::Transport::Result
51
- def respond: (ACP::AgentConnection::_Response | ACP::Transport::ResponseError response) -> ACP::Transport::Result
44
+ # @rbs &handle: (untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply)
45
+ # @rbs return: ^(untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply)
46
+ def route: (ACP::AgentConnection::_Parser type) { (untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply) } -> ^(untyped) -> (ACP::AgentConnection::_Response | ACP::RequestError | ACP::Transport::Reply)
52
47
 
53
48
  # @rbs client: ACP::AgentConnection::Client
54
49
  # @rbs request: ACP::Types::InitializeRequest
55
- # @rbs return: ACP::Transport::Result
56
- def connect: (ACP::AgentConnection::Client client, ACP::Types::InitializeRequest request) -> ACP::Transport::Result
50
+ # @rbs return: ACP::Types::InitializeResponse
51
+ def connect: (ACP::AgentConnection::Client client, ACP::Types::InitializeRequest request) -> ACP::Types::InitializeResponse
57
52
 
58
53
  # session_created runs after the reply because the client must know the
59
54
  # session id before updates for it (e.g. available commands) arrive.
60
55
  #
61
56
  # @rbs agent: ACP::AgentConnection::_Agent
62
57
  # @rbs request: ACP::Types::NewSessionRequest
63
- # @rbs return: ACP::Transport::Result | ACP::Transport::Reply
64
- def new_session: (ACP::AgentConnection::_Agent agent, ACP::Types::NewSessionRequest request) -> (ACP::Transport::Result | ACP::Transport::Reply)
58
+ # @rbs return: (ACP::Types::NewSessionResponse | ACP::RequestError | ACP::Transport::Reply)
59
+ def new_session: (ACP::AgentConnection::_Agent agent, ACP::Types::NewSessionRequest request) -> (ACP::Types::NewSessionResponse | ACP::RequestError | ACP::Transport::Reply)
65
60
  end
@@ -0,0 +1,72 @@
1
+ # Generated from lib/acp/agent_process.rb with RBS::Inline
2
+
3
+ # A child agent process and the ACP::ClientConnection wired to its stdio.
4
+ # Spawn one with ACP::AgentProcess.spawn.
5
+ class ACP::AgentProcess
6
+ @stderr: String?
7
+
8
+ @err_reader: Thread?
9
+
10
+ @err_r: IO?
11
+
12
+ @waiter: Process::Waiter
13
+
14
+ @stdout: IO
15
+
16
+ @stdin: IO
17
+
18
+ @pid: Integer
19
+
20
+ @reader: Thread
21
+
22
+ @connection: ACP::ClientConnection
23
+
24
+ # @dynamic pid
25
+ attr_reader pid: Integer
26
+
27
+ # @dynamic connection
28
+ attr_reader connection: ACP::ClientConnection
29
+
30
+ # Child stderr captured when spawn was given stderr: :capture, else nil.
31
+ #
32
+ # @dynamic stderr
33
+ attr_reader stderr: String?
34
+
35
+ # Starts a command with args, env and cwd, wires its stdio to a new
36
+ # ACP::ClientConnection and starts it. With a block, yields the connection
37
+ # and this process, then terminates the child when the block exits; without
38
+ # one, returns the process and terminate is the caller's job.
39
+ #
40
+ # @rbs command: String
41
+ # @rbs *args: String
42
+ # @rbs env: Hash[String, String]?
43
+ # @rbs cwd: String?
44
+ # @rbs stderr: (:inherit | :capture)
45
+ # @rbs permission: ACP::ClientConnection::_PermissionHandler
46
+ # @rbs updates: ACP::ClientConnection::_UpdateHandler
47
+ # @rbs &block: ? (ACP::ClientConnection, ACP::AgentProcess) -> untyped
48
+ # @rbs return: (untyped | ACP::AgentProcess)
49
+ def self.spawn: (String command, *String args, permission: ACP::ClientConnection::_PermissionHandler, ?env: Hash[String, String]?, ?cwd: String?, ?stderr: :inherit | :capture, ?updates: ACP::ClientConnection::_UpdateHandler) ?{ (ACP::ClientConnection, ACP::AgentProcess) -> untyped } -> (untyped | ACP::AgentProcess)
50
+
51
+ # Closes stdin, waits for the child to exit — sending TERM and then KILL if
52
+ # it will not — and joins the transport reader before closing the pipe it
53
+ # reads.
54
+ #
55
+ # @rbs return: void
56
+ def terminate: () -> void
57
+
58
+ private
59
+
60
+ # @rbs connection: ACP::ClientConnection
61
+ # @rbs reader: Thread
62
+ # @rbs stdin: IO
63
+ # @rbs stdout: IO
64
+ # @rbs waiter: Process::Waiter
65
+ # @rbs err_r: IO?
66
+ # @rbs return: void
67
+ def initialize: (connection: ACP::ClientConnection, reader: Thread, stdin: IO, stdout: IO, waiter: Process::Waiter, err_r: IO?) -> void
68
+
69
+ # @rbs sig: String
70
+ # @rbs return: void
71
+ def signal: (String sig) -> void
72
+ end
@@ -26,26 +26,26 @@ class ACP::ClientConnection
26
26
  # sent by connect.
27
27
  #
28
28
  # @rbs request: ACP::Types::InitializeRequest
29
- # @rbs return: ACP::Types::InitializeResponse | ACP::Transport::ResponseError
30
- def connect: (ACP::Types::InitializeRequest request) -> (ACP::Types::InitializeResponse | ACP::Transport::ResponseError)
29
+ # @rbs return: ACP::Types::InitializeResponse | ACP::RequestError
30
+ def connect: (ACP::Types::InitializeRequest request) -> (ACP::Types::InitializeResponse | ACP::RequestError)
31
31
 
32
32
  # @rbs request: ACP::Types::NewSessionRequest
33
- # @rbs return: ACP::Types::NewSessionResponse | ACP::Transport::ResponseError
34
- def session_new: (ACP::Types::NewSessionRequest request) -> (ACP::Types::NewSessionResponse | ACP::Transport::ResponseError)
33
+ # @rbs return: ACP::Types::NewSessionResponse | ACP::RequestError
34
+ def session_new: (ACP::Types::NewSessionRequest request) -> (ACP::Types::NewSessionResponse | ACP::RequestError)
35
35
 
36
36
  # @rbs request: ACP::Types::PromptRequest
37
37
  # @rbs &block: (ACP::Types::SessionUpdate::t) -> void
38
- # @rbs return: ACP::Types::PromptResponse | ACP::Transport::ResponseError
39
- def session_prompt: (ACP::Types::PromptRequest request) { (ACP::Types::SessionUpdate::t) -> void } -> (ACP::Types::PromptResponse | ACP::Transport::ResponseError)
38
+ # @rbs return: ACP::Types::PromptResponse | ACP::RequestError
39
+ def session_prompt: (ACP::Types::PromptRequest request) { (ACP::Types::SessionUpdate::t) -> void } -> (ACP::Types::PromptResponse | ACP::RequestError)
40
40
 
41
41
  # @rbs request: ACP::Types::LoadSessionRequest
42
42
  # @rbs &block: (ACP::Types::SessionUpdate::t) -> void
43
- # @rbs return: ACP::Types::LoadSessionResponse | ACP::Transport::ResponseError
44
- def session_load: (ACP::Types::LoadSessionRequest request) { (ACP::Types::SessionUpdate::t) -> void } -> (ACP::Types::LoadSessionResponse | ACP::Transport::ResponseError)
43
+ # @rbs return: ACP::Types::LoadSessionResponse | ACP::RequestError
44
+ def session_load: (ACP::Types::LoadSessionRequest request) { (ACP::Types::SessionUpdate::t) -> void } -> (ACP::Types::LoadSessionResponse | ACP::RequestError)
45
45
 
46
46
  # @rbs request: ACP::Types::ListSessionsRequest
47
- # @rbs return: ACP::Types::ListSessionsResponse | ACP::Transport::ResponseError
48
- def session_list: (ACP::Types::ListSessionsRequest request) -> (ACP::Types::ListSessionsResponse | ACP::Transport::ResponseError)
47
+ # @rbs return: ACP::Types::ListSessionsResponse | ACP::RequestError
48
+ def session_list: (ACP::Types::ListSessionsRequest request) -> (ACP::Types::ListSessionsResponse | ACP::RequestError)
49
49
 
50
50
  # @rbs notification: ACP::Types::CancelNotification
51
51
  # @rbs return: void
@@ -54,9 +54,9 @@ class ACP::ClientConnection
54
54
  private
55
55
 
56
56
  # @rbs type: ACP::AgentConnection::_Parser
57
- # @rbs result: ACP::Transport::Result
57
+ # @rbs result: (Hash[String, untyped] | ACP::RequestError)
58
58
  # @rbs return: untyped
59
- def parse: (ACP::AgentConnection::_Parser type, ACP::Transport::Result result) -> untyped
59
+ def parse: (ACP::AgentConnection::_Parser type, Hash[String, untyped] | ACP::RequestError result) -> untyped
60
60
 
61
61
  # The request waits on its own thread so the caller's thread can yield each
62
62
  # update as it arrives. The reader thread queues an update before it settles
@@ -66,8 +66,8 @@ class ACP::ClientConnection
66
66
  # @rbs method: String
67
67
  # @rbs params: Hash[String, untyped]
68
68
  # @rbs &block: (ACP::Types::SessionUpdate::t) -> void
69
- # @rbs return: ACP::Transport::Result
70
- def stream: (String session_id, String method, Hash[String, untyped] params) { (ACP::Types::SessionUpdate::t) -> void } -> ACP::Transport::Result
69
+ # @rbs return: (Hash[String, untyped] | ACP::RequestError)
70
+ def stream: (String session_id, String method, Hash[String, untyped] params) { (ACP::Types::SessionUpdate::t) -> void } -> (Hash[String, untyped] | ACP::RequestError)
71
71
 
72
72
  # Pushes under the lock so a stream cannot close its queue between the
73
73
  # lookup and the push.
@@ -77,6 +77,6 @@ class ACP::ClientConnection
77
77
  def dispatch: (untyped params) -> void
78
78
 
79
79
  # @rbs params: untyped
80
- # @rbs return: ACP::Transport::Result
81
- def request_permission: (untyped params) -> ACP::Transport::Result
80
+ # @rbs return: (ACP::Types::RequestPermissionResponse | ACP::RequestError)
81
+ def request_permission: (untyped params) -> (ACP::Types::RequestPermissionResponse | ACP::RequestError)
82
82
  end
@@ -0,0 +1,65 @@
1
+ # Generated from lib/acp/request_error.rb with RBS::Inline
2
+
3
+ # The schema's JSON-RPC Error object, named after the official SDKs'
4
+ # RequestError: built by handlers and local refusals, and decoded from a
5
+ # peer's error replies by the transport.
6
+ class ACP::RequestError
7
+ PARSE_ERROR: Integer
8
+
9
+ INVALID_REQUEST: Integer
10
+
11
+ METHOD_NOT_FOUND: Integer
12
+
13
+ INVALID_PARAMS: Integer
14
+
15
+ INTERNAL_ERROR: Integer
16
+
17
+ REQUEST_CANCELLED: Integer
18
+
19
+ AUTH_REQUIRED: Integer
20
+
21
+ RESOURCE_NOT_FOUND: Integer
22
+
23
+ # @rbs code: Integer
24
+ # @rbs message: String
25
+ # @rbs data: untyped
26
+ # @rbs return: void
27
+ def initialize: (code: Integer, message: String, ?data: untyped) -> void
28
+
29
+ # @dynamic code
30
+ attr_reader code: Integer
31
+
32
+ # @dynamic message
33
+ attr_reader message: String
34
+
35
+ # @dynamic data
36
+ attr_reader data: untyped
37
+
38
+ # @rbs return: Hash[String, untyped]
39
+ def to_h: () -> Hash[String, untyped]
40
+
41
+ # @rbs return: ACP::RequestError
42
+ def self.parse_error: () -> ACP::RequestError
43
+
44
+ # @rbs return: ACP::RequestError
45
+ def self.invalid_request: () -> ACP::RequestError
46
+
47
+ # @rbs return: ACP::RequestError
48
+ def self.method_not_found: () -> ACP::RequestError
49
+
50
+ # @rbs return: ACP::RequestError
51
+ def self.invalid_params: () -> ACP::RequestError
52
+
53
+ # @rbs return: ACP::RequestError
54
+ def self.internal_error: () -> ACP::RequestError
55
+
56
+ # @rbs return: ACP::RequestError
57
+ def self.request_cancelled: () -> ACP::RequestError
58
+
59
+ # @rbs return: ACP::RequestError
60
+ def self.auth_required: () -> ACP::RequestError
61
+
62
+ # @rbs uri: String?
63
+ # @rbs return: ACP::RequestError
64
+ def self.resource_not_found: (?String? uri) -> ACP::RequestError
65
+ end
@@ -1,16 +1,16 @@
1
1
  # Generated from lib/acp/transport/reply.rb with RBS::Inline
2
2
 
3
- # A request handler's result plus a callback the transport runs once that
4
- # result is on the wire, for messages the peer must only see after the reply.
3
+ # A request handler's outcome plus a callback the transport runs once that
4
+ # outcome is on the wire, for messages the peer must only see after the reply.
5
5
  class ACP::Transport::Reply
6
6
  # @dynamic result
7
- attr_reader result: ACP::Transport::Result
7
+ attr_reader result: ACP::Transport::Stdio::_ToH
8
8
 
9
9
  # @dynamic after
10
10
  attr_reader after: ^() -> void
11
11
 
12
- # @rbs result: ACP::Transport::Result
12
+ # @rbs result: ACP::Transport::Stdio::_ToH
13
13
  # @rbs after: ^() -> void
14
14
  # @rbs return: void
15
- def initialize: (ACP::Transport::Result result, after: ^() -> void) -> void
15
+ def initialize: (ACP::Transport::Stdio::_ToH result, after: ^() -> void) -> void
16
16
  end
@@ -20,15 +20,7 @@ class ACP::Transport::Stdio
20
20
 
21
21
  @input: _Reader
22
22
 
23
- INTERNAL_ERROR: Integer
24
-
25
- PARSE_ERROR: ACP::Transport::ResponseError
26
-
27
- INVALID_REQUEST: ACP::Transport::ResponseError
28
-
29
- METHOD_NOT_FOUND: ACP::Transport::ResponseError
30
-
31
- CONNECTION_CLOSED: ACP::Transport::ResponseError
23
+ CONNECTION_CLOSED: ACP::RequestError
32
24
 
33
25
  # @rbs input: _Reader
34
26
  # @rbs output: _Writer
@@ -45,8 +37,8 @@ class ACP::Transport::Stdio
45
37
 
46
38
  # @rbs method: String
47
39
  # @rbs params: untyped
48
- # @rbs return: ACP::Transport::Result
49
- def request: (String method, ?untyped params) -> ACP::Transport::Result
40
+ # @rbs return: (Hash[String, untyped] | ACP::RequestError)
41
+ def request: (String method, ?untyped params) -> (Hash[String, untyped] | ACP::RequestError)
50
42
 
51
43
  # @rbs method: String
52
44
  # @rbs params: untyped
@@ -68,8 +60,8 @@ class ACP::Transport::Stdio
68
60
  def route: (Hash[String, untyped] message, Hash[String, _Handler] requests, Hash[String, _NotificationHandler] notifications) -> void
69
61
 
70
62
  # @rbs line: String
71
- # @rbs return: Hash[String, untyped] | ACP::Transport::ResponseError
72
- def parse: (String line) -> (Hash[String, untyped] | ACP::Transport::ResponseError)
63
+ # @rbs return: Hash[String, untyped] | ACP::RequestError
64
+ def parse: (String line) -> (Hash[String, untyped] | ACP::RequestError)
73
65
 
74
66
  # @rbs handler: _Handler?
75
67
  # @rbs id: untyped
@@ -90,22 +82,25 @@ class ACP::Transport::Stdio
90
82
  #
91
83
  # @rbs handler: _Handler
92
84
  # @rbs params: untyped
93
- # @rbs return: ACP::Transport::Result | ACP::Transport::Reply
94
- def invoke: (_Handler handler, untyped params) -> (ACP::Transport::Result | ACP::Transport::Reply)
85
+ # @rbs return: (_ToH | ACP::RequestError | ACP::Transport::Reply)
86
+ def invoke: (_Handler handler, untyped params) -> (_ToH | ACP::RequestError | ACP::Transport::Reply)
95
87
 
88
+ # The success arm is whatever the handler returned, which the transport only
89
+ # knows serializes with to_h; RequestError picks the error arm of the reply.
90
+ #
96
91
  # @rbs id: untyped
97
- # @rbs result: ACP::Transport::Result
92
+ # @rbs outcome: (_ToH | ACP::RequestError)
98
93
  # @rbs return: void
99
- def reply: (untyped id, ACP::Transport::Result result) -> void
94
+ def reply: (untyped id, _ToH | ACP::RequestError outcome) -> void
100
95
 
101
96
  # @rbs queue: Thread::Queue
102
97
  # @rbs return: Integer?
103
98
  def register: (Thread::Queue queue) -> Integer?
104
99
 
105
100
  # @rbs id: untyped
106
- # @rbs result: ACP::Transport::Result
101
+ # @rbs result: (Hash[String, untyped] | ACP::RequestError)
107
102
  # @rbs return: void
108
- def settle: (untyped id, ACP::Transport::Result result) -> void
103
+ def settle: (untyped id, Hash[String, untyped] | ACP::RequestError result) -> void
109
104
 
110
105
  # @rbs return: void
111
106
  def close: () -> void
@@ -0,0 +1,4 @@
1
+ # Generated from lib/acp/types.rb with RBS::Inline
2
+
3
+ module ACP::Types
4
+ end
@@ -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::Authenticate
5
+ extend ::ACP::AgentConnection::OptionalMethod::Authenticate
6
+ end
@@ -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::CloseSession
5
+ extend ::ACP::AgentConnection::OptionalMethod::CloseSession
6
+ end
@@ -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::DeleteSession
5
+ extend ::ACP::AgentConnection::OptionalMethod::DeleteSession
6
+ end
@@ -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::ListSessions
5
+ extend ::ACP::AgentConnection::OptionalMethod::ListSessions
6
+ end
@@ -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::LoadSession
5
+ extend ::ACP::AgentConnection::OptionalMethod::LoadSession
6
+ end
@@ -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::ResumeSession
5
+ extend ::ACP::AgentConnection::OptionalMethod::ResumeSession
6
+ end
@@ -1,7 +1,7 @@
1
1
  class ACP::AgentConnection
2
2
  interface _Agent
3
- def new_session: (ACP::Types::NewSessionRequest) -> (ACP::Types::NewSessionResponse | ACP::Transport::ResponseError)
4
- def prompt: (ACP::Types::PromptRequest) -> (ACP::Types::PromptResponse | ACP::Transport::ResponseError)
3
+ def new_session: (ACP::Types::NewSessionRequest) -> (ACP::Types::NewSessionResponse | ACP::RequestError)
4
+ def prompt: (ACP::Types::PromptRequest) -> (ACP::Types::PromptResponse | ACP::RequestError)
5
5
  # Runs on the transport's reader thread, so it must return quickly.
6
6
  def cancel: (ACP::Types::CancelNotification) -> void
7
7
  # AgentConnection probes for the optional methods below.
@@ -9,11 +9,53 @@ class ACP::AgentConnection
9
9
  end
10
10
 
11
11
  interface _LoadSession
12
- def load_session: (ACP::Types::LoadSessionRequest) -> (ACP::Types::LoadSessionResponse | ACP::Transport::ResponseError)
12
+ def load_session: (ACP::Types::LoadSessionRequest) -> (ACP::Types::LoadSessionResponse | ACP::RequestError)
13
13
  end
14
14
 
15
15
  interface _ListSessions
16
- def list_sessions: (ACP::Types::ListSessionsRequest) -> (ACP::Types::ListSessionsResponse | ACP::Transport::ResponseError)
16
+ def list_sessions: (ACP::Types::ListSessionsRequest) -> (ACP::Types::ListSessionsResponse | ACP::RequestError)
17
+ end
18
+
19
+ interface _Authenticate
20
+ def authenticate: (ACP::Types::AuthenticateRequest) -> (ACP::Types::AuthenticateResponse | ACP::RequestError)
21
+ end
22
+
23
+ interface _ResumeSession
24
+ def resume_session: (ACP::Types::ResumeSessionRequest) -> (ACP::Types::ResumeSessionResponse | ACP::RequestError)
25
+ end
26
+
27
+ interface _CloseSession
28
+ def close_session: (ACP::Types::CloseSessionRequest) -> (ACP::Types::CloseSessionResponse | ACP::RequestError)
29
+ end
30
+
31
+ interface _DeleteSession
32
+ def delete_session: (ACP::Types::DeleteSessionRequest) -> (ACP::Types::DeleteSessionResponse | ACP::RequestError)
33
+ end
34
+
35
+ interface _ChangeSessionMode
36
+ def change_session_mode: (ACP::Types::SetSessionModeRequest) -> (ACP::Types::SetSessionModeResponse | ACP::RequestError)
37
+ end
38
+
39
+ interface _ChangeSessionConfigOption
40
+ def change_session_config_option: (ACP::Types::SetSessionConfigOptionRequest) -> (ACP::Types::SetSessionConfigOptionResponse | ACP::RequestError)
41
+ end
42
+
43
+ interface _FullAgent
44
+ include _Agent
45
+ include _LoadSession
46
+ include _ListSessions
47
+ include _Authenticate
48
+ include _ResumeSession
49
+ include _CloseSession
50
+ include _DeleteSession
51
+ include _ChangeSessionMode
52
+ include _ChangeSessionConfigOption
53
+ end
54
+
55
+ interface _OptionalMethod
56
+ def rpc_method: () -> String
57
+ def agent_method: () -> Symbol
58
+ def advertised?: (ACP::Types::InitializeResponse) -> bool
17
59
  end
18
60
 
19
61
  interface _SessionCreated
@@ -24,12 +66,19 @@ class ACP::AgentConnection
24
66
  interface _Client
25
67
  def update: (String session_id, ACP::Types::SessionUpdate::t update) -> void
26
68
  def available_commands: (String session_id, Array[ACP::Types::AvailableCommand] commands) -> void
27
- def request_permission: (ACP::Types::RequestPermissionRequest) -> (ACP::Types::RequestPermissionResponse | ACP::Transport::ResponseError)
69
+ def request_permission: (ACP::Types::RequestPermissionRequest) -> (ACP::Types::RequestPermissionResponse | ACP::RequestError)
70
+ def read_text_file: (ACP::Types::ReadTextFileRequest) -> (ACP::Types::ReadTextFileResponse | ACP::RequestError)
71
+ def write_text_file: (ACP::Types::WriteTextFileRequest) -> (ACP::Types::WriteTextFileResponse | ACP::RequestError)
72
+ def create_terminal: (ACP::Types::CreateTerminalRequest) -> (ACP::Types::CreateTerminalResponse | ACP::RequestError)
73
+ def terminal_output: (ACP::Types::TerminalOutputRequest) -> (ACP::Types::TerminalOutputResponse | ACP::RequestError)
74
+ def wait_for_terminal_exit: (ACP::Types::WaitForTerminalExitRequest) -> (ACP::Types::WaitForTerminalExitResponse | ACP::RequestError)
75
+ def kill_terminal: (ACP::Types::KillTerminalRequest) -> (ACP::Types::KillTerminalResponse | ACP::RequestError)
76
+ def release_terminal: (ACP::Types::ReleaseTerminalRequest) -> (ACP::Types::ReleaseTerminalResponse | ACP::RequestError)
28
77
  def capabilities: () -> ACP::Types::ClientCapabilities?
29
78
  end
30
79
 
31
80
  interface _Peer
32
- def request: (String method, ?untyped params) -> ACP::Transport::Result
81
+ def request: (String method, ?untyped params) -> (Hash[String, untyped] | ACP::RequestError)
33
82
  def notify: (String method, ?untyped params) -> void
34
83
  end
35
84
 
@@ -0,0 +1,7 @@
1
+ class ACP::AgentProcess
2
+ # The stdlib RBS for Open3#popen2 models neither the leading env hash nor
3
+ # the err: option, so spawn calls it through this narrower type.
4
+ interface _Spawner
5
+ def call: (*untyped, **untyped) -> [IO, IO, Process::Waiter]
6
+ end
7
+ end
@@ -1,7 +1,7 @@
1
1
  class ACP::ClientConnection
2
2
  interface _PermissionHandler
3
3
  # Runs on its own thread, so it may block while the user decides.
4
- def call: (ACP::Types::RequestPermissionRequest) -> (ACP::Types::RequestPermissionResponse | ACP::Transport::ResponseError)
4
+ def call: (ACP::Types::RequestPermissionRequest) -> (ACP::Types::RequestPermissionResponse | ACP::RequestError)
5
5
  end
6
6
 
7
7
  # Receives the session/update notifications that arrive outside a
@@ -1,4 +1,10 @@
1
1
  class ACP::Transport::Stdio
2
+ # The success arm of a request handler's return: the transport serializes it
3
+ # with to_h into the reply's result.
4
+ interface _ToH
5
+ def to_h: () -> Hash[String, untyped]
6
+ end
7
+
2
8
  interface _Reader
3
9
  def each_line: () { (String) -> void } -> untyped
4
10
  end
@@ -9,7 +15,7 @@ class ACP::Transport::Stdio
9
15
  end
10
16
 
11
17
  interface _Handler
12
- def call: (untyped params) -> (ACP::Transport::Result | ACP::Transport::Reply)
18
+ def call: (untyped params) -> (_ToH | ACP::RequestError | ACP::Transport::Reply)
13
19
  end
14
20
 
15
21
  interface _NotificationHandler
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.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -23,8 +23,6 @@ dependencies:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
25
  version: '2.8'
26
- description: An Agent Client Protocol (ACP) server for exposing agents and a client
27
- for driving them.
28
26
  email:
29
27
  - jakebottrall@gmail.com
30
28
  executables: []
@@ -37,13 +35,20 @@ files:
37
35
  - lib/acp/agent_connection.rb
38
36
  - lib/acp/agent_connection/client.rb
39
37
  - lib/acp/agent_connection/optional_method.rb
38
+ - lib/acp/agent_connection/optional_method/authenticate.rb
39
+ - lib/acp/agent_connection/optional_method/close_session.rb
40
+ - lib/acp/agent_connection/optional_method/delete_session.rb
41
+ - lib/acp/agent_connection/optional_method/list_sessions.rb
42
+ - lib/acp/agent_connection/optional_method/load_session.rb
43
+ - lib/acp/agent_connection/optional_method/resume_session.rb
44
+ - lib/acp/agent_process.rb
40
45
  - lib/acp/client_connection.rb
46
+ - lib/acp/request_error.rb
41
47
  - lib/acp/sdk.rb
42
48
  - lib/acp/transport.rb
43
49
  - lib/acp/transport/reply.rb
44
- - lib/acp/transport/response_error.rb
45
- - lib/acp/transport/result.rb
46
50
  - lib/acp/transport/stdio.rb
51
+ - lib/acp/types.rb
47
52
  - lib/acp/types/agent_auth_capabilities.rb
48
53
  - lib/acp/types/agent_capabilities.rb
49
54
  - lib/acp/types/annotations.rb
@@ -243,13 +248,20 @@ files:
243
248
  - sig/generated/acp/agent_connection.rbs
244
249
  - sig/generated/acp/agent_connection/client.rbs
245
250
  - sig/generated/acp/agent_connection/optional_method.rbs
251
+ - sig/generated/acp/agent_connection/optional_method/authenticate.rbs
252
+ - sig/generated/acp/agent_connection/optional_method/close_session.rbs
253
+ - sig/generated/acp/agent_connection/optional_method/delete_session.rbs
254
+ - sig/generated/acp/agent_connection/optional_method/list_sessions.rbs
255
+ - sig/generated/acp/agent_connection/optional_method/load_session.rbs
256
+ - sig/generated/acp/agent_connection/optional_method/resume_session.rbs
257
+ - sig/generated/acp/agent_process.rbs
246
258
  - sig/generated/acp/client_connection.rbs
259
+ - sig/generated/acp/request_error.rbs
247
260
  - sig/generated/acp/sdk.rbs
248
261
  - sig/generated/acp/transport.rbs
249
262
  - sig/generated/acp/transport/reply.rbs
250
- - sig/generated/acp/transport/response_error.rbs
251
- - sig/generated/acp/transport/result.rbs
252
263
  - sig/generated/acp/transport/stdio.rbs
264
+ - sig/generated/acp/types.rbs
253
265
  - sig/generated/acp/types/agent_auth_capabilities.rbs
254
266
  - sig/generated/acp/types/agent_capabilities.rbs
255
267
  - sig/generated/acp/types/annotations.rbs
@@ -447,9 +459,15 @@ files:
447
459
  - sig/generated/acp/types/write_text_file_response.rbs
448
460
  - sig/generated/acp/version.rbs
449
461
  - sig/manual/acp/agent_connection.rbs
462
+ - sig/manual/acp/agent_connection/optional_method/authenticate.rbs
463
+ - sig/manual/acp/agent_connection/optional_method/close_session.rbs
464
+ - sig/manual/acp/agent_connection/optional_method/delete_session.rbs
465
+ - sig/manual/acp/agent_connection/optional_method/list_sessions.rbs
466
+ - sig/manual/acp/agent_connection/optional_method/load_session.rbs
467
+ - sig/manual/acp/agent_connection/optional_method/resume_session.rbs
468
+ - sig/manual/acp/agent_process.rbs
450
469
  - sig/manual/acp/client_connection.rbs
451
470
  - sig/manual/acp/transport/stdio.rbs
452
- - sig/manual/acp/types.rbs
453
471
  homepage: https://github.com/bottrall/acp-sdk
454
472
  licenses:
455
473
  - MIT