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);
}