
    eai                         d Z ddlZddlZddlmZmZmZmZ ddlmZ ddl	Z	ddl
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ  ej6                  d      ZdZdedefdZdedefdZ y)u  
庫柏每日簡報(階段 4e)。

對單一使用者:把「今天該關注的事」整理成 200-300 字的簡報。

資料來源:
  - 我負責的任務:今天到期 / 已逾期 / 進行中
  - 最近 3 天 重要訊息(tag = 📢 公告 / 📌 決策)
  - 最近 7 天 會議的待辦,還沒轉成 task 的
  - 最近一場會議摘要(若有)

由 Claude(Sonnet)整理成自然語氣的早安簡報。
    N)datedatetime	timedeltatimezone)UUID)or_select)settings)AsyncSessionLocal)Message)MeetingMeetingActionItemMeetingSummary)Task)Userz
coba.briefu  你是庫柏(Cooper),團隊的 AI 同事。
請依使用者本人的待辦、最近的重要訊息與會議摘要,整理一份「個人化的今日簡報」給他。

【風格】
- 繁體中文,親切但不肉麻
- 直接稱呼使用者顯示名稱
- 200-300 字之間
- 條列+短段落混用
- 開頭一句問候,中間整理重點,結尾給「今天該優先做的事」

【結構建議】
1. 一句溫暖問候 + 整體狀況(多忙 / 卡點)
2. ⚡ 今天到期 / 逾期任務(最多 3 個)
3. 📌 最近重要決策或公告
4. 🎙️ 最近會議結論(若有)
5. 🚀 庫柏建議今天優先處理什麼

【規則】
- 沒有資料的區塊就跳過,不要硬寫
- 不要列「我會幫你做 X」這種空話
- 講事實 + 一句你的觀察 / 建議
userreturnc                 x  K   t        j                         }t        j                  t        j
                        t        d      z
  }t        j                  t        j
                        t        d      z
  }t               4 d{   }t        t              j                  t        j                  j                  d      t        j                  j                  g d      t        t        j                   | j"                  k(  t        j$                  | j"                  k(              j'                  t        j(                  j+                         j-                         t        j.                  j1                               j3                  d      }t5        |j7                  |       d{   j9                         j;                               }|D cg c]  }|j(                  |k(  s| }}|D cg c]!  }|j(                  s|j(                  |k  s |# }	}|D cg c]  }|j                  dk(  s||vs||	vs|  }
}t        t<              j                  t<        j                  j                  d      t<        j>                  |k\        j'                  t<        j>                  j1                               j3                  d      }t5        |j7                  |       d{   j9                         j;                               }|D cg c],  }|j@                  rtC        d	 |j@                  D              r|. c}dd
 }t        tD              j                  tD        jF                  | j"                  k(  tD        jH                  j                  d      tD        j>                  |k\        }t5        |j7                  |       d{   j9                         j;                               }t        tJ        tL              jO                  tL        tL        jP                  tJ        j"                  k(        j                  tJ        j                  j                  d      tJ        j                  dk(        j'                  tJ        j>                  j1                               j3                  d      }|j7                  |       d{   jS                         }d}|rT|\  }}|jT                  |jV                  |jX                  xs g |j>                  r|j>                  j[                         ndd}| j\                  |j[                         |D cg c]  }|jT                  |j.                  d c}|	D cg c]B  }|jT                  |j(                  r|j(                  j[                         nd|j.                  dD c}|
dd
 D cg c]  }|jT                  |j.                  d c}|D cg c]I  }|j^                  dd |j@                  xs g |j>                  r|j>                  j[                         nddK c}|D cg c]  }|j`                  |jb                  d c}|dcddd      d{    S 7 7 c c}w c c}w c c}w 7 c c}w 7 7 c c}w c c}w c c}w c c}w c c}w 7 A# 1 d{  7  sw Y   yxY ww)u3   蒐集 Claude 要看的所有資料(純 SQL 撈)。   )days   N)todoin_progressreview   r   2   c              3   0   K   | ]  }d |v xs d|v   yw)u   公告u   決策N ).0ts     </volume1/homes/robertsu/coba/app/app/services/daily_brief.py	<genexpr>z"_gather_context.<locals>.<genexpr>^   s!     O1x1}=A=s      	completed    )titlesummarytopicswhen)r'   priority)r'   duer+      )contenttagsr*   )descriptionr,   )	user_nametoday	due_todayoverduer   important_messagesmy_action_items_pendinglatest_meeting)2r   r2   r   nowr   utcr   r   r	   r   where
deleted_atis_statusin_r   assignee_idid
created_byorder_bydue_dateasc
nulls_lastr+   desclimitlistexecutescalarsallr   
created_atr/   anyr   suggested_assignee_idconverted_task_idr   r   join
meeting_idfirstr'   executive_summary
key_topics	isoformatdisplay_namer.   r0   suggested_due_date)r   r2   seven_days_agothree_days_agodbmy_tasks_stmtmy_tasksr    r3   r4   r   important_msgs_stmt
all_recentm	importantaction_items_stmtmy_action_itemslatest_meeting_stmtlatestlatest_meeting_summarymtsmais                          r!   _gather_contextri   :   s;    JJLE\\(,,/)2CCN\\(,,/)2CCN ""b 4LU##D) ABD$$/DGG1KL
 Xdmm'')4468J8J8LMU2Y 	 rzz-88AACGGIJ (@1AJJ%,?Q	@&Lh!**e9K1hL"*t(Qahh-.GAU^L^cdlscsq(t 7OU""&&t,""n4 Xg((--/0U2Y 	 ,?!@@IIKOOQR
!
!!vv#OOO z
 1	 $%U!77477B!3377=!,,> 	 bjj1B&C CLLNRRTU 7N+T..";";wzz"IJU7%%))$/;1NOXg((--/0U1X 	 

#677>>@!%FB//---257]]//1	&" **__&NWXiAGGDiX DK  L  DK~!''AJJ!**2F2F2H\`nonxnxy  DK  LP[\^]^P_`P_1agg1::FP_` ##"A IIdsOQVV\rghgsgs1<<KaKaKcy{|"#
 Yh(XgRTr7L7LMXg( 5
 #"" 9@Lt A
 !D 8 Y L`#(S #"""s-  BZ:Y'Z:	DZ%$Y*
%(Z%Y-"Y-&Z%,Y2>Y2Y2Z%Y7-Y72Y77Y7;B"Z%Y<
(Z%1Y?7BZ%?Z
 C7Z%7Z8BZ%  Z

 Z%&AZ-	Z%6 ZZ%AZ*Z%0 ZZ%Z:!Z#"Z:*Z%-Z%?Z%Z%
Z%#Z:%Z7+Z.,Z73Z:c                   K   t        |        d{   }t        j                  s0| j                   dt	        |d          dt	        |d          d|dS d| j                   d	| j
                   d
|d    dt        j                  |dd       }	 t        j                  t        j                        }|j                  j                  t        j                  dt        d|dg       d{   }dj                  d |j                  D              j!                         }|j"                  j$                  dz  dz  |j"                  j&                  dz  dz  z   }t(        j+                  d| j                  |j"                  j$                  |j"                  j&                  |       ||dS 7 7 # t,        $ rJ}t(        j/                  d       dt1        |      j2                   dt	        |d          d|dcY d}~S d}~ww xY ww)uK   產生簡報。回傳 {brief: 文字, context: 蒐集到的原始資料}。NuC   ,早安!
(API key 未設,只能列原始資料)
今天到期任務:r3   u    個,逾期:r4   u    個。)briefcontextu
   以下是 (u	   )今天 (r2   uE   ) 的個人狀況資料,請寫一份個人化的今日簡報給他:

F   )ensure_asciiindent)api_keyi   r   )roler.   )model
max_tokenssystemmessagesr&   c              3   T   K   | ]   }|j                   d k(  s|j                   " yw)textN)typerx   )r   bs     r!   r"   z'generate_daily_brief.<locals>.<genexpr>   s"     L'7!166V;Kqvv'7s   ((i@B g      @g      .@u.   簡報產出 user=%s tokens=%d/%d cost=US$%.4fu   簡報產生失敗u   (庫柏抽風了:u!   )
手動列出今天到期任務 )ri   r
   ANTHROPIC_API_KEYrV   lenrr   jsondumps	anthropicAsyncAnthropicrv   createCLAUDE_MODEL_SONNETBRIEF_SYSTEM_PROMPTrP   r.   stripusageinput_tokensoutput_tokensloggerinfo	Exception	exceptionry   __name__)r   rl   user_promptclientresponserx   costes           r!   generate_daily_briefr      s    #D))G %% $$% &&&)'+*>&?%@ Agi012';
 
 	
 T&&'q9WW=M<N O:::gE!<
=	? 
))(2L2LM//..&%+>?	 0 
 
 wwLx'7'7LLRRT++i73>(..B^B^ajBjnrArr<x~~::HNN<X<XZ^	
 '22E *,
  
-.(a)9)9(::\]`ahitau]v\ww~
 	

sT   HF,A?HAF1 .F//B<F1 +H/F1 1	H:?G?9H:H?HH)!__doc__r}   loggingr   r   r   r   uuidr   r   
sqlalchemyr   r	   
app.configr
   app.databaser   app.models.channelr   app.models.meetingr   r   r   app.models.taskr   app.models.userr   	getLoggerr   r   dictri   r   r       r!   <module>r      s|      8 8   "  * & I I     
		<	( 0S
 S
 S
l*
T *
d *
r   