
    Ri                        U d Z 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dZ
ded	<   e G d
 d             Z G d d      Zy)uN   engine_v2/cli_runner.py — asyncio.subprocess 기반 멀티엔진 CLI 래퍼.    )annotationsN)	dataclass)
EngineRolegpt-5.1-codex-mini)zgpt-5.2-codexzgpt-5.1-codexzdict[str, str]_CODEX_MODEL_FALLBACKc                  V    e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   d	Zd
ed<   y)	CLIResultu   CLI 실행 결과.strstdoutstderrint
returncoder   engineFboolfallback_used	timed_outN)__name__
__module____qualname____doc____annotations__r   r        ]/home/jay/workspace/.worktrees/task-2117-dev1/services/multimodel-bot/engine_v2/cli_runner.pyr	   r	      s.    KKOM4Itr   r	   c                      e Zd ZdZedddd	 	 	 	 	 	 	 	 	 dd       Zeddd	 	 	 	 	 	 	 dd	       Zedd
dd	 	 	 	 	 	 	 	 	 dd       Zeddd       Zeddd	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	y)	CLIRunneru   멀티엔진 CLI 래퍼.<   sonnetF)timeoutmodelcode_analysisc                  K   ddddd|g}|r|j                  ddg       |rdnd	}t        t        j                        }|j	                  d
d       t
        j                  || |d||       d{   S 7 w)u   Claude CLI 호출.z/home/jay/.local/bin/claudez-p--output-formattextz--modelz--allowedToolszRead,Grep,Glob/home/jay/workspace/tmp
CLAUDECODENclaude)cmdpromptr   r   cwdenv)extenddictosenvironpopr   _exec)r*   r   r    r!   r)   r+   r,   s          r   
run_claudezCLIRunner.run_claude!   s      *
 JJ(*:;<'4#&2::d#__ % 
 
 	
 
s   A-A6/A40A6r   )r   r    c                  K   t         j                  ||      }||k7  }ddddd| ddg}t        j                  || |dd	       d
{   }||_        |S 7 w)u7   Codex CLI 호출. free plan 제한 시 fallback 적용.codexexecz--skip-git-repo-checkz-czmodel=""-r%   r)   r*   r   r   r+   N)r   getr   r2   r   )r*   r   r    actual_modelr   r)   results          r   	run_codexzCLIRunner.run_codexB   s      -00>$- #l^1%
 !% ' 
 
  -
s   AAAAzgemini-2.5-pror$   )r   r    output_formatc               `   K   dd|d|g}t         j                  || |dd       d{   S 7 w)u   Gemini CLI 호출.geminiz-mr#   r%   r9   N)r   r2   )r*   r   r    r>   r)   s        r   
run_geminizCLIRunner.run_gemini`   sO      
 __% % 
 
 	
 
s   %.,.c                  K   	 t        j                  ddt         j                  j                  t         j                  j                         d{   }t        j                  |j                         d       d{   \  }}|j                         j                         }t        j                  d|      }|sy|j                  d	      j                  d
      D cg c]  }t        |       }}| j                  d
      D cg c]  }t        |       }}||k\  S 7 7 c c}w c c}w # t        t         j                  f$ r Y yw xY ww)u8   Gemini CLI 버전 체크. min_version 이상이면 True.r@   z	--version)r   r   N
   r   z(\d+\.\d+\.\d+)F   .)asynciocreate_subprocess_exec
subprocessPIPEwait_forcommunicatedecodestripresearchgroupsplitr   FileNotFoundErrorTimeoutError)	min_versionprocr   _version_strmatchxparts	min_partss	            r   check_gemini_versionzCLIRunner.check_gemini_versiony   s    	 77))..))..	 D &..t/?/?/A2NNIFA --///1KII0+>E%*[[^%9%9#%>?SV?E?)4):):3)?@AQ@I@I%% O
 @@!7#7#78 		sw   EAD, D,D, =D >=D, ;E<"D, D"0D, D'D, ED,  D, "
D, ,EEEEr&   N)r+   r,   c           	     :  K   	 t        j                  | t         j                  j                  t         j                  j                  t         j                  j                  ||d d{   }	 t        j                  |j                  |j                  d            |       d{   \  }}t        |j                  dd      j                         |j                  dd      |j                  xs d|      S 7 7 V# t         j                  $ r8 	 |j                          n# t        $ r Y nw xY wt        dd| dd	|d
      cY S w xY w# t        $ r t        d| d    dd	|      cY S t        $ r"}	t        dt!        |	      d	|      cY d}	~	S d}	~	ww xY ww)u   공통 subprocess 실행.)stdinr   r   r+   r,   Nzutf-8)inputrD    zTimeout after sT)r   r   r   r   r   replace)errorsr   )r   r   r   r   z not found in PATH)rG   rH   rI   rJ   rK   rL   encoderT   killProcessLookupErrorr	   rM   rN   r   rS   	Exceptionr
   )
r)   r*   r   r   r+   r,   rV   stdout_bytesstderr_byteses
             r   r2   zCLIRunner._exec   s    .	 77((--))..)).. D3:3C3C$$6==+A$B#4 .*l" #**79*EKKM#**79*E??/a	 5. '' IIK)  +G9A6!!" & ! 	a&!34	   	1v	 	s   FA$E (C<)E .9D  'C>(D  /AE ;F<E >D   ED%$E%	D1.E0D11EE 	F
EE F,F.F6FFFFF)
r*   r
   r   r   r    r
   r!   r   returnr	   )r*   r
   r   r   r    r
   rm   r	   )
r*   r
   r   r   r    r
   r>   r
   rm   r	   )z0.31.0)rU   r
   rm   r   )r)   z	list[str]r*   r
   r   r   r   r   r+   r
   r,   zdict[str, str] | Nonerm   r	   )
r   r   r   r   staticmethodr3   r=   rA   r]   r2   r   r   r   r   r      sX   " #

 
 	

 
 

 
@  )	  	
 
 :  %#

 
 	

 
 

 
0  (  %)88 8 	8
 8 8 #8 
8 8r   r   )r   
__future__r   rG   r/   rO   dataclassesr   engine_v2.engine_resultr   r   r   r	   r   r   r   r   <module>rr      sV    T "  	 	 ! . *)) ~    i ir   