
    j                       d 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mZmZmZmZmZ ddlmZmZ ddlmZmZ ddlmZmZ d	Z d
Z!dZ" e#e!e"h      Z$e G d d             Z%ddddddd e&e      ddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dEdZ'e G d d             Z( e&e      d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dFdZ)dZ*dZ+dZ,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3d$Z4d%Z5d&Z6d'Z7d(Z8 e#h d)      Z9e6fdd*	 	 	 dGd+Z:dHd,Z;d-Z<dId.Z=dd*dHd/Z>de8dd0	 	 	 	 	 	 	 	 	 dJd1Z?dKd2Z@dLd3ZAdd4dMd5ZBe G d6 d7             ZC	 	 	 	 	 	 	 	 dNd8ZDddddddd e&e      d9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dOd:ZEd;ZFd"ZGd<ZHd=ZIe G d> d?             ZJddddddd@	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPdAZKg dBZLdQdRdCZMeNdDk(  r eO eM             y)Su  dispatch.normal_fallback_callback_helper — ANU-owned normal/fallback
callback registration helper + post-registration owner cross-check.

task-2553+49 (§8 / §10 / 9-R.1 — 코드/파일 자동화).

The actual normal/fallback callback cron is registered via the external
``cokacdir --cron`` tool (a cron-direct path that ANU cannot file-patch,
9-R.1). So the owner=ANU-key pin is enforced at the **ANU control layer**,
which IS code-patchable:

  1. ``build_anu_owned_callback_request`` — the dispatch prompt generator /
     4-tuple registration step builds the callback registration request HERE.
     It is **fail-closed**: an owner key equal to the executor self key, or
     not a configured independent ANU key, or a non-ANU collector role, makes
     the request INVALID and NO command argv is produced (회장 §2/§8/§10).
  2. ``verify_post_registration_owner`` — after ``cokacdir --cron`` returns,
     the ANU control layer re-reads the schedule_history / registry owner
     binding and cross-checks key/chat/role. An owner that resolved to the
     executor key (or any non-ANU key) at registration time -> FAIL (회장 §8
     "등록 후 schedule_history/registry 에서 chat_id·key·role binding 교차
     검증").

Standalone, zero-mutation, Layer A / NO-CRON (9-R.1): this module performs
ZERO cron register/remove, ZERO dispatch, ZERO ``subprocess`` / ``cokacdir``
exec. It only *builds a request descriptor* and *validates* an owner binding.
The authorized session executes the (ANU-keyed) cron outside this module.
    )annotations)	dataclassfield)ListOptionalSequence)DEFAULT_ANU_KEYSENFORCER_SCHEMAFAILPASSenforce_callback_owner
is_anu_key)ExecutorSelfKeyForbidden'assert_collector_key_is_independent_anu)ANU_KEYvalidate_callback_registration)DEFAULT_EVENTS_DIRemit_not_registered_markerz+dispatch.normal_fallback_callback_helper.v1normalfallbackc                      e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<    ee      Zded<   edd       Z	ddZ
y)CallbackRequestu  An owner-validated callback registration request descriptor.

    ``argv`` is the (data-only) ``cokacdir --cron`` argument vector an
    authorized session would execute. It is produced ONLY when the owner
    binding is fail-closed valid (owner == an independent ANU key, not the
    executor self key). On FAIL, ``argv`` is None — no registration is
    possible (회장 §2/§8/§10).
    strschemaverdictkindtask_id	owner_keychat_idOptional[str]cron_idOptional[List[str]]argvdictenforcementdefault_factory	List[str]reasonsc                (    | j                   t        k(  S Nr   r   selfs    Y/home/jay/workspace/.worktrees/task-2721-dev1/dispatch/normal_fallback_callback_helper.pyokzCallbackRequest.okc       ||t##    c                $   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  t        | j                        nd | j                  t        | j                        d
S )N
r   r   r   r   r   r   r!   r#   r%   r)   )r   r   r   r   r   r   r!   r#   listr%   r)   r-   s    r/   to_jsonzCallbackRequest.to_jsong   sh    kk||II||||||'+yy'<DO$++DLL)
 	
r2   Nreturnboolr8   r$   )__name__
__module____qualname____doc____annotations__r   r5   r)   propertyr0   r6    r2   r/   r   r   M   s_     KL
ILNL
t4GY4$ $
r2   r   N ANUTcokacdir_cron_directF)
r!   dispatch_cron_idnormal_collector_cron_idfallback_callback_cron_idcollector_roleprompt_claims_anu_collector
entry_pathanu_keysno_fallbackanu_keys_resolvablec                   | t         vr2t        t        t        | ||t	        |      |di d| dt          dg
      S 	 t        |       t        ||||||	|	n| t        k(  r|nd|
|
n| t        k(  r|nd|t	        |      |||||      }|j                  t        k7  rQt        t        |j                  | ||t	        |      |d|j                         dgt        |j                        z   
      S d	d
|d|dt	        |      d|dg
}t        t        t        | ||t	        |      |||j                         dg
      S # t        $ r4}t        t        t        | ||t	        |      |di d| g
      cY d}~S d}~ww xY w)u  Build a fail-closed normal/fallback callback registration request.

    The owner pin is enforced via ``enforce_callback_owner`` BEFORE any argv
    is produced. If the owner is the executor self key / not an independent
    ANU key / collector role != ANU -> verdict FAIL and ``argv=None`` (the
    cron-direct path therefore CANNOT register an executor-owned callback,
    회장 §2/§8/§10). HOLD propagates (§6 conditional escalation).
    Nzunknown callback kind z (expected )r4   u   dispatch_callback_contract.assert_collector_key_is_independent_anu fail-closed — owner_key 가 독립 ANU key (c119085addb0f8b7) 가 아님: )r   executor_keycollector_keycollector_owner_keyrH   rF   rG   rE   r   rI   rJ   rK   rL   rM   ui   owner enforcement did not PASS — no cron-direct registration argv produced (fail-closed, §2/§8/§10).cokacdirz--cron--atz--chatz--keyz--onceu4   owner=independent ANU key — fail-closed gate PASS.)VALID_KINDSr   HELPER_SCHEMAr   r   _dcc_assert_independent_anu_DCC_ExecutorSelfKeyForbiddenr   CALLBACK_KIND_NORMALCALLBACK_KIND_FALLBACKr   r   r6   r5   r)   )r   r   rP   r   r   promptatr!   rE   rF   rG   rH   rI   rJ   rK   rL   rM   _dcc_excenfr#   s                       r/    build_anu_owned_callback_requestr_   v   s   8 ; L-dX[QOP
 	
(
#I.& !!%% (3 %!%99't )4 &!%;;')G$?/-C2 {{d KKLK Ls{{#$
 	
( 	
GD GKKMGH W ) 
 L22:=
 	

s   D5 5	E2>)E-'E2-E2c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<    ee
      Zded<   edd       ZddZ	y)PostRegistrationOwnerCheckr   r   r   r   r9   expected_owner_is_anuobserved_owner_keyobserved_chat_idobserved_roler&   r(   r)   c                (    | j                   t        k(  S r+   r,   r-   s    r/   r0   zPostRegistrationOwnerCheck.ok  r1   r2   c           
         | j                   | j                  | j                  | j                  | j                  | j
                  | j                  t        | j                        dS )Nr   r   r   rb   rc   rd   re   r)   )	r   r   r   rb   rc   rd   re   r5   r)   r-   s    r/   r6   z"PostRegistrationOwnerCheck.to_json  sQ    kk||||%)%?%?"&"9"9 $ 5 5!//DLL)	
 		
r2   Nr7   r:   )
r;   r<   r=   r?   r   r5   r)   r@   r0   r6   rA   r2   r/   ra   ra     sO    KLLt4GY4$ $

r2   ra   )rK   c           
        g }t        ||      }|r||k(  r|j                  d       |s|j                  d|d       t        |      t        |      k7  r|j                  d|d|d       |dk7  r|j                  d|d	       |st        nt        }	|	t        k(  r|j                  d
       t        t        |	| ||t        |      ||      S )u)  회장 §8 — 등록 후 schedule_history/registry owner 교차검증.

    After ``cokacdir --cron`` registers the callback, the ANU control layer
    re-reads the owning schedule's key/chat/role and asserts it is an
    independent ANU binding. An owner that resolved to the executor key (or
    any non-ANU key), a chat mismatch, or a non-ANU role -> FAIL (a
    registered executor-self callback is detected post-hoc and rejected).
    Read-only; the observed values are supplied by the caller from
    schedule_history / the durable registry.
    u   post-registration owner key == executor self key — a cron-direct executor-self callback slipped through and is rejected (§8 post-reg owner cross-check / §2).zpost-registration owner key uA    is not a configured independent ANU key (§8 owner cross-check).zchat_id mismatch: registered=z
 expected=u    (§8 binding cross-check).rC   zregistered collector role=u5    != 'ANU' (§8 owner cross-check / §2 regression 5).ux   post-registration owner binding is an independent ANU key with matching chat_id and ANU role — cross-check PASS (§8).rh   )r   appendr   r   r   ra   rV   )
r   rP   rc   rd   re   expected_chat_idrK   r)   owner_is_anur   s
             r/   verify_post_registration_ownerrm     s   ( G0(;L0L@6	

 *+=*@ AF F	
 $4 55+,<+? @(++FH	
 ((9 :: :	
 "dtG$M	
 &*--.#	 	r2   z/home/jay/workspacei<  z4dispatch.normal_fallback_callback_helper.launcher.v1ANU_OWNED_READYSELF_KEY_FAIL_CLOSEDCALLBACK_PROMPT_TOO_LARGECANONICAL_ROOT_INVALIDOWNER_ENFORCEMENT_FAILEDr   FAIL_CLOSEDCOLLECTOR_ANU%RECOVERY_ONLY_NO_FINAL_REPORT_TRIGGER   10m<   >   r\   sha256r   summaryr   r   report_pathresult_pathcallback_kindcanonical_rootrH   source_attributionnowc          	         ddl }||n|j                   j                         }||j                  t        dt	        |                   z   }|j                  d      S )u"  (now + delay_seconds) → cokacdir-compatible absolute timestamp.

    Returns ``"YYYY-MM-DD HH:MM:SS"`` (local time, naive — matches cokacdir
    server local timezone). ``now`` accepts a ``datetime`` for testability;
    defaults to ``datetime.now()`` (no tz conversion — cokacdir parses server
    local time).

    task-2661 Phase 2b: cokacdir live runtime rejects second-suffix `--at`
    values (e.g. ``"10s"``) — absolute timestamp is the only sub-minute form
    accepted. Fallback (``DEFAULT_AT_FALLBACK="10m"``) is untouched.
    r   N)seconds%Y-%m-%d %H:%M:%S)datetimer   	timedeltamaxintstrftime)delay_secondsr   _dtbasetargets        r/   "build_absolute_at_for_normal_delayr     sP       #S\\5E5E5GDCMM#a]1C*DMEEF??.//r2   c                   | rt        | t              sy| j                         }|syd|v r	d|v rd|v ry|j                         ry|d   j	                         }|dd }|r!|j                  ddd      j                         sy	 t        |      }|d	k(  rt        |      S |d
k(  rt        |dz        S |dk(  rt        |dz        S |dk(  rt        |dz        S y# t        $ r Y yw xY w)uK   cokacdir relative-time string → seconds. Absolute / unparseable → None.N -:.rB      smrx   hi  diQ )	
isinstancer   stripisdigitlowerreplacefloat
ValueErrorr   )r\   r   unitbodyns        r/   parse_at_secondsr     s    ZC(

A
axC1H 	yy{R5;;=DSb6Dt||CQ/779$K s{1vs{1r6{s{1t8}s{1u9~  s   C 	C#"C#r   c                    | rt        | t              syddl}	 |j                  j                  | j	                         t
               y# t        $ r Y yw xY w)z6True iff ``at`` parses as cokacdir absolute timestamp.Fr   NT)r   r   r   strptimer   _ABSOLUTE_AT_PATTERNr   )r\   r   s     r/   is_absolute_atr     sI    ZC(bhhj*>? s   .A 	AAc                   t        |       syddl}||n|j                  j                         }|j                  j                  | j	                         t
              }t        ||z
  j                               S )zHSeconds from ``now`` to absolute ``at``. None if ``at`` is not absolute.Nr   )r   r   r   r   r   r   r   total_seconds)r\   r   r   r   r   s        r/   absolute_at_delay_secondsr     s]    " #S\\5E5E5GD\\""288:/CDF,,.//r2   )reasonthreshold_secondsr   c               b   t        |      rt        ||      }nt        |      }dd|| dd}| t        k7  rd|d<   |S |d|d<   |S t        |      s|d	k  rd
|d<   d|d<   d|d|d<   |S ||k  rd|d<   |S |r t	        |      j                         rd|d<   |S d
|d<   d|d<   d| d| d|d<   |S )u   normal kind + delay>threshold + reason 없음 → warning 발급.

    절대시각 ``at`` 도 (target - now) 로 환산하여 lint 한다.
    fallback kind / threshold 이내 / reason 제공 시 warning=False.
    r   FOKrB   )warningcoder   r   messageSKIP_NON_NORMALr   SKIP_UNPARSEDrx   Tr   %UNSUPPORTED_SUB_MINUTE_RELATIVE_DELAYznormal callback delay z^ (< 60s) must use absolute timestamp (cokacdir live runtime rejects relative sub-minute forms)r   WITHIN_THRESHOLDREASON_PROVIDEDNORMAL_DELAY_REASON_REQUIREDzs > uL   s threshold · reason 누락 (★ task-2661 Phase 2b lint · enforce 아님))r   r   r   rY   r   r   )r   r\   r   r   r   secsouts          r/   lint_normal_callback_delayr     s    b(5#C ##'F
|%F
 "$)I=F$RF +H I 	I 
  (F
#f+##%'F
C	N0CK
 d+<*= >: 	; 	N Jr2   c                >    t        | xs dj                  d            S )u&   callback prompt 의 UTF-8 byte 길이.rB   zutf-8)lenencode)r[   s    r/   callback_prompt_utf8_bytesr     s    "$$W-..r2   c                   | xs dj                         D cg c]#  }|j                         s|j                         % }}|sy|D ]5  }d|vr y|j                  dd      d   j                         }|t        vs5 y yc c}w )u   prompt 가 envelope-only 인가 — 모든 비공백 line 이
    `key=value` 형태이고 key 가 ENVELOPE_ALLOWED_KEYS 에 속하면 True
    (자유 지시문 금지, 회장 §5.6 envelope-only).rB   F=r   r   T)
splitlinesr   splitENVELOPE_ALLOWED_KEYS)r[   lnlineskeys       r/   is_envelope_onlyr     s     $*<R";";"=LBRXXZLEL b=hhsAq!'')++  Ms
   A?A?require_envelopec                  t        |       }t        | xs d      }|t        kD  }t        |       }g }d}d}|r$d}t        }|j                  d| dt         d       |r|sd}|dk(  rd}|j                  d	       |||||||d
S )u   callback prompt 검증: UTF-8 ≤3900 bytes + envelope-only.
    반환 dict: ok, utf8_bytes, chars, too_large, envelope_only, status, reasons.rB   r   TFzcallback prompt z	 bytes > u5    (CALLBACK_PROMPT_TOO_LARGE fail-closed, §5.5/§10).ENVELOPE_VIOLATIONu5   callback prompt 가 envelope-only 가 아님 (§5.6).)r0   
utf8_byteschars	too_largeenvelope_onlystatusr)   )r   r   CALLBACK_PROMPT_MAX_BYTESr    STATUS_CALLBACK_PROMPT_TOO_LARGErj   )	r[   r   utf8r   r   env_onlyr)   r   r0   s	            r/   validate_callback_promptr   '  s     &f-D"E00I'HGF	B1tfI.G-H IC C	
 T>)FNOuW r2   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   dZded<    ee      Zded<   edd       Z	ddZ
y)LaunchDecisionr   r   r   r   r   r   r   r   r~   r9   canonical_root_correctedr"   r#   r$   contract_fieldsNzOptional[dict]requestr&   r(   r)   c                (    | j                   t        k(  S r+   )r   LAUNCH_PASSr-   s    r/   r0   zLaunchDecision.okT  s    ||{**r2   c                x   | j                   | j                  | j                  | j                  | j                  | j
                  t        | j                        | j                  | j                  | j                  t        | j                        nd | j                  | j                  t        | j                        dS )Nr   r   r   r   r   r   r   r~   r   r#   r   r   r)   )r   r   r   r   r   r   r   r   r~   r   r#   r5   r   r   r)   r-   s    r/   r6   zLaunchDecision.to_jsonX  s    kk||kkII||4<<("11(,(E(E'+yy'<DO$#33||DLL)
 	
r2   r7   r:   )r;   r<   r=   r?   r   r   r5   r)   r@   r0   r6   rA   r2   r/   r   r   D  sm    KLK
ILNL""
"G^"t4GY4+ +
r2   r   c           
         t        |       t        | xs d      ||t        t        |      t        |xs d      t        |      t        d	S )u'   회장 §10 callback contract 9 fields.rB   )	r   callback_prompt_charscallback_cron_idcallback_registration_statuscallback_roleenvelope_only_compliancefallback_prompt_utf8_bytesfallback_safety_net_registered'fallback_safety_net_role_single_purpose)r   r   CALLBACK_ROLE_COLLECTOR_ANUr9   FALLBACK_ROLE_SINGLE_PURPOSEcallback_promptr   r!   r   r   fallback_promptfallback_registereds          r/   _contract_fieldsr   j  sO    
 'A&Q!$_%:!;#(.4$($7&@AVTV&W*./B*C3O
 
r2   )r~   r!   rE   rF   rG   r   r   rK   c                2   g }d}|st         }d}|j                  d       nd|t         k7  r[t        || |t        t	        |      |xs dd      }t        t        t        t        | ||t        |      |dd|d|dt         d	g
      S t        ||      }|d   rLt        || |t        |d   |xs dd      }t        t        t        t        | ||t        |      ||d||d   
      S |	xs | d}	|
xs | d}
|xs | d}|| t        k(  r|
n|}t        | |||t        |      ||||	|
||      }| t        k(  xr |j                  }|j                  rt        }t         }|j                  d       nUt        }||k(  rt"        }|j                  d       nt$        }|j                  d       |j'                  |j(                         t        || |||d   |xs d|      }t        t        ||| ||t        |      |||j*                  ||j-                         |      S )uo  단일 callback/fallback 런타임 launcher (회장 §3 launcher 단일화).

    fail-closed 순서: canonical root → prompt byte/envelope → owner enforce
    (build_anu_owned_callback_request 경유). owner==executor self-key 면
    SELF_KEY_FAIL_CLOSED (argv=None). ANU key 만 PASS.
    실 cron 발사/ subprocess 0 — argv(데이터)만 생성한다.
    FTu<   canonical_root 미지정 → /home/jay/workspace 로 교정.rB   r   Nzcanonical_root=z != u    → fail-closed (§5.9).)r   r   r   r   r   r   r   r~   r   r#   r   r)   r   r   r   r)   z
::dispatchz::normalz
::fallback)r   r   rP   r   r   r[   r\   r!   rE   rF   rG   rK   u7   owner=ANU key — launcher PASS, ANU-owned argv 생성.uK   owner_key == executor self key → SELF_KEY_FAIL_CLOSED (argv=None, §5.3).u3   owner enforcement FAIL → fail-closed (argv=None).r   )CANONICAL_ROOTrj   r   STATUS_CANONICAL_ROOT_INVALIDr   r   LAUNCHER_SCHEMALAUNCH_FAIL_CLOSEDr   r   r   rY   r_   rZ   r0   STATUS_ANU_OWNED_READYr   STATUS_SELF_KEY_FAIL_CLOSEDSTATUS_OWNER_ENFORCEMENT_FAILEDextendr)   r#   r6   )r   r   rP   r   r   r[   r\   r~   r!   rE   rF   rG   r   r   rK   r)   root_correctedcfpvreqr   r   r   s                          r/   launch_callbackr   {  ss   2 G N'UV	>	)"w0*62+1ru	N
 ",>0tWW)Er&~&8^<N O0 0 12 	2 
"&;K	LB	+"w3_-+1ru	N
 ",>3$W)Nr2i=B 	B (AgYj+A7OgYh;O 9 Sy
=S/37K/K+1 	 +7S\&R*:!9";C  #99Dcff
vv'PQ$$0FNNhi4FNNPQs{{#	T76)?;Pb/
1B T9c'l%XXr3;;='	S Sr2   z3dispatch.normal_fallback_callback_helper.enforce.v1r   NON_AUTHORITATIVEc                      e Zd ZU ded<   ded<   ded<   ded<   ded<    ee      Zd	ed
<   dZded<    ee      Z	ded<    ee      Z
ded<   edd       ZddZy)EnforceResultr   r   r   r   envelope_pathr    schedule_idr&   z'dict[str, str]'sources_checkedNmarker_pathr(   r)   z'dict[str, object]'evidencec                (    | j                   t        k(  S r+   )r   ENFORCE_PASSr-   s    r/   r0   zEnforceResult.ok  s    |||++r2   c                   | j                   | j                  | j                  | j                  | j                  t        | j                        | j                  t        | j                        t        | j                        d	S )N	r   r   r   r  r  r  r  r)   r  )r   r   r   r  r  r$   r  r  r5   r)   r  r-   s    r/   r6   zEnforceResult.to_json  sb    kk||||!//++#D$8$89++DLL)T]]+

 
	
r2   r7   r:   )r;   r<   r=   r?   r   r$   r  r  r5   r)   r  r@   r0   r6   rA   r2   r/   r   r     sm    KLL(-d(CO%C!%K%t4GY4$)$$?H!?, ,
r2   r   )rP   anu_key
events_direxpected_chair_facing_sidrequire_chair_facing_sid_matchemit_marker_on_failc                   |xs t         }|xs t        }	t        | |||||      }
d}|
j                  so|rmt	        | dj                  |
j                        xs d|
j                   t        |
j                        |t        |
j                        |	      }|j                  }t        t        |
j                  | ||
j                  t        |
j                        |t        |
j                        t        |
j                        	      S )uC  Helper API layer: validator 호출 + FAIL시 marker 발행.

    회장 verbatim 필수 구현 4번: 'actual cokacdir schedule_id 확인 전 callback PASS 금지'
    회장 verbatim 필수 구현 8번: '실패 시 NORMAL_CALLBACK_NOT_REGISTERED marker + HOLD_FOR_CHAIR'

    - Zero subprocess / Zero cokacdir exec (Layer A 원칙 유지)
    - validator 가 envelope/schedule_history/inbound 파일만 read-only 접근
    - FAIL/NON_AUTHORITATIVE 시 marker 자동 발행 (.done.escalated 대체 정책)

    Returns:
        EnforceResult — .ok True iff verdict == PASS
    )r   r  rP   r
  r  r  Nz; z4-source validator verdict=)r   r   r  r  r  r  r	  )_ENFORCE_ANU_KEY_ENFORCE_DEFAULT_EVENTS_DIR'_enforce_validate_callback_registrationr0   #_enforce_emit_not_registered_markerjoinr)   r   r$   r  r  r  r   ENFORCE_SCHEMAr  r5   )r   r  rP   r
  r  r  r  r  _anu_key_events_dirvresr  ems                r/   *assert_normal_callback_actually_registeredr    s    . **H; ;K2#!";'ED "&K77*099T\\*Z0KDLL>.Z !5!56'$--("
 nn#$$T112T\\"dmm$
 
r2   )(rV   r
   rY   rZ   rU   r   r_   ra   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   DEFAULT_AT_NORMAL_DELAY_SECONDSDEFAULT_AT_FALLBACK%NORMAL_DELAY_REASON_THRESHOLD_SECONDSr   r   r   r   r   r  r   r  r  ENFORCE_FAILENFORCE_NON_AUTHORITATIVEmainc                   dd l }dd l}dd l}|j                  d      }|j	                  dd      }|j                  d      }|j                  ddt        t              	       |j                  d
d       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd        |j                  dd        d}|j                  |dd        |j                  dd       |j                  dd d       |j                  d      }|j                  d
d       |j                  dd       |j                  dd       |j                  dd        |j                  d d        |j                  d!d        |j                  d"d       |j                  d#d       |j                  |       }	|	j                  dk(  rt        |	j                  |	j                  |	j                  |	j                  |	j                   |	j"                  |	j$                  |	j&                   $      }
t)        |j+                  |
j-                         d%&             |
j.                  rdS d'S |	j0                  }|)|	j2                  t4        k(  rt7        t8              }nt:        }t=        |	j2                  ||	j>                  (      }|jA                  d)      r/|jB                  jE                  d*|jA                  d+d       d,       tG        |	j2                  |	j                  |	j                  |	jH                  |	jJ                  |	jL                  ||	jN                  |	jP                  |	jR                   -
      }t)        |j+                  |j-                         d%&             |j.                  rdS d'S ).Nr   z(dispatch.normal_fallback_callback_helper)progcmdT)destrequiredlaunchz--kind)r%  choicesz	--task-id)r%  z--executor-keyz--owner-keyz	--chat-idz--promptrT   )defaultz--canonical-rootz	--cron-idr!   )r$  r(  z--no-require-envelope
store_true)actionz--delay-reasonuP   normal callback delay>60s 시 lint warning 억제용 reason (★ enforce 아님))r(  helpenforcez--envelope-pathrB   z	--anu-keyz--events-dirz--expected-chair-facing-sidz --require-chair-facing-sid-matchz--no-marker-on-fail)r   r  rP   r
  r  r  r  r  F)ensure_ascii   )r   r   z[task-2661 lint warning] r   
)
r   r   rP   r   r   r[   r\   r~   r!   r   )*argparsejsonsysArgumentParseradd_subparsers
add_parseradd_argumentsortedrU   
parse_argsr#  r  r   r  rP   r
  r  r  r  no_marker_on_failprintdumpsr6   r0   r\   r   rY   r   r  r  r   delay_reasongetstderrwriter   r   r   r[   r~   r!   no_require_envelope)r#   r0  _json_sysapsublp
_cron_flagepaeresat_valuelintdecs                 r/   r   r   ~  s)   //		 	 &P	 	QB




6C		!BOOHtVK5HOIOOK$O/OO$tO4OOMDO1OOK$O/OOJO. OOFDO)OO&O5&JOOJYO=OO+LOAOO$dk  m 
		"BOOK$O/OO%O5OO$bO1OOKO.OONDO1OO14O@OO6|OLOO),O?
dAuu	9II//II||&'&A&A+,+K+K$%$7$7 7	
 	ekk$,,.uk=>GGq""ttH66))9:YZH*H%affhq~~NDxx	'2(>'?rB	
 VVQYYQ^^++qyyh''222	4C
 
%++ckkm%+
891Ar2   __main__)$r   r   r   r   rP   r   r   r   r   r   r[   r   r\   r   r!   r    rE   r   rF   r    rG   r    rH   r   rI   r9   rJ   r   rK   Sequence[str]rL   r9   rM   r9   r8   r   )r   r   rP   r   rc   r   rd   r   re   r   rk   r   rK   rN  r8   ra   )r   r   r8   r   )r\   r   r8   zOptional[int])r\   r   r8   r9   )
r   r   r\   r   r   r    r   r   r8   r$   )r[   r   r8   r   )r[   r   r8   r9   )r[   r   r   r9   r8   r$   )r   r   r   r   r   r   r   r9   r   r   r   r9   r8   r$   ) r   r   r   r   rP   r   r   r   r   r   r[   r   r\   r   r~   r    r!   r    rE   r    rF   r    rG   r    r   r    r   r9   rK   rN  r8   r   )r   r   r  r   rP   r   r
  r    r  r    r  r    r  r9   r  r9   r8   r   r+   )r#   r"   r8   r   )Pr>   
__future__r   dataclassesr   r   typingr   r   r    dispatch.callback_owner_enforcerr	   r
   r   r   r   r   !anu_v3.dispatch_callback_contractr   rX   r   rW   ,utils.normal_callback_registration_validatorr   r  r   r  "utils.callback_registration_markerr   r  r   r  rV   rY   rZ   	frozensetrU   r   tupler_   ra   rm   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  __all__r   r;   
SystemExitrA   r2   r/   <module>rZ     s  6 # ( + + &
 > # -/EFG %
 %
 %
b ".2/3(,,#$45 $%I
I I 	I
 I I I 	I I I ,I  -I I "&I I  !I" #I$ %I& 'IX 
 
 
F $$45:: : 	:
 : : : :  :D '  H + 4 #>   8 "< " - F  #%  (* % " #   90 	00 		06D + 	 /3 0" !B4
44 	4
 4 
4n/
  GK : "
 "
 "
J$(;>*.374 %)!&*.2/3%)!#$45!gS
gS gS 	gS
 gS gS gS 	gS "gS gS $gS ,gS  -gS #gS gS  !gS" #gSh G/  
 
 
B ! $/3+0 $99 9 	9
 9 9  -9 %)9 9 9x+\AH z
TV
 r2   