🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@agentclientprotocol/sdk

Package Overview
Dependencies
Maintainers
3
Versions
46
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@agentclientprotocol/sdk - npm Package Compare versions

Comparing version
0.26.0
to
0.27.0
+64
dist/connection.d.ts
import type { AnyMessage, AnyResponse } from "./jsonrpc.js";
import type { Stream } from "./stream.js";
export interface AgentConnector {
connect(stream: Stream): unknown;
}
export type ResponseRoute = "connection" | {
readonly session: string;
};
export interface OutboundSubscription {
readonly replay: readonly AnyMessage[];
readonly stream: ReadableStream<AnyMessage>;
}
export declare class OutboundStream {
private readonly capacity;
private readonly subscribers;
private replayBuffer;
private hasSubscriber;
private isClosed;
constructor(capacity?: number);
push(message: AnyMessage): void;
subscribe(): OutboundSubscription;
close(): void;
}
export declare class ConnectionState {
readonly connectionId: string;
readonly inboundTx: WritableStream<AnyMessage>;
readonly outboundRx: ReadableStream<AnyMessage>;
readonly connectionStream: OutboundStream;
readonly allOutbound: OutboundStream;
readonly sessionStreams: Map<string, OutboundStream>;
readonly pendingRoutes: Map<string, ResponseRoute>;
readonly clientResponseRoutes: Map<string, ResponseRoute>;
private hasStartedRouter;
private inboundWriteChain;
private initialReader;
private outboundReader;
private shutdownPromise;
constructor(agent: AgentConnector);
recvInitial(initializeId: string | number): Promise<AnyResponse>;
writeInbound(message: AnyMessage): Promise<void>;
startRouter(): void;
ensureSession(sessionId: string): OutboundStream;
shutdown(): Promise<void>;
private runShutdown;
private cancelOutboundReader;
private writeInboundMessage;
private runRouter;
private routeOutbound;
private routeOutboundResponse;
private routeOutboundRequestOrNotification;
private trackClientResponseRoute;
private pushToRoute;
}
export declare class ConnectionRegistry {
private readonly connections;
private readonly pendingConnections;
createConnection(agent: AgentConnector): ConnectionState;
createPendingConnection(agent: AgentConnector): ConnectionState;
register(connection: ConnectionState): void;
get(connectionId: string): ConnectionState | undefined;
remove(connectionId: string): ConnectionState | undefined;
discard(connectionId: string): ConnectionState | undefined;
closeAll(): Promise<void>;
}
import { isResponseMessage } from "./jsonrpc.js";
import { messageIdKey, sessionIdFromMessageParams, sessionIdFromResponseResult, } from "./protocol.js";
export class OutboundStream {
capacity;
subscribers = new Set();
replayBuffer = [];
hasSubscriber = false;
isClosed = false;
constructor(capacity = 1024) {
this.capacity = capacity;
}
push(message) {
if (this.isClosed) {
return;
}
if (!this.hasSubscriber) {
this.replayBuffer.push(message);
if (this.replayBuffer.length > this.capacity) {
this.replayBuffer.shift();
}
return;
}
for (const subscriber of this.subscribers) {
subscriber.push(message);
}
}
subscribe() {
const replay = this.hasSubscriber ? [] : [...this.replayBuffer];
this.replayBuffer = [];
this.hasSubscriber = true;
const subscriber = new OutboundSubscriber(this.capacity, (item) => {
this.subscribers.delete(item);
});
this.subscribers.add(subscriber);
if (this.isClosed) {
subscriber.close();
}
return {
replay,
stream: subscriber.stream,
};
}
close() {
if (this.isClosed) {
return;
}
this.isClosed = true;
this.replayBuffer = [];
for (const subscriber of this.subscribers) {
subscriber.close();
}
this.subscribers.clear();
}
}
export class ConnectionState {
connectionId;
inboundTx;
outboundRx;
connectionStream = new OutboundStream();
allOutbound = new OutboundStream();
sessionStreams = new Map();
pendingRoutes = new Map();
clientResponseRoutes = new Map();
hasStartedRouter = false;
inboundWriteChain = Promise.resolve();
initialReader;
outboundReader;
shutdownPromise;
constructor(agent) {
this.connectionId = globalThis.crypto.randomUUID();
const inbound = new TransformStream();
const outbound = new TransformStream();
this.inboundTx = inbound.writable;
this.outboundRx = outbound.readable;
const stream = {
readable: inbound.readable,
writable: outbound.writable,
};
agent.connect(stream);
}
async recvInitial(initializeId) {
const reader = this.outboundRx.getReader();
this.initialReader = reader;
try {
const result = await reader.read();
if (result.done ||
!result.value ||
!isMatchingResponse(result.value, initializeId)) {
if (!this.shutdownPromise) {
await this.shutdown();
}
throw new Error("Expected initialize response from agent");
}
return result.value;
}
finally {
if (this.initialReader === reader) {
this.initialReader = undefined;
}
reader.releaseLock();
}
}
async writeInbound(message) {
const write = this.inboundWriteChain.then(() => this.writeInboundMessage(message));
this.inboundWriteChain = write.catch(() => undefined);
await write;
}
startRouter() {
if (this.hasStartedRouter) {
return;
}
this.hasStartedRouter = true;
void this.runRouter();
}
ensureSession(sessionId) {
const existing = this.sessionStreams.get(sessionId);
if (existing) {
return existing;
}
const stream = new OutboundStream();
this.sessionStreams.set(sessionId, stream);
return stream;
}
async shutdown() {
if (!this.shutdownPromise) {
this.shutdownPromise = this.runShutdown();
}
return this.shutdownPromise;
}
async runShutdown() {
this.connectionStream.close();
this.allOutbound.close();
for (const stream of this.sessionStreams.values()) {
stream.close();
}
this.sessionStreams.clear();
this.pendingRoutes.clear();
this.clientResponseRoutes.clear();
await Promise.allSettled([
this.inboundTx.close(),
this.cancelOutboundReader(),
]);
}
cancelOutboundReader() {
const reader = this.initialReader ?? this.outboundReader;
if (reader) {
return reader.cancel();
}
return this.outboundRx.cancel();
}
async writeInboundMessage(message) {
const writer = this.inboundTx.getWriter();
try {
await writer.write(message);
}
finally {
writer.releaseLock();
}
}
async runRouter() {
const reader = this.outboundRx.getReader();
this.outboundReader = reader;
try {
while (true) {
const result = await reader.read();
if (result.done) {
return;
}
this.routeOutbound(result.value);
}
}
catch (error) {
console.error("ACP connection router stopped unexpectedly:", error);
}
finally {
if (this.outboundReader === reader) {
this.outboundReader = undefined;
}
reader.releaseLock();
this.connectionStream.close();
this.allOutbound.close();
for (const stream of this.sessionStreams.values()) {
stream.close();
}
}
}
routeOutbound(message) {
this.allOutbound.push(message);
if (isResponseMessage(message)) {
this.routeOutboundResponse(message);
return;
}
this.routeOutboundRequestOrNotification(message);
}
routeOutboundResponse(message) {
const key = messageIdKey(message.id);
const route = key ? this.pendingRoutes.get(key) : undefined;
const sessionId = sessionIdFromResponseResult(message);
if (sessionId) {
this.ensureSession(sessionId);
}
if (key) {
this.pendingRoutes.delete(key);
}
this.pushToRoute(route ?? "connection", message);
}
routeOutboundRequestOrNotification(message) {
const sessionId = sessionIdFromMessageParams(message);
if (sessionId) {
this.trackClientResponseRoute(message, { session: sessionId });
this.ensureSession(sessionId).push(message);
return;
}
this.trackClientResponseRoute(message, "connection");
this.connectionStream.push(message);
}
trackClientResponseRoute(message, route) {
if (!("id" in message) || !("method" in message)) {
return;
}
const key = messageIdKey(message.id);
if (key) {
this.clientResponseRoutes.set(key, route);
}
}
pushToRoute(route, message) {
if (route === "connection") {
this.connectionStream.push(message);
return;
}
this.ensureSession(route.session).push(message);
}
}
export class ConnectionRegistry {
connections = new Map();
pendingConnections = new Map();
createConnection(agent) {
const connection = new ConnectionState(agent);
this.connections.set(connection.connectionId, connection);
return connection;
}
createPendingConnection(agent) {
const connection = new ConnectionState(agent);
this.pendingConnections.set(connection.connectionId, connection);
return connection;
}
register(connection) {
this.pendingConnections.delete(connection.connectionId);
this.connections.set(connection.connectionId, connection);
}
get(connectionId) {
return this.connections.get(connectionId);
}
remove(connectionId) {
const connection = this.get(connectionId);
if (!connection) {
return undefined;
}
this.connections.delete(connectionId);
void connection.shutdown();
return connection;
}
discard(connectionId) {
const connection = this.connections.get(connectionId) ??
this.pendingConnections.get(connectionId);
if (!connection) {
return undefined;
}
this.connections.delete(connectionId);
this.pendingConnections.delete(connectionId);
void connection.shutdown();
return connection;
}
async closeAll() {
const connections = new Set([
...this.connections.values(),
...this.pendingConnections.values(),
]);
this.connections.clear();
this.pendingConnections.clear();
await Promise.all(Array.from(connections, (connection) => connection.shutdown()));
}
}
class OutboundSubscriber {
capacity;
onCancel;
stream;
controller;
queue = [];
isClosed = false;
hasWarnedAboutOverflow = false;
constructor(capacity, onCancel) {
this.capacity = capacity;
this.onCancel = onCancel;
this.stream = new ReadableStream({
start: (controller) => {
this.controller = controller;
this.flush();
},
pull: () => {
this.flush();
},
cancel: () => {
this.cancel();
},
});
}
push(message) {
if (this.isClosed) {
return;
}
this.queue.push(message);
if (this.queue.length > this.capacity) {
this.queue.shift();
if (!this.hasWarnedAboutOverflow) {
console.warn("ACP outbound subscriber lagged; dropping oldest message");
this.hasWarnedAboutOverflow = true;
}
}
this.flush();
}
close() {
if (this.isClosed) {
return;
}
this.isClosed = true;
this.queue = [];
this.controller?.close();
}
cancel() {
this.isClosed = true;
this.queue = [];
this.onCancel(this);
}
flush() {
if (!this.controller) {
return;
}
while (this.queue.length > 0 &&
this.controller.desiredSize !== null &&
this.controller.desiredSize > 0) {
const message = this.queue.shift();
if (!message) {
return;
}
this.controller.enqueue(message);
}
if (this.queue.length === 0) {
this.hasWarnedAboutOverflow = false;
}
}
}
function isMatchingResponse(msg, id) {
return "id" in msg && !("method" in msg) && msg.id === id;
}
//# sourceMappingURL=connection.js.map
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
import { describe, expect, it, vi } from "vitest";
import { ConnectionRegistry, OutboundStream, } from "./connection.js";
import { messageIdKey } from "./protocol.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: 1,
clientCapabilities: {},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 2,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
function createPromptRequest(id, sessionId) {
return {
jsonrpc: "2.0",
id,
method: "session/prompt",
params: {
sessionId,
prompt: [{ type: "text", text: "Hello" }],
},
};
}
const messageOne = { jsonrpc: "2.0", id: 1, result: "one" };
const messageTwo = { jsonrpc: "2.0", id: 2, result: "two" };
const messageThree = { jsonrpc: "2.0", id: 3, result: "three" };
const messageFour = { jsonrpc: "2.0", id: 4, result: "four" };
describe("ConnectionRegistry", () => {
it("creates retrievable connections with unique UUID connection IDs", async () => {
const registry = new ConnectionRegistry();
const first = registry.createConnection(createTestAgentApp());
const second = registry.createConnection(createTestAgentApp());
expect(first.connectionId).toMatch(/^[0-9a-f-]{36}$/);
expect(second.connectionId).toMatch(/^[0-9a-f-]{36}$/);
expect(first.connectionId).not.toBe(second.connectionId);
expect(registry.get(first.connectionId)).toBe(first);
expect(registry.get(second.connectionId)).toBe(second);
await registry.closeAll();
});
it("removes connections", () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp());
expect(registry.remove(connection.connectionId)).toBe(connection);
expect(registry.get(connection.connectionId)).toBeUndefined();
expect(registry.remove(connection.connectionId)).toBeUndefined();
});
it("receives the initialize response directly from the agent", async () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp());
await writeInbound(connection.inboundTx, initializeRequest);
const response = await connection.recvInitial(initializeRequest.id);
expect(response).toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: 1,
agentCapabilities: {
loadSession: false,
},
},
});
await registry.closeAll();
});
it("cancels a pending initialize reader during shutdown", async () => {
const initialize = createDeferred();
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp({ initialize: () => initialize.promise }));
await writeInbound(connection.inboundTx, initializeRequest);
const initialResponse = connection.recvInitial(initializeRequest.id);
initialResponse.catch(() => undefined);
await connection.shutdown();
await expect(withTimeout(initialResponse)).rejects.toThrow("Expected initialize response from agent");
await registry.closeAll();
});
it("waits for active and pending connection shutdowns before closeAll resolves", async () => {
const registry = new ConnectionRegistry();
const active = registry.createConnection(createTestAgentApp());
const pending = registry.createPendingConnection(createTestAgentApp());
const activeShutdownStarted = createDeferred();
const pendingShutdownStarted = createDeferred();
const allowActiveShutdown = createDeferred();
const allowPendingShutdown = createDeferred();
const originalActiveShutdown = active.shutdown.bind(active);
const originalPendingShutdown = pending.shutdown.bind(pending);
vi.spyOn(active, "shutdown").mockImplementation(async () => {
activeShutdownStarted.resolve();
await allowActiveShutdown.promise;
await originalActiveShutdown();
});
vi.spyOn(pending, "shutdown").mockImplementation(async () => {
pendingShutdownStarted.resolve();
await allowPendingShutdown.promise;
await originalPendingShutdown();
});
let closeResolved = false;
const close = registry.closeAll().then(() => {
closeResolved = true;
});
await activeShutdownStarted.promise;
await pendingShutdownStarted.promise;
await flushMicrotasks();
expect(registry.get(active.connectionId)).toBeUndefined();
expect(closeResolved).toBe(false);
allowActiveShutdown.resolve();
await flushMicrotasks();
expect(closeResolved).toBe(false);
allowPendingShutdown.resolve();
await close;
expect(closeResolved).toBe(true);
});
it("routes pending responses to the connection stream and all outbound stream", async () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp());
await initializeConnection(connection);
const connectionSubscription = connection.connectionStream.subscribe();
const allOutboundSubscription = connection.allOutbound.subscribe();
const key = messageIdKey(sessionNewRequest.id);
expect(key).toBe("number:2");
connection.pendingRoutes.set(key ?? "", "connection");
await writeInbound(connection.inboundTx, sessionNewRequest);
const connectionMessage = await readNext(connectionSubscription.stream);
const allOutboundMessage = await readNext(allOutboundSubscription.stream);
expect(connectionMessage).toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: expect.stringMatching(/^[0-9a-f-]{36}$/),
},
});
expect(allOutboundMessage).toMatchObject(connectionMessage);
expect(connection.pendingRoutes.has(key ?? "")).toBe(false);
await registry.closeAll();
});
it("falls back to the connection stream for responses without a pending route", async () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp());
await initializeConnection(connection);
const subscription = connection.connectionStream.subscribe();
await writeInbound(connection.inboundTx, sessionNewRequest);
expect(await readNext(subscription.stream)).toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: expect.stringMatching(/^[0-9a-f-]{36}$/),
},
});
await registry.closeAll();
});
it("returns the same session stream for repeated ensureSession calls", async () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp());
const sessionId = globalThis.crypto.randomUUID();
expect(connection.ensureSession(sessionId)).toBe(connection.ensureSession(sessionId));
expect(connection.sessionStreams.get(sessionId)).toBe(connection.ensureSession(sessionId));
await registry.closeAll();
});
it("routes session responses and notifications to the session stream", async () => {
const registry = new ConnectionRegistry();
const connection = registry.createConnection(createTestAgentApp({ chunkCount: 1 }));
const sessionId = globalThis.crypto.randomUUID();
const promptRequest = createPromptRequest(3, sessionId);
await initializeConnection(connection);
const sessionSubscription = connection.ensureSession(sessionId).subscribe();
const connectionSubscription = connection.connectionStream.subscribe();
const key = messageIdKey(promptRequest.id);
expect(key).toBe("number:3");
connection.pendingRoutes.set(key ?? "", { session: sessionId });
await writeInbound(connection.inboundTx, promptRequest);
expect(await readNext(sessionSubscription.stream)).toMatchObject({
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
text: "chunk-1",
},
},
},
});
expect(await readNext(sessionSubscription.stream)).toMatchObject({
jsonrpc: "2.0",
id: promptRequest.id,
result: {
stopReason: "end_turn",
},
});
expect(connection.pendingRoutes.has(key ?? "")).toBe(false);
expect(await readNextOrUndefined(connectionSubscription.stream)).toBeUndefined();
await registry.closeAll();
});
});
describe("OutboundStream", () => {
it("replays buffered messages to the first subscriber", () => {
const stream = new OutboundStream();
stream.push(messageOne);
stream.push(messageTwo);
expect(stream.subscribe().replay).toEqual([messageOne, messageTwo]);
});
it("does not replay buffered messages to later subscribers", async () => {
const stream = new OutboundStream();
stream.push(messageOne);
const first = stream.subscribe();
const second = stream.subscribe();
expect(first.replay).toEqual([messageOne]);
expect(second.replay).toEqual([]);
stream.push(messageTwo);
expect(await readNext(first.stream)).toEqual(messageTwo);
expect(await readNext(second.stream)).toEqual(messageTwo);
});
it("evicts oldest replay messages when capacity is exceeded", () => {
const stream = new OutboundStream(2);
stream.push(messageOne);
stream.push(messageTwo);
stream.push(messageThree);
expect(stream.subscribe().replay).toEqual([messageTwo, messageThree]);
});
it("drops oldest queued live messages for lagging subscribers", async () => {
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
const stream = new OutboundStream(2);
const subscription = stream.subscribe();
stream.push(messageOne);
stream.push(messageTwo);
stream.push(messageThree);
stream.push(messageFour);
expect(await readNext(subscription.stream)).toEqual(messageOne);
expect(await readNext(subscription.stream)).toEqual(messageThree);
expect(await readNext(subscription.stream)).toEqual(messageFour);
expect(warn).toHaveBeenCalledOnce();
warn.mockRestore();
});
it("closes subscriber streams", async () => {
const stream = new OutboundStream();
const reader = stream.subscribe().stream.getReader();
stream.close();
expect(await reader.read()).toEqual({ done: true, value: undefined });
reader.releaseLock();
});
});
async function initializeConnection(connection) {
await writeInbound(connection.inboundTx, initializeRequest);
await connection.recvInitial(initializeRequest.id);
connection.startRouter();
}
async function writeInbound(stream, message) {
const writer = stream.getWriter();
try {
await writer.write(message);
}
finally {
writer.releaseLock();
}
}
async function readNext(stream) {
const reader = stream.getReader();
try {
const result = await reader.read();
if (result.done) {
throw new Error("Expected stream message");
}
return result.value;
}
finally {
reader.releaseLock();
}
}
async function readNextOrUndefined(stream) {
const reader = stream.getReader();
try {
return await Promise.race([
reader.read().then((result) => (result.done ? undefined : result.value)),
delay(50).then(() => undefined),
]);
}
finally {
reader.releaseLock();
}
}
function createDeferred() {
let resolve = () => { };
let reject = () => { };
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return { promise, resolve, reject };
}
async function withTimeout(promise, timeoutMs = 100) {
let timer;
try {
return await Promise.race([
promise,
new Promise((_, reject) => {
timer = setTimeout(() => {
reject(new Error("Timed out waiting for promise"));
}, timeoutMs);
}),
]);
}
finally {
if (timer) {
clearTimeout(timer);
}
}
}
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function flushMicrotasks() {
await Promise.resolve();
await Promise.resolve();
}
const routeShapeCheck = "connection";
void routeShapeCheck;
//# sourceMappingURL=connection.test.js.map
{"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../src/connection.test.ts"],"names":[],"mappings":"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"}
/**
* Minimal ACP affinity cookie store.
*
* This helper stores cookie name/value pairs from `Set-Cookie` response
* headers and applies them to outgoing `Cookie` request headers. It is meant
* for ACP routing affinity across reconnects, not authentication or
* authorization, and not as a general-purpose browser cookie jar: it
* intentionally does not implement domain/path matching,
* expiry, `Secure`, `HttpOnly`, or `SameSite` handling.
*/
export interface AcpCookieStore {
/** Stores cookies from response headers. */
store(headers: Headers): void;
/** Applies stored cookies to outgoing request headers. */
apply(headers: Headers): void;
/** Clears all stored cookies. */
clear(): void;
}
/** In-memory implementation of {@link AcpCookieStore}. */
export declare class MemoryAcpCookieStore implements AcpCookieStore {
private readonly cookies;
store(headers: Headers): void;
apply(headers: Headers): void;
clear(): void;
private cookieHeader;
}
/** In-memory implementation of {@link AcpCookieStore}. */
export class MemoryAcpCookieStore {
cookies = new Map();
store(headers) {
for (const value of setCookieHeaders(headers)) {
const cookie = parseSetCookie(value);
if (!cookie) {
continue;
}
this.cookies.set(cookie.name, cookie.value);
}
}
apply(headers) {
const merged = mergeCookieHeaders(this.cookieHeader(), headers.get("Cookie"));
if (merged) {
headers.set("Cookie", merged);
}
}
clear() {
this.cookies.clear();
}
cookieHeader() {
return this.cookies.size === 0
? undefined
: Array.from(this.cookies)
.map(([name, value]) => `${name}=${value}`)
.join("; ");
}
}
function setCookieHeaders(headers) {
const getSetCookie = headers.getSetCookie;
if (typeof getSetCookie === "function") {
return getSetCookie.call(headers).flatMap(splitSetCookieHeader);
}
const setCookie = headers.get("Set-Cookie");
return setCookie ? splitSetCookieHeader(setCookie) : [];
}
function splitSetCookieHeader(header) {
return header
.split(/,(?=\s*[^;,\s]+=)/)
.map((value) => value.trim())
.filter((value) => value.length > 0);
}
function parseSetCookie(header) {
const pair = header.split(";", 1)[0];
const separator = pair.indexOf("=");
if (separator <= 0) {
return undefined;
}
const name = pair.slice(0, separator).trim();
if (!name) {
return undefined;
}
return {
name,
value: pair.slice(separator + 1).trim(),
};
}
function mergeCookieHeaders(managedCookieHeader, callerCookieHeader) {
const cookies = new Map();
for (const cookie of parseCookieHeader(managedCookieHeader)) {
cookies.set(cookie.name, cookie.value);
}
for (const cookie of parseCookieHeader(callerCookieHeader ?? undefined)) {
cookies.set(cookie.name, cookie.value);
}
return cookies.size === 0
? undefined
: Array.from(cookies)
.map(([name, value]) => `${name}=${value}`)
.join("; ");
}
function parseCookieHeader(header) {
if (!header) {
return [];
}
return header
.split(";")
.map(parseCookiePair)
.filter((cookie) => cookie !== undefined);
}
function parseCookiePair(value) {
const separator = value.indexOf("=");
if (separator <= 0) {
return undefined;
}
const name = value.slice(0, separator).trim();
if (!name) {
return undefined;
}
return {
name,
value: value.slice(separator + 1).trim(),
};
}
//# sourceMappingURL=cookie-store.js.map
{"version":3,"file":"cookie-store.js","sourceRoot":"","sources":["../src/cookie-store.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { MemoryAcpCookieStore } from "./cookie-store.js";
describe("MemoryAcpCookieStore", () => {
it("stores single and multiple Set-Cookie values", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["transport=alpha; Path=/"]));
store.store(headersWithSetCookie(["route=bravo; Path=/", "affinity=charlie"]));
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBe("transport=alpha; route=bravo; affinity=charlie");
});
it("splits combined Set-Cookie headers with Expires commas", () => {
const store = new MemoryAcpCookieStore();
store.store(new Headers({
"Set-Cookie": "transport=alpha; Expires=Wed, 21 Oct 2030 07:28:00 GMT, route=bravo; Path=/",
}));
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBe("transport=alpha; route=bravo");
});
it("ignores malformed cookie headers", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie([
"missing-separator",
"=empty-name",
" =blank",
"ok=value",
]));
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBe("ok=value");
});
it("lets later cookies overwrite earlier cookies with the same name", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["route=alpha", "route=bravo"]));
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBe("route=bravo");
});
it("writes a Cookie header when managed cookies exist", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["transport=alpha"]));
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBe("transport=alpha");
});
it("merges managed cookies with caller-provided Cookie headers", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["transport=alpha", "route=bravo"]));
const headers = new Headers({ Cookie: "caller=custom" });
store.apply(headers);
expect(headers.get("Cookie")).toBe("transport=alpha; route=bravo; caller=custom");
});
it("lets caller-provided cookie values override managed duplicate names", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["transport=alpha", "route=bravo"]));
const headers = new Headers({ Cookie: "route=caller; caller=custom" });
store.apply(headers);
expect(headers.get("Cookie")).toBe("transport=alpha; route=caller; caller=custom");
});
it("clears managed cookies", () => {
const store = new MemoryAcpCookieStore();
store.store(headersWithSetCookie(["transport=alpha"]));
store.clear();
const headers = new Headers();
store.apply(headers);
expect(headers.get("Cookie")).toBeNull();
});
});
function headersWithSetCookie(values) {
const headers = new Headers();
Object.defineProperty(headers, "getSetCookie", {
value: () => values,
});
return headers;
}
//# sourceMappingURL=cookie-store.test.js.map
{"version":3,"file":"cookie-store.test.js","sourceRoot":"","sources":["../src/cookie-store.test.ts"],"names":[],"mappings":"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"}
#!/usr/bin/env node
export {};
#!/usr/bin/env node
import * as acp from "../acp.js";
import { MemoryAcpCookieStore, createHttpStream } from "../http-stream.js";
class HttpExampleClient {
async requestPermission(params) {
return {
outcome: {
outcome: "selected",
optionId: params.options[0]?.optionId ?? "allow",
},
};
}
async sessionUpdate(params) {
const update = params.update;
if (update.sessionUpdate === "agent_message_chunk") {
process.stdout.write(update.content.type === "text" ? update.content.text : "");
return;
}
console.log(`[${update.sessionUpdate}]`);
}
}
const serverUrl = process.env.ACP_HTTP_URL ?? "http://127.0.0.1:7331/acp";
const authHeaders = {
Authorization: "Bearer example-token",
};
// Keep reconnect state outside individual stream instances. Reuse this store
// across fresh streams so an external affinity layer can route reconnects.
const cookieStore = new MemoryAcpCookieStore();
let savedSessionId;
function connect() {
return {
stream: createHttpStream(serverUrl, {
headers: authHeaders,
cookieStore,
// Cookies are included by default. Use `cookies: "omit"` for stateless requests.
}),
};
}
const client = new HttpExampleClient();
const { stream } = connect();
try {
const { initialized, result } = await acp
.client({ name: "http-example-client" })
.onRequest(acp.methods.client.session.requestPermission, (ctx) => client.requestPermission(ctx.params))
.onNotification(acp.methods.client.session.update, (ctx) => client.sessionUpdate(ctx.params))
.connectWith(stream, async (ctx) => {
const initialized = await ctx.request(acp.methods.agent.initialize, {
protocolVersion: acp.PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await ctx.request(acp.methods.agent.session.new, {
cwd: process.cwd(),
mcpServers: [],
});
savedSessionId = session.sessionId;
const result = await ctx.request(acp.methods.agent.session.prompt, {
sessionId: session.sessionId,
prompt: [
{
type: "text",
text: "Hello over Streamable HTTP",
},
],
});
return { initialized, result };
});
console.log(`\nDone: ${result.stopReason}`);
console.log(`Saved session ${savedSessionId}; loadSession=${initialized.agentCapabilities?.loadSession === true}`);
// Reconnect flow sketch:
// 1. Save `sessionId`, auth headers, cwd, MCP servers, and `cookieStore`.
// 2. Create a fresh stream with the same auth headers and cookie store.
// 3. Call initialize and require `agentCapabilities.loadSession`.
// 4. Call session/load for the saved session ID.
// Production agents must authorize session/load for the authenticated user.
// ACP v1 does not replay in-flight transport messages emitted while disconnected.
// Example:
// const next = connect();
// await acp.client({ name: "http-example-client" }).connectWith(next.stream, async (ctx) => {
// await ctx.request(acp.methods.agent.initialize, { protocolVersion: acp.PROTOCOL_VERSION, clientCapabilities: {} });
// await ctx.request(acp.methods.agent.session.load, { sessionId: savedSessionId, cwd: process.cwd(), mcpServers: [] });
// });
}
finally {
await stream.writable.close();
}
//# sourceMappingURL=http-client.js.map
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/examples/http-client.ts"],"names":[],"mappings":"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"}
#!/usr/bin/env node
export {};
#!/usr/bin/env node
import { createServer } from "node:http";
import { WebSocketServer } from "ws";
import * as acp from "../acp.js";
import { createNodeHttpHandler, createNodeWebSocketUpgradeHandler, } from "../node-adapter.js";
import { AcpServer } from "../server.js";
// Illustrative durable state outside per-connection agent instances. For
// production multi-node deployments, replace this with Redis, Postgres, shared
// storage, or rely on sticky sessions with clear restart/drain semantics.
const durableSessions = new Map();
class HttpExampleAgent {
async initialize(_params) {
return {
protocolVersion: acp.PROTOCOL_VERSION,
agentCapabilities: {
loadSession: true,
},
};
}
async newSession(params) {
const sessionId = crypto.randomUUID();
durableSessions.set(sessionId, {
cwd: params.cwd,
history: [],
});
return { sessionId };
}
async loadSession(params, client) {
const session = durableSessions.get(params.sessionId);
if (!session) {
throw new Error(`Session ${params.sessionId} not found`);
}
// Production agents must authorize session/load against the authenticated
// principal before replaying durable state. This example's auth check lives
// in HTTP middleware and is intentionally minimal.
for (const update of session.history) {
await client.notify(acp.methods.client.session.update, update);
}
return {};
}
async authenticate(_params) {
return {};
}
async prompt(params, client) {
const session = durableSessions.get(params.sessionId);
if (!session) {
throw new Error(`Session ${params.sessionId} not found`);
}
const update = {
sessionId: params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `Hello from the ACP HTTP/WebSocket example server at ${session.cwd}.`,
},
},
};
session.history.push(update);
await client.notify(acp.methods.client.session.update, update);
return { stopReason: "end_turn" };
}
async cancel(_params) { }
}
const implementation = new HttpExampleAgent();
const agent = acp
.agent({ name: "http-example-agent" })
.onRequest(acp.methods.agent.initialize, (ctx) => implementation.initialize(ctx.params))
.onRequest(acp.methods.agent.session.new, (ctx) => implementation.newSession(ctx.params))
.onRequest(acp.methods.agent.session.load, (ctx) => implementation.loadSession(ctx.params, ctx.client))
.onRequest(acp.methods.agent.authenticate, (ctx) => implementation.authenticate(ctx.params))
.onRequest(acp.methods.agent.session.prompt, (ctx) => implementation.prompt(ctx.params, ctx.client))
.onNotification(acp.methods.agent.session.cancel, (ctx) => implementation.cancel(ctx.params));
const acpServer = new AcpServer({ agent });
const acpHttpHandler = createNodeHttpHandler(acpServer);
const webSocketServer = new WebSocketServer({ noServer: true });
// Use the ACP upgrade helper so the 101 response includes Acp-Connection-Id.
const acpWebSocketUpgradeHandler = createNodeWebSocketUpgradeHandler(acpServer, webSocketServer);
const port = Number.parseInt(process.env.PORT ?? "7331", 10);
const httpServer = createServer((req, res) => {
if (!isAcpPath(req.url)) {
res.writeHead(404, { "Content-Type": "text/plain" });
res.end("Not Found");
return;
}
// Put authentication or tenant-selection middleware here before routing to AcpServer.
// For example, validate `req.headers.authorization` and reject unauthorized requests.
if (!isAuthorized(req.headers.authorization)) {
res.writeHead(401, { "Content-Type": "text/plain" });
res.end("Unauthorized");
return;
}
acpHttpHandler(req, res);
});
httpServer.on("upgrade", (req, socket, head) => {
if (!isAcpPath(req.url) || !isAuthorized(req.headers.authorization)) {
socket.destroy();
return;
}
acpWebSocketUpgradeHandler(req, socket, head);
});
httpServer.listen(port, () => {
console.log(`ACP HTTP endpoint listening at http://127.0.0.1:${port}/acp`);
console.log(`ACP WebSocket endpoint listening at ws://127.0.0.1:${port}/acp`);
});
function isAcpPath(url) {
return new URL(url ?? "/", "http://127.0.0.1").pathname === "/acp";
}
function isAuthorized(authorization) {
return (authorization === undefined || authorization === "Bearer example-token");
}
//# sourceMappingURL=http-server.js.map
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/examples/http-server.ts"],"names":[],"mappings":"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"}
#!/usr/bin/env node
export {};
#!/usr/bin/env node
import { WebSocket } from "ws";
import * as acp from "../acp.js";
import { MemoryAcpCookieStore, createWebSocketStream } from "../ws-stream.js";
class WebSocketExampleClient {
async requestPermission(params) {
return {
outcome: {
outcome: "selected",
optionId: params.options[0]?.optionId ?? "allow",
},
};
}
async sessionUpdate(params) {
const update = params.update;
if (update.sessionUpdate === "agent_message_chunk") {
process.stdout.write(update.content.type === "text" ? update.content.text : "");
return;
}
console.log(`[${update.sessionUpdate}]`);
}
}
const serverUrl = process.env.ACP_WS_URL ?? "ws://127.0.0.1:7331/acp";
const authHeaders = {
Authorization: "Bearer example-token",
};
// Keep reconnect state outside individual stream instances. Browser WebSocket
// uses the platform cookie jar; Node's `ws` uses constructor headers populated
// from this store.
const cookieStore = new MemoryAcpCookieStore();
let savedSessionId;
function connect() {
return {
stream: createWebSocketStream(serverUrl, {
WebSocket: WebSocket,
headers: authHeaders,
cookieStore,
}),
};
}
const client = new WebSocketExampleClient();
const { stream } = connect();
try {
const { initialized, result } = await acp
.client({ name: "ws-example-client" })
.onRequest(acp.methods.client.session.requestPermission, (ctx) => client.requestPermission(ctx.params))
.onNotification(acp.methods.client.session.update, (ctx) => client.sessionUpdate(ctx.params))
.connectWith(stream, async (ctx) => {
const initialized = await ctx.request(acp.methods.agent.initialize, {
protocolVersion: acp.PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await ctx.request(acp.methods.agent.session.new, {
cwd: process.cwd(),
mcpServers: [],
});
savedSessionId = session.sessionId;
const result = await ctx.request(acp.methods.agent.session.prompt, {
sessionId: session.sessionId,
prompt: [
{
type: "text",
text: "Hello over WebSocket",
},
],
});
return { initialized, result };
});
console.log(`\nDone: ${result.stopReason}`);
console.log(`Saved session ${savedSessionId}; loadSession=${initialized.agentCapabilities?.loadSession === true}`);
// Reconnect flow sketch:
// 1. Save `sessionId`, auth headers, cwd, MCP servers, and `cookieStore`.
// 2. Create a fresh WebSocket stream with the same auth headers and cookie store.
// 3. Call initialize and require `agentCapabilities.loadSession`.
// 4. Call session/load for the saved session ID.
// Production agents must authorize session/load for the authenticated user.
// ACP v1 does not replay in-flight transport messages emitted while disconnected.
// Example:
// const next = connect();
// await acp.client({ name: "ws-example-client" }).connectWith(next.stream, async (ctx) => {
// await ctx.request(acp.methods.agent.initialize, { protocolVersion: acp.PROTOCOL_VERSION, clientCapabilities: {} });
// await ctx.request(acp.methods.agent.session.load, { sessionId: savedSessionId, cwd: process.cwd(), mcpServers: [] });
// });
}
finally {
await stream.writable.close();
}
//# sourceMappingURL=ws-client.js.map
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/examples/ws-client.ts"],"names":[],"mappings":"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"}
import type { AcpCookieStore } from "./cookie-store.js";
import type { Stream } from "./stream.js";
export interface HttpStreamOptions {
/** Fetch implementation to use. Defaults to `globalThis.fetch`. */
readonly fetch?: typeof globalThis.fetch;
/** Headers to include on every HTTP/SSE request. */
readonly headers?: Record<string, string>;
/** Cookie handling policy for transport requests. Defaults to `include`. */
readonly cookies?: "include" | "omit";
/**
* Caller-owned affinity cookie store to reuse across reconnects.
*
* If omitted, the SDK creates an ephemeral per-stream store and clears it
* when the stream closes/errors.
*/
readonly cookieStore?: AcpCookieStore;
}
export { MemoryAcpCookieStore } from "./cookie-store.js";
export type { AcpCookieStore } from "./cookie-store.js";
/**
* Creates an ACP Stream over Streamable HTTP.
*
* Uses POST for client messages and SSE GET streams for server messages.
* Cookies are included by default. Pass a caller-owned `AcpCookieStore` to
* retain affinity cookies across fresh streams during reconnect.
*
* ACP v1 reconnect creates a new transport connection; callers should save the
* ACP `sessionId`, create a new stream with the same auth headers/cookie store,
* call `initialize`, verify `agentCapabilities.loadSession`, then call
* `session/load`. Agents must authorize `session/load`, and ACP v1 does not
* replay in-flight transport messages emitted while disconnected.
*/
export declare function createHttpStream(serverUrl: string, options?: HttpStreamOptions): Stream;
import { isResponseMessage } from "./jsonrpc.js";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, isInitializeRequest, messageIdKey, sessionIdFromMessageParams, sessionIdFromResponseResult, } from "./protocol.js";
import { MemoryAcpCookieStore } from "./cookie-store.js";
import { parseSseStream } from "./sse.js";
export { MemoryAcpCookieStore } from "./cookie-store.js";
/**
* Creates an ACP Stream over Streamable HTTP.
*
* Uses POST for client messages and SSE GET streams for server messages.
* Cookies are included by default. Pass a caller-owned `AcpCookieStore` to
* retain affinity cookies across fresh streams during reconnect.
*
* ACP v1 reconnect creates a new transport connection; callers should save the
* ACP `sessionId`, create a new stream with the same auth headers/cookie store,
* call `initialize`, verify `agentCapabilities.loadSession`, then call
* `session/load`. Agents must authorize `session/load`, and ACP v1 does not
* replay in-flight transport messages emitted while disconnected.
*/
export function createHttpStream(serverUrl, options = {}) {
return new HttpStreamTransport(serverUrl, options).stream;
}
class HttpStreamTransport {
serverUrl;
stream;
fetchImpl;
headers;
cookiePolicy;
cookieStore;
ownsCookieStore;
abortController = new AbortController();
knownSessions = new Set();
sessionSseReady = new Map();
pendingResponseSessions = new Map();
pendingSessionRequests = new Map();
readableController;
connectionId;
isClosed = false;
writeChain = Promise.resolve();
constructor(serverUrl, options) {
this.serverUrl = serverUrl;
this.fetchImpl = resolveFetch(options.fetch);
this.headers = options.headers ?? {};
this.cookiePolicy = options.cookies ?? "include";
this.cookieStore = options.cookieStore ?? new MemoryAcpCookieStore();
this.ownsCookieStore = options.cookieStore === undefined;
this.stream = {
readable: new ReadableStream({
start: (controller) => {
this.readableController = controller;
},
cancel: () => this.close(),
}),
writable: new WritableStream({
write: (message) => {
this.writeChain = this.writeChain.then(() => this.writeMessage(message));
return this.writeChain;
},
close: () => this.close(),
abort: () => this.close(),
}),
};
}
async writeMessage(message) {
if (this.isClosed) {
throw new Error("ACP HTTP stream is closed");
}
if (!this.connectionId) {
await this.postInitialize(message);
return;
}
await this.postConnectedMessage(message);
}
async postInitialize(message) {
let cleanupConnectionId;
try {
if (!isInitializeRequest(message)) {
throw new Error("ACP HTTP stream first message must be initialize");
}
const response = await this.fetchRequest({
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
},
body: JSON.stringify(message),
signal: this.abortController.signal,
});
if (!response.ok) {
throw await httpError("ACP initialize failed", response);
}
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
if (!connectionId) {
throw new Error("ACP initialize response missing Acp-Connection-Id");
}
cleanupConnectionId = connectionId;
this.throwIfClosedDuringInitialize();
const body = await response.json();
this.throwIfClosedDuringInitialize();
if (!isResponseMessage(body)) {
throw new Error("ACP initialize response was not a JSON-RPC response");
}
const responseIdKey = messageIdKey(body.id);
const requestIdKey = "id" in message ? messageIdKey(message.id) : undefined;
if (responseIdKey !== requestIdKey) {
throw new Error("ACP initialize response id did not match initialize request");
}
this.connectionId = connectionId;
this.openConnectionSse();
this.enqueue(body);
}
catch (error) {
if (this.isClosed && cleanupConnectionId) {
await this.deleteConnection(cleanupConnectionId).catch(() => undefined);
this.clearOwnedCookieStore();
}
else {
this.errorReadable(error, cleanupConnectionId);
}
throw error;
}
}
throwIfClosedDuringInitialize() {
if (this.isClosed) {
throw new Error("ACP HTTP stream is closed");
}
}
async postConnectedMessage(message) {
const connectionId = this.connectionId;
if (!connectionId) {
throw new Error("ACP HTTP stream is not initialized");
}
const sessionId = this.sessionIdForOutboundMessage(message);
if (sessionId) {
await this.openSessionSse(sessionId);
}
const pendingSessionRequestKey = sessionId && "method" in message && "id" in message
? messageIdKey(message.id)
: undefined;
if (sessionId && pendingSessionRequestKey) {
this.pendingSessionRequests.set(pendingSessionRequestKey, sessionId);
}
try {
const response = await this.fetchRequest({
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
...(sessionId ? { [HEADER_SESSION_ID]: sessionId } : {}),
},
body: JSON.stringify(message),
signal: this.abortController.signal,
});
if (!response.ok) {
throw await httpError("ACP POST failed", response);
}
if (!("method" in message) && "id" in message) {
const key = messageIdKey(message.id);
if (key) {
this.pendingResponseSessions.delete(key);
}
}
}
catch (error) {
if (pendingSessionRequestKey) {
this.pendingSessionRequests.delete(pendingSessionRequestKey);
}
this.errorReadable(error);
throw error;
}
}
sessionIdForOutboundMessage(message) {
const paramsSessionId = sessionIdFromMessageParams(message);
if (paramsSessionId) {
return paramsSessionId;
}
if (!("id" in message) || "method" in message) {
return undefined;
}
const key = messageIdKey(message.id);
return key ? this.pendingResponseSessions.get(key) : undefined;
}
openConnectionSse() {
const connectionId = this.connectionId;
if (!connectionId) {
return;
}
void this.openSse({
[HEADER_CONNECTION_ID]: connectionId,
});
}
openSessionSse(sessionId) {
const existingReady = this.sessionSseReady.get(sessionId);
if (existingReady) {
return existingReady;
}
if (this.knownSessions.has(sessionId)) {
return Promise.resolve();
}
const connectionId = this.connectionId;
if (!connectionId) {
return Promise.resolve();
}
let isReadySettled = false;
let resolveReady = () => { };
let rejectReady = () => { };
const ready = new Promise((resolve, reject) => {
resolveReady = resolve;
rejectReady = reject;
});
const settleReady = (callback) => {
if (isReadySettled) {
return;
}
isReadySettled = true;
callback();
};
ready.catch(() => undefined);
this.knownSessions.add(sessionId);
this.sessionSseReady.set(sessionId, ready);
void this.openSse({
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
}, {
onOpen: () => {
settleReady(resolveReady);
},
onError: (error) => {
settleReady(() => {
rejectReady(error);
});
},
onClose: () => {
this.sessionSseReady.delete(sessionId);
settleReady(() => {
rejectReady(new Error("ACP session SSE stream closed before opening"));
});
},
});
return ready;
}
async openSse(headers, lifecycle = {}) {
const streamSessionId = headers[HEADER_SESSION_ID];
try {
const response = await this.fetchRequest({
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
...headers,
},
signal: this.abortController.signal,
});
if (!response.ok) {
throw await httpError("ACP SSE connection failed", response);
}
if (!response.body) {
throw new Error("ACP SSE response missing body");
}
lifecycle.onOpen?.();
for await (const message of parseSseStream(response.body)) {
if (this.isClosed) {
return;
}
const sessionId = sessionIdFromResponseResult(message);
if (sessionId) {
void this.openSessionSse(sessionId);
}
this.trackServerRequestRoute(message, headers[HEADER_SESSION_ID]);
this.trackInboundResponse(message);
this.enqueue(message);
}
this.handleSseEof(streamSessionId);
}
catch (error) {
if (this.isClosed || this.abortController.signal.aborted) {
return;
}
lifecycle.onError?.(error);
this.errorReadable(error);
}
finally {
lifecycle.onClose?.();
}
}
handleSseEof(streamSessionId) {
if (this.isClosed || this.abortController.signal.aborted) {
return;
}
if (!streamSessionId) {
this.errorReadable(new Error("ACP connection SSE stream closed"));
return;
}
this.knownSessions.delete(streamSessionId);
this.sessionSseReady.delete(streamSessionId);
if (this.hasPendingSessionRequest(streamSessionId)) {
this.errorReadable(new Error("ACP session SSE stream closed"));
}
}
trackServerRequestRoute(message, streamSessionId) {
if (!streamSessionId || !("method" in message) || !("id" in message)) {
return;
}
const key = messageIdKey(message.id);
if (key) {
this.pendingResponseSessions.set(key, streamSessionId);
}
}
trackInboundResponse(message) {
if (!isResponseMessage(message)) {
return;
}
const key = messageIdKey(message.id);
if (key) {
this.pendingSessionRequests.delete(key);
}
}
hasPendingSessionRequest(sessionId) {
for (const pendingSessionId of this.pendingSessionRequests.values()) {
if (pendingSessionId === sessionId) {
return true;
}
}
return false;
}
async fetchRequest(init) {
const response = await this.fetchImpl(this.serverUrl, {
...init,
credentials: this.cookiePolicy,
headers: this.createRequestHeaders(init.headers),
});
if (this.cookiePolicy === "include") {
this.cookieStore.store(response.headers);
}
return response;
}
createRequestHeaders(headers) {
const requestHeaders = new Headers(this.headers);
const transportHeaders = new Headers(headers);
transportHeaders.forEach((value, key) => {
requestHeaders.set(key, value);
});
if (this.cookiePolicy === "include") {
this.cookieStore.apply(requestHeaders);
}
return requestHeaders;
}
async close() {
if (this.isClosed) {
return;
}
this.isClosed = true;
try {
await this.deleteConnection();
}
finally {
this.abortController.abort();
this.clearOwnedCookieStore();
this.closeReadable();
}
}
async deleteConnection(connectionId = this.connectionId) {
if (!connectionId) {
return;
}
const response = await this.fetchRequest({
method: "DELETE",
headers: {
[HEADER_CONNECTION_ID]: connectionId,
},
});
if (!response.ok) {
throw await httpError("ACP DELETE failed", response);
}
}
clearOwnedCookieStore() {
if (this.ownsCookieStore) {
this.cookieStore.clear();
}
}
enqueue(message) {
try {
this.readableController?.enqueue(message);
}
catch (error) {
this.errorReadable(error);
}
}
errorReadable(error, connectionId = this.connectionId) {
if (this.isClosed) {
return;
}
this.isClosed = true;
this.abortController.abort();
void this.deleteConnection(connectionId)
.catch(() => undefined)
.finally(() => {
this.clearOwnedCookieStore();
});
try {
this.readableController?.error(error);
}
catch {
// The readable side may already be closed or cancelled.
}
}
closeReadable() {
try {
this.readableController?.close();
}
catch {
// The readable side may already be closed, cancelled, or errored.
}
}
}
function resolveFetch(fetchImpl) {
if (fetchImpl) {
return fetchImpl;
}
if (typeof globalThis.fetch === "function") {
return (input, init) => globalThis.fetch(input, init);
}
throw new Error("createHttpStream requires globalThis.fetch or options.fetch");
}
async function httpError(prefix, response) {
const text = await response.text().catch(() => "");
if (text) {
return new Error(`${prefix}: ${response.status} ${response.statusText}: ${text}`);
}
return new Error(`${prefix}: ${response.status} ${response.statusText}`);
}
//# sourceMappingURL=http-stream.js.map
{"version":3,"file":"http-stream.js","sourceRoot":"","sources":["../src/http-stream.ts"],"names":[],"mappings":"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"}
import { describe, expect, it, vi } from "vitest";
import { ClientSideConnection, PROTOCOL_VERSION, agent as createAgentApp, client as createClientApp, methods, } from "./acp.js";
import { MemoryAcpCookieStore, createHttpStream } from "./http-stream.js";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, } from "./protocol.js";
import { serializeSseEvent } from "./sse.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
import { startTestServer } from "./test-support/test-http-server.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 0,
method: "initialize",
params: {
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
},
};
const initializeResponse = {
jsonrpc: "2.0",
id: 0,
result: {
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
},
};
const sessionNewResponse = {
jsonrpc: "2.0",
id: 1,
result: {
sessionId: "session-1",
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 1,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
const promptRequest = {
jsonrpc: "2.0",
id: 2,
method: "session/prompt",
params: {
sessionId: "session-1",
prompt: [{ type: "text", text: "Hello" }],
},
};
const loadSessionRequest = {
jsonrpc: "2.0",
id: 3,
method: "session/load",
params: {
cwd: "/tmp",
mcpServers: [],
sessionId: "existing-session",
},
};
const permissionRequest = {
jsonrpc: "2.0",
id: 99,
method: "session/request_permission",
params: {
sessionId: "session-1",
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
options: [
{
kind: "allow_once",
name: "Allow once",
optionId: "allow",
},
],
},
};
const permissionResponse = {
jsonrpc: "2.0",
id: 99,
result: {
outcome: {
outcome: "selected",
optionId: "allow",
},
},
};
const connectionScopedServerRequest = {
jsonrpc: "2.0",
id: 99,
method: "connection/example",
params: {},
};
describe("createHttpStream", () => {
it("posts initialize with custom headers, opens connection SSE, and emits the initialize response", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
headers: {
Authorization: "Bearer token",
"X-Test-Header": "phase-5",
},
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
expect(await readMessage(reader)).toEqual(initializeResponse);
expect(controlledFetch.requests).toHaveLength(2);
const initializePost = requestAt(controlledFetch.requests, 0);
expect(initializePost.url).toBe("https://agent.example/acp");
expect(initializePost.method).toBe("POST");
expect(initializePost.headers.get("Authorization")).toBe("Bearer token");
expect(initializePost.headers.get("X-Test-Header")).toBe("phase-5");
expect(initializePost.headers.get("Content-Type")).toBe(JSON_MIME_TYPE);
expect(initializePost.headers.get(HEADER_CONNECTION_ID)).toBeNull();
expect(JSON.parse(initializePost.body)).toEqual(initializeRequest);
const connectionGet = requestAt(controlledFetch.requests, 1);
expect(connectionGet.method).toBe("GET");
expect(connectionGet.headers.get("Authorization")).toBe("Bearer token");
expect(connectionGet.headers.get("Accept")).toBe(EVENT_STREAM_MIME_TYPE);
expect(connectionGet.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(connectionGet.headers.get(HEADER_SESSION_ID)).toBeNull();
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("errors and clears local resources when initialize POST fails", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
initializeStatus: 401,
initializeBody: "expired",
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await expect(writer.write(initializeRequest)).rejects.toThrow("ACP initialize failed: 401");
expect(controlledFetch.requests).toHaveLength(1);
await flushMicrotasks();
expect(clearSpy).toHaveBeenCalledTimes(1);
await expect(reader.read()).rejects.toThrow("ACP initialize failed");
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("aborts and deletes late initialize connections when canceled during initialize POST", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const initializeResponseDeferred = createDeferred();
const requests = [];
const fetch = async (_input, init) => {
const method = init?.method ?? "GET";
const headers = new Headers(init?.headers);
requests.push({
method,
headers,
signal: init?.signal,
});
if (method === "POST" && !headers.has(HEADER_CONNECTION_ID)) {
return await initializeResponseDeferred.promise;
}
if (method === "DELETE") {
return new Response(null, { status: 202 });
}
throw new Error(`Unexpected ${method} request`);
};
const stream = createHttpStream("https://agent.example/acp", { fetch });
const writer = stream.writable.getWriter();
try {
const write = writer.write(initializeRequest);
await flushMicrotasks();
expect(requests).toHaveLength(1);
expect(requests[0].signal?.aborted).toBe(false);
stream.readable.cancel().catch(() => undefined);
await flushMicrotasks();
expect(requests[0].signal?.aborted).toBe(true);
initializeResponseDeferred.resolve(jsonResponse(initializeResponse, 200, {
[HEADER_CONNECTION_ID]: "connection-1",
...setCookieResponseHeaders(["transport=alpha; Path=/"]),
}));
await expect(write).rejects.toThrow("ACP HTTP stream is closed");
expect(requests).toHaveLength(2);
expect(requests[1].method).toBe("DELETE");
expect(requests[1].headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(requests[1].headers.get("Cookie")).toBe("transport=alpha");
expect(clearSpy).toHaveBeenCalledTimes(2);
}
finally {
clearSpy.mockRestore();
writer.releaseLock();
await closeStream(stream);
}
});
it("deletes the initialized connection when the initialize body is not a response", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
initializeResponse: {
jsonrpc: "2.0",
id: 0,
method: "session/new",
params: {},
},
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await expect(writer.write(initializeRequest)).rejects.toThrow("ACP initialize response was not a JSON-RPC response");
const deleteRequest = requestAt(controlledFetch.requests, 1);
expect(deleteRequest.method).toBe("DELETE");
expect(deleteRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(deleteRequest.headers.get("Cookie")).toBe("transport=alpha");
expect(controlledFetch.sseRequests).toHaveLength(0);
await flushMicrotasks();
expect(clearSpy).toHaveBeenCalledTimes(1);
await expect(reader.read()).rejects.toThrow("ACP initialize response was not a JSON-RPC response");
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("deletes the initialized connection when the initialize response id does not match", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
initializeResponse: {
...initializeResponse,
id: 999,
},
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await expect(writer.write(initializeRequest)).rejects.toThrow("ACP initialize response id did not match initialize request");
const deleteRequest = requestAt(controlledFetch.requests, 1);
expect(deleteRequest.method).toBe("DELETE");
expect(deleteRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(deleteRequest.headers.get("Cookie")).toBe("transport=alpha");
expect(controlledFetch.sseRequests).toHaveLength(0);
await flushMicrotasks();
expect(clearSpy).toHaveBeenCalledTimes(1);
await expect(reader.read()).rejects.toThrow("ACP initialize response id did not match initialize request");
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("opens session SSE after session creation and includes the session header on session-scoped POSTs", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.sendSse(0, sessionNewResponse);
expect(await readMessage(reader)).toEqual(sessionNewResponse);
expect(controlledFetch.requests).toHaveLength(3);
const sessionGet = requestAt(controlledFetch.requests, 2);
expect(sessionGet.method).toBe("GET");
expect(sessionGet.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(sessionGet.headers.get(HEADER_SESSION_ID)).toBe("session-1");
await writer.write(promptRequest);
const promptPost = requestAt(controlledFetch.requests, 3);
expect(promptPost.method).toBe("POST");
expect(promptPost.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(promptPost.headers.get(HEADER_SESSION_ID)).toBe("session-1");
expect(JSON.parse(promptPost.body)).toEqual(promptRequest);
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("errors the stream when the connection SSE closes cleanly", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.closeSse(0);
await expect(reader.read()).rejects.toThrow("ACP connection SSE stream closed");
}
finally {
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("waits for a reopened session SSE before posting session-scoped messages", async () => {
const reopenedSessionSseResponse = createDeferred();
const controlledFetch = createControlledFetch({
sseResponseDelays: new Map([[2, reopenedSessionSseResponse.promise]]),
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.sendSse(0, sessionNewResponse);
await readMessage(reader);
await controlledFetch.closeSse(1);
await flushMicrotasks();
const promptWrite = writer.write(promptRequest);
await flushMicrotasks();
const reopenedSessionGet = requestAt(controlledFetch.requests, 3);
expect(reopenedSessionGet.method).toBe("GET");
expect(reopenedSessionGet.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(reopenedSessionGet.headers.get(HEADER_SESSION_ID)).toBe("session-1");
expect(controlledFetch.requests).toHaveLength(4);
reopenedSessionSseResponse.resolve();
await promptWrite;
const promptPost = requestAt(controlledFetch.requests, 4);
expect(promptPost.method).toBe("POST");
expect(promptPost.headers.get(HEADER_SESSION_ID)).toBe("session-1");
}
finally {
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("errors the stream when a session SSE closes with a pending request", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.sendSse(0, sessionNewResponse);
await readMessage(reader);
await writer.write(promptRequest);
await controlledFetch.closeSse(1);
await expect(reader.read()).rejects.toThrow("ACP session SSE stream closed");
}
finally {
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("opens session SSE before posting session/load for an existing session", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await writer.write(loadSessionRequest);
const sessionGet = requestAt(controlledFetch.requests, 2);
const loadPost = requestAt(controlledFetch.requests, 3);
expect(sessionGet.method).toBe("GET");
expect(sessionGet.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(sessionGet.headers.get(HEADER_SESSION_ID)).toBe("existing-session");
expect(loadPost.method).toBe("POST");
expect(loadPost.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(loadPost.headers.get(HEADER_SESSION_ID)).toBe("existing-session");
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("includes the session header only on responses to session-scoped server requests", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.sendSse(0, sessionNewResponse);
await readMessage(reader);
await controlledFetch.sendSse(1, permissionRequest);
await readMessage(reader);
await writer.write(permissionResponse);
const responsePost = requestAt(controlledFetch.requests, 3);
expect(responsePost.method).toBe("POST");
expect(responsePost.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(responsePost.headers.get(HEADER_SESSION_ID)).toBe("session-1");
expect(JSON.parse(responsePost.body)).toEqual(permissionResponse);
await controlledFetch.sendSse(0, connectionScopedServerRequest);
await readMessage(reader);
await writer.write(permissionResponse);
const connectionResponsePost = requestAt(controlledFetch.requests, 4);
expect(connectionResponsePost.method).toBe("POST");
expect(connectionResponsePost.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(connectionResponsePost.headers.get(HEADER_SESSION_ID)).toBeNull();
expect(JSON.parse(connectionResponsePost.body)).toEqual(permissionResponse);
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("propagates cookies across initialize, SSE, session POST, and DELETE", async () => {
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
getCookies: ["route=bravo; Path=/"],
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
headers: {
Cookie: "caller=custom; transport=caller",
},
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await controlledFetch.sendSse(0, sessionNewResponse);
await readMessage(reader);
await writer.write(promptRequest);
await writer.close();
expect(requestAt(controlledFetch.requests, 0).credentials).toBe("include");
expect(requestAt(controlledFetch.requests, 0).headers.get("Cookie")).toBe("caller=custom; transport=caller");
expect(requestAt(controlledFetch.requests, 1).headers.get("Cookie")).toBe("transport=caller; caller=custom");
expect(requestAt(controlledFetch.requests, 2).headers.get("Cookie")).toBe("transport=caller; route=bravo; caller=custom");
expect(requestAt(controlledFetch.requests, 3).headers.get("Cookie")).toBe("transport=caller; route=bravo; caller=custom");
expect(requestAt(controlledFetch.requests, 4).headers.get("Cookie")).toBe("transport=caller; route=bravo; caller=custom");
expect(controlledFetch.requests.map((request) => request.credentials)).toEqual(["include", "include", "include", "include", "include"]);
}
finally {
reader.releaseLock();
writer.releaseLock();
}
});
it("omits managed cookies when cookie handling is disabled", async () => {
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
cookies: "omit",
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
expect(requestAt(controlledFetch.requests, 0).credentials).toBe("omit");
expect(requestAt(controlledFetch.requests, 1).credentials).toBe("omit");
expect(requestAt(controlledFetch.requests, 1).headers.get("Cookie")).toBeNull();
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("clears SDK-owned ephemeral cookies when the stream errors", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
getStatus: 500,
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
expect(await readMessage(reader)).toEqual(initializeResponse);
await expect(reader.read()).rejects.toThrow("ACP SSE connection failed");
expect(clearSpy).toHaveBeenCalledTimes(1);
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("preserves caller-owned cookies when the stream errors", async () => {
const cookieStore = new MemoryAcpCookieStore();
const clearSpy = vi.spyOn(cookieStore, "clear");
const firstFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
getStatus: 500,
});
const firstStream = createHttpStream("https://agent.example/acp", {
fetch: firstFetch.fetch,
cookieStore,
});
const firstWriter = firstStream.writable.getWriter();
const firstReader = firstStream.readable.getReader();
try {
await firstWriter.write(initializeRequest);
expect(await readMessage(firstReader)).toEqual(initializeResponse);
await expect(firstReader.read()).rejects.toThrow("ACP SSE connection failed");
expect(clearSpy).not.toHaveBeenCalled();
}
finally {
clearSpy.mockRestore();
firstReader.releaseLock();
firstWriter.releaseLock();
await firstStream.writable.close();
}
const secondFetch = createControlledFetch();
const secondStream = createHttpStream("https://agent.example/acp", {
fetch: secondFetch.fetch,
cookieStore,
});
const secondWriter = secondStream.writable.getWriter();
const secondReader = secondStream.readable.getReader();
try {
await secondWriter.write(initializeRequest);
await readMessage(secondReader);
expect(requestAt(secondFetch.requests, 0).headers.get("Cookie")).toBe("transport=alpha");
}
finally {
secondReader.releaseLock();
secondWriter.releaseLock();
await secondStream.writable.close();
}
});
it("preserves caller-owned cookies across separate stream instances", async () => {
const cookieStore = new MemoryAcpCookieStore();
const firstFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
});
const firstStream = createHttpStream("https://agent.example/acp", {
fetch: firstFetch.fetch,
cookieStore,
});
const firstWriter = firstStream.writable.getWriter();
const firstReader = firstStream.readable.getReader();
try {
await firstWriter.write(initializeRequest);
await readMessage(firstReader);
await firstWriter.close();
}
finally {
firstReader.releaseLock();
firstWriter.releaseLock();
}
const secondFetch = createControlledFetch();
const secondStream = createHttpStream("https://agent.example/acp", {
fetch: secondFetch.fetch,
cookieStore,
});
const secondWriter = secondStream.writable.getWriter();
const secondReader = secondStream.readable.getReader();
try {
await secondWriter.write(initializeRequest);
await readMessage(secondReader);
expect(requestAt(secondFetch.requests, 0).headers.get("Cookie")).toBe("transport=alpha");
}
finally {
secondReader.releaseLock();
secondWriter.releaseLock();
await secondStream.writable.close();
}
});
it("clears SDK-owned ephemeral cookies when the stream closes", async () => {
const firstFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
});
const firstStream = createHttpStream("https://agent.example/acp", {
fetch: firstFetch.fetch,
});
const firstWriter = firstStream.writable.getWriter();
const firstReader = firstStream.readable.getReader();
try {
await firstWriter.write(initializeRequest);
await readMessage(firstReader);
await firstWriter.close();
}
finally {
firstReader.releaseLock();
firstWriter.releaseLock();
}
const secondFetch = createControlledFetch();
const secondStream = createHttpStream("https://agent.example/acp", {
fetch: secondFetch.fetch,
});
const secondWriter = secondStream.writable.getWriter();
const secondReader = secondStream.readable.getReader();
try {
await secondWriter.write(initializeRequest);
await readMessage(secondReader);
expect(requestAt(secondFetch.requests, 0).headers.get("Cookie")).toBeNull();
}
finally {
secondReader.releaseLock();
secondWriter.releaseLock();
await secondStream.writable.close();
}
});
it("lets caller Cookie headers override caller-owned store values", async () => {
const cookieStore = new MemoryAcpCookieStore();
cookieStore.store(headersWithSetCookie(["transport=alpha", "route=bravo"]));
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
cookieStore,
headers: {
Cookie: "route=caller; caller=custom",
},
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
expect(requestAt(controlledFetch.requests, 0).headers.get("Cookie")).toBe("transport=alpha; route=caller; caller=custom");
}
finally {
reader.releaseLock();
writer.releaseLock();
await stream.writable.close();
}
});
it("sends DELETE and aborts SSE requests when closed", async () => {
const controlledFetch = createControlledFetch();
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await writer.close();
const deleteRequest = requestAt(controlledFetch.requests, 2);
expect(deleteRequest.method).toBe("DELETE");
expect(deleteRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(sseAt(controlledFetch.sseRequests, 0).signal.aborted).toBe(true);
}
finally {
reader.releaseLock();
writer.releaseLock();
}
});
it("aborts in-flight connected POSTs when closed", async () => {
const connectedPostAborted = createDeferred();
const requests = [];
const fetch = async (input, init) => {
const method = init?.method ?? "GET";
const headers = new Headers(init?.headers);
const signal = init?.signal;
requests.push({
url: String(input),
method,
headers,
body: bodyToString(init?.body),
credentials: init?.credentials,
signal,
});
if (method === "POST" && !headers.has(HEADER_CONNECTION_ID)) {
return jsonResponse(initializeResponse, 200, {
[HEADER_CONNECTION_ID]: "connection-1",
});
}
if (method === "GET") {
return sseResponse(signal);
}
if (method === "POST" && headers.has(HEADER_CONNECTION_ID)) {
return await new Promise((_resolve, reject) => {
signal?.addEventListener("abort", () => {
connectedPostAborted.resolve();
reject(new Error("connected POST aborted"));
}, { once: true });
});
}
if (method === "DELETE") {
return new Response(null, { status: 202 });
}
throw new Error(`Unexpected ${method} request`);
};
const stream = createHttpStream("https://agent.example/acp", { fetch });
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
const write = writer.write(sessionNewRequest);
await flushMicrotasks();
const postRequest = requestAt(requests, 2);
expect(postRequest.method).toBe("POST");
expect(postRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(postRequest.signal?.aborted).toBe(false);
const cancel = reader.cancel();
await connectedPostAborted.promise;
expect(postRequest.signal?.aborted).toBe(true);
await expect(write).rejects.toThrow("connected POST aborted");
await cancel;
const deleteRequest = requestAt(requests, 3);
expect(deleteRequest.method).toBe("DELETE");
expect(deleteRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
}
finally {
writer.releaseLock();
await closeStream(stream);
}
});
it("errors and tears down local resources when connected POST fails", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
postStatus: 401,
postBody: "expired",
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await expect(writer.write(sessionNewRequest)).rejects.toThrow("ACP POST failed: 401");
const deleteRequest = requestAt(controlledFetch.requests, 3);
expect(deleteRequest.method).toBe("DELETE");
expect(deleteRequest.headers.get(HEADER_CONNECTION_ID)).toBe("connection-1");
expect(deleteRequest.headers.get("Cookie")).toBe("transport=alpha");
await flushMicrotasks();
expect(sseAt(controlledFetch.sseRequests, 0).signal.aborted).toBe(true);
expect(clearSpy).toHaveBeenCalledTimes(1);
await expect(reader.read()).rejects.toThrow("ACP POST failed");
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("cleans up local resources when DELETE rejects during close", async () => {
const clearSpy = vi.spyOn(MemoryAcpCookieStore.prototype, "clear");
const controlledFetch = createControlledFetch({
initializeCookies: ["transport=alpha; Path=/"],
deleteError: new Error("Network dropped"),
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await expect(writer.close()).rejects.toThrow("Network dropped");
expect(sseAt(controlledFetch.sseRequests, 0).signal.aborted).toBe(true);
expect(clearSpy).toHaveBeenCalledTimes(1);
expect((await reader.read()).done).toBe(true);
}
finally {
clearSpy.mockRestore();
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("propagates DELETE failures from readable cancel", async () => {
const controlledFetch = createControlledFetch({
deleteError: new Error("Network dropped"),
});
const stream = createHttpStream("https://agent.example/acp", {
fetch: controlledFetch.fetch,
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
await writer.write(initializeRequest);
await readMessage(reader);
await expect(reader.cancel()).rejects.toThrow("Network dropped");
expect(sseAt(controlledFetch.sseRequests, 0).signal.aborted).toBe(true);
}
finally {
reader.releaseLock();
writer.releaseLock();
await closeStream(stream);
}
});
it("runs initialize, newSession, and prompt through ClientSideConnection", async () => {
const updates = [];
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 2 }));
const stream = createHttpStream(server.url);
const conn = new ClientSideConnection(() => createTestClient({ updates }), stream);
try {
expect(await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
})).toMatchObject({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: { loadSession: false },
});
const session = await conn.newSession({ cwd: "/tmp", mcpServers: [] });
expect(session.sessionId).toMatch(/^[0-9a-f-]{36}$/);
await expect(conn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
})).resolves.toEqual({ stopReason: "end_turn" });
expect(updates).toHaveLength(2);
expect(updates).toMatchObject([
{
sessionId: session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-1" },
},
},
{
sessionId: session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-2" },
},
},
]);
}
finally {
await closeStream(stream);
await server.close();
}
});
it("runs initialize, newSession, and prompt through a client app", async () => {
const updates = [];
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 2 }));
const stream = createHttpStream(server.url);
try {
const result = await createClientApp({ name: "http-app-client" })
.onNotification(methods.client.session.update, (c) => {
updates.push(c.params);
})
.connectWith(stream, async (agent) => {
const initialized = await agent.request(methods.agent.initialize, {
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await agent.request(methods.agent.session.new, {
cwd: "/tmp",
mcpServers: [],
});
const prompt = await agent.request(methods.agent.session.prompt, {
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
});
return { initialized, prompt, session };
});
expect(result.initialized).toMatchObject({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: { loadSession: false },
});
expect(result.session.sessionId).toMatch(/^[0-9a-f-]{36}$/);
expect(result.prompt).toEqual({ stopReason: "end_turn" });
expect(updates).toMatchObject([
{
sessionId: result.session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-1" },
},
},
{
sessionId: result.session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-2" },
},
},
]);
}
finally {
await closeStream(stream);
await server.close();
}
});
it("round-trips permission requests through ClientSideConnection", async () => {
const updates = [];
const permissionRequests = [];
const server = await startTestServer(() => createTestAgentApp({ enablePermission: true }));
const stream = createHttpStream(server.url);
const conn = new ClientSideConnection(() => createTestClient({ updates, permissionRequests }), stream);
try {
await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await conn.newSession({ cwd: "/tmp", mcpServers: [] });
await expect(conn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
})).resolves.toEqual({ stopReason: "end_turn" });
expect(permissionRequests).toHaveLength(1);
expect(permissionRequests[0]).toMatchObject({
sessionId: session.sessionId,
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
});
expect(updates).toEqual(expect.arrayContaining([
expect.objectContaining({
sessionId: session.sessionId,
update: expect.objectContaining({
sessionUpdate: "agent_message_chunk",
content: expect.objectContaining({
text: "permission-selected-allow",
}),
}),
}),
]));
}
finally {
await closeStream(stream);
await server.close();
}
});
it("loads durable sessions after an HTTP reconnect", async () => {
const durableSessions = new Map();
const connectionIds = [];
const fetch = recordInitializeConnectionIds(connectionIds);
const server = await startTestServer(() => createDurableSessionAgent(durableSessions));
try {
const firstUpdates = [];
const firstStream = createHttpStream(server.url, { fetch });
const firstConn = new ClientSideConnection(() => createTestClient({ updates: firstUpdates }), firstStream);
const initialized = await firstConn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
expect(initialized.agentCapabilities?.loadSession).toBe(true);
const session = await firstConn.newSession({
cwd: "/tmp",
mcpServers: [],
});
await expect(firstConn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Remember this" }],
})).resolves.toEqual({ stopReason: "end_turn" });
await waitForUpdates(firstUpdates, 1);
await closeStream(firstStream);
expect(durableSessions.has(session.sessionId)).toBe(true);
const secondUpdates = [];
const secondStream = createHttpStream(server.url, { fetch });
const secondConn = new ClientSideConnection(() => createTestClient({ updates: secondUpdates }), secondStream);
const reinitialized = await secondConn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
expect(reinitialized.agentCapabilities?.loadSession).toBe(true);
// Production agents must authorize session/load against the authenticated
// principal. This SDK transport test omits auth because there is no
// generic auth layer in the SDK.
await expect(secondConn.loadSession({
sessionId: session.sessionId,
cwd: "/tmp",
mcpServers: [],
})).resolves.toEqual({});
await waitForUpdates(secondUpdates, firstUpdates.length);
await closeStream(secondStream);
expect(connectionIds).toHaveLength(2);
expect(connectionIds[0]).not.toBe(connectionIds[1]);
expect(secondUpdates).toEqual(firstUpdates);
}
finally {
await server.close();
}
});
it("keeps multiple sessions isolated through the SDK client abstraction", async () => {
const updates = [];
const server = await startTestServer();
const stream = createHttpStream(server.url);
const conn = new ClientSideConnection(() => createTestClient({ updates }), stream);
try {
await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const firstSession = await conn.newSession({
cwd: "/tmp",
mcpServers: [],
});
const secondSession = await conn.newSession({
cwd: "/tmp/other",
mcpServers: [],
});
await Promise.all([
conn.prompt({
sessionId: firstSession.sessionId,
prompt: [{ type: "text", text: "First" }],
}),
conn.prompt({
sessionId: secondSession.sessionId,
prompt: [{ type: "text", text: "Second" }],
}),
]);
expect(updates).toEqual(expect.arrayContaining([
expect.objectContaining({ sessionId: firstSession.sessionId }),
expect.objectContaining({ sessionId: secondSession.sessionId }),
]));
expect(updates.filter((update) => update.sessionId === firstSession.sessionId)).toHaveLength(1);
expect(updates.filter((update) => update.sessionId === secondSession.sessionId)).toHaveLength(1);
}
finally {
await closeStream(stream);
await server.close();
}
});
});
function createDurableSessionAgent(sessions) {
return createAgentApp({ name: "durable-session-agent" })
.onRequest(methods.agent.initialize, () => ({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: true,
},
}))
.onRequest(methods.agent.session.new, (c) => {
const sessionId = globalThis.crypto.randomUUID();
sessions.set(sessionId, {
cwd: c.params.cwd,
history: [],
});
return { sessionId };
})
.onRequest(methods.agent.session.load, async (c) => {
const session = sessions.get(c.params.sessionId);
if (!session) {
throw new Error(`Unknown durable session: ${c.params.sessionId}`);
}
for (const update of session.history) {
await c.client.notify(methods.client.session.update, update);
}
return {};
})
.onRequest(methods.agent.session.prompt, async (c) => {
const session = sessions.get(c.params.sessionId);
if (!session) {
throw new Error(`Unknown durable session: ${c.params.sessionId}`);
}
const update = {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `durable-history:${session.cwd}`,
},
},
};
session.history.push(update);
await c.client.notify(methods.client.session.update, update);
return { stopReason: "end_turn" };
})
.onRequest(methods.agent.authenticate, () => ({}))
.onNotification(methods.agent.session.cancel, () => { });
}
function recordInitializeConnectionIds(connectionIds) {
return async (input, init) => {
const response = await globalThis.fetch(input, init);
const headers = new Headers(init?.headers);
if (init?.method === "POST" && !headers.has(HEADER_CONNECTION_ID)) {
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
if (connectionId) {
connectionIds.push(connectionId);
}
}
return response;
};
}
function createControlledFetch(options = {}) {
const requests = [];
const sseRequests = [];
const encoder = new TextEncoder();
return {
requests,
sseRequests,
fetch: async (input, init) => {
const method = init?.method ?? "GET";
const headers = new Headers(init?.headers);
requests.push({
url: String(input),
method,
headers,
body: bodyToString(init?.body),
credentials: init?.credentials,
signal: init?.signal,
});
if (method === "POST" && !headers.has(HEADER_CONNECTION_ID)) {
const status = options.initializeStatus ?? 200;
if (status !== 200) {
return new Response(options.initializeBody ?? null, {
status,
headers: setCookieResponseHeaders(options.initializeCookies),
});
}
return jsonResponse(options.initializeResponse ?? initializeResponse, 200, {
[HEADER_CONNECTION_ID]: "connection-1",
...setCookieResponseHeaders(options.initializeCookies),
});
}
if (method === "DELETE" && options.deleteError) {
throw options.deleteError;
}
if (method === "POST" &&
headers.has(HEADER_CONNECTION_ID) &&
options.postStatus !== undefined) {
return new Response(options.postBody ?? null, {
status: options.postStatus,
});
}
if (method === "POST" || method === "DELETE") {
return new Response(null, { status: 202 });
}
if (method === "GET") {
const status = options.getStatus ?? 200;
if (status !== 200) {
return new Response("SSE failed", {
status,
headers: setCookieResponseHeaders(options.getCookies),
});
}
const sseIndex = sseRequests.length;
await options.sseResponseDelays?.get(sseIndex);
const stream = new TransformStream();
const writer = stream.writable.getWriter();
const signal = init?.signal;
if (signal) {
signal.addEventListener("abort", () => {
void writer.close().catch(() => undefined);
});
}
sseRequests.push({
signal: signal ?? new AbortController().signal,
writer,
});
return new Response(stream.readable, {
status: 200,
headers: {
"Content-Type": EVENT_STREAM_MIME_TYPE,
...setCookieResponseHeaders(options.getCookies),
},
});
}
return new Response("Unexpected method", { status: 405 });
},
sendSse: async (index, message) => {
await sseAt(sseRequests, index).writer.write(encoder.encode(serializeSseEvent(message)));
},
closeSse: async (index) => {
await sseAt(sseRequests, index).writer.close();
},
};
}
function createTestClient(state) {
return {
requestPermission: (params) => {
state.permissionRequests?.push(params);
return Promise.resolve({
outcome: {
outcome: "selected",
optionId: "allow",
},
});
},
sessionUpdate: (params) => {
state.updates.push(params);
return Promise.resolve();
},
};
}
async function closeStream(stream) {
await stream.writable.close().catch(() => undefined);
}
async function flushMicrotasks() {
await Promise.resolve();
await Promise.resolve();
}
function createDeferred() {
let resolve = () => { };
let reject = () => { };
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return { promise, resolve, reject };
}
async function readMessage(reader) {
const result = await reader.read();
if (result.done) {
throw new Error("Expected a message");
}
return result.value;
}
async function waitForUpdates(updates, count) {
const deadline = Date.now() + 1_000;
while (updates.length < count) {
if (Date.now() > deadline) {
throw new Error(`Timed out waiting for ${count} session updates`);
}
await new Promise((resolve) => setTimeout(resolve, 1));
}
}
function requestAt(requests, index) {
const request = requests[index];
if (!request) {
throw new Error(`Expected request at index ${index}`);
}
return request;
}
function sseAt(requests, index) {
const request = requests[index];
if (!request) {
throw new Error(`Expected SSE request at index ${index}`);
}
return request;
}
function bodyToString(body) {
return typeof body === "string" ? body : "";
}
function jsonResponse(body, status, headers) {
return new Response(JSON.stringify(body), {
status,
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
});
}
function sseResponse(signal) {
const stream = new TransformStream();
const writer = stream.writable.getWriter();
signal?.addEventListener("abort", () => {
void writer.close().catch(() => undefined);
});
return new Response(stream.readable, {
status: 200,
headers: {
"Content-Type": EVENT_STREAM_MIME_TYPE,
},
});
}
function headersWithSetCookie(values) {
const headers = new Headers();
Object.defineProperty(headers, "getSetCookie", {
value: () => values,
});
return headers;
}
function setCookieResponseHeaders(cookies) {
return cookies ? { "Set-Cookie": cookies.join(", ") } : {};
}
//# sourceMappingURL=http-stream.test.js.map
{"version":3,"file":"http-stream.test.js","sourceRoot":"","sources":["../src/http-stream.test.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { isJsonRpcMessage } from "./jsonrpc.js";
describe("JSON-RPC envelope validation", () => {
it.each([
{ jsonrpc: "2.0", method: "initialized" },
{ jsonrpc: "2.0", id: 1, method: "initialize" },
{ jsonrpc: "2.0", id: "request-1", result: null },
{
jsonrpc: "2.0",
id: null,
error: {
code: -32603,
message: "Internal error",
data: { retry: false },
},
},
])("accepts valid JSON-RPC messages: %o", (message) => {
expect(isJsonRpcMessage(message)).toBe(true);
});
it.each([
{ jsonrpc: "2.0", id: 1 },
{ jsonrpc: "2.0", id: {}, result: true },
{ jsonrpc: "2.0", id: Number.NaN, result: true },
{ jsonrpc: "2.0", id: Number.POSITIVE_INFINITY, result: true },
{
jsonrpc: "2.0",
id: 1,
result: true,
error: { code: -32603, message: "Internal error" },
},
{ jsonrpc: "2.0", id: 1, error: { code: "-32603", message: "Error" } },
{ jsonrpc: "2.0", id: 1, error: { code: -32603 } },
{ jsonrpc: "2.0", method: "initialize", id: {} },
])("rejects malformed JSON-RPC messages: %o", (message) => {
expect(isJsonRpcMessage(message)).toBe(false);
});
});
//# sourceMappingURL=jsonrpc.test.js.map
{"version":3,"file":"jsonrpc.test.js","sourceRoot":"","sources":["../src/jsonrpc.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,IAAI,CAAC;QACN,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;QACzC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE;QAC/C,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;QACjD;YACE,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,IAAI;YACR,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,gBAAgB;gBACzB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aACvB;SACF;KACF,CAAC,CAAC,qCAAqC,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE;QACzB,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QACxC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAChD,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9D;YACE,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE;SACnD;QACD,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACtE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE;KACjD,CAAC,CAAC,yCAAyC,EAAE,CAAC,OAAO,EAAE,EAAE;QACxD,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
import type { IncomingMessage, ServerResponse } from "node:http";
import type { Duplex } from "node:stream";
import type { AcpServer } from "./server.js";
import type { WebSocketServerSocket } from "./ws-server.js";
type NodeWebSocketHeadersListener = (headers: string[], request: IncomingMessage) => void;
export interface NodeWebSocketUpgradeServer {
on(event: "headers", listener: NodeWebSocketHeadersListener): void;
off(event: "headers", listener: NodeWebSocketHeadersListener): void;
handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer, callback: (webSocket: WebSocketServerSocket) => void): void;
}
export declare function createNodeHttpHandler(server: AcpServer): (req: IncomingMessage, res: ServerResponse) => void;
export declare function createNodeWebSocketUpgradeHandler(server: AcpServer, webSocketServer: NodeWebSocketUpgradeServer): (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
export {};
import { HEADER_CONNECTION_ID } from "./protocol.js";
export function createNodeHttpHandler(server) {
return (req, res) => {
void handleNodeRequest(server, req, res);
};
}
export function createNodeWebSocketUpgradeHandler(server, webSocketServer) {
return (req, socket, head) => {
let upgrade;
let hasAccepted = false;
const cleanup = () => {
webSocketServer.off("headers", onHeaders);
socket.off("close", onUpgradeFailed);
socket.off("error", onUpgradeFailed);
};
const onHeaders = (headers, request) => {
if (request !== req || !upgrade) {
return;
}
headers.push(`${HEADER_CONNECTION_ID}: ${upgrade.connectionId}`);
};
const onUpgradeFailed = () => {
if (hasAccepted) {
return;
}
cleanup();
upgrade?.reject();
};
try {
upgrade = server.prepareWebSocketUpgrade();
webSocketServer.on("headers", onHeaders);
socket.once("close", onUpgradeFailed);
socket.once("error", onUpgradeFailed);
webSocketServer.handleUpgrade(req, socket, head, (webSocket) => {
hasAccepted = true;
cleanup();
upgrade?.accept(webSocket);
});
}
catch (error) {
cleanup();
upgrade?.reject();
destroyUpgradeSocket(socket, error);
}
};
}
async function handleNodeRequest(server, req, res) {
const requestAbort = nodeRequestAbortSignal(req, res);
try {
await writeNodeResponse(res, await server.handleRequest(await toWebRequest(req, requestAbort.signal)));
}
catch (error) {
if (!res.headersSent) {
res.statusCode = 500;
res.setHeader("Content-Type", "text/plain");
}
res.end(error instanceof Error ? error.message : "Internal Server Error");
}
finally {
requestAbort.cleanup();
}
}
function destroyUpgradeSocket(socket, error) {
socket.destroy(error instanceof Error ? error : undefined);
}
function nodeRequestAbortSignal(req, res) {
const abortController = new AbortController();
let isFinished = false;
const onFinish = () => {
isFinished = true;
};
const onClose = () => {
if (!isFinished) {
abortController.abort(new Error("Node HTTP response closed"));
}
};
req.once("aborted", onClose);
res.once("finish", onFinish);
res.once("close", onClose);
return {
signal: abortController.signal,
cleanup: () => {
req.off("aborted", onClose);
res.off("finish", onFinish);
res.off("close", onClose);
},
};
}
async function toWebRequest(req, signal) {
return new Request(nodeRequestUrl(req), {
method: req.method ?? "GET",
headers: nodeHeaders(req),
body: hasRequestBody(req) ? await readRequestBody(req) : undefined,
signal,
});
}
function hasRequestBody(req) {
return req.method !== "GET" && req.method !== "HEAD";
}
async function readRequestBody(req) {
const decoder = new TextDecoder();
let body = "";
for await (const chunk of req) {
if (typeof chunk === "string") {
body += decoder.decode();
body += chunk;
continue;
}
body += decoder.decode(chunk, { stream: true });
}
return body + decoder.decode();
}
function nodeRequestUrl(req) {
const host = req.headers.host ?? "localhost";
return `http://${host}${req.url ?? "/"}`;
}
function nodeHeaders(req) {
const headers = new Headers();
for (const [name, value] of Object.entries(req.headers)) {
if (Array.isArray(value)) {
for (const item of value) {
headers.append(name, item);
}
continue;
}
if (value !== undefined) {
headers.set(name, value);
}
}
return headers;
}
async function writeNodeResponse(res, response) {
res.statusCode = response.status;
writeNodeHeaders(res, response.headers);
res.flushHeaders();
const responseBody = response.body;
if (!responseBody) {
res.end();
return;
}
const reader = responseBody.getReader();
let cancelReader;
const onClose = () => {
cancelReader = reader
.cancel(new NodeResponseClosedError())
.catch(() => undefined);
};
res.once("close", onClose);
try {
while (true) {
const result = await reader.read();
if (result.done) {
res.off("close", onClose);
if (!isNodeResponseClosed(res)) {
res.end();
}
return;
}
await writeChunk(res, result.value);
}
}
catch (error) {
if (error instanceof NodeResponseClosedError) {
return;
}
throw error;
}
finally {
res.off("close", onClose);
await cancelReader;
reader.releaseLock();
}
}
function writeNodeHeaders(res, headers) {
const setCookieHeaders = getSetCookieHeaders(headers);
const fallbackSetCookieHeaders = [];
headers.forEach((value, name) => {
if (name.toLowerCase() === "set-cookie") {
if (!setCookieHeaders) {
fallbackSetCookieHeaders.push(value);
}
return;
}
res.setHeader(name, value);
});
const cookieHeaders = setCookieHeaders ?? fallbackSetCookieHeaders;
if (cookieHeaders.length > 0) {
res.setHeader("Set-Cookie", cookieHeaders);
}
}
function getSetCookieHeaders(headers) {
const getSetCookie = headers.getSetCookie;
return typeof getSetCookie === "function"
? getSetCookie.call(headers)
: undefined;
}
function writeChunk(res, chunk) {
return new Promise((resolve, reject) => {
let isSettled = false;
const settle = (callback) => {
if (isSettled) {
return;
}
isSettled = true;
res.off("close", onClose);
res.off("drain", onDrain);
res.off("error", onError);
callback();
};
const onError = (error) => {
settle(() => {
reject(error);
});
};
const onDrain = () => {
settle(resolve);
};
const onClose = () => {
settle(() => {
reject(new NodeResponseClosedError());
});
};
if (isNodeResponseClosed(res)) {
reject(new NodeResponseClosedError());
return;
}
res.once("close", onClose);
res.once("error", onError);
if (res.write(chunk)) {
settle(resolve);
return;
}
res.once("drain", onDrain);
});
}
function isNodeResponseClosed(res) {
return res.destroyed || res.writableEnded;
}
class NodeResponseClosedError extends Error {
constructor() {
super("Node HTTP response closed");
}
}
//# sourceMappingURL=node-adapter.js.map
{"version":3,"file":"node-adapter.js","sourceRoot":"","sources":["../src/node-adapter.ts"],"names":[],"mappings":"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"}
import http from "node:http";
import { EventEmitter } from "node:events";
import { describe, expect, it } from "vitest";
import { AcpServer } from "./server.js";
import { createNodeHttpHandler, createNodeWebSocketUpgradeHandler, } from "./node-adapter.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
describe("createNodeHttpHandler", () => {
it("forwards method, URL, headers, and body to AcpServer.handleRequest", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const seenRequests = [];
const seenBodies = [];
acpServer.handleRequest = async (req) => {
seenRequests.push(req);
seenBodies.push(await req.text());
return new Response("created", {
status: 201,
headers: {
"X-Adapter-Test": "ok",
},
});
};
const server = await startNodeServer(acpServer);
try {
const response = await fetch(`${server.url}/acp?hello=world`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Client-Test": "forwarded",
},
body: JSON.stringify({ ok: true }),
});
expect(response.status).toBe(201);
expect(response.headers.get("X-Adapter-Test")).toBe("ok");
expect(await response.text()).toBe("created");
expect(seenRequests).toHaveLength(1);
expect(seenRequests[0]?.method).toBe("POST");
expect(seenRequests[0]?.url).toBe(`${server.url}/acp?hello=world`);
expect(seenRequests[0]?.headers.get("Content-Type")).toBe("application/json");
expect(seenRequests[0]?.headers.get("X-Client-Test")).toBe("forwarded");
expect(seenBodies).toEqual([JSON.stringify({ ok: true })]);
}
finally {
await server.close();
}
});
it("aborts forwarded requests when the Node response closes before finishing", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const seenRequest = createDeferred();
const pendingResponse = createDeferred();
const response = new CapturingServerResponse();
acpServer.handleRequest = (req) => {
seenRequest.resolve(req);
return pendingResponse.promise;
};
createNodeHttpHandler(acpServer)(fakeRequest(), response);
const request = await seenRequest.promise;
expect(request.signal.aborted).toBe(false);
response.emit("close");
expect(request.signal.aborted).toBe(true);
pendingResponse.resolve(new Response("closed", { status: 499 }));
await response.finished;
expect(response.statusCode).toBe(499);
});
it("streams response bodies to ServerResponse", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
acpServer.handleRequest = () => Promise.resolve(new Response(new ReadableStream({
start(controller) {
const encoder = new TextEncoder();
controller.enqueue(encoder.encode("data: one\n\n"));
controller.enqueue(encoder.encode("data: two\n\n"));
controller.close();
},
}), {
status: 200,
headers: {
"Content-Type": "text/event-stream",
},
}));
const server = await startNodeServer(acpServer);
try {
const response = await fetch(server.url, { method: "POST" });
expect(response.status).toBe(200);
expect(response.headers.get("Content-Type")).toContain("text/event-stream");
expect(await response.text()).toBe("data: one\n\ndata: two\n\n");
}
finally {
await server.close();
}
});
it("handles empty response bodies", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
acpServer.handleRequest = () => Promise.resolve(new Response(null, {
status: 202,
headers: {
"X-Empty-Body": "yes",
},
}));
const server = await startNodeServer(acpServer);
try {
const response = await fetch(server.url, { method: "POST" });
expect(response.status).toBe(202);
expect(response.headers.get("X-Empty-Body")).toBe("yes");
expect(await response.text()).toBe("");
}
finally {
await server.close();
}
});
it("preserves multiple Set-Cookie response headers", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
acpServer.handleRequest = () => {
const headers = new Headers({
"X-Adapter-Test": "cookies",
});
headers.append("Set-Cookie", "transport=alpha; Path=/");
headers.append("Set-Cookie", "route=bravo; Path=/");
return Promise.resolve(new Response("cookies", {
status: 200,
headers,
}));
};
const server = await startNodeServer(acpServer);
try {
const response = await rawHttpRequest(server.url);
expect(response.statusCode).toBe(200);
expect(response.headers["x-adapter-test"]).toBe("cookies");
expect(response.headers["set-cookie"]).toEqual([
"transport=alpha; Path=/",
"route=bravo; Path=/",
]);
expect(response.body).toBe("cookies");
}
finally {
await server.close();
}
});
it("decodes request bodies across split UTF-8 chunks", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const seenBodies = [];
const response = new CapturingServerResponse();
const body = JSON.stringify({ prompt: "split 🚀 path" });
const bodyBytes = new TextEncoder().encode(body);
const splitIndex = new TextEncoder().encode(body.slice(0, body.indexOf("🚀"))).length;
acpServer.handleRequest = async (req) => {
seenBodies.push(await req.text());
return new Response("ok");
};
createNodeHttpHandler(acpServer)(fakeRequest({
method: "POST",
headers: {
"content-type": "application/json",
},
bodyChunks: [
bodyBytes.slice(0, splitIndex + 1),
bodyBytes.slice(splitIndex + 1),
],
}), response);
await response.finished;
expect(response.statusCode).toBe(200);
expect(seenBodies).toEqual([body]);
});
it("cancels streaming response bodies when the Node response closes while backpressured", async () => {
const acpServer = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const responseCancelled = createDeferred();
const response = new BackpressuredServerResponse();
acpServer.handleRequest = () => Promise.resolve(new Response(new ReadableStream({
start(controller) {
controller.enqueue(new TextEncoder().encode("data: one\n\n"));
},
cancel() {
responseCancelled.resolve();
},
}), {
status: 200,
headers: {
"Content-Type": "text/event-stream",
},
}));
createNodeHttpHandler(acpServer)(fakeRequest(), response);
await response.wroteChunk;
response.close();
await responseCancelled.promise;
await flushMicrotasks();
expect(response.ended).toBe(false);
});
});
describe("createNodeWebSocketUpgradeHandler", () => {
it("destroys the upgrade socket when WebSocket preparation throws", async () => {
const error = new Error("factory failed");
const acpServer = new AcpServer({
createAgent: () => {
throw error;
},
});
const webSocketServer = new FakeNodeWebSocketUpgradeServer();
const socket = new FakeUpgradeSocket();
const handler = createNodeWebSocketUpgradeHandler(acpServer, webSocketServer);
try {
expect(() => handler(fakeRequest(), socket, Buffer.alloc(0))).not.toThrow();
expect(webSocketServer.handleUpgradeCalls).toBe(0);
expect(socket.destroyed).toBe(true);
expect(socket.destroyError).toBe(error);
}
finally {
await acpServer.close();
}
});
});
class FakeNodeWebSocketUpgradeServer {
handleUpgradeCalls = 0;
on(_event, _listener) { }
off(_event, _listener) { }
handleUpgrade(_req, _socket, _head, _callback) {
this.handleUpgradeCalls += 1;
}
}
class FakeUpgradeSocket extends EventEmitter {
destroyed = false;
destroyError;
destroy(error) {
this.destroyed = true;
this.destroyError = error;
this.emit("close");
return this;
}
}
class CapturingServerResponse extends EventEmitter {
statusCode = 200;
headersSent = false;
destroyed = false;
writableEnded = false;
chunks = [];
finishDeferred = createDeferred();
finished = this.finishDeferred.promise;
setHeader() { }
flushHeaders() {
this.headersSent = true;
}
write(chunk) {
this.chunks.push(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8"));
return true;
}
end(chunk) {
if (chunk !== undefined) {
this.write(chunk);
}
this.writableEnded = true;
this.finishDeferred.resolve();
}
}
class BackpressuredServerResponse extends EventEmitter {
statusCode = 200;
headersSent = false;
destroyed = false;
writableEnded = false;
ended = false;
writeDeferred = createDeferred();
wroteChunk = this.writeDeferred.promise;
setHeader() { }
flushHeaders() {
this.headersSent = true;
}
write() {
this.writeDeferred.resolve();
return false;
}
end() {
this.ended = true;
this.writableEnded = true;
}
close() {
this.destroyed = true;
this.emit("close");
}
}
function fakeRequest(options = {}) {
const request = Object.assign(new EventEmitter(), {
method: options.method ?? "GET",
url: "/acp",
headers: {
host: "127.0.0.1",
...options.headers,
},
});
Object.assign(request, {
async *[Symbol.asyncIterator]() {
for (const chunk of options.bodyChunks ?? []) {
yield chunk;
}
},
});
return request;
}
function createDeferred() {
let resolve = () => { };
let reject = () => { };
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return { promise, resolve, reject };
}
async function flushMicrotasks() {
await Promise.resolve();
await Promise.resolve();
}
async function startNodeServer(acpServer) {
const server = http.createServer(createNodeHttpHandler(acpServer));
await new Promise((resolve, reject) => {
const onError = (error) => {
server.off("listening", onListening);
reject(error);
};
const onListening = () => {
server.off("error", onError);
resolve();
};
server.once("error", onError);
server.once("listening", onListening);
server.listen(0, "127.0.0.1");
});
const address = server.address();
if (typeof address !== "object" || address === null) {
throw new Error("Node test server did not bind to a TCP port");
}
return {
url: `http://127.0.0.1:${address.port}`,
close: () => new Promise((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
return;
}
resolve();
});
}),
};
}
async function rawHttpRequest(url) {
return new Promise((resolve, reject) => {
const req = http.get(url, (response) => {
let body = "";
response.setEncoding("utf8");
response.on("data", (chunk) => {
body += chunk;
});
response.on("end", () => {
resolve({
statusCode: response.statusCode,
headers: response.headers,
body,
});
});
});
req.on("error", reject);
});
}
//# sourceMappingURL=node-adapter.test.js.map
{"version":3,"file":"node-adapter.test.js","sourceRoot":"","sources":["../src/node-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAsBlE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,YAAY,GAAc,EAAE,CAAC;QACnC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,SAAS,CAAC,aAAa,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE;gBAC7B,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACP,gBAAgB,EAAE,IAAI;iBACvB;aACF,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,kBAAkB,EAAE;gBAC5D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,WAAW;iBAC7B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;aACnC,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC;YACnE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CACvD,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxE,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,EAAW,CAAC;QAC9C,MAAM,eAAe,GAAG,cAAc,EAAY,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAE/C,SAAS,CAAC,aAAa,GAAG,CAAC,GAAG,EAAE,EAAE;YAChC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,eAAe,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;QAEF,qBAAqB,CAAC,SAAS,CAAC,CAC9B,WAAW,EAAE,EACb,QAAqC,CACtC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,eAAe,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,CAAC,QAAQ,CAAC;QAExB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,SAAS,CAAC,aAAa,GAAG,GAAG,EAAE,CAC7B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CACV,IAAI,cAAc,CAAa;YAC7B,KAAK,CAAC,UAAU;gBACd,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;gBAClC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;gBACpD,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;gBACpD,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;SACF,CAAC,EACF;YACE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,cAAc,EAAE,mBAAmB;aACpC;SACF,CACF,CACF,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CACpD,mBAAmB,CACpB,CAAC;YACF,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnE,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,SAAS,CAAC,aAAa,GAAG,GAAG,EAAE,CAC7B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,cAAc,EAAE,KAAK;aACtB;SACF,CAAC,CACH,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,SAAS,CAAC,aAAa,GAAG,GAAG,EAAE;YAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;gBAC1B,gBAAgB,EAAE,SAAS;aAC5B,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;YAEpD,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACtB,MAAM,EAAE,GAAG;gBACX,OAAO;aACR,CAAC,CACH,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAElD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7C,yBAAyB;gBACzB,qBAAqB;aACtB,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CACzC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAClC,CAAC,MAAM,CAAC;QAET,SAAS,CAAC,aAAa,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,qBAAqB,CAAC,SAAS,CAAC,CAC9B,WAAW,CAAC;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,UAAU,EAAE;gBACV,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;gBAClC,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;aAChC;SACF,CAAC,EACF,QAAqC,CACtC,CAAC;QAEF,MAAM,QAAQ,CAAC,QAAQ,CAAC;QAExB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,cAAc,EAAQ,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAEnD,SAAS,CAAC,aAAa,GAAG,GAAG,EAAE,CAC7B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CACV,IAAI,cAAc,CAAa;YAC7B,KAAK,CAAC,UAAU;gBACd,UAAU,CAAC,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,MAAM;gBACJ,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,CAAC;SACF,CAAC,EACF;YACE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,cAAc,EAAE,mBAAmB;aACpC;SACF,CACF,CACF,CAAC;QAEJ,qBAAqB,CAAC,SAAS,CAAC,CAC9B,WAAW,EAAE,EACb,QAAqC,CACtC,CAAC;QAEF,MAAM,QAAQ,CAAC,UAAU,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,iBAAiB,CAAC,OAAO,CAAC;QAChC,MAAM,eAAe,EAAE,CAAC;QAExB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,WAAW,EAAE,GAAG,EAAE;gBAChB,MAAM,KAAK,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,iCAAiC,CAC/C,SAAS,EACT,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CACV,OAAO,CAAC,WAAW,EAAE,EAAE,MAA2B,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACrE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEhB,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,8BAA8B;IAClC,kBAAkB,GAAG,CAAC,CAAC;IAEvB,EAAE,CACA,MAAiB,EACjB,SAAgE,IACzD,CAAC;IAEV,GAAG,CACD,MAAiB,EACjB,SAAgE,IACzD,CAAC;IAEV,aAAa,CACX,IAAqB,EACrB,OAAe,EACf,KAAa,EACb,SAAqD;QAErD,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,iBAAkB,SAAQ,YAAY;IAC1C,SAAS,GAAG,KAAK,CAAC;IAClB,YAAY,CAAoB;IAEhC,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,uBAAwB,SAAQ,YAAY;IAChD,UAAU,GAAG,GAAG,CAAC;IACjB,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,GAAG,KAAK,CAAC;IACb,MAAM,GAAa,EAAE,CAAC;IAEd,cAAc,GAAG,cAAc,EAAQ,CAAC;IAChD,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAEhD,SAAS,KAAU,CAAC;IAEpB,YAAY;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAA0B;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACxE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAA2B;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;CACF;AAED,MAAM,2BAA4B,SAAQ,YAAY;IACpD,UAAU,GAAG,GAAG,CAAC;IACjB,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,GAAG,KAAK,CAAC;IACtB,KAAK,GAAG,KAAK,CAAC;IAEG,aAAa,GAAG,cAAc,EAAQ,CAAC;IAC/C,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IAEjD,SAAS,KAAU,CAAC;IAEpB,YAAY;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;CACF;AAED,SAAS,WAAW,CAClB,UAII,EAAE;IAEN,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,YAAY,EAAE,EAAE;QAChD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,GAAG,EAAE,MAAM;QACX,OAAO,EAAE;YACP,IAAI,EAAE,WAAW;YACjB,GAAG,OAAO,CAAC,OAAO;SACnB;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,OAAqC,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc;IAKrB,IAAI,OAAO,GAAwC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,GAA6B,GAAG,EAAE,GAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QAC/D,OAAO,GAAG,cAAc,CAAC;QACzB,MAAM,GAAG,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,SAAoB;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;YACrC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,oBAAoB,OAAO,CAAC,IAAI,EAAE;QACvC,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBAED,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YACrC,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACpC,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACtB,OAAO,CAAC;oBACN,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,IAAI;iBACL,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
import type { AnyMessage } from "./jsonrpc.js";
export declare const HEADER_CONNECTION_ID = "Acp-Connection-Id";
export declare const HEADER_SESSION_ID = "Acp-Session-Id";
export declare const EVENT_STREAM_MIME_TYPE = "text/event-stream";
export declare const JSON_MIME_TYPE = "application/json";
export declare function methodRequiresSessionHeader(method: string): boolean;
export declare function sessionIdFromParams(params: unknown): string | undefined;
export declare function sessionIdFromMessageParams(message: AnyMessage): string | undefined;
export declare function sessionIdFromResponseResult(message: AnyMessage): string | undefined;
export declare function isInitializeRequest(msg: AnyMessage): boolean;
export declare function messageIdKey(id: string | number | null | undefined): string | undefined;
import { AGENT_METHODS } from "./schema/index.js";
import { isRecord, isResponseMessage } from "./jsonrpc.js";
export const HEADER_CONNECTION_ID = "Acp-Connection-Id";
export const HEADER_SESSION_ID = "Acp-Session-Id";
export const EVENT_STREAM_MIME_TYPE = "text/event-stream";
export const JSON_MIME_TYPE = "application/json";
const SESSION_SCOPED_METHODS = new Set([
AGENT_METHODS.session_cancel,
AGENT_METHODS.session_close,
AGENT_METHODS.session_load,
AGENT_METHODS.session_prompt,
AGENT_METHODS.session_resume,
AGENT_METHODS.session_set_config_option,
AGENT_METHODS.session_set_mode,
]);
export function methodRequiresSessionHeader(method) {
return SESSION_SCOPED_METHODS.has(method);
}
export function sessionIdFromParams(params) {
if (!isRecord(params)) {
return undefined;
}
const sessionId = params["sessionId"];
return typeof sessionId === "string" ? sessionId : undefined;
}
export function sessionIdFromMessageParams(message) {
return "method" in message ? sessionIdFromParams(message.params) : undefined;
}
export function sessionIdFromResponseResult(message) {
if (!isResponseMessage(message) || !("result" in message)) {
return undefined;
}
if (!isRecord(message.result)) {
return undefined;
}
const sessionId = message.result["sessionId"];
return typeof sessionId === "string" ? sessionId : undefined;
}
export function isInitializeRequest(msg) {
return (msg.jsonrpc === "2.0" &&
"id" in msg &&
"method" in msg &&
msg.method === AGENT_METHODS.initialize);
}
export function messageIdKey(id) {
if (typeof id === "string") {
return `string:${id}`;
}
if (typeof id === "number") {
return `number:${id}`;
}
if (id === null) {
return "null";
}
return undefined;
}
//# sourceMappingURL=protocol.js.map
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEjD,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS;IAC7C,aAAa,CAAC,cAAc;IAC5B,aAAa,CAAC,aAAa;IAC3B,aAAa,CAAC,YAAY;IAC1B,aAAa,CAAC,cAAc;IAC5B,aAAa,CAAC,cAAc;IAC5B,aAAa,CAAC,yBAAyB;IACvC,aAAa,CAAC,gBAAgB;CAC/B,CAAC,CAAC;AAEH,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAAmB;IAEnB,OAAO,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAAmB;IAEnB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAe;IACjD,OAAO,CACL,GAAG,CAAC,OAAO,KAAK,KAAK;QACrB,IAAI,IAAI,GAAG;QACX,QAAQ,IAAI,GAAG;QACf,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,UAAU,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,EAAsC;IAEtC,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,UAAU,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,UAAU,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
import { describe, expect, it } from "vitest";
import { AGENT_METHODS } from "./schema/index.js";
import { methodRequiresSessionHeader, sessionIdFromParams, isInitializeRequest, messageIdKey, HEADER_CONNECTION_ID, HEADER_SESSION_ID, EVENT_STREAM_MIME_TYPE, JSON_MIME_TYPE, } from "./protocol.js";
describe("protocol transport helpers", () => {
it("exports HTTP transport constants", () => {
expect(HEADER_CONNECTION_ID).toBe("Acp-Connection-Id");
expect(HEADER_SESSION_ID).toBe("Acp-Session-Id");
expect(EVENT_STREAM_MIME_TYPE).toBe("text/event-stream");
expect(JSON_MIME_TYPE).toBe("application/json");
});
it("requires a session header for existing-session methods", () => {
expect(methodRequiresSessionHeader(AGENT_METHODS.session_cancel)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_close)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_load)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_prompt)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_resume)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_set_config_option)).toBe(true);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_set_mode)).toBe(true);
});
it("does not require a session header for connection-level or unsupported methods", () => {
expect(methodRequiresSessionHeader(AGENT_METHODS.initialize)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_new)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_list)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.session_fork)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.nes_start)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.nes_suggest)).toBe(false);
expect(methodRequiresSessionHeader(AGENT_METHODS.nes_close)).toBe(false);
});
it("extracts a top-level string session ID from params", () => {
expect(sessionIdFromParams({ sessionId: "session-1" })).toBe("session-1");
});
it("returns undefined when params do not contain a top-level string session ID", () => {
expect(sessionIdFromParams(undefined)).toBeUndefined();
expect(sessionIdFromParams(null)).toBeUndefined();
expect(sessionIdFromParams("session-1")).toBeUndefined();
expect(sessionIdFromParams({})).toBeUndefined();
expect(sessionIdFromParams({ sessionId: 1 })).toBeUndefined();
expect(sessionIdFromParams({ nested: { sessionId: "session-1" } })).toBeUndefined();
});
it("detects initialize requests", () => {
const request = {
jsonrpc: "2.0",
id: 1,
method: AGENT_METHODS.initialize,
params: { protocolVersion: 1, clientCapabilities: {} },
};
expect(isInitializeRequest(request)).toBe(true);
});
it("rejects non-initialize messages", () => {
const notification = {
jsonrpc: "2.0",
method: AGENT_METHODS.initialize,
params: { protocolVersion: 1, clientCapabilities: {} },
};
const response = { jsonrpc: "2.0", id: 1, result: {} };
const otherRequest = {
jsonrpc: "2.0",
id: 1,
method: AGENT_METHODS.session_new,
params: { cwd: "/tmp", mcpServers: [] },
};
expect(isInitializeRequest(notification)).toBe(false);
expect(isInitializeRequest(response)).toBe(false);
expect(isInitializeRequest(otherRequest)).toBe(false);
});
it("normalizes JSON-RPC request IDs for map keys", () => {
expect(messageIdKey("foo")).toBe("string:foo");
expect(messageIdKey(1)).toBe("number:1");
expect(messageIdKey(null)).toBe("null");
expect(messageIdKey(undefined)).toBeUndefined();
});
});
//# sourceMappingURL=protocol.test.js.map
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, } from "./protocol.js";
import { parseSseStream } from "./sse.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
import { startTestServer } from "./test-support/test-http-server.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: 1,
clientCapabilities: {},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 2,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
function createPromptRequest(id, sessionId) {
return {
jsonrpc: "2.0",
id,
method: "session/prompt",
params: {
sessionId,
prompt: [{ type: "text", text: "Hello" }],
},
};
}
describe("AcpServer permission requests over HTTP", () => {
it("rejects session-scoped client responses without a session header", async () => {
const server = await startTestServer(() => createTestAgentApp({ enablePermission: true }));
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
const sessionEvents = createSseMessageIterator(sessionSse);
expect(await postJson(server.url, createPromptRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
})).toMatchObject({ status: 202 });
await readNextSseMessage(sessionEvents);
const permissionRequest = await readNextSseMessage(sessionEvents);
const permissionResponse = {
jsonrpc: "2.0",
id: readMessageId(permissionRequest),
result: {
outcome: {
outcome: "selected",
optionId: "allow",
},
},
};
expect(await postJson(server.url, permissionResponse, {
[HEADER_CONNECTION_ID]: connectionId,
})).toMatchObject({ status: 400 });
expect(await postJson(server.url, permissionResponse, {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
})).toMatchObject({ status: 202 });
await readNextSseMessage(sessionEvents);
await readNextSseMessage(sessionEvents);
await sessionEvents.return?.();
await sessionSse.body?.cancel();
}
finally {
await server.close();
}
}, 10_000);
it("routes permission requests over session SSE and accepts client responses", async () => {
const server = await startTestServer(() => createTestAgentApp({ enablePermission: true }));
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const connectionAbort = new AbortController();
const connectionSse = await openConnectionSse(server.url, connectionId, connectionAbort.signal);
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
const sessionEvents = createSseMessageIterator(sessionSse);
expect(await postJson(server.url, createPromptRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
})).toMatchObject({ status: 202 });
expect(await readNextSseMessage(sessionEvents)).toMatchObject({
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-1" },
},
},
});
const permissionRequest = await readNextSseMessage(sessionEvents);
expect(permissionRequest).toMatchObject({
jsonrpc: "2.0",
id: expect.any(Number),
method: "session/request_permission",
params: {
sessionId,
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
options: expect.arrayContaining([
expect.objectContaining({
kind: "allow_once",
optionId: "allow",
}),
]),
},
});
expect(await readNextMessageOrUndefined(connectionSse, connectionAbort)).toBeUndefined();
expect(await postJson(server.url, {
jsonrpc: "2.0",
id: readMessageId(permissionRequest),
result: {
outcome: {
outcome: "selected",
optionId: "allow",
},
},
}, {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
})).toMatchObject({ status: 202 });
expect(await readNextSseMessage(sessionEvents)).toMatchObject({
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "permission-selected-allow" },
},
},
});
expect(await readNextSseMessage(sessionEvents)).toMatchObject({
jsonrpc: "2.0",
id: 3,
result: { stopReason: "end_turn" },
});
await sessionEvents.return?.();
await sessionSse.body?.cancel();
}
finally {
await server.close();
}
}, 10_000);
});
async function initialize(url) {
const response = await postJson(url, initializeRequest);
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
expect(response.status).toBe(200);
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
return connectionId ?? "";
}
async function createSession(url, connectionId) {
const response = await openConnectionSse(url, connectionId);
const events = createSseMessageIterator(response);
try {
expect(await postJson(url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
})).toMatchObject({ status: 202 });
return readSessionId(await readNextSseMessage(events));
}
finally {
await events.return?.();
await response.body?.cancel();
}
}
function openConnectionSse(url, connectionId, signal) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
},
signal,
});
}
function openSessionSse(url, connectionId, sessionId) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
},
});
}
function createSseMessageIterator(response) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
return parseSseStream(response.body)[Symbol.asyncIterator]();
}
async function readNextSseMessage(iterator) {
const result = await iterator.next();
if (result.done) {
throw new Error("Expected SSE message");
}
return result.value;
}
async function readNextMessageOrUndefined(response, abort) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
const iterator = parseSseStream(response.body)[Symbol.asyncIterator]();
try {
const result = await Promise.race([
iterator.next(),
delay(50).then(() => ({ done: true, value: undefined })),
]);
return result.done ? undefined : result.value;
}
finally {
abort.abort();
await iterator.return?.();
}
}
function readMessageId(message) {
if (!("id" in message)) {
throw new Error("Expected message ID");
}
return message.id;
}
function readSessionId(message) {
if (!("result" in message) || !isRecord(message.result)) {
throw new Error("Expected session/new response result");
}
const sessionId = message.result["sessionId"];
if (typeof sessionId !== "string") {
throw new Error("Expected session ID");
}
return sessionId;
}
function isRecord(value) {
return typeof value === "object" && value !== null;
}
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function postJson(url, body, headers = {}) {
return fetch(url, {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
body: JSON.stringify(body),
});
}
//# sourceMappingURL=server-permission.test.js.map
{"version":3,"file":"server-permission.test.js","sourceRoot":"","sources":["../src/server-permission.test.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, } from "./protocol.js";
import { parseSseStream } from "./sse.js";
import { PROTOCOL_VERSION, agent as createAgentApp, methods } from "./acp.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
import { startTestServer } from "./test-support/test-http-server.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: 1,
clientCapabilities: {},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 2,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
function createPromptRequest(id, sessionId) {
return {
jsonrpc: "2.0",
id,
method: "session/prompt",
params: {
...(sessionId === undefined ? {} : { sessionId }),
prompt: [{ type: "text", text: "Hello" }],
},
};
}
function createForkRequest(id, sessionId) {
return {
jsonrpc: "2.0",
id,
method: "session/fork",
params: {
cwd: "/tmp",
mcpServers: [],
sessionId,
},
};
}
function createLoadSessionRequest(id, sessionId) {
return {
jsonrpc: "2.0",
id,
method: "session/load",
params: {
cwd: "/tmp",
mcpServers: [],
sessionId,
},
};
}
function createCancelNotification(sessionId) {
return {
jsonrpc: "2.0",
method: "session/cancel",
params: {
sessionId,
},
};
}
function createLoadSessionAgent() {
return createAgentApp({ name: "load-session-agent" })
.onRequest(methods.agent.initialize, () => ({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: true,
},
}))
.onRequest(methods.agent.session.load, async (c) => {
await c.client.notify(methods.client.session.update, {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: "replayed-session-history",
},
},
});
return {};
})
.onRequest(methods.agent.session.new, () => ({
sessionId: globalThis.crypto.randomUUID(),
}))
.onRequest(methods.agent.authenticate, () => ({}))
.onRequest(methods.agent.session.prompt, () => ({
stopReason: "end_turn",
}))
.onNotification(methods.agent.session.cancel, () => { });
}
describe("AcpServer session SSE", () => {
it("streams prompt updates and responses on the session SSE stream", async () => {
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 2 }));
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
expect(sessionSse.status).toBe(200);
const accepted = await postJson(server.url, createPromptRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
expect(accepted.status).toBe(202);
expect(await readSseMessages(sessionSse, 3)).toMatchObject([
{
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
text: "chunk-1",
},
},
},
},
{
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
text: "chunk-2",
},
},
},
},
{
jsonrpc: "2.0",
id: 3,
result: {
stopReason: "end_turn",
},
},
]);
expect(await readNextConnectionSseMessage(server.url, connectionId)).toBeUndefined();
}
finally {
await server.close();
}
});
it("routes null-ID session request responses to the session SSE stream", async () => {
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 1 }));
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
const accepted = await postJson(server.url, createPromptRequest(null, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
expect(accepted.status).toBe(202);
expect(await readSseMessages(sessionSse, 2)).toMatchObject([
{
jsonrpc: "2.0",
method: "session/update",
params: { sessionId },
},
{
jsonrpc: "2.0",
id: null,
result: {
stopReason: "end_turn",
},
},
]);
}
finally {
await server.close();
}
});
it("rejects session-scoped requests without a session header", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const response = await postJson(server.url, createPromptRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects session-scoped requests with mismatched session header and params", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const response = await postJson(server.url, createPromptRequest(3, "other-session"), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects session-scoped notifications without a session header", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const response = await postJson(server.url, createCancelNotification(sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects session-scoped notifications with mismatched session header and params", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const response = await postJson(server.url, createCancelNotification("other-session"), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects session-scoped requests without any session identifier", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const response = await postJson(server.url, createPromptRequest(3), {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("routes non-required session methods using params.sessionId when the session header is absent", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const response = await postJson(server.url, createForkRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(response.status).toBe(202);
}
finally {
await server.close();
}
});
it("routes session/load replay updates to session SSE and final response to connection SSE", async () => {
const server = await startTestServer(() => createLoadSessionAgent());
try {
const connectionId = await initialize(server.url);
const sessionId = "existing-session";
const connectionSse = await openConnectionSse(server.url, connectionId);
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
const accepted = await postJson(server.url, createLoadSessionRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
expect(sessionSse.status).toBe(200);
expect(accepted.status).toBe(202);
expect(await readSseMessages(sessionSse, 1)).toMatchObject([
{
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
text: "replayed-session-history",
},
},
},
},
]);
expect(await readSseMessages(connectionSse, 1)).toMatchObject([
{
jsonrpc: "2.0",
id: 3,
result: {},
},
]);
}
finally {
await server.close();
}
});
it("replays buffered session messages when session SSE attaches after prompt", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sessionId = await createSession(server.url, connectionId);
const accepted = await postJson(server.url, createPromptRequest(3, sessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
});
const sessionSse = await openSessionSse(server.url, connectionId, sessionId);
expect(accepted.status).toBe(202);
expect(await readSseMessages(sessionSse, 2)).toMatchObject([
{
jsonrpc: "2.0",
method: "session/update",
params: { sessionId },
},
{
jsonrpc: "2.0",
id: 3,
result: { stopReason: "end_turn" },
},
]);
}
finally {
await server.close();
}
});
it("isolates prompt events for multiple sessions on the same connection", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const connectionSse = await openConnectionSse(server.url, connectionId);
const connectionEvents = createSseMessageIterator(connectionSse);
const firstSessionId = await createSessionFromConnectionEvents(server.url, connectionId, connectionEvents);
const secondSessionId = await createSessionFromConnectionEvents(server.url, connectionId, connectionEvents);
const firstSse = await openSessionSse(server.url, connectionId, firstSessionId);
const secondSse = await openSessionSse(server.url, connectionId, secondSessionId);
expect(await postJson(server.url, createPromptRequest(3, firstSessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: firstSessionId,
})).toMatchObject({ status: 202 });
expect(await postJson(server.url, createPromptRequest(4, secondSessionId), {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: secondSessionId,
})).toMatchObject({ status: 202 });
expect(await readSseMessages(firstSse, 2)).toMatchObject([
{ method: "session/update", params: { sessionId: firstSessionId } },
{ id: 3, result: { stopReason: "end_turn" } },
]);
expect(await readSseMessages(secondSse, 2)).toMatchObject([
{ method: "session/update", params: { sessionId: secondSessionId } },
{ id: 4, result: { stopReason: "end_turn" } },
]);
}
finally {
await server.close();
}
});
});
async function initialize(url) {
const response = await postJson(url, initializeRequest);
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
expect(response.status).toBe(200);
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
return connectionId ?? "";
}
async function createSession(url, connectionId) {
return createSessionFromConnectionSse(url, connectionId, await openConnectionSse(url, connectionId));
}
async function createSessionFromConnectionSse(url, connectionId, response) {
return createSessionFromConnectionEvents(url, connectionId, createSseMessageIterator(response));
}
async function createSessionFromConnectionEvents(url, connectionId, events) {
const accepted = await postJson(url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(accepted.status).toBe(202);
return readSessionId(await readNextSseMessage(events));
}
function openConnectionSse(url, connectionId, signal) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
},
signal,
});
}
function openSessionSse(url, connectionId, sessionId) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
},
});
}
function createSseMessageIterator(response) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
return parseSseStream(response.body)[Symbol.asyncIterator]();
}
async function readNextSseMessage(iterator) {
const result = await iterator.next();
if (result.done) {
throw new Error("Expected SSE message");
}
return result.value;
}
async function readSseMessages(response, count) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
const iterator = parseSseStream(response.body)[Symbol.asyncIterator]();
try {
const messages = [];
for (const __unused of Array.from({ length: count })) {
void __unused;
const result = await iterator.next();
if (result.done) {
throw new Error("Expected SSE message");
}
messages.push(result.value);
}
return messages;
}
finally {
await iterator.return?.();
await response.body.cancel();
}
}
async function readNextConnectionSseMessage(url, connectionId) {
const abort = new AbortController();
const response = await openConnectionSse(url, connectionId, abort.signal);
if (!response.body) {
throw new Error("Expected SSE response body");
}
const iterator = parseSseStream(response.body)[Symbol.asyncIterator]();
try {
const result = await Promise.race([
iterator.next(),
delay(50).then(() => ({ done: true, value: undefined })),
]);
return result.done ? undefined : result.value;
}
finally {
abort.abort();
await iterator.return?.();
}
}
function readSessionId(message) {
if (!("result" in message) || !isRecord(message.result)) {
throw new Error("Expected session/new response result");
}
const sessionId = message.result["sessionId"];
if (typeof sessionId !== "string") {
throw new Error("Expected session ID");
}
return sessionId;
}
function isRecord(value) {
return typeof value === "object" && value !== null;
}
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function postJson(url, body, headers = {}) {
return fetch(url, {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
body: JSON.stringify(body),
});
}
//# sourceMappingURL=server-session-sse.test.js.map
{"version":3,"file":"server-session-sse.test.js","sourceRoot":"","sources":["../src/server-session-sse.test.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { AgentSideConnection, PROTOCOL_VERSION } from "./acp.js";
import { ConnectionRegistry } from "./connection.js";
import { HEADER_CONNECTION_ID, JSON_MIME_TYPE } from "./protocol.js";
import { AcpServer } from "./server.js";
import { createTestAgentApp, TestAgent } from "./test-support/test-agent.js";
import { handleWebSocketConnection } from "./ws-server.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 0,
method: "initialize",
params: {
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 1,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
describe("AcpServer prepared WebSocket upgrades", () => {
it("uses the default factory when no per-upgrade override is provided", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: recordingFactory(createdBy, "default"),
});
const socket = new FakeServerSocket();
try {
server.prepareWebSocketUpgrade().accept(socket);
socket.receive(JSON.stringify(initializeRequest));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
},
});
expect(createdBy).toEqual(["default"]);
}
finally {
socket.close();
await server.close();
}
});
it("accepts a deprecated legacy agent factory for prepared WebSocket upgrades", async () => {
const connections = [];
const server = new AcpServer({
createLegacyAgent: (conn) => {
connections.push(conn);
return new TestAgent(conn);
},
});
const socket = new FakeServerSocket();
try {
server.prepareWebSocketUpgrade().accept(socket);
socket.receive(JSON.stringify(initializeRequest));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
},
});
expect(connections).toHaveLength(1);
expect(connections[0]).toBeInstanceOf(AgentSideConnection);
}
finally {
socket.close();
await server.close();
}
});
it("uses a per-upgrade factory override for that WebSocket connection", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: recordingFactory(createdBy, "default"),
});
const socket = new FakeServerSocket();
try {
server
.prepareWebSocketUpgrade({
createAgent: recordingFactory(createdBy, "override"),
})
.accept(socket);
socket.receive(JSON.stringify(initializeRequest));
await readSentMessage(socket);
expect(createdBy).toEqual(["override"]);
}
finally {
socket.close();
await server.close();
}
});
it("does not leak WebSocket factory overrides to later prepared upgrades", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: recordingFactory(createdBy, "default"),
});
const overrideSocket = new FakeServerSocket();
const defaultSocket = new FakeServerSocket();
try {
server
.prepareWebSocketUpgrade({
createAgent: recordingFactory(createdBy, "override"),
})
.accept(overrideSocket);
server.prepareWebSocketUpgrade().accept(defaultSocket);
overrideSocket.receive(JSON.stringify(initializeRequest));
defaultSocket.receive(JSON.stringify({ ...initializeRequest, id: 1 }));
await Promise.all([
readSentMessage(overrideSocket),
readSentMessage(defaultSocket),
]);
expect(createdBy).toEqual(["override", "default"]);
}
finally {
overrideSocket.close();
defaultSocket.close();
await server.close();
}
});
it("keeps concurrent WebSocket factory overrides isolated", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: recordingFactory(createdBy, "default"),
});
const firstSocket = new FakeServerSocket();
const secondSocket = new FakeServerSocket();
try {
const first = server.prepareWebSocketUpgrade({
createAgent: recordingFactory(createdBy, "first"),
});
const second = server.prepareWebSocketUpgrade({
createAgent: recordingFactory(createdBy, "second"),
});
second.accept(secondSocket);
first.accept(firstSocket);
secondSocket.receive(JSON.stringify({ ...initializeRequest, id: 2 }));
firstSocket.receive(JSON.stringify({ ...initializeRequest, id: 1 }));
await Promise.all([
readSentMessage(firstSocket),
readSentMessage(secondSocket),
]);
expect(createdBy).toEqual(expect.arrayContaining(["first", "second"]));
expect(createdBy).toHaveLength(2);
}
finally {
firstSocket.close();
secondSocket.close();
await server.close();
}
});
it("removes rejected prepared WebSocket connections", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const prepared = server.prepareWebSocketUpgrade();
try {
prepared.reject();
const response = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: "text/event-stream",
[HEADER_CONNECTION_ID]: prepared.connectionId,
},
}));
expect(response.status).toBe(404);
}
finally {
await server.close();
}
});
it("does not expose accepted WebSocket upgrades to HTTP before initialize succeeds", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const prepared = server.prepareWebSocketUpgrade();
const socket = new FakeServerSocket();
try {
prepared.accept(socket);
const getResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: "text/event-stream",
[HEADER_CONNECTION_ID]: prepared.connectionId,
},
}));
const postResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
[HEADER_CONNECTION_ID]: prepared.connectionId,
},
body: JSON.stringify(sessionNewRequest),
}));
const deleteResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "DELETE",
headers: {
[HEADER_CONNECTION_ID]: prepared.connectionId,
},
}));
expect(getResponse.status).toBe(404);
expect(postResponse.status).toBe(404);
expect(deleteResponse.status).toBe(404);
socket.receive(JSON.stringify(initializeRequest));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
},
});
}
finally {
socket.close();
await server.close();
}
});
it("closes accepted WebSocket upgrades before initialize on server close", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const socket = new FakeServerSocket();
server.prepareWebSocketUpgrade().accept(socket);
expect(socket.closeCount).toBe(0);
await server.close();
expect(socket.closeCount).toBe(1);
expect(socket.closeCode).toBe(1001);
expect(socket.closeReason).toBe("Server shutting down");
});
it("queues WebSocket frames while initialize is pending", async () => {
const initialize = createDeferred();
const server = new AcpServer({
createAgent: () => createTestAgentApp({
initialize: () => initialize.promise,
newSession: () => ({ sessionId: "queued-session" }),
}),
});
const socket = new FakeServerSocket();
try {
server.prepareWebSocketUpgrade().accept(socket);
socket.receive(JSON.stringify(initializeRequest));
socket.receive(JSON.stringify(sessionNewRequest));
expect(socket.sent).toEqual([]);
initialize.resolve({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
});
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
},
});
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: "queued-session",
},
});
}
finally {
socket.close();
await server.close();
}
});
it("rejects duplicate WebSocket initialize requests after connection setup", async () => {
let initializeCalls = 0;
const server = new AcpServer({
createAgent: () => createTestAgentApp({
onInitialize: () => {
initializeCalls += 1;
},
}),
});
const socket = new FakeServerSocket();
try {
server.prepareWebSocketUpgrade().accept(socket);
socket.receive(JSON.stringify(initializeRequest));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
},
});
socket.receive(JSON.stringify({ ...initializeRequest, id: 99 }));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: 99,
error: {
code: -32600,
message: "Initialize not allowed on existing connection",
},
});
expect(initializeCalls).toBe(1);
socket.receive(JSON.stringify(sessionNewRequest));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: expect.stringMatching(/^[0-9a-f-]{36}$/),
},
});
}
finally {
socket.close();
await server.close();
}
});
it("clears WebSocket client-response routes after forwarding responses", async () => {
const registry = new ConnectionRegistry();
const agent = createTestAgentApp({ enablePermission: true });
const connection = registry.createPendingConnection(agent);
const socket = new FakeServerSocket();
try {
handleWebSocketConnection(socket, {
registry,
agent,
connection,
});
socket.receive(JSON.stringify(initializeRequest));
await readSentMessage(socket);
socket.receive(JSON.stringify({
jsonrpc: "2.0",
id: 2,
method: "session/prompt",
params: {
sessionId: "session-1",
prompt: [{ type: "text", text: "Hello" }],
},
}));
await readSentMessage(socket);
const permissionRequest = await readSentMessage(socket);
if (!("id" in permissionRequest)) {
throw new Error("Expected permission request ID");
}
expect(connection.clientResponseRoutes.size).toBe(1);
socket.receive(JSON.stringify({
jsonrpc: "2.0",
id: permissionRequest.id,
result: {
outcome: {
outcome: "selected",
optionId: "allow",
},
},
}));
await expect(readSentMessage(socket)).resolves.toMatchObject({
jsonrpc: "2.0",
method: "session/update",
params: {
sessionId: "session-1",
update: {
sessionUpdate: "agent_message_chunk",
content: {
text: "permission-selected-allow",
},
},
},
});
expect(connection.clientResponseRoutes.size).toBe(0);
}
finally {
socket.close();
await registry.closeAll();
}
});
it("keeps existing double-settle behavior for prepared WebSocket upgrades", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const rejected = server.prepareWebSocketUpgrade();
const accepted = server.prepareWebSocketUpgrade();
const socket = new FakeServerSocket();
try {
rejected.reject();
expect(() => rejected.accept(new FakeServerSocket())).toThrow("ACP WebSocket upgrade has already been settled");
accepted.accept(socket);
expect(() => accepted.accept(new FakeServerSocket())).toThrow("ACP WebSocket upgrade has already been settled");
expect(() => accepted.reject()).not.toThrow();
}
finally {
socket.close();
await server.close();
}
});
});
function recordingFactory(createdBy, label) {
return () => {
createdBy.push(label);
return createTestAgentApp();
};
}
function createDeferred() {
let resolve = () => { };
let reject = () => { };
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return { promise, resolve, reject };
}
function readSentMessage(socket) {
const message = socket.sent.shift();
if (message) {
return Promise.resolve(JSON.parse(message));
}
return new Promise((resolve) => {
socket.onSend = (data) => {
const message = socket.sent.shift();
resolve(JSON.parse(message ?? data));
};
});
}
class FakeServerSocket {
sent = [];
listeners = new Map();
onSend;
closeCount = 0;
closeCode;
closeReason;
send(data) {
this.sent.push(data);
this.onSend?.(data);
this.onSend = undefined;
}
close(code, reason) {
this.closeCount += 1;
this.closeCode = code;
this.closeReason = reason;
this.emit("close", {});
}
addEventListener(type, listener) {
this.listeners.set(type, this.listeners.get(type) ?? new Set());
this.listeners.get(type)?.add(listener);
}
removeEventListener(type, listener) {
this.listeners.get(type)?.delete(listener);
}
receive(data) {
this.emit("message", { data });
}
emit(type, event) {
for (const listener of this.listeners.get(type) ?? []) {
listener(event);
}
}
}
//# sourceMappingURL=server-websocket-upgrade.test.js.map
{"version":3,"file":"server-websocket-upgrade.test.js","sourceRoot":"","sources":["../src/server-websocket-upgrade.test.ts"],"names":[],"mappings":"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"}
import { AgentSideConnection } from "./acp.js";
import type { WebSocketServerSocket } from "./ws-server.js";
import type { Agent, AgentApp } from "./acp.js";
export type AgentFactory = () => AgentApp;
/** @deprecated Prefer {@link AgentFactory}. */
export type LegacyAgentFactory = (conn: AgentSideConnection) => Agent;
type AgentOption = {
/** Agent app used for each accepted ACP connection. */
readonly agent: AgentApp;
readonly createAgent?: never;
readonly createLegacyAgent?: never;
} | {
readonly agent?: never;
/** Creates an agent app for each accepted ACP connection. */
readonly createAgent: AgentFactory;
readonly createLegacyAgent?: never;
} | {
readonly agent?: never;
readonly createAgent?: never;
/**
* Creates a legacy agent implementation for each accepted ACP connection.
*
* @deprecated Prefer `agent` or `createAgent`.
*/
readonly createLegacyAgent: LegacyAgentFactory;
};
type OptionalAgentOption = {
/** Agent app used for this accepted ACP connection. */
readonly agent?: AgentApp;
readonly createAgent?: never;
readonly createLegacyAgent?: never;
} | {
readonly agent?: never;
/** Creates the agent app for this accepted ACP connection. */
readonly createAgent?: AgentFactory;
readonly createLegacyAgent?: never;
} | {
readonly agent?: never;
readonly createAgent?: never;
/**
* Creates the legacy agent implementation for this accepted ACP connection.
*
* @deprecated Prefer `agent` or `createAgent`.
*/
readonly createLegacyAgent?: LegacyAgentFactory;
};
/** Options for creating an ACP server transport. */
export type AcpServerOptions = AgentOption;
export type HandleRequestOptions = OptionalAgentOption;
export type PrepareWebSocketUpgradeOptions = OptionalAgentOption;
export interface PreparedWebSocketUpgrade {
readonly connectionId: string;
accept(socket: WebSocketServerSocket): void;
reject(): void;
}
/**
* ACP server transport for Streamable HTTP and WebSocket connections.
*
* Route HTTP requests to {@link handleRequest}. For WebSocket upgrades, use
* {@link prepareWebSocketUpgrade} so adapters can attach `Acp-Connection-Id` to
* the `101 Switching Protocols` response.
*/
export declare class AcpServer {
private readonly agent;
private readonly registry;
private readonly webSocketSessions;
constructor(options: AcpServerOptions);
/** Handles one Streamable HTTP ACP request. */
handleRequest(req: Request, options?: HandleRequestOptions): Promise<Response>;
/** Creates a WebSocket connection before accepting the HTTP upgrade. */
prepareWebSocketUpgrade(options?: PrepareWebSocketUpgradeOptions): PreparedWebSocketUpgrade;
/** Closes all active ACP connections owned by this server. */
close(): Promise<void>;
private handlePost;
private handleGet;
private handleDelete;
private handleInitialize;
private forwardConnectedMessage;
}
export {};
import { ConnectionRegistry } from "./connection.js";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, isInitializeRequest, messageIdKey, methodRequiresSessionHeader, sessionIdFromParams, } from "./protocol.js";
import { isJsonRpcMessage, isResponseMessage } from "./jsonrpc.js";
import { AGENT_METHODS } from "./schema/index.js";
import { serializeSseEvent, serializeSseKeepAlive } from "./sse.js";
import { handleWebSocketConnection } from "./ws-server.js";
import { AgentSideConnection } from "./acp.js";
/**
* ACP server transport for Streamable HTTP and WebSocket connections.
*
* Route HTTP requests to {@link handleRequest}. For WebSocket upgrades, use
* {@link prepareWebSocketUpgrade} so adapters can attach `Acp-Connection-Id` to
* the `101 Switching Protocols` response.
*/
export class AcpServer {
agent;
registry = new ConnectionRegistry();
webSocketSessions = new Set();
constructor(options) {
this.agent = resolveAgent(options);
}
/** Handles one Streamable HTTP ACP request. */
async handleRequest(req, options = {}) {
if (req.method === "POST") {
return await this.handlePost(req, options);
}
if (req.method === "GET") {
return this.handleGet(req);
}
if (req.method === "DELETE") {
return this.handleDelete(req);
}
return textResponse("Method Not Allowed", 405);
}
/** Creates a WebSocket connection before accepting the HTTP upgrade. */
prepareWebSocketUpgrade(options = {}) {
const agent = agentOverride(options, this.agent);
const connection = this.registry.createPendingConnection(agent);
let isSettled = false;
return {
connectionId: connection.connectionId,
accept: (socket) => {
if (isSettled) {
throw new Error("ACP WebSocket upgrade has already been settled");
}
isSettled = true;
const session = handleWebSocketConnection(socket, {
registry: this.registry,
agent,
connection,
});
this.webSocketSessions.add(session);
void session.closed.finally(() => {
this.webSocketSessions.delete(session);
});
},
reject: () => {
if (isSettled) {
return;
}
isSettled = true;
this.registry.discard(connection.connectionId);
},
};
}
/** Closes all active ACP connections owned by this server. */
async close() {
const closeConnections = this.registry.closeAll();
const closeWebSockets = Promise.all(Array.from(this.webSocketSessions, (session) => session.close()));
await Promise.all([closeConnections, closeWebSockets]);
}
async handlePost(req, options) {
const contentType = req.headers.get("Content-Type");
if (!isJsonContentType(contentType)) {
return textResponse("Unsupported Media Type", 415);
}
const body = await readJson(req);
if (!body.ok) {
return textResponse("Invalid JSON", 400);
}
if (Array.isArray(body.value)) {
return textResponse("Batch JSON-RPC requests are not implemented", 501);
}
if (!isJsonRpcMessage(body.value)) {
return textResponse("Invalid JSON-RPC message", 400);
}
const connectionId = req.headers.get(HEADER_CONNECTION_ID);
if (isInitializeRequest(body.value)) {
if (!connectionId) {
return await this.handleInitialize(body.value, req.signal, options);
}
return textResponse("Initialize not allowed on existing connection", 400);
}
if (!connectionId) {
return textResponse("Missing Acp-Connection-Id", 400);
}
const connection = this.registry.get(connectionId);
if (!connection) {
return textResponse("Unknown Acp-Connection-Id", 404);
}
const forwarded = await this.forwardConnectedMessage(connection, body.value, req.headers);
if (!forwarded.ok) {
return textResponse(forwarded.message, forwarded.status);
}
return emptyResponse(202);
}
handleGet(req) {
if (req.headers.get("Upgrade")?.toLowerCase() === "websocket") {
return textResponse("WebSocket upgrade is not implemented", 426);
}
const accept = req.headers.get("Accept")?.toLowerCase();
if (!accept?.includes(EVENT_STREAM_MIME_TYPE)) {
return textResponse("Not Acceptable", 406);
}
const connectionId = req.headers.get(HEADER_CONNECTION_ID);
if (!connectionId) {
return textResponse("Missing Acp-Connection-Id", 400);
}
const connection = this.registry.get(connectionId);
if (!connection) {
return textResponse("Unknown Acp-Connection-Id", 404);
}
const sessionId = req.headers.get(HEADER_SESSION_ID);
if (sessionId) {
return sseResponse(connection.ensureSession(sessionId).subscribe());
}
return sseResponse(connection.connectionStream.subscribe());
}
handleDelete(req) {
const connectionId = req.headers.get(HEADER_CONNECTION_ID);
if (!connectionId) {
return textResponse("Missing Acp-Connection-Id", 400);
}
if (!this.registry.remove(connectionId)) {
return textResponse("Unknown Acp-Connection-Id", 404);
}
return emptyResponse(202);
}
async handleInitialize(message, signal, options) {
if (!("id" in message) || message.id === null) {
return textResponse("Initialize request must include an ID", 400);
}
if (signal.aborted) {
return textResponse("Request aborted", 499);
}
let connection;
try {
connection = this.registry.createConnection(agentOverride(options, this.agent));
const initialResponsePromise = writeAndReceiveInitial(connection, message);
initialResponsePromise.catch(() => undefined);
const initialResponse = await raceAbort(initialResponsePromise, signal);
if (signal.aborted) {
throw new RequestAbortedError();
}
connection.startRouter();
return jsonResponse(initialResponse, 200, {
[HEADER_CONNECTION_ID]: connection.connectionId,
});
}
catch (error) {
if (connection) {
this.registry.remove(connection.connectionId);
}
if (error instanceof RequestAbortedError) {
return textResponse("Request aborted", 499);
}
return jsonResponse({
jsonrpc: "2.0",
id: message.id,
error: {
code: -32603,
message: "Initialize failed",
data: error instanceof Error ? error.message : undefined,
},
}, 500);
}
}
async forwardConnectedMessage(connection, message, headers) {
if (isResponseMessage(message)) {
return await forwardClientResponse(connection, message, headers);
}
return await forwardClientMethodMessage(connection, message, headers);
}
}
function agentOverride(options, fallback) {
if (!hasAgent(options)) {
return fallback;
}
return resolveAgent(options);
}
function hasAgent(options) {
return Boolean(options.agent || options.createAgent || options.createLegacyAgent);
}
function resolveAgent(options) {
const sourceCount = (options.agent ? 1 : 0) +
(options.createAgent ? 1 : 0) +
(options.createLegacyAgent ? 1 : 0);
if (sourceCount !== 1) {
throw new Error("AcpServer requires exactly one of agent, createAgent, or createLegacyAgent");
}
if (options.agent) {
return options.agent;
}
if (options.createAgent) {
return {
connect: (stream) => options.createAgent().connect(stream),
};
}
return {
connect: (stream) => {
new AgentSideConnection(options.createLegacyAgent, stream);
},
};
}
class RequestAbortedError extends Error {
constructor() {
super("Request aborted");
this.name = "RequestAbortedError";
}
}
async function readJson(req) {
try {
return {
ok: true,
value: await req.json(),
};
}
catch {
return {
ok: false,
};
}
}
async function writeInbound(connection, message) {
await connection.writeInbound(message);
}
async function writeAndReceiveInitial(connection, message) {
await writeInbound(connection, message);
if (!("id" in message) || message.id === null) {
throw new Error("Initialize request must include an ID");
}
return await connection.recvInitial(message.id);
}
async function raceAbort(promise, signal) {
if (signal.aborted) {
throw new RequestAbortedError();
}
let removeAbortListener = () => { };
const abortPromise = new Promise((_resolve, reject) => {
const onAbort = () => {
reject(new RequestAbortedError());
};
signal.addEventListener("abort", onAbort, { once: true });
removeAbortListener = () => {
signal.removeEventListener("abort", onAbort);
};
});
try {
return await Promise.race([promise, abortPromise]);
}
finally {
removeAbortListener();
}
}
async function forwardClientMethodMessage(connection, message, headers) {
const route = determineRoute(message, headers);
if (!route.ok) {
return route;
}
if (route.value !== "connection") {
connection.ensureSession(route.value.session);
}
const key = "id" in message ? messageIdKey(message.id) : undefined;
if (key) {
connection.pendingRoutes.set(key, pendingResponseRoute(message, route.value));
}
await writeInbound(connection, message);
return { ok: true };
}
async function forwardClientResponse(connection, message, headers) {
const key = messageIdKey(message.id);
const route = key ? connection.clientResponseRoutes.get(key) : undefined;
const headerSessionId = headers.get(HEADER_SESSION_ID);
if (route && route !== "connection" && !headerSessionId) {
return {
ok: false,
status: 400,
message: "Missing Acp-Session-Id",
};
}
if (route && route !== "connection" && headerSessionId !== route.session) {
return {
ok: false,
status: 400,
message: "Mismatched Acp-Session-Id",
};
}
if (key) {
connection.clientResponseRoutes.delete(key);
}
await writeInbound(connection, message);
return { ok: true };
}
function pendingResponseRoute(message, route) {
return message.method === AGENT_METHODS.session_load ? "connection" : route;
}
function determineRoute(message, headers) {
const headerSessionId = headers.get(HEADER_SESSION_ID);
const paramsSessionId = sessionIdFromParams(message.params);
if (methodRequiresSessionHeader(message.method) && !headerSessionId) {
return {
ok: false,
status: 400,
message: "Missing Acp-Session-Id",
};
}
if (headerSessionId !== null &&
paramsSessionId !== undefined &&
headerSessionId !== paramsSessionId) {
return {
ok: false,
status: 400,
message: "Mismatched Acp-Session-Id",
};
}
if (headerSessionId) {
return {
ok: true,
value: { session: headerSessionId },
};
}
if (paramsSessionId) {
return {
ok: true,
value: { session: paramsSessionId },
};
}
return {
ok: true,
value: "connection",
};
}
function isJsonContentType(contentType) {
return contentType?.split(";", 1)[0]?.trim().toLowerCase() === JSON_MIME_TYPE;
}
function sseResponse(subscription) {
return new Response(createSseBody(subscription), {
status: 200,
headers: {
"Content-Type": EVENT_STREAM_MIME_TYPE,
"Cache-Control": "no-cache",
Connection: "keep-alive",
},
});
}
function createSseBody(subscription) {
const encoder = new TextEncoder();
const replay = [...subscription.replay];
let keepAliveTimer;
let reader;
let pendingMessage;
let isClosed = false;
const clearKeepAlive = () => {
if (keepAliveTimer) {
clearInterval(keepAliveTimer);
keepAliveTimer = undefined;
}
};
const enqueueText = (controller, text) => {
try {
controller.enqueue(encoder.encode(text));
return true;
}
catch {
return false;
}
};
const hasDemand = (controller) => controller.desiredSize !== null && controller.desiredSize > 0;
const closeBody = (controller) => {
if (isClosed) {
return;
}
isClosed = true;
clearKeepAlive();
try {
controller.close();
}
catch {
// Stream may already be cancelled by the consumer.
}
};
return new ReadableStream({
start(controller) {
keepAliveTimer = setInterval(() => {
if (isClosed || pendingMessage || !hasDemand(controller)) {
return;
}
if (!enqueueText(controller, serializeSseKeepAlive())) {
closeBody(controller);
}
}, 15_000);
},
async pull(controller) {
if (isClosed || reader || !hasDemand(controller)) {
return;
}
const replayMessage = replay.shift();
if (replayMessage) {
if (!enqueueText(controller, serializeSseEvent(replayMessage))) {
closeBody(controller);
}
return;
}
if (pendingMessage) {
const message = pendingMessage;
pendingMessage = undefined;
if (!enqueueText(controller, serializeSseEvent(message))) {
closeBody(controller);
}
return;
}
const currentReader = subscription.stream.getReader();
reader = currentReader;
try {
const result = await currentReader.read();
if (isClosed) {
return;
}
if (result.done) {
closeBody(controller);
return;
}
if (!hasDemand(controller)) {
pendingMessage = result.value;
return;
}
if (!enqueueText(controller, serializeSseEvent(result.value))) {
closeBody(controller);
}
}
catch (error) {
if (!isClosed) {
isClosed = true;
clearKeepAlive();
controller.error(error);
}
}
finally {
if (reader === currentReader) {
reader = undefined;
}
currentReader.releaseLock();
}
},
cancel() {
isClosed = true;
clearKeepAlive();
if (reader) {
void reader.cancel();
}
else {
void subscription.stream.cancel();
}
},
});
}
function jsonResponse(value, status, headers) {
return new Response(JSON.stringify(value), {
status,
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
});
}
function textResponse(body, status) {
return new Response(body, {
status,
headers: {
"Content-Type": "text/plain",
},
});
}
function emptyResponse(status) {
return new Response(null, { status });
}
//# sourceMappingURL=server.js.map
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
import { describe, expect, it, vi } from "vitest";
import { AgentSideConnection, PROTOCOL_VERSION, agent as createAgentApp, methods, } from "./acp.js";
import { EVENT_STREAM_MIME_TYPE, HEADER_CONNECTION_ID, HEADER_SESSION_ID, JSON_MIME_TYPE, } from "./protocol.js";
import { AcpServer } from "./server.js";
import { parseSseStream } from "./sse.js";
import { createTestAgentApp, TestAgent } from "./test-support/test-agent.js";
import { startTestServer } from "./test-support/test-http-server.js";
const initializeRequest = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: 1,
clientCapabilities: {},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 2,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
const promptRequest = {
jsonrpc: "2.0",
id: 3,
method: "session/prompt",
params: {
sessionId: "session-1",
prompt: [{ type: "text", text: "Hello" }],
},
};
describe("AcpServer", () => {
it("handles initialize over HTTP and returns a connection ID", async () => {
const server = await startTestServer();
try {
const response = await postJson(server.url, initializeRequest);
const body = await response.json();
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(body).toMatchObject({
jsonrpc: "2.0",
id: 1,
result: {
protocolVersion: 1,
agentCapabilities: {
loadSession: false,
},
},
});
}
finally {
await server.close();
}
});
it("accepts an agent app for direct HTTP initialize requests", async () => {
const appAgent = createAgentApp({ name: "http-app-agent" }).onRequest(methods.agent.initialize, (c) => ({
protocolVersion: c.params.protocolVersion,
agentCapabilities: {
loadSession: false,
},
authMethods: [],
}));
const server = new AcpServer({ agent: appAgent });
try {
const response = await server.handleRequest(jsonRequest(initializeRequest));
const body = await response.json();
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(body).toMatchObject({
jsonrpc: "2.0",
id: initializeRequest.id,
result: {
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
authMethods: [],
},
});
}
finally {
await server.close();
}
});
it("accepts a deprecated legacy agent factory for direct HTTP initialize requests", async () => {
const connections = [];
const server = new AcpServer({
createLegacyAgent: (conn) => {
connections.push(conn);
return new TestAgent(conn);
},
});
try {
const response = await server.handleRequest(jsonRequest(initializeRequest));
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(connections).toHaveLength(1);
expect(connections[0]).toBeInstanceOf(AgentSideConnection);
}
finally {
await server.close();
}
});
it("uses the default factory for direct HTTP initialize requests", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
const response = await server.handleRequest(jsonRequest(initializeRequest));
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(createdBy).toEqual(["default"]);
}
finally {
await server.close();
}
});
it("uses per-request factory overrides for direct HTTP initialize requests", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
const response = await server.handleRequest(jsonRequest(initializeRequest), {
createAgent: () => {
createdBy.push("override");
return createTestAgentApp();
},
});
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(createdBy).toEqual(["override"]);
}
finally {
await server.close();
}
});
it("does not leak HTTP factory overrides to later initialize requests", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
await server.handleRequest(jsonRequest(initializeRequest), {
createAgent: () => {
createdBy.push("override");
return createTestAgentApp();
},
});
await server.handleRequest(jsonRequest({ ...initializeRequest, id: 2 }));
expect(createdBy).toEqual(["override", "default"]);
}
finally {
await server.close();
}
});
it("keeps concurrent HTTP initialize factory overrides isolated", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
const first = server.handleRequest(jsonRequest(initializeRequest), {
createAgent: () => {
createdBy.push("first");
return createTestAgentApp();
},
});
const second = server.handleRequest(jsonRequest({ ...initializeRequest, id: 2 }), {
createAgent: () => {
createdBy.push("second");
return createTestAgentApp();
},
});
await Promise.all([first, second]);
expect(createdBy).toEqual(expect.arrayContaining(["first", "second"]));
expect(createdBy).toHaveLength(2);
}
finally {
await server.close();
}
});
it("waits for registry shutdowns before close resolves", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
const registry = server.registry;
const shutdownStarted = createDeferred();
const allowShutdown = createDeferred();
vi.spyOn(registry, "closeAll").mockImplementation(async () => {
shutdownStarted.resolve();
await allowShutdown.promise;
});
let closeResolved = false;
const close = server.close().then(() => {
closeResolved = true;
});
await shutdownStarted.promise;
await flushMicrotasks();
expect(closeResolved).toBe(false);
allowShutdown.resolve();
await close;
expect(closeResolved).toBe(true);
});
it("discards HTTP initialize connections when the request aborts", async () => {
const agentCreated = createDeferred();
const initializeStarted = createDeferred();
const initializeResponse = createDeferred();
const abortController = new AbortController();
const server = new AcpServer({
createAgent: () => {
agentCreated.resolve();
return createTestAgentApp({
initialize: () => {
initializeStarted.resolve();
return initializeResponse.promise;
},
newSession: () => ({ sessionId: "session-1" }),
});
},
});
try {
const responsePromise = server.handleRequest(jsonRequest(initializeRequest, {}, abortController.signal));
await agentCreated.promise;
await withTimeout(initializeStarted.promise);
abortController.abort();
const response = await withTimeout(responsePromise);
expect(response.status).toBe(499);
expect(response.headers.get(HEADER_CONNECTION_ID)).toBeNull();
initializeResponse.resolve({
protocolVersion: 1,
agentCapabilities: { loadSession: false },
});
await flushMicrotasks();
}
finally {
await server.close();
}
});
it("ignores HTTP factory overrides for existing-connection POST requests", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
const connectionId = await initializeDirect(server);
const response = await server.handleRequest(jsonRequest(sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
}), {
createAgent: () => {
createdBy.push("override");
return createTestAgentApp();
},
});
expect(response.status).toBe(202);
expect(createdBy).toEqual(["default"]);
}
finally {
await server.close();
}
});
it("serializes concurrent POST writes for the same connection", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
try {
const connectionId = await initializeDirect(server);
const headers = { [HEADER_CONNECTION_ID]: connectionId };
const first = server.handleRequest(jsonRequest(sessionNewRequest, headers));
const second = server.handleRequest(jsonRequest({ ...sessionNewRequest, id: 3 }, headers));
const responses = await Promise.all([first, second]);
expect(responses.map((response) => response.status)).toEqual([202, 202]);
const sseResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
},
}));
expect(sseResponse.status).toBe(200);
const messages = await readSseMessages(sseResponse, 2);
expect(messages.map((message) => ("id" in message ? message.id : undefined))).toEqual([2, 3]);
}
finally {
await server.close();
}
});
it("ignores HTTP factory overrides for GET and DELETE requests", async () => {
const createdBy = [];
const server = new AcpServer({
createAgent: () => {
createdBy.push("default");
return createTestAgentApp();
},
});
try {
const connectionId = await initializeDirect(server);
const createAgent = () => {
createdBy.push("override");
return createTestAgentApp();
};
const getResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
},
}), { createAgent });
expect(getResponse.status).toBe(200);
await getResponse.body?.cancel();
const deleteResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "DELETE",
headers: { [HEADER_CONNECTION_ID]: connectionId },
}), { createAgent });
expect(deleteResponse.status).toBe(202);
expect(createdBy).toEqual(["default"]);
}
finally {
await server.close();
}
});
it("streams session/new responses over the connection SSE stream", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sseResponse = await openConnectionSse(server.url, connectionId);
expect(sseResponse.status).toBe(200);
expect(sseResponse.headers.get("Content-Type")).toContain(EVENT_STREAM_MIME_TYPE);
const accepted = await postJson(server.url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(accepted.status).toBe(202);
expect(await accepted.text()).toBe("");
expect(await readFirstSseMessage(sseResponse)).toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: expect.stringMatching(/^[0-9a-f-]{36}$/),
},
});
}
finally {
await server.close();
}
});
it("replays buffered connection messages when SSE attaches after POST", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const accepted = await postJson(server.url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(accepted.status).toBe(202);
const sseResponse = await openConnectionSse(server.url, connectionId);
expect(await readFirstSseMessage(sseResponse)).toMatchObject({
jsonrpc: "2.0",
id: sessionNewRequest.id,
result: {
sessionId: expect.stringMatching(/^[0-9a-f-]{36}$/),
},
});
}
finally {
await server.close();
}
});
it("does not drain outbound subscriptions faster than SSE body demand", async () => {
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
let resolvePromptDone = () => { };
const promptDone = new Promise((resolve) => {
resolvePromptDone = resolve;
});
const server = new AcpServer({
createAgent: () => createBackpressureAgent(resolvePromptDone),
});
let iterator;
let body;
try {
const connectionId = await initializeDirect(server);
const sseResponse = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: "session-1",
},
}));
body = sseResponse.body;
expect(sseResponse.status).toBe(200);
expect(body).toBeDefined();
iterator = parseSseStream(body)[Symbol.asyncIterator]();
const firstMessage = iterator.next();
const accepted = await server.handleRequest(jsonRequest(promptRequest, {
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: "session-1",
}));
expect(accepted.status).toBe(202);
expect(chunkText(await firstMessage)).toBe("chunk-1");
await promptDone;
await waitFor(() => warnSpy.mock.calls.length > 0);
const chunkNumbers = [1];
for (let index = 0; index < 128; index++) {
const chunk = chunkText(await iterator.next());
chunkNumbers.push(Number(chunk.slice("chunk-".length)));
}
expect(hasGap(chunkNumbers)).toBe(true);
expect(warnSpy).toHaveBeenCalledWith("ACP outbound subscriber lagged; dropping oldest message");
}
finally {
await iterator?.return?.();
await body?.cancel().catch(() => undefined);
warnSpy.mockRestore();
await server.close();
}
});
it.each(["PUT", "PATCH"])("rejects %s requests", async (method) => {
const server = await startTestServer();
try {
const response = await fetch(server.url, { method });
expect(response.status).toBe(405);
}
finally {
await server.close();
}
});
it("rejects GET without Accept: text/event-stream", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "GET",
headers: {
[HEADER_CONNECTION_ID]: globalThis.crypto.randomUUID(),
},
});
expect(response.status).toBe(406);
}
finally {
await server.close();
}
});
it("rejects GET without a connection ID", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
},
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects GET with an unknown connection ID", async () => {
const server = await startTestServer();
try {
const response = await openConnectionSse(server.url, globalThis.crypto.randomUUID());
expect(response.status).toBe(404);
}
finally {
await server.close();
}
});
it("opens session-scoped GETs before session/load creates session state", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const response = await openSessionSse(server.url, connectionId, globalThis.crypto.randomUUID());
expect(response.status).toBe(200);
await response.body?.cancel();
}
finally {
await server.close();
}
});
it("returns 426 for WebSocket upgrade GETs", async () => {
const server = new AcpServer({
createAgent: () => createTestAgentApp(),
});
try {
const response = await server.handleRequest(new Request("http://127.0.0.1/acp", {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
Upgrade: "websocket",
},
}));
expect(response.status).toBe(426);
}
finally {
await server.close();
}
});
it("deletes connections and closes SSE streams", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const sseResponse = await openConnectionSse(server.url, connectionId);
const reader = sseResponse.body?.getReader();
expect(reader).toBeDefined();
const deleted = await fetch(server.url, {
method: "DELETE",
headers: {
[HEADER_CONNECTION_ID]: connectionId,
},
});
expect(deleted.status).toBe(202);
expect(await reader?.read()).toEqual({ done: true, value: undefined });
reader?.releaseLock();
const postAfterDelete = await postJson(server.url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(postAfterDelete.status).toBe(404);
}
finally {
await server.close();
}
});
it("rejects DELETE without a connection ID", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, { method: "DELETE" });
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects DELETE with an unknown connection ID", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "DELETE",
headers: {
[HEADER_CONNECTION_ID]: globalThis.crypto.randomUUID(),
},
});
expect(response.status).toBe(404);
}
finally {
await server.close();
}
});
it("accepts POST with application/json Content-Type parameters", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "POST",
headers: {
"Content-Type": "application/json; charset=utf-8",
},
body: JSON.stringify(initializeRequest),
});
expect(response.status).toBe(200);
}
finally {
await server.close();
}
});
it("rejects POST without Content-Type", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, { method: "POST" });
expect(response.status).toBe(415);
}
finally {
await server.close();
}
});
it.each([
"text/plain",
"application/jsonfoobar",
"application/json-patch+json",
])("rejects POST with %s Content-Type", async (contentType) => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "POST",
headers: { "Content-Type": contentType },
body: JSON.stringify(initializeRequest),
});
expect(response.status).toBe(415);
}
finally {
await server.close();
}
});
it("rejects invalid JSON", async () => {
const server = await startTestServer();
try {
const response = await fetch(server.url, {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
},
body: "{ nope",
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects JSON-RPC batches", async () => {
const server = await startTestServer();
try {
const response = await postJson(server.url, [initializeRequest]);
expect(response.status).toBe(501);
}
finally {
await server.close();
}
});
it.each([
null,
"initialize",
1,
{},
{ jsonrpc: "1.0", method: "initialize" },
])("rejects invalid JSON-RPC messages", async (body) => {
const server = await startTestServer();
try {
const response = await postJson(server.url, body);
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects non-initialize requests without a connection ID", async () => {
const server = await startTestServer();
try {
const response = await postJson(server.url, sessionNewRequest);
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects initialize requests on existing connections", async () => {
const server = await startTestServer();
try {
const connectionId = await initialize(server.url);
const response = await postJson(server.url, initializeRequest, {
[HEADER_CONNECTION_ID]: connectionId,
});
expect(response.status).toBe(400);
}
finally {
await server.close();
}
});
it("rejects unknown connection IDs", async () => {
const server = await startTestServer();
try {
const response = await postJson(server.url, sessionNewRequest, {
[HEADER_CONNECTION_ID]: globalThis.crypto.randomUUID(),
});
expect(response.status).toBe(404);
}
finally {
await server.close();
}
});
it("returns an error response when agent creation fails", async () => {
const server = await startTestServer(() => {
throw new Error("agent factory failed");
});
try {
const response = await postJson(server.url, initializeRequest);
const body = await response.json();
expect(response.status).toBe(500);
expect(response.headers.get(HEADER_CONNECTION_ID)).toBeNull();
expect(body).toMatchObject({
jsonrpc: "2.0",
id: 1,
error: {
code: -32603,
message: "Initialize failed",
data: "agent factory failed",
},
});
}
finally {
await server.close();
}
});
it("returns JSON-RPC initialize errors as the initialize response", async () => {
const server = await startTestServer(() => createTestAgentApp({
initialize: () => Promise.reject(new Error("initialize failed")),
}));
try {
const response = await postJson(server.url, initializeRequest);
const body = await response.json();
expect(response.status).toBe(200);
expect(response.headers.get(HEADER_CONNECTION_ID)).toMatch(/^[0-9a-f-]{36}$/);
expect(body).toMatchObject({
jsonrpc: "2.0",
id: 1,
error: {
code: -32603,
message: "Internal error",
},
});
}
finally {
await server.close();
}
});
});
async function initializeDirect(server) {
const response = await server.handleRequest(jsonRequest(initializeRequest));
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
expect(response.status).toBe(200);
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
return connectionId ?? "";
}
function jsonRequest(body, headers = {}, signal) {
return new Request("http://127.0.0.1/acp", {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
body: JSON.stringify(body),
signal,
});
}
async function initialize(url) {
const response = await postJson(url, initializeRequest);
const connectionId = response.headers.get(HEADER_CONNECTION_ID);
expect(response.status).toBe(200);
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
return connectionId ?? "";
}
function openConnectionSse(url, connectionId) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
},
});
}
function openSessionSse(url, connectionId, sessionId) {
return fetch(url, {
method: "GET",
headers: {
Accept: EVENT_STREAM_MIME_TYPE,
[HEADER_CONNECTION_ID]: connectionId,
[HEADER_SESSION_ID]: sessionId,
},
});
}
async function readFirstSseMessage(response) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
const iterator = parseSseStream(response.body)[Symbol.asyncIterator]();
const result = await iterator.next();
await iterator.return?.();
await response.body.cancel();
if (result.done) {
throw new Error("Expected SSE message");
}
return result.value;
}
async function readSseMessages(response, count) {
if (!response.body) {
throw new Error("Expected SSE response body");
}
const iterator = parseSseStream(response.body)[Symbol.asyncIterator]();
try {
const messages = [];
for (const __unused of Array.from({ length: count })) {
void __unused;
const result = await iterator.next();
if (result.done) {
throw new Error("Expected SSE message");
}
messages.push(result.value);
}
return messages;
}
finally {
await iterator.return?.();
await response.body.cancel();
}
}
function chunkText(result) {
if (result.done) {
throw new Error("Expected SSE message");
}
const text = result.value.params?.update?.content?.text;
if (typeof text !== "string") {
throw new Error("Expected session update chunk text");
}
return text;
}
function hasGap(values) {
return values.some((value, index) => {
if (index === 0) {
return false;
}
return value !== values[index - 1] + 1;
});
}
function createBackpressureAgent(onPromptDone) {
return createAgentApp({ name: "backpressure-agent" })
.onRequest(methods.agent.initialize, () => ({
protocolVersion: 1,
agentCapabilities: {
loadSession: false,
},
}))
.onRequest(methods.agent.session.new, () => ({ sessionId: "session-1" }))
.onRequest(methods.agent.authenticate, () => ({}))
.onRequest(methods.agent.session.prompt, async (c) => {
for (let index = 0; index < 1_100; index++) {
await c.client.notify(methods.client.session.update, {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `chunk-${index + 1}`,
},
},
});
}
onPromptDone();
return { stopReason: "end_turn" };
})
.onNotification(methods.agent.session.cancel, () => { });
}
async function waitFor(callback) {
const deadline = Date.now() + 1_000;
while (!callback()) {
if (Date.now() > deadline) {
throw new Error("Timed out waiting for condition");
}
await new Promise((resolve) => setTimeout(resolve, 1));
}
}
function createDeferred() {
let resolve = () => { };
let reject = () => { };
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return { promise, resolve, reject };
}
async function withTimeout(promise) {
let timeout;
try {
return await Promise.race([
promise,
new Promise((_resolve, reject) => {
timeout = setTimeout(() => {
reject(new Error("Timed out waiting for promise"));
}, 1_000);
}),
]);
}
finally {
clearTimeout(timeout);
}
}
async function flushMicrotasks() {
await Promise.resolve();
await Promise.resolve();
}
function postJson(url, body, headers = {}) {
return fetch(url, {
method: "POST",
headers: {
"Content-Type": JSON_MIME_TYPE,
...headers,
},
body: JSON.stringify(body),
});
}
//# sourceMappingURL=server.test.js.map
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
import type { AnyMessage } from "./jsonrpc.js";
export declare function serializeSseEvent(msg: AnyMessage): string;
export declare function serializeSseKeepAlive(): string;
export declare function parseSseStream(body: ReadableStream<Uint8Array>): AsyncIterable<AnyMessage>;
import { isJsonRpcMessage } from "./jsonrpc.js";
export function serializeSseEvent(msg) {
return `data: ${JSON.stringify(msg)}\n\n`;
}
export function serializeSseKeepAlive() {
return ":\n\n";
}
export async function* parseSseStream(body) {
const decoder = new TextDecoder();
const reader = body.getReader();
let buffer = "";
try {
while (true) {
const chunk = await reader.read();
if (chunk.done) {
buffer += decoder.decode();
yield* parseBufferedEvents(buffer);
return;
}
buffer += decoder.decode(chunk.value, { stream: true });
const eventParts = buffer.split(/\r?\n\r?\n/);
buffer = eventParts.pop() ?? "";
for (const eventPart of eventParts) {
const msg = parseSseEvent(eventPart);
if (msg) {
yield msg;
}
}
}
}
finally {
reader.releaseLock();
}
}
function* parseBufferedEvents(buffer) {
if (!buffer.trim()) {
return;
}
const eventParts = buffer.split(/\r?\n\r?\n/);
for (const eventPart of eventParts) {
const msg = parseSseEvent(eventPart);
if (msg) {
yield msg;
}
}
}
function parseSseEvent(eventPart) {
const dataLines = eventPart
.split(/\r?\n/)
.filter((line) => line.startsWith("data:"))
.map((line) => {
const value = line.slice("data:".length);
return value.startsWith(" ") ? value.slice(1) : value;
});
if (dataLines.length === 0) {
return undefined;
}
const data = dataLines.join("\n");
if (!data.trim()) {
return undefined;
}
try {
const parsed = JSON.parse(data);
if (isJsonRpcMessage(parsed)) {
return parsed;
}
console.warn("Skipping SSE payload that is not a JSON-RPC message");
return undefined;
}
catch (error) {
console.warn("Failed to parse SSE JSON payload:", error);
return undefined;
}
}
//# sourceMappingURL=sse.js.map
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
export {};
import { describe, expect, it, vi } from "vitest";
import { parseSseStream, serializeSseEvent, serializeSseKeepAlive, } from "./sse.js";
const encoder = new TextEncoder();
function streamFromChunks(chunks) {
return new ReadableStream({
start(controller) {
for (const chunk of chunks) {
controller.enqueue(encoder.encode(chunk));
}
controller.close();
},
});
}
async function collectMessages(body) {
const messages = [];
for await (const message of parseSseStream(body)) {
messages.push(message);
}
return messages;
}
describe("SSE transport helpers", () => {
it("serializes a message event", () => {
const message = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: { protocolVersion: 1 },
};
expect(serializeSseEvent(message)).toBe(`data: ${JSON.stringify(message)}\n\n`);
});
it("serializes a keepalive comment", () => {
expect(serializeSseKeepAlive()).toBe(":\n\n");
});
it("parses one event", async () => {
const message = { jsonrpc: "2.0", id: 1, result: { ok: true } };
await expect(collectMessages(streamFromChunks([serializeSseEvent(message)]))).resolves.toEqual([message]);
});
it("parses multiple events in one chunk", async () => {
const first = { jsonrpc: "2.0", id: 1, result: { ok: true } };
const second = {
jsonrpc: "2.0",
method: "session/update",
params: { sessionId: "s1" },
};
await expect(collectMessages(streamFromChunks([
serializeSseEvent(first) + serializeSseEvent(second),
]))).resolves.toEqual([first, second]);
});
it("parses events split across chunk boundaries", async () => {
const message = {
jsonrpc: "2.0",
id: "abc",
result: { ok: true },
};
const serialized = serializeSseEvent(message);
await expect(collectMessages(streamFromChunks([
serialized.slice(0, 7),
serialized.slice(7, 18),
serialized.slice(18),
]))).resolves.toEqual([message]);
});
it("ignores comments, keepalives, and non-data fields", async () => {
const message = { jsonrpc: "2.0", id: 1, result: { ok: true } };
await expect(collectMessages(streamFromChunks([
`:\n\nevent: message\nid: 1\ndata: ${JSON.stringify(message)}\nretry: 1000\n\n`,
]))).resolves.toEqual([message]);
});
it("joins multiline data fields", async () => {
const expected = {
jsonrpc: "2.0",
id: 1,
result: { ok: true },
};
const body = [
'data: {"jsonrpc":"2.0",\n',
'data: "id":1,\n',
'data: "result":{"ok":true}}\n\n',
];
await expect(collectMessages(streamFromChunks(body))).resolves.toEqual([
expected,
]);
});
it("skips malformed JSON without throwing", async () => {
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
const message = { jsonrpc: "2.0", id: 1, result: { ok: true } };
await expect(collectMessages(streamFromChunks(["data: {not-json}\n\n", serializeSseEvent(message)]))).resolves.toEqual([message]);
expect(warn).toHaveBeenCalledOnce();
warn.mockRestore();
});
});
//# sourceMappingURL=sse.test.js.map
{"version":3,"file":"sse.test.js","sourceRoot":"","sources":["../src/sse.test.ts"],"names":[],"mappings":"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"}
import type { Agent, AgentApp, AgentSideConnection, AuthenticateRequest, AuthenticateResponse, CancelNotification, InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse } from "../acp.js";
export interface TestAgentOptions {
readonly chunkCount?: number;
readonly chunkDelayMs?: number;
readonly enablePermission?: boolean;
}
export interface TestAgentAppOptions extends TestAgentOptions {
readonly initialize?: (params: InitializeRequest) => Promise<InitializeResponse> | InitializeResponse;
readonly onInitialize?: () => void;
readonly newSession?: (params: NewSessionRequest) => Promise<NewSessionResponse> | NewSessionResponse;
}
export declare class TestAgent implements Agent {
private readonly connection;
private readonly chunkCount;
private readonly chunkDelayMs;
private readonly enablePermission;
constructor(connection: AgentSideConnection, options?: TestAgentOptions);
initialize(_params: InitializeRequest): Promise<InitializeResponse>;
newSession(_params: NewSessionRequest): Promise<NewSessionResponse>;
authenticate(_params: AuthenticateRequest): Promise<AuthenticateResponse | void>;
prompt(params: PromptRequest): Promise<PromptResponse>;
cancel(_params: CancelNotification): Promise<void>;
}
export declare function createTestAgentApp(options?: TestAgentAppOptions): AgentApp;
import { PROTOCOL_VERSION, agent as createAgentApp, methods } from "../acp.js";
export class TestAgent {
connection;
chunkCount;
chunkDelayMs;
enablePermission;
constructor(connection, options = {}) {
this.connection = connection;
this.chunkCount = options.chunkCount ?? 1;
this.chunkDelayMs = options.chunkDelayMs ?? 0;
this.enablePermission = options.enablePermission ?? false;
}
initialize(_params) {
return Promise.resolve({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
});
}
newSession(_params) {
return Promise.resolve({ sessionId: globalThis.crypto.randomUUID() });
}
authenticate(_params) {
return Promise.resolve();
}
async prompt(params) {
for (const index of Array.from({ length: this.chunkCount }, (_, item) => item)) {
if (this.chunkDelayMs > 0) {
await delay(this.chunkDelayMs);
}
await this.connection.sessionUpdate({
sessionId: params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `chunk-${index + 1}`,
},
},
});
}
if (this.enablePermission) {
const permission = await this.connection.requestPermission({
sessionId: params.sessionId,
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
options: [
{
kind: "allow_once",
name: "Allow once",
optionId: "allow",
},
{
kind: "reject_once",
name: "Reject once",
optionId: "reject",
},
],
});
await this.connection.sessionUpdate({
sessionId: params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: permission.outcome.outcome === "selected"
? `permission-selected-${permission.outcome.optionId}`
: "permission-cancelled",
},
},
});
}
return { stopReason: "end_turn" };
}
cancel(_params) {
return Promise.resolve();
}
}
export function createTestAgentApp(options = {}) {
return createAgentApp({ name: "test-agent" })
.onRequest(methods.agent.initialize, async (c) => {
options.onInitialize?.();
if (options.initialize) {
return await options.initialize(c.params);
}
return {
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
};
})
.onRequest(methods.agent.session.new, async (c) => {
if (options.newSession) {
return await options.newSession(c.params);
}
return { sessionId: globalThis.crypto.randomUUID() };
})
.onRequest(methods.agent.authenticate, () => ({}))
.onRequest(methods.agent.session.prompt, async (c) => {
const chunkCount = options.chunkCount ?? 1;
const chunkDelayMs = options.chunkDelayMs ?? 0;
for (const index of Array.from({ length: chunkCount }, (_, item) => item)) {
if (chunkDelayMs > 0) {
await delay(chunkDelayMs);
}
await c.client.notify(methods.client.session.update, {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `chunk-${index + 1}`,
},
},
});
}
if (options.enablePermission) {
const permission = await c.client.request(methods.client.session.requestPermission, {
sessionId: c.params.sessionId,
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
options: [
{
kind: "allow_once",
name: "Allow once",
optionId: "allow",
},
{
kind: "reject_once",
name: "Reject once",
optionId: "reject",
},
],
});
await c.client.notify(methods.client.session.update, {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: permission.outcome.outcome === "selected"
? `permission-selected-${permission.outcome.optionId}`
: "permission-cancelled",
},
},
});
}
return { stopReason: "end_turn" };
})
.onNotification(methods.agent.session.cancel, () => { });
}
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
//# sourceMappingURL=test-agent.js.map
{"version":3,"file":"test-agent.js","sourceRoot":"","sources":["../../src/test-support/test-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,IAAI,cAAc,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiC/E,MAAM,OAAO,SAAS;IACH,UAAU,CAAsB;IAChC,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,gBAAgB,CAAU;IAE3C,YAAY,UAA+B,EAAE,UAA4B,EAAE;QACzE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC5D,CAAC;IAED,UAAU,CAAC,OAA0B;QACnC,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,eAAe,EAAE,gBAAgB;YACjC,iBAAiB,EAAE;gBACjB,WAAW,EAAE,KAAK;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,OAA0B;QACnC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,YAAY,CACV,OAA4B;QAE5B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAC5B,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,EAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAClB,EAAE,CAAC;YACF,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBAClC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE;oBACN,aAAa,EAAE,qBAAqB;oBACpC,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,EAAE;qBAC3B;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;gBACzD,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE;oBACR,UAAU,EAAE,iBAAiB;oBAC7B,KAAK,EAAE,iBAAiB;iBACzB;gBACD,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,OAAO;qBAClB;oBACD;wBACE,IAAI,EAAE,aAAa;wBACnB,IAAI,EAAE,aAAa;wBACnB,QAAQ,EAAE,QAAQ;qBACnB;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBAClC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE;oBACN,aAAa,EAAE,qBAAqB;oBACpC,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,UAAU,CAAC,OAAO,CAAC,OAAO,KAAK,UAAU;4BACvC,CAAC,CAAC,uBAAuB,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE;4BACtD,CAAC,CAAC,sBAAsB;qBAC7B;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,OAA2B;QAChC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAChC,UAA+B,EAAE;IAEjC,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SAC1C,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/C,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QAEzB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,eAAe,EAAE,gBAAgB;YACjC,iBAAiB,EAAE;gBACjB,WAAW,EAAE,KAAK;aACnB;SACF,CAAC;IACJ,CAAC,CAAC;SACD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACvD,CAAC,CAAC;SACD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SACjD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAE/C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAC5B,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAClB,EAAE,CAAC;YACF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;YAED,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;gBACnD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;gBAC7B,MAAM,EAAE;oBACN,aAAa,EAAE,qBAAqB;oBACpC,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,EAAE;qBAC3B;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CACvC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EACxC;gBACE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;gBAC7B,QAAQ,EAAE;oBACR,UAAU,EAAE,iBAAiB;oBAC7B,KAAK,EAAE,iBAAiB;iBACzB;gBACD,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,OAAO;qBAClB;oBACD;wBACE,IAAI,EAAE,aAAa;wBACnB,IAAI,EAAE,aAAa;wBACnB,QAAQ,EAAE,QAAQ;qBACnB;iBACF;aACF,CACF,CAAC;YAEF,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;gBACnD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;gBAC7B,MAAM,EAAE;oBACN,aAAa,EAAE,qBAAqB;oBACpC,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,UAAU,CAAC,OAAO,CAAC,OAAO,KAAK,UAAU;4BACvC,CAAC,CAAC,uBAAuB,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE;4BACtD,CAAC,CAAC,sBAAsB;qBAC7B;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC,CAAC;SACD,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
import type { AgentApp } from "../acp.js";
export interface TestHttpServer {
readonly url: string;
readonly wsUrl: string;
readonly close: () => Promise<void>;
}
export declare function startTestServer(createAgent?: () => AgentApp, options?: {
port?: number;
}): Promise<TestHttpServer>;
import http from "node:http";
import { WebSocketServer } from "ws";
import { AcpServer } from "../server.js";
import { createNodeHttpHandler, createNodeWebSocketUpgradeHandler, } from "../node-adapter.js";
import { createTestAgentApp } from "./test-agent.js";
export async function startTestServer(createAgent = () => createTestAgentApp(), options = {}) {
const acpServer = new AcpServer({ createAgent });
const httpServer = http.createServer(createNodeHttpHandler(acpServer));
const webSocketServer = new WebSocketServer({ noServer: true });
httpServer.on("upgrade", createNodeWebSocketUpgradeHandler(acpServer, webSocketServer));
await listen(httpServer, options.port ?? 0);
const address = httpServer.address();
if (!isAddressInfo(address)) {
throw new Error("Test HTTP server did not bind to a TCP port");
}
return {
url: `http://127.0.0.1:${address.port}`,
wsUrl: `ws://127.0.0.1:${address.port}`,
close: async () => {
terminateWebSockets(webSocketServer);
await Promise.all([
acpServer.close(),
closeWebSocketServer(webSocketServer),
closeHttpServer(httpServer),
]);
},
};
}
function listen(server, port) {
return new Promise((resolve, reject) => {
const onError = (error) => {
server.off("listening", onListening);
reject(error);
};
const onListening = () => {
server.off("error", onError);
resolve();
};
server.once("error", onError);
server.once("listening", onListening);
server.listen(port, "127.0.0.1");
});
}
function terminateWebSockets(server) {
for (const client of server.clients) {
client.terminate();
}
}
function closeWebSocketServer(server) {
return new Promise((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
function closeHttpServer(server) {
return new Promise((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
function isAddressInfo(address) {
return typeof address === "object" && address !== null;
}
//# sourceMappingURL=test-http-server.js.map
{"version":3,"file":"test-http-server.js","sourceRoot":"","sources":["../../src/test-support/test-http-server.ts"],"names":[],"mappings":"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"}
import type { AgentConnector, ConnectionRegistry, ConnectionState } from "./connection.js";
import type { WebSocketLike } from "./ws-utils.js";
/** WebSocket shape accepted by prepared ACP WebSocket upgrades. */
export type WebSocketServerSocket = WebSocketLike;
export interface WebSocketConnectionOptions {
readonly registry: ConnectionRegistry;
readonly agent: AgentConnector;
readonly connection?: ConnectionState;
}
export interface WebSocketServerSessionHandle {
readonly closed: Promise<void>;
close(code?: number, reason?: string): Promise<void>;
}
export declare function handleWebSocketConnection(socket: WebSocketLike, options: WebSocketConnectionOptions): WebSocketServerSessionHandle;
import { isJsonRpcMessage, isRequestMessage, isResponseMessage, } from "./jsonrpc.js";
import { isInitializeRequest, messageIdKey, sessionIdFromParams, } from "./protocol.js";
import { onWebSocket, webSocketMessageToString } from "./ws-utils.js";
export function handleWebSocketConnection(socket, options) {
const session = new WebSocketServerSession(socket, options);
session.start();
return session;
}
class WebSocketServerSession {
socket;
options;
connection;
preparedConnection;
outboundReader;
inboundWriteChain = Promise.resolve();
messageChain = Promise.resolve();
isClosed = false;
closedPromise;
resolveClosed = () => { };
detachListeners = [];
constructor(socket, options) {
this.socket = socket;
this.options = options;
this.preparedConnection = options.connection;
this.closedPromise = new Promise((resolve) => {
this.resolveClosed = resolve;
});
}
get closed() {
return this.closedPromise;
}
start() {
this.detachListeners.push(onWebSocket(this.socket, "message", (...args) => {
this.enqueueSocketMessage(args);
}));
this.detachListeners.push(onWebSocket(this.socket, "close", () => {
void this.closeSession();
}));
this.detachListeners.push(onWebSocket(this.socket, "error", () => {
void this.shutdown(1011, "WebSocket error");
}));
}
close(code = 1001, reason = "Server shutting down") {
return this.shutdown(code, reason);
}
enqueueSocketMessage(args) {
const handled = this.messageChain.then(() => this.handleSocketMessage(args));
this.messageChain = handled.catch((error) => {
if (!this.isClosed) {
console.error("ACP WebSocket message handling failed:", error);
void this.shutdown(1011, "Message handling failed");
}
});
}
async handleSocketMessage(args) {
if (this.isClosed) {
return;
}
const text = webSocketMessageToString(args);
if (text === undefined) {
console.warn("Ignoring non-text ACP WebSocket frame");
return;
}
let value;
try {
value = JSON.parse(text);
}
catch (error) {
console.warn("Ignoring malformed ACP WebSocket JSON message:", error);
await this.shutdownIfUninitialized(1007, "Malformed JSON");
return;
}
if (Array.isArray(value)) {
console.warn("Ignoring ACP WebSocket JSON-RPC batch message");
await this.shutdownIfUninitialized(1002, "JSON-RPC batch messages are not supported");
return;
}
if (!isJsonRpcMessage(value)) {
console.warn("Ignoring non-JSON-RPC ACP WebSocket message:", value);
await this.shutdownIfUninitialized(1002, "Invalid JSON-RPC message");
return;
}
if (!this.connection) {
await this.handleInitialize(value);
return;
}
const forwarded = await this.forwardMessage(value);
if (!forwarded.ok) {
console.warn("Ignoring ACP WebSocket message:", forwarded.message);
}
}
async handleInitialize(message) {
if (!isInitializeRequest(message)) {
console.warn("First ACP WebSocket message must be initialize");
await this.shutdown(1002, "First message must be initialize");
return;
}
if (!("id" in message) || message.id === null) {
console.warn("ACP WebSocket initialize request must include an ID");
await this.shutdown(1002, "Initialize request must include an ID");
return;
}
const connection = this.preparedConnection ??
this.options.registry.createPendingConnection(this.options.agent);
this.preparedConnection = connection;
try {
await writeInbound(connection, message);
const initialResponse = await connection.recvInitial(message.id);
if (this.isClosed) {
this.options.registry.discard(connection.connectionId);
return;
}
this.preparedConnection = undefined;
this.connection = connection;
this.options.registry.register(connection);
connection.startRouter();
this.send(initialResponse);
this.startOutboundPump(connection);
}
catch (error) {
this.preparedConnection = undefined;
this.options.registry.discard(connection.connectionId);
this.send({
jsonrpc: "2.0",
id: message.id,
error: {
code: -32603,
message: "Initialize failed",
data: error instanceof Error ? error.message : undefined,
},
});
await this.shutdown(1011, "Initialize failed");
}
}
async forwardMessage(message) {
const connection = this.connection;
if (!connection) {
return {
ok: false,
message: "ACP WebSocket connection is not initialized",
};
}
if (isRequestMessage(message) && isInitializeRequest(message)) {
this.send({
jsonrpc: "2.0",
id: message.id,
error: {
code: -32600,
message: "Initialize not allowed on existing connection",
},
});
return {
ok: false,
message: "Initialize not allowed on existing connection",
};
}
if (isRequestMessage(message)) {
const route = determineWebSocketRoute(message);
if (route !== "connection") {
connection.ensureSession(route.session);
}
const key = messageIdKey(message.id);
if (key) {
connection.pendingRoutes.set(key, route);
}
await this.writeInbound(message);
return { ok: true };
}
if (isResponseMessage(message)) {
const key = messageIdKey(message.id);
if (key) {
connection.clientResponseRoutes.delete(key);
}
await this.writeInbound(message);
return { ok: true };
}
await this.writeInbound(message);
return { ok: true };
}
async writeInbound(message) {
const connection = this.connection;
if (!connection) {
throw new Error("ACP WebSocket connection is not initialized");
}
const write = this.inboundWriteChain.then(() => writeInbound(connection, message));
this.inboundWriteChain = write.catch(() => undefined);
await write;
}
startOutboundPump(connection) {
const subscription = connection.allOutbound.subscribe();
const reader = subscription.stream.getReader();
this.outboundReader = reader;
void (async () => {
try {
for (const message of subscription.replay) {
if (!this.send(message)) {
return;
}
}
while (!this.isClosed) {
const result = await reader.read();
if (result.done) {
return;
}
if (!this.send(result.value)) {
return;
}
}
}
catch (error) {
if (!this.isClosed) {
console.error("ACP WebSocket outbound pump failed:", error);
}
}
finally {
if (this.outboundReader === reader) {
this.outboundReader = undefined;
}
reader.releaseLock();
if (!this.isClosed) {
void this.shutdown();
}
}
})();
}
send(message) {
if (this.isClosed) {
return false;
}
try {
this.socket.send(JSON.stringify(message));
return true;
}
catch (error) {
console.warn("Failed to send ACP WebSocket message:", error);
void this.shutdown(1011, "Failed to send message");
return false;
}
}
async shutdownIfUninitialized(code, reason) {
if (this.connection) {
return;
}
await this.shutdown(code, reason);
}
async shutdown(code, reason) {
this.closeSocket(code, reason);
await this.closeSession();
}
closeSocket(code, reason) {
try {
this.socket.close(code, reason);
}
catch (error) {
console.warn("Failed to close ACP WebSocket:", error);
}
}
async closeSession() {
if (this.isClosed) {
return;
}
this.isClosed = true;
try {
for (const detach of this.detachListeners.splice(0)) {
detach();
}
const outboundReader = this.outboundReader;
this.outboundReader = undefined;
if (outboundReader) {
await outboundReader.cancel();
}
if (this.connection) {
this.options.registry.discard(this.connection.connectionId);
this.connection = undefined;
}
if (this.preparedConnection) {
this.options.registry.discard(this.preparedConnection.connectionId);
this.preparedConnection = undefined;
}
}
finally {
this.resolveClosed();
}
}
}
async function writeInbound(connection, message) {
await connection.writeInbound(message);
}
function determineWebSocketRoute(message) {
const sessionId = sessionIdFromParams(message.params);
if (sessionId) {
return {
session: sessionId,
};
}
return "connection";
}
//# sourceMappingURL=ws-server.js.map
{"version":3,"file":"ws-server.js","sourceRoot":"","sources":["../src/ws-server.ts"],"names":[],"mappings":"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"}
import type { AcpCookieStore } from "./cookie-store.js";
import type { WebSocketLike } from "./ws-utils.js";
import type { Stream } from "./stream.js";
export interface WebSocketStreamOptions {
/** WebSocket subprotocols to request. */
readonly protocols?: string[];
/**
* Headers for WebSocket constructors that support them, such as Node `ws`.
* Browser WebSocket constructors ignore custom headers.
*/
readonly headers?: Record<string, string>;
/** WebSocket constructor to use. Defaults to `globalThis.WebSocket`. */
readonly WebSocket?: WebSocketConstructor;
/** Cookie handling policy for transport requests. Defaults to `include`. */
readonly cookies?: "include" | "omit";
/**
* Caller-owned affinity cookie store to reuse across reconnects.
*
* Browser WebSocket uses the platform cookie jar; Node/custom constructors
* that support headers receive cookies from this store.
*/
readonly cookieStore?: AcpCookieStore;
}
export { MemoryAcpCookieStore } from "./cookie-store.js";
export type { AcpCookieStore } from "./cookie-store.js";
/** Constructor shape used by `createWebSocketStream`. */
export interface WebSocketConstructor {
new (url: string, protocols?: string | string[], options?: {
headers?: Record<string, string>;
}): WebSocketLike;
}
export type { WebSocketLike };
/**
* Creates an ACP Stream over WebSocket.
*
* Sends and receives ACP JSON-RPC messages as WebSocket text frames. In Node,
* pass a WebSocket constructor such as `ws.WebSocket` via `options.WebSocket`.
* Browser WebSocket uses the platform cookie jar; Node/custom constructors
* receive merged `Cookie` headers when supported and can store upgrade
* `Set-Cookie` headers in a caller-owned `AcpCookieStore`.
*
* ACP v1 reconnect creates a new transport connection; callers should save the
* ACP `sessionId`, create a new stream with the same auth headers/cookie store,
* call `initialize`, verify `agentCapabilities.loadSession`, then call
* `session/load`. Agents must authorize `session/load`, and ACP v1 does not
* replay in-flight transport messages emitted while disconnected.
*/
export declare function createWebSocketStream(serverUrl: string, options?: WebSocketStreamOptions): Stream;
import { MemoryAcpCookieStore } from "./cookie-store.js";
import { isJsonRpcMessage } from "./jsonrpc.js";
import { onWebSocket, webSocketMessageToString } from "./ws-utils.js";
export { MemoryAcpCookieStore } from "./cookie-store.js";
const SOCKET_OPEN = 1;
/**
* Creates an ACP Stream over WebSocket.
*
* Sends and receives ACP JSON-RPC messages as WebSocket text frames. In Node,
* pass a WebSocket constructor such as `ws.WebSocket` via `options.WebSocket`.
* Browser WebSocket uses the platform cookie jar; Node/custom constructors
* receive merged `Cookie` headers when supported and can store upgrade
* `Set-Cookie` headers in a caller-owned `AcpCookieStore`.
*
* ACP v1 reconnect creates a new transport connection; callers should save the
* ACP `sessionId`, create a new stream with the same auth headers/cookie store,
* call `initialize`, verify `agentCapabilities.loadSession`, then call
* `session/load`. Agents must authorize `session/load`, and ACP v1 does not
* replay in-flight transport messages emitted while disconnected.
*/
export function createWebSocketStream(serverUrl, options = {}) {
return new WebSocketStreamTransport(serverUrl, options).stream;
}
class WebSocketStreamTransport {
stream;
socket;
cookieStore;
ownsCookieStore;
readableController;
isClosed = false;
openPromise;
resolveOpen;
rejectOpen;
detachListeners = [];
constructor(serverUrl, options) {
const WebSocketCtor = resolveWebSocket(options.WebSocket);
const cookiePolicy = options.cookies ?? "include";
this.cookieStore = options.cookieStore ?? new MemoryAcpCookieStore();
this.ownsCookieStore = options.cookieStore === undefined;
this.socket = new WebSocketCtor(serverUrl, options.protocols, {
headers: createConstructorHeaders(options.headers, cookiePolicy, this.cookieStore),
});
this.openPromise = new Promise((resolve, reject) => {
this.resolveOpen = resolve;
this.rejectOpen = reject;
});
this.openPromise.catch(() => undefined);
this.detachListeners.push(onWebSocket(this.socket, "open", () => {
this.resolveOpen?.();
this.resolveOpen = undefined;
this.rejectOpen = undefined;
this.openPromise = undefined;
}));
this.detachListeners.push(onWebSocket(this.socket, "message", (...args) => {
this.handleSocketMessage(args);
}));
this.detachListeners.push(onWebSocket(this.socket, "close", () => {
this.closeReadable();
}));
this.detachListeners.push(onWebSocket(this.socket, "error", (error) => {
this.errorReadable(error);
}));
if (cookiePolicy === "include") {
this.detachListeners.push(onWebSocket(this.socket, "upgrade", (message) => {
const headers = upgradeHeaders(message);
if (headers) {
this.cookieStore.store(headers);
}
}));
}
this.stream = {
readable: new ReadableStream({
start: (controller) => {
this.readableController = controller;
},
cancel: () => {
this.close();
},
}),
writable: new WritableStream({
write: async (message) => {
await this.sendMessage(message);
},
close: () => {
this.close();
},
abort: () => {
this.close();
},
}),
};
}
async sendMessage(message) {
if (this.isClosed) {
throw new Error("ACP WebSocket stream is closed");
}
await this.waitForOpen();
if (this.isClosed) {
throw new Error("ACP WebSocket stream is closed");
}
this.socket.send(JSON.stringify(message));
}
async waitForOpen() {
if (this.socket.readyState === undefined ||
this.socket.readyState === SOCKET_OPEN) {
return;
}
await this.openPromise;
}
handleSocketMessage(args) {
if (this.isClosed) {
return;
}
const text = webSocketMessageToString(args);
if (text === undefined) {
return;
}
let value;
try {
value = JSON.parse(text);
}
catch (error) {
console.warn("Ignoring malformed ACP WebSocket JSON message:", error);
return;
}
if (!isJsonRpcMessage(value)) {
console.warn("Ignoring non-JSON-RPC ACP WebSocket message:", value);
return;
}
this.readableController?.enqueue(value);
}
close() {
this.closeSocket();
this.closeReadable();
}
closeSocket() {
try {
this.socket.close();
}
catch (error) {
console.warn("Failed to close ACP WebSocket:", error);
}
}
clearOwnedCookieStore() {
if (this.ownsCookieStore) {
this.cookieStore.clear();
}
}
closeReadable() {
if (this.isClosed) {
return;
}
this.isClosed = true;
this.clearOwnedCookieStore();
for (const detach of this.detachListeners.splice(0)) {
detach();
}
this.rejectOpen?.(new Error("ACP WebSocket stream closed before open"));
this.rejectOpen = undefined;
this.resolveOpen = undefined;
this.openPromise = undefined;
try {
this.readableController?.close();
}
catch {
// Stream may already be closed/cancelled.
}
}
errorReadable(error) {
if (this.isClosed) {
return;
}
this.isClosed = true;
this.clearOwnedCookieStore();
for (const detach of this.detachListeners.splice(0)) {
detach();
}
this.rejectOpen?.(error);
this.rejectOpen = undefined;
this.resolveOpen = undefined;
this.openPromise = undefined;
this.readableController?.error(error);
}
}
function createConstructorHeaders(headers, cookiePolicy, cookieStore) {
const result = headers ? { ...headers } : {};
if (cookiePolicy === "include") {
const requestHeaders = new Headers(headers);
cookieStore.apply(requestHeaders);
const cookieHeader = requestHeaders.get("Cookie");
if (cookieHeader) {
result[findHeaderName(result, "Cookie") ?? "Cookie"] = cookieHeader;
}
}
return Object.keys(result).length > 0 ? result : undefined;
}
function findHeaderName(headers, name) {
return Object.keys(headers).find((candidate) => candidate.toLowerCase() === name.toLowerCase());
}
function upgradeHeaders(message) {
if (message instanceof Headers) {
return message;
}
if (!isRecord(message) || !("headers" in message)) {
return undefined;
}
return headersFromRecord(message.headers);
}
function headersFromRecord(value) {
if (value instanceof Headers) {
return value;
}
if (!isRecord(value)) {
return undefined;
}
const headers = new Headers();
for (const [name, headerValue] of Object.entries(value)) {
if (Array.isArray(headerValue)) {
for (const item of headerValue) {
headers.append(name, String(item));
}
continue;
}
if (headerValue !== undefined) {
headers.set(name, String(headerValue));
}
}
return headers;
}
function isRecord(value) {
return typeof value === "object" && value !== null;
}
function resolveWebSocket(WebSocketCtor) {
if (WebSocketCtor) {
return WebSocketCtor;
}
if (typeof globalThis.WebSocket === "function") {
return globalThis.WebSocket;
}
throw new Error("createWebSocketStream requires globalThis.WebSocket or options.WebSocket");
}
//# sourceMappingURL=ws-stream.js.map
{"version":3,"file":"ws-stream.js","sourceRoot":"","sources":["../src/ws-stream.ts"],"names":[],"mappings":"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"}
import { describe, expect, it, vi } from "vitest";
import { WebSocket } from "ws";
import { ClientSideConnection, PROTOCOL_VERSION, agent as createAgentApp, client as createClientApp, methods, } from "./acp.js";
import { HEADER_CONNECTION_ID } from "./protocol.js";
import { MemoryAcpCookieStore, createWebSocketStream } from "./ws-stream.js";
import { createTestAgentApp } from "./test-support/test-agent.js";
import { startTestServer } from "./test-support/test-http-server.js";
const nodeWebSocket = WebSocket;
const initializeRequest = {
jsonrpc: "2.0",
id: 0,
method: "initialize",
params: {
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
},
};
const initializeResponse = {
jsonrpc: "2.0",
id: 0,
result: {
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: false,
},
},
};
const sessionNewRequest = {
jsonrpc: "2.0",
id: 1,
method: "session/new",
params: {
cwd: "/tmp",
mcpServers: [],
},
};
describe("createWebSocketStream", () => {
it("exposes the ACP connection ID during the WebSocket handshake", async () => {
const server = await startTestServer();
const socket = new WebSocket(server.wsUrl);
const upgrade = new Promise((resolve, reject) => {
socket.once("upgrade", resolve);
socket.once("error", reject);
});
try {
const request = await upgrade;
expect(request.headers[HEADER_CONNECTION_ID.toLowerCase()]).toMatch(/^[0-9a-f-]{36}$/);
}
finally {
socket.close();
await server.close();
}
});
it("closes pre-created WebSocket connections when the first frame is not initialize", async () => {
const server = await startTestServer();
const socket = new WebSocket(server.wsUrl);
const upgrade = new Promise((resolve, reject) => {
socket.once("upgrade", resolve);
socket.once("error", reject);
});
const close = new Promise((resolve) => {
socket.once("close", (code, reason) => {
resolve({ code, reason: reason.toString("utf8") });
});
});
try {
const request = await upgrade;
const connectionId = request.headers[HEADER_CONNECTION_ID.toLowerCase()];
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
socket.send(JSON.stringify(sessionNewRequest));
await expect(close).resolves.toEqual({
code: 1002,
reason: "First message must be initialize",
});
const response = await fetch(server.url, {
method: "GET",
headers: {
Accept: "text/event-stream",
[HEADER_CONNECTION_ID]: String(connectionId),
},
});
expect(response.status).toBe(404);
}
finally {
socket.close();
await server.close();
}
});
it("ignores binary WebSocket initialize frames", async () => {
const server = await startTestServer();
const socket = new WebSocket(server.wsUrl);
const upgrade = new Promise((resolve, reject) => {
socket.once("upgrade", resolve);
socket.once("error", reject);
});
const close = new Promise((resolve) => {
socket.once("close", (code, reason) => {
resolve({ code, reason: reason.toString("utf8") });
});
});
try {
const request = await upgrade;
const connectionId = request.headers[HEADER_CONNECTION_ID.toLowerCase()];
expect(connectionId).toMatch(/^[0-9a-f-]{36}$/);
socket.send(Buffer.from(JSON.stringify(initializeRequest)), {
binary: true,
});
socket.send(JSON.stringify(sessionNewRequest));
await expect(close).resolves.toEqual({
code: 1002,
reason: "First message must be initialize",
});
const response = await fetch(server.url, {
method: "GET",
headers: {
Accept: "text/event-stream",
[HEADER_CONNECTION_ID]: String(connectionId),
},
});
expect(response.status).toBe(404);
}
finally {
socket.close();
await server.close();
}
});
it("uses the custom WebSocket constructor and queues writes until the socket opens", async () => {
const instances = [];
const stream = createWebSocketStream("ws://agent.example/acp", {
WebSocket: createFakeWebSocketConstructor(instances),
protocols: ["acp"],
headers: { Authorization: "Bearer token" },
});
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
try {
const socket = fakeSocketAt(instances, 0);
expect(socket.url).toBe("ws://agent.example/acp");
expect(socket.protocols).toEqual(["acp"]);
expect(socket.options).toEqual({
headers: { Authorization: "Bearer token" },
});
const write = writer.write(initializeRequest);
await Promise.resolve();
expect(socket.sent).toEqual([]);
socket.open();
await write;
expect(socket.sent).toEqual([JSON.stringify(initializeRequest)]);
socket.receive(JSON.stringify(initializeResponse));
expect(await readMessage(reader)).toEqual(initializeResponse);
}
finally {
reader.releaseLock();
await writer.close().catch(() => undefined);
writer.releaseLock();
}
});
it("does not emit unhandled rejections when the socket closes before the first write", async () => {
const unhandledRejections = [];
const onUnhandledRejection = (reason) => {
unhandledRejections.push(reason);
};
process.on("unhandledRejection", onUnhandledRejection);
const instances = [];
const stream = createWebSocketStream("ws://agent.example/acp", {
WebSocket: createFakeWebSocketConstructor(instances),
});
const reader = stream.readable.getReader();
try {
fakeSocketAt(instances, 0).close();
expect(await reader.read()).toEqual({ done: true, value: undefined });
await waitForUnhandledRejections();
expect(unhandledRejections).toEqual([]);
}
finally {
process.off("unhandledRejection", onUnhandledRejection);
reader.releaseLock();
await closeStream(stream);
}
});
it("passes managed cookies and custom headers to custom WebSocket constructors", async () => {
const cookieStore = new MemoryAcpCookieStore();
cookieStore.store(headersWithSetCookie(["transport=alpha", "route=bravo"]));
const instances = [];
const stream = createWebSocketStream("ws://agent.example/acp", {
WebSocket: createFakeWebSocketConstructor(instances),
cookieStore,
headers: {
Authorization: "Bearer token",
Cookie: "route=caller; caller=custom",
},
});
try {
const socket = fakeSocketAt(instances, 0);
expect(socket.options).toEqual({
headers: {
Authorization: "Bearer token",
Cookie: "transport=alpha; route=caller; caller=custom",
},
});
socket.open();
}
finally {
await closeStream(stream);
}
});
it("stores upgrade cookies for reuse by later WebSocket streams", async () => {
const cookieStore = new MemoryAcpCookieStore();
const instances = [];
const WebSocket = createFakeWebSocketConstructor(instances);
const firstStream = createWebSocketStream("ws://agent.example/acp", {
WebSocket,
cookieStore,
});
const firstSocket = fakeSocketAt(instances, 0);
firstSocket.upgrade({
headers: {
"set-cookie": ["transport=alpha; Path=/"],
},
});
firstSocket.open();
await closeStream(firstStream);
const secondStream = createWebSocketStream("ws://agent.example/acp", {
WebSocket,
cookieStore,
});
try {
const secondSocket = fakeSocketAt(instances, 1);
expect(secondSocket.options).toEqual({
headers: {
Cookie: "transport=alpha",
},
});
secondSocket.open();
}
finally {
await closeStream(secondStream);
}
});
it("omits managed cookies and upgrade cookie storage when cookies are disabled", async () => {
const cookieStore = new MemoryAcpCookieStore();
const instances = [];
const WebSocket = createFakeWebSocketConstructor(instances);
const firstStream = createWebSocketStream("ws://agent.example/acp", {
WebSocket,
cookieStore,
cookies: "omit",
});
const firstSocket = fakeSocketAt(instances, 0);
expect(firstSocket.options).toEqual({
headers: undefined,
});
firstSocket.upgrade({
headers: {
"set-cookie": ["transport=alpha; Path=/"],
},
});
firstSocket.open();
await closeStream(firstStream);
const secondStream = createWebSocketStream("ws://agent.example/acp", {
WebSocket,
cookieStore,
});
try {
const secondSocket = fakeSocketAt(instances, 1);
expect(secondSocket.options).toEqual({
headers: undefined,
});
secondSocket.open();
}
finally {
await closeStream(secondStream);
}
});
it("ignores binary, malformed JSON, and non-JSON-RPC messages", async () => {
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
const instances = [];
const stream = createWebSocketStream("ws://agent.example/acp", {
WebSocket: createFakeWebSocketConstructor(instances),
});
const reader = stream.readable.getReader();
try {
const socket = fakeSocketAt(instances, 0);
socket.open();
socket.receive(new Uint8Array([1, 2, 3]), true);
socket.receive(new TextEncoder().encode(JSON.stringify(initializeResponse)));
socket.receive(new TextEncoder().encode(JSON.stringify(initializeResponse)).buffer);
socket.receive("not json");
socket.receive(JSON.stringify({ hello: "world" }));
socket.receive(JSON.stringify(initializeResponse));
expect(await readMessage(reader)).toEqual(initializeResponse);
expect(warn).toHaveBeenCalledTimes(2);
}
finally {
reader.releaseLock();
warn.mockRestore();
await closeStream(stream);
}
});
it("closes the readable stream when the socket closes", async () => {
const instances = [];
const stream = createWebSocketStream("ws://agent.example/acp", {
WebSocket: createFakeWebSocketConstructor(instances),
});
const reader = stream.readable.getReader();
try {
const socket = fakeSocketAt(instances, 0);
socket.open();
socket.close();
expect(await reader.read()).toEqual({ done: true, value: undefined });
}
finally {
reader.releaseLock();
}
});
it("runs initialize, newSession, and prompt through ClientSideConnection", async () => {
const updates = [];
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 2 }));
const stream = createWebSocketStream(server.wsUrl, {
WebSocket: nodeWebSocket,
});
const conn = new ClientSideConnection(() => createTestClient({ updates }), stream);
try {
expect(await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
})).toMatchObject({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: { loadSession: false },
});
const session = await conn.newSession({ cwd: "/tmp", mcpServers: [] });
expect(session.sessionId).toMatch(/^[0-9a-f-]{36}$/);
await expect(conn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
})).resolves.toEqual({ stopReason: "end_turn" });
expect(updates).toHaveLength(2);
expect(updates).toMatchObject([
{
sessionId: session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-1" },
},
},
{
sessionId: session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-2" },
},
},
]);
}
finally {
await closeStream(stream);
await server.close();
}
});
it("runs initialize, newSession, and prompt through a client app", async () => {
const updates = [];
const server = await startTestServer(() => createTestAgentApp({ chunkCount: 2 }));
const stream = createWebSocketStream(server.wsUrl, {
WebSocket: nodeWebSocket,
});
try {
const result = await createClientApp({ name: "ws-app-client" })
.onNotification(methods.client.session.update, (c) => {
updates.push(c.params);
})
.connectWith(stream, async (agent) => {
const initialized = await agent.request(methods.agent.initialize, {
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await agent.request(methods.agent.session.new, {
cwd: "/tmp",
mcpServers: [],
});
const prompt = await agent.request(methods.agent.session.prompt, {
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
});
return { initialized, prompt, session };
});
expect(result.initialized).toMatchObject({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: { loadSession: false },
});
expect(result.session.sessionId).toMatch(/^[0-9a-f-]{36}$/);
expect(result.prompt).toEqual({ stopReason: "end_turn" });
expect(updates).toMatchObject([
{
sessionId: result.session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-1" },
},
},
{
sessionId: result.session.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { text: "chunk-2" },
},
},
]);
}
finally {
await closeStream(stream);
await server.close();
}
});
it("round-trips permission requests through ClientSideConnection", async () => {
const updates = [];
const permissionRequests = [];
const server = await startTestServer(() => createTestAgentApp({ enablePermission: true }));
const stream = createWebSocketStream(server.wsUrl, {
WebSocket: nodeWebSocket,
});
const conn = new ClientSideConnection(() => createTestClient({ updates, permissionRequests }), stream);
try {
await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const session = await conn.newSession({ cwd: "/tmp", mcpServers: [] });
await expect(conn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Hello" }],
})).resolves.toEqual({ stopReason: "end_turn" });
expect(permissionRequests).toHaveLength(1);
expect(permissionRequests[0]).toMatchObject({
sessionId: session.sessionId,
toolCall: {
toolCallId: "permission-tool",
title: "Permission tool",
},
});
expect(updates).toEqual(expect.arrayContaining([
expect.objectContaining({
sessionId: session.sessionId,
update: expect.objectContaining({
sessionUpdate: "agent_message_chunk",
content: expect.objectContaining({
text: "permission-selected-allow",
}),
}),
}),
]));
}
finally {
await closeStream(stream);
await server.close();
}
});
it("loads durable sessions after a WebSocket reconnect", async () => {
const durableSessions = new Map();
const connectionIds = [];
const WebSocket = createRecordingWebSocketConstructor(connectionIds);
const cookieStore = new MemoryAcpCookieStore();
const server = await startTestServer(() => createDurableSessionAgent(durableSessions));
try {
const firstUpdates = [];
const firstStream = createWebSocketStream(server.wsUrl, {
WebSocket,
cookieStore,
});
const firstConn = new ClientSideConnection(() => createTestClient({ updates: firstUpdates }), firstStream);
const initialized = await firstConn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
expect(initialized.agentCapabilities?.loadSession).toBe(true);
const session = await firstConn.newSession({
cwd: "/tmp",
mcpServers: [],
});
await expect(firstConn.prompt({
sessionId: session.sessionId,
prompt: [{ type: "text", text: "Remember this" }],
})).resolves.toEqual({ stopReason: "end_turn" });
await waitForUpdates(firstUpdates, 1);
await closeStream(firstStream);
expect(durableSessions.has(session.sessionId)).toBe(true);
const secondUpdates = [];
const secondStream = createWebSocketStream(server.wsUrl, {
WebSocket,
cookieStore,
});
const secondConn = new ClientSideConnection(() => createTestClient({ updates: secondUpdates }), secondStream);
const reinitialized = await secondConn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
expect(reinitialized.agentCapabilities?.loadSession).toBe(true);
// Production agents must authorize session/load against the authenticated
// principal. This SDK transport test omits auth because there is no
// generic auth layer in the SDK.
await expect(secondConn.loadSession({
sessionId: session.sessionId,
cwd: "/tmp",
mcpServers: [],
})).resolves.toEqual({});
await waitForUpdates(secondUpdates, firstUpdates.length);
await closeStream(secondStream);
expect(connectionIds).toHaveLength(2);
expect(connectionIds[0]).not.toBe(connectionIds[1]);
expect(secondUpdates).toEqual(firstUpdates);
}
finally {
await server.close();
}
});
it("keeps multiple sessions isolated through the SDK client abstraction", async () => {
const updates = [];
const server = await startTestServer();
const stream = createWebSocketStream(server.wsUrl, {
WebSocket: nodeWebSocket,
});
const conn = new ClientSideConnection(() => createTestClient({ updates }), stream);
try {
await conn.initialize({
protocolVersion: PROTOCOL_VERSION,
clientCapabilities: {},
});
const firstSession = await conn.newSession({
cwd: "/tmp",
mcpServers: [],
});
const secondSession = await conn.newSession({
cwd: "/tmp/other",
mcpServers: [],
});
await Promise.all([
conn.prompt({
sessionId: firstSession.sessionId,
prompt: [{ type: "text", text: "First" }],
}),
conn.prompt({
sessionId: secondSession.sessionId,
prompt: [{ type: "text", text: "Second" }],
}),
]);
expect(updates).toEqual(expect.arrayContaining([
expect.objectContaining({ sessionId: firstSession.sessionId }),
expect.objectContaining({ sessionId: secondSession.sessionId }),
]));
expect(updates.filter((update) => update.sessionId === firstSession.sessionId)).toHaveLength(1);
expect(updates.filter((update) => update.sessionId === secondSession.sessionId)).toHaveLength(1);
}
finally {
await closeStream(stream);
await server.close();
}
});
});
function createDurableSessionAgent(sessions) {
return createAgentApp({ name: "durable-session-agent" })
.onRequest(methods.agent.initialize, () => ({
protocolVersion: PROTOCOL_VERSION,
agentCapabilities: {
loadSession: true,
},
}))
.onRequest(methods.agent.session.new, (c) => {
const sessionId = globalThis.crypto.randomUUID();
sessions.set(sessionId, {
cwd: c.params.cwd,
history: [],
});
return { sessionId };
})
.onRequest(methods.agent.session.load, async (c) => {
const session = sessions.get(c.params.sessionId);
if (!session) {
throw new Error(`Unknown durable session: ${c.params.sessionId}`);
}
for (const update of session.history) {
await c.client.notify(methods.client.session.update, update);
}
return {};
})
.onRequest(methods.agent.session.prompt, async (c) => {
const session = sessions.get(c.params.sessionId);
if (!session) {
throw new Error(`Unknown durable session: ${c.params.sessionId}`);
}
const update = {
sessionId: c.params.sessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: {
type: "text",
text: `durable-history:${session.cwd}`,
},
},
};
session.history.push(update);
await c.client.notify(methods.client.session.update, update);
return { stopReason: "end_turn" };
})
.onRequest(methods.agent.authenticate, () => ({}))
.onNotification(methods.agent.session.cancel, () => { });
}
function createTestClient(state) {
return {
requestPermission: (params) => {
state.permissionRequests?.push(params);
return Promise.resolve({
outcome: {
outcome: "selected",
optionId: "allow",
},
});
},
sessionUpdate: (params) => {
state.updates.push(params);
return Promise.resolve();
},
};
}
async function closeStream(stream) {
await stream.writable.close().catch(() => undefined);
}
async function readMessage(reader) {
const result = await reader.read();
if (result.done) {
throw new Error("Expected a message");
}
return result.value;
}
async function waitForUpdates(updates, count) {
const deadline = Date.now() + 1_000;
while (updates.length < count) {
if (Date.now() > deadline) {
throw new Error(`Timed out waiting for ${count} session updates`);
}
await new Promise((resolve) => setTimeout(resolve, 1));
}
}
async function waitForUnhandledRejections() {
await new Promise((resolve) => setTimeout(resolve, 0));
}
function createRecordingWebSocketConstructor(connectionIds) {
return class RecordingWebSocket extends WebSocket {
constructor(url, protocols, options) {
super(url, protocols, options);
this.once("upgrade", (message) => {
const connectionId = message.headers[HEADER_CONNECTION_ID.toLowerCase()];
if (typeof connectionId === "string") {
connectionIds.push(connectionId);
}
});
}
};
}
function createFakeWebSocketConstructor(instances) {
return class extends FakeWebSocket {
constructor(url, protocols, options) {
super(url, protocols, options);
instances.push(this);
}
};
}
function fakeSocketAt(instances, index) {
const socket = instances[index];
if (!socket) {
throw new Error(`Expected fake WebSocket at index ${index}`);
}
return socket;
}
function headersWithSetCookie(values) {
const headers = new Headers();
Object.defineProperty(headers, "getSetCookie", {
value: () => values,
});
return headers;
}
class FakeWebSocket {
url;
protocols;
options;
sent = [];
listeners = new Map();
readyState = 0;
constructor(url, protocols, options) {
this.url = url;
this.protocols = protocols;
this.options = options;
}
send(data) {
if (this.readyState !== 1) {
throw new Error("Fake WebSocket is not open");
}
this.sent.push(data);
}
close() {
if (this.readyState === 3) {
return;
}
this.readyState = 3;
this.emit("close", {});
}
addEventListener(type, listener) {
let listeners = this.listeners.get(type);
if (!listeners) {
listeners = new Set();
this.listeners.set(type, listeners);
}
listeners.add(listener);
}
removeEventListener(type, listener) {
this.listeners.get(type)?.delete(listener);
}
open() {
this.readyState = 1;
this.emit("open", {});
}
receive(data, isBinary = false) {
this.emit("message", { data, isBinary });
}
upgrade(message) {
this.emit("upgrade", message);
}
emit(type, event) {
for (const listener of this.listeners.get(type) ?? []) {
listener(event);
}
}
}
//# sourceMappingURL=ws-stream.test.js.map
{"version":3,"file":"ws-stream.test.js","sourceRoot":"","sources":["../src/ws-stream.test.ts"],"names":[],"mappings":"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"}
/** Minimal browser/Node-compatible WebSocket shape used by ACP transports. */
export interface WebSocketLike {
readonly readyState?: number;
send(data: string): void;
close(code?: number, reason?: string): void;
addEventListener?(type: string, listener: (event: unknown) => void): void;
removeEventListener?(type: string, listener: (event: unknown) => void): void;
on?(type: string, listener: (...args: unknown[]) => void): unknown;
off?(type: string, listener: (...args: unknown[]) => void): unknown;
removeListener?(type: string, listener: (...args: unknown[]) => void): unknown;
}
export declare function onWebSocket(socket: WebSocketLike, type: string, listener: (...args: unknown[]) => void): () => void;
export declare function webSocketMessageToString(args: unknown[]): string | undefined;
export function onWebSocket(socket, type, listener) {
if (socket.on) {
const eventListener = (...args) => {
listener(...normalizeEventEmitterMessageArgs(type, args));
};
socket.on(type, eventListener);
return () => {
if (socket.off) {
socket.off(type, eventListener);
return;
}
socket.removeListener?.(type, eventListener);
};
}
if (socket.addEventListener) {
const eventListener = (event) => listener(event);
socket.addEventListener(type, eventListener);
return () => {
socket.removeEventListener?.(type, eventListener);
};
}
throw new Error("WebSocket object does not support event listeners");
}
export function webSocketMessageToString(args) {
const data = extractMessageData(args);
if (typeof data === "string") {
return data;
}
return undefined;
}
function normalizeEventEmitterMessageArgs(type, args) {
if (type !== "message" || typeof args[1] !== "boolean") {
return args;
}
if (args[1]) {
return [undefined];
}
return [decodeWebSocketTextData(args[0])];
}
function decodeWebSocketTextData(data) {
if (typeof data === "string") {
return data;
}
if (data instanceof ArrayBuffer) {
return new TextDecoder().decode(data);
}
if (ArrayBuffer.isView(data)) {
return new TextDecoder().decode(data);
}
if (isArrayBufferViewArray(data)) {
return decodeArrayBufferViews(data);
}
return undefined;
}
function extractMessageData(args) {
const [first] = args;
if (isMessageEventLike(first)) {
return first.data;
}
return first;
}
function isMessageEventLike(value) {
return typeof value === "object" && value !== null && "data" in value;
}
function isArrayBufferViewArray(value) {
return Array.isArray(value) && value.every(ArrayBuffer.isView);
}
function decodeArrayBufferViews(views) {
const totalLength = views.reduce((sum, view) => sum + view.byteLength, 0);
const combined = new Uint8Array(totalLength);
let offset = 0;
for (const view of views) {
combined.set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength), offset);
offset += view.byteLength;
}
return new TextDecoder().decode(combined);
}
//# sourceMappingURL=ws-utils.js.map
{"version":3,"file":"ws-utils.js","sourceRoot":"","sources":["../src/ws-utils.ts"],"names":[],"mappings":"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"}
import { describe, expect, it } from "vitest";
import { onWebSocket, webSocketMessageToString } from "./ws-utils.js";
describe("webSocketMessageToString", () => {
it("accepts only WebSocket text message payloads", () => {
expect(webSocketMessageToString(["text"])).toBe("text");
expect(webSocketMessageToString([{ data: "event text" }])).toBe("event text");
expect(webSocketMessageToString([new TextEncoder().encode("binary text")])).toBe(undefined);
expect(webSocketMessageToString([
new TextEncoder().encode("binary text").buffer,
])).toBe(undefined);
expect(webSocketMessageToString([[new TextEncoder().encode("binary text")]])).toBe(undefined);
});
});
describe("onWebSocket", () => {
it("normalizes Node ws text frames before shared message parsing", () => {
const socket = new EventEmitterWebSocket();
const messages = [];
onWebSocket(socket, "message", (...args) => {
messages.push(webSocketMessageToString(args));
});
socket.emit("message", new TextEncoder().encode("text frame"), false);
socket.emit("message", new TextEncoder().encode("binary frame"), true);
expect(messages).toEqual(["text frame", undefined]);
});
});
class EventEmitterWebSocket {
listeners = new Map();
send() { }
close() { }
on(type, listener) {
this.listeners.set(type, (this.listeners.get(type) ?? new Set()).add(listener));
}
off(type, listener) {
this.listeners.get(type)?.delete(listener);
}
emit(type, ...args) {
this.listeners.get(type)?.forEach((listener) => {
listener(...args);
});
}
}
//# sourceMappingURL=ws-utils.test.js.map
{"version":3,"file":"ws-utils.test.js","sourceRoot":"","sources":["../src/ws-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEtE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7D,YAAY,CACb,CAAC;QACF,MAAM,CACJ,wBAAwB,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CACpE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,MAAM,CACJ,wBAAwB,CAAC;YACvB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM;SAC/C,CAAC,CACH,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,MAAM,CACJ,wBAAwB,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACtE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAE/C,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACzC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QAEvE,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,qBAAqB;IACR,SAAS,GAAG,IAAI,GAAG,EAGjC,CAAC;IAEJ,IAAI,KAAU,CAAC;IAEf,KAAK,KAAU,CAAC;IAEhB,EAAE,CAAC,IAAY,EAAE,QAAsC;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,IAAI,EACJ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CACtD,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,QAAsC;QACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,GAAG,IAAe;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7C,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}

@@ -5,6 +5,4 @@ #!/usr/bin/env node

class ExampleAgent {
connection;
sessions;
constructor(connection) {
this.connection = connection;
constructor() {
this.sessions = new Map();

@@ -39,3 +37,3 @@ }

}
async prompt(params) {
async prompt(params, cx) {
const session = this.sessions.get(params.sessionId);

@@ -48,3 +46,3 @@ if (!session) {

try {
await this.simulateTurn(params.sessionId, session.pendingPrompt.signal);
await this.simulateTurn(params.sessionId, session.pendingPrompt.signal, cx);
}

@@ -62,5 +60,5 @@ catch (err) {

}
async simulateTurn(sessionId, abortSignal) {
async simulateTurn(sessionId, abortSignal, cx) {
// Send initial text chunk
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -77,3 +75,3 @@ update: {

// Send a tool call that doesn't need permission
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -92,3 +90,3 @@ update: {

// Update tool call to completed
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -113,3 +111,3 @@ update: {

// Send more text
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -126,3 +124,3 @@ update: {

// Send a tool call that DOES need permission
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -143,3 +141,3 @@ update: {

// Request permission for the sensitive operation
const permissionResponse = await this.connection.requestPermission({
const permissionResponse = await cx.request(acp.methods.client.session.requestPermission, {
sessionId,

@@ -175,3 +173,3 @@ toolCall: {

case "allow": {
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -186,3 +184,3 @@ update: {

await this.simulateModelInteraction(abortSignal);
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -201,3 +199,3 @@ update: {

await this.simulateModelInteraction(abortSignal);
await this.connection.sessionUpdate({
await cx.notify(acp.methods.client.session.update, {
sessionId,

@@ -236,3 +234,12 @@ update: {

const stream = acp.ndJsonStream(input, output);
new acp.AgentSideConnection((conn) => new ExampleAgent(conn), stream);
const agent = new ExampleAgent();
acp
.agent({ name: "example-agent" })
.onRequest("initialize", (ctx) => agent.initialize(ctx.params))
.onRequest("session/new", (ctx) => agent.newSession(ctx.params))
.onRequest("authenticate", (ctx) => agent.authenticate(ctx.params))
.onRequest("session/set_mode", (ctx) => agent.setSessionMode(ctx.params))
.onRequest("session/prompt", (ctx) => agent.prompt(ctx.params, ctx.client))
.onNotification("session/cancel", (ctx) => agent.cancel(ctx.params))
.connect(stream);
//# sourceMappingURL=agent.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/examples/agent.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/examples/agent.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMjD,MAAM,YAAY;IACR,QAAQ,CAA4B;IAE5C;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAA8B;QAE9B,OAAO;YACL,eAAe,EAAE,GAAG,CAAC,gBAAgB;YACrC,iBAAiB,EAAE;gBACjB,WAAW,EAAE,KAAK;aACnB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAA8B;QAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,OAAO;YACL,SAAS;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAAgC;QAEhC,yCAAyC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAAkC;QAElC,uDAAuD;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAyB,EACzB,EAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,SAAS,YAAY,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,aAAa,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CACrB,MAAM,CAAC,SAAS,EAChB,OAAO,CAAC,aAAa,CAAC,MAAM,EAC5B,EAAE,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YACrC,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;QAE7B,OAAO;YACL,UAAU,EAAE,UAAU;SACvB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,SAAiB,EACjB,WAAwB,EACxB,EAAoB;QAEpB,0BAA0B;QAC1B,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACjD,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kGAAkG;iBACzG;aACF;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEjD,gDAAgD;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACjD,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,WAAW;gBAC1B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,uBAAuB;gBAC9B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;gBAC3C,QAAQ,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;aACzC;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEjD,gCAAgC;QAChC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACjD,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,kBAAkB;gBACjC,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,6CAA6C;yBACpD;qBACF;iBACF;gBACD,SAAS,EAAE,EAAE,OAAO,EAAE,6CAA6C,EAAE;aACtE;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEjD,iBAAiB;QACjB,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACjD,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qFAAqF;iBAC5F;aACF;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEjD,6CAA6C;QAC7C,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACjD,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,WAAW;gBAC1B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,uCAAuC;gBAC9C,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;gBAC7C,QAAQ,EAAE;oBACR,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,oCAAoC;iBAC9C;aACF;SACF,CAAC,CAAC;QAEH,iDAAiD;QACjD,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,OAAO,CACzC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAC5C;YACE,SAAS;YACT,QAAQ,EAAE;gBACR,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,uCAAuC;gBAC9C,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC;gBACvD,QAAQ,EAAE;oBACR,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,oCAAoC;iBAC9C;aACF;YACD,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,mBAAmB;oBACzB,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,kBAAkB;oBACxB,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CACF,CAAC;QAEF,IAAI,kBAAkB,CAAC,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,QAAQ,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC5C,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;oBACjD,SAAS;oBACT,MAAM,EAAE;wBACN,aAAa,EAAE,kBAAkB;wBACjC,UAAU,EAAE,QAAQ;wBACpB,MAAM,EAAE,WAAW;wBACnB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,EAAE;qBAC/D;iBACF,CAAC,CAAC;gBAEH,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;gBAEjD,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;oBACjD,SAAS;oBACT,MAAM,EAAE;wBACN,aAAa,EAAE,qBAAqB;wBACpC,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,uFAAuF;yBAC9F;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;gBAEjD,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;oBACjD,SAAS;oBACT,MAAM,EAAE;wBACN,aAAa,EAAE,qBAAqB;wBACpC,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,uFAAuF;yBAC9F;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CACb,iCAAiC,kBAAkB,CAAC,OAAO,EAAE,CAC9D,CAAC;QACN,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,WAAwB;QACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACrC,UAAU,CAAC,GAAG,EAAE;YACd,kEAAkE;YAClE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA8B;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;CACF;AAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAA+B,CAAC;AAE3E,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/C,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;AAEjC,GAAG;KACA,KAAK,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;KAChC,SAAS,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KAC9D,SAAS,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KAC/D,SAAS,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KAClE,SAAS,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KACxE,SAAS,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KAC1E,cAAc,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KACnE,OAAO,CAAC,MAAM,CAAC,CAAC"}

@@ -86,36 +86,37 @@ #!/usr/bin/env node

const output = Readable.toWeb(agentProcess.stdout);
// Create the client connection
// Create the client handlers and connect to the agent
const client = new ExampleClient();
const stream = acp.ndJsonStream(input, output);
const connection = new acp.ClientSideConnection((_agent) => client, stream);
try {
// Initialize the connection
const initResult = await connection.initialize({
protocolVersion: acp.PROTOCOL_VERSION,
clientCapabilities: {
fs: {
readTextFile: true,
writeTextFile: true,
const promptResult = await acp
.client({ name: "example-client" })
.onRequest(acp.methods.client.session.requestPermission, (ctx) => client.requestPermission(ctx.params))
.onRequest(acp.methods.client.fs.writeTextFile, (ctx) => client.writeTextFile(ctx.params))
.onRequest(acp.methods.client.fs.readTextFile, (ctx) => client.readTextFile(ctx.params))
.connectWith(stream, async (ctx) => {
// Initialize the connection
const initResult = await ctx.request(acp.methods.agent.initialize, {
protocolVersion: acp.PROTOCOL_VERSION,
clientCapabilities: {
fs: {
readTextFile: true,
writeTextFile: true,
},
},
},
});
console.log(`✅ Connected to agent (protocol v${initResult.protocolVersion})`);
return ctx.buildSession(process.cwd()).withSession(async (session) => {
console.log(`📝 Created session: ${session.sessionId}`);
console.log(`💬 User: Hello, agent!\n`);
process.stdout.write(" ");
session.prompt("Hello, agent!");
for (;;) {
const message = await session.nextUpdate();
if (message.kind === "stop") {
return message.response;
}
await client.sessionUpdate(message.notification);
}
});
});
console.log(`✅ Connected to agent (protocol v${initResult.protocolVersion})`);
// Create a new session
const sessionResult = await connection.newSession({
cwd: process.cwd(),
mcpServers: [],
});
console.log(`📝 Created session: ${sessionResult.sessionId}`);
console.log(`💬 User: Hello, agent!\n`);
process.stdout.write(" ");
// Send a test prompt
const promptResult = await connection.prompt({
sessionId: sessionResult.sessionId,
prompt: [
{
type: "text",
text: "Hello, agent!",
},
],
});
console.log(`\n\n✅ Agent completed with: ${promptResult.stopReason}`);

@@ -122,0 +123,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/examples/client.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/examples/client.ts"],"names":[],"mappings":"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"}

@@ -0,31 +1,470 @@

import type { Stream } from "./stream.js";
/**
* JSON-RPC 2.0 type definitions for internal use.
* Any JSON-RPC message that can pass through an ACP stream.
*/
export type AnyMessage = AnyRequest | AnyResponse | AnyNotification;
/**
* Raw JSON-RPC request message.
*/
export type AnyRequest = {
/**
* JSON-RPC protocol version.
*/
jsonrpc: "2.0";
/**
* Request identifier echoed by the response.
*/
id: string | number | null;
/**
* Method name to invoke.
*/
method: string;
/**
* Optional method params.
*/
params?: unknown;
};
/**
* Raw JSON-RPC response message.
*/
export type AnyResponse = {
/**
* JSON-RPC protocol version.
*/
jsonrpc: "2.0";
/**
* Request identifier this response resolves.
*/
id: string | number | null;
} & Result<unknown>;
/**
* Raw JSON-RPC notification message.
*/
export type AnyNotification = {
/**
* JSON-RPC protocol version.
*/
jsonrpc: "2.0";
/**
* Notification method name.
*/
method: string;
/**
* Optional notification params.
*/
params?: unknown;
};
/**
* JSON-RPC result payload, either a successful result or an error.
*/
export type Result<T> = {
/**
* Successful result value.
*/
result: T;
} | {
/**
* JSON-RPC error result.
*/
error: ErrorResponse;
};
/**
* JSON-RPC error response payload.
*/
export type ErrorResponse = {
/**
* JSON-RPC error code.
*/
code: number;
/**
* Human-readable error message.
*/
message: string;
/**
* Optional structured error data.
*/
data?: unknown;
};
export type RequestHandler = (method: string, params: unknown) => Promise<unknown>;
export type NotificationHandler = (method: string, params: unknown) => Promise<void>;
/**
* Legacy request dispatcher callback.
*/
export type RequestHandler = (method: string, params: unknown, cx: ConnectionContext) => MaybePromise<unknown>;
/**
* Legacy notification dispatcher callback.
*/
export type NotificationHandler = (method: string, params: unknown, cx: ConnectionContext) => MaybePromise<void>;
export declare function isJsonRpcMessage(value: unknown): value is AnyMessage;
export declare function isRequestMessage(value: unknown): value is AnyRequest;
export declare function isResponseMessage(value: unknown): value is AnyResponse;
export declare function isNotificationMessage(value: unknown): value is AnyNotification;
export declare function isRecord(value: unknown): value is Record<string, unknown>;
/**
* Value that may be returned synchronously or through a promise.
*/
export type MaybePromise<T> = T | Promise<T>;
/**
* Incoming request passed to JSON-RPC handlers.
*/
export type IncomingRequest = {
/**
* Discriminates incoming requests from notifications.
*/
kind: "request";
/**
* Request method name.
*/
method: string;
/**
* Raw request params.
*/
params: unknown;
/**
* Original wire request.
*/
raw: AnyRequest;
/**
* Responder used to complete the request.
*/
responder: RequestResponder<unknown>;
};
/**
* Incoming notification passed to JSON-RPC handlers.
*/
export type IncomingNotification = {
/**
* Discriminates incoming notifications from requests.
*/
kind: "notification";
/**
* Notification method name.
*/
method: string;
/**
* Raw notification params.
*/
params: unknown;
/**
* Original wire notification.
*/
raw: AnyNotification;
};
/**
* Incoming request or notification.
*/
export type IncomingMessage = IncomingRequest | IncomingNotification;
/**
* Result returned by a JSON-RPC handler.
*/
export type HandleResult = {
/**
* Indicates that no later handlers should see the message.
*/
handled: true;
} | {
/**
* Indicates that later handlers may try to handle the message.
*/
handled: false;
/**
* Optional replacement message to pass to later handlers.
*/
message?: IncomingMessage;
/**
* Requeue this message if it remains unhandled.
*/
retry?: boolean;
};
/**
* Helpers for constructing `HandleResult` values.
*/
export declare const Handled: {
/**
* Marks a message as handled.
*/
yes(): HandleResult;
/**
* Leaves a message unhandled so later handlers can process it.
*/
no(message?: IncomingMessage, retry?: boolean): HandleResult;
};
/**
* Handler in the lower-level JSON-RPC dispatch chain.
*/
export interface JsonRpcHandler {
/**
* Handles or passes through one incoming request or notification.
*/
handleMessage(message: IncomingMessage, cx: ConnectionContext): MaybePromise<HandleResult | void>;
/**
* Optional label used for diagnostics.
*/
describe?(): string;
}
/**
* Typed request callback registered with `ConnectionBuilder.onReceiveRequest`.
*/
export type RequestCallback<Req, Resp> = (request: Req, responder: RequestResponder<Resp>, cx: ConnectionContext) => MaybePromise<HandleResult | void>;
/**
* Typed notification callback registered with
* `ConnectionBuilder.onReceiveNotification`.
*/
export type NotificationCallback<Notif> = (notification: Notif, cx: ConnectionContext) => MaybePromise<HandleResult | void>;
/**
* Responder for one incoming JSON-RPC request.
*
* Handlers may use this when they need to decide exactly when or how the
* response is sent.
*/
export declare class RequestResponder<Resp = unknown> {
/**
* Request ID to include in the response.
*/
readonly id: string | number | null;
private sendResult;
private didRespond;
constructor(
/**
* Request ID to include in the response.
*/
id: string | number | null, sendResult: (result: Result<Resp>) => Promise<void>);
/**
* Whether this request has already received a response.
*/
get responded(): boolean;
/**
* Sends a successful JSON-RPC response.
*/
respond(response: Resp): Promise<void>;
/**
* Sends an error JSON-RPC response.
*/
respondWithError(error: RequestError | ErrorResponse): Promise<void>;
/**
* Sends a complete JSON-RPC result payload.
*/
respondWithResult(result: Result<Resp>): Promise<void>;
}
/**
* Disposable handle returned when a handler is registered dynamically.
*/
export declare class HandlerRegistration {
private disposeHandler;
private active;
constructor(disposeHandler: () => void);
/**
* Unregisters the associated handler.
*/
dispose(): void;
/**
* Supports explicit resource management with `using`.
*/
[Symbol.dispose](): void;
/**
* Returns this registration for call sites that intentionally keep it active.
*/
runIndefinitely(): this;
}
/**
* Per-connection context passed to low-level JSON-RPC handlers.
*/
export declare class ConnectionContext {
private connection;
constructor(connection: Connection);
/**
* Sends a request over the connection.
*/
sendRequest<Req, Resp, Output = Resp>(method: string, params?: Req, mapResponse?: (response: Resp) => Output): Promise<Output>;
/**
* Sends a notification over the connection.
*/
sendNotification<N>(method: string, params?: N): Promise<void>;
/**
* Registers a handler that can be disposed independently.
*/
addDynamicHandler(handler: JsonRpcHandler): HandlerRegistration;
/**
* AbortSignal that aborts when the connection closes.
*/
get signal(): AbortSignal;
/**
* Promise that resolves when the connection closes.
*/
get closed(): Promise<void>;
}
/**
* Options for constructing a lower-level JSON-RPC connection.
*/
export type ConnectionOptions = {
/**
* Extra handlers to prepend to the connection's handler chain.
*/
handlers?: JsonRpcHandler[];
};
/**
* Lower-level JSON-RPC connection over an ACP `Stream`.
*
* Most ACP integrations should use `agent(...)` or `client(...)`. Use this
* class when building generic JSON-RPC middleware or custom dispatch behavior.
*/
export declare class Connection {
private pendingResponses;
private nextRequestId;
private staticHandlers;
private dynamicHandlers;
private stream;
private writeQueue;
private abortController;
private closedPromise;
private retryQueue;
private context;
private receiveReader?;
constructor(requestHandler: RequestHandler, notificationHandler: NotificationHandler, stream: Stream, options?: ConnectionOptions);
constructor(stream: Stream, handlers: JsonRpcHandler[], options?: ConnectionOptions);
/**
* Creates a builder for configuring a handler-based connection.
*/
static builder(): ConnectionBuilder;
/**
* Runs an operation while the connection is open, then closes the connection.
*
* If the stream closes before `op` settles, the returned promise rejects with
* the connection close reason.
*/
runUntil<T>(op: (cx: ConnectionContext) => MaybePromise<T>): Promise<T>;
/**
* Adds a handler after the connection has started.
*
* Any messages queued with `Handled.no(message, true)` are retried after the
* handler is added.
*/
addDynamicHandler(handler: JsonRpcHandler): HandlerRegistration;
/**
* AbortSignal that aborts when the connection closes.
*/
get signal(): AbortSignal;
/**
* Promise that resolves when the connection closes.
*/
get closed(): Promise<void>;
/**
* Sends a JSON-RPC request.
*
* `mapResponse` can convert the raw result before the returned promise
* resolves.
*/
sendRequest<Req, Resp, Output = Resp>(method: string, params?: Req, mapResponse?: (response: Resp) => Output): Promise<Output>;
/**
* Sends a JSON-RPC notification.
*/
sendNotification<N>(method: string, params?: N): Promise<void>;
/**
* Closes the connection and rejects pending requests.
*/
close(error?: unknown): void;
private initialize;
private legacyHandler;
private receive;
private receiveMessage;
private processIncomingMessage;
private toIncomingMessage;
private handleResponse;
private closedReason;
private sendMessage;
}
/**
* Builder for a lower-level handler-based JSON-RPC connection.
*/
export declare class ConnectionBuilder {
private handlers;
private connectionName?;
/**
* Sets a diagnostic name used by handlers created from this builder.
*/
name(name: string): this;
/**
* Adds a raw JSON-RPC handler to the handler chain.
*/
withHandler(handler: JsonRpcHandler): this;
/**
* Adds a handler that can inspect every incoming request or notification.
*
* Observer callbacks that return void pass the message through to later
* handlers. Return `Handled.yes()` to stop dispatch explicitly.
*/
onReceiveMessage(handler: (message: IncomingMessage, cx: ConnectionContext) => MaybePromise<HandleResult | void>): this;
/**
* Adds a typed request handler for one method.
*/
onReceiveRequest<Req, Resp = unknown>(method: string, parse: (params: unknown) => Req, handler: RequestCallback<Req, Resp>): this;
/**
* Adds a typed notification handler for one method.
*/
onReceiveNotification<Notif>(method: string, parse: (params: unknown) => Notif, handler: NotificationCallback<Notif>): this;
/**
* Connects the configured handlers to a stream.
*/
connect(stream: Stream, options?: ConnectionOptions): Connection;
/**
* Connects to a stream for the lifetime of `op`, then closes the connection.
*/
connectWith<T>(stream: Stream, op: (cx: ConnectionContext) => MaybePromise<T>, options?: ConnectionOptions): Promise<T>;
}
/**
* JSON-RPC error object.
*
* Represents an error that occurred during method execution, following the
* JSON-RPC 2.0 error object specification with optional additional data.
*
* See protocol docs: [JSON-RPC Error Object](https://www.jsonrpc.org/specification#error_object)
*/
export declare class RequestError extends Error {
/**
* JSON-RPC error code.
*/
code: number;
/**
* Additional JSON-RPC error data.
*/
data?: unknown;
constructor(
/**
* JSON-RPC error code.
*/
code: number, message: string, data?: unknown);
/**
* Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.
*/
static parseError(data?: unknown, additionalMessage?: string): RequestError;
/**
* The JSON sent is not a valid Request object.
*/
static invalidRequest(data?: unknown, additionalMessage?: string): RequestError;
/**
* The method does not exist / is not available.
*/
static methodNotFound(method: string): RequestError;
/**
* Invalid method parameter(s).
*/
static invalidParams(data?: unknown, additionalMessage?: string): RequestError;
/**
* Internal JSON-RPC error.
*/
static internalError(data?: unknown, additionalMessage?: string): RequestError;
/**
* Authentication required.
*/
static authRequired(data?: unknown, additionalMessage?: string): RequestError;
/**
* Resource, such as a file, was not found
*/
static resourceNotFound(uri?: string): RequestError;
/**
* Converts this error to a JSON-RPC result object.
*/
toResult<T>(): Result<T>;
/**
* Converts this error to a JSON-RPC error response payload.
*/
toErrorResponse(): ErrorResponse;
}

@@ -0,5 +1,725 @@

export function isJsonRpcMessage(value) {
return (isRequestMessage(value) ||
isResponseMessage(value) ||
isNotificationMessage(value));
}
export function isRequestMessage(value) {
return (isJsonRpcEnvelope(value) &&
"id" in value &&
typeof value["method"] === "string" &&
isJsonRpcId(value["id"]));
}
export function isResponseMessage(value) {
if (!isJsonRpcEnvelope(value) || "method" in value) {
return false;
}
if (!("id" in value) || !isJsonRpcId(value["id"])) {
return false;
}
const hasResult = Object.hasOwn(value, "result");
const hasError = Object.hasOwn(value, "error");
if (hasResult === hasError) {
return false;
}
return !hasError || isErrorResponse(value["error"]);
}
export function isNotificationMessage(value) {
return (isJsonRpcEnvelope(value) &&
!("id" in value) &&
typeof value["method"] === "string");
}
export function isRecord(value) {
return typeof value === "object" && value !== null;
}
function isJsonRpcEnvelope(value) {
return isRecord(value) && value["jsonrpc"] === "2.0";
}
function isJsonRpcId(value) {
return (value === null ||
typeof value === "string" ||
(typeof value === "number" && Number.isFinite(value)));
}
function isErrorResponse(value) {
return (isRecord(value) &&
typeof value["code"] === "number" &&
Number.isInteger(value["code"]) &&
typeof value["message"] === "string");
}
/**
* JSON-RPC 2.0 type definitions for internal use.
* Helpers for constructing `HandleResult` values.
*/
export {};
export const Handled = {
/**
* Marks a message as handled.
*/
yes() {
return { handled: true };
},
/**
* Leaves a message unhandled so later handlers can process it.
*/
no(message, retry = false) {
return { handled: false, message, retry };
},
};
function rejectedPromise(error) {
const promise = Promise.reject(error);
promise.catch(() => { });
return promise;
}
function errorDetails(error) {
if (error instanceof Error) {
return error.message;
}
if (typeof error === "object" &&
error != null &&
"message" in error &&
typeof error.message === "string") {
return error.message;
}
return undefined;
}
function isZodError(error) {
return (typeof error === "object" &&
error !== null &&
"name" in error &&
error.name === "ZodError" &&
"issues" in error &&
Array.isArray(error.issues) &&
"format" in error &&
typeof error.format === "function");
}
function errorToResult(error) {
if (error instanceof RequestError) {
return error.toResult();
}
if (isZodError(error)) {
return RequestError.invalidParams(error.format()).toResult();
}
const details = errorDetails(error);
try {
return RequestError.internalError(details ? JSON.parse(details) : {}).toResult();
}
catch {
return RequestError.internalError({ details }).toResult();
}
}
/**
* Responder for one incoming JSON-RPC request.
*
* Handlers may use this when they need to decide exactly when or how the
* response is sent.
*/
export class RequestResponder {
id;
sendResult;
didRespond = false;
constructor(
/**
* Request ID to include in the response.
*/
id, sendResult) {
this.id = id;
this.sendResult = sendResult;
}
/**
* Whether this request has already received a response.
*/
get responded() {
return this.didRespond;
}
/**
* Sends a successful JSON-RPC response.
*/
respond(response) {
return this.respondWithResult({ result: (response ?? null) });
}
/**
* Sends an error JSON-RPC response.
*/
respondWithError(error) {
const errorResponse = error instanceof RequestError ? error.toErrorResponse() : error;
return this.respondWithResult({ error: errorResponse });
}
/**
* Sends a complete JSON-RPC result payload.
*/
respondWithResult(result) {
if (this.didRespond) {
return rejectedPromise(new Error("JSON-RPC request already responded"));
}
this.didRespond = true;
return this.sendResult(result);
}
}
/**
* Disposable handle returned when a handler is registered dynamically.
*/
export class HandlerRegistration {
disposeHandler;
active = true;
constructor(disposeHandler) {
this.disposeHandler = disposeHandler;
}
/**
* Unregisters the associated handler.
*/
dispose() {
if (!this.active) {
return;
}
this.active = false;
this.disposeHandler();
}
/**
* Supports explicit resource management with `using`.
*/
[Symbol.dispose]() {
this.dispose();
}
/**
* Returns this registration for call sites that intentionally keep it active.
*/
runIndefinitely() {
return this;
}
}
/**
* Per-connection context passed to low-level JSON-RPC handlers.
*/
export class ConnectionContext {
connection;
constructor(connection) {
this.connection = connection;
}
/**
* Sends a request over the connection.
*/
sendRequest(method, params, mapResponse) {
return this.connection.sendRequest(method, params, mapResponse);
}
/**
* Sends a notification over the connection.
*/
sendNotification(method, params) {
return this.connection.sendNotification(method, params);
}
/**
* Registers a handler that can be disposed independently.
*/
addDynamicHandler(handler) {
return this.connection.addDynamicHandler(handler);
}
/**
* AbortSignal that aborts when the connection closes.
*/
get signal() {
return this.connection.signal;
}
/**
* Promise that resolves when the connection closes.
*/
get closed() {
return this.connection.closed;
}
}
/**
* Lower-level JSON-RPC connection over an ACP `Stream`.
*
* Most ACP integrations should use `agent(...)` or `client(...)`. Use this
* class when building generic JSON-RPC middleware or custom dispatch behavior.
*/
export class Connection {
pendingResponses = new Map();
nextRequestId = 0;
staticHandlers = [];
dynamicHandlers = new Set();
stream;
writeQueue = Promise.resolve();
abortController = new AbortController();
closedPromise;
retryQueue = [];
context = new ConnectionContext(this);
receiveReader;
constructor(requestHandlerOrStream, notificationHandlerOrHandlers, streamOrOptions, options) {
if (typeof requestHandlerOrStream === "function") {
const requestHandler = requestHandlerOrStream;
const notificationHandler = notificationHandlerOrHandlers;
const stream = streamOrOptions;
this.initialize(stream, [
...(options?.handlers ?? []),
this.legacyHandler(requestHandler, notificationHandler),
]);
return;
}
const stream = requestHandlerOrStream;
const handlers = notificationHandlerOrHandlers;
const connectionOptions = streamOrOptions;
this.initialize(stream, [
...(connectionOptions?.handlers ?? []),
...handlers,
]);
}
/**
* Creates a builder for configuring a handler-based connection.
*/
static builder() {
return new ConnectionBuilder();
}
/**
* Runs an operation while the connection is open, then closes the connection.
*
* If the stream closes before `op` settles, the returned promise rejects with
* the connection close reason.
*/
runUntil(op) {
let opSettled = false;
const opPromise = Promise.resolve()
.then(() => op(this.context))
.finally(() => {
opSettled = true;
});
const closedPromise = this.closed.then(() => {
if (opSettled) {
return new Promise(() => { });
}
throw this.closedReason();
});
return Promise.race([opPromise, closedPromise]).finally(() => {
opSettled = true;
this.close();
});
}
/**
* Adds a handler after the connection has started.
*
* Any messages queued with `Handled.no(message, true)` are retried after the
* handler is added.
*/
addDynamicHandler(handler) {
this.dynamicHandlers.add(handler);
if (this.retryQueue.length > 0) {
for (const message of this.retryQueue.splice(0)) {
void this.processIncomingMessage(message).catch((error) => this.close(error));
}
}
return new HandlerRegistration(() => {
this.dynamicHandlers.delete(handler);
});
}
/**
* AbortSignal that aborts when the connection closes.
*/
get signal() {
return this.abortController.signal;
}
/**
* Promise that resolves when the connection closes.
*/
get closed() {
return this.closedPromise;
}
/**
* Sends a JSON-RPC request.
*
* `mapResponse` can convert the raw result before the returned promise
* resolves.
*/
sendRequest(method, params, mapResponse) {
if (this.abortController.signal.aborted) {
return rejectedPromise(this.closedReason());
}
const id = this.nextRequestId++;
const responsePromise = new Promise((resolve, reject) => {
this.pendingResponses.set(id, {
resolve: (response) => {
try {
const value = mapResponse
? mapResponse(response)
: response;
resolve(value);
}
catch (error) {
reject(error);
}
},
reject,
});
});
responsePromise.catch(() => { });
void this.sendMessage({ jsonrpc: "2.0", id, method, params }).catch(() => { });
return responsePromise;
}
/**
* Sends a JSON-RPC notification.
*/
sendNotification(method, params) {
if (this.abortController.signal.aborted) {
return rejectedPromise(this.closedReason());
}
return this.sendMessage({ jsonrpc: "2.0", method, params });
}
/**
* Closes the connection and rejects pending requests.
*/
close(error) {
if (this.abortController.signal.aborted) {
return;
}
const closeError = error ?? new Error("ACP connection closed");
for (const pendingResponse of this.pendingResponses.values()) {
pendingResponse.reject(closeError);
}
this.pendingResponses.clear();
this.abortController.abort(closeError);
void this.receiveReader?.cancel(closeError).catch(() => { });
}
initialize(stream, handlers) {
this.stream = stream;
this.staticHandlers = handlers;
this.closedPromise = new Promise((resolve) => {
this.abortController.signal.addEventListener("abort", () => resolve());
});
void this.receive();
}
legacyHandler(requestHandler, notificationHandler) {
return {
handleMessage: async (message, cx) => {
if (message.kind === "request") {
const result = await requestHandler(message.method, message.params, cx);
await message.responder.respond(result);
}
else {
await notificationHandler(message.method, message.params, cx);
}
return Handled.yes();
},
};
}
async receive() {
let closeError = undefined;
try {
const reader = this.stream.readable.getReader();
this.receiveReader = reader;
try {
while (!this.abortController.signal.aborted) {
const { value: message, done } = await reader.read();
if (this.abortController.signal.aborted) {
break;
}
if (done) {
break;
}
if (!message) {
continue;
}
this.receiveMessage(message);
}
}
finally {
if (this.receiveReader === reader) {
this.receiveReader = undefined;
}
reader.releaseLock();
}
}
catch (error) {
closeError = error;
}
finally {
this.close(closeError);
}
}
receiveMessage(message) {
if (this.abortController.signal.aborted) {
return;
}
if ("method" in message) {
void this.processIncomingMessage(this.toIncomingMessage(message)).catch((error) => this.close(error));
}
else if ("id" in message) {
this.handleResponse(message);
}
else {
console.error("Invalid message", { message });
}
}
async processIncomingMessage(message) {
if (this.abortController.signal.aborted) {
return;
}
let current = message;
let retry = false;
try {
for (const handler of [
...this.staticHandlers,
...this.dynamicHandlers.values(),
]) {
if (this.abortController.signal.aborted) {
return;
}
const result = (await handler.handleMessage(current, this.context)) ?? {
handled: true,
};
if (result.handled) {
return;
}
current = result.message ?? current;
retry = retry || Boolean(result.retry);
}
if (retry) {
this.retryQueue.push(current);
}
else if (current.kind === "request") {
await current.responder.respondWithError(RequestError.methodNotFound(current.method));
}
}
catch (error) {
if (this.abortController.signal.aborted) {
return;
}
if (current.kind === "request" && !current.responder.responded) {
await current.responder.respondWithResult(errorToResult(error));
}
else {
const response = errorToResult(error);
if ("error" in response) {
console.error("Error handling notification", message.raw, response.error);
}
}
}
}
toIncomingMessage(message) {
if ("id" in message) {
return {
kind: "request",
method: message.method,
params: message.params,
raw: message,
responder: new RequestResponder(message.id, (result) => this.sendMessage({
jsonrpc: "2.0",
id: message.id,
...result,
})),
};
}
return {
kind: "notification",
method: message.method,
params: message.params,
raw: message,
};
}
handleResponse(response) {
const pendingResponse = this.pendingResponses.get(response.id);
if (pendingResponse) {
if ("result" in response) {
pendingResponse.resolve(response.result);
}
else if ("error" in response) {
const { code, message, data } = response.error;
pendingResponse.reject(new RequestError(code, message, data));
}
else {
pendingResponse.reject(RequestError.invalidRequest(response));
}
this.pendingResponses.delete(response.id);
}
else {
console.error("Got response to unknown request", response.id);
}
}
closedReason() {
return (this.abortController.signal.reason ?? new Error("ACP connection closed"));
}
async sendMessage(message) {
if (this.abortController.signal.aborted) {
return rejectedPromise(this.closedReason());
}
this.writeQueue = this.writeQueue
.then(async () => {
if (this.abortController.signal.aborted) {
throw this.closedReason();
}
const writer = this.stream.writable.getWriter();
try {
await writer.write(message);
}
finally {
writer.releaseLock();
}
})
.catch((error) => {
this.close(error);
throw error;
});
return this.writeQueue;
}
}
/**
* Builder for a lower-level handler-based JSON-RPC connection.
*/
export class ConnectionBuilder {
handlers = [];
connectionName;
/**
* Sets a diagnostic name used by handlers created from this builder.
*/
name(name) {
this.connectionName = name;
return this;
}
/**
* Adds a raw JSON-RPC handler to the handler chain.
*/
withHandler(handler) {
this.handlers.push(handler);
return this;
}
/**
* Adds a handler that can inspect every incoming request or notification.
*
* Observer callbacks that return void pass the message through to later
* handlers. Return `Handled.yes()` to stop dispatch explicitly.
*/
onReceiveMessage(handler) {
return this.withHandler({
handleMessage: async (message, cx) => (await handler(message, cx)) ?? Handled.no(message),
describe: () => this.connectionName ?? "onReceiveMessage",
});
}
/**
* Adds a typed request handler for one method.
*/
onReceiveRequest(method, parse, handler) {
return this.withHandler({
handleMessage: async (message, cx) => {
if (message.kind !== "request" || message.method !== method) {
return Handled.no(message);
}
const request = parse(message.params);
return ((await handler(request, message.responder, cx)) ?? Handled.yes());
},
describe: () => `${this.connectionName ?? "request"}:${method}`,
});
}
/**
* Adds a typed notification handler for one method.
*/
onReceiveNotification(method, parse, handler) {
return this.withHandler({
handleMessage: async (message, cx) => {
if (message.kind !== "notification" || message.method !== method) {
return Handled.no(message);
}
const notification = parse(message.params);
return (await handler(notification, cx)) ?? Handled.yes();
},
describe: () => `${this.connectionName ?? "notification"}:${method}`,
});
}
/**
* Connects the configured handlers to a stream.
*/
connect(stream, options) {
return new Connection(stream, this.handlers, options);
}
/**
* Connects to a stream for the lifetime of `op`, then closes the connection.
*/
connectWith(stream, op, options) {
return this.connect(stream, options).runUntil(op);
}
}
/**
* JSON-RPC error object.
*
* Represents an error that occurred during method execution, following the
* JSON-RPC 2.0 error object specification with optional additional data.
*
* See protocol docs: [JSON-RPC Error Object](https://www.jsonrpc.org/specification#error_object)
*/
export class RequestError extends Error {
code;
/**
* Additional JSON-RPC error data.
*/
data;
constructor(
/**
* JSON-RPC error code.
*/
code, message, data) {
super(message);
this.code = code;
this.name = "RequestError";
this.data = data;
}
/**
* Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.
*/
static parseError(data, additionalMessage) {
return new RequestError(-32700, `Parse error${additionalMessage ? `: ${additionalMessage}` : ""}`, data);
}
/**
* The JSON sent is not a valid Request object.
*/
static invalidRequest(data, additionalMessage) {
return new RequestError(-32600, `Invalid request${additionalMessage ? `: ${additionalMessage}` : ""}`, data);
}
/**
* The method does not exist / is not available.
*/
static methodNotFound(method) {
return new RequestError(-32601, `"Method not found": ${method}`, {
method,
});
}
/**
* Invalid method parameter(s).
*/
static invalidParams(data, additionalMessage) {
return new RequestError(-32602, `Invalid params${additionalMessage ? `: ${additionalMessage}` : ""}`, data);
}
/**
* Internal JSON-RPC error.
*/
static internalError(data, additionalMessage) {
return new RequestError(-32603, `Internal error${additionalMessage ? `: ${additionalMessage}` : ""}`, data);
}
/**
* Authentication required.
*/
static authRequired(data, additionalMessage) {
return new RequestError(-32000, `Authentication required${additionalMessage ? `: ${additionalMessage}` : ""}`, data);
}
/**
* Resource, such as a file, was not found
*/
static resourceNotFound(uri) {
return new RequestError(-32002, `Resource not found${uri ? `: ${uri}` : ""}`, uri && { uri });
}
/**
* Converts this error to a JSON-RPC result object.
*/
toResult() {
return {
error: {
code: this.code,
message: this.message,
data: this.data,
},
};
}
/**
* Converts this error to a JSON-RPC error response payload.
*/
toErrorResponse() {
return {
code: this.code,
message: this.message,
data: this.data,
};
}
}
//# sourceMappingURL=jsonrpc.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"AAAA;;GAEG"}
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"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"}

@@ -11,3 +11,9 @@ import type { AnyMessage } from "./jsonrpc.js";

export type Stream = {
/**
* Outgoing JSON-RPC messages written by this side of the ACP connection.
*/
writable: WritableStream<AnyMessage>;
/**
* Incoming JSON-RPC messages read by this side of the ACP connection.
*/
readable: ReadableStream<AnyMessage>;

@@ -14,0 +20,0 @@ };

@@ -14,2 +14,4 @@ /**

const textDecoder = new TextDecoder();
let cancelled = false;
let inputReader;
const readable = new ReadableStream({

@@ -19,5 +21,9 @@ async start(controller) {

const reader = input.getReader();
inputReader = reader;
try {
while (true) {
const { value, done } = await reader.read();
if (cancelled) {
return;
}
if (done) {

@@ -34,2 +40,5 @@ content += textDecoder.decode();

for (const line of lines) {
if (cancelled) {
return;
}
const trimmedLine = line.trim();

@@ -47,2 +56,5 @@ if (trimmedLine) {

}
if (cancelled) {
return;
}
const trimmedLine = content.trim();

@@ -60,2 +72,5 @@ if (trimmedLine) {

catch (err) {
if (cancelled) {
return;
}
controller.error(err);

@@ -65,6 +80,16 @@ return;

finally {
if (inputReader === reader) {
inputReader = undefined;
}
reader.releaseLock();
}
if (cancelled) {
return;
}
controller.close();
},
cancel(reason) {
cancelled = true;
return inputReader?.cancel(reason);
},
});

@@ -71,0 +96,0 @@ const writable = new WritableStream({

@@ -1,1 +0,1 @@

{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}

@@ -1,2 +0,2 @@

import { describe, it, expect } from "vitest";
import { describe, it, expect, vi } from "vitest";
import { ndJsonStream } from "./stream.js";

@@ -104,2 +104,5 @@ function readableFromChunks(chunks) {

it("skips malformed lines and continues parsing", async () => {
const error = vi
.spyOn(console, "error")
.mockImplementation(() => undefined);
const msg1 = { jsonrpc: "2.0", id: 1, method: "before" };

@@ -117,4 +120,24 @@ const msg2 = { jsonrpc: "2.0", id: 2, method: "after" };

expect(messages).toEqual([msg1, msg2]);
expect(error).toHaveBeenCalledOnce();
error.mockRestore();
});
it("cancels the underlying input reader when canceled", async () => {
const { promise: canceled, resolve: resolveCanceled } = Promise.withResolvers();
const input = new ReadableStream({
cancel(reason) {
resolveCanceled(reason);
},
});
const reason = new Error("connection closed");
const { readable } = ndJsonStream(nullWritable, input);
const reader = readable.getReader();
await reader.cancel(reason);
reader.releaseLock();
await expect(canceled).resolves.toBe(reason);
await vi.waitFor(() => {
const inputReader = input.getReader();
inputReader.releaseLock();
});
});
});
//# sourceMappingURL=stream.test.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":"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"}
{
"name": "@agentclientprotocol/sdk",
"version": "0.26.0",
"version": "0.27.0",
"publishConfig": {

@@ -27,2 +27,30 @@ "access": "public"

"types": "dist/acp.d.ts",
"exports": {
".": {
"types": "./dist/acp.d.ts",
"import": "./dist/acp.js",
"default": "./dist/acp.js"
},
"./experimental/http-client": {
"types": "./dist/http-stream.d.ts",
"import": "./dist/http-stream.js",
"default": "./dist/http-stream.js"
},
"./experimental/ws-client": {
"types": "./dist/ws-stream.d.ts",
"import": "./dist/ws-stream.js",
"default": "./dist/ws-stream.js"
},
"./experimental/server": {
"types": "./dist/server.d.ts",
"import": "./dist/server.js",
"default": "./dist/server.js"
},
"./experimental/node": {
"types": "./dist/node-adapter.d.ts",
"import": "./dist/node-adapter.js",
"default": "./dist/node-adapter.js"
},
"./schema/schema.json": "./schema/schema.json"
},
"directories": {

@@ -54,2 +82,3 @@ "example": "examples"

"@types/node": "^25.5.0",
"@types/ws": "^8.5.13",
"@typescript-eslint/eslint-plugin": "^8.57.1",

@@ -68,4 +97,5 @@ "@typescript-eslint/parser": "^8.57.1",

"vitest": "^4.1.0",
"ws": "^8.18.0",
"zod": "^3.25.0 || ^4.0.0"
}
}

@@ -31,5 +31,5 @@ <a href="https://agentclientprotocol.com/" >

If you're building an [Agent](https://agentclientprotocol.com/protocol/overview#agent), start with [AgentSideConnection](https://agentclientprotocol.github.io/typescript-sdk/classes/AgentSideConnection.html).
If you're building an [Agent](https://agentclientprotocol.com/protocol/overview#agent), start with `agent({ name })`, register handlers such as `initialize(...)`, `newSession(...)`, and `prompt(...)`, then call `connect(stream)`.
If you're building a [Client](https://agentclientprotocol.com/protocol/overview#client), start with [ClientSideConnection](https://agentclientprotocol.github.io/typescript-sdk/classes/ClientSideConnection.html).
If you're building a [Client](https://agentclientprotocol.com/protocol/overview#client), start with `client({ name })`, register client-side handlers such as `requestPermission(...)` and `sessionUpdate(...)`, then run your agent workflow with `connectWith(stream, async (ctx) => ...)`.

@@ -36,0 +36,0 @@ ### Study a Production Implementation

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display