
    ib                       S SK Jr  S SKrS SKJr  S SKrS SKJr  S SKJ	r	  S SK
JrJrJr  S SKJrJrJrJrJrJr  S SKJrJrJrJrJrJrJrJr  S S	KJrJ r J!r!J"r"  S S
K#J$r$J%r%  S SK&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.  S SK/J0r0  S SK1J2r2J3r3J4r4J5r5J6r6J7r7  S SK8r8S SK9J:r:  S SK;J<r<  \(       a  S SK=J>r>  \8R~                  " 5       r@ " S S5      rA        SS jrB      SS jrC        SS jrD      S S jrE        S!S jrF          S"S jrG        S#S jrH      S$S jrI      S%S jrJ      S&S jrKg)'    )annotationsN)replace)TYPE_CHECKING)R)WorkflowCancelledByUserWorkflowRuntimeErrorWorkflowTimeoutError)EventInputRequiredEvent
StartEvent	StepStateStepStateChanged	StopEvent)CommandCompleteRunCommandFailWorkflowCommandHaltCommandPublishEventCommandQueueEventCommandRunWorkerWorkflowCommandindicates_exit)EventAttemptInProgressStateBrokerStateInternalStepWorkerState)WorkflowRuntimeas_snapshottable)AddCollectedEvent	AddWaiterDeleteCollectedEventDeleteWaiterStepWorkerFailedStepWorkerResultStepWorkerStateStepWorkerWaiter)StepWorkerFunction)TickAddEventTickCancelRunTickPublishEventTickStepResultTickTimeoutWorkflowTick)Workflow)workflow_registry)Contextc                      \ rS rSrSr          SS jrSS jrSSS jjrSS jrSS jr	SS	 jr
 S     SS
 jjrSrg)_ControlLoopRunnerO   z
Private class to encapsulate the async control loop runtime state and behavior.
Keeps the pure transformation functions at module level for testability.
c                   Xl         X l        X0l        X@l        XPl        / U l        [        R                  " 5       U l        U R                  R                  5        H  nU R                  R                  U5        M      [        U5      U l        g N)workflowplugincontextstep_workersstateworkersasyncioQueuequeuerehydrate_with_ticks
put_nowaitr   snapshot_plugin)selfr5   r6   r7   r8   
init_stateticks          X/home/james-whalen/.local/lib/python3.13/site-packages/workflows/runtime/control_loop.py__init___ControlLoopRunner.__init__U   sh     !(
+-29--/
JJ335DJJ!!$' 6/7    c                R   #    U R                   R                  5       I Sh  vN $  N7f)z/Wait for the next tick from the internal queue.N)r=   get)rA   s    rD   wait_for_tick _ControlLoopRunner.wait_for_tickh   s     ZZ^^%%%%s   '%'Nc                   ^ ^^ T(       aA  SUU U4S jjn[         R                  " U" 5       5      nT R                  R                  U5        gT R                  R                  T5        g)z<Queue a tick event for processing, optionally after a delay.c                    >#    TR                   R                  T 5      I S h  vN   TR                  R                  T5        g  N 7fr4   )r6   sleepr=   r?   )delayrA   rC   s   rD   _delayed_queue5_ControlLoopRunner.queue_tick.<locals>._delayed_queuep   s5     kk''...

%%d+ /s   AA!ANreturnNone)r;   create_taskr:   appendr=   r?   )rA   rC   rO   rP   tasks   ```  rD   
queue_tick_ControlLoopRunner.queue_tickl   sI    , , &&~'78DLL%JJ!!$'rG   c                   ^ ^^ SUU 4S jjn[         R                  " U" 5       5      mTR                  U U4S j5        T R                  R	                  T5        g)z!Run a worker for a step function.c                   >#     [        U4S jTR                  R                  TR                     R                   5       S 5      n U c  [        STR                   S35      eU R                  nTR                  TR                     nU" UTR                  TR                  TR                  TR                  S9I S h  vN nTR                  [        TR                  TR                  TR                  US95        g  N>! [         a  n[        R!                  SUSS9  TR                  [        TR                  TR                  TR                  [#        UTR$                  R'                  5       I S h  vN  S	9/S95        UeS nAff = f7f)
Nc              3  `   >#    U  H#  nUR                   TR                  :X  d  M  Uv   M%     g 7fr4   )	worker_idid).0wcommands     rD   	<genexpr>E_ControlLoopRunner.run_worker.<locals>._run_worker.<locals>.<genexpr>   s*      !RA;;'**4 !Rs   .	.Worker z2 not found in in_progress. This should not happen.)r9   	step_nameeventr7   r5   )re   r]   rf   resultz$error running step worker function: Texc_info)	exception	failed_at)nextr9   r:   re   in_progressr   r^   shared_stater8   rf   r7   r5   rX   r*   	Exceptionloggererrorr"   r6   get_now)workersnapshotstep_fnrg   era   rA   s        rD   _run_worker2_ControlLoopRunner.run_worker.<locals>._run_worker|   sk    -!%!3!3G4E4E!F!R!R
  >.!'**-_`  "...2.?.?@Q@Q.R&"%//!-- LL!]]   "")"3"3")**%mm%	  CQQUV"")"3"3")**%mm,*+T[[=P=P=R7R7R 		 sH   F	B7C= <C;==C= :F	;C= =
FA)F0E31FFF	c                :   > TR                   R                  T5      $ r4   )r:   remove)_rA   rW   s    rD   <lambda>/_ControlLoopRunner.run_worker.<locals>.<lambda>   s    )<)<T)BrG   NrR   )r;   rU   add_done_callbackr:   rV   )rA   ra   rw   rW   s   `` @rD   
run_worker_ControlLoopRunner.run_workery   sC    .	 .	` "";=1BCD!rG   c           	       #    [        U[        5      (       aD  U R                  [        UR                  UR
                  UR                  UR                  S95        g[        U[        5      (       a  U R                  U5        g[        U[        5      (       a2  U R                  5       I Sh  vN   UR                  b  UR                  eg[        U[        5      (       a  UR                  $ [        U[        5      (       a.  U R                   R#                  UR                  5      I Sh  vN   g[        U[$        5      (       a$  U R                  5       I Sh  vN   UR                  e['        S[)        U5       35      e N NW N+7f)z6Process a single command returned from tick reduction.)rf   re   attemptsfirst_attempt_atNzUnknown command type: )
isinstancer   rX   r'   rf   re   r   r   r   r   r   cleanup_tasksrj   r   rg   r   r6   write_to_event_streamr   
ValueErrortype)rA   ra   s     rD   process_command"_ControlLoopRunner.process_command   s?    g011OO!--%//$--%,%=%=	 !122OOG$--$$&&&  ,''' -!344>>!!455++33GMMBBB!455$$&&&###5d7m_EFF ' C 's7   B)F+E>,A<F(F )-FF(F FFc                  #     U R                    H  nUR                  5         M      [        R                  " [        R
                  " U R                   SS06SS9I Sh  vN   g! [         a     NIf = f N! [         a     gf = f7f)z,Cancel and cleanup all running worker tasks.return_exceptionsTg      ?timeoutN)r:   cancelro   r;   wait_forgather)rA   rs   s     rD   r    _ControlLoopRunner.cleanup_tasks   s     	,, '	""EE    		  		sW   B#A$ 6A6 A4A6 #B$
A1.B0A11B4A6 6
B BBBc                .  ^ #    S	U 4S jjnT R                   R                  [        R                  " U" 5       5      5        Ub  T R	                  [        US95        U(       aV  T R                  R                  b?  T R	                  [        T R                  R                  S9T R                  R                  S9  [        T R                  T R                  R                  5       I Sh  vN 5      u  T l
        nU H  n T R                  U5      I Sh  vN   M       T R!                  5       I Sh  vN n [#        UT R                  T R                  R                  5       I Sh  vN 5      u  T l
        nT R(                  b  T R(                  R+                  U5        U H<  n T R                  U5      I Sh  vN nUc  M"  Us  T R                  5       I Sh  vN   $    M   N N! [         a    T R                  5       I Sh  vN    e f = f N N! [         a/    T R                  5       I Sh  vN    [$        R'                  SSS9  e f = f N! [         a    T R                  5       I Sh  vN    e f = f N! T R                  5       I Sh  vN    f = f7f)
z
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                 |   >#     TR                   R                  5       I S h  vN n TR                  U 5        M5   N7fr4   )r6   wait_receiverX   )rC   rA   s    rD   _pull%_ControlLoopRunner.run.<locals>._pull   s2     ![[5577% 7s   <:<Nrf   r   )rO   TzNUnexpected error in internal control loop of workflow. This shouldn't happen. rh   rR   )r:   rV   r;   rU   rX   r'   r5   _timeoutr+   rewind_in_progressr9   r6   rr   r   ro   r   rJ   _reduce_tickrp   rq   r@   on_tick)rA   start_eventstart_with_timeoutr   commandsra   rC   rg   s   `       rD   run_ControlLoopRunner.run   sA    	&
 	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I7 .H/I7 4.H "H#H 3-I7 !I5I6I:I7 ?I7 JI5JI7 J!G##H HHJI7 H I,H/-II7 II2*I-+I22I7 5J7JJJJ)r7   r6   r=   r@   r9   r8   r:   r5   )
r5   r-   r6   r   r7   r/   r8   zdict[str, StepWorkerFunction]rB   r   )rS   r,   r4   )rC   r,   rO   zfloat | NonerS   rT   )ra   r   rS   rT   )ra   r   rS   zNone | StopEventrR   )NT)r   Event | Noner   boolrS   r   )__name__
__module____qualname____firstlineno____doc__rE   rJ   rX   r   r   r   r   __static_attributes__ rG   rD   r1   r1   O   s    
88  8 	8
 48  8&&(5"nG<  LPF''F'DHF'	F' F'rG   r1   c                D  #    [         R                  " U5      nUc  [        S5      eU=(       d     [        R                  " UR
                  5      n[        UR
                  UR                  UR                  UR                  U5      nUR                  U S9I Sh  vN $  N7f)z1
The main async control loop for a workflow run.
Nz&Run context not found for control loop)r   )r.   get_runr   r   from_workflowr5   r1   r6   r7   stepsr   )r   rB   run_idcurrentr9   runners         rD   control_loopr   &  s       ''/G"#KLLE+33G4D4DEE'..'//7==%F 4444s   BB BB c                Z    U H$  n[        X [        R                  " 5       5      u  pM&     U $ )z&Rebuild the state from a list of ticks)r   time)r9   ticksrC   r{   s       rD   rebuild_state_from_ticksr   9  s.    
 
q  LrG   c                t   [        U [        5      (       a  [        XU5      $ [        U [        5      (       a  [	        XU5      $ [        U [
        5      (       a  [        X5      $ [        U [        5      (       a  [        X5      $ [        U [        5      (       a  [        X5      $ [        S[        U 5       35      e)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   )rC   initnow_secondss      rD   r   r   E  s     $''([AA	D,	'	'&t;??	D-	(	('33	D*	+	+*466	D+	&	&$T00.tDzl;<<rG   c                   U R                  5       n / n[        U R                  R                  5       S S9 GH-  u  p4UR                   HF  nUR
                  R                  S[        UR                  UR                  UR                  S95        MH     / Ul        [        UR
                  5      S:  d  M~  [        UR                  5      UR                  R                  :  d  M  UR
                  R                  S5      nUR                  [!        XcXA5      5        [        UR
                  5      S:  d  M  [        UR                  5      UR                  R                  :  a  M  GM0     X4$ )zLRewind the in_progress state, extracting commands to re-initiate the workersc                    U S   $ )Nr   r   )xs    rD   r|   $rewind_in_progress.<locals>.<lambda>]  s    QqTrG   )keyr   )rf   r   r   )deepcopysortedr:   itemsrm   r=   insertr   rf   r   r   lenconfignum_workerspopextend_add_or_enqueue_event)r9   r   r   re   
step_staterm   rf   s          rD   r   r   V  s*   
 NNE&(H!'(;(;(=>!R	%11K##%++(11%0%A%A 2 "$

  !A%J**+j.?.?.K.KK$$((+EOO%e
P	 
  !A%J**+j.?.?.K.KKK "S& ?rG   c                  ^ ^^ UR                  5       n/ nUR                  T R                     n[        U 4S jUR                   5       S5      nUc  [        ST R                   S35      eSn[        T R                   Vs/ s H  n[        U[        5      (       d  M  UPM     sn5      n	Sn
T R                   GH  m[        T[        5      (       GaZ  [        [        TR                  5      5      n[        TR                  [        5      (       aM  UR                  [        TR                  S95        SUl        UR                  [#        TR                  S95        M  [        TR                  [$        5      (       af  [        TR                  [&        5      (       a"  UR                  [        TR                  S95        UR                  [)        TR                  S95        GM)  TR                  c  GM9  [*        R-                  S	T R                   S
[        TR                  5       35        GMt  [        T[.        5      (       Ga  UR0                  R2                  nUR4                  S-   nTR6                  UR8                  -
  nUb  UR                  XTR:                  5      OSnUbJ  UR                  [)        T R<                  UT R                  UR4                  S-   UR8                  S95        GM6  SUl        UR                  [        [        5       S95        UR                  [?        T R                  TR:                  S95        GM  [        T[@        5      (       GaJ  UR                  T R                     RB                  RE                  TRF                  / 5      nURH                  RB                  RK                  TRF                  / 5      n[M        U5      [M        U5      :  a  Sn
[O        URH                  UR                  T R                     RB                  RQ                  5        VVs0 s H  u  nnU[S        U5      _M     snnS9nUUl$        UR                  [U        T R                  TR<                  UR                  S95        GM  UR                  TR<                  5        GM  [        T[V        5      (       aJ  U	(       a@  UR                  T R                     RB                  RY                  TRF                  S5        GMI  GML  [        T[Z        5      (       a  [        U4S j[]        UR^                  5       5       S5      n[a        TRb                  UR<                  TRd                  TRf                  [        [M        TRf                  5      5      SS9nUb  UUR^                  U'   GM  UR^                  R                  U5        TRh                  (       a%  UR                  [        TRh                  S95        GMB  GME  [        T[j        5      (       am  U	(       ac  TRb                  mUR                  T R                     R^                  n[        [m        U4S jU5      S5      nUb  URo                  U5        GM  GM  GM  [        S[        T5       35      e   [M        U Vs/ s H  n[q        U5      (       d  M  UPM     sn5      S:  nU
(       a  URs                  S[        [u        [v        Rx                  T R                  [        [        T R<                  5      5      U[        T R                  5      S95      5        UR                  Ro                  U5        U(       d  [M        URz                  5      S:  a  [M        UR                  5      UR0                  R|                  :  a  URz                  RY                  S5      n[        UT R                  XR5      nUR                  U5        [M        URz                  5      S:  a/  [M        UR                  5      UR0                  R|                  :  a  M  X44$ s  snf s  snnf s  snf )z6
processes the results from a step function execution
c              3  ^   >#    U  H"  oR                   TR                   :X  d  M  Uv   M$     g 7fr4   r]   )r_   r`   rC   s     rD   rb   ,_process_step_result_tick.<locals>.<genexpr>~  s"     N,qt~~0M,s   -	-Nrd   z not found in in_progressTr   F)rg   z1Unknown result type returned from step function (z):    )rf   rO   re   r   r   )re   rj   )collected_eventsre   rf   r^   c              3  d   >#    U  H%  u  pUR                   TR                   :X  d  M!  Uv   M'     g 7fr4   	waiter_id)r_   ir   rg   s      rD   rb   r     s.       I{{f&6&66 Q Is    0	0)r   rf   waiting_for_eventrequirementshas_requirementsresolved_eventc                "   > U R                   T:H  $ r4   r   )r`   	to_removes    rD   r|   +_process_step_result_tick.<locals>.<lambda>  s    Q[[I-ErG   zUnknown result type: r   )r   nameinput_event_nameoutput_event_namer]   )Ar   r:   re   rl   rm   r   r]   r   rg   r   r#   strr   r   rV   r   
is_runningr   r
   r   r   rp   warningr"   r   retry_policyr   rk   r   rj   rf   r   r   r   
setdefaultevent_idrn   rI   r   r   r   listr   r    r   r   	enumeratecollected_waitersr%   r   
event_typer   waiter_eventr!   filterrz   r   r   r   r   NOT_RUNNINGr=   r   r   r   )rC   r   r   r9   r   worker_statethis_executionr   r   did_complete_stepstep_no_longer_in_progressretriesfailureselapsed_timerO   r   sent_eventsyupdated_stateexisting
new_waiterwaitersitemis_completedrf   subcommandsrg   r   s   `                         @@rD   r   r   s  s    MMOE&(H==0LNL,,NPTN 74>>"22KLMM$(KKCKq:a1A#BKC "&++f.// #D$7 8&--33'fmm< $)  2&-- HIFMM511 fmm-?@@OO$7fmm$LM 1 FG&GGWWZ[_`f`m`m[nZop  011"))66G%..2H!++n.M.MML & \V5E5EF 
  %"jj#"&..!/!8!81!<)7)H)H $)  3)+ FG'"&..F<L<L
  122$}} zz&//2>  )55FFJJK #$s;'77 .3* '"// %*MM NN%**557%3&%3DAq 47
%3&! /<+$"&..$ll)33 !''5 45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 | 8A8a~a/@8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    `3`3&`8!`>9`>c                   / n[        UR                  5      UR                  R                  :  nU(       GaY  [	        S UR                   5       5      n[        UR                  R                  5       Vs/ s H  owU;  d  M
  UPM     nnUS   n	UR                  5       n
[        UU
R                  U
R                  S9nUR                  R                  [        U R                  U	UU R                  =(       d    SU R                  =(       d    US95        UR                  [        XR                  U	S95        UR                  [!        [#        [$        R&                  U[)        U R                  5      R*                  [-        U	5      S95      5        U$ UR                  [!        [#        [$        R.                  U[)        U R                  5      R*                  SS95      5        UR0                  R                  U 5        U$ s  snf )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  8   #    U  H  oR                   v   M     g 7fr4   r   )r_   r   s     rD   rb   (_add_or_enqueue_event.<locals>.<genexpr>4  s     :(91;;(9s   r   )re   r   r   )rf   r]   rn   r   r   r   )r   r   r   r]   z
<enqueued>)r   rm   r   r   setrange	_deepcopyr$   r   r   rV   r   rf   r   r   r   r   r   r   RUNNINGr   r   r   	PREPARINGr=   )rf   re   r9   r   r   	has_spaceusedr   id_candidatesr^   
state_copyrn   s               rD   r   r   %  s    ')HE%%&)A)AAI:(9(9::$)%,,*B*B$CU$CqPT}$CU1__&
(7'88(::)

 	  kk),1!&!7!7!F;	
 	(9KKTVWX (00"%)%++%6%?%?!"g			
, O 	 (22"%)%++%6%?%?*			
 	5!OQ Vs   4	G<G<c                  ^  UR                  5       n/ n[        T R                  [        5      (       a  SUl        UR
                  R                  R                  5        H  u  pV[        T R                  5      UR                  ;   nU(       d  M0  T R                  b  T R                  U:X  d  MO  [        [        T R                  S9UUR                  U   U5      nUR                  U5        M     UR
                  R                  R                  5        H  u  pVUR                  U   R                  n	U	 H  n
[        T R                  5      U
R                   L nU=(       a-    [#        U 4S jU
R$                  R                  5        5       5      nU(       d  Mc  T R                  U
l        [        [        U
R                  S9UUR                  U   U5      nUR                  U5        M     M     X44$ )NTr   c              3  \   >#    U  H!  u  p[        TR                  US 5      U:H  v   M#     g 7fr4   )getattrrf   )r_   kvrC   s      rD   rb   *_process_add_event_tick.<locals>.<genexpr>y  s,      (?DA 

At,1?s   ),)r   r   rf   r   r   r   r   r   r   accepted_eventsre   r   r   r:   r   r   r   allr   r   )rC   r   r   r9   r   re   step_configis_acceptedr   wait_conditionswait_conditionis_matchs   `           rD   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 x04

-3 ~';';<MM),	 , . #=" ?rG   c                x    UR                  5       nSUl        U[        [        5       S9[	        [        5       S9/4$ )NFr   rj   )r   r   r   r   r   r   )rC   r   r9   s      rD   r   r     s?     MMOEE)+.578  rG   c                .    U[        U R                  S9/4$ )Nr   )r   rf   )rC   r   s     rD   r   r     s     %DJJ7888rG   c           
     r   UR                  5       nSUl        UR                  R                  5        VVs/ s H"  u  p4[	        UR
                  5      S:  d  M   UPM$     nnnU(       a  SSR                  U5      -   OSnU[        [        5       S9[        [        SU R                   SU 35      S	9/4$ s  snnf )
NFr   zCurrently active steps: z, zNo steps activer   zOperation timed out after z
 seconds. r  )r   r   r:   r   r   rm   joinr   r   r   r	   r   )rC   r   r9   re   r   active_steps
steps_infos          rD   r   r     s     MMOEE (,||'9'9';';#I|''(1, 	';    	#TYY|%<< 
 )+.*,T\\N*ZLQ	
  s   B3B3)r   r   rB   zBrokerState | Noner   r   rS   r   )r9   r   r   zlist[WorkflowTick]rS   r   )rC   r,   r   r   r   floatrS   )tuple[BrokerState, list[WorkflowCommand]])r9   r   r   r!  rS   r"  )rC   zTickStepResult[R]r   r   r   r!  rS   r"  )
rf   r   re   r   r9   r   r   r!  rS   zlist[WorkflowCommand])rC   r'   r   r   r   r!  rS   r"  )rC   r(   r   r   rS   r"  )rC   r)   r   r   rS   r"  )rC   r+   r   r   rS   r"  )L
__future__r   r;   dataclassesr   r   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,   loggingworkflows.workflowr-   #workflows.runtime.workflow_registryr.   workflows.context.contextr/   	getLoggerrp   r1   r   r   r   r   r   r   r   r   r   r   r   rG   rD   <module>r4     s   #      # 
 	 	 	 	 	 	   ' A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
(.rG   