§
    ‰eîiW3  ã                   ó¢  — d Z ddlZddlZddlZddlmZmZmZ  ej        e	¦  «        Z
 ej        ¦   «         Zd„ Zd„ Zd„ Zd>d„ZdZd	d
ddddœddddœddddœddddœdddœdœdgdœdœZdedefd„Zd Zd!d"ddddœdd#dœddddœdd$ddœdddœd%œdd&gdœdœZdedefd'„Zd Zd(d)ddddœdd*dœdd+dœddddœd,œg d-¢dœdœZdedefd.„Zd/Zd0d1ddddœdd2dœddddœd3œdd4gdœdœZdedefd5„Z ej        d	d6eeeg dd7d8¬9¦	  «	          ej        d!d6eeeg dd:d8¬9¦	  «	          ej        d(d6eeeg dd;d<¬9¦	  «	          ej        d0d6eeeg dd=d<¬9¦	  «	         dS )?a  Feishu Drive Tools -- document comment operations via Feishu/Lark API.

Provides tools for listing, replying to, and adding document comments.
Uses the same lazy-import + BaseRequest pattern as feishu_comment.py.
The lark client is injected per-thread by the comment event handler.
é    N)ÚregistryÚ
tool_errorÚtool_resultc                 ó   — | t           _        dS )zFStore a lark client for the current thread (called by feishu_comment).N)Ú_localÚclient)r   s    ú9/home/div/.hermes/hermes-agent/tools/feishu_drive_tool.pyÚ
set_clientr
      s   € à…F„M€M€Mó    c                  ó.   — t          t          dd¦  «        S )z7Return the lark client for the current thread, or None.r   N)Úgetattrr   © r   r	   Ú
get_clientr      s   € å•6˜8 TÑ*Ô*Ð*r   c                  ó2   — 	 dd l } dS # t          $ r Y dS w xY w)Nr   TF)Ú	lark_oapiÚImportError)r   s    r	   Ú_check_feishur      s:   € ðØÐÐÐØˆtøÝð ð ð Øˆuˆuðøøøs   ‚ ˆ
•c                 óš  — ddl m} ddlm} ddlm} |dk    r|j        n|j        }	|                     ¦   «          	                    |	¦  «         
                    |¦  «                             |j        h¦  «        }
|r|
                     |¦  «        }
|r|
                     |¦  «        }
|�|
                     |¦  «        }
|
                     ¦   «         }|                      |¦  «        }t%          |dd¦  «        }t%          |dd	¦  «        }i }t%          |d
d¦  «        }|r]t'          |d¦  «        rM	 t)          j        |j        ¦  «        }|                     di ¦  «        }n# t(          j        t2          f$ r Y nw xY w|sJt%          |dd¦  «        }t5          |t6          ¦  «        r|}n!|rt'          |d¦  «        rt9          |¦  «        }|||fS )z?Build and execute a BaseRequest, return (code, msg, data_dict).r   )ÚAccessTokenType)Ú
HttpMethod)ÚBaseRequestÚGETNÚcodeÚmsgÚ ÚrawÚcontentÚdataÚ__dict__)r   r   Úlark_oapi.core.enumr   Ú!lark_oapi.core.model.base_requestr   r   ÚPOSTÚbuilderÚhttp_methodÚuriÚtoken_typesÚTENANTÚpathsÚqueriesÚbodyÚbuildÚrequestr   ÚhasattrÚjsonÚloadsr   ÚgetÚJSONDecodeErrorÚAttributeErrorÚ
isinstanceÚdictÚvars)r   Úmethodr%   r(   r)   r*   r   r   r   r$   r#   r,   Úresponser   r   r   r   Ú	body_jsonÚ	resp_datas                      r	   Ú_do_requestr:   &   s  € à)Ð)Ð)Ð)Ð)Ð)Ø.Ð.Ð.Ð.Ð.Ð.Ø=Ð=Ð=Ð=Ð=Ð=à$*¨e¢O O�*”.�.¸¼€Kð 	×ÒÑÔß	Š�[Ñ	!Ô	!ß	ŠˆS‰Œß	Š�oÔ,Ð-Ñ	.Ô	.ð	 ð ð 'Ø—-’- Ñ&Ô&ˆØð +Ø—/’/ 'Ñ*Ô*ˆØÐØ—,’,˜tÑ$Ô$ˆà�mŠm‰oŒo€Gð �~Š~˜gÑ&Ô&€Hå�8˜V TÑ*Ô*€DÝ
�(˜E 2Ñ
&Ô
&€Cð €DÝ
�(˜E 4Ñ
(Ô
(€CØ
ð �w�s˜IÑ&Ô&ð ð	Ýœ
 3¤;Ñ/Ô/ˆIØ—=’= ¨Ñ,Ô,ˆDˆDøÝÔ$¥nÐ5ð 	ð 	ð 	ØˆDð	øøøàð #Ý˜H f¨dÑ3Ô3ˆ	Ý�i¥Ñ&Ô&ð 	#ØˆDˆDØð 	#�7 9¨jÑ9Ô9ð 	#Ý˜	‘?”?ˆDà��dˆ?Ðs   Ä0/E  Å E9Å8E9z./open-apis/drive/v1/files/:file_token/commentsÚfeishu_drive_list_commentsz[List comments on a Feishu document. Use is_whole=true to list whole-document comments only.ÚobjectÚstringzThe document file token.)ÚtypeÚdescriptionzFile type (default: docx).Údocx)r>   r?   ÚdefaultÚbooleanz-If true, only return whole-document comments.FÚintegerz&Number of comments per page (max 100).éd   zPagination token for next page.)Ú
file_tokenÚ	file_typeÚis_wholeÚ	page_sizeÚ
page_tokenrE   )r>   Ú
propertiesÚrequired)Únamer?   Ú
parametersÚargsÚreturnc                 ó„  — t          ¦   «         }|€t          d¦  «        S |                      dd¦  «                             ¦   «         }|st          d¦  «        S |                      dd¦  «        pd}|                      dd¦  «        }|                      d	d
¦  «        }|                      dd¦  «        }d|fdd	t	          |¦  «        fg}|r|                     d¦  «         |r|                     d|f¦  «         t          |dt          d|i|¬¦  «        \  }	}
}|	dk    rt          d|	› d|
› �¦  «        S t          |¦  «        S )NúFeishu client not availablerE   r   zfile_token is requiredrF   r@   rG   FrH   rD   rI   ©Úuser_id_typeÚopen_id)rG   Útruer   ©r(   r)   r   zList comments failed: code=ú msg=)	r   r   r0   ÚstripÚstrÚappendr:   Ú_LIST_COMMENTS_URIr   )rN   Úkwargsr   rE   rF   rG   rH   rI   r)   r   r   r   s               r	   Ú_handle_list_commentsr]   ƒ   si  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØð 4ÝÐ2Ñ3Ô3Ð3à—’˜ fÑ-Ô-Ð7°€IØ�xŠx˜
 EÑ*Ô*€HØ—’˜ cÑ*Ô*€IØ—’˜,¨Ñ+Ô+€Jð 
�iÐ Ø#Ø	•c˜)‘n”nÐ%ð€Gð
 ð -Ø�ŠÐ+Ñ,Ô,Ð,Øð 3Ø�Š˜ jÐ1Ñ2Ô2Ð2å!Ø�Õ)Ø˜ZÐ(Øðñ ô �O€Dˆ#ˆtð
 ˆq‚y€yÝÐH¸ÐHÐHÀ3ÐHÐHÑIÔIÐIå�tÑÔÐr   zB/open-apis/drive/v1/files/:file_token/comments/:comment_id/repliesÚ!feishu_drive_list_comment_repliesz:List all replies in a comment thread on a Feishu document.z#The comment ID to list replies for.z%Number of replies per page (max 100).)rE   Ú
comment_idrF   rH   rI   r_   c                 ó€  — t          ¦   «         }|€t          d¦  «        S |                      dd¦  «                             ¦   «         }|                      dd¦  «                             ¦   «         }|r|st          d¦  «        S |                      dd¦  «        pd}|                      dd	¦  «        }|                      d
d¦  «        }d|fddt	          |¦  «        fg}|r|                     d
|f¦  «         t          |dt          ||dœ|¬¦  «        \  }	}
}|	dk    rt          d|	› d|
› �¦  «        S t          |¦  «        S )NrQ   rE   r   r_   z&file_token and comment_id are requiredrF   r@   rH   rD   rI   rR   r   ©rE   r_   rV   r   zList replies failed: code=rW   )	r   r   r0   rX   rY   rZ   r:   Ú_LIST_REPLIES_URIr   )rN   r\   r   rE   r_   rF   rH   rI   r)   r   r   r   s               r	   Ú_handle_list_repliesrc   Î   sf  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØ—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØð D˜Zð DÝÐBÑCÔCÐCà—’˜ fÑ-Ô-Ð7°€IØ—’˜ cÑ*Ô*€IØ—’˜,¨Ñ+Ô+€Jð 
�iÐ Ø#Ø	•c˜)‘n”nÐ%ð€Gð
 ð 3Ø�Š˜ jÐ1Ñ2Ô2Ð2å!Ø�Õ(Ø'°zÐBÐBØðñ ô �O€Dˆ#ˆtð
 ˆq‚y€yÝÐG°tÐGÐGÀ#ÐGÐGÑHÔHÐHå�tÑÔÐr   Úfeishu_drive_reply_commentz£Reply to a local comment thread on a Feishu document. Use this for local (quoted-text) comments. For whole-document comments, use feishu_drive_add_comment instead.zThe comment ID to reply to.z6The reply text content (plain text only, no markdown).)rE   r_   r   rF   )rE   r_   r   c                 óB  — t          ¦   «         }|€t          d¦  «        S |                      dd¦  «                             ¦   «         }|                      dd¦  «                             ¦   «         }|                      dd¦  «                             ¦   «         }|r|r|st          d¦  «        S |                      dd¦  «        pd}dd	d
d|idœgii}t	          |dt
          ||dœd|fg|¬¦  «        \  }}	}
|dk    rt          d|› d|	› �¦  «        S t          d|
¬¦  «        S )NrQ   rE   r   r_   r   z0file_token, comment_id, and content are requiredrF   r@   ÚelementsÚtext_runÚtext)r>   rg   r"   ra   )r(   r)   r*   r   zReply comment failed: code=rW   T©Úsuccessr   )r   r   r0   rX   r:   Ú_REPLY_COMMENT_URIr   )rN   r\   r   rE   r_   r   rF   r*   r   r   r   s              r	   Ú_handle_reply_commentrl     sd  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØ—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØ�hŠh�y "Ñ%Ô%×+Ò+Ñ-Ô-€GØð N˜Zð N¨wð NÝÐLÑMÔMÐMà—’˜ fÑ-Ô-Ð7°€Ið 	Øà&Ø!'¨Ð 1ðð ðð
ð	€Dõ "Ø�Õ*Ø'°zÐBÐBØ˜yÐ)Ð*Øð	ñ ô �O€Dˆ#ˆtð ˆq‚y€yÝÐH¸ÐHÐHÀ3ÐHÐHÑIÔIÐIå˜t¨$Ð/Ñ/Ô/Ð/r   z2/open-apis/drive/v1/files/:file_token/new_commentsÚfeishu_drive_add_commentz˜Add a new whole-document comment on a Feishu document. Use this for whole-document comments or as a fallback when reply_comment fails with code 1069302.z8The comment text content (plain text only, no markdown).)rE   r   rF   r   c                 óÞ  — t          ¦   «         }|€t          d¦  «        S |                      dd¦  «                             ¦   «         }|                      dd¦  «                             ¦   «         }|r|st          d¦  «        S |                      dd¦  «        pd}|d|d	œgd
œ}t	          |dt
          d|i|¬¦  «        \  }}}	|dk    rt          d|› d|› �¦  «        S t          d|	¬¦  «        S )NrQ   rE   r   r   z#file_token and content are requiredrF   r@   rh   )r>   rh   )rF   Úreply_elementsr"   )r(   r*   r   zAdd comment failed: code=rW   Tri   )r   r   r0   rX   r:   Ú_ADD_COMMENT_URIr   )
rN   r\   r   rE   r   rF   r*   r   r   r   s
             r	   Ú_handle_add_commentrq   ]  s"  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØ�hŠh�y "Ñ%Ô%×+Ò+Ñ-Ô-€GØð A˜Wð AÝÐ?Ñ@Ô@Ð@à—’˜ fÑ-Ô-Ð7°€Ið à WÐ-Ð-ð
ðð €Dõ "Ø�Õ(Ø˜ZÐ(Øðñ ô �O€Dˆ#ˆtð
 ˆq‚y€yÝÐF°dÐFÐFÀÐFÐFÑGÔGÐGå˜t¨$Ð/Ñ/Ô/Ð/r   Úfeishu_drivezList document commentsu   ðŸ’¬)	rL   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_envÚis_asyncr?   ÚemojizList comment replieszReply to a document commentu   âœ‰ï¸�zAdd a whole-document comment)NNN) Ú__doc__r.   ÚloggingÚ	threadingÚtools.registryr   r   r   Ú	getLoggerÚ__name__ÚloggerÚlocalr   r
   r   r   r:   r[   Ú!FEISHU_DRIVE_LIST_COMMENTS_SCHEMAr4   rY   r]   rb   Ú FEISHU_DRIVE_LIST_REPLIES_SCHEMArc   rk   ÚFEISHU_DRIVE_REPLY_SCHEMArl   rp   ÚFEISHU_DRIVE_ADD_COMMENT_SCHEMArq   Úregisterr   r   r	   ú<module>r‡      s~  ððð ð €€€Ø €€€Ø Ð Ð Ð à <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <à	ˆÔ	˜8Ñ	$Ô	$€ð 
ˆŒÑ	Ô	€ðð ð ð
+ð +ð +ð
ð ð ð.ð .ð .ð .ðj FÐ ð )ð	Bð ð !Ø9ðð ð
 !Ø;Ø!ðð ð "ØNØ ðð ð "ØGØðð ð !Ø@ðð ð)
ð 
ð2 "�Nð7ð ð#%ð #%Ð !ðL  ð  °3ð  ð  ð  ð  ðN YÐ ð 0ØOàð !Ø9ðð ð
 !ØDðð ð
 !Ø;Ø!ðð ð "ØFØðð ð !Ø@ðð ð'
ð 
ð0 " <Ð0ð5ð ð$ð $Ð  ðD˜tð °#ð ð ð ð ðJ ZÐ ð )ð	Mð
 ð !Ø9ðð ð
 !Ø<ðð ð
 !ØWðð ð
 !Ø;Ø!ðð ð
ð 
ð& <Ð;Ð;ð+ð ðð Ð ðB!0 ð !0°3ð !0ð !0ð !0ð !0ðP HÐ ð 'ð	1ð
 ð !Ø9ðð ð
 !ØYðð ð
 !Ø;Ø!ðð ð
ð 
ð " 9Ð-ð#ð ð#ð #Ð ð:0˜dð 0°ð 0ð 0ð 0ð 0ðD €Ô Ø	%ØØ,Ø!ØØØØ(Ø
ð
ñ 
ô 
ð 
ð €Ô Ø	,ØØ+Ø ØØØØ&Ø
ð
ñ 
ô 
ð 
ð €Ô Ø	%ØØ$Ø!ØØØØ-Ø
ð
ñ 
ô 
ð 
ð €Ô Ø	#ØØ*ØØØØØ.Ø
ð
ñ 
ô 
ð 
ð 
ð 
r   