
    i              
         d dl mZ ddlmZ ddlmZ ddlmZ  e	            
                     ee                      e	            
                     ee                      e	            
                     ee                     dzdZd{dZd{dZg dZd|dZd}dZd~dZddZdddZddZddZddd Zddd(Zd|d)Zdd,Zdd.Zdd4Zdd6Zdd8Zddd<Zdd=Z 	 	 dddDZ!ddGZ"ddHZ#ddJZ$ddLZ%ddMZ&	 dddNZ'dddOZ(	 dddQZ)dddTZ*dddXZ+ddZZ,dd]Z-ddd_Z.dd`Z/ddaZ0ddbZ1ddcZ2ddeZ3dddgZ4ddkZ5ddlZ6d?e7e8fddoZ9ddqZ:e;drk    rk e9            Z< e=e>?                    e<@                    ds          e<@                    dt          e<@                    dui           dvdwdxy                     d?S d?S )    )annotations   )	bootstrap)	editorial)sourcespathPathpayloadAnyreturnNonec                    | j                             dd           |                     t                              |dd          d           d S )NT)parentsexist_okF   ensure_asciiindentzutf-8)encoding)parentmkdir
write_textjsondumps)r   r
   s     %/app/scripts/x_intel/feedback_feed.py
write_jsonr      sL    KdT222OODJJwU1JEEPWOXXXXX    c                 $    t                      dz  S )Nzx_intel_manual_picks.jsondata_dir r   r   manual_picks_pathr"      s    ::333r   c                 $    t                      dz  S )Nzx_intel_feedback.jsonr   r!   r   r   feedback_pathr$      s    ::///r   )u}   只有明確有參與行為、時間、地點、直播、報名或 join/register 等訊號，才把 card_type 判成 event。u   只提到 SBT 門檻、快照、積分線、claim 條件時，不要只因為有日期就判成活動；這類內容通常應放入 sbt 與 alpha/topic label。u   同一篇內容可以同時有多個 topic_labels；例如活動獎勵包含 SBT 時，要同時標 events 與 sbt，但不同區塊摘要重點不同。u{   官方來源與社群轉述重複時，優先保留官方來源；社群版本只在提供額外攻略或經驗時保留。u   寶可夢相關分區主要收市場、開箱、實體卡與二級市場觀察；純官方 Renaiss 活動不要只因為出現 TCG 或卡包就放入 pokemon。dict[str, Any]c                    t          t                      i           } t          | t                    si i i dS |                     d          }t          |t                    si }|                     d          }t          |t                    si }|                     d          }t          |t                    si }||||                     d          dS )N)itemsrulessource_profilesr'   r(   r)   
updated_at)r'   r(   r)   r*   )	read_jsonr$   
isinstancedictget)rawr'   r(   r)   s       r   read_feedback_stater0   #   s    
MOOR
(
(Cc4   AbR@@@GGGEeT"" GGGEeT"" gg/00Oot,, U^a^e^efr^s^stttr   statec                ,   t                               t          j                                                  |                     di           |                     di           |                     di           d}t          t                      |           d S )Nr'   r(   r)   )r*   r'   r(   r)   )datetimenowtimezoneutc	isoformatr.   r   r$   )r1   r
   s     r   write_feedback_stater8   3   s{    ll8<00::<<7B''7B'' 99%6;;	 G }(((((r   labelstrc                    t          | pd                                                                          }|dk    rdS |t          v rdS |t          v rdS dS )N exclude	card_typetopic_label)r:   striplowerALLOWED_CARD_TYPESALLOWED_TOPIC_LABELS)r9   rows     r   _feedback_label_kindrE   =   sb    
ekr


 
 
"
"
(
(
*
*C
iy
   {
"""}2r   tweet_idc                   t          | pd                                          }|si S t          t                      dz  i           }t	          |t
                    r|                    d          ng }t	          |t                    si S |D ]c}t	          |t
                    st          |                    d          pd                                          |k    rt          |          c S di S )Nr<   x_intel_feed.jsoncardsid)r:   r@   r+   r    r,   r-   r.   list)rF   tidr
   rI   items        r   _read_current_feed_cardrN   H   s    
hn"


#
#
%
%C 	

%88"==G$.w$=$=EGKK   2EeT"" 	  $%% 	txx~~#$$**,,33:: 4Ir   r<   reasonaccountc           	        t          |pd          }t                              dd|                                                                          d d         }t          |pd                                                                          }t                              dd|  d| d|           d d         pt          |           S )Nr<   \s+ x   z[^a-z0-9_\u4e00-\u9fff-]+_   )
clean_textresubr@   rA   r:   )r9   rO   rP   bodyaccs        r   _feedback_rule_keyr\   X   s    fl##D66&#t$$**,,2244TcT:D
gm


"
"
$
$
*
*
,
,C66.5L5L5L5Ld5L5LMMdsdSaWZ[`WaWaar   snapshotc                
   t                      }|sdddS t          |          }| t          |                    d          pd          t	          t          |                    d          pd                    dd         t	          t          |                    d	          p|                    d
          pd                    dd         t          |                    d          pd          t          |                    d                    t          |                    d          t                    r|                    d          ni t	          t          |                    d          pd                    dd         d}d| d| dt	          |          dd          dt          	                    |d           d	}	 t          ||          }t          |          pi }	n1# t          $ r$}
dt          |
          dd         dcY d}
~
S d}
~
ww xY wt          |	                    d          pd                                                                          }t	          t          |	                    d          pd                    }t          |	                    d          p|                                                                          }t          |	                    d          p|                                                                          }|dk    s|r	|t          vr<dt	          t          |	                    d          pd                     dd         dS |d!vrt          |          }d|dd"         t	          t          |	                    d#          pd                    dd$         t	          t          |	                    d          pd                    dd         ||d%S )&zTurn one raw admin correction into a reusable memory rule.

    The raw reason is kept for audit, but future classification should receive
    only this distilled rule so the model learns the concept, not the wording.
    pendingzmissing minimax key)statuserrorrP   r<   titleN   summaryglance  r>   topic_labelsevent_factsraw_texti  )rJ   rP   rb   rd   card_type_beforetopic_labels_beforerh   ri   u{  你是 Renaiss 情報站的分類記憶整理器。你的任務不是照抄管理員原因，而是理解這次修正背後的可重用分類規則。

請根據「原始貼文內容、原本分類、管理員修正原因」萃取一條短規則，讓下次遇到類似貼文時可以自動判斷。
要求：
1. 不要逐字照抄管理員原因。
2. 規則要可泛化，描述什麼類型內容應該或不應該放到哪個分類。
3. 如果是 exclude，請寫清楚未來應避開哪一類誤判。
4. 如果資訊不足，status 回 pending，不要硬編規則。
5. 只輸出 JSON，不要 markdown。

目標修正：label=z, label_kind=u   
管理員原因：iX  u   
貼文資料 JSON：Fr   uz  

輸出格式：
{
  "status": "ready" 或 "pending",
  "rule": "一條繁中規則，60 字以內",
  "scope": "適用範圍，30 字以內",
  "rationale": "你如何理解這次修正，80 字以內",
  "target_label": "event/feature/announcement/market/report/insight/events/official/sbt/pokemon/alpha/tools/other/exclude",
  "label_kind": "card_type/topic_label/exclude"
}r`   ruletarget_label
label_kindready	rationalez AI did not produce a usable rule>   r=   r>   r?   rV   scoperT   )r`   rm   rr   rq   r9   ro   )resolve_minimax_keyrE   r:   r.   rW   normalize_topic_labelsr,   r-   r   r   minimax_chatparse_json_block	Exceptionr@   rA   ALLOWED_FEEDBACK_LABELS)rF   r9   rO   r]   api_keykindsource_payloadpromptr/   parsedra   r`   rm   rn   ro   s                  r   _distill_feedback_ruler~   _   s    "##G E#.CDDD&&Dx||I..4"55CW 5 5 ;<<==dsdCc(,,y"9"9"YX\\(=S=S"YWYZZ[[\`]`\`a[ 9 9 ?R@@5hll>6R6RSS6@mA\A\^b6c6ckx||M222iks8<<
#;#;#ArBBCCETEJ	 	N	 !&	 	 59	 	 (//5	 	  $zz.uzMM	 	 	 0@67++!#&&," @ @ @#c%jj#.>????????@ H%%+,,2244::<<Fc&**V,,23344Dvzz.11:U;;AACCIIKKLVZZ--566<<>>DDFFJ<S(S(SFJJ{$;$;$a?a b bccdhehdhi
 
 	
 @@@),77
TcT
C

7 3 3 9r::;;DSDAFJJ{$;$;$Ar B BCCDSDI   s   
!G, ,
H6HHHc               x
   |                      d          }t          |t                    si }|| d<   |                      d          }t          |t                    si }|| d<   t          |                     d          pd                                          }t          |          }t          |pd          }	t          t          |                     d          p|                     d          pd                    d d         }
|	rt          ||	|          nd	d
i}|                     d	          dk    r%t          |                     d          p|                                                                          }t          |                     d          p|                                                                          }t          t          |                     d          pd                    }t          |||          }t          |                     |          t                    r|                     |i           ni }d |                     d          pg D             }r|vrg|d d         }|||d d         t          t          |                     d          pd                    d d         t          t          |                     d          pd                    d d         ||t          |                     dd          pd          dz   t                              t          j                                                  d	||<   |rt          |                     |          t                    r|                     |i           ni }t          |                     d          t                    r|                     d          ni }t          |                     |d          pd          dz   ||<   t          |                     d          t                     r|                     d          ng }||t          |                     d	          pd
          t          t          |                     d          pd                    d d         |
t                              t          j                                                  d}|gfd|D             d d         }|||t                              t          j                                                  d||<   |S ) Nr(   r)   rP   r<   rb   re   rT   rF   r9   rO   r]   r`   r_   rp   r9   ro   rm   c                n    g | ]2}t          |                                          #t          |          3S r!   r:   r@   .0xs     r   
<listcomp>z+_update_feedback_memory.<locals>.<listcomp>   s1    SSSqCFFLLNNSCFFSSSr   examples   h  rr      rq      countr   r   )	r9   ro   rm   rr   rq   rP   r   r   r*   label_counts)rJ   r9   ro   memory_statusmemory_rulerb   r*   c                    g | ]A}t          |t                    t          |                    d           pd          k    ?|BS )rJ   r<   )r,   r-   r:   r.   )r   r   rF   s     r   r   z+_update_feedback_memory.<locals>.<listcomp>   sQ    ooo1Jq$4G4GoCPQPUPUVZP[P[Pa_aLbLbfnLnLnQLnLnLnr   
   )rP   r   r   r*   )r.   r,   r-   r:   r@   rE   rW   r~   rA   r\   intr3   r4   r5   r6   r7   rK   )r1   rF   r9   rO   r]   r(   profilesrP   rz   reason_textrb   	distilled
rule_label	rule_kind	rule_textkeyprevr   profiler   entrys    `                   r   _update_feedback_memoryr      s    IIgEeT"" gyy*++Hh%% ,#+ (,,y))/R006688G&&DV\r**Ks8<<00PHLL4J4JPbQQRRSWTWSWXEq|  X&kdlmmmm  DL  NW  CXI}}X'))w//8599??AAGGII
	l33;t<<BBDDJJLL	s9==#8#8#>B??@@	 Y@@%/		#%E%EMuyyb!!!2SSTXXj%9%9%?RSSS 	100 ,8,RaR0H#dsdOIMM'$:$:$@b A ABB4C4H#C	k(B(B(Hb$I$IJJ4C4P '1--233a7",,x|44>>@@

 

c
  
/9(,,w:O:OQU/V/V^(,,w+++\^6@^A\A\^b6c6ckw{{>222ik!,"2"25!"<"<"ABBQFU.8Z9P9PRV.W.W_7;;z***]_ x!8!8!EIFF%c)--*?*?*E2&F&FGGM",,x|44>>@@
 
 pooooooopqtrtqtu( ",,x|44>>@@	
 
 r   c                   t          | pd                                          }t          |pd                                                                          }t          |pd          }|st	          d          |t
          vrt	          d          t                      }|                    di           }t          |                    |          t                    r|                    |i           ni }t          |                    dd          pd          dz   }	t          |          }
t          |          }|||d d         |	t          |
                    d	          pd          t          t          |
                    d
          p|
                    d          pd                    d d         t          |
                    d          pd          t          |
                    d                    t          |
                    d          pd          t                              t           j                                                  d
||<   ||d<   t'          |||||
          }t          |                    d          pd          ||         d<   |                    d          dk    rt          t          |                    d          pd                    d d         ||         d<   t          t          |                    d          pd                    d d         ||         d<   t          t          |                    d          pd                    d d         ||         d<   nBt          t          |                    d          pd                    d d         ||         d <   t)          |           |||||                             d          ||                             dd          |	d!S )"Nr<   tweet id is requiredzinvalid labelr'   r   r   r   rf   rP   rb   re   rV   r>   rg   url)
r9   ro   
raw_reasonr   source_accountsource_titlesource_card_typesource_topic_labels
source_urlr*   r   r`   r_   r   rp   rm   rc   r   rr      memory_scoperq   i  memory_rationalera   memory_error)rJ   r9   ro   r   r   r   )r:   r@   rA   rW   
ValueErrorrx   r0   r.   r,   r-   r   rN   rE   rt   r3   r4   r5   r6   r7   r   r8   )rF   r9   rO   rL   fb_label	fb_reasonr1   r'   r   r   r]   ro   r   s                r   add_classification_feedbackr      s   
hn"


#
#
%
%C5;B%%''--//H6<R((I 1/000...)))!!EIIgr""E!+EIIcNND!A!AI599S"rD!$$)**Q.E&s++H%h//J ohll955;<<"3x||G'<'<'\X@V@V'\Z\#]#]^^_c`c_cd[ 9 9 ?R@@5hll>6R6RSS(,,u--344ll8<00::<< E#J E'N'8T]hpqqqI"%immH&=&=&J"K"KE#J}}X'))$.s9==3H3H3NB/O/O$P$PQURUQU$Vc
=!%/IMM'4J4J4Pb0Q0Q%R%RSWTWSW%Xc
>")3C	k8R8R8XVX4Y4Y)Z)Z[_\_[_)`c
%&&%/IMM'4J4J4Pb0Q0Q%R%RSWTWSW%Xc
>" s88Sz~~mR88  r   r   r      	max_itemsr   	max_rulesmax_profilesc                   t                      }|                    di           }|                    di           }|                    di           }g }|                    d           t          D ]}|                    d|            t	          |t
                    r|rd |                                D             }	|	                    d d	           |                    d
           |	d |         D ]/}
t          t          |
                    d          pd                    d d         }t          |
                    d          pd          
                                }t          |
                    d          pd          
                                }t          |
                    dd          pd          }d                    d |
                    d          pg d d         D                       }|r$|                    d| d| d| d| d| 
           1t	          |t
                    r9|r6d |                                D             }|                    d d	           |                    d           |d |         D ]}t          |                    d          pd          
                                }t	          |                    d          t
                    r|                    d          ni }d                    d  t          |                                d! d	          d d"         D                       }|r|r|                    d#| d$|            t	          |t
                    rP|rMg }|                                D ]\  }}t	          |t
                    st          |                    d          pd          
                                                                }|t           vrm|                    ||f           |                    d% d	           |                    d&           |d |          D ]y\  }}t          t          |                    d'          pd                    d d(         }t          |                    d)          pd*          
                                }t          |                    d          pd          }t          |                    d          pt#          |                    }t          |                    d+          pd          }t          t          |                    d,          pd                    d d-         }|r)|                    d.| d/| d| d0| d1| d2|            R|                    d.| d/| d| d0| d1| d3|            {d4                    d5 |D                       S )6Nr'   r(   r)   u   [固定分類記憶]z- c                <    g | ]}t          |t                    |S r!   r,   r-   r   s     r   r   z*feedback_training_text.<locals>.<listcomp>-  s'    IIIaZ45H5HIIIIr   c                    t          |                     dd          pd          t          |                     d          pd          fS )Nr   r   r*   r<   )r   r.   r:   rD   s    r   <lambda>z(feedback_training_text.<locals>.<lambda>.  sA    3swww/B/B/Ga+H+H#cggVbNcNcNigiJjJj*k r   Tr   reverseu   [人工回饋歸納規則]rm   r<   rV   r9   ro   r   r   ,c                n    g | ]2}t          |                                          #t          |          3S r!   r   r   s     r   r   z*feedback_training_text.<locals>.<listcomp>5  s9     c c cATWXYTZTZT`T`TbTb cQ c c cr   r      z target=:z; seen=z; examples=c                <    g | ]}t          |t                    |S r!   r   r   s     r   r   z*feedback_training_text.<locals>.<listcomp>:  s'    OOO:a;N;NO1OOOr   c                J    t          |                     d          pd          S )Nr*   r<   r:   r.   r   s    r   r   z(feedback_training_text.<locals>.<lambda>;  s    S1F1F1L"-M-M r   u   [來源輪廓記憶]rP   r   z, c                "    g | ]\  }}| d | S )r   r!   )r   kvs      r   r   z*feedback_training_text.<locals>.<listcomp>@  s8      $E  $E  $E41aqJJ1JJ  $E  $E  $Er   c                0    t          | d         pd          S )Nr   r   )r   kvs    r   r   z(feedback_training_text.<locals>.<lambda>@  s    adeghiejeonoapap r      z- @z: user_feedback_labels=c                V    t          | d                             d          pd          S )Nr   r*   r<   r   r   s    r   r   z(feedback_training_text.<locals>.<lambda>M  s#    3r!uyy'>'>'D"#E#E r   u   [近期人工修正樣本]r   rT   r   r_   r   r   P   z- id=z	: target=z; from=z; title=z
; learned=z; memory_status=
c                T    g | ]%}t          |                                          #|&S r!   r   r   s     r   r   z*feedback_training_text.<locals>.<listcomp>[  s+    <<<ASVV\\^^<a<<<r   )r0   r.   appendDEFAULT_MEMORY_RULESr,   r-   valuessortrW   r:   r@   r   joinsortedr'   rA   rx   rE   )r   r   r   r1   r'   r(   r   sectionsrm   ranked_rulesrD   r9   rz   r   r   ranked_profilesr   rP   counts
count_textrankedrL   infor   r   source_typer   s                              r   feedback_training_textr   !  s   !!EIIgr""EIIgr""Eyy*B//HHOO*+++$ % %T$$$$% f5 fII5<<>>IIIkkuyzzz4555

+ 	f 	fCc#''&//"7R8899$3$?D((.B//5577Esww|,,23399;;D++0q11Exx c c#''*2E2E2KRaR1P c c cddH f dT d d4 d d% d d d dZb d deee(D!! 	Th 	TOOhoo&7&7OOO!M!MW[\\\.///&}}5 	T 	TG'++i006B77==??G4>w{{>?Z?Z\`4a4aiW[[000giF  $E  $E6&,,..VpVpz~;;;  AC  BC  AC  <D  $E  $E  $E  F  FJ T: T Rg R Rj R RSSS% O5 O35 	' 	'ICdD)) ))/R006688>>@@E333MM3+&&&&EEtTTT4555

+ 
	O 
	OIC$S-)@)@)FB%G%GHH#NK 9 9 FYGGMMOOM))/R00Etxx--L1Ee1L1LMMDdhh'9::@bAAK%c$((>*B*B*Hb&I&IJJ3B3OL O  !F  !F  !Fd  !F  !FU  !F  !F;  !F  !F`l  !F  !F  yD  !F  !F  G  G  G  G  !N  !N  !Nd  !N  !NU  !N  !N;  !N  !N`l  !N  !N  L  !N  !N  O  O  O  O99<<<<<===r   c            	     ^   t                      } t          |                     d          t                    r|                     d          ni }t          |                     d          t                    r|                     d          ni }t          |                     d          t                    r|                     d          ni }t	          |          t	          |          t	          |          t	          t
                    t          |                     d          pd          dS )Nr'   r(   r)   r*   r<   )feedback_itemsr(   r)   default_rulesr*   )r0   r,   r.   r-   lenr   r:   )r1   r'   r(   r   s       r   feedback_memory_statsr   ^  s    !!E",UYYw-?-?"F"FNEIIgBE",UYYw-?-?"F"FNEIIgBE/9%))DU:V:VX\/]/]euyy*+++ceHe**Ux==122%))L117R88  r   rI   list[StoryCard]c                b   t                      }|                    di           }t                      }d}t          |t                    sd|dS | D ]}|                    |j                  }t          |t                    s3t          |                    d          pd                                                                          }|dk    r |	                    |j                   |dz  }|t          v r|j        |k    r|dz  }||_        t          |          \  |_        }|j        s|d d          |_        d|j        vr |j        d d	         dgz   d d
         |_        t          dt!          |j        pd                    |_        B|t$          v rt'          g |j        pg |          }	|t'          |j                  vr|dz  }|	|_        d|j        vr |j        d d	         dgz   d d
         |_        t          dt!          |j        pd                    |_        ||dS )Nr'   r   )override_countexcluded_idsr9   r<   r=   r   u   回饋r   r   g=
ףp=?        )r0   r.   setr,   r-   rJ   r:   r@   rA   addrB   r>   default_style_for_typelayouttagsmaxfloat
confidencerC   rt   rg   )
rI   r1   r'   r   r   cardr   r9   default_tagslabelss
             r   apply_feedback_overridesr   l  sF   !!EIIgr""E UULNeT"" C"#\BBB G Gyy!!$%% 	DHHW%%+,,2244::<<ITW%%%aN&&&~&&!#"DN(>u(E(E%DK9 ,(O	ty((!Yrr]hZ7!<	!$do.D(E(EFFDO(((+,Ot/@/FB,O,OPPF243DEEEE!# &Dty((!Yrr]hZ7!<	!$do.D(E(EFFDO,lKKKr   dict[str, set[str]]c                    t          t                      i           } t                      }t                      }t                      }t                      }t          | t                    rd |                     dg           D             }d |                     dg           D             }d |                     dg           D             }d |                     dg           D             }||||d	S )
Nc                    h | ]D}t          |                                          #t          |                                          ES r!   r   r   s     r   	<setcomp>z$read_manual_picks.<locals>.<setcomp>  :    \\\!SQRVV\\^^\s1vv||~~\\\r   include_idsc                    h | ]D}t          |                                          #t          |                                          ES r!   r   r   s     r   r   z$read_manual_picks.<locals>.<setcomp>  r   r   exclude_idsc                    h | ]D}t          |                                          #t          |                                          ES r!   r   r   s     r   r   z$read_manual_picks.<locals>.<setcomp>  s9    TTTaSVV\\^^T3q66<<>>TTTr   pin_idsc                    h | ]D}t          |                                          #t          |                                          ES r!   r   r   s     r   r   z$read_manual_picks.<locals>.<setcomp>  s9    ZZZ3q66<<>>Zc!ffllnnZZZr   
bottom_idsr   r   r   r   )r+   r"   r   r,   r-   r.   )r/   r   r   r   r   s        r   read_manual_picksr     s    
%''
,
,C%%K%%KeeGJ#t [\\sww}b/I/I\\\\\sww}b/I/I\\\TT3779b+A+ATTTZZcgglB.G.GZZZ
"" 	  r   r   set[str]r   r   r   c                    t          |           t          |          t          |          t          |          d}t          t                      |           d S )Nr   )r   r   r"   )r   r   r   r   r
   s        r   write_manual_picksr    sY     k**k**'??Z((	 G  ""G,,,,,r   actionc                6   t          | pd                                          }|st          d          |dvrt          d          t                      }|d         }|d         }|d         }|d         }|d	k    r,|                    |           |                    |           n|d
k    rV|                    |           |                    |           |                    |           |                    |           nH|dk    rU|                    |           |                    |           |                    |           |                    |           n|dk    rU|                    |           |                    |           |                    |           |                    |           n|dk    r|                    |           nv|dk    rU|                    |           |                    |           |                    |           |                    |           n|dk    r|                    |           t          ||||           ||t          |          t          |          t          |          t          |          dS )Nr<   r   >   pinclearunpinbottomr=   includeunbottomzinvalid actionr   r   r   r   r	  r=   r  r  r  r  r
  )rJ   r  include_countexclude_count	pin_countbottom_count)r:   r@   r   r   discardr   r  r   )rF   r  rL   r1   r   r   r   r   s           r   set_manual_selectionr    s   
hn"


#
#
%
%C 1/000ZZZ)***E&K&KIG|$JC   	9		C   3	7		C   C   3	5C   3C	7			8		C   s	:		3{K*EEE[))[))\\J  r   groupsc                 x    i }| D ]}|D ]}|||j         <   t          |                                d d          S )Nc                    | j         S Npublished_atcs    r   r   zmerge_cards.<locals>.<lambda>  s     r   Tr   )rJ   r   r   )r  mergedgroupr   s       r   merge_cardsr    sX    #%F # # 	# 	#D"F47OO	#&--//'?'?NNNNr   `   textmax_lenc                P   t          |           }t                              dd|          }t                              dd|                                          }t	          |          |k    r|S |d |                             dd          d                                         dz   S )Nz^\d+/\s*r<   rR   rS   r   r   z...)strip_links_mentionsrX   rY   r@   r   rsplit)r  r  ts      r   compact_pointr#    s    T""A
{B""A
vsA$$&&A
1vvXgX;c1%%a(..00588r   c                    t          |                                           }t                              dd|          }d |                                D             }d                    |d d                   S )Nz[^a-z0-9\u4e00-\u9fff]+rS   c                8    g | ]}t          |          d k    |S )r   )r   )r   ws     r   r   zdedupe_key.<locals>.<listcomp>  s#    1111SVVq[[Q[[[r      )r   rA   rX   rY   splitr   )r  r"  wordss      r   
dedupe_keyr*    sf    T""((**A
)322A11		111E88E#2#Jr      N	max_cardsforce_include_idsset[str] | Nonetuple[list[StoryCard], int]c                H   t          |pt                                }g }d}| D ]}t          |          |_        |j        r@|j        |v s|j        r0t          |j        d          |_        |                    |           ]t          |j        p|j	                  r|dz  }~|j        dk     r|dz  }|                    |           |
                    d d           g }t                      }|D ]}t          |j        p|j	                  }	|j        r;|j        |v s|j        r+|                    |           t          |          |k    r nO_|	r
|	|v r|dz  }k|	r|                    |	           |                    |           t          |          |k    r n||fS )Nr   g     X@r   ?c                    | j         | j        fS r  
importancer  r   s    r   r   zcurate_cards.<locals>.<lambda>  s    q~ > r   Tr   )r   
score_cardr4  rJ   manual_pickr   r   is_noise_textri   rb   r   r*  r   r   )
rI   r,  r-  	force_idsfilteredremovedr  resultseen_signaturesr   s
             r   curate_cardsr>     s   
 %.//I "HG  !!}}4 	QTY&&!-&q|T22ALOOA.qw// 	qLG<#qLGMM>>MMMM F #O  .qw//4 	QTY&&!-&MM!6{{i'' 	3/))qLG 	%$$$av;;)##E $7?r   r   	StoryCardc                \   t          | j                  }|r&|                                                                S t	          | j                  }t          |                    d          pd                                          }|rft          
                    d|          }|rIt          |                    d                    ddt          |                    d                    dS t          
                    d|          }|rIt          |                    d                    ddt          |                    d                    dS t          
                    d	|          }|r}ddd
dddddddddd}|                    |                    d                                          d d
         d          }|r)|ddt          |                    d                    dS t          | j                  }|r&|                                                                S dS )Nscheduler<   z$\b(?:20\d{2}/)?(\d{1,2})/(\d{1,2})\br   02d-r   u0   (?:20\d{2}\s*年\s*)?(\d{1,2})\s*月\s*(\d{1,2})zK(?i)\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+(\d{1,2})\br   r   r         r   	   r         )janfebmaraprmayjunjulaugsepoctnovdecr   )_parse_iso_safetimeline_datedater7   normalize_event_factsrh   r:   r.   r@   rX   searchr   r  rA   r  )r   timeline_dtfactsrA  m	month_mapmonpub_dts           r   _event_date_hintr`  +  s   !$"455K .!!++---!$"233E599Z((.B//5577H :II=xHH 	B!''!**ooAAAC

OOAAAAIII8TT 	B!''!**ooAAAC

OOAAAAIIdfnoo 	:1Qq1R2 I --

 0 0 2 22A2 6::C :999C

OO9999T.//F ){{}}&&(((2r   c                d   | j         dvrdS t          | j        p| j        | j                   }t	          |p| j                  }t          |           }t          | j        pd                                          	                                }d
                    || j         ||d d         g          S )N>   eventfeatureannouncementr<   |8   )r>   infer_topic_phraseri   rb   r*  r`  r:   rP   r@   rA   r   )r   topic	topic_key	date_hintrP   s        r   _dedupe_signaturerk  G  s    ~AAArt}:
DNKKE5.DJ//I &&I$,$"%%++--3355G88Wdni3B3HIIIr   r   c           	        t          | j                  }t          | j        pd          }| j        r|dz  }| j        r|dz  }|                    d          r|dz  }|                    d          r|dz  }|                    d          r|d	z  }|t          d
t          t          | j
        pd                    dz            z  }| j        r|dz  }t          |d          S )Nr   g      @g333333@rA  r1  rewardg333333?participationg?g?r<   g     k@g      4@r   )rX  rh   r   r4  cover_imagerV  r.   minr   rW   rd   r7  round)r   r[  scores      r   _card_quality_scorers  Q  s    !$"233E$/(S))E  yy yy yy!! 	Sc*T\%7R8899EABBBE ??r   boolc                   t          | j        pd                                                                          }t          | j        pd                                                                          }|                    d          pd|v S )Nr<   discordzdiscord.com/channels/)r:   providerr@   rA   r   
startswithr   rw  r   s      r   _is_discord_source_cardrz  d  sx    4=&B''--//5577H
dhn"


#
#
%
%
+
+
-
-Cy))K-D-KKr   c                .   t          | j        pd                                                                          }t          | j        pd                                                                          t          fddD                       rdS |dv S )Nr<   c              3      K   | ]}|v V  	d S r  r!   )r   domainr   s     r   	<genexpr>z$_is_x_source_card.<locals>.<genexpr>m  s'      
B
BV6S=
B
B
B
B
B
Br   )zx.com/ztwitter.com/T>   	r.jina.aitwitter-clitweet-result)r:   rw  r@   rA   r   anyry  s     @r   _is_x_source_cardr  j  s    4=&B''--//5577H
dhn"


#
#
%
%
+
+
-
-C

B
B
B
B'A
B
B
BBB tCCCr   c           
        t          |pt                                }d | D             }|s| dfS g }d}| D ]}|j        dk    st          |          s|                    |           3|j        |v s|j        r|                    |           Yt          |          }t          t          |j	        p|j
        |j                  p|j
                  }|j
         d|j         }	d}
|D ]}|j        |j        k    rt          |          }t          |o|o||k              }t          t          |j	        p|j
        |j                  p|j
                  }t          |o|o||k    p||v p||v           }t          t          |	|j
         d|j                   t          |j	        p|j
        |j	        p|j
                            }|r|s|dk    s|dk    rd}
 n|
r|d	z  }|                    |           ||fS )
Nc                F    g | ]}|j         d k    t          |          |S rb  )r>   r  r   r  s     r   r   z>drop_discord_event_duplicates_preferring_x.<locals>.<listcomp>w  s3    YYY1)?)?DUVWDXDX)?Q)?)?)?r   r   rb  rS   Fg?gGz?Tr   )r   r>   rz  r   rJ   r7  r`  r*  rg  ri   rb   rd   rt  r   similarity_ratio)rI   r-  r9  x_event_cardskeptr;  r   	card_date
topic_self	blob_self	duplicatex_cardx_date	same_datetopic_xtopic_overlaptext_sims                    r   *drop_discord_event_duplicates_preferring_xr  r  s    %.//IYYYYYM axDG  >W$$,CD,I,I$KK7i4#3KK$T**	 24=3NDJPTP^ _ _ mcgcmnn
z22DL22		# 	 	FyDG##%f--FYI6Ii66IJJI !3FO4Sv|U[Ue!f!f!vjpjvwwG   "F  "FZ7=R  >EV`dkVk  >Eov  {E  pE  G  GM v|,N,Nfn,N,NOO !<$*fo>]QWQ]^^ H  } D0@0@hRVFVFV 	 GW  	qLGD=r   c                n   t          |pt                                }i }g }d}| D ]}|j        |v s|j        r|                    |           (t	          |          }|s|                    |           O|                    |          }||||<   lt          |          }	t          |          }
|
|	k    r|||<   |dz  }|dz  }|t          |                                          z   }|	                    d d           i }|D ]}|||j        <   t          |                                          |fS )Nr   r   c                    t          | j                  p)t          j                            t
          j                  | j        fS NtzinforU  r  r3   rp  replacer5   r6   r4  r  s    r   r   z,drop_redundant_cards_local.<locals>.<lambda>  s5    q~>>k(,BVBV^f^jBVBkBkmnmyz r   Tr   )
r   rJ   r7  r   rk  r.   rs  rK   r   r   )rI   r-  r9  picked_by_sigpassthroughr;  r   sigr   
prev_score	now_scorer<  uniqr  s                 r   drop_redundant_cards_localr    s{   %.//I*,M#%KG  7i4#3t$$$%% 	t$$$  %%<!%M#(..
'--	z!!!%M#qLGGqLGG4 4 4 6 6777F
KKzz  EIK  J  J  J!#D  QT

''r   ry   c                @   | s| dfS t          |pt                                g }| D ]}t          |j                  }|                    |j        |j        |j        t          |j        pdd          t          |j	        pdd          t          |          |                    dd          |                    dd          |                    dd          t          |j                  t          |j        pd          d	           d
t!                     dt"                              |d           }	 t'          ||          }t)          |          pi }|                    d          }	t+          |	t,                    s| dfS d | D             fd|	D             fdD             s| dfS fd| D             }
t/          |
          t1          dt/          |           dz            k     r| dfS |
t/                    fS # t2          $ r | dfcY S w xY w)Nr   r<   r  r   rA  rm  rn  r   )rJ   rP   typerb   rd   
event_daterA  rm  rn  	has_imager4  u  你是社群情報總編，任務是『去重』而不是重寫內容。請從候選卡片中判斷哪些是同一事件/同一更新的重複貼文，只輸出應該刪掉的 id。規則：1) 同帳號、同主題、同日期（或同場次）且內容高度重疊，視為重複；2) 優先保留資訊更完整者（有時間/地點/獎勵/參與方式/圖片）；3) 不要刪掉跨主題卡片；4) 不可捏造。輸出 JSON：{"drop_ids":[...],"notes":[...]}。

force_keep_ids: z
cards: Frl   drop_idsc                    h | ]	}|j         
S r!   rJ   r  s     r   r   z.apply_minimax_global_dedupe.<locals>.<setcomp>  s    %%%!%%%r   c                    h | ]F}t          |                                          v %t          |                                          GS r!   r   )r   r   knowns     r   r   z.apply_minimax_global_dedupe.<locals>.<setcomp>  s?    TTTqCFFLLNNe<S<SCFFLLNN<S<S<Sr   c                    h | ]}|v|	S r!   r!   )r   r   r9  s     r   r   z.apply_minimax_global_dedupe.<locals>.<setcomp>  s#    >>>!1I+=+=A+=+=+=r   c                &    g | ]}|j         v|S r!   r  )r   r  r  s     r   r   z/apply_minimax_global_dedupe.<locals>.<listcomp>  s%    888Q14x#7#7q#7#7#7r   r   r   )r   rX  rh   r   rJ   rP   r>   r#  rb   rd   r`  r.   rt  ro  r   r4  r   r   r   ru   rv   r,   rK   r   r   rw   )rI   ry   r-  payload_rowsr  r[  r|   r/   r}   drop_ids_rawoutr  r9  r  s              @@@r   apply_minimax_global_deduper    sx   
  ax%.//I)+L 
 
%am44d9&qw}"b99(b#>>.q11!IIj"55))Hb11!&?B!?!?!!-00#AL$7C88 	
 	
 	
 	
"		A "),,		A 		A **\*>>		A 		A 67++!#&&,"zz*--,-- 	!8O%%u%%%TTTTLTTT>>>>x>>> 	!8O8888%888s88c!SZZ1_----!8OCMM!!   axs&   ;AH 
-H 8AH ;H HHtop_n	list[str]c                   h d}i }| D ]}t          |j                  }t                              d|          D ]_}|                                                                }||v r-|                    d          rC|                    |d          dz   ||<   `t          |	                                d d          }d	 |d |         D             S )
N>      今天   以及   你們   可以   我們   最近   目前   真的   這個   還有   那個fromhavehttpjustthatthiswillwithabouthttpsrenaissz0[A-Za-z][A-Za-z0-9_+#-]{3,}|[\u4e00-\u9fff]{2,6}tcor   r   c                    | d         S Nr   r!   r   s    r   r   z#extract_key_terms.<locals>.<lambda>  s
    A r   Tr   c                    g | ]\  }}|S r!   r!   )r   r   rU   s      r   r   z%extract_key_terms.<locals>.<listcomp>  s    )))$!QA)))r   )
r   ri   rX   findallrA   r@   rx  r.   r   r'   )	rI   r  stopfreqr  r  tokentkr   s	            r   extract_key_termsr    s      D D + +#AJ//ZZ SUYZZ 	+ 	+E$$&&BTzz}}U## xxA*DHH	+ DJJLL&6&6EEEF))&%.))))r   r   limitlist[dict[str, Any]]c                   g }| d |         D ]}|j         pi }d|                    dd           d|                    dd           d|                    dd           }|                    t          |j        p|j        d          t          |j        p|j        p|j        d	          |j        |j	        |j
        ||j        |j        d
           |S )Nu   ❤️likesr   u    🔁retweetsu    💬repliesX   l   )headlinepointwhenrP   r   
engagementr4  urgency)metricsr.   r   r#  rb   ri   re   rd   r  rP   r   r4  r  )rI   r  r'   r  r  r  s         r   make_section_itemsr    s    "$E6E6] 
 
)/rugkk'!44uu7;;zRS;T;Tuu[b[f[fgpqr[s[suu
)!'*?QZDD&qx'J19'J
CPP9u(l9	 		
 	
 	
 	
 Lr   dict[str, list[dict[str, Any]]]c                   d | D             }d | D             }|                     d d           |                     d d           dd}d | D             }d | D             }|                     |           |                     |           t          d |D             d          t          |d          t          |d          t          d |D             d          d}|S )Nc                L    g | ]!}|j                                         d k    |"S 
renaissxyzrP   rA   r  s     r   r   z(build_intel_sections.<locals>.<listcomp>%  s.    FFFaAIOO$5$5$E$E$E$E$Er   c                L    g | ]!}|j                                         d k    |"S r  r  r  s     r   r   z(build_intel_sections.<locals>.<listcomp>&  s.    GGGqQY__%6%6,%F%F%F%F%Fr   c                    t          | j                  p)t          j                            t
          j                  | j        fS r  r  r  s    r   r   z&build_intel_sections.<locals>.<lambda>'  s5    !@!@!mHLDXDX`h`lDXDmDmopo{ | r   Tr   c                    t          | j                  p)t          j                            t
          j                  | j        fS r  r  r  s    r   r   z&build_intel_sections.<locals>.<lambda>(  s5    /!."A"A"nX\EYEYaiamEYEnEnpqp|!} r   r   r?  r   tuple[int, datetime]c                    t          | j                  }|rd|fS dt          j                            t
          j                  fS )Nr   r   r  )rU  rV  r3   r   r  r5   r6   )r   r"  s     r   	event_keyz'build_intel_sections.<locals>.event_key*  sC    D.// 	q6M8<''x|'<<==r   c                P    g | ]#}|j         d k    t          |j                  !|$S r  r>   rU  rV  r  s     r   r   z(build_intel_sections.<locals>.<listcomp>0  s3    ^^^A!+"8"8_Q_=]=]"8a"8"8"8r   c                P    g | ]#}|j         d k    t          |j                  !|$S )rc  r  r  s     r   r   z(build_intel_sections.<locals>.<listcomp>1  s5    bbbaAK9$<$<QRQ`AaAa$<$<$<$<r   r   c                $    g | ]}|j         d v |S )>   rb  marketreportrc  rd  r>   r  s     r   r   z(build_intel_sections.<locals>.<listcomp>7  s%    lll1AK3k$k$kQ$k$k$kr   r   c                $    g | ]}|j         d v |S )>   rb  r  r  insightr  r  s     r   r   z(build_intel_sections.<locals>.<listcomp><  s%    ]]]1Q[4\%\%\Q%\%\%\r   )official_updatesupcoming_eventsupcoming_featurescommunity_highlights)r   r?  r   r  )r   r  )rI   official	communityr  eventsfeaturesr   s          r   build_intel_sectionsr  $  sP   FF5FFFHGGEGGGIMM||  GKM  L  L  LNN}}  HLN  M  M  M> > > > _^^^^Fbb5bbbH
KKIKMMiM    /lllllno
 
 .fa88/!<< 2]]	]]]_`!
 !
	 	H Or   valuedatetime | Nonec                4   t          | pd                                          }|sd S 	 t                              |          }|j         |                    t          j                  }|                    t          j                  S # t          $ r Y d S w xY w)Nr<   r  )
r:   r@   r3   fromisoformatr  r  r5   r6   
astimezonerw   )r  r/   dts      r   rU  rU  B  s    
ekr


 
 
"
"C t##C((98<00B}}X\***   tts   AB	 	
BBrZ  c                   |pt          | j                  }|r|                    d          nt          | j        p| j                  pd}d }|rP|                                t                              t          j
                                                  z
  j        }| j        ||t          | j        d          t          | j        p| j        d          | j        | j        | j        | j        | j        d
S )N%m/%dz--L   r  )
rJ   r9   	days_leftr  re   rP   r   r  r  r  )rU  rV  strftimedate_hint_from_textri   rb   rW  r3   r4   r5   r6   daysrJ   r#  re   rd   rP   r   r>   r  r  )r   rZ  event_dtevent_labelr  s        r   _agenda_itemr  O  s    Aod.@AAH08x(##G,,,?RSWS`Sndhdn?o?o?wswKI O]]__x||HL'A'A'F'F'H'HHN	g!$*b11 ;t|R@@<x<)  r   c           
     T   t                               t          j                  }g }g }g }g }g }g }| D ]^}t	          |j                  p|}	|j                                        dk    r#||	z
  j        dk    r|	                    |           |j
        dv r|	                    |           t                              d|j        pdt          j                  r|	                    |           |j
        dk    r|t	          |j                  }
|
s|
                                |                                z
  j        }|dk    r|	                    |
|f           n|	                    |
|f           @|j
        dv r|	                    |           `|                    d	 
           |                    d d           |                    d d           |                    d d           |                    d d           |                    d d           d |d d         D             d |d d         D             d |d d         D             d |d d         D             d |d d         D             d |d d         D             d |d d         D             dS )Nr  rE  >   r  r  u+   注意|風險|warn|scam|慎防|不要|avoidr<   rb  r   >   rc  rd  c                    | d         S Nr   r!   r5  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s
    AaD r   r  c                    | d         S r  r!   r5  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s
    !A$ r   Tr   c                    | j         | j        fS r  r3  r  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s    q|Q^&D r   c                    | j         S r  r  r  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s    an r   c                    | j         | j        fS r  r3  r  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s    Q\1>$B r   c                    | j         | j        fS r  r3  r  s    r   r   z$build_intel_agenda.<locals>.<lambda>  s    alAN%C r   c                4    g | ]\  }}t          ||          S r!   r  r   r	  r   s      r   r   z&build_intel_agenda.<locals>.<listcomp>  s&    ![![![XR,tR"8"8![![![r   r   c                4    g | ]\  }}t          ||          S r!   r  r  s      r   r   z&build_intel_agenda.<locals>.<listcomp>  s&    WWW82tT2 6 6WWWr   c                4    g | ]\  }}t          ||          S r!   r  r  s      r   r   z&build_intel_agenda.<locals>.<listcomp>  s&    VVVTl444VVVr   r   c                ,    g | ]}t          |          S r!   r  r   r   s     r   r   z&build_intel_agenda.<locals>.<listcomp>       MMM$<--MMMr   rD  c                ,    g | ]}t          |          S r!   r  r"  s     r   r   z&build_intel_agenda.<locals>.<listcomp>  s     IIId++IIIr   c                ,    g | ]}t          |          S r!   r  r"  s     r   r   z&build_intel_agenda.<locals>.<listcomp>  r#  r   c                ,    g | ]}t          |          S r!   r  r"  s     r   r   z&build_intel_agenda.<locals>.<listcomp>  s     MMM4L..MMMr   r   )event_timeline_futureevent_timeline_pastupcoming_timelinegrowth_signalsfuture_watchrecent_updatesattention_watch)r3   r4   r5   r6   rU  r  rP   rA   r  r   r>   rX   rY  ri   IrV  rW  r   )rI   r4   event_future
event_pastr+  r*  r,  caution_watchr   r_  r  deltas               r   build_intel_agendar3  c  s   
,,x|
$
$C57L35J$&L&(N&(N%'M & & !233:s<<//S6\4G14L4L!!$'''>111!!$'''99CT]EXVXZ\Z^__ 	'  &&&>W$$&t'9::H ]]__sxxzz17Ezz##Xt$45555!!8T"2333>888%%%..)))OOO555DDdSSS44dCCCBBDQQQCCTRRR "\![VYWYVYIZ![![![WWzRUSURUWWWVV\RTSTRTEUVVVMM.!:LMMMIIRaR8HIIIMM.!:LMMMMM=!;LMMM  r   c           	        t          | j                  }t          d                    | j        pd| j        pdd                    | j        pg           g                    }| j        dk    r |                    dd          }|rd| dS dS | j        dv rd	S | j        d
k    r*t          
                    d|t          j                  rdS dS | j        dk    rdS dS )NrS   r<   rb  rm  u+   直接提高參與動機，獎勵重點在 u   。u6   可直接影響活動參與率與社群互動熱度。>   rc  rd  uK   會影響玩家後續操作節奏，需提早確認開放條件與時間。r  u!   \$|成交|record|交易量|volumeuK   提供市場定價與熱度參考，會影響短期決策與討論方向。u?   可作為市場觀測訊號，建議搭配其他來源比對。r  u3   有助於快速比較方案，降低決策成本。u9   有助於掌握社群當前關注議題與互動方向。)rX  rh   rW   r   ri   rd   bulletsr>   r.   rX   rY  r.  )r   r[  sourcerm  s       r   _official_impact_liner7    s    !$"233E$-"52t|7Ir388TXT`TfdfKgKg!hiijjF~  8R(( 	MLLLLLGG~444\\~!!999624HH 	a``PP~!!DDFFr   c                |   t          | j                  }|                    d          r|d         S t          d                    | j        pd| j        pd| j        pdg                    }t          	                    d|t          j
                  rdS t          	                    d|t          j
                  rdS dS )	NlocationrS   r<   u   hong\s*kong|香港u   香港u'   discord|space|live|直播|線上|线上u   線上社群u   待官方補充)rX  rh   r.   rW   r   ri   rd   rb   rX   rY  r.  )r   r[  r6  s      r   _official_where_liner:    s    !$"233Eyy !Z  $-"52t|7Ir4:K[Y[!\]]^^F	yy&55 x	yy;VRTJJ ~r   c                   t          | j                  }|                    d          r^|d         }t                              dd|          }t                              dd|          }t                              dd|          }|S t          | j                  }|r|                    d          S t          | j                  }|r|                    d          S d	S )
NrA  z(?i)\btoday\bu   今日z(?i)\btonight\bu   今晚z(?i)\btomorrow\bu   明日r  u   近期)	rX  rh   r.   rX   rY   rU  rV  r  r  )r   r[  r/   rZ  r_  s        r   _official_when_liner<    s    !$"233Eyy Jff%x55ff'377ff((C88
!$"455K -##G,,,T.//F (w'''8r   recentc                ~   i }i }| D ]e}|                     |j        d          dz   ||j        <   t          |j        p|j        |j                  }|                     |d          dz   ||<   ft          |                                d d          }t          |                                d d          }d |d d         D             }d	d
dddddd                    fd|d d         D                       }|rd                    |          nd}	d|	 d| d}
g }t                      }| D ]}d}t          |j        p|j        |j                  }t          |          }|r||v r<|r|
                    |           t          |          }t          |          }t          |          }t                              dd|j        pd                                          }t#          |p|d          }|                    | d| d| d| d| d|            t'          |          dk    r nd |
|pd!gd"S )#Nr   r   c                    | d         S r  r!   r   s    r   r   z-_official_overview_fallback.<locals>.<lambda>  s
    r!u r   Tr   c                    | d         S r  r!   r   s    r   r   z-_official_overview_fallback.<locals>.<lambda>  s
    A r   c                    g | ]\  }}|S r!   r!   )r   namerU   s      r   r   z/_official_overview_fallback.<locals>.<listcomp>  s    99974$999r   r   u   活動u   功能u   公告u   市場u   報告u   社群)rb  rc  rd  r  r  r  u   、c                L    g | ] \  }}                     ||           d | !S )rS   )r.   )r   r"  ntype_label_maps      r   r   z/_official_overview_fallback.<locals>.<listcomp>  s;    ]]]41a 2 21a 8 8>>1>>]]]r   r   u   官方動態u   近 7 天官方重點集中在 u   ，更新型態以 u    為主。整體看起來，官方目前同時在推活動參與與功能節奏，對玩家最直接的影響是：需要同時關注活動時程、參與門檻與後續功能開放條件。u   Renaiss 官方u   ^[^｜|:：]{1,12}[｜|:：]\s*r<   .   u   在 u
    釋出「u   」，場域在 u   ；核心事件是 u   ，   近 7 天官方重點整理u0   目前尚未整理出可顯示的官方重點。rb   rd   r5  )r.   r>   rg  ri   rb   r   r'   r   r   r*  r   r<  r:  r7  rX   rY   r@   r#  r   r   )r=  type_countstopic_countsr   rh  ordered_typesordered_topics
top_topics
type_brieftopic_briefrd   r5  seen_topicswho	topic_sigr  whereimpacttitle_clean
event_textrE  s                       @r   _official_overview_fallbackrW    s   "$K#%L = =&1oodna&H&H1&LDN#"4=#>DJOO*..ua881<U;,,..4D4DdSSSML..006F6FPTUUUN99nRaR&8999J  N ]]]]=Y[Z[Y[K\]]]^^J,6J%**Z(((NK	V+ 	V 	V* 	V 	V 	V  GEEK  "4=#>DJOOu%%	 	k11 	'OOI&&&"4(($T**&t,,ff?TZEUSUVV\\^^";#7%<<
 2 2 2 2
 2 2E 2 2$2 2)/2 2	
 	
 	
 w<<1E  /RQR  r   
str | Nonec                0   d | D             }|sdddgdS |                     d d           t          |d	         j                  p#t                              t
          j                  }|t          d
          z
  fd|D             d d         }|s
|d d         }t          |          }|s|S g }|d d         D ]~}|	                    |j
        |j        t          |j        d          t          |j        d          |j        |j        t!          |j                  t%          |j                  d           dt(                              |d           }	 t-          ||          }	t/          |	          pi }
t1          t3          |
                    d          pd                    d d         }t1          t3          |
                    d          pd                    d d         }t7          |
                    d          t8                    r|
                    d          ng }d |D             }|s$t3          |                    d          pd          }t;          |          dk     r$t3          |                    d          pd          }t;          |          dk     r$t9          |                    d          pg           }|pd|p#t3          |                    d          pd          |d d         dS # t<          $ r |cY S w xY w) Nc                j    g | ]0}|j                                                             d           .|1S )r  )rP   rA   rx  r  s     r   r   z+build_official_overview.<locals>.<listcomp>  s7    LLLaAIOO$5$5$@$@$K$KLLLLr   rG  u0   目前尚未抓到足夠的官方更新資料。u9   完成同步後，會在這裡顯示官方近期重點。rH  c                ~    t          | j                  p)t          j                            t
          j                  S r  rU  r  r3   rp  r  r5   r6   r  s    r   r   z)build_official_overview.<locals>.<lambda>  s,     ? ? l8<CWCW_g_kCWClCl r   Tr   r   rE  r  c                    g | ]F}t          |j                  p)t          j                            t
          j                   k    D|GS )r  r\  )r   r  window_starts     r   r   z+build_official_overview.<locals>.<listcomp>  sS       AN++Xx|/C/C8</C/X/X]iii 	
iiir   rH  r   r   \   rV   )rJ   r  rb   rd   r  rV  rh   r  u  你是官方情報站主編，請把資料整理成真正可讀的重點摘要。要求：1) 內容必須是繁體中文；2) 不是改寫標題，而是做整合；3) 每條重點都要包含「人、事、時、地、影響」五個面向（可自然句，不用標籤格式）；4) 禁止空泛句（例如建議交叉驗證、可持續追蹤）；5) 不可捏造。請輸出 JSON：{"title":str,"summary":str,"bullets":[str,str,str,str]}。

cards=Frl   rb   r<   0   rd   r   r5  c                    g | ]B}t          t          |                    t          t          |                    d d         CS )NrV   )rW   r:   r   s     r   r   z+build_official_overview.<locals>.<listcomp>1  sC    WWWJsSTvvDVDVW:c!ff%%dsd+WWWr   (   r   r   )r   rU  r  r3   r4   r5   r6   	timedeltarW  r   rJ   r>   r#  rb   rd   rV  rX  rh   rt  ro  r   r   ru   rv   rW   r:   r.   r,   rK   r   rw   )rI   ry   r  	latest_dtr=  fallbackrowsr  r|   r/   r}   rb   rd   bullets_rawr5  r_  s                  @r   build_official_overviewri    si   LL5LLLH 
2IST
 
 	
 MMllvzM{{{ 899WX\\(,=W=WIya0000L      
rcF  "1"*622H DCRC[ 
 
d&qw33(C88 !!"4Q]CC!!-00	 		
 	
 	
 	
	8 Du55	8 	8 67++!#&&,"3vzz'228b99::3B3?SI!6!6!<"==>>ttD/9&**Y:O:OQU/V/V^fjj+++\^WW[WWW 	PW--N1NOOEw<<"(,,y117R88Gw<<!8<<	228b99G;;D#hll9&=&=&C"D"Drr{
 
 	

    s    F%L LLdigestwindow_daysaccountsc                r   t                               t          j                                                  }|||t          |           t          d | D                       t          d | D                       t          d | D                       t          d | D                       d|d | D             dS )Nc              3  0   K   | ]}|j         d k    dV  dS )posterr   Nr   r  s     r   r~  z%build_feed_payload.<locals>.<genexpr>I  s.      CCah(.B.B!.B.B.B.BCCr   c              3  0   K   | ]}|j         d k    dV  dS )briefr   Nrp  r  s     r   r~  z%build_feed_payload.<locals>.<genexpr>J  s.      AAqQX-@-@-@-@-@-@AAr   c              3  0   K   | ]}|j         d k    dV  dS )datar   Nrp  r  s     r   r~  z%build_feed_payload.<locals>.<genexpr>K  s.      ??aAH,>,>,>,>,>,>??r   c              3  0   K   | ]}|j         d k    dV  dS )timeliner   Nrp  r  s     r   r~  z%build_feed_payload.<locals>.<genexpr>L  s.      GG!J0F0FA0F0F0F0FGGr   )ro  rr  rt  rv  c                6    g | ]}|                                 S r!   )to_dictr  s     r   r   z&build_feed_payload.<locals>.<listcomp>O  s     ---!!))++---r   )generated_atrk  rl  total_cardslayout_countsrj  rI   )r3   r4   r5   r6   r7   r   sum)rI   rj  rk  rl  ry  s        r   build_feed_payloadr}  A  s    <<--7799L$"5zzCCUCCCCCAAEAAAAA??5?????GGuGGGGG	
 
 --u---  r   c                 F    dddg dddddg d	dd
ddg dddddg ddgS )Nevent_posteru   活動海報型u   活動、直播、線下聚會)u   活動主軸u   時間線索u   參與方式u   原文入口)rJ   rB  forblocksmarket_signalu   市場訊號型u!   數據、成交量、價格變化)u   這則在說什麼u   提到哪些數據u   可能影響u   下一步要看什麼announcement_timelineu   公告時間線型u*   功能開放、版本進度、官方更新)u   更新主題u   目前進度u	   下一步u   時間節點community_briefu   社群觀點型u   社群討論與經驗分享)u   觀點摘要u   可採用做法u   風險提醒u   延伸閱讀r!   r!   r   r   default_format_templatesr  S  s     !%3VVV		
 	
 "%6kkk		
 	
 *(?SSS		
 	
 $%0YYY		
 	
' r   list[str] | Nonemax_posts_per_accountc                6  5 t                       t                      }t          t          d                    }| pt          }t
                              t          j                  t          |          z
  }g }i }|D ];5t          5||          }	|                    |	           t          |	          |5<   <t                      }
g }i }g }|
                    d          rt          d |
                    dg           D             t!          |
                    d          pd          |t#          |
                    d	          pt$                    
          \  }}}|                                D ]\  }}t#          |          |d| <   t)                      }t+          |d                   }t+          |d                   }t+          |d                   }t+          |d                   }||z  |z  }t-                      dz  }t/          |g           }g }|D ]}	 |                    t3          di dt!          |                    d          pd          dt!          |                    d          pd          dt!          |                    d          pd          dt!          |                    d          pd          dt!          |                    d          pd          dd |                    dg           D             d d         dt!          |                    d          p5t
                              t          j                                                            dt7          |                    d          pd          dt!          |                    d          pd          dt!          |                    d          pd           d!d" |                    d!g           D             d d         d#t!          |                    d#          pd          d$t!          |                    d$          pd          d%t!          |                    d%          pd          d&t9          |                    d&          t:                    r|                    d&          ni d't7          |                    d'          pd(          d)t!          |                    d)          pd*          d+t!          |                    d+          pd          d,t!          |                    d,          pd          d-t!          |                    d-          pd.          d/t          |                    d/          pd0          d1t          |                    d1          pd2          d3t          |                    d3          pd2          d4t=          |                    d4                    d5t?          |                    d5                    d6t!          |                    d6          pd          d7tA          |                    d7          d89          d:t!          |                    d:          pd                     # tB          $ r Y w xY wtE          |||          }t          |          }tG          |           tI          |          }t+          |                    d;t+                                          }g }d<}d<} |D ]}!|!j%        |v |!_&        |!j%        |v |!_'        |!j%        |v rd0|!_(        |!j&        rd0|!_(        |!j'        rd0|!_(        |!j%        |v r|!j%        |vr| d=z  } b|!j%        |v r|!j%        |vr|d=z  }z|                    |!           tS          ||>          \  }}"tU          |tV          |?          \  }#}$tY                      }%d<}&d<}'|r|#rt[          |#||%@           tG          |#d0A           tI          |#           tG          |#d0A           t]          |#||>          \  }#}&t_          |#|>          \  }#}'tU          |#tV          |?          \  }#}$n#ta          |#           t_          |#|>          \  }#}'|#D ]}(|(j(        p|(j%        |v |(_(        |(j%        |v |(_&        |(j%        |v |(_'        tc          |(          |(_2        tg          |(           ti          |(           tk          |(           tm          |(d0A           tc          |(          |(_2        |#7                    dB d0C           tq          |#dDE          })ts          |#          }*tu          |#          }+tw          |#|*|)|pd F          },|sty          dG |#D                       }-ty          dH |#D                       }.ty          dI |#D                       }/t          |+                    dJg                     }0t          |+                    dKg                     }1dL|- dM|. dN|/ |,dO<   dP|- dQ|. dR|/ dS|0 dT|1 dU|,dV<   g dW|,dX<   t{          |#|,||          }2||2dY<   t          |          |2dZ<   |$|2d[<   ||2d\<   | |2d]<   t#          |"          |2d^<   |)|2d_<   |*|2d`<   |+|2da<   t}          |#|pd F          |2db<   t                      |2dc<   ty          dd |#D                       ty          de |#D                       ty          df |#D                       ty          dg |#D                       dh|2di<   ty          dj |#D                       |2dk<   t          |          t          |          t          |          t          |          t          |          t          |          t          |          t          |          dl|2dm<   t#          |                    dnd<          pd<          t          |          do|2dp<   t#          |&          t#          |'          dq|2dr<   t#          |          t#          t          |                    t#          t          |#                    t#          |          t#          |           t#          |"          t#          |&          t#          |'          t#          |$          ds	|2dt<   ||2du<   i }3|D ]P55fdv|D             }4|4sdw|35<   t          |4          d=k    r t          t          |4                    |35<   Kdx|35<   Q|3|2dy<   t          |
                    d                    t          |
                    dz                    d{ |
                    dg           D             t#          |
                    d	          pt$                    t          |          ||d d8         d||2d}<   d~d|t          |
                    d                    d|2d<   t          t-                      dz  |2           |2S )Ntwitterr]  )since_dt	max_postsenabledc                n    g | ]2}t          |                                          #t          |          3S r!   r   r   s     r   r   z!sync_accounts.<locals>.<listcomp>  s2    ^^^AsSTvv||~~^Q^^^r   channel_idsr  r<   r  )r  r  r  limit_per_channelzdiscord:r   r   r   r   x_intel_manual_entries.jsonrJ   rP   manualr   rb   rd   r5  c                n    g | ]2}t          |                                          #t          |          3S r!   r   r   s     r   r   z!sync_accounts.<locals>.<listcomp>  s1    WWWAWSVVWWWr   r   r  r   g?r>   r  r   rr  r   c                n    g | ]2}t          |                                          #t          |          3S r!   r   r   s     r   r   z!sync_accounts.<locals>.<listcomp>  s1    QQQQ#a&&,,..Q#a&&QQQr   ri   rw  ro  r  r4  r   template_idr  re   rV  r  normalr7  T
manual_pinFmanual_bottomrh   rg   detail_summarydetail_linesrD  )r  reply_to_idr   r   r   )r-  )r,  r-  )feedback_context)preserve_typec                    t          | j                  p)t          j                            t
          j                  | j        fS r  r  r  s    r   r   zsync_accounts.<locals>.<lambda>   s5    q~66c(,:N:NV^Vb:N:c:cefeqr r   r   r+  )r  ry   c              3  0   K   | ]}|j         d k    dV  dS )rb  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>  s.      MMakW6L6L!6L6L6L6LMMr   c              3  0   K   | ]}|j         d k    dV  dS )rc  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>	  s.      QQ!y8P8PA8P8P8P8PQQr   c              3  0   K   | ]}|j         d k    dV  dS )rd  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>
  s.       [ [qQ[N=Z=Z=Z=Z=Z=Z [ [r   r*  r+  u    Spring AI 主時間軸：活動 u
    / 功能 u
    / 公告 r  u   已整理出活動 u    件、功能 u    件、公告 u    件、增長訊號 u    件、未來觀察 u4    件，可直接用於社群公告與行動排程。
conclusion)u<   先看主時間軸，把活動與功能安排到行事曆。u6   活動類優先確認時間、地點與參與方式。u<   再看「增長訊號」確認社群熱度與市場脈動。	takeawaysraw_total_cardssource_total_cardsexcluded_cardsexcluded_by_selectionexcluded_by_feedbackexcluded_by_source_preference	key_termsintel_sectionsintel_agendaofficial_overviewformat_templatesc              3  0   K   | ]}|j         d k    dV  dS )r  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>$  s.      XX!8W8WA8W8W8W8WXXr   c              3  0   K   | ]}|j         d k    dV  dS )r  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>%  s.      ZZ1/9Y9YQ9Y9Y9Y9YZZr   c              3  0   K   | ]}|j         d k    dV  dS )r  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>&  s/      $j$j1RiAiAiQAiAiAiAi$j$jr   c              3  0   K   | ]}|j         d k    dV  dS )r  r   Nr  r  s     r   r~  z sync_accounts.<locals>.<genexpr>'  s/      ^^Q1=L];];]q;];];];]^^r   )r  r  r  r  template_countsc              3  (   K   | ]}|j         	d V  dS )r   N)ro  r  s     r   r~  z sync_accounts.<locals>.<genexpr>)  s)       K KqQ] K K K K K K Kr   image_cards)r   r   r   r   r  r  r  r  manual_picksr   )r   excluded_countfeedback_stats)
ai_removedlocal_removeddedupe_stats)	merged_totalsource_totalcurated_totalremoved_by_selectionremoved_by_feedbackremoved_by_source_preferenceremoved_by_ai_deduperemoved_by_local_deduperemoved_by_curationpipeline_countssource_statsc                    h | ]?}|j                                                                         k    1|j        8|j        @S r!   )rP   rA   rw  )r   r  usernames     r   r   z sync_accounts.<locals>.<setcomp>J  sD    nnnA9J9JhnnN^N^9^9^cdcm9^QZ9^9^9^r   zno-datamixedsource_quality
configuredc                ,    g | ]}t          |          S r!   )r:   r   s     r   r   z!sync_accounts.<locals>.<listcomp>U  s    KKK1AKKKr   )r  r  r  r  cards_totalchannel_statserrorsdiscord_monitoruW   若某帳號無法公開抓取，系統會保留該帳號並等待後續可讀資料。u_   twitter-cli (若可用) / tweet-result / r.jina.ai / nitter-rss fallback / discord-rest(可選))rf  rw  twitter_cli_readydiscord_monitor_enablednotesrH   r!   )Dload_environmentrs   rt  shutil_whichDEFAULT_ACCOUNTSr3   r4   r5   r6   rd  collect_account_cardsextendr   resolve_discord_monitor_configr.   collect_discord_cardsr:   r   DEFAULT_DISCORD_MONITOR_LIMITr'   r   r   r    r+   r   r?  r7   r   r,   r-   rX  rt   normalize_detail_linesrw   r  normalize_cards_semanticsr   rJ   r  r  r7  r  r>  DEFAULT_CURATED_MAX_CARDSr   apply_minimax_story_refiner  r  apply_editorial_fallbackr6  r4  enrich_card_metadataenrich_detail_viewapply_quality_guardnormalize_card_semanticsr   r  r  r3  aggregate_digestr|  r}  ri  r  r   nextiterr   )6rl  rk  r  ry   r  target_accountsr  account_cardsaccount_statsrI   discord_cfgdiscord_cardsdiscord_statsdiscord_errorscidr   picksr   r   r   r   r9  manual_path
manual_rawmanual_cardsrM   merged_cardsr  feedback_resultfeedback_excluded_idssource_cardsr  r  r  removed_by_source_prefcurated_cardsremoved_countr  
ai_dedupedlocal_dedupedr   r  r   agendarj  event_countfeature_countannouncement_countgrowth_countfuture_countr
   quality	providersr  s6                                                        @r   sync_accountsr  p  s   
 !##G\)44552"2O||HL))I;,G,G,GGH%'M$&M# - -%hMbcccU###"%e**h022K%'M$&M "Ny!! 97L^^)K)K^^^koog..4"55!+//'":":"[>[\\	8
 8
 8
4}n (--// 	9 	9JC.1%jjM*S**++EeM*++KeM*++K%	"##GU<())Jg%
2I**<<K;++J$&L # #"	   488D>>/R000 3 3 ?x@@@ DHHUOO1r222 dhhw//52666	
   3 3 9r::: XWTXXi-D-DWWWXZYZXZ[[ "%TXXn%=%=%ghlA[A[AeAeAgAg!h!h!h  %TXXl%;%;%CtDDD "$((;"7"7"D9EEE txx11<W=== RQ$((62*>*>QQQRTSTRTUU !*!5!5!;<<< !*!5!5!ABBB !$DHH]$;$;$Ar B B B 4>dhhy>Q>QSW3X3X`DHHY///^`   %TXXl%;%;%BsCCC!" !$DHH]$;$;$P?P Q Q Q#$ txx117R888%& #&dhh&?&?&E2"F"F"F'(   3 3 ?x@@@)* !%TXXm%<%<%D E E E+,  $DHH\$:$:$CeDDD-. #'txx'@'@'IE"J"J"J/0 !6dhh}6M6M N N N12 "88P8P!Q!Q!Q34 $'txx0@'A'A'GR#H#H#H56 "88P8PXY!Z!Z!Z!Z78 !$DHH]$;$;$Ar B B B9   @  	 	 	H	 }lMJJL|$$Ll+++.|<<O 3 3NCEE J JKK$&L  tw$*,4; AM< 	! AM? 	! AM4(((QT-B-B1$4;14y#8#8 A% A+U#, , ,(L(
 $0+#$ $ $ M=
 .//JM n= n"='L\]]]]!-tDDDD ///!-tDDDD$?wjs$t$t$t!z'A-cl'm'm'm$}'3/'(
 (
 (
$}} 	!///'A-cl'm'm'm$} 	+ 	++G;0F'W,!W
2$T**T"""4   D!!! T::::$T**rr     "-r:::I#M22H..FmXy'/UYZZZF 
MM]MMMMMQQ}QQQQQ  [ [M [ [ [[[6::&6;;<<6::nb99:: E  E  EWd  E  E  qC  E  Ez<+ < <] < <Zl < <  CO < <  eq < < < 	|
 
 
{
 !_UUG!-G$'$5$5G ! -G';G#$&9G"#/23I/J/JG+,$GK (G$GN#:=RYRa]a#b#b#bG ":"<"<GXX}XXXXXZZZZZZZ!$$j$j$j$j$j!j!j^^-^^^^^	" "G ! K KM K K KKKGMk**k**'??Z(([))[))\\J	 	GN o112BAFFK!LL344! !G
 *oo]++ GN
 L))C--..S//00 #$8 9 9"#677(+,B(C(C #J#&}#5#5"=11
" 
"G ,GN G# ( (nnnnnnn	 	( )GH^^q   $T)__ 5 5GH 'GH 'G	2233;??<8899KKr(J(JKKK !9!9!Z=Z[[=))& !$" "G nu.#'	(B(B#C#C	 GG xzz//999Ns   #Q<Z!!
Z/.Z/	tweet_urlc                   t                       t                      pd }t          | |          t                      dz  }t	          |g           }fd|D             }d_        |                                                               t          ||           t          j
        d           t                      }d                                |dS )Nr  r  c                j    g | ]/}t          |                    d                     j        k    -|0S r  )r:   r.   rJ   )r   rM   r   s     r   r   z$add_manual_tweet.<locals>.<listcomp>n  s7    KKKC,?,?47,J,J,J,J,Jr   Tr	  )okaddedfeed)r  rs   build_card_from_urlr    r+   r7  r   rx  r   r  rJ   r  )r  ry   r  currentr:  r
   r   s         @r   add_manual_tweetr  f  s    !##+tGy':::D**<<KR((GKKKKKKKHDOODLLNN###{H%%%),,,ooG  r   __main__ry  rz  r  )ry  rz  r  Fr   r   )r   r	   r
   r   r   r   )r   r	   )r   r%   )r1   r%   r   r   )r9   r:   r   r:   )rF   r:   r   r%   )r<   )r9   r:   rO   r:   rP   r:   r   r:   )
rF   r:   r9   r:   rO   r:   r]   r%   r   r%   )r1   r%   rF   r:   r9   r:   rO   r:   r]   r%   r   r   )rF   r:   r9   r:   rO   r:   r   r%   )r   r   r   )r   r   r   r   r   r   r   r:   )rI   r   r   r%   )r   r   )
r   r   r   r   r   r   r   r   r   r   )rF   r:   r  r:   r   r%   )r  r   r   r   )r  )r  r:   r  r   r   r:   )r  r:   r   r:   )r+  N)rI   r   r,  r   r-  r.  r   r/  )r   r?  r   r:   )r   r?  r   r   )r   r?  r   rt  r  )rI   r   r-  r.  r   r/  )rI   r   ry   r:   r-  r.  r   r/  )r+  )rI   r   r  r   r   r  )r   )rI   r   r  r   r   r  )rI   r   r   r  )r  r:   r   r  )r   r?  rZ  r  r   r%   )r=  r   r   r%   )rI   r   ry   rX  r   r%   )
rI   r   rj  r%   rk  r   rl  r  r   r%   )r   r  )rl  r  rk  r   r  r   r   r%   )r  r:   r   r%   )A
__future__r   r<   r   
_bootstrapr   
_editorialr   _sourcesglobalsupdatevarsr   r"   r$   r   r0   r8   rE   rN   r\   r~   r   r   r   r   r   r   r  r  r  r#  r*  r>  r`  rk  rs  rz  r  r  r  r  r  r  r  rU  r  r3  r7  r:  r<  rW  ri  r}  r  DEFAULT_WINDOW_DAYSDEFAULT_MAX_POSTS_PER_ACCOUNTr  r  __name__r<  printr   r   r.   r!   r   r   <module>r     so   " " " " " " % % % % % % % % % % % % ! ! ! ! ! ! 		  j!! " " " 		  j!! " " " 		  h      Y Y Y Y
4 4 4 40 0 0 0   u u u u ) ) ) )       b b b b bL L L L^A A A AH, , , , ,^:> :> :> :> :>z   $L $L $L $LN   &- - - -0 0 0 0fO O O O9 9 9 9 9        )-( ( ( ( (V   8J J J J   &L L L LD D D D *., , , , ,^( ( ( ( (J *.7 7 7 7 7t* * * * *&    (   <
 
 
 
    (. . . .bG G G G&	 	 	 	   "5 5 5 5pB B B B BJ   $   < "&*!>s s s s sl   , z]__F	E$**

>22zz-00

>266  !	  % % & & & & & r   