@@ -59,6 +59,48 @@ const promptRequest = {
5959 } ,
6060} satisfies AnyMessage ;
6161
62+ const loadSessionRequest = {
63+ jsonrpc : "2.0" ,
64+ id : 3 ,
65+ method : "session/load" ,
66+ params : {
67+ cwd : "/tmp" ,
68+ mcpServers : [ ] ,
69+ sessionId : "existing-session" ,
70+ } ,
71+ } satisfies AnyMessage ;
72+
73+ const permissionRequest = {
74+ jsonrpc : "2.0" ,
75+ id : 99 ,
76+ method : "session/request_permission" ,
77+ params : {
78+ sessionId : "session-1" ,
79+ toolCall : {
80+ toolCallId : "permission-tool" ,
81+ title : "Permission tool" ,
82+ } ,
83+ options : [
84+ {
85+ kind : "allow_once" ,
86+ name : "Allow once" ,
87+ optionId : "allow" ,
88+ } ,
89+ ] ,
90+ } ,
91+ } satisfies AnyMessage ;
92+
93+ const permissionResponse = {
94+ jsonrpc : "2.0" ,
95+ id : 99 ,
96+ result : {
97+ outcome : {
98+ outcome : "selected" ,
99+ optionId : "allow" ,
100+ } ,
101+ } ,
102+ } satisfies AnyMessage ;
103+
62104describe ( "createHttpStream" , ( ) => {
63105 it ( "posts initialize with custom headers, opens connection SSE, and emits the initialize response" , async ( ) => {
64106 const controlledFetch = createControlledFetch ( ) ;
@@ -137,6 +179,68 @@ describe("createHttpStream", () => {
137179 }
138180 } ) ;
139181
182+ it ( "opens session SSE before posting session/load for an existing session" , async ( ) => {
183+ const controlledFetch = createControlledFetch ( ) ;
184+ const stream = createHttpStream ( "https://agent.example/acp" , {
185+ fetch : controlledFetch . fetch ,
186+ } ) ;
187+ const writer = stream . writable . getWriter ( ) ;
188+ const reader = stream . readable . getReader ( ) ;
189+
190+ try {
191+ await writer . write ( initializeRequest ) ;
192+ await readMessage ( reader ) ;
193+ await writer . write ( loadSessionRequest ) ;
194+
195+ const sessionGet = requestAt ( controlledFetch . requests , 2 ) ;
196+ const loadPost = requestAt ( controlledFetch . requests , 3 ) ;
197+
198+ expect ( sessionGet . method ) . toBe ( "GET" ) ;
199+ expect ( sessionGet . headers . get ( HEADER_CONNECTION_ID ) ) . toBe ( "connection-1" ) ;
200+ expect ( sessionGet . headers . get ( HEADER_SESSION_ID ) ) . toBe (
201+ "existing-session" ,
202+ ) ;
203+ expect ( loadPost . method ) . toBe ( "POST" ) ;
204+ expect ( loadPost . headers . get ( HEADER_CONNECTION_ID ) ) . toBe ( "connection-1" ) ;
205+ expect ( loadPost . headers . get ( HEADER_SESSION_ID ) ) . toBe ( "existing-session" ) ;
206+ } finally {
207+ reader . releaseLock ( ) ;
208+ writer . releaseLock ( ) ;
209+ await stream . writable . close ( ) ;
210+ }
211+ } ) ;
212+
213+ it ( "includes the session header on responses to session-scoped server requests" , async ( ) => {
214+ const controlledFetch = createControlledFetch ( ) ;
215+ const stream = createHttpStream ( "https://agent.example/acp" , {
216+ fetch : controlledFetch . fetch ,
217+ } ) ;
218+ const writer = stream . writable . getWriter ( ) ;
219+ const reader = stream . readable . getReader ( ) ;
220+
221+ try {
222+ await writer . write ( initializeRequest ) ;
223+ await readMessage ( reader ) ;
224+ await controlledFetch . sendSse ( 0 , sessionNewResponse ) ;
225+ await readMessage ( reader ) ;
226+ await controlledFetch . sendSse ( 1 , permissionRequest ) ;
227+ await readMessage ( reader ) ;
228+ await writer . write ( permissionResponse ) ;
229+
230+ const responsePost = requestAt ( controlledFetch . requests , 3 ) ;
231+ expect ( responsePost . method ) . toBe ( "POST" ) ;
232+ expect ( responsePost . headers . get ( HEADER_CONNECTION_ID ) ) . toBe (
233+ "connection-1" ,
234+ ) ;
235+ expect ( responsePost . headers . get ( HEADER_SESSION_ID ) ) . toBe ( "session-1" ) ;
236+ expect ( JSON . parse ( responsePost . body ) ) . toEqual ( permissionResponse ) ;
237+ } finally {
238+ reader . releaseLock ( ) ;
239+ writer . releaseLock ( ) ;
240+ await stream . writable . close ( ) ;
241+ }
242+ } ) ;
243+
140244 it ( "propagates cookies across initialize, SSE, session POST, and DELETE" , async ( ) => {
141245 const controlledFetch = createControlledFetch ( {
142246 initializeCookies : [ "transport=alpha; Path=/" ] ,
0 commit comments