@@ -309,6 +309,39 @@ void shouldIgnoreUnknownRpcResponses() {
309309 }
310310
311311
312+
313+ @ Test
314+ void shouldBridgeTurnAndDeltaEventsToListener () {
315+ List <String > events = new ArrayList <>();
316+ CodexAppServerListener listener = new CodexAppServerListener () {
317+ @ Override
318+ public void onTurnStarted (String turnId ) {
319+ events .add ("turn:" + turnId );
320+ }
321+
322+ @ Override
323+ public void onTextDelta (String delta ) {
324+ events .add ("delta:" + delta );
325+ }
326+
327+ @ Override
328+ public void onItemCompleted (String itemType , String content ) {
329+ events .add ("item:" + itemType + ":" + content );
330+ }
331+ };
332+ CodexAppServerTurn turn = newTurn (
333+ AppServerTurnRequest .builder ().prompt ("hi" ).listener (listener ).build (),
334+ new ThreadMappingCache (10 ));
335+
336+ handshake (turn );
337+ turn .handleFrame ("{\" jsonrpc\" :\" 2.0\" ,\" id\" :2,\" result\" :{\" thread\" :{\" id\" :\" th_1\" }}}" );
338+ turn .handleFrame ("{\" method\" :\" turn/started\" ,\" params\" :{\" turnId\" :\" turn_1\" }}" );
339+ turn .handleFrame ("{\" method\" :\" item/agentMessage/delta\" ,\" params\" :{\" itemId\" :\" item_1\" ,\" delta\" :\" 你\" }}" );
340+ turn .handleFrame ("{\" method\" :\" item/completed\" ,\" params\" :{\" item\" :{\" id\" :\" item_1\" ,\" type\" :\" agentMessage\" ,\" text\" :\" 你\" }}}" );
341+
342+ assertEquals (List .of ("turn:turn_1" , "delta:你" , "item:agentMessage:你" ), events );
343+ }
344+
312345 @ Test
313346 void shouldStreamRealAgentMessageDeltas () {
314347 List <String > deltas = new ArrayList <>();
0 commit comments