
    Jid                    b   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d d	lm Z m!Z!m"Z"m#Z# d d
l$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< erd dl=m>Z>  ej~                         Z@ G d d      ZA	 	 	 	 	 	 	 	 ddZB	 	 	 	 	 	 ddZC	 	 	 	 	 	 	 	 ddZD	 	 	 	 	 	 d dZE	 	 	 	 	 	 	 	 d!dZF	 	 	 	 	 	 	 	 	 	 d"dZG	 	 	 	 	 	 	 	 d#dZH	 	 	 	 	 	 d$dZI	 	 	 	 	 	 d%dZJ	 	 	 	 	 	 d&dZKy)'    )annotationsN)replace)TYPE_CHECKING)R)WorkflowCancelledByUserWorkflowRuntimeErrorWorkflowTimeoutError)EventInputRequiredEvent
StartEvent	StepStateStepStateChanged	StopEvent)CommandCompleteRunCommandFailWorkflowCommandHaltCommandPublishEventCommandQueueEventCommandRunWorkerWorkflowCommandindicates_exit)BrokerStateEventAttemptInProgressStateInternalStepWorkerState)WorkflowRuntimeas_snapshottable)AddCollectedEvent	AddWaiterDeleteCollectedEventDeleteWaiterStepWorkerFailedStepWorkerResultStepWorkerStateStepWorkerWaiter)StepWorkerFunction)TickAddEventTickCancelRunTickPublishEventTickStepResultTickTimeoutWorkflowTick)workflow_registry)Workflow)Contextc                  l    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d
dZddZdddZddZddZddZ		 d	 	 	 	 	 dd	Z
y)_ControlLoopRunnerz
    Private class to encapsulate the async control loop runtime state and behavior.
    Keeps the pure transformation functions at module level for testability.
    c                   || _         || _        || _        || _        || _        g | _        t        j                         | _        | j                  j                         D ]  }| j                  j                  |        t        |      | _        y N)workflowplugincontextstep_workersstateworkersasyncioQueuequeuerehydrate_with_ticks
put_nowaitr   snapshot_plugin)selfr4   r5   r6   r7   
init_stateticks          p/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/workflows/runtime/control_loop.py__init__z_ControlLoopRunner.__init__S   sw     !(
+-29--/
JJ335 	(DJJ!!$'	(/7    c                R   K   | j                   j                          d{   S 7 w)z/Wait for the next tick from the internal queue.N)r<   get)r@   s    rC   wait_for_tickz _ControlLoopRunner.wait_for_tickf   s     ZZ^^%%%%s   '%'Nc                     r>d fd}t        j                   |             } j                  j                  |       y j                  j                         y)z<Queue a tick event for processing, optionally after a delay.c                    K   j                   j                          d {    j                  j                         y 7  wr3   )r5   sleepr<   r>   )delayr@   rB   s   rC   _delayed_queuez5_ControlLoopRunner.queue_tick.<locals>._delayed_queuen   s6     kk''...

%%d+ /s   AA!ANreturnNone)r:   create_taskr9   appendr<   r>   )r@   rB   rL   rM   tasks   ```  rC   
queue_tickz_ControlLoopRunner.queue_tickj   sD    , &&~'78DLL%JJ!!$'rE   c                     d fd}t        j                   |             j                   fd        j                  j	                         y)z!Run a worker for a step function.c                 .  K   	 t        fdj                  j                  j                     j                  D        d       } | t        dj                   d      | j                  }j                  j                     } ||j                  j                  j                  j                         d {   }j                  t        j                  j                  j                  |             y 7 A# t        $ r}t        j!                  d|d       j                  t        j                  j                  j                  t#        |j$                  j'                          d {  7  	      g             |d }~ww xY ww)
Nc              3  T   K   | ]  }|j                   j                  k(  r| ! y wr3   )	worker_idid).0wcommands     rC   	<genexpr>zE_ControlLoopRunner.run_worker.<locals>._run_worker.<locals>.<genexpr>}   s)      ;;'**4 s   %(Worker z2 not found in in_progress. This should not happen.)r8   	step_nameeventr6   r4   )r_   rX   r`   resultz$error running step worker function: Texc_info)	exception	failed_at)nextr8   r9   r_   in_progressr   rY   shared_stater7   r`   r6   r4   rT   r*   	Exceptionloggererrorr"   r5   get_now)workersnapshotstep_fnra   er\   r@   s        rC   _run_workerz2_ControlLoopRunner.run_worker.<locals>._run_workerz   sl    -!%!3!3G4E4E!F!R!R
  >.!'**-_`  "...2.?.?@Q@Q.R&"%//!-- LL!]]   "")"3"3")**%mm%	  CQQUV"")"3"3")**%mm,*+T[[=P=P=R7R7R 		 sI   FB8D =C?>A D >F?D 	F
A,F6E97FFFc                :    j                   j                        S r3   )r9   remove)_r@   rS   s    rC   <lambda>z/_ControlLoopRunner.run_worker.<locals>.<lambda>   s    )<)<T)B rE   NrN   )r:   rQ   add_done_callbackr9   rR   )r@   r\   rq   rS   s   `` @rC   
run_workerz_ControlLoopRunner.run_workerw   s>    .	` "";=1BCD!rE   c                  K   t        |t              rG| j                  t        |j                  |j
                  |j                  |j                               yt        |t              r| j                  |       yt        |t              r1| j                          d{    |j                  |j                  yt        |t              r|j                  S t        |t              r.| j                   j#                  |j                         d{    yt        |t$              r$| j                          d{    |j                  t'        dt)        |             7 7 R7 +w)z6Process a single command returned from tick reduction.)r`   r_   attemptsfirst_attempt_atNzUnknown command type: )
isinstancer   rT   r'   r`   r_   ry   rz   r   rw   r   cleanup_tasksrd   r   ra   r   r5   write_to_event_streamr   
ValueErrortype)r@   r\   s     rC   process_commandz"_ControlLoopRunner.process_command   s0    g01OO!--%//$--%,%=%=	 !12OOG$-$$&&&  ,''' -!34>>!!45++33GMMBBB!45$$&&&###5d7m_EFF ' C 's7   BE(E" A1E(E$(E(:E&;(E($E(&E(c                  K   	 | j                   D ]  }|j                           	 	 t        j                  t        j
                  | j                   ddid       d{    y# t        $ r Y Iw xY w7 # t        $ r Y yw xY ww)z,Cancel and cleanup all running worker tasks.return_exceptionsTg      ?timeoutN)r9   cancelri   r:   wait_forgather)r@   rm   s     rC   r|   z _ControlLoopRunner.cleanup_tasks   s     	,,   	""EE    		  		s\   B!A$ B7A5 A3A5 #B$	A0-B/A00B3A5 5	B>B BBc                   K   d	 fd} j                   j                  t        j                   |                    | j	                  t        |             |r[ j                  j                  E j	                  t         j                  j                         j                  j                         t         j                   j                  j                          d{         \   _
        }|D ]  }	  j                  |       d{     	 	  j!                          d{   }	 t#        | j                   j                  j                          d{         \   _
        } j(                   j(                  j+                  |       |D ]:  }	  j                  |       d{   }| |c  j                          d{    S  7 7 # t        $ r  j                          d{  7    w xY w7 7 # t        $ r2  j                          d{  7   t$        j'                  dd        w xY w7 # t        $ r  j                          d{  7    w xY w7 #  j                          d{  7   w xY ww)
a	  
        Run the control loop until completion.

        Args:
            start_event: Optional initial event to process
            start_with_timeout: Whether to start the timeout timer

        Returns:
            The final StopEvent from the workflow
        c                 z   K   	 j                   j                          d {   } j                  |        47 wr3   )r5   wait_receiverT   )rB   r@   s    rC   _pullz%_ControlLoopRunner.run.<locals>._pull   s3     ![[5577% 7s   ;9;Nr`   r   )rL   TzNUnexpected error in internal control loop of workflow. This shouldn't happen. rb   rN   )r9   rR   r:   rQ   rT   r'   r4   _timeoutr+   rewind_in_progressr8   r5   rl   r   ri   r|   rH   _reduce_tickrj   rk   r?   on_tick)r@   start_eventstart_with_timeoutr   commandsr\   rB   ra   s   `       rC   runz_ControlLoopRunner.run   sN    	&
 	G//89 "OOL{;<$--"8"8"DOODMM$:$:;mm,,    2JJdkk1133 

H   	G**7333		'!//11
+7djj0C0C0E*E,(DJ ''3((006' &G'+';';G'D!D
 )%$$&&&&  4 4 ((*** 2 +F  ,,...LLh!% !   "E$ "00222 '$$$&&&s  C!J$G
%J;GGGJI/ +H,I/ 1.H H H 0,I/ I1I2I6I/ 9I/ <JI-JI/ JGG?7G:8G??JI/ H I"H%#II/ II*"I%#I**I/ -J/J
JJ

J)
r4   r.   r5   r   r6   r/   r7   zdict[str, StepWorkerFunction]rA   r   )rO   r,   r3   )rB   r,   rL   zfloat | NonerO   rP   )r\   r   rO   rP   )r\   r   rO   zNone | StopEventrN   )NT)r   Event | Noner   boolrO   r   )__name__
__module____qualname____doc__rD   rH   rT   rw   r   r|   r    rE   rC   r1   r1   M   s    
88  8 	8
 48  8&&(5"nG<  LPF''F'DHF'	F'rE   r1   c                :  K   t        j                  |      }|t        d      |xs t        j                  |j
                        }t        |j
                  |j                  |j                  |j                  |      }|j                  |        d{   S 7 w)z9
    The main async control loop for a workflow run.
    Nz&Run context not found for control loop)r   )r-   get_runr   r   from_workflowr4   r1   r5   r6   stepsr   )r   rA   run_idcurrentr8   runners         rC   control_loopr   $  s       ''/G"#KLLE+33G4D4DEE'..'//7==%F 4444s   BBBBc                X    |D ]$  }t        || t        j                               \  } }& | S )z&Rebuild the state from a list of ticks)r   time)r8   ticksrB   rt   s       rC   rebuild_state_from_ticksr   7  s5    
  
%
q
 LrE   c                L   t        | t              rt        | ||      S t        | t              rt	        | ||      S t        | t
              rt        | |      S t        | t              rt        | |      S t        | t              rt        | |      S t        dt        |              )NzUnknown tick type: )r{   r*   _process_step_result_tickr'   _process_add_event_tickr(   _process_cancel_run_tickr)   _process_publish_event_tickr+   _process_timeout_tickr~   r   )rB   initnow_secondss      rC   r   r   C  s     $'(t[AA	D,	'&tT;??	D-	('d33	D*	+*466	D+	&$T400.tDzl;<<rE   c           
        | j                         } g }t        | j                  j                         d       D ](  \  }}|j                  D ]H  }|j
                  j                  dt        |j                  |j                  |j                               J g |_        t        |j
                        dkD  s~t        |j                        |j                  j                  k  s|j
                  j                  d      }|j                  t!        ||||             t        |j
                        dkD  st        |j                        |j                  j                  k  r~+ | |fS )zLRewind the in_progress state, extracting commands to re-initiate the workersc                    | d   S )Nr   r   )xs    rC   ru   z$rewind_in_progress.<locals>.<lambda>[  s
    QqT rE   )keyr   )r`   ry   rz   )deepcopysortedr9   itemsrg   r<   insertr   r`   ry   rz   lenconfignum_workerspopextend_add_or_enqueue_event)r8   r   r   r_   
step_staterg   r`   s          rC   r   r   T  s8   
 NNE&(H!'(;(;(=>!R 	:%11 	K##%++(11%0%A%A	 "$

  !A%J**+j.?.?.K.KK$$((+EOO%eY
KP	 
  !A%J**+j.?.?.K.KK& (?rE   c                    |j                         }g }|j                   j                     }t         fd|j                  D        d      }|t        d j                   d      d}t         j                  D cg c]  }t        |t              s| c}      }	d}
 j                  D ]  t        t              rRt        t        j                              }t        j                  t              rR|j                  t        j                               d|_        |j                  t#        j                               t        j                  t$              rft        j                  t&              r%|j                  t        j                               |j                  t)        j                               j                  -t*        j-                  d	 j                   d
t        j                                gt        t.              r	|j0                  j2                  }|j4                  dz   }j6                  |j8                  z
  }||j                  ||j:                        nd}|L|j                  t)         j<                  | j                  |j4                  dz   |j8                               %d|_        |j                  t        t                            |j                  t?         j                  j:                               t        t@              rJ|j                   j                     jB                  jE                  jF                  g       }|jH                  jB                  jK                  jF                  g       }tM        |      tM        |      kD  rd}
tO        |jH                  |j                   j                     jB                  jQ                         D ci c]  \  }}|tS        |       c}}      }||_$        |j                  tU         j                  j<                  |j                               |j                  j<                         t        tV              rC|	s|j                   j                     jB                  jY                  jF                  d       /t        tZ              rt        fdt]        |j^                        D        d      }ta        jb                  |j<                  jd                  jf                  t        tM        jf                              d      }|||j^                  |<   |j^                  j                  |       jh                  s|j                  t        jh                               t        tj              rc|	s3jb                  |j                   j                     j^                  }t        tm        fd|      d      }||jo                  |       t        dt                      tM        |D cg c]  }tq        |      s| c}      dkD  }|
r|js                  dt        tu        tv        jx                   j                  t        t         j<                              |t         j                                           |j                  jo                  |       |stM        |jz                        dkD  rtM        |j                        |j0                  j|                  k  r|jz                  jY                  d      }t        | j                  ||      }|j                  |       tM        |jz                        dkD  r-tM        |j                        |j0                  j|                  k  r||fS c c}w c c}}w c c}w )z>
    processes the results from a step function execution
    c              3  V   K   | ]   }|j                   j                   k(  s| " y wr3   rX   )rZ   r[   rB   s     rC   r]   z,_process_step_result_tick.<locals>.<genexpr>|  s      Nqt~~0MNs   ))Nr^   z not found in in_progressTr   F)ra   z1Unknown result type returned from step function (z):    )r`   rL   r_   ry   rz   )r_   rd   )collected_eventsr_   r`   rY   c              3  Z   K   | ]"  \  }}|j                   j                   k(  r| $ y wr3   	waiter_id)rZ   ir   ra   s      rC   r]   z,_process_step_result_tick.<locals>.<genexpr>  s/      1{{f&6&66 s   (+)r   r`   waiting_for_eventrequirementshas_requirementsresolved_eventc                "    | j                   k(  S r3   r   )r[   	to_removes    rC   ru   z+_process_step_result_tick.<locals>.<lambda>   s    Q[[I-E rE   zUnknown result type: r   )r   nameinput_event_nameoutput_event_namerX   )Ar   r9   r_   rf   rg   r~   rX   r   ra   r{   r#   strr   r   rR   r   
is_runningr   r
   r   r   rj   warningr"   r   retry_policyry   re   rz   rd   r`   r   r   r   
setdefaultevent_idrh   rG   r   r   r   listr   r    r   r   	enumeratecollected_waitersr%   r   
event_typer   waiter_eventr!   filterrs   r   r   r   r   NOT_RUNNINGr<   r   r   r   )rB   r   r   r8   r   worker_statethis_executionr   r   did_complete_stepstep_no_longer_in_progressretriesfailureselapsed_timerL   r   sent_eventsyupdated_stateexisting
new_waiterwaitersitemis_completedr`   subcommandsra   r   s   `                         @@rC   r   r   q  se    MMOE&(H==0LNL,,NPTN 74>>"22KLMM$(KKCq:a1A#BC "&++ |Ef./ #D$7 8&--3'fmm< $)  2&-- HIFMM51 fmm-?@OO$7fmm$LM 1 FG&GGWWZ[_`f`m`m[nZop  01"))66G%..2H!++n.M.MML & \8V5E5EF 
  %"jj#"&..!/!8!81!<)7)H)H $)  3)+ FG'"&..F<L<L
  12$}} zz&//2>  )55FFJJK #$s;'77 .3* '"// %*MM NN%**557	& Aq 47
&! /<+$"&..$ll)33 !''5 45 dnn->>BBOOT 	* ),*H*H I
 H * **$**"("3"3#00!%c&*=*=&>!?#J #;E..x8..55jA&&OO$7f>Q>Q$RS- ",,	--7IIF#EwOQUV#NN4(4T&\NCDDy|E| 8Aa~a/@ABQFL! (44%(djj)9%:&7!$..1	
 	  ''7""#a'L,,-0C0C0O0OO &&**1-E/t~~|[K OOK( ""#a'L,,-0C0C0O0OO (?y 	DN&v Bs   >__	_$ _*1_*c                   g }t        |j                        |j                  j                  k  }|rWt	        d |j                  D              }t        |j                  j                        D cg c]	  }||vs| }}|d   }	|j                         }
t        ||
j                  |
j                        }|j                  j                  t        | j                  |	|| j                  xs d| j                  xs |             |j                  t        || j                  |	             |j                  t!        t#        t$        j&                  |t)        | j                        j*                  t-        |	                         |S |j                  t!        t#        t$        j.                  |t)        | j                        j*                  d                   |j0                  j                  |        |S c c}w )z
    Small helper to assist in adding an event to a step worker state, or enqueuing it if it's not accepted.
    Note! This mutates the state, assuming that its already been deepcopied in an outer scope.
    c              3  4   K   | ]  }|j                     y wr3   r   )rZ   r   s     rC   r]   z(_add_or_enqueue_event.<locals>.<genexpr>2  s     :11;;:s   r   )r_   r   r   )r`   rX   rh   ry   rz   r   )r   r   r   rX   z
<enqueued>)r   rg   r   r   setrange	_deepcopyr$   r   r   rR   r   r`   ry   rz   r   r   r   r   RUNNINGr   r   r   	PREPARINGr<   )r`   r_   r8   r   r   	has_spaceusedr   id_candidatesrY   
state_copyrh   s               rC   r   r   #  s    ')HE%%&)A)AAI:(9(9::$)%,,*B*B$CUqqPT}UU1__&
(7'88(::)

 	  kk),1!&!7!7!F;	
 	(9EKKTVWX (00"%)%++%6%?%?!"g			
, O 	 (22"%)%++%6%?%?*			
 	5!OQ Vs   /	G89G8c                    |j                         }g }t         j                  t              rd|_        |j
                  j                  j                         D ]  \  }}t         j                        |j                  v }|s* j                   j                  |k(  sFt        t         j                        ||j                  |   |      }|j                  |        |j
                  j                  j                         D ]  \  }}|j                  |   j                  }	|	D ]  }
t         j                        |
j                   u }|xr, t#         fd|
j$                  j                         D              }|sW j                  |
_        t        t        |
j                        ||j                  |   |      }|j                  |         ||fS )NTr   c              3  X   K   | ]!  \  }}t        j                  |d       |k(   # y wr3   )getattrr`   )rZ   kvrB   s      rC   r]   z*_process_add_event_tick.<locals>.<genexpr>w  s/      (Aq 

At,1(s   '*)r   r{   r`   r   r   r   r   r   r   accepted_eventsr_   r   r   r9   r   r   r   allr   r   )rB   r   r   r8   r   r_   step_configis_acceptedr   wait_conditionswait_conditionis_matchs   `           rC   r   r   ^  s    MMOE&(H$**j)"',,"4"4":":"< 	)	;4::&+*E*EEDNN2dnn	6Q/4::.i(	K OOK(	) #(,,"4"4":":"< -	;--	2DD- 	-NDJJ'>+K+KKH C (*77==?( %H 04

-3 ~';';<MM),	 ,	--" (?rE   c                v    |j                         }|t        t                     t        t	                     gfS )Nr   rd   )r   r   r   r   r   )rB   r   r8   s      rC   r   r     s9     MMOE )+.578  rE   c                4    |t        | j                        gfS )Nr   )r   r`   )rB   r   s     rC   r   r     s     %DJJ7888rE   c           
     j   |j                         }d|_        |j                  j                         D cg c]  \  }}t	        |j
                        dkD  r|! }}}|rddj                  |      z   nd}|t        t                     t        t        d| j                   d|       	      gfS c c}}w )
NFr   zCurrently active steps: z, zNo steps activer   zOperation timed out after z
 seconds. r  )r   r   r9   r   r   rg   joinr   r   r   r	   r   )rB   r   r8   r_   r   active_steps
steps_infos          rC   r   r     s     MMOEE (,||'9'9';#I||''(1, 	L   	#TYY|%<< 
 )+.*,T\\N*ZLQ	
  s   $B/)r   r   rA   zBrokerState | Noner   r   rO   r   )r8   r   r   zlist[WorkflowTick]rO   r   )rB   r,   r   r   r   floatrO   )tuple[BrokerState, list[WorkflowCommand]])r8   r   r   r  rO   r  )rB   zTickStepResult[R]r   r   r   r  rO   r  )
r`   r   r_   r   r8   r   r   r  rO   zlist[WorkflowCommand])rB   r'   r   r   r   r  rO   r  )rB   r(   r   r   rO   r  )rB   r)   r   r   rO   r  )rB   r+   r   r   rO   r  )L
__future__r   r:   loggingr   dataclassesr   typingr   workflows.decoratorsr   workflows.errorsr   r   r	   workflows.eventsr
   r   r   r   r   r    workflows.runtime.types.commandsr   r   r   r   r   r   r   r   &workflows.runtime.types.internal_stater   r   r   r   workflows.runtime.types.pluginr   r   workflows.runtime.types.resultsr   r   r    r!   r"   r#   r$   r%   %workflows.runtime.types.step_functionr&   workflows.runtime.types.ticksr'   r(   r)   r*   r+   r,   #workflows.runtime.workflow_registryr-   workflows.workflowr.   workflows.context.contextr/   	getLoggerrj   r1   r   r   r   r   r   r   r   r   r   r   r   rE   rC   <module>r      s   #       " 
 	 	 	 	 	 	  B '1 
			T' T'n55"5 5 	5&			 	=
=)=8==.=" /:o
o#.o=Bo.od888 #8 	8
 8v&
&)&8=&.&R


*
.
9
9"-9.9
(.rE   