@@ -12,6 +12,32 @@ import {
1212import { subscribeEmbeddedPiSession } from "./pi-embedded-subscribe.js" ;
1313
1414describe ( "subscribeEmbeddedPiSession" , ( ) => {
15+ function createReplayingAgentEventHarness ( params : {
16+ replayEvents : unknown [ ] ;
17+ existingMessages ?: unknown [ ] ;
18+ } ) {
19+ let handler : ( ( evt : unknown ) => void ) | undefined ;
20+ const session = {
21+ messages : params . existingMessages ?? [ ] ,
22+ subscribe : ( fn : ( evt : unknown ) => void ) => {
23+ handler = fn ;
24+ for ( const evt of params . replayEvents ) {
25+ fn ( evt ) ;
26+ }
27+ return ( ) => { } ;
28+ } ,
29+ } as Parameters < typeof subscribeEmbeddedPiSession > [ 0 ] [ "session" ] ;
30+ const onAgentEvent = vi . fn ( ) ;
31+
32+ subscribeEmbeddedPiSession ( {
33+ session,
34+ runId : "run" ,
35+ onAgentEvent,
36+ } ) ;
37+
38+ return { emit : ( evt : unknown ) => handler ?.( evt ) , onAgentEvent } ;
39+ }
40+
1541 function createAgentEventHarness ( options ?: { runId ?: string ; sessionKey ?: string } ) {
1642 const { session, emit } = createStubSessionHarness ( ) ;
1743 const onAgentEvent = vi . fn ( ) ;
@@ -293,6 +319,28 @@ describe("subscribeEmbeddedPiSession", () => {
293319 expectSingleAgentEventText ( onAgentEvent . mock . calls , "Hello world" ) ;
294320 } ) ;
295321
322+ it ( "does not replay historical assistant finals when subscribing to an existing session" , ( ) => {
323+ const historicalAssistantMessage = {
324+ role : "assistant" ,
325+ content : [ { type : "text" , text : "Earlier reply" } ] ,
326+ } as AssistantMessage ;
327+ const { emit, onAgentEvent } = createReplayingAgentEventHarness ( {
328+ existingMessages : [ historicalAssistantMessage ] ,
329+ replayEvents : [
330+ { type : "agent_start" } ,
331+ { type : "message_start" , message : historicalAssistantMessage } ,
332+ { type : "message_end" , message : historicalAssistantMessage } ,
333+ { type : "agent_end" } ,
334+ ] ,
335+ } ) ;
336+
337+ emitMessageStartAndEndForAssistantText ( { emit, text : "Current reply" } ) ;
338+
339+ const payloads = extractAgentEventPayloads ( onAgentEvent . mock . calls ) ;
340+ expect ( payloads ) . toHaveLength ( 1 ) ;
341+ expect ( payloads [ 0 ] ?. text ) . toBe ( "Current reply" ) ;
342+ } ) ;
343+
296344 it ( "does not emit duplicate agent events when message_end repeats" , ( ) => {
297345 const { emit, onAgentEvent } = createAgentEventHarness ( ) ;
298346
0 commit comments