
    +jA                        d Z ddlmZ ddlZddlmZmZmZ dZdZ	dZ
dZd	Zdd
ZddddZe	fddZe	e
d	 	 	 	 	 	 	 	 	 ddZe	dd	 	 	 	 	 ddZe	e
dd	 	 	 	 	 	 	 	 	 ddZg dZy)u  dispatch.anu_terminal_relay — task-2730 allowlist-only terminal relay (static).

``agent_relay.required`` 예외 경로(green deterministic closeout 가 아닌 경우)에서만
사용하는 **2-tier terminal relay** surface. 보고(send_report) + ANU relay(relay_to_anu)
**두 함수만** 노출하며, 판단/처리 주경로(merge/PR/dispatch)로는 진입할 수 없다.

static enforcement (Codex #9 / corrected_spec_v2 §7):
  (a) subprocess ``shell=False`` + **고정 argv list** (문자열 passthrough 0).
  (b) 이 모듈은 git / gh / dispatch / merge 모듈을 **import 0** (정적 검사·테스트 보장).
  (c) argv[0] = cokacdir 바이너리 고정 + subcommand 화이트리스트(``--sendfile`` /
      ``--cron`` 만). 그 외 → ValueError raise.
  (d) merge / PR / dispatch 바이너리·subcommand 정적 거부(화이트리스트 외 전부 거부).

★ 이 모듈은 ANU key literal 을 **하드코딩하지 않는다**. relay_to_anu 의 ``--key``
  값은 호출자(권한 있는 ANU 세션)가 sealed key 로 런타임 주입한다. 실 발사는
  주입된 ``runner`` 가 수행 — 기본 runner 는 ``subprocess.run(shell=False)``.
    )annotationsN)CallableListOptionalz/usr/local/bin/cokacdir
693703201230s)
--sendfile--cron)ghgitmergedispatchshbashpythonc                6    t        j                  | dddd      S )uT   고정 argv 를 ``shell=False`` 로 실행. capture_output·check=False (fail-safe).FT)shellcheckcapture_outputtext)
subprocessrun)argvs    2/home/jay/workspace/dispatch/anu_terminal_relay.py_default_runnerr   '   s"    >>     runnerc                  t        | t              rt        |       dk  rt        d      | d   t        k7  rt        d| d   d      | d   t
        vrt        d| d   dt
         d	      d
D ]X  }t        | |         j                         j                         j                  d      }|t        v sEt        d| |   d| d       |xs t        } ||       S )u  고정 argv 를 화이트리스트 검증 후 runner 로 실행.

    검증 (fail-closed):
      - argv[0] == COKACDIR_BINARY (cokacdir 바이너리 고정 — gh/git/merge/dispatch 거부).
      - argv[1] in ALLOWED_SUBCOMMANDS (``--sendfile`` / ``--cron`` 만).
      - argv[0]·argv[1] 위치에 FORBIDDEN_BINARY_TOKENS 정확 일치 시 거부.
    위반 시 ValueError raise — relay 가 주경로(merge/PR/dispatch)로 진입 불가.
       uC   terminal_relay: argv 는 [binary, subcommand, ...] list 여야 함.r   uK   terminal_relay: argv[0] 는 cokacdir 바이너리 고정이어야 함 (got u8   ) — gh/git/merge/dispatch 바이너리 거부(static).   zterminal_relay: subcommand u%    는 화이트리스트 밖 (허용: u2   ) — merge/PR/dispatch subcommand 거부(static).)r   r!   -z2terminal_relay: forbidden binary/subcommand token z at position u    — static reject.)
isinstancelistlen
ValueErrorCOKACDIR_BINARYALLOWED_SUBCOMMANDSstrstriplowerlstripFORBIDDEN_BINARY_TOKENSr   )r   r   postokens       r   _run_fixed_argvr0   3   s    dD!SY]^__Aw/!YZ^_`ZaYd eE E
 	
 Aw)))$q' 5+,,^`
 	

  DI$$&,,.55c:++DT#YM R"e#68  &F$<r   c                <    t         dt        |       dt        |      gS )u7   ``cokacdir --sendfile <file> --chat <id>`` 고정 argv.r	   --chatr'   r)   )	file_pathchat_ids     r   build_send_report_argvr6   U   s    \3y>8S\RRr   )r5   atc               h    t         dt        |       dt        |      dt        |      dt        |      g	S )u   ``cokacdir --cron <prompt> --at <at> --chat <id> --key <ANU>`` 고정 argv.

    ``anu_key`` 는 런타임 주입값(sealed key) — 모듈 literal 0.
    r
   z--atr2   z--keyr3   )promptanu_keyr5   r7   s       r   build_relay_argvr;   Z   s9     	FBGG
 
r   )r5   r   c               4    t        | |      }t        ||      S )u  report 파일을 chat 으로 전송(``cokacdir --sendfile`` 고정 argv).

    화이트리스트 검증 후 runner(기본 subprocess.run shell=False)로 실행. 실 발사는
    권한 있는 ANU 세션이 수행 — 테스트는 fake runner 주입으로 argv 만 검증한다.
    r   )r6   r0   )r4   r5   r   r   s       r   send_reportr=   s   s     ")W5D4//r   )r5   r7   r   c               :    t        | |||      }t        ||      S )u-  terminal relay prompt 를 ANU 로 relay(``cokacdir --cron`` 고정 argv, 예외 경로만).

    ``anu_key`` 는 sealed key 런타임 주입값(모듈 literal 0). 화이트리스트 검증 후
    runner 로 실행. 실 발사는 권한 있는 ANU 세션이 수행한다(self-key 자가발사 0).
    )r:   r5   r7   r   )r;   r0   )r9   r:   r5   r7   r   r   s         r   relay_to_anur?      s!     FGWLD4//r   )	r'   ANU_CHAT_IDDEFAULT_RELAY_ATr(   r-   r6   r;   r=   r?   )r   	List[str])r   rB   r   Optional[Callable])r4   r)   r5   r)   returnrB   )
r9   r)   r:   r)   r5   r)   r7   r)   rD   rB   )r4   r)   r5   r)   r   rC   )
r9   r)   r:   r)   r5   r)   r7   r)   r   rC   )__doc__
__future__r   r   typingr   r   r   r'   r@   rA   r(   r-   r   r0   r6   r;   r=   r?   __all__ r   r   <module>rJ      s  " #  + + ,  / 
 U  FJ D ;F S   	
 	 8 !%	00 0 	0( !%00 0 	0
 	0 0"
r   