@@ -9,11 +9,7 @@ import {
99 methodRequiresSessionHeader ,
1010 sessionIdFromParams ,
1111} from "./protocol.js" ;
12- import {
13- isJsonRpcMessage ,
14- isRequestMessage ,
15- isResponseMessage ,
16- } from "./jsonrpc.js" ;
12+ import { isJsonRpcMessage , isResponseMessage } from "./jsonrpc.js" ;
1713import { AGENT_METHODS } from "./schema/index.js" ;
1814import { serializeSseEvent , serializeSseKeepAlive } from "./sse.js" ;
1915import { handleWebSocketConnection } from "./ws-server.js" ;
@@ -25,7 +21,12 @@ import type {
2521 ResponseRoute ,
2622} from "./connection.js" ;
2723import type { Agent , AgentSideConnection } from "./acp.js" ;
28- import type { AnyMessage , AnyRequest , AnyResponse } from "./jsonrpc.js" ;
24+ import type {
25+ AnyMessage ,
26+ AnyNotification ,
27+ AnyRequest ,
28+ AnyResponse ,
29+ } from "./jsonrpc.js" ;
2930
3031/** Options for creating an ACP server transport. */
3132export interface AcpServerOptions {
@@ -129,8 +130,12 @@ export class AcpServer {
129130
130131 const connectionId = req . headers . get ( HEADER_CONNECTION_ID ) ;
131132
132- if ( isInitializeRequest ( body . value ) && ! connectionId ) {
133- return await this . handleInitialize ( body . value ) ;
133+ if ( isInitializeRequest ( body . value ) ) {
134+ if ( ! connectionId ) {
135+ return await this . handleInitialize ( body . value ) ;
136+ }
137+
138+ return textResponse ( "Initialize not allowed on existing connection" , 400 ) ;
134139 }
135140
136141 if ( ! connectionId ) {
@@ -180,7 +185,12 @@ export class AcpServer {
180185
181186 const sessionId = req . headers . get ( HEADER_SESSION_ID ) ;
182187 if ( sessionId ) {
183- return sseResponse ( connection . ensureSession ( sessionId ) . subscribe ( ) ) ;
188+ const sessionStream = connection . sessionStreams . get ( sessionId ) ;
189+ if ( ! sessionStream ) {
190+ return textResponse ( "Unknown Acp-Session-Id" , 404 ) ;
191+ }
192+
193+ return sseResponse ( sessionStream . subscribe ( ) ) ;
184194 }
185195
186196 return sseResponse ( connection . connectionStream . subscribe ( ) ) ;
@@ -244,15 +254,11 @@ export class AcpServer {
244254 message : AnyMessage ,
245255 headers : Headers ,
246256 ) : Promise < ForwardResult > {
247- if ( isRequestMessage ( message ) ) {
248- return await forwardClientRequest ( connection , message , headers ) ;
249- }
250-
251257 if ( isResponseMessage ( message ) ) {
252258 return await forwardClientResponse ( connection , message ) ;
253259 }
254260
255- return await forwardClientNotification ( connection , message ) ;
261+ return await forwardClientMethodMessage ( connection , message , headers ) ;
256262 }
257263}
258264
@@ -286,7 +292,7 @@ type RouteResult =
286292 message : string ;
287293 } ;
288294
289- type ClientRequestMessage = AnyRequest ;
295+ type ClientMethodMessage = AnyRequest | AnyNotification ;
290296
291297async function readJson ( req : Request ) : Promise < JsonResult > {
292298 try {
@@ -314,9 +320,9 @@ async function writeInbound(
314320 }
315321}
316322
317- async function forwardClientRequest (
323+ async function forwardClientMethodMessage (
318324 connection : ConnectionState ,
319- message : ClientRequestMessage ,
325+ message : ClientMethodMessage ,
320326 headers : Headers ,
321327) : Promise < ForwardResult > {
322328 const route = determineRoute ( message , headers ) ;
@@ -329,7 +335,7 @@ async function forwardClientRequest(
329335 connection . ensureSession ( route . value . session ) ;
330336 }
331337
332- const key = messageIdKey ( message . id ) ;
338+ const key = "id" in message ? messageIdKey ( message . id ) : undefined ;
333339
334340 if ( key ) {
335341 connection . pendingRoutes . set (
@@ -350,23 +356,15 @@ async function forwardClientResponse(
350356 return { ok : true } ;
351357}
352358
353- async function forwardClientNotification (
354- connection : ConnectionState ,
355- message : AnyMessage ,
356- ) : Promise < ForwardResult > {
357- await writeInbound ( connection , message ) ;
358- return { ok : true } ;
359- }
360-
361359function pendingResponseRoute (
362- message : ClientRequestMessage ,
360+ message : ClientMethodMessage ,
363361 route : ResponseRoute ,
364362) : ResponseRoute {
365363 return message . method === AGENT_METHODS . session_load ? "connection" : route ;
366364}
367365
368366function determineRoute (
369- message : ClientRequestMessage ,
367+ message : ClientMethodMessage ,
370368 headers : Headers ,
371369) : RouteResult {
372370 const headerSessionId = headers . get ( HEADER_SESSION_ID ) ;
0 commit comments