
    `i^                     ^   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ erd d	lmZ  ee          Zd
Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )    N)Path)ListDictTupleOptionalTYPE_CHECKING)	GeminiLLM)ObsidianIndexer)WebSearchTool)setup_logger)get_current_time_str)ChromaVectorStorea  You are Butler (Obsidian Edition), an intelligent knowledge assistant connected to the user's second brain.
Current Time: {current_time}

Your Role:
You are NOT a health assistant. You are a Knowledge Partner designed to help the user think, write, and communicate. You draw directly from the user's local Obsidian notes, values, and methodology.

Core Capabilities:
1. Writing: You mimic the user's unique writing style (as defined in `writing_style.md`).
2. Communication: You draft high-EQ, logically rigorous replies for professional contexts (as defined in `REPLY-SAMPLE.md`).
3. Decision: You act as a "Devil's Advocate" and strategic advisor using the user's decision frameworks (GPA, IPO).

Guidelines:
- **Style Alignment**: Strictly adhere to the tone and sentence structures found in the provided samples.
- **Data Source**: Rely primarily on the provided context (RAG) and loaded markdown files.
- **Identity**: You are pragmatic, rational, and value "technological optimism" and "intellectual honesty".
c                   T    e Zd Z	 ddeded         fdZdedefdZdd
ededefdZ	dS )BaseGeneratorNindexervector_storer   c                 `   t                               t                                }t          |          | _        || _        || _        t          j        	                    t          j        	                    t          j        	                    t                                        | _        d S )N)current_time)system_instruction)OBSIDIAN_SYSTEM_PROMPTformatr   r	   llmr   r   ospathdirname__file__workspace_root)selfr   r   formatted_prompts       6/root/projects/butler/slack_bot/obsidian/generators.py__init__zBaseGenerator.__init__"   s|    
 288FZF\F\8]]0@AAA( goobgoobgooh>W>W.X.XYY    filenamereturnc                 >   t           j                            | j        |          }	 t	          |dd          5 }|                                cddd           S # 1 swxY w Y   dS # t          $ r+}t                              d| d|            Y d}~dS d}~ww xY w)z%Reads a file from the workspace root.rzutf-8)encodingNzFailed to read z:  )	r   r   joinr   openread	Exceptionloggererror)r   r#   r   fes        r    
_read_filezBaseGenerator._read_file-   s    w||D/::	dC'222  avvxx                                    	 	 	LL:8::q::;;;22222	s:   A' AA' AA' !A"A' '
B1 BB   querytop_kc                    | j         dS 	 | j                             ||          }n5# t          $ r(}t                              d|            Y d}~dS d}~ww xY w|sdS dg}|D ]s}|                    dt          |j                  j         d|j	         d           |j
        dd	         }|                    |           |                    d           td
                    |          S )a  Run semantic search against the vector store and format results.

        Args:
            query: Search query text.
            top_k: Maximum number of chunks to retrieve.

        Returns:
            Formatted string block, or empty string if no results.
        Nr(   r4   z_semantic_search failed: z%=== SEMANTIC KNOWLEDGE FROM VAULT ===[z / ]i  
)r   search_knowledger,   r-   warningappendr   source_pathnameheader_hierarchytextr)   )r   r3   r4   resultsr0   linesr&   
chunk_texts           r    _semantic_searchzBaseGenerator._semantic_search7   s    $2	'88e8LLGG 	 	 	NN:q::;;;22222	  	289 	 	ALLOT!-005OO!:LOOOPPPJLL$$$LLyys   ( 
AAA)N)r2   )
__name__
__module____qualname__r
   r   r!   strr1   intrD    r"   r    r   r   !   s         7;	Z 	Z 	Z 23	Z 	Z 	Z 	Z3 3       c  #  c            r"   r   c            	       J    e Zd Zdedee         deeee         f         fdZdS )WritingAssistant
user_inputhistoryr$   c                 d   t          |          dk    }|rQ|                    dd          }|d                                         }t          |          dk    r|d                                         nd}| j                            d          }d                    |          }| j                            |d	          }	d                    |	          }
|                     d
          }|                     d          }|                     d          }|                     |d          }d| d| d| d| d|
 d| d| d| d}t          
                    d|            |}n!t          
                    d|            |}|}| j                            ||          \  }}|r?d| d}t          
                    d           | j                            |g           \  }}n|}|                                }|                    d|d           |                    d|d           ||fS )Nr   |   r(   r2   count

   limitzwriting_style.mdmethodology.mdPOWELL_REVISE.mdr6   zYou are a ghostwriter for the user. Your goal is to write an article on the TOPIC provided.

            === YOUR IDENTITY & METHODOLOGY ===
            z;

            === YOUR WRITING STYLE GUIDE ===
            z`

            === ANTI-AI-TONE GUIDE (APPLY WHILE WRITING, NOT JUST AT THE END) ===
            zI

            === YOUR WRITING SAMPLES (MIMIC THIS TONE) ===
            zE

            === RELEVANT NOTES FROM OBSIDIAN VAULT ===
            

            z.

            === TASK ===
            Topic: z
            Extra Context: z

            Write the article in Chinese (unless the topic implies English).
            Adhere strictly to the "Identity" and "Style Guide".
            zGenerating article for topic: zFollow-up instruction: uk  You are a strict editor. A draft article has been written. Your ONLY job is to remove AI tone. Do NOT change facts or add new content.

=== TONE TARGET (最高优先级) ===
目标语感：像一个懂行的人在跟朋友聊天时随口说的。不端着，也不刻意耍帅。
两种AI味都要杀：
- 正式AI味：过渡词堆砌、排比对仗、空洞修饰、鸡汤结尾
- 油腻AI味：刻意装随意（"折腾去吧"）、强行造金句（"搞坏了不心疼，跑通了就是资产"）、给普通概念起酷名字（"隔离舱"、"暴力碰撞"、"最干净的契约"）、用一句俏皮话收尾装潇洒
正确的语感：平铺直叙，该说什么说什么，说完就停。不需要让读者觉得你很酷。

=== VOCABULARY KILL LIST (逐词扫描，命中即删或换大白话) ===
1. 夸张修饰: 极度脆弱、极其脆弱、毁灭性的、灾难级的、压倒性的、远超想象、不止一个量级、颠覆性的、革命性的、折磨人、天翻地覆、风险极高、瞬间崩断、精疲力竭、真金白银、本质上、其实是、所谓的
2. 大词空转: 范式转移、范式突变、开发范式、数字化容器、数字雇员、温和池架构、非确定性、阅后即焚、毫秒级就绪、毫秒级响应、赋能、底层逻辑、仪式性努力、深刻变革、暴力碰撞、最干净的契约、服务化的潜力、可扩展的执行信用、终极归宿、壁垒、分水岭、沉淀（动词修饰数据/经验时）、云端办公室、命门
3. 鸡汤/口号: 正途、值得跨越、安置灵魂、掌控感、才是王道、苦活累活交给、未来已来、危机就是转机、从玩具变成生产力、把环境变成了资产、安全底线、这才是成熟的做法、才是X的关键、不是建议是必须
4. 概念包装: 裸奔（=没防护）、修路/飙车（=基础工作/高级用法）、提款机（=攻击目标）、隔离舱（=容器）、数字雇员（=脚本）、执行信用（=资源）、云端办公室（=云服务器）、牢笼（=限制）、独立房间（=隔离环境）
5. 油腻收尾: "X去吧"式潇洒收尾、"搞坏了不心疼，跑通了就是Y"式金句、俏皮话总结全文、"把X关在Y里...把Y放在Z上"式排比收尾
6. 伪口语: 说白了、说实话、折腾这玩意儿

=== SENTENCE PATTERN KILL LIST (命中即改写) ===
1. 防御性写法："很多人觉得X，实际上Y"、"有人X，有人已经Y了"、"一部分人在X，另一部分人在Y" → 直接说判断，删掉铺垫
2. 对比式定义（最高优先级，必须逐句扫描）：
   触发词："不是……而是……"、"本质上是"、"其实是"、"所谓的"、"从X变成了Y"、"别把X当Y"、"才是……的区别/关键/核心"
   改写方法：删掉否定/对比框架，直接陈述后半句。具体示例：
   "不是怎么写代码，而是写成什么样才对" → "怎么写代码已经不够用了。更要命的是写成什么样才对"
   "本质上是给AI装导航" → "就是给AI装导航"
   "所谓的技术门槛，从熟练度变成了判断力" → "技术门槛变了。以前拼熟练度，现在拼判断力"
   "其实是经典软件工程的复兴" → "老一套方法论反而活过来了"
   "让AI从聊天框变成运行程序" → "AI不再只是聊天框，它能全天候盯着任务跑"
   "这才是它和ChatGPT的区别" → "ChatGPT你关了浏览器它就停了。这个一直在跑"
   "但这其实是底层模型的能力" → "但那是底层模型的能力"
3. 换皮夸张：用另一个夸张词替换夸张词不算修好 → 换成具体后果
4. 概念包装：给普通事物起酷名字 → 用最朴素的说法
5. 油腻金句：短句对仗、押韵、刻意工整的收尾句 → 删掉或拆成普通句
6. 比喻堆砌：全篇最多1个比喻，多余全删换直说
7. 鸡汤/口号结尾：删除励志或耍帅收尾，给具体建议或直接停
8. 首尾呼应：禁止结尾重复开头
9. 编号分段：线性论述删除序号改自然段落；并列对比可保留
10. 强行总结：删除"综上"/"一句话"式收尾
11. 关键词重复：同一个修辞性词汇全篇只能出现一次
12. 过渡词换皮："第一个要说的是"="首先"，"另一个问题是"="其次" → 直接删掉过渡，开门见山
13. 伪分类二分法："一部分人X，另一部分人Y"、"修路派/飙车派" → 删除分类框架，直接说事实

=== DRAFT TO REVIEW ===
zU

=== OUTPUT ===
Return ONLY the corrected text. No explanation, no meta-commentary.
z4Running second-pass de-AI review on writing draft...userrolecontent	assistant)lensplitstripr   get_writing_samplesr)   searchr1   rD   r-   infor   generate_responsecopyr<   )r   rM   rN   is_first_turnpartstopicextra_contextstyle_samples
style_text	rag_notesrag_textwriting_style_guidemethodologypowell_revise_guidesemantic_contextpromptactual_user_messagedraft_review_promptresponsenew_historys                         r    chatzWritingAssistant.chatT   s   W* 9	 
 $$S!,,E!HNN$$E03E

QE!HNN,,,BM !L<<1<EEM]33J++E+;;I{{9--H"&//2D"E"E//*:;;K"&//2D"E"E#44U!4DD   !  !     " # ( ) * *+  F6 KK@@@AAA"(
 KK>*>>???",F 8--fg>>q  3	.T U. . .M^ KKNOOO(44]BGGKHaaH llnnF7JKKLLLKHEEFFF$$r"   NrE   rF   rG   rH   r   r   r   r{   rJ   r"   r    rL   rL   S   sW        }%s }%T$Z }%E#tDz/<R }% }% }% }% }% }%r"   rL   c            	       J    e Zd Zdedee         deeee         f         fdZdS )ReplyGeneratorrM   rN   r$   c                    t          |          dk    }|r|                     d          }| j                            d          }d                    |          }|                     d          }|                     |d          }d| d	| d
| d
| d| d}	t                              d|            |	}
n!t                              d|            |}
|}	| j        	                    |	|          \  }}|
                                }|                    d|
d           |                    d|d           ||fS )Nr   zREPLY-SAMPLE.mdr2   rR   rT   rX   r6   zYou are an experienced Product/R&D Manager.
            Your task is to draft a reply to a challenging situation.

            === CORE PHILOSOPHY ===
            a}  

            === REPLY GUIDELINES ===
            1. Logic: Be clear and structured (e.g., numbered lists).
            2. Responsibility: Don't take unnecessary blame, but don't shirk core duties. Explain objective causes.
            3. Emotion: Be empathetic but professional.
            4. Conciseness: No fluff.

            === REFERENCE SAMPLES (FEW-SHOT) ===
            rZ   z0

            === THE SITUATION ===
            zr

            Draft a reply. If the context implies a specific role (PM, Dev Lead), assume that role.
            zGenerating reply for query: zFollow-up reply instruction: r[   r\   r_   )r`   r1   r   get_reply_samplesr)   rD   r-   re   r   rf   rg   r<   )r   rM   rN   rh   static_samplesdynamic_samplesdynamic_samples_textrq   rs   rt   ru   ry   rw   rz   s                 r    r{   zReplyGenerator.chat   s   W* (	 !__->??N"l<<1<EEO#);;#?#? //*:;;K#44Zq4II 	    " " # ( )  F0 KKCzCCDDD"( KKD
DDEEE",Fh00AA!llnnF7JKKLLLKHEEFFF$$r"   Nr|   rJ   r"   r    r~   r~      sN        4%s 4%T$Z 4%E#tDz/<R 4% 4% 4% 4% 4% 4%r"   r~   c            	       J    e Zd Zdedee         deeee         f         fdZdS )DecisionSupportrM   rN   r$   c           	      N   t          |          dk    }|r|                     d          }|                     d          }| j                            |d          }d                    |          }d| d| d	| d
| d	}t
                              d|            |}	n!t
                              d|            |}	|}| j                            ||          \  }
}|	                                }|
                    d|	d           |
                    d|
d           |
|fS )Nr   zdecision.mdrX   r2   rV   rT   zYou are a Decision Support Assistant.
            Your goal is to help the user think through a complex decision.

            === DECISION FRAMEWORK ===
            z2

            === CORE PHILOSOPHY ===
            z>

            === RELEVANT CONTEXT FROM NOTES ===
            z7

            === THE DECISION / ISSUE ===
            a  

            === TASK ===
            1. Challenge the premise: Is this the right problem to solve?
            2. Apply the Framework: Use GPA (Goal, Priority, Alternatives) and IPO (Information, People, Objective reasoning) models.
            3. Pre-mortem: What is the worst that could happen?
            4. Provide a recommendation or a set of questions to clarify.
            zAnalyzing decision: z Follow-up decision instruction: r[   r\   r_   )r`   r1   r   rd   r)   r-   re   r   rf   rg   r<   )r   rM   rN   rh   decision_guiderq   rn   ro   rt   ru   ry   rw   rz   s                r    r{   zDecisionSupport.chat  sh   W* "	 !__];;N//*:;;K++Ja+@@I{{9--H 	        F, KK;z;;<<<"(KKG:GGHHH",Fh00AA!llnnF7JKKLLLKHEEFFF$$r"   Nr|   rJ   r"   r    r   r   
  sN        .%s .%T$Z .%E#tDz/<R .% .% .% .% .% .%r"   r   c            	       J    e Zd Zdedee         deeee         f         fdZdS )SearchAnalyzerrM   rN   r$   c           
      ~   ddddddddidgd	d
ddddddddddig d	d
dg}t          |          dk    }|r| j                            |d          }d                    |          }t                              dt          |           d           |D ]:}|                    d          d         }t                              d|            ;d| d| d}	|	}
n|}
|                                }|	                    d|
d           t                              d|            t          d           D ]~}| j                            d!||"          \  }}|rTt                              d#|            |	                    d$d%| d&d           |D ]}|d'         dk    rK|d(                             d          }t          j        |          }|	                    dd)| d           Y|d'         dk    rR|d(                             dd          }| j                            |*          }|	                    dd+| d           	 | j                            d!||"          \  }}||fc S # t"          $ r-}t                              d,|            ||fcY d }~c S d }~ww xY w||fc S ||fS )-Nfunction
search_webzSearch the public web using DuckDuckGo. Use this when the internal notes are insufficient or when you need up-to-date external information.objectr3   stringzThe search query)typedescription)r   
propertiesrequired)r>   r   
parameters)r   r   list_recent_fileszList files in the Obsidian vault that have been modified recently. Use this when the user asks for 'recent updates', 'what's new', or changes in the last X days.daysintegerz#Number of days to check (default 5)rU   )r   r   defaultr   rV   rT   zSearchAnalyzer retrieved z local notes.r9   z - Retrieved: aE  You are an Analyst using Butler (Obsidian Edition).

            === TASK ===
            Answer the user's question.
            CRITICAL: You MUST explicitly cite your sources in the output.

            === STRATEGY ===
            1. first: Check "RELEVANT LOCAL NOTES" provided below.
            2. second: If the notes answer the question, answer directly.
            3. third: If the notes are missing info, ambiguos, or outdated, USE THE `search_web` TOOL to find external info.

            === OUTPUT FORMAT ===
            - Begin with a summary.
            - When stating facts, append the source in brackets, e.g., "The server failed [Source: XLSmart 2025-12-25.md]" or "Market share is 20% [Source: Web Search]".
            - If data comes from BOTH, mention both.

            === RELEVANT LOCAL NOTES ===
            z0

            === USER QUESTION ===
            z
            r[   r\   zAnalyzer thinking on:    r(   )messagecontexttoolszLLM requested tool calls: r_   z[Tool Call Request: r8   r>   argsz!--- TOOL OUTPUT (search_web) ---
)r   z(--- TOOL OUTPUT (list_recent_files) ---
zError in second ReAct loop: )r`   r   rd   r)   r-   re   ra   debugrg   r<   ranger   rf   getr   r   get_recent_filesr,   r.   )r   rM   rN   r   rh   rn   ro   note
first_linert   ru   exec_historyiresponse_text
tool_callstcr3   search_resultr   recent_listrw   r0   s                         r    r{   zSearchAnalyzer.chat<  s   
 #( $q (#(0/A& &' &-I	# 	#  $ #/ $G ("(1/T+,% %' %'
# 
#  %$
L W*  "	-++Ja+@@I{{9--HKKQC	NNQQQRRR! < <!ZZ--a0
:j::;;;;" # ( )  F, #)", ||~~V8KLLMMM9Z99::: q 5	3 5	3A(,(B(B$ )C ) )%M:  .3EEEFFF ##'CjCCC% %   
 %  B&z\11 "6
w 7 7(5(@(G(G %++$*'[M'['[- -    
 F':::!&z~~fa88&*l&C&C&C&N&N$++$*'`S^'`'`- -   
7'+x'A'A " ,# (B ( ($M1
 ),6666  7 7 7LL!C!C!CDDD(,6666666667 %l2222 l**s   #I;;
J2 J-%J2-J2Nr|   rJ   r"   r    r   r   ;  sW        P+s P+T$Z P+E#tDz/<R P+ P+ P+ P+ P+ P+r"   r   c            	       N    e Zd ZdZdedee         deeee         f         fdZdS )DeAIReviserz6Remove AI tone from articles - text-in, text-out mode.rM   rN   r$   c                 8   t          |          dk    }|r|                     d          }| j                            d          }d                    |          }d| d| d| d	}t
                              d
t          |           d           |}n!t
                              d|            |}|}| j                            ||          \  }	}
|	                                }|
                    d|d           |
                    d|	d           |	|fS )Nr   rY   r2   rR   rT   zYou are an expert editor specializing in removing AI-generated tone from articles.

Your task is to revise the article provided by the user to make it sound more human and authentic.

=== REVISION GUIDE ===
zA

=== USER'S AUTHENTIC WRITING SAMPLES (for style reference) ===
z

=== ARTICLE TO REVISE ===
u$  

=== TASK ===
1. Analyze the article and identify AI characteristics (过渡词堆积, 排比对仗, 空洞修饰词等)
2. Rewrite the article following the POWELL_REVISE.md principles
3. Preserve:
   - Original meaning and key information
   - Technical terms and proper nouns
   - Code blocks, lists, and formatting
   - Original language (Chinese/English)
4. Output the revised article directly (no meta-commentary like "Here's the revised version...")

CRITICAL: Output ONLY the revised article text. Do NOT add explanations before or after.
z"DeAI Reviser: Processing article (z chars)z&DeAI Reviser: Follow-up instruction - r[   r\   r_   )r`   r1   r   rc   r)   r-   re   r   rf   rg   r<   )r   rM   rN   rh   rr   rl   rm   rt   ru   ry   rw   rz   s               r    r{   zDeAIReviser.chat  sZ   W* *	  #'//2D"E"E !L<<1<EEM]33J
       F4 KKUS__UUUVVV"( KKMMMNNN",F h00AA! llnnF7JKKLLLKHEEFFF$$r"   N	rE   rF   rG   __doc__rH   r   r   r   r{   rJ   r"   r    r   r     sT        @@8%s 8%T$Z 8%E#tDz/<R 8% 8% 8% 8% 8% 8%r"   r   c            	       N    e Zd ZdZdedee         deeee         f         fdZdS )ZhihuGeneratorzLGenerate Zhihu-style answers based on style guide and user's knowledge base.rM   rN   r$   c                    t          |          dk    }d}|                     d          }|p.d|v p*|                                                    d          pd|v }|r|                    dd          }|d                                         }t          |          dk    r|d                                         nd}	|                     d	          }
|r|
d
z   |z   }
| j                            |d          }d
                    |          }|                     d          }|                     |d          }d| d|
 d| d
| d| d|	 d}t          
                    d|d d          d           |}d}n!t          
                    d|            |}|}|rg n|}| j                            ||          \  }}|}|r?d| d}t          
                    d           | j                            |g           \  }}n|}|                                }|                    d|d           |                    d |d           ||fS )!Nr   Fzzhihu-bot-style.mdrP   u   回答这个问题zzhihu.com/question/rQ   r(   zzhihu-style.mdrT   rU   rV   rX   r2   r6   zYou are answering a Zhihu question. Your goal is to write an authentic, experience-driven answer that sounds like a real human, not AI-generated.

=== YOUR IDENTITY & METHODOLOGY ===
z>

=== ZHIHU STYLE GUIDE (FOLLOW THESE WRITING PRINCIPLES) ===
a  

CRITICAL: The style guide above defines HOW to write (tone, structure, language patterns).
Do NOT treat zhihu-sample content as factual material. It's ONLY for style reference.

=== RELEVANT KNOWLEDGE FROM YOUR OBSIDIAN VAULT (USE AS ACTUAL MATERIAL) ===
z

=== THE QUESTION ===
z

=== YOUR CORE IDEAS ===
u  

=== TASK ===
1. Answer the question based on YOUR knowledge (from Obsidian vault) and core ideas
2. Write in Chinese (unless question implies English)
3. Be direct and opinionated — attach concrete evaluation to every fact (not feature listing)
4. If recent web context is provided, weave it in naturally
5. STRICT: Never add bracket explanations. Write "大语言模型" not "大语言模型（LLM）"
6. No self-promotion, no identity reveal, no past project references
7. No poetry, quotes, or "升华" endings. Stop when the point is made.
8. LENGTH: 500–1000 Chinese characters. Cut a point, not quality.

=== ANTI-AI CORE RULES (apply while writing) ===
- 语感目标：像懂行的人随手打字，不端着，不耍帅
- 禁止：排比对仗、过渡词堆砌（首先/其次/最后）、空洞修饰（深入/全面/显著）
- 禁止：比喻超过1个、概念包装（给普通事物起酷名字）、鸡汤结尾
- 禁止：防御性写法（很多人觉得X但其实Y）、对比式定义（不是X是Y、本质上是、其实是、所谓的、从X变成了Y、才是……的区别/关键）
- 陈述事实时必须附带主观判断，不要纯客观罗列

Begin writing the answer:
zGenerating Zhihu answer for: 2   z...TzFollow-up Zhihu instruction: u  You are a strict editor. A draft Zhihu answer has been written. Your ONLY job is to remove AI tone. Do NOT change facts or add new content.

=== TONE TARGET (最高优先级) ===
目标语感：像一个懂行的人在知乎随手打字回答。不端着，也不刻意耍帅。
两种AI味都要杀：
- 正式AI味：过渡词堆砌、排比对仗、空洞修饰、鸡汤结尾
- 油腻AI味：刻意装随意（"折腾去吧"）、强行造金句（"搞坏了不心疼，跑通了就是资产"）、给普通概念起酷名字（"隔离舱"、"暴力碰撞"、"最干净的契约"）、用一句俏皮话收尾装潇洒
正确的语感：平铺直叙，该说什么说什么，说完就停。不需要让读者觉得你很酷。

=== VOCABULARY KILL LIST (逐词扫描，命中即删或换大白话) ===
1. 夸张修饰: 极度脆弱、极其脆弱、毁灭性的、灾难级的、压倒性的、远超想象、不止一个量级、颠覆性的、革命性的、折磨人、天翻地覆、风险极高、瞬间崩断、精疲力竭、真金白银、本质上、其实是、所谓的
2. 大词空转: 范式转移、范式突变、开发范式、数字化容器、数字雇员、温和池架构、非确定性、阅后即焚、毫秒级就绪、毫秒级响应、赋能、底层逻辑、仪式性努力、深刻变革、暴力碰撞、最干净的契约、服务化的潜力、不可逆的浪潮、时代大背景、可扩展的执行信用、终极归宿、壁垒、分水岭、沉淀（动词修饰数据/经验时）、云端办公室、命门
3. 鸡汤/口号: 正途、值得跨越、安置灵魂、掌控感、才是王道、苦活累活交给、未来已来、危机就是转机、挑战与机遇并存、从玩具变成生产力、把环境变成了资产、安全底线、这才是成熟的做法、才是X的关键、不是建议是必须
4. 概念包装: 裸奔（=没防护）、修路/飙车（=基础工作/高级用法）、提款机（=攻击目标）、隔离舱（=容器）、数字雇员（=脚本）、执行信用（=资源）、云端办公室（=云服务器）、牢笼（=限制）、独立房间（=隔离环境）
5. 油腻收尾: "X去吧"式潇洒收尾、"搞坏了不心疼，跑通了就是Y"式金句、俏皮话总结全文、"把X关在Y里...把Y放在Z上"式排比收尾
6. 伪口语: 说白了、说实话、折腾这玩意儿

=== SENTENCE PATTERN KILL LIST (命中即改写) ===
1. 防御性写法："很多人觉得X，实际上Y"、"有人X，有人已经Y了"、"一部分人在X，另一部分人在Y" → 直接说判断，删掉铺垫
2. 对比式定义（最高优先级，必须逐句扫描）：
   触发词："不是……而是……"、"本质上是"、"其实是"、"所谓的"、"从X变成了Y"、"别把X当Y"、"才是……的区别/关键/核心"
   改写方法：删掉否定/对比框架，直接陈述后半句。具体示例：
   "不是怎么写代码，而是写成什么样才对" → "怎么写代码已经不够用了。更要命的是写成什么样才对"
   "本质上是给AI装导航" → "就是给AI装导航"
   "所谓的技术门槛，从熟练度变成了判断力" → "技术门槛变了。以前拼熟练度，现在拼判断力"
   "其实是经典软件工程的复兴" → "老一套方法论反而活过来了"
   "让AI从聊天框变成运行程序" → "AI不再只是聊天框，它能全天候盯着任务跑"
   "这才是它和ChatGPT的区别" → "ChatGPT你关了浏览器它就停了。这个一直在跑"
   "但这其实是底层模型的能力" → "但那是底层模型的能力"
3. 换皮夸张：用另一个夸张词替换夸张词不算修好 → 换成具体后果
4. 概念包装：给普通事物起酷名字 → 用最朴素的说法
5. 油腻金句：短句对仗、押韵、刻意工整的收尾句 → 删掉或拆成普通句
6. 比喻堆砌：全篇最多1个比喻，多余全删换直说
7. 鸡汤/口号结尾：删除励志或耍帅收尾，给具体建议或直接停
8. 首尾呼应：禁止结尾重复开头
9. 编号分段：线性论述删除序号改自然段落；并列对比可保留
10. 强行总结：删除"综上"/"一句话"式收尾
11. 关键词重复：同一个修辞性词汇全篇只能出现一次
12. 过渡词换皮："第一个要说的是"="首先"，"另一个问题是"="其次" → 直接删掉过渡，开门见山
13. 伪分类二分法："一部分人X，另一部分人Y"、"修路派/飙车派" → 删除分类框架，直接说事实

=== DRAFT TO REVIEW ===
zi

=== OUTPUT ===
Return ONLY the corrected Chinese text. No explanation, no meta-commentary, no English.
z6Running second-pass rule enforcement on Zhihu draft...r[   r\   r_   )r`   r1   rb   
startswithra   r   rd   r)   rD   r-   re   r   rf   rg   r<   )r   rM   rN   rh   built_rich_promptzhihu_bot_styleis_new_questionri   question
core_ideaszhihu_style_guidern   ro   rq   rs   rt   ru   llm_historyrv   rw   
run_reviewrx   ry   rz   s                           r    r{   zZhihuGenerator.chat  s    W*! //*>??  3j 3!!,,-ABB3 %
2	 	  H	  $$S!,,EQx~~''H-0ZZ!^^q)))J !%0@ A A Q$5$>$P! ++HA+>>I{{9--H //*:;;K#44XQ4GG( ( ( ( ( 
( ( ( (" 
#( (( )( ( (FT KKJ"JJJKKK"( $ KKD
DDEEE",F ,8bb8--fkBBq '
 3	.T U. . .M^ KKPQQQ(44]BGGKHaaH llnnF7JKKLLLKHEEFFF$$r"   Nr   rJ   r"   r    r   r     s]        VVb%s b%T$Z b%E#tDz/<R b% b% b% b% b% b%r"   r   )r   pathlibr   typingr   r   r   r   r   slack_bot.llm.geminir	   slack_bot.obsidian.indexerr
   slack_bot.tools.webr   health.utils.logging_configr   health.utils.time_utilsr   slack_bot.obsidian.vector_storer   rE   r-   r   r   rL   r~   r   r   r   r   rJ   r"   r    <module>r      s$   				       = = = = = = = = = = = = = = * * * * * * 6 6 6 6 6 6 - - - - - - 4 4 4 4 4 4 8 8 8 8 8 8 BAAAAAA	h		 "0  0  0  0  0  0  0  0 d~% ~% ~% ~% ~%} ~% ~% ~%@5% 5% 5% 5% 5%] 5% 5% 5%n/% /% /% /% /%m /% /% /%bQ+ Q+ Q+ Q+ Q+] Q+ Q+ Q+h;% ;% ;% ;% ;%- ;% ;% ;%|e% e% e% e% e%] e% e% e% e% e%r"   