using System; using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace Acp; /// /// The agent end of an ACP connection. Exposes the client's methods as outbound calls /// () and routes inbound agent requests/notifications to the supplied /// . Used to wrap an in-process or subprocess agent, and for the loopback test. /// public sealed class AgentSideConnection : AcpConnection, IAcpClient { public AgentSideConnection(IAcpAgent agent, IAcpTransport transport) : base(transport) { HandleRequest(AgentMethods.Initialize, agent.InitializeAsync); HandleRequest(AgentMethods.Authenticate, agent.AuthenticateAsync); HandleRequest(AgentMethods.SessionNew, agent.SessionNewAsync); HandleRequest(AgentMethods.SessionLoad, agent.SessionLoadAsync); HandleRequest(AgentMethods.SessionSetMode, agent.SessionSetModeAsync); HandleRequest(AgentMethods.SessionPrompt, agent.SessionPromptAsync); HandleNotification(AgentMethods.SessionCancel, agent.SessionCancelAsync); Endpoint.OnUnknownRequest(async (request, ct) => { JsonElement result = await agent.ExtMethodAsync(request.Method, request.Params ?? default, ct).ConfigureAwait(false); return new JsonRpcResponse { Id = request.Id, Result = result }; }); Endpoint.OnUnknownNotification((notification, ct) => agent.ExtNotificationAsync(notification.Method, notification.Params ?? default, ct)); } public ValueTask FsReadTextFileAsync(ReadTextFileRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.FsReadTextFile, request, cancellationToken); public ValueTask FsWriteTextFileAsync(WriteTextFileRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.FsWriteTextFile, request, cancellationToken); public ValueTask SessionRequestPermissionAsync(RequestPermissionRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.SessionRequestPermission, request, cancellationToken); public ValueTask TerminalCreateAsync(CreateTerminalRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.TerminalCreate, request, cancellationToken); public ValueTask TerminalKillAsync(KillTerminalCommandRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.TerminalKill, request, cancellationToken); public ValueTask TerminalOutputAsync(TerminalOutputRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.TerminalOutput, request, cancellationToken); public ValueTask TerminalReleaseAsync(ReleaseTerminalRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.TerminalRelease, request, cancellationToken); public ValueTask TerminalWaitForExitAsync(WaitForTerminalExitRequest request, CancellationToken cancellationToken = default) => RequestAsync(ClientMethods.TerminalWaitForExit, request, cancellationToken); public ValueTask SessionUpdateAsync(SessionNotification notification, CancellationToken cancellationToken = default) => NotifyAsync(ClientMethods.SessionUpdate, notification, cancellationToken); public ValueTask ExtMethodAsync(string method, JsonElement @params, CancellationToken cancellationToken = default) => ExtRequestAsync(method, @params, cancellationToken); public ValueTask ExtNotificationAsync(string method, JsonElement @params, CancellationToken cancellationToken = default) => Endpoint.SendNotificationAsync(method, @params, cancellationToken); }