using System; using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace Acp; /// /// The client end of an ACP connection (the editor/host side). Exposes the agent's methods as /// outbound calls () and routes inbound client requests/notifications to the /// supplied . /// public sealed class ClientSideConnection : AcpConnection, IAcpAgent { public ClientSideConnection(Func toClient, IAcpTransport transport) : base(transport) { IAcpClient client = toClient(this); HandleRequest(ClientMethods.FsReadTextFile, client.FsReadTextFileAsync); HandleRequest(ClientMethods.FsWriteTextFile, client.FsWriteTextFileAsync); HandleRequest(ClientMethods.SessionRequestPermission, client.SessionRequestPermissionAsync); HandleRequest(ClientMethods.TerminalCreate, client.TerminalCreateAsync); HandleRequest(ClientMethods.TerminalKill, client.TerminalKillAsync); HandleRequest(ClientMethods.TerminalOutput, client.TerminalOutputAsync); HandleRequest(ClientMethods.TerminalRelease, client.TerminalReleaseAsync); HandleRequest(ClientMethods.TerminalWaitForExit, client.TerminalWaitForExitAsync); HandleNotification(ClientMethods.SessionUpdate, client.SessionUpdateAsync); Endpoint.OnUnknownRequest(async (request, ct) => { JsonElement result = await client.ExtMethodAsync(request.Method, request.Params ?? default, ct).ConfigureAwait(false); return new JsonRpcResponse { Id = request.Id, Result = result }; }); Endpoint.OnUnknownNotification((notification, ct) => client.ExtNotificationAsync(notification.Method, notification.Params ?? default, ct)); } public ValueTask InitializeAsync(InitializeRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.Initialize, request, cancellationToken); public ValueTask AuthenticateAsync(AuthenticateRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.Authenticate, request, cancellationToken); public ValueTask SessionNewAsync(NewSessionRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.SessionNew, request, cancellationToken); public ValueTask SessionLoadAsync(LoadSessionRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.SessionLoad, request, cancellationToken); public ValueTask SessionSetModeAsync(SetSessionModeRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.SessionSetMode, request, cancellationToken); public ValueTask SessionPromptAsync(PromptRequest request, CancellationToken cancellationToken = default) => RequestAsync(AgentMethods.SessionPrompt, request, cancellationToken); public ValueTask SessionCancelAsync(CancelNotification notification, CancellationToken cancellationToken = default) => NotifyAsync(AgentMethods.SessionCancel, 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); }