
    'jL                        d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d
dlmZ d
dlmZ d
dlm Z  d
dl!m"Z" d
dl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+  G d d          Z, G d d          Z-	 dde.dee         de+fdZ/	 ddee         de+fdZ0	 ddee         de+fdZ1dS )     )wraps)Logger)CallableUnionOptional	AwaitableSequenceListPattern)AsyncWebClient)AsyncBoltContext)AsyncListenerAsyncCustomListener)workflow_step_editworkflow_step_saveworkflow_step_execute)AsyncCustomMiddleware)BoltResponse   )_is_used_without_argument)AsyncCompleteAsyncConfigure)	AsyncFailAsyncUpdate   )	BoltError)AsyncListenerMatcherAsyncCustomListenerMatcher)AsyncMiddlewarec                   8   e Zd ZU dZeeef         ed<   ee	         ed<   ee
         ed<   ee
         ed<   ee
         ed<   	 	 ddeeef         dee         d	ee	         fd
Zdddddeeedee         f         ef                  deeeef                  deeeded         f                           fdZdddddeeedee         f         ef                  deeeef                  deeeded         f                           fdZdddddeeedee         f         ef                  deeeef                  deeeded         f                           fdZdd	ee	         ddfdZ	 	 ddedee
eee         f         deeedee         f         ef                  deeeef                  de
f
dZededeeeedee         f         ef                           dee         fd            Zededeeeeef                           dee         fd            ZdS )AsyncWorkflowStepBuilderzdSteps from apps
    Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
    callback_id_base_logger_edit_save_executeNapp_namebase_loggerc                 h    || _         |pt          | _        || _        d| _        d| _        d| _        dS )a)  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        This builder is supposed to be used as decorator.

            my_step = AsyncWorkflowStep.builder("my_step")
            @my_step.edit
            async def edit_my_step(ack, configure):
                pass
            @my_step.save
            async def save_my_step(ack, step, update):
                pass
            @my_step.execute
            async def execute_my_step(step, complete, fail):
                pass
            app.step(my_step)

        For further information about AsyncWorkflowStep specific function arguments
        such as `configure`, `update`, `complete`, and `fail`,
        refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents.

        Args:
            callback_id: The callback_id for the workflow
            app_name: The application name mainly for logging
            base_logger: The base logger
        N)r$   __name__r)   r%   r&   r'   r(   )selfr$   r)   r*   s       e/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/slack_bolt/workflows/step/async_step.py__init__z!AsyncWorkflowStepBuilder.__init__)   s:    D ' ,H'

    )matchers
middlewarelazyr1   .r2   r3   c                     t          |          r'|d         }                     d|           _        |S  fd}|S )a&  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        Registers a new edit listener with details.

        You can use this method as decorator as well.

            @my_step.edit
            def edit_my_step(ack, configure):
                pass

        It's also possible to add additional listener matchers and/or middleware

            @my_step.edit(matchers=[is_valid], middleware=[update_context])
            def edit_my_step(ack, configure):
                pass

        For further information about AsyncWorkflowStep specific function arguments
        such as `configure`, `update`, `complete`, and `fail`,
        refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents.

        Args:
            *args: This method can behave as either decorator or a method
            matchers: Listener matchers
            middleware: Listener middleware
            lazy: Lazy listeners
        r   editc                       gng z   }                     d|          _        t                      fd            }|S )Nr5   c                  $   K    | i | d {V S N argskwargsfuncs     r.   _wrapperz?AsyncWorkflowStepBuilder.edit.<locals>._inner.<locals>._wrapper   .      !T426222222222r0   )_to_listenerr&   r   r=   	functionsr>   r3   r1   r2   r-   s   `  r.   _innerz-AsyncWorkflowStepBuilder.edit.<locals>._inner{   d    $*:$$CI**69h
SSDJ4[[3 3 3 3 [3 Or0   )r   r@   r&   r-   r1   r2   r3   r;   r=   rC   s   ````   r.   r5   zAsyncWorkflowStepBuilder.editR   q    H %T** 	7D**64:NNDJK	 	 	 	 	 	 	 	 r0   c                     t          |          r'|d         }                     d|           _        |S  fd}|S )a,  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        Registers a new save listener with details.

        You can use this method as decorator as well.

            @my_step.save
            def save_my_step(ack, step, update):
                pass

        It's also possible to add additional listener matchers and/or middleware

            @my_step.save(matchers=[is_valid], middleware=[update_context])
            def save_my_step(ack, step, update):
                pass

        For further information about AsyncWorkflowStep specific function arguments
        such as `configure`, `update`, `complete`, and `fail`,
        refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents.

        Args:
            *args: This method can behave as either decorator or a method
            matchers: Listener matchers
            middleware: Listener middleware
            lazy: Lazy listeners
        r   savec                       gng z   }                     d|          _        t                      fd            }|S )NrH   c                  $   K    | i | d {V S r8   r9   r:   s     r.   r>   z?AsyncWorkflowStepBuilder.save.<locals>._inner.<locals>._wrapper   r?   r0   )r@   r'   r   rA   s   `  r.   rC   z-AsyncWorkflowStepBuilder.save.<locals>._inner   rD   r0   )r   r@   r'   rE   s   ````   r.   rH   zAsyncWorkflowStepBuilder.save   rF   r0   c                     t          |          r'|d         }                     d|           _        |S  fd}|S )a>  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        Registers a new execute listener with details.

        You can use this method as decorator as well.

            @my_step.execute
            def execute_my_step(step, complete, fail):
                pass

        It's also possible to add additional listener matchers and/or middleware

            @my_step.save(matchers=[is_valid], middleware=[update_context])
            def execute_my_step(step, complete, fail):
                pass

        For further information about AsyncWorkflowStep specific function arguments
        such as `configure`, `update`, `complete`, and `fail`,
        refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents.

        Args:
            *args: This method can behave as either decorator or a method
            matchers: Listener matchers
            middleware: Listener middleware
            lazy: Lazy listeners
        r   executec                       gng z   }                     d|          _        t                      fd            }|S )NrL   c                  $   K    | i | d {V S r8   r9   r:   s     r.   r>   zBAsyncWorkflowStepBuilder.execute.<locals>._inner.<locals>._wrapper   r?   r0   )r@   r(   r   rA   s   `  r.   rC   z0AsyncWorkflowStepBuilder.execute.<locals>._inner   sd    $*:$$CI --iHjYYDM4[[3 3 3 3 [3 Or0   )r   r@   r(   rE   s   ````   r.   rL   z AsyncWorkflowStepBuilder.execute   sq    H %T** 	7D --ixTTDMK	 	 	 	 	 	 	 	 r0   returnAsyncWorkflowStepc                     | j         t          d          | j        t          d          | j        t          d          t	          | j        | j         | j        | j        | j        |          S )a  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        Constructs a WorkflowStep object. This method may raise an exception
        if the builder doesn't have enough configurations to build the object.

        Returns:
            An `AsyncWorkflowStep` object
        Nzedit listener is not registeredzsave listener is not registeredz"execute listener is not registered)r$   r5   rH   rL   r)   r*   )r&   r   r'   r(   rP   r$   r)   )r-   r*   s     r.   buildzAsyncWorkflowStepBuilder.build   s}     :=>>>:=>>>= @AAA (M]#
 
 
 	
r0   namelistener_or_functionsc                     t                               | j        | j        |||                     | j        |          |                     | j        |          | j                  S )N)r$   r)   rT   rS   r1   r2   r*   )rP   build_listenerr$   r)   to_listener_matchersto_listener_middlewarer%   )r-   rS   rT   r1   r2   s        r.   r@   z%AsyncWorkflowStepBuilder._to_listener  sb     !//(]"7..t}hGG224=*MM) 0 
 
 	
r0   c                    g }||D ]}t          |t                    r|                    |           -t          |t                    r%|                    t	          | |                     gt          dt          |                     |S )Nr)   r=   zInvalid matcher: )
isinstancer   appendr   r    
ValueErrortype)r)   r1   	_matchersms       r.   rW   z-AsyncWorkflowStepBuilder.to_listener_matchers   s    
 	 D Da!566 D$$Q''''8,, D$$%?XY%Z%Z%Z[[[[$%Ba%B%BCCCr0   c                    g }||D ]}t          |t                    r|                    |           -t          |t                    r%|                    t	          | |                     gt          dt          |                     |S )NrZ   zInvalid middleware: )r[   r!   r\   r   r   r]   r^   )r)   r2   _middlewarer`   s       r.   rX   z/AsyncWorkflowStepBuilder.to_listener_middleware0  s     ! G Ga11 G&&q))))8,, G&&'<hUV'W'W'WXXXX$%EDGG%E%EFFFr0   )NNr8   )r,   
__module____qualname____doc__r   strr   __annotations__r   r   r   r/   r   r   boolr   r!   r
   r5   rH   rL   rR   r@   staticmethodrW   rX   r9   r0   r.   r#   r#      s          sG|$$$$6""""M""""M""""}%%%%
 #'(,	' '3<(' 3-' f%	' ' ' 'X [_AE?C3 3 3 5#y*>!?AU!UVW3 U8_#<=>	3
 tHS)D/%9:;<3 3 3 3p [_AE?C3 3 3 5#y*>!?AU!UVW3 U8_#<=>	3
 tHS)D/%9:;<3 3 3 3p [_AE?C3 3 3 5#y*>!?AU!UVW3 U8_#<=>	3
 tHS)D/%9:;<3 3 3 3j
 
&!1 
=P 
 
 
 
D [_AE
 

  %]Hd8n%LM
 5#y*>!?AU!UVW	

 U8_#<=>
 

 
 
 
" 4hsIdO/C&DFZ&Z [\] 
"	#   \ #+Dx7P1Q,R#S	o	   \  r0   r#   c                      e Zd ZU eeef         ed<   	 eed<   	 eed<   	 eed<   	 ddddeeef         deede	e
         f         eee         f         deede	e
         f         eee         f         deede	e
         f         eee         f         dee         d	ee         fd
Ze	 ddeeef         d	ee         defd            Ze	 	 	 ddeeef         dedeeeee         f         dedeee                  deee                  d	ee         fd            Ze	 ddeded	ee         defd            Ze	 ddeded	ee         defd            ZdS )rP   r$   r5   rH   rL   N)r)   r*   .r)   r*   c                    || _         |pt          }|                     |||d|          | _        |                     |||d|          | _        |                     |||d|          | _        dS )aE  
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/

        Args:
            callback_id: The callback_id for this step from app
            edit: Either a single function or a list of functions for opening a modal in the builder UI
                When it's a list, the first one is responsible for ack() while the rest are lazy listeners.
            save: Either a single function or a list of functions for handling modal interactions in the builder UI
                When it's a list, the first one is responsible for ack() while the rest are lazy listeners.
            execute: Either a single function or a list of functions for handling steps from apps executions
                When it's a list, the first one is responsible for ack() while the rest are lazy listeners.
            app_name: The app name that can be mainly used for logging
            base_logger: The logger instance that can be used as a template when creating this step's logger
        r5   )r$   r)   rT   rS   r*   rH   rL   N)r$   r,   rV   r5   rH   rL   )r-   r$   r5   rH   rL   r)   r*   s          r.   r/   zAsyncWorkflowStep.__init__J  s    4 ''x''#"&# ( 
 
	 ''#"&# ( 
 
	 **#")# + 
 
r0   rO   c                 $    t          ||          S )z
        Deprecated:
            Steps from apps for legacy workflows are now deprecated.
            Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
        )r*   )r#   )clsr$   r*   s      r.   builderzAsyncWorkflowStep.builder|  s     (MMMMr0   rT   rS   r1   r2   c           	      *   |t          | d| d          t          |t                    r|g}t          |t                    r|S t          |t                    r|r|ng }|                    d|                     |||                     |r|ng }|                    d|                     |||                     |}|                    d          }	t          ||||	||dk    |          S t          d| dt          |           d| d          )	Nz$ listener is required (callback_id: )r   rL   )r)   r1   r2   ack_functionlazy_functionsauto_acknowledgementr*   zInvalid z listener: z detected (callback_id: )r   r[   r   r   listinsert_build_primary_matcher_build_single_middlewarepopr   r^   )
rm   r$   r)   rT   rS   r1   r2   r*   rB   rq   s
             r.   rV   z AsyncWorkflowStep.build_listener  s[    !(tWWWWWXXX+X66 	<%:$;!+];; 	}((-t44 	}#+3xxHOOAs99$[YYZZZ'19rJa!=!=dKQ\!]!]^^^-I$==++L&!!%)(%)Y%6'    {t{{=R8S8S{{mx{{{|||r0   c                     |dk    rt          |d|          S |dk    rt          |d|          S |dk    rt          |d|          S t          d|           )Nr5   T)asyncior*   rH   rL   Invalid name )r   r   r   r]   rm   rS   r$   r*   s       r.   rv   z(AsyncWorkflowStep._build_primary_matcher  sx     6>>%k4[YYYYV^^%k4[YYYYY(dP[\\\\3T33444r0   c                     |dk    rt          ||          S |dk    rt          |          S |dk    rt          |          S t          d|           )Nr5   rH   rL   r{   )_build_edit_listener_middleware_build_save_listener_middleware"_build_execute_listener_middlewarer]   r|   s       r.   rw   z*AsyncWorkflowStep._build_single_middleware  sd     6>>2;LLLV^^2;???Y5kBBB3T33444r0   r8   )NNN)r,   rc   rd   r   rf   r   rg   r   r   r   r   r	   r   r   r/   classmethodr#   rn   r
   r   r!   rV   rv   rw   r9   r0   r.   rP   rP   @  s        sG|$$$$.
E
_I #'(,0
 0
 0
 3<(0
 HS)L"99:M8T\K]]^	0

 HS)L"99:M8T\K]]^0
 xY|%< <=}hW_N``a0
 3-0
 f%0
 0
 0
 0
d  )-
N 
N3<(
N f%
N 
"	
N 
N 
N [
N  :>6:(,#} #}3<(#} #}  %]Hd8n%LM	#}
 #} 4 456#} T/23#} f%#} #} #} [#}J 
 )-	5 55 5 f%	5
 
5 5 5 [5 
 )-	5 55 5 f%	5
 
5 5 5 [5 5 5r0   rP   Nr$   r*   rO   c                      dt           dt          dt          dt          g t          t
                   f         f fd}t          t          ||          S )Ncontextclientbodynextc                 R   K   t          ||          | d<    |             d {V S )N)r$   r   r   	configurer   )r   r   r   r   r$   s       r.   edit_listener_middlewarezA_build_edit_listener_middleware.<locals>.edit_listener_middleware  sE        .# 
  
  

 TVV||||||r0   r)   r=   r*   r   r   dictr   r   r   r   r,   )r$   r*   r   s   `  r.   r~   r~     sv    !  r9\223	      !%   r0   c                     dt           dt          dt          dt          g t          t
                   f         fd}t          t          ||           S )Nr   r   r   r   c                 N   K   t          ||          | d<    |             d {V S )Nr   r   updater   r   r   r   r   s       r.   save_listener_middlewarezA_build_save_listener_middleware.<locals>.save_listener_middleware  sA       (
 
 
 TVV||||||r0   r   r   )r*   r   s     r.   r   r     sk    
!

 
 r9\223	
 
 
 
 !%   r0   c                     dt           dt          dt          dt          g t          t
                   f         fd}t          t          ||           S )Nr   r   r   r   c                 v   K   t          ||          | d<   t          ||          | d<    |             d {V S )Nr   completefail)r   r   r   s       r.   execute_listener_middlewarezG_build_execute_listener_middleware.<locals>.execute_listener_middleware  sa       ,
 
 

 $
 
 
 TVV||||||r0   r   r   )r*   r   s     r.   r   r     sk    !  r9\223	     !(   r0   r8   )2	functoolsr   loggingr   typingr   r   r   r   r	   r
   r   slack_sdk.web.async_clientr    slack_bolt.context.async_contextr   "slack_bolt.listener.async_listenerr   r   $slack_bolt.listener_matcher.builtinsr   r   r   -slack_bolt.middleware.async_custom_middlewarer   slack_bolt.responser   	internalsr   utilities.async_completer   utilities.async_configurer   utilities.async_failr   utilities.async_updater   errorr   'listener_matcher.async_listener_matcherr   r    middleware.async_middlewarer!   r#   rP   rf   r~   r   r   r9   r0   r.   <module>r      s               P P P P P P P P P P P P P P P P P P 5 5 5 5 5 5 = = = = = = Q Q Q Q Q Q Q Q         
 P O O O O O , , , , , , 0 0 0 0 0 0 3 3 3 3 3 3 5 5 5 5 5 5 + + + + + + / / / / / /              ; : : : : :_ _ _ _ _ _ _ _D	M5 M5 M5 M5 M5 M5 M5 M5n %) &!    < %) &!   8 %) &!     r0   