§
    PL
j4  ã                   ó¢  — 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    ú;/home/kuhnn/.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                  ót   — dd l } 	 | j                             d¦  «        d uS # t          t          f$ r Y dS w xY w)Nr   Ú	lark_oapiF)Úimportlib.utilÚutilÚ	find_specÚImportErrorÚ
ValueError)Ú	importlibs    r	   Ú_check_feishur      sW   € ð ÐÐÐðØŒ~×'Ò'¨Ñ4Ô4¸DÐ@Ð@øÝÐ$ð ð ð Øˆuˆuðøøøs   †" ¢7¶7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(   r1   Ú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Ø
ð ws˜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)rC   rD   Ú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_tokenrJ   )rC   Ú
propertiesÚrequired)ÚnamerD   Ú
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 availablerJ   r    zfile_token is requiredrK   rE   rL   FrM   rI   rN   ©Úuser_id_typeÚopen_id)rL   Útruer   ©r-   r.   r   zList comments failed: code=ú msg=)	r   r   r5   ÚstripÚstrÚappendr?   Ú_LIST_COMMENTS_URIr   )rS   Úkwargsr   rJ   rK   rL   rM   rN   r.   r   r   r#   s               r	   Ú_handle_list_commentsrb   …   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).)rJ   Ú
comment_idrK   rM   rN   rd   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 )NrV   rJ   r    rd   z&file_token and comment_id are requiredrK   rE   rM   rI   rN   rW   r   ©rJ   rd   r[   r   zList replies failed: code=r\   )	r   r   r5   r]   r^   r_   r?   Ú_LIST_REPLIES_URIr   )rS   ra   r   rJ   rd   rK   rM   rN   r.   r   r   r#   s               r	   Ú_handle_list_repliesrh   Ð   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).)rJ   rd   r"   rK   )rJ   rd   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 )NrV   rJ   r    rd   r"   z0file_token, comment_id, and content are requiredrK   rE   ÚelementsÚtext_runÚtext)rC   rl   r'   rf   )r-   r.   r/   r   zReply comment failed: code=r\   T©Úsuccessr#   )r   r   r5   r]   r?   Ú_REPLY_COMMENT_URIr   )rS   ra   r   rJ   rd   r"   rK   r/   r   r   r#   s              r	   Ú_handle_reply_commentrq     sd  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØ—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØhŠhy "Ñ%Ô%×+Ò+Ñ-Ô-€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).)rJ   r"   rK   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 )NrV   rJ   r    r"   z#file_token and content are requiredrK   rE   rm   )rC   rm   )rK   Úreply_elementsr'   )r-   r/   r   zAdd comment failed: code=r\   Trn   )r   r   r5   r]   r?   Ú_ADD_COMMENT_URIr   )
rS   ra   r   rJ   r"   rK   r/   r   r   r#   s
             r	   Ú_handle_add_commentrv   _  s"  € Ý‰\Œ\€FØ€~ÝÐ7Ñ8Ô8Ð8à—’˜,¨Ñ+Ô+×1Ò1Ñ3Ô3€JØhŠhy "Ñ%Ô%×+Ò+Ñ-Ô-€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   ðŸ’¬)	rQ   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_envÚis_asyncrD   ÚemojizList comment replieszReply to a document commentu   âœ‰ï¸zAdd a whole-document comment)NNN) Ú__doc__r3   ÚloggingÚ	threadingÚtools.registryr   r   r   Ú	getLoggerÚ__name__ÚloggerÚlocalr   r
   r   r   r?   r`   Ú!FEISHU_DRIVE_LIST_COMMENTS_SCHEMAr9   r^   rb   rg   Ú FEISHU_DRIVE_LIST_REPLIES_SCHEMArh   rp   ÚFEISHU_DRIVE_REPLY_SCHEMArq   ru   ÚFEISHU_DRIVE_ADD_COMMENT_SCHEMArv   Ú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   