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