@@ -640,6 +640,19 @@ export function createWorkflow<
640640 executionId : string ,
641641 memory : typeof effectiveMemory ,
642642 logger : Logger ,
643+ events : Array < {
644+ id : string ;
645+ type : string ;
646+ name ?: string ;
647+ from ?: string ;
648+ startTime : string ;
649+ endTime ?: string ;
650+ status ?: string ;
651+ input ?: any ;
652+ output ?: any ;
653+ metadata ?: Record < string , unknown > ;
654+ context ?: Record < string , unknown > ;
655+ } > ,
643656 ) : Promise < void > => {
644657 try {
645658 logger . trace ( `Storing suspension checkpoint for execution ${ executionId } ` ) ;
@@ -655,6 +668,7 @@ export function createWorkflow<
655668 suspendData : suspensionData . suspendData ,
656669 }
657670 : undefined ,
671+ events,
658672 updatedAt : new Date ( ) ,
659673 } ) ;
660674 logger . trace ( `Successfully stored suspension checkpoint for execution ${ executionId } ` ) ;
@@ -715,6 +729,58 @@ export function createWorkflow<
715729 // For normal run, we don't need a stream controller
716730 const streamController = externalStreamController || null ;
717731
732+ // Collect events during execution for persistence
733+ const collectedEvents : Array < {
734+ id : string ;
735+ type : string ;
736+ name ?: string ;
737+ from ?: string ;
738+ startTime : string ;
739+ endTime ?: string ;
740+ status ?: string ;
741+ input ?: any ;
742+ output ?: any ;
743+ metadata ?: Record < string , unknown > ;
744+ context ?: Record < string , unknown > ;
745+ } > = [ ] ;
746+
747+ // Helper to emit event and collect for persistence
748+ const emitAndCollectEvent = ( event : {
749+ type : string ;
750+ executionId : string ;
751+ from : string ;
752+ input ?: any ;
753+ output ?: any ;
754+ status : string ;
755+ context ?: any ;
756+ timestamp : string ;
757+ stepIndex ?: number ;
758+ stepType ?: string ;
759+ metadata ?: Record < string , any > ;
760+ error ?: any ;
761+ } ) => {
762+ // Emit to stream if available
763+ if ( streamController ) {
764+ streamController . emit ( event as any ) ;
765+ }
766+
767+ // Collect for persistence (convert to storage format)
768+ const collectedEvent = {
769+ id : randomUUID ( ) ,
770+ type : event . type ,
771+ name : event . from ,
772+ from : event . from ,
773+ startTime : event . timestamp ,
774+ endTime : event . timestamp , // Will be updated on complete events
775+ status : event . status ,
776+ input : event . input ,
777+ output : event . output ,
778+ metadata : event . metadata ,
779+ context : event . context as Record < string , unknown > | undefined ,
780+ } ;
781+ collectedEvents . push ( collectedEvent ) ;
782+ } ;
783+
718784 // Get observability instance
719785 const observability = getObservability ( ) ;
720786
@@ -882,7 +948,7 @@ export function createWorkflow<
882948 } ;
883949
884950 // Emit workflow start event
885- streamController ?. emit ( {
951+ emitAndCollectEvent ( {
886952 type : "workflow-start" ,
887953 executionId,
888954 from : name ,
@@ -967,7 +1033,7 @@ export function createWorkflow<
9671033 stepData . output = stateManager . state . data ;
9681034 }
9691035
970- streamController ?. emit ( {
1036+ emitAndCollectEvent ( {
9711037 type : "step-complete" ,
9721038 executionId,
9731039 from : stepName ,
@@ -991,6 +1057,11 @@ export function createWorkflow<
9911057 try {
9921058 await effectiveMemory . updateWorkflowState ( executionId , {
9931059 status : "cancelled" ,
1060+ events : collectedEvents ,
1061+ cancellation : {
1062+ cancelledAt : new Date ( ) ,
1063+ reason,
1064+ } ,
9941065 metadata : {
9951066 ...( stateManager . state ?. usage ? { usage : stateManager . state . usage } : { } ) ,
9961067 cancellationReason : reason ,
@@ -1003,7 +1074,7 @@ export function createWorkflow<
10031074 } ) ;
10041075 }
10051076
1006- streamController ?. emit ( {
1077+ emitAndCollectEvent ( {
10071078 type : "workflow-cancelled" ,
10081079 executionId,
10091080 from : name ,
@@ -1124,7 +1195,13 @@ export function createWorkflow<
11241195 // Save suspension state to memory
11251196 const suspensionData = stateManager . state . suspension ;
11261197 try {
1127- await saveSuspensionState ( suspensionData , executionId , effectiveMemory , runLogger ) ;
1198+ await saveSuspensionState (
1199+ suspensionData ,
1200+ executionId ,
1201+ effectiveMemory ,
1202+ runLogger ,
1203+ collectedEvents ,
1204+ ) ;
11281205 } catch ( _ ) {
11291206 // Error already logged in saveSuspensionState, don't throw
11301207 }
@@ -1191,7 +1268,7 @@ export function createWorkflow<
11911268 executionContext . streamWriter = stepWriter ;
11921269
11931270 // Emit step start event
1194- streamController ?. emit ( {
1271+ emitAndCollectEvent ( {
11951272 type : "step-start" ,
11961273 executionId,
11971274 from : step . name || step . id ,
@@ -1341,7 +1418,7 @@ export function createWorkflow<
13411418 ) ;
13421419
13431420 // Emit step complete event
1344- streamController ?. emit ( {
1421+ emitAndCollectEvent ( {
13451422 type : "step-complete" ,
13461423 executionId,
13471424 from : stepName ,
@@ -1398,7 +1475,7 @@ export function createWorkflow<
13981475 runLogger . debug ( `Workflow suspended at step ${ index } ` , suspensionMetadata ) ;
13991476
14001477 // Emit suspension event to stream
1401- streamController ?. emit ( {
1478+ emitAndCollectEvent ( {
14021479 type : "workflow-suspended" ,
14031480 executionId,
14041481 from : step . name || step . id ,
@@ -1437,6 +1514,7 @@ export function createWorkflow<
14371514 executionId ,
14381515 effectiveMemory ,
14391516 runLogger ,
1517+ collectedEvents ,
14401518 ) ;
14411519 } catch ( _ ) {
14421520 // Error already logged in saveSuspensionState, don't throw
@@ -1477,10 +1555,12 @@ export function createWorkflow<
14771555 traceContext . setUsage ( stateManager . state . usage ) ;
14781556 traceContext . end ( "completed" ) ;
14791557
1480- // Update Memory V2 state to completed
1558+ // Update Memory V2 state to completed with events and output
14811559 try {
14821560 await effectiveMemory . updateWorkflowState ( executionContext . executionId , {
14831561 status : "completed" ,
1562+ events : collectedEvents ,
1563+ output : finalState . result ,
14841564 updatedAt : new Date ( ) ,
14851565 } ) ;
14861566 } catch ( memoryError ) {
@@ -1502,7 +1582,7 @@ export function createWorkflow<
15021582 ) ;
15031583
15041584 // Emit workflow complete event
1505- streamController ?. emit ( {
1585+ emitAndCollectEvent ( {
15061586 type : "workflow-complete" ,
15071587 executionId,
15081588 from : name ,
@@ -1543,7 +1623,7 @@ export function createWorkflow<
15431623
15441624 workflowRegistry . activeExecutions . delete ( executionId ) ;
15451625
1546- streamController ?. emit ( {
1626+ emitAndCollectEvent ( {
15471627 type : "workflow-cancelled" ,
15481628 executionId,
15491629 from : name ,
@@ -1626,7 +1706,7 @@ export function createWorkflow<
16261706 ) ;
16271707
16281708 // Emit workflow error event
1629- streamController ?. emit ( {
1709+ emitAndCollectEvent ( {
16301710 type : "workflow-error" ,
16311711 executionId,
16321712 from : name ,
@@ -1644,6 +1724,7 @@ export function createWorkflow<
16441724 try {
16451725 await effectiveMemory . updateWorkflowState ( executionId , {
16461726 status : "error" ,
1727+ events : collectedEvents ,
16471728 // Store a lightweight error summary in metadata for debugging
16481729 metadata : {
16491730 ...( stateManager . state ?. usage ? { usage : stateManager . state . usage } : { } ) ,
0 commit comments