using System.Text.Json; using Acp; namespace Acp.Tests; /// A minimal agent: answers initialize/new, and on prompt streams one update then ends. internal sealed class FakeAgent : IAcpAgent { public IAcpClient? Client { get; set; } public bool Cancelled { get; private set; } public ValueTask InitializeAsync(InitializeRequest request, CancellationToken ct = default) => ValueTask.FromResult(new InitializeResponse { ProtocolVersion = request.ProtocolVersion }); public ValueTask SessionNewAsync(NewSessionRequest request, CancellationToken ct = default) => ValueTask.FromResult(new NewSessionResponse { SessionId = "s1" }); public async ValueTask SessionPromptAsync(PromptRequest request, CancellationToken ct = default) { await Client!.SessionUpdateAsync(new SessionNotification { SessionId = request.SessionId, Update = new AgentMessageChunkSessionUpdate { Content = new TextContentBlock { Text = "working..." } }, }, ct); return new PromptResponse { StopReason = StopReason.EndTurn }; } public ValueTask SessionCancelAsync(CancelNotification notification, CancellationToken ct = default) { Cancelled = true; return ValueTask.CompletedTask; } public ValueTask AuthenticateAsync(AuthenticateRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask SessionLoadAsync(LoadSessionRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask SessionSetModeAsync(SetSessionModeRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask ExtMethodAsync(string method, JsonElement @params, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask ExtNotificationAsync(string method, JsonElement @params, CancellationToken ct = default) => ValueTask.CompletedTask; } /// A client that records the session/update notifications it receives. internal sealed class CapturingClient : IAcpClient { public List Updates { get; } = []; public ValueTask SessionUpdateAsync(SessionNotification notification, CancellationToken ct = default) { Updates.Add(notification); return ValueTask.CompletedTask; } public ValueTask FsReadTextFileAsync(ReadTextFileRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask FsWriteTextFileAsync(WriteTextFileRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask SessionRequestPermissionAsync(RequestPermissionRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask TerminalCreateAsync(CreateTerminalRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask TerminalKillAsync(KillTerminalCommandRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask TerminalOutputAsync(TerminalOutputRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask TerminalReleaseAsync(ReleaseTerminalRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask TerminalWaitForExitAsync(WaitForTerminalExitRequest request, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask ExtMethodAsync(string method, JsonElement @params, CancellationToken ct = default) => throw new NotImplementedException(); public ValueTask ExtNotificationAsync(string method, JsonElement @params, CancellationToken ct = default) => ValueTask.CompletedTask; }