
    vSiU$                         S r SSKJrJrJrJr  SSKrSSKrSSKrSSK	r	SSK
JrJr  SSKJr  \" S\5      rS rSS	 jr\R'                  S
S/S9\S 5       5       r\R'                  SS/S9\S 5       5       rg)uq   
实时状态模块 - 合并了 status.py 和 sse.py
提供生成状态的轮询和 SSE 流式推送两种方式
    )	BlueprintjsonifyResponsestream_with_contextN   )generation_statusget_step_description)login_requiredgenerate_realtimec                 p   / nU (       a$  [         R                  R                  U 5      (       d  U$ U R                  SS5      n[         R                  R                  U5      (       a  UOU nXC:X  a  SnXQ;  a  SX'   OSnXQ;  a  SX'    [	        USSS9 nUR                  X   5        UR                  5       nU(       a1  UR                  5       R                  S	5      nUR                  5       X'   S
S
S
5        U$ ! , (       d  f       U$ = f! [         a!  n[        S[        U5       3SS9   S
nAU$ S
nAff = f)u   读取新日志的通用方法

Args:
    log_file: 日志文件路径
    log_state: 日志状态字典，包含 position 和 position_readable

Returns:
    list: 新日志行列表
z.txtz_readable.txtposition_readabler   positionrzutf-8)encoding
Nu   读取日志文件失败: Tflush)ospathexistsreplaceopenseekreadstripsplittell	Exceptionprintstr)	log_file	log_statenew_logsreadable_log_fileactual_log_fileposition_keyfnew_contentes	            G   /Users/yu22x/Desktop/ddd_副本123/ctf/app/routes/generator/realtime.pyread_new_logsr+      s%    H277>>(33 !((A+-77>>:K+L+L'RZO +*(&'I#!(&'I#A/39QFF9*+&&(K&,,.44T:*+&&(	' : O :9 O  A*3q6(34@OAs7   D
 AC8.D
 8
DD
 D
 

D5D00D5c           
         [         R                  " SS5      (       d1  SSS[         R                  " S0 5      [         R                  " S5      S.$ [         R                  " S	S5      nSnUS:  a'  [         R                  " S0 5      R                  US5      nU[         R                  " S
S5      [         R                  " SS5      U[         R                  " S0 5      [         R                  " S5      [         R                  " SS5      [         R                  " S5      S.nU (       a/  Ub,  [         R                  " S5      n[        XQ5      nU(       a  XdS'   [         R                  " SS5      (       a2  [         R                  " S5      US'   [         R                  " S5      US'   0 n[         R                  " S0 5      nU(       a$  UR                  5        H  n	[	        U	5      Xy'   M     XtS'   U$ )u   构建状态响应数据

Args:
    include_logs: 是否包含日志
    log_state: 日志状态字典（用于追踪读取位置）

Returns:
    dict: 状态响应数据
generation_startedFwaitingu   等待开始生成...r   step_statuseskey_info)statusmessageprogressr/   r0   current_stepr2   u   生成中...r3   	completederror)r1   r2   r3   r4   r/   r0   r5   r6   r!   r#   redirect_urlchallenge_idstep_descriptions)r   getr+   keysr	   )
include_logsr"   r4   current_statusresponse_datar!   r#   r9   r/   steps
             r*   build_status_responser@   ;   s      !5u==..22?BG)--j9
 	
 %((;LNa*..CGGV_` !$((NC%))*a8$*..C%))*5&**;>"&&w/	M 	-$((4 5(0*% [%00(9(=(=n(Mn%(9(=(=n(Mn% %))/2>M!&&(D&:4&@# )):%&    z/statusGET)methodsc                      [        S5        [        R                  " SS5      [        R                  " SS5      S.n [        SU S9nU R                  SS5      [        S'   U R                  S	S5      [        S'   UR                  S
5      nU(       a  [        SU 3SS9  O
[        SSS9  [	        U5      $ ! [
         aI  nS[        U5       3n[        U5        [        R                  " 5         [	        SUSS.5      S4s SnA$ SnAff = f)u$   获取生成状态（轮询方式）u   获取生成状态log_positionr   log_position_readable)r   r   T)r<   r"   r   r   r0   u   📤 返回 key_info: r   u   📤 key_info 为空u   获取生成状态失败: r6   )r1   r2   r3   i  N)	r   r   r:   r@   r   r   r    	traceback	print_exc)r"   r>   r0   r)   	error_msgs        r*   get_generation_statusrJ   z   s    "# *--na@!2!6!67NPQ!R
	
 .49U -6MM*a,H.)5>]]CVXY5Z12 !$$Z0*8*5TB(6}%% 0Q9	i 
  	 		s   B0B3 3
D=>D;DDz/streamc                  F    S n [        [        U " 5       5      SSSSS.S9nU$ )u2   使用 Server-Sent Events 流式推送生成状态c            	   3     #    Sn SnSnSnSS0nS[         R                  " SSS	.5       S
3v     [        R                  " SS5      n[        R                  " SS5      n[        R                  " SS5      n[        R                  " S5      n[        R                  " SS5      n	[        R                  " S5      n
[        R                  " S5      n[	        X5      nXP:g  =(       d/    Xa:g  =(       d$    Xr:g  =(       d    X:g  =(       d    [        U5      S:  nU(       a  SUUU[        R                  " S0 5      UU	U
S.nU(       a  XS'   U	(       a2  [        R                  " S5      US'   [        R                  " S5      US'   S[         R                  " USS9 S
3v   Un UnUnUnU	(       d  U
(       a   S[         R                  " SSS	.5       S
3v   g[        R                  " S5        GM  ! [         a    [        S5         g[         aI  n[        S[        U5       35        S[         R                  " S[        U5      S	.5       S
3v    SnAgSnAff = f7f)u*   生成器函数，持续推送状态更新 Nr   r   zdata: 	connectedu   已连接到状态流)typer2   z

r3   r4   r2   r0   r5   Fr6   r!   status_updater/   )rP   r3   r4   r2   r/   r0   r5   r6   r#   r7   r8   )ensure_asciidoneu   生成流程结束r   u   客户端断开SSE连接u   SSE流错误: )jsondumpsr   r:   r+   lentimesleepGeneratorExitr   r   r    )last_progress	last_steplast_messagelast_key_infor"   current_progressr4   current_messagecurrent_key_infor5   r6   r!   r#   
has_changestatus_datar)   s                   r*   generatestream_status.<locals>.generate   sU    	O	 tzz;CZ"[\]]abbC#4#8#8Q#G 044^QG"3"7"7	2"F#4#8#8#D -11+uE	)--g6 -00<(= %5 & -&#3& %5& MA%   !0$4(4#2):)>)>PR)S$4%.!&	#K  2:J/ !6G6K6KN6[N36G6K6KN6[N3 #4::k#N"OtTT %5M ,I#2L$4M !E &tzz6Nb2c'd&eeijj 

1y | ! 01 s1vh/0tzz7s1v*NOPPTUUsG   -IFG( IG( %I(I=I?	I?IIIIztext/event-streamzno-cachenoz
keep-alive)zCache-ControlzX-Accel-Buffering
Connection)mimetypeheaders)r   r   )rc   responses     r*   stream_statusrj      s7    
Od HJ'$'!%&
H OrA   )TN)__doc__flaskr   r   r   r   rT   rW   r   rG   utilsr   r	   app.services.decoratorsr
   __name__bp_realtimer+   r@   routerJ   rj    rA   r*   <module>rs      s   
 D C   	  : 2+X6'T<~ 9ug."  /"J 9ug._  /_rA   