+
    „WÝjó  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHtHtHtHt R
 R ltR tRR R lltR R ltR R ltR R ltR R ltR t R t!R t" ! R R4      t#R# )u<  Session lifecycle for the interactive CLI: new/resume/save, undo/retry rewinds, yolo
persistence, manual compression, and exit summary.

Mixin bound onto ``HermesCLI`` via the MRO. cli.py-internal symbols are imported LAZILY
inside each method (``from cli import ...``) â€” never at module load time (import cycle).
)ÚannotationsN©Út©Úget_hermes_home©Únew_session_id)ÚPath)ÚConsole)Úescape)ÚAnyÚDictÚListÚOptionalc               ó    € V ^8„  d   QhRRRR/# )é   ÚhistoryÚlistÚreturnz	list[int]© )Úformats   "ÚPC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\cli_session_mixin.pyÚ__annotate__r      s   € ÷ Zñ Z ð Z¨ñ Zó    c                óœ   € ^ RI Hp ^ RIHp \	        V 4       UUu. uF#  w  r4V! V4      '       d   K  V! V4      f   K!  VNK%  	  upp# u uppi )u    Indices of *real* user turns: excludes ephemeral scaffolding, display_kind timeline
rows and compaction handoffs â€” the same predicate as resume turn counting.)Úuser_originated_turn_view)Ú_is_ephemeral_scaffolding)Úagent.context_compressorr   Úagent.session_persistencer   Ú	enumerate)r   r   r   ÚiÚms   &    r   Ú_user_turn_indicesr"      sT   € õ CÝCô   Ô(ôZÙ(‰dˆaÙ(¨×+ô 	
Ù0IÈ!Ó0L÷ 	
ˆÑ(òZð Zùó Zs   ›A²A¾Ac                ó~   € ^ RI Hp V '       g   V#  VP                  \        V 4      4      #   \         d    Tu # i ; i)zU``datetime.fromtimestamp(value)`` or *default* when the value is missing/unparseable.©Údatetime)Úclir%   ÚfromtimestampÚfloatÚ	Exception)ÚvalueÚdefaultr%   s   && r   Ú_timestamp_orr,   #   s;   € åçØˆðØ×%Ñ%¤e¨E£lÓ3Ð3øÜô ØŠðús   ’, ¬<»<c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚtextÚstrÚlimitÚintr   r   )r   s   "r   r   r   /   s&   € ÷ Dñ D�#ð D˜cð D¨Cñ Dr   c                óŠ   € RP                  V P                  4       4      p \        V 4      V8”  d   V RV^,
           R,           # T # )z>Collapse whitespace and cap to *limit* cells with an ellipsis.Ú Nu   â€¦)ÚjoinÚsplitÚlen)r.   r0   s   &&r   Ú_squashr7   /   s<   € à�8‰8�D—J‘J“LÓ!€DÜ(+¨D«	°EÔ(9ˆ4��%˜!•)Ð˜uÕ$ÐC¸tÐCr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmsgr/   ÚquietÚboolr   ÚNoner   )r   s   "r   r   r   5   s!   € ÷ 9ñ 9˜#ð 9 dð 9¨tñ 9r   c                óŒ   € V'       d   \        V\        P                  R7       R# V P                  R\	        V4       R24       R# )u”   Print a dim notice â€” raw to stderr on quiet (pre-TUI) paths. Module-level so tests can
call the resume helpers unbound against a minimal stand-in.)Úfileú[dim]z[/dim]N)ÚprintÚsysÚstderrÚ_console_printÚ_escape)r&   r9   r:   s   &&&r   Ú_dim_noticerE   5   s0   € ÷ ÜˆcœŸ
™
×#à×Ñ˜U¤7¨3£< .°Ð7Ö8r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsilentr;   r   r<   r   )r   s   "r   r   r   >   s   € ÷ 1Qñ 1Q°ð 1Q¸ñ 1Qr   c                óŠ  € ^ RI HpHpHpHp VP                  R/ 4      p\        V\        4      '       dH   VP                  R4      ;'       g    VP                  R4      ;'       g    RpVP                  RR4      pMT;'       g    RRr‡V! V4      w  ršV	'       d   V	\        V RR4      8X  d   R#  ^ RI	H
p T! T	V P                  ;'       g    RV P                  ;'       g    RV P                  ;'       g    RV P                  ;'       g    RRT;'       g    RR	7      pVP                  '       g   R# V P                   '       dr   \        V R
R4      '       g_   V P                   P                  VP"                  VP$                  VP                  VP                  VP&                  \        VRR4      R7       VP"                  V n        VP$                  V n        VP$                  V n        VP                  V n        VP                  V n        VP                  '       d   VP                  V n        VP                  '       d   VP                  V n        VP&                  '       d   VP&                  V n        V'       g#   V! R\/        RVP"                  R7       24       R# R#   \0         d    TP3                  RRR7        R# i ; i)uD  /new is a full boundary: re-derive model/provider from config.yaml so a
session-only ``/model --session`` switch never leaks into the next session.
Best-effort â€” an unreachable default must never block /new. Module-level helper (like
``_apply_new_session_title``): tests drive ``new_session`` unbound on a SimpleNamespace.)Ú
CLI_CONFIGÚ_cprintÚ_split_model_config_defaultÚloggerÚmodelr+   Ú ÚproviderN)Úswitch_modelF)Ú	raw_inputÚcurrent_providerÚcurrent_modelÚcurrent_base_urlÚcurrent_api_keyÚ	is_globalÚexplicit_providerÚ_gateway_session_openÚruntime_capabilities)Ú	new_modelÚnew_providerÚapi_keyÚbase_urlÚapi_modeÚcapabilitiesú  zcli.session.model_reset_default)rM   z)/new model reset to config default failedT©Úexc_info)r&   rI   rJ   rK   rL   ÚgetÚ
isinstanceÚdictÚgetattrÚhermes_cli.model_switchrP   rO   rM   r]   r\   ÚsuccessÚagentrZ   Útarget_providerr^   Úrequested_providerÚ_explicit_api_keyÚ_explicit_base_urlr   r)   Údebug)r&   rG   rI   rJ   rK   rL   Ú_model_configÚ_raw_defaultÚ_config_providerÚ_config_modelÚ_Ú_switch_modelÚrs   &&           r   Ú_reset_model_to_config_defaultrv   >   s)  € ÷
 MÓLØ—N‘N 7¨BÓ/€MÜ�-¤×&Ò&Ø$×(Ñ(¨Ó3×WÐW°}×7HÑ7HÈÓ7Q×WÐWÐUWˆØ(×,Ñ,¨Z¸Ó<Ñà*7×*=Ð*=¸2ÀÐ&Ù2°<Ó@Ñ€Mß˜M¬W°S¸'À4Ó-HÔHÙð"QÝIáØ#Ø Ÿ\™\×/Ð/¨RØŸ)™)Ÿ/˜/ rØ Ÿ\™\×/Ð/¨RØŸK™K×-Ð-¨2ØØ.×4Ð4°"ô6ˆð �y�yˆyÙð �9�9ˆ9œW SÐ*AÀ5×IÒIØ�I‰I×"Ñ"ØŸ+™+°A×4EÑ4EÈqÏyÉyØŸ™¨a¯j©jÜ$ QÐ(>ÀÓEð #ô Gð —K‘KˆŒ	Ø×(Ñ(ˆŒØ!"×!2Ñ!2ˆÔØ !§	¡	ˆÔØ!"§¡ˆÔØ�9�9ˆ9ØŸ)™)ˆCŒKØ�:�:ˆ:ØŸ:™:ˆCŒLØ�:�:ˆ:ØŸ:™:ˆCŒLßÙ�bœÐ<ÀAÇKÁKÔPÐQÐRÖSñ øäô QØ�‰Ð@È4ˆ×PðQúsU   Â0J  ÃJ  Ã!J  Ã6J  ÄJ  ÄJ  Ä3J  ÅCJ  È"J  É "J  É#J  É< J  Ê KËKc               ó    € V ^8„  d   QhRRRR/# )r   Útitler/   r   úOptional[str]r   )r   s   "r   r   r   r   s   € ÷ ñ ¨ð °ñ r   c           	     ó¾  € ^ RI Hp ^ RIHp  VP	                  V4      pT'       g   T! R\        R4       24       R#  T P                  P                  T P                  T4       RT n        R	T n        T#   \
         d"   pT! R\        RTR7       24        Rp?R# Rp?ii ; i  \
         d"   pT! R\        RTR7       24        Rp?R# Rp?i\         d     R# i ; i)
zMSanitize + persist a /new title; returns the stored title or None (untitled).©rJ   ©Ú	SessionDBr`   zcli.session.title_rejected©ÚerrorNz cli.session.title_empty_untitledz cli.session.title_error_untitledg        )r&   rJ   Úhermes_stater}   Úsanitize_titleÚ
ValueErrorr   Ú_session_dbÚset_session_titleÚ
session_idr)   Ú_pending_titleÚ_status_bar_title_checked_at)r&   rx   rJ   r}   Ú	sanitizedÚes   &&    r   Ú_apply_new_session_titlerŠ   r   sÔ   € åÝ&ðØ×,Ñ,¨UÓ3ˆ	÷ Ù�"”QÐ9Ó:Ð;Ð<Ô=ÙðØ�‰×)Ñ)¨#¯.©.¸)ÔDð €CÔØ'*€CÔ$ØÐøô ô Ù�"”QÐ3¸1Ô=Ð>Ð?Ô@Ýûðûô ô Ù�"”QÐ9ÀÔCÐDÐEÔFÝûÜô Úðús:   ŽA4 ¾&B# Á4B Á?BÂB Â#CÂ.C
Ã
CÃCÃCc               ó   € V ^8„  d   QhRR/# ©r   r   r<   r   )r   s   "r   r   r   Š   s   € ÷ uñ u $ñ ur   c                ót   € \        \        V 4      R8X  d   \        R4      4       R# \        RV R7      4       R# )zdA gateway's ``/save`` refusal: ``not_found`` (no stored conversation yet) is main's nothing-to-save.Ú	not_foundúcli.session.save_nothingúcli.session.save_failedr~   N)r@   r/   r   r~   s   &r   Ú_print_save_refusalr‘   Š   s)   € ä	¬3¨u«:¸Ô+DŒ!Ð&Ó
'ÖtÌ!ÐLeÐmrÔJsÖtr   c                ó˜  € ^ RI HpHp  V P                  RWVR7      ;'       g    / P	                  R4      p\        T\        4      '       g   \        \        RRR	7      4       R# T#   T d\   p\        Y†4      '       d"   TP                  R
8X  g"   \        T4      R8X  g   \        T4        Rp?R# \        YY#T4        Rp?R# Rp?ii ; i)añ  The owner's ``/save`` rendering of its stored row (``session.export``: the snapshot ``hermes
sessions export`` writes, with title, metadata and archived rows), never this process's
in-memory history. Nothing is written on the gateway host, so a remote owner's disk is never
taken for this machine's. None when refused (printed), and also None when an older gateway
without ``session.export`` was handed to ``_save_on_older_gateway`` (which may save on the
gateway host and prints its own outcome).)ÚGatewayClientErrorÚGatewayRPCErrorzsession.export)r…   r   ÚredactÚcontentÚunknown_methodNr�   zthe gateway returned no exportr~   i§€ÿÿ)Úhermes_cli.gateway_clientr“   r”   Úcallrc   rd   Úcoder/   r‘   Ú_save_on_older_gatewayr@   r   )	Ú
connectionr…   ÚfmtÚfilenamer•   r“   r”   r–   r‰   s	   &&&&&    r   Ú_export_on_gatewayrŸ   �   s¶   € ÷ NðØ—?‘?Ð#3À
Ø*0ð #ó 2÷ 8ð 8Ø57¿¹¸Y»ð 	ô �gœs×#Ò#ÜŒaÐ)Ð1QÔRÔSÙØ€Nøð ô Ü˜1×.Ò.°A·F±F¸fÔ4DÌÈAËÐRbÔHbÜ Ô"ÝÜ˜z°sÀfÔMÝûðús"   ŠA' ¥A' Á'C	Á.=CÂ1CÃC	c                óF  € ^ RI Hp V'       g   VR8w  g	   V'       d   \        R4       R#  V P                  RVR7      ;'       g    / P	                  R4      p\        T'       d   RT 24       R# \        R	R
R7      4       R#   T d   p\        T4        Rp?R# Rp?ii ; i)z±An owner without ``session.export``: its ``session.save`` writes default-named, unredacted
JSON on the gateway host, so only a plain ``/save json`` may use it (as Desktop does).)r“   Újsonzu(._.) This gateway predates this CLI: only a plain /save json works until it restarts (it saves on the gateway host).Nzsession.save©r…   r>   z/(^_^)v Conversation saved on the gateway host: r�   zthe gateway returned no filer~   )r˜   r“   r@   r™   rc   r‘   r   )rœ   r…   r�   rž   r•   r“   Úsavedr‰   s   &&&&&   r   r›   r›   ¦   s“   € õ =ß�˜”§(Üð 0ô 	1áðØ—‘ ¸J�ÓG×MÐMÈ2×RÑRÐSYÓZˆô 
ÇuÐ;¸E¸7Ð
Cö SÜÐ*Ð2PÔQöSøð ô Ü˜AÔÝûðús   ¬B ÁB ÂB Â
BÂB c           	     ób  € ^ RI Hp \        4       R,          R,          p VP                  RRR7       T'       dM   \        T4      P                  4       pTP                  4       '       g   \        P                  ! 4       T,          pM.TP                  4       P                  R	4      pTR
T RT 2,          p T! 4       p	\        TRRR7      ;_uu_ 4       p
T
P                  T	4       RRR4       RRR\        R4      RR/T,          p\        \        RY{R7      4       T '       d   \        R\        RT R7       24       R# R#   \         d"   p\        \        RYVR7      4        Rp?R# Rp?ii ; i  + '       g   i     L’; i  \         d"   p\        \        RTR7      4        Rp?R# Rp?ii ; i)z¤Write a ``/save`` export on this machine: ``filename`` as typed (relative to the cwd), else
``sessions/saved/hermes_conversation_<ts>.<fmt>`` under this CLI's home.r$   Úsessionsr£   T)ÚparentsÚexist_okzcli.session.save_dir_failed©Úpathr   Nz%Y%m%d_%H%M%SÚhermes_conversation_Ú.Úwzutf-8)Úencodingr¡   ÚJSONÚmdzcli.session.format_markdownÚhtmlÚHTMLzcli.session.save_ok)r©   Úlabelz       zcli.session.save_resume_hintr¢   r�   r~   )r&   r%   r   ÚmkdirÚOSErrorr@   r   r	   Ú
expanduserÚis_absoluteÚcwdÚnowÚstrftimeÚopenÚwriter)   )r…   r�   rž   Úrenderr%   Ú	saved_dirr‰   r©   Ú	timestampr–   Úfr²   s   &&&&        r   Ú_write_saverÀ   ·   sb  € õ ÜÓ! JÕ.°Õ8€IðØ�‰ ¨tˆÔ4÷ Ü�H‹~×(Ñ(Ó*ˆØ×Ñ×!Ò!Ü—8’8“: Õ$ˆDøà—L‘L“N×+Ñ+¨OÓ<ˆ	ØÐ1°)°¸A¸c¸UÐCÕCˆð	5Ù“(ˆÜ�$˜ g×.Õ.°!Ø�G‰G�GÔ÷ /à˜ ¤qÐ)FÓ'GÈÐQWÐXÐY\Õ]ˆÜŒaÐ%¨DÔ>Ô?ßÜ�GœAÐ<ÈÔTÐUÐVÖWñ øô# ô ÜŒaÐ-°IÔGÔHÝûðú÷ /×.ûô ô 5ÜŒaÐ)°Ô3×4Ò4ûð5úsH    E  Â6F ÃE/Ã%AF Å E,ÅE'Å'E,Å/E?	Å:F ÆF.ÆF)Æ)F.c                  ót  € ] tR t^ÕtRtRR/R R lltRR/R R lltR R	 ltR
 R ltR t	R t
R8R R lltRRR^
/R R lltR tR R ltR R ltRR/R R lltR9R ltR R  ltR:R! R" lltR# R$ ltR% tR;R& R' llt]R( R) l4       tR* R+ ltR, R- ltR. tR<R/ R0 lltR1 R2 ltR3 tR4 tR=R5 R6 llt R7t!R# )>ÚCLISessionMixinz‡Session lifecycle for the interactive CLI: new/resume/save, undo/retry rewinds, yolo
persistence, manual compression, and exit summary.r:   Fc               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úsession_metare   r:   r;   r   r<   r   )r   s   "r   r   ÚCLISessionMixin.__annotate__Ù   s"   € ÷ &ñ &°ð &Àð &ÐRVñ &r   c               óÒ  € T;'       g    / P                  R4      pV'       g   R# \        P                  P                  \	        V4      4      p \        P
                  ! 4       pV'       dD   \        P                  P                  V4      \        P                  P                  V4      8X  d   R# \        P                  P                  V4      '       g   \        RY4;'       g    RR7      pM7 \        P                  ! V4       V\        P                  R&   \        RVR7      p\        WV4       R#   \         d    Rp LÜi ; i  \         d   p\        R	Y6R
7      p Rp?L>Rp?ii ; i)aŒ  Relaunch a resumed session in the directory it was started from.

Idempotent; called from every resume path. Both ``os.chdir()`` and ``TERMINAL_CWD``
are retargeted so the process and the terminal/code-exec tools agree (the local
terminal backend snapshots cwd on first use, after this). No-op when no cwd was
recorded, the directory is gone (dim warning, never a crash), or we're already there.
r·   Nzcli.session.cwd_goner«   )ÚrecordedÚcurrentÚTERMINAL_CWDzcli.session.cwd_restored)r©   zcli.session.cwd_enter_failedr¨   )rc   Úosr©   rµ   r/   Úgetcwdr´   ÚrealpathÚisdirr   ÚchdirÚenvironrE   )ÚselfrÅ   r:   rÈ   rÉ   r9   r‰   s   &&$    r   Ú_restore_session_cwdÚ$CLISessionMixin._restore_session_cwdÙ   s  € ð !×&Ð& B×+Ñ+¨EÓ2ˆßÙÜ—7‘7×%Ñ%¤c¨(£mÓ4ˆð	Ü—i’i“kˆG÷ ”r—w‘w×'Ñ'¨Ó1´R·W±W×5EÑ5EÀgÓ5NÔNÙÜ�w‰w�}‰}˜X×&Ò&ÜÐ*°XÇ~À~ÐRUÔV‰CðPÜ—’˜Ô"Ø-5”—
‘
˜>Ñ*ÜÐ2¸ÔB�ô 	�D˜uÖ%øô ô 	ØŠGð	ûô ô PÜÐ6¸XÔO•ûðPús*   ÁD1 Ã-6E Ä1EÅ EÅE&ÅE!Å!E&c               ó$   € V ^8„  d   QhRRRRRR/# rÄ   r   )r   s   "r   r   rÆ   ö   s'   € ÷ Eñ E°$ð EÀ$ð EÐSWñ Er   c               ó²   € ^ RI Hp ^ RIHp T! V P                  ;'       g    RVP                  V4      4      '       d   \        V \        R4      V4       R# R# )zXRe-arm the session row's persisted /yolo on every resume path (``tools.approval_yolo``).r|   )Úrestore_session_yolor+   zcli.session.yolo_restoredN)r€   r}   Útools.approval_yolorÖ   r…   Úsession_yolo_enabledrE   r   )rÑ   rÅ   r:   r}   rÖ   s   &&$  r   Ú_restore_session_yoloÚ%CLISessionMixin._restore_session_yoloö   sE   € å*Ý<Ù §¡× <Ð <°9¸i×>\Ñ>\Ð]iÓ>j×kÒkÜ˜œaÐ ;Ó<¸eÖDñ lr   c               ó   € V ^8„  d   QhRR/# )r   r   z	list[str]r   )r   s   "r   r   rÆ   ý   s   € ÷ 8ñ 8¸9ñ 8r   c           	     óV  € ^ RI Hp ^ RIHp V! 4       p\	        VRRR\
        P                  ! R	4      P                  R7      pV! 4       ;_uu_ 4        VP                  V4       RRR4       VP                  4       P                  R4      P                  4       #   + '       g   i     L=; i)
zHRender the resume panel at the current terminal width for resize replay.)Ú_suspend_output_history)ÚStringIOTÚ	truecolorF)r>   Úforce_terminalÚcolor_systemÚ	highlightÚwidthNÚ
)éP   é   )r&   rÝ   ÚiorÞ   r
   ÚshutilÚget_terminal_sizeÚcolumnsr@   ÚgetvalueÚrstripÚ
splitlines)rÑ   ÚpanelrÝ   rÞ   ÚbufÚconsoles   &&    r   Ú"_render_resume_history_panel_linesÚ2CLISessionMixin._render_resume_history_panel_linesý   s{   € å/Ýá‹jˆÜØ T¸ÈuÜ×*Ò*¨8Ó4×<Ñ<ô>ˆñ %×&Õ&Ø�M‰M˜%Ô ÷ 'à�|‰|‹~×$Ñ$ TÓ*×5Ñ5Ó7Ð7÷ '×&ús   ÁBÂB(	c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrefr/   Úcheckpointsr   r   z
str | Noner   )r   s   "r   r   rÆ   
  s!   € ÷ 	ñ 	¨3ð 	¸Tð 	Àjñ 	r   c           	     óê   €  \        V4      ^,
          p^ Tu;8:  d   \        T4      8  d   M MY#,          R,          # \        R\	        R\        T4      R7       24       R#   \         d    Tu # i ; i)zCResolve a 1-indexed checkpoint number (or pass through a git hash).Úhashr`   zcli.session.invalid_checkpoint©ÚcountN)r1   r‚   r6   r@   r   )rÑ   rô   rõ   Úidxs   &&& r   Ú_resolve_checkpoint_refÚ'CLISessionMixin._resolve_checkpoint_ref
  sl   € ð	Ü�c“(˜Q•,ˆCð �Ö&”c˜+Ó&×&ØÕ# FÕ+Ð+Ü�”1Ð5¼SÀÓ=MÔNÐOÐPÔQÙøô ô 	ØŠJð	ús   ‚A" Á"A2Á1A2c                ó   € ^ RI Hp ^ RIHp V! V 4      pVe   VP	                  4       MRp\
        P                  P                  R4      R8X  g	   Ve   Vf   \        R4      pMkVe)   \        R\        VR,          ;'       g    . 4      R	7      pM?V! V P                  V P                  R
R7      p\        RV'       d   \        V4      M^ R	7      pRV P                  9   d#   V P                  P                  R4      R+,          MV P                  p\        V4      ^8”  d   VR,          R,           pV P                  '       d   RMRp ^ RIHp	 V	! 4       p
V
P#                  RR4      pV
P#                  RR4      pV
P#                  RR4      pRV R2pRpV P                  '       dJ   RV P                  9  d9   V RV R\'        \        RR P)                  V P                  4      R!7      4       R"2pV R#\'        \        R$V P*                  R%7      4       R"2pV P,                  '       d.   VV R#\'        \        R&V P,                  R'7      4       R"2,          pV P/                  R(V R)V RV R"V R*V RV R"V V 24       R#   \$         d
    RRRrÜp ELi ; i),z!Show compact startup status line.)Úget_tool_definitions©Úgateway_storeNÚHERMES_DEFER_AGENT_STARTUPÚ1z!cli.session.status_tools_deferredzcli.session.status_tools_countÚtoolsrø   T)Úenabled_toolsetsÚdisabled_toolsetsÚ
quiet_modeÚ/:Né   Nú...u   [green bold]â—�[/]u   [red bold]â—�[/])Úget_active_skinÚ
banner_dimz#B8860BÚ	ui_accentz#FFBF00Úui_labelz#DAA520Úcyanz [dim u   ]Â·[/] rN   ÚallÚ[Ú]zcli.session.status_toolsetsz, )Útoolsetsz[/]r?   zcli.session.status_provider)rO   zcli.session.status_auth)Úsourcer`   z [z[bold éÿÿÿÿ)r&   rþ   Úhermes_cli.gateway_tools_notifyr   Úbanner_inventoryrË   rÐ   rc   r   r6   r  r  rM   r5   r\   Úhermes_cli.skin_enginer
  Ú	get_colorr)   rD   r4   rO   Ú_provider_sourcerC   )rÑ   rþ   r   ÚstoreÚ	inventoryÚtool_statusr  Úmodel_shortÚapi_indicatorr
  ÚskinÚseparator_colorÚaccent_colorÚlabel_colorÚsepÚtoolsets_infoÚprovider_infos   &                r   Ú_show_statusÚCLISessionMixin._show_status  s“  € å,ÝAÙ˜dÓ#ˆØ05Ò0A�E×*Ñ*Ô,Àtˆ	ä�:‰:�>‰>Ð6Ó7¸3Ô>À5ÒCTÐYbÒYjÜÐ?Ó@‰KØÒ"ÜÐ<ÄCÈ	ÐRYÕHZ×H`ÐH`Ð^`ÓDaÔb‰Ká(¸$×:OÑ:OØ;?×;QÑ;QÐ^bôdˆEäÐ<×RWÄCÈÄJÐ]^Ô_ˆKà36¸$¿*¹*Ô3D�d—j‘j×&Ñ& sÓ+¨BÖ/È$Ï*É*ˆÜˆ{Ó˜bÔ Ø% cÕ*¨UÕ2ˆKØ04··°Ñ,ÐBTˆð	VÝ>Ù"Ó$ˆDØ"Ÿn™n¨\¸9ÓEˆOØŸ>™>¨+°yÓAˆLØŸ.™.¨°YÓ?ˆKð �Ð' wÐ/ˆØˆØ× × Ð  U°$×2GÑ2GÔ%GØ"˜e 1 [ M°´7¼1Ð=ZÐei×enÑenÐos÷  pEñ  pEó  fFô  <Gó  4Hð  3Ið  ILð  MˆMØ˜%˜u¤W¬QÐ/LÐW[×WdÑWdÔ-eÓ%fÐ$gÐgjÐkˆØ× × Ð Ø ˜u E¬'´!Ð4MÐVZ×VkÑVkÔ2lÓ*mÐ)nÐnqÐrÕrˆMØ×ÑØ��˜r , ¨q°°¸SÀÀØ�[�M  ; -¨s°=°/À-ÀðRö	Søô ô 	VØ9BÀIÈv¨;ˆOª;ð	Vús   ÅAI9 É9JÊJc                ó  € ^ RI HpHp / pV P                  '       d[   \        P
                  ! \        4      ;_uu_ 4        V P                  P                  V P                  4      ;'       g    / pRRR4       \        V RR4      pV! V P                  WC\        V RR4      \        V RR4      V P                  \        \        V RR4      4      R7      pRp\        VR	R4      ;'       g    \        V R	R4      p\        V\        4      '       dS   VP                  R
4      RJ d   \        R4      pM1VP                  R4      '       d   \!        VP                  R4      4      p\        V RR4      pV'       d7   Ve3   V'       d   \        R4      M
\        R4      p	V\        RV	R7      ,          pRp
 ^ RIHp ^ RIHp V! 4       p
T! \        V RR4      ;'       g    R4      '       d   V
\        R4      ,          p
Rp T P+                  4       pTP                  R4      pTP                  R4      pT'       dr   Rp\        T\,        \.        34      '       d(   \        R\1        ^ ^d\-        T4      ,
          4      R7      p\        RTTP                  R4      ;'       g    ^ R TR R7      p\        R4      R.T! TRR R!R4      Op\        R"4      T3\        R#4      T
3\        R$4      T33pT F-  w  ppT'       g   K  TP3                  \        R%TTR&7      4       K/  	  TP5                  T! TR'R(R)R*4      4       T P7                  R+P9                  T4      RRR,7       R#   + '       g   i     ELì; i  \         d     EL‚i ; i  \         d    Rp Lçi ; i)-z6Show gateway-style status for the current CLI session.)Úbuild_status_fieldsÚstatus_linesNri   rM   rO   Ú_agent_runningF)rM   rO   Úcreated_fallbackÚagent_runningÚreasoning_configÚenabledzcli.shared.label_offÚeffortÚshow_reasoningzcli.shared.label_onz$cli.session.reasoning_display_suffix©Ústate)Ú%is_approval_bypass_active_for_session)Ú_get_approval_modeÚsession_keyrN   zcli.session.yolo_bypass_suffixÚcontext_lengthÚcontext_percentzcli.session.ctx_left_prefix)Úpercentzcli.session.ctx_tokens_usedÚcontext_tokensÚ,)ÚleftÚusedÚmaxzcli.session.status_titler…   r©   rx   zcli.session.label_reasoningzcli.session.label_approvalszcli.session.label_contextzcli.shared.label_value)r²   r*   ÚcreatedÚlast_activityÚtokensr-  rä   )râ   Úmarkup)Úhermes_cli.status_reportr)  r*  rƒ   Ú
contextlibÚsuppressr)   Úget_sessionr…   rf   Úsession_startr;   rd   re   rc   r   r/   Útools.approvalr4  Útools.approval_contextr5  Ú_get_status_bar_snapshotr1   r(   r>  ÚappendÚextendrC   r4   )rÑ   r)  r*  rÅ   ri   ÚfieldsÚreasoning_labelÚrcÚshow_rr3  Úapproval_labelr4  r5  Ú	ctx_labelÚsnapÚctx_maxÚctx_pctr<  ÚlinesÚoptionalr²   r*   s   &                     r   Ú_show_session_statusÚ$CLISessionMixin._show_session_status<  s5  € çNØˆØ××ÐÜ×$Ò$¤Y×/Õ/Ø#×/Ñ/×;Ñ;¸D¿O¹OÓL×RÐRÐPR�÷ 0ô ˜˜g tÓ,ˆÙ$Ø�O‰O˜UÜ˜$ ¨Ó.¼ÀÀzÐSWÓ9XØ!×/Ñ/¼tÄGÈDÐRbÐdiÓDjÓ?kô
ˆð ˆÜ�UÐ.°Ó5×`Ð`¼ÀÐGYÐ[_Ó9`ˆÜ�bœ$×ÒØ�v‰v�iÓ  EÓ)Ü"#Ð$:Ó";‘Ø—‘˜×!Ò!Ü"% b§f¡f¨XÓ&6Ó"7�Ü˜Ð/°Ó6ˆß˜vÒ1ß06”AÐ+Ô,¼AÐ>TÓ<UˆEØœqÐ!GÈuÔUÕUˆOàˆð	ÝLÝAÙ/Ó1ˆNÙ4´W¸TÀ=ÐRTÓ5U×5[Ð5[ÐY[×\Ò\Ø¤!Ð$DÓ"EÕE�ð
 ˆ	ð	Ø×0Ñ0Ó2ˆDØ—h‘hÐ/Ó0ˆGØ—h‘hÐ0Ó1ˆGßØ�Ü˜g¬¬U |×4Ò4ÜÐ:ÄCÈÈ3ÔQTÐU\ÓQ]ÕK]ÓD^Ô_�DÜÐ;À$ÐPT×PXÑPXÐYiÓPj×PoÐPoÐnoÐpqÐOrØ%,¨Q Kô2�	ô
 Ð-Ó.°Ðr±\À&È,ÐX^Ð`gÐipÓ5qÐrˆÜÐ4Ó5°ÐGÜÐ4Ó5°~ÐFÜÐ2Ó3°YÐ?ðAˆó %‰LˆE�5ß‰uØ—‘œQÐ7¸uÈEÔRÖSñ %ð 	�‰‘\ &¨)°_ÀhÐP_Ó`ÔaØ×Ñ˜DŸI™I eÓ,¸ÀeÐÖL÷o 0×/Ð/ûô: ô 	Úð	ûô ô 	ØŠIð	úsH   ¿0MÆ*(M& ÇM& Ç M& Ç59M8 È/A#M8 ÊM8 ÍM#	Í&M5Í4M5Í8NÎNc               ó    € V ^8„  d   QhRRRR/# )r   r0   r1   r   zlist[dict[str, Any]]r   )r   s   "r   r   rÆ   z  s   € ÷ ñ ¨3ð Ð8Lñ r   c                óÂ   € V P                   '       g   . #  ^ RIHp ^ RIHp V! V P                   RV P
                  RRV\        V4      R7      #   \         d    . u # i ; i)zCReturn recent CLI sessions for in-chat browsing/resume affordances.)Úquery_session_listing)ÚINTERNAL_LISTING_SOURCESr&   FT)r  Úcurrent_session_idÚinclude_all_sourcesÚinclude_unnamedr0   Úexclude_sources)rƒ   Úhermes_cli.session_listingr\  Úhermes_state_sessionsr]  r…   r   r)   )rÑ   r0   r\  r]  s   &&  r   Ú_list_recent_sessionsÚ%CLISessionMixin._list_recent_sessionsz  sd   € à××ÐØˆIð		ÝHÝFá(Ø× Ñ ¨À4Ç?Á?Ø$)¸4ÀuÜ $Ð%=Ó >ô@ð @øô ô 	ØŠIð	ús   –7A ÁAÁAÚreasonr   r0   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rf  r/   r0   r1   r   r;   r   )r   s   "r   r   rÆ   ‰  s"   € ÷ ñ ¨sð Àsð ÐTXñ r   c               ó  € ^ RI Hp V P                  VR7      pV'       g   R# ^ RIHp V! 4        VR8X  d   V! \        R4      4       MV! R\        R4       24       V! 4        V! RR	R
 R\        R4      R R\        R4      R R\        R4      R R\        R4       2
4       V! RR RR  RR! RR" RR# 2
4       \        V^R7       FŒ  w  rgVP                  R4      ;'       g    RpVP                  R4      ;'       g    RR,          p	V! VP                  R4      VP                  R4      R7      p
V! RVR
 RVR RV	R RV
R RVR,           2
4       KŽ  	  V! 4        V! R\        R4       24       V! R\        R4       24       V! 4        R# )$zˆRender recent sessions inline from the active chat TUI.

Returns True when something was shown, False if no session list was available.
©Ú_cli_visible_print)r0   F)Úrelative_timer   zcli.session.recent_intror`   zcli.session.recent_headerÚ#z<3r3   zcli.session.column_titlez<32zcli.session.column_previewz<40zcli.session.column_last_activez<13zcli.session.column_id)Ústartrx   u   â€”ÚpreviewrN   :Né&   NÚlast_activeÚidr¢   zcli.session.resume_usagezcli.session.resume_exampleTu	   â”€â”€â”€u`   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ux   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u'   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€uH   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€)r&   rj  rd  Úhermes_cli.timefmtrk  r   r   rc   )rÑ   rf  r0   rj  r¥   Ú_relative_timerú   Úsessionrx   rn  rp  s   &$$        r   Ú_show_recent_sessionsÚ%CLISessionMixin._show_recent_sessions‰  s¹  € õ
 	+Ø×-Ñ-°EÐ-Ó:ˆßÙåFáÔØ�YÔÙœqÐ!;Ó<Õ=á ¤AÐ&AÓ$BÐ#CÐDÔEÙÔÙØ��R�˜œ!Ð6Ó7¸Ð<¸A¼aÐ@\Ó>]Ð^aÐ=bÐbcÜÐ1Ó2°3Ð7°q¼Ð;RÓ9SÐ8TðVô	Wñ 	˜R 	˜{¨!¨J¨<°q¸¸ÀAÀjÀ\ÐQRÐS]ÐR^Ð_Ô`Ü% h°a×8‰LˆCØ—K‘K Ó(×1Ð1¨EˆEØ—{‘{ 9Ó-×3Ð3°°SÕ9ˆGÙ(¨¯©°]Ó)CÐPW×P[ÑP[Ð\`ÓPaÔbˆKÙ  C¨ 8¨1¨U°3¨K°q¸À¸ÀQÀ{ÐSVÐFWÐWXÐY`ÐaeÕYfÐXgÐhÖiñ	 9ñ
 	ÔÙ˜R¤Ð"<Ó =Ð>Ð?Ô@Ù˜R¤Ð">Ó ?Ð@ÐAÔBÙÔÙr   c           
     ó  a aaa€ ^ RI Ho S P                  '       g,   S P                  RR7      '       g   S! \	        R4      4       R# Rp^ p^ o\        \        S RR4      4      oR	 V V3R
 llpVV3R lpR!pRVR\	        R4      P                  ^24      ,           R,           V3 F  pS! V4       K  	  S P                   EF4  pVP                  RR4      pVR8X  d   S^,          oK(  VR"9  d   K1  V! 4        V^,          pVP                  R4      p	V	f   RM
\        V	4      p
V
RV p\        V
4      V8”  d   RMRpVR8X  d.   S! R\	        RVR7       V! V4       24       S! RV V 24       K°  S! R\	        RRVR7       V! V4       24       \        VP                  R4      ;'       g    . 4      pV
'       g-   Rp\	        R4      pV'       d   V^8X  d   RMRp\	        WíR 7      pS! RV V 24       EK7  	  V! 4        S! 4        R# )#zDisplay conversation history.ri  r   )rf  zcli.session.history_emptyNi�  Úshow_timestampsFc               ó    € V ^8„  d   QhRRRR/# )r   Úmessagere   r   r/   r   )r   s   "r   r   Ú2CLISessionMixin.show_history.<locals>.__annotate__·  s   € ÷ 
	ñ 
	 ð 
	¨ñ 
	r   c                óö   <€ S'       d   V P                  R 4      MRpV'       g   R#  \        VR4      pV'       d!   RVP                  \        SRR4      4       R2# R#   \        \
        \        3 d     R# i ; i)r¾   NrN   z  [Útimestamp_formatz%H:%Mr  )rc   r,   r¹   rf   r‚   r´   Ú	TypeError)rz  ÚtsÚstamprÑ   Úshow_tss   &  €€r   Ú
_ts_suffixÚ0CLISessionMixin.show_history.<locals>._ts_suffix·  ss   ø€ ÷ .5�—‘˜[Ô)¸$ˆBßÙðÜ% b¨$Ó/�ß^c˜˜UŸ^™^¬G°DÐ:LÈgÓ,VÓWÐXÐXYÐZÐkÐikÐkøÜ¤¬Ð3ô Úðús   ¨3A ÁA ÁA8Á7A8c                 óŠ   <€ S'       g   R # S^8X  d   RMRp S! R\        R4       24       S! R\        V SR7       24       ^ oR # )Nz$cli.session.history_tools_hidden_onez&cli.session.history_tools_hidden_otherú
  z cli.session.history_tools_headerú    rø   r   )Úkeyrj  Úhidden_tool_messagess    €€r   Úflush_tool_summaryÚ8CLISessionMixin.show_history.<locals>.flush_tool_summaryÃ  sR   ø€ ç'ÙØ<PÐTUÔ<UÑ8ð  \DˆCÙ ¤aÐ(JÓ&KÐ%LÐMÔNÙ ¤a¨Ð3GÔ&HÐ%IÐJÔKØ#$Ò r   rN   Ú|zcli.session.history_titleÚroleÚunknownÚtoolÚuserr–   r	  r…  zcli.session.history_you_header©Úindexr†  z$cli.session.history_assistant_headerÚHermes)Ú
agent_namer‘  Ú
tool_callszcli.session.history_no_textz"cli.session.history_tool_calls_onez$cli.session.history_tool_calls_otherrø   z4+--------------------------------------------------+>   r�  Ú	assistant)r&   rj  Úconversation_historyru  r   r;   rf   Úcenterrc   r/   r6   )rÑ   Úpreview_limitÚvisible_indexr‚  r‰  ÚruleÚliner9   rŒ  r–   Úcontent_textrn  ÚsuffixÚn_callsr‡  rj  rˆ  r�  s   f              @@@r   Úshow_historyÚCLISessionMixin.show_historyª  s  û€ å*Ø×(×(Ð(Ø×-Ñ-°YÐ-×?Ò?Ù"¤1Ð%@Ó#AÔBÙàˆØˆØ ÐÜ”w˜tÐ%6¸Ó>Ó?ˆ÷
	ñ 
	ö	%ð $ˆØ˜˜s¤QÐ'BÓ%C×%JÑ%JÈ2Ó%NÕNÐQTÕTÐVZÓ[ˆDÙ˜tÖ$ñ \ð ×,Õ,ˆCØ—7‘7˜6 9Ó-ˆDØ�vŒ~Ø$¨Õ)Ð$ÙØÐ0Ô0ÙÙÔ Ø˜QÕˆMà—g‘g˜iÓ(ˆGØ!(¢™2´c¸'³lˆLØ" > MÐ2ˆGÜ! ,Ó/°-Ô?‘UÀRˆFØ�vŒ~Ù" T¬!Ð,LÐTaÔ*bÐ)cÑdnÐorÓdsÐctÐ#uÔvÙ" T¨'¨°6°(Ð#;Ô<ÙáØ”qÐ?ÈHÐ\iÔjÐkÑlvÐwzÓl{Ðk|Ð}ôä˜#Ÿ'™' ,Ó/×5Ð5°2Ó6ˆGßØ�ÜÐ9Ó:�ßØBIÈQÄ,Ñ>ÐTz�CÜ Ô3�GÙ  g Y¨v¨hÐ7×8ñ9 -ñ< 	ÔÙÖr   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
event_typer/   r   r<   r   )r   s   "r   r   rÆ   ñ  s   € ÷ 3ñ 3°3ð 3¸4ñ 3r   c           
     ó¤  € \         P                  ! \        4      ;_uu_ 4        ^ RIHpHp RV P                  '       d   V P                  P                  MRR\        V RR4      ;'       g    RRVR8X  d   RMR	/pVR
8X  d+   ^ RI	H
p ^ RIHp V! V! R/ VB 4       F  pV! V4       K  	  M	V! V3/ VB  RRR4       R#   + '       g   i     R# ; i)z�Fire a session-boundary plugin hook (on_session_finalize / on_session_reset).
Non-blocking; errors swallowed. Safe from shutdown, /new, /reset.)Úfinalize_sessionÚinvoke_hookr…   NÚplatformr&   rf  Úon_session_resetÚnew_sessionÚsession_boundaryÚon_session_finalizeri  )Úsession_end_messagesr   )rD  rE  r)   Úhermes_cli.lifecycler¤  r¥  ri   r…   rf   r&   rj  r«  )rÑ   r¢  r¤  r¥  Úcontextrj  r«  rz  s   &&      r   Ú_notify_session_boundaryÚ(CLISessionMixin._notify_session_boundaryñ  s±   € ô × Ò ¤×+Õ+ßJð °t·z·z°z˜dŸj™j×3Ò3ÀtØœG D¨*°dÓ;×DÐD¸uØ¨:Ð9KÔ+K™-ÐQcðeˆGð Ð2Ô2Ý2ÝEÙ3Ñ4DÑ4OÀwÑ4OÖP�GÙ& wÖ/ò  Qñ ˜JÑ2¨'Ò2÷ ,×+×+Ò+ús   £AB>Á+A	B>Â>C	c               ó    € V ^8„  d   QhRRRR/# )r   r…   ry   r   r;   r   )r   s   "r   r   rÆ     s   € ÷ ñ °Mð Àdñ r   c                ó  € ^ RI Hp V P                  '       d	   V'       g   R# \        V RR4      '       d   R#  ^ RIHp V P                  P                  W! 4       R,          R7      #   \         d    TP                  RTR	R
7        R# i ; i)z÷Drop a just-ended session row that never gained content (quit-immediately, /new,
/clear) so it doesn't clutter ``/resume``. ``SessionDB.delete_session_if_empty`` only
removes rows with no messages, no title and no children (gemini-cli#27770 port).©rL   Fr–  Nr   r¥   )Úsessions_dirz Could not prune empty session %sTra   )	r&   rL   rƒ   rf   Úhermes_constantsr   Údelete_session_if_emptyr)   rn   )rÑ   r…   rL   Ú_ghhs   &&  r   Ú_discard_session_if_emptyÚ)CLISessionMixin._discard_session_if_empty  s…   € õ 	Ø××Ð§zÙô �4Ð/°×6Ò6Ùð	Ý@Ø×#Ñ#×;Ñ;Ø¨«°*Õ)<ð <ó >ð >øäô 	Ø�L‰LÐ;¸ZÐRVˆLÔWÚð	ús   ¹-A' Á'B
Â	B
r…   Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úhistory_snapshotr   r…   ry   r   zOptional[list]r   )r   s   "r   r   rÆ     s$   € ÷  ñ  Ø $ð Ø5Bð ØN\ñ r   c               ó:  € ^ RI Hp \        V RR4      pV'       d	   V'       g   R# \        VRR4      pVe0   \        VR4      '       d    TP	                  T;'       g    RV4       \        VR
R4      f   R# V#   \
         d    TP                  RRR	7        L3i ; i)u  Stage old-session memory extraction so /new stays responsive.

The context-engine ``on_session_end`` is delivered synchronously here: cheap (no LLM)
and ordering-sensitive â€” it must land before ``reset_session_state()`` rebinds the
engine. The memory-provider half (LLM-bound, seconds) is NOT run here: the returned
snapshot goes to ``MemoryManager.commit_session_boundary_async`` as one endâ†’switch
task on the serialized worker, so a late ``on_session_end`` can never run after
``on_session_switch`` and misattribute the old transcript to the new session.

Returns the snapshot to queue, or ``None`` when there is nothing to extract.
r²  ri   NÚcontext_compressorÚon_session_endrN   z5Context engine on_session_end failed at /new boundaryTra   Ú_memory_manager)r&   rL   rf   Úhasattrr½  r)   rn   )rÑ   rº  r…   rL   ri   Úengines   &&$   r   Ú%_launch_session_boundary_memory_flushÚ5CLISessionMixin._launch_session_boundary_memory_flush  sŸ   € õ 	Ü˜˜g tÓ,ˆß×,ÙÜ˜Ð 4°dÓ;ˆØÒ¤'¨&Ð2B×"CÒ"CðeØ×%Ñ% j×&6Ð&6°BÐ8HÔIô �5Ð+¨TÓ2Ò:ÙØÐøô ô eØ—‘ÐTÐ_c�Ödðeús   Á
A9 ÁA9 Á9BÂBc                óŒ  € ^ RI HpHpHpHp ^ RIHp V P                  pRp	V P                  '       dh   V P                  '       d'   V P                  \        V P                  4      VR7      p	^ RIHp
 V
! V P                  4      '       g   V P                  R4       V P                  '       dÏ   V'       dÇ   V P                  '       d]   \         P"                  ! \$        4      ;_uu_ 4        V P                  P'                  V P                  V P                  R7       RRR4       \         P"                  ! \$        4      ;_uu_ 4        V P                  P)                  VR4       RRR4       V P+                  V4       VP-                  4       V n        \1        V R	R
 4      ! V P.                  4      V n        \1        V RR 4      ! 4        . V n	        RV n        RV n        RV n        RV n        V! VR,          P;                  RR4      4      V n        \?        W4       V! V 4       V! V P                  4       V P                  '       Edà   V P                  V P                  n        V P.                  V P                  n        V P@                  V P                  n         V P                  PC                  4        \E        V P                  R4      '       d   ^ V P                  n#        \E        V P                  R4      '       dH   \         P"                  ! \$        4      ;_uu_ 4        ^ RI$H%p V! 4       V P                  n&        RRR4       \E        V P                  R4      '       d   V P                  PO                  4        V P                  '       dÊ   \         P"                  ! \$        4      ;_uu_ 4        RV P                  n(        V P                  PS                  V P                  \T        PV                  P;                  RR4      V PX                  RV PZ                  RV P@                  /R7       RV P                  n(        RRR4       V'       d   \]        W4      p\1        V P                  RR4      p\         P"                  ! \$        4      ;_uu_ 4        Ve2   V	'       d*   TP_                  Y�P                  T;'       g    RRR7       M-Ve*   TPa                  V P                  T;'       g    RRRR7       RRR4       ^ RIHp
 V
! V P                  4      '       g   V P                  R4       V'       g7   V'       d   \c        \e        RVR 7      4       R# \c        \e        R!4      4       R# R#   + '       g   i     ELR; i  + '       g   i     EL; i  + '       g   i     EL]; i  + '       g   i     ELs; i  + '       g   i     LÏ; i)"zDStart a fresh session with a new session ID and cleared agent state.)rI   Ú_parse_service_tier_configÚ_sync_process_session_idr%   )Ú_resolve_cli_reasoningNr¢   )Ú_gateway_owns_session_endrª  )r–  r¨  Ú_new_session_idc                ó   € \        V 4      # ©Nr   )r¸   s   &r   Ú<lambda>Ú-CLISessionMixin.new_session.<locals>.<lambda>W  s
   € Ä~ÐVYÔGZr   Ú_write_terminal_breadcrumbc                 ó   € R # rÊ  r   r   r   r   rË  rÌ  Y  s   € ¹Dr   Fri   Úservice_tierrN   Ú_last_flushed_db_idxÚ_todo_store)Ú	TodoStoreÚ_invalidate_system_promptÚHERMES_SESSION_SOURCEr&   Úmax_iterationsr.  )r…   r  rM   Úmodel_configTr¾  )r   Úparent_session_idrf  )r×  Úresetrf  r§  zcli.session.new_session_titled©rx   zcli.session.new_session)3r&   rI   rÄ  rÅ  r%   Ú!hermes_cli.cli_model_switch_mixinrÆ  r…   ri   r–  rÁ  r   Úhermes_cli.cli_shutdownrÇ  r®  rƒ   rD  rE  r)   Ú_flush_messages_to_session_dbÚend_sessionr·  r¸   rG  rf   r†   Ú_resumedÚ_explicit_model_overrideÚ_pending_one_turn_model_restorerc   rÏ  rv   r.  Úreset_session_stater¿  rÐ  Útools.todo_toolrÒ  rÑ  rÓ  Ú_session_db_createdÚcreate_sessionrË   rÐ   rM   Ú	max_turnsrŠ   Úcommit_session_boundary_asyncÚon_session_switchr@   r   )rÑ   rG   rx   rI   rÄ  rÅ  r%   rÆ  Úold_session_idÚ_boundary_snapshotrÇ  rÒ  Ú_mms   &&&          r   r¨  ÚCLISessionMixin.new_session2  s3  € ÷	0ó 	0õ 	MØŸ™ˆØ!ÐØ�:�:ˆ:Ø×(×(Ð(ð &*×%OÑ%OÜ˜×2Ñ2Ó3Àð &Pó &PÐ"åIÙ,¨T¯Z©Z×8Ò8Ø×-Ñ-Ð.CÔDà××Ð§ð �z�zˆzÜ×(Ò(¬×3Õ3ð —J‘J×<Ñ<Ø×1Ñ1È×HaÑHað =ô c÷ 4ô ×$Ò$¤Y×/Õ/Ø× Ñ ×,Ñ,¨^¸]ÔK÷ 0à×*Ñ*¨>Ô:à%Ÿ\™\›^ˆÔä! $Ð(9Ñ;ZÔ[Ð\`×\nÑ\nÓoˆŒä�Ð2±LÔAÔCØ$&ˆÔ!Ø"ˆÔØˆŒà(-ˆÔ%ð 04ˆÔ,Ù6°zÀ'Õ7J×7NÑ7NÈ~Ð_aÓ7bÓcˆÔÜ& tÔ4ñ 	˜tÔ$Ù  §¡Ô1à�:�:‰:Ø$(§O¡OˆD�J‰JÔ!Ø'+×'9Ñ'9ˆD�J‰JÔ$Ø*.×*?Ñ*?ˆD�J‰JÔ'Ø�J‰J×*Ñ*Ô,Ü�t—z‘zÐ#9×:Ò:Ø23�—
‘
Ô/Ü�t—z‘z =×1Ò1Ü×(Ò(¬×3Õ3Ý9Ù-6«[�D—J‘JÔ*÷ 4ô �t—z‘zÐ#>×?Ò?Ø—
‘
×4Ñ4Ô6à××ÐÜ×(Ò(¬×3Õ3Ø5:�D—J‘JÔ2Ø×$Ñ$×3Ñ3Ø#'§?¡?Ü!Ÿz™zŸ~™~Ð.EÀuÓMØ"Ÿj™jà,¨d¯n©nÐ>PÐRV×RgÑRgð&ð	 4ô ð 6:�D—J‘JÔ2÷ 4÷ Ü4°TÓA�Eô
 ˜$Ÿ*™*Ð&7¸Ó>ˆCÜ×$Ò$¤Y×/Õ/Ø’?×'9Ø×5Ñ5Ø*¿?¹?Ø*8×*>Ð*>¸BÀ}ð 6õ Vð ’_Ø×)Ñ)ØŸ™¸>×;OÐ;OÈRØ"¨=ð *ô :÷ 0õ JÙ,¨T¯Z©Z×8Ò8Ø×-Ñ-Ð.@ÔAçßÜ”aÐ8ÀÔFÖGä”aÐ1Ó2Ö3ñ	 ÷_ 4×3Ð3ú÷ 0×/Ð/ú÷B 4×3Ð3ú÷ 4×3Ð3ú÷" 0×/úsO   Ã(2U#ÅU7ÌVÎ)BVÒ	V3ÒV3Ò5,V3Ó"
V3Õ#U4	Õ7V	ÖV	ÖV0	Ö3W	c               ó    € V ^8„  d   QhRRRR/# )r   r.   r/   r   r;   r   )r   s   "r   r   rÆ   �  s   € ÷ ñ °cð ¸dñ r   c                ó®  € ^ RI Hp V P                  pV'       g   R# RV n        \        V\        4      '       g   R# VP                  4       P                  4       '       g   R# \        VP                  4       4      p^Tu;8:  d   \        V4      8:  g/   M V! R\        RVR7       24       V! R\        R4       24       R# V P                  R	V 24       R# )
u”  Resolve a bare numeric reply following a bare ``/resume`` prompt.

``/resume`` (no args) arms ``self._pending_resume_sessions``; the next input gets one
chance to be a bare session number. The pending state is one-shot â€” cleared on the
first input regardless of outcome, so a stray later number is never hijacked.
Returns True if the input was consumed (caller must not treat it as chat).

See #34584.
r{   FNr`   z%cli.session.resume_index_out_of_ranger�  zcli.session.resume_no_args_hintTz/resume )r&   rJ   Ú_pending_resume_sessionsrd   r/   ÚstripÚisdigitr1   r6   r   Ú_handle_resume_command)rÑ   r.   rJ   Úpendingr‘  s   &&   r   Ú!_consume_pending_resume_selectionÚ1CLISessionMixin._consume_pending_resume_selection�  s²   € õ 	 Ø×/Ñ/ˆßÙØ(,ˆÔ%Ü˜$¤×$Ò$Ùà�z‰z‹|×#Ñ#×%Ò%ÙÜ�D—J‘J“LÓ!ˆØ�EÖ)œS ›\Ö)Ù�bœÐBÈ%ÔPÐQÐRÔSÙ�bœÐ<Ó=Ð>Ð?Ô@ÙØ×#Ñ# h¨u¨gÐ$6Ô7Ùr   c               ó   € V ^8„  d   QhRR/# )r   Úcmdr/   r   )r   s   "r   r   rÆ   ¹  s   € ÷ <hñ <h Sñ <hr   c                óÌ  aaaa€ ^ RI HpHpHpHo VP                  4       R,          p\        V4      ;'       d    VR,          P                  4       R9   pV'       d   VRR pV'       g   \        V4       R#  V! V^ ,          4      o\        T4      ^8”  d
   T^,          MRp^ RIHp	 T	! T 4      p
T
em   T P                  '       g   \        \        R4      4       R# \        T
P                   T P"                  SY†4      oSe   \%        T P"                  STT3R l4       R# Ro\'        T RR4      p\'        T R	R4      pT'       d   T'       d   ^ R
IHp  T! Y¼S4      oS'       gi   T P                  '       g   \        \        R4      4       R# RT P"                  RT P.                  RT P0                  P3                  4       RT P                  /oT'       d   ^ RIHp T! S4      o\%        T P"                  STTTT3R l4       R#   \         d%   p\        RT 24       \        T4        Rp?R# Rp?ii ; i  T d   p\        RT 24        Rp?R# Rp?i\,         d    Ro ELi ; i)uÿ   Handle ``/save [json|md|html] [filename] [redact]``.

A convenience export only â€” every message is already persisted to the session DB, so
the live session stays resumable regardless. ``redact`` runs the force-mode secret
redaction pass before writing.
)Ú
SAVE_USAGEÚload_save_snapshotÚnormalize_save_formatÚrender_session_for_save:é   NNNú(._.) rÿ   r�   c                 ó   <€ S # rÊ  r   )r–   s   €r   rË  Ú3CLISessionMixin.save_conversation.<locals>.<lambda>Ù  s   ø€ ÁGr   rƒ   r…   )ÚSessionExportTooLargeErrorrq  rM   Ú
started_atÚmessages)Úredact_session_datac                 ó   <€ S! SS 4      # rÊ  r   )r�   rû  Úsession_datas   €€€r   rË  rÿ  õ  s   ø€ Ñ<SÐT`ÐbeÔ<fr   r  )r•   z--redact)Úhermes_cli.session_exportrø  rù  rú  rû  r5   r;   Úlowerr@   r‚   r6   r  r   r–  r   rŸ   rœ   r…   rÀ   rf   r€   r   r)   rM   rG  r¾   Úhermes_cli.session_export_mdr  )rÑ   rö  rø  rù  rú  Úpartsr•   r‰   rž   r   r  Ú_dbÚ_sidr   r  r–   r�   rû  r  s   &&             @@@@r   Úsave_conversationÚ!CLISessionMixin.save_conversation¹  s  û€ ÷	\ó 	\ð —	‘	“˜B•ˆÜ�e“×LÐL  r¥§¡Ó!2Ð6LÑ!LˆßØ˜#˜2�JˆEßÜ�*ÔÙð	Ù'¨¨a­Ó1ˆCô
  # 5›z¨Aœ~�5˜–8°4ˆÝAÙ˜dÓ#ˆØÒØ×,×,Ð,Ü”aÐ2Ó3Ô4ÙÜ(¨×)9Ñ)9¸4¿?¹?ÈCÐQYÓbˆGØÒ"Ü˜DŸO™O¨S°(¼OÔLÙð ˆÜ�d˜M¨4Ó0ˆÜ�t˜\¨4Ó0ˆß—4Ý?ð$Ù1°#¸SÓA�÷ Ø×,×,Ð,Ü”aÐ2Ó3Ô4Ùà�d—o‘o w°·
±
Ø˜d×0Ñ0×:Ñ:Ó<¸jÈ$×JcÑJcðeˆL÷ ÝHá.¨|Ó<ˆLÜ�D—O‘O S¨(Ö4fÖgøôS ô 	Ü�F˜1˜#�,ÔÜ�*ÔÝûð	ûð2 .ô Ü˜˜q˜c�lÔ#ÝûÜô $Ø#“ð$ús<   Á8H Å	H4 ÈH1ÈH,È,H1È4I#È;IÉI#ÉI#É"I#c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	truncatedr   Úinvalidate_promptr;   r   r<   r   )r   s   "r   r   rÆ   ÷  s(   € ÷ Gñ G°Dð GÐPTð GÐY]ñ Gr   c               óx  € Wn         V P                  pVf   R# V'       dN   \        VR4      '       d<   \        P                  ! \
        4      ;_uu_ 4        VP                  4        RRR4       \        VR4      '       dF   \        P                  ! \
        4      ;_uu_ 4        \        V P                   4      Vn        RRR4       \        VR4      '       d   V P                   Vn	        \        VR4      '       d   V P                   R,          Vn
        R# R#   + '       g   i     L¸; i  + '       g   i     Lt; i)zInstall a rewound history and mirror it onto the agent (flush index reset so the
next turn re-flushes from the truncated head).NrÓ  rÐ  Ú_session_messagesÚ_db_flush_scan_prefix:NNN)r–  ri   r¿  rD  rE  r)   rÓ  r6   rÐ  r  r  )rÑ   r  r  ri   s   &&$ r   Ú_publish_truncated_historyÚ*CLISessionMixin._publish_truncated_history÷  sØ   € ð %.Ô!Ø—
‘
ˆØŠ=Ùß¤¨Ð0K×!LÒ!LÜ×$Ò$¤Y×/Õ/Ø×/Ñ/Ô1÷ 0ä�5Ð0×1Ò1Ü×$Ò$¤Y×/Õ/Ü-0°×1JÑ1JÓ-K�Ô*÷ 0ä�5Ð-×.Ò.Ø&*×&?Ñ&?ˆEÔ#Ü�5Ð1×2Ò2Ø*.×*CÑ*CÀAÕ*FˆEÖ'ñ 3÷ 0×/ú÷ 0×/ús   ÁDÂ"D)ÄD&	Ä)D9	c           	     óŒ  € V P                   '       g   \        \        R4      4       R# ^ RIHpHp ^ RIHp \        V P                   4      p\        V4      pV'       g   \        \        R4      4       R#  V! WER,          4      w  rgVP                  R4      p\        V\        4      '       d   V! V4      P                  4       pV! V4      p	T P                  eG   T P                   '       d5    T P                  P#                  T P                   RTR	R
7      P$                  pT P)                  TRR7       \        \        RT	R,           \+        T	4      ^<8”  d   RMR 2R7      4       T	#   \         d"   p
\        \        RT
R7      4        Rp
?
R# Rp
?
ii ; i  \&         d"   p
\        \        RT
R7      4        Rp
?
R# Rp
?
ii ; i)zyRetry the last user message: drop the last exchange and return the text to re-send
(None when there is nothing to retry).zcli.session.retry_no_messagesN)Ú#history_before_user_originated_turnÚretryable_user_text)Úsanitize_contextz!cli.session.retry_no_user_messager–   zcli.session.retry_unsafer~   T)Úwarm_historyÚrequire_retryablezcli.session.retry_rewind_failedF©r  zcli.session.retryingºNé<   Nr	  rN   )rn  r  )r–  r@   r   r   r  r  Úagent.memory_contextr  r   r"   rc   rd   r/   rï  r‚   rƒ   r…   Úrewind_user_turnÚprefixr)   r  r6   )rÑ   r  r  r  r  Úuser_indicesr  Ú	live_viewÚlive_contentÚlast_messageÚexcs   &          r   Ú
retry_lastÚCLISessionMixin.retry_last	  s�  € ð ×(×(Ð(Ü”!Ð3Ó4Ô5Ù÷	Få9ä˜D×5Ñ5Ó6ˆÜ)¨,Ó7ˆßÜ”!Ð7Ó8Ô9Ùð		Ù#FØ¨2Õ.ó$0Ñ ˆIà$Ÿ=™=¨Ó3ˆLÜ˜,¬×,Ò,Ù/°Ó=×CÑCÓE�Ù.¨|Ó<ˆLð ×ÑÒ'¨D¯O¯O¨OðØ ×,Ñ,×=Ñ=Ø—O‘O R°lÐVZð >ó \ß\bÑ\bð ð 	×'Ñ'¨	ÀUÐ'ÔKÜŒaÐ&°<ÀÕ3DÐ2EÌsÐS_ÓO`ÐceÔOeÁeÐkmÐEnÐ0oÔpÔqØÐøô! ô 	Ü”!Ð.°cÔ:Ô;Ýûð	ûô ô Ü”aÐ9ÀÔEÔFÝûðús1   Á6AE( Ã-3F Å(FÅ3FÆFÆGÆ"F>Æ>Gc               ó    € V ^8„  d   QhRRRR/# )r   Únr1   Úprefillr;   r   )r   s   "r   r   rÆ   7  s   € ÷ =ñ =˜3ð =¨Tñ =r   c                ó°  € ^ RI Hp V P                  '       g   \        \	        R4      4       R# \        V^4      p^ RIHp \        V P                  4      p\        V4      pV'       g   \        \	        R4      4       R# \        V\        V4      4      p\        V4      V,
          pWh,          p	\        V4      V	,
          p
V! WY4      w  r¼V P                  VP                  R4      4      p^ pV P                  ei   V P                  '       dW    V P                  P!                  V P                  W…R7      pVP"                  pVP$                  ;'       g    TpVP&                  pV P-                  VRR7       \/        V P0                  RR4      pVe]   V P                  '       dK   \2        P4                  ! \(        4      ;_uu_ 4        VP7                  V P                  RRRR7       RRR4       V^8X  d   RMRp\        \	        TY~;'       g    T
VR,           \        V4      ^<8”  d   RMR 2R7      4       \        R\	        R\        V P                  4      R7       24       V'       d   V'       d   V P9                  V4       V#   \(         d4   pTP+                  RT4       \        \	        R	TR
7      4        Rp?R# Rp?ii ; i  + '       g   i     Lé; i)a	  Back up N user turns: truncate history, soft-delete on disk, prefill the composer.

Discards everything from the Nth-from-last user message onward (clamped to the oldest
turn). Rows are soft-deleted in SessionDB (``active=0``, kept for audit), memory
providers get ``on_session_switch(rewound=True)``, and the agent is patched like
/branch does. ``prefill=False`` is for programmatic callers (checkpoint rollback)
that must not touch the input buffer. Returns the number of user turns undone (None when
nothing changed).
r²  zcli.session.undo_no_messagesN)r  z cli.session.undo_no_user_messager–   )r  zundo: durable rewind failed: %szcli.session.undo_failedr~   Tr  r¾  rN   F)r×  rØ  Úrewoundzcli.session.undo_ok_onezcli.session.undo_ok_otherr  r	  )rù   r  Úbackupr`   zcli.session.undo_remainingrø   )r&   rL   r–  r@   r   r>  r   r  r   r"   Úminr6   Ú_undo_content_to_textrc   rƒ   r…   r   r!  Ú	live_textÚrewound_countr)   rn   r  rf   ri   rD  rE  rç  Ú_prefill_input_buffer)rÑ   r*  r+  rL   r  r  r"  Úturns_undoneÚtarget_ordinalÚcut_idxÚremoved_countr  r#  Úremoved_textÚrewound_rowsÚoutcomer‰   rê  r‡  s   &&&                r   Ú	undo_lastÚCLISessionMixin.undo_last7  sY  € õ 	Ø×(×(Ð(Ü”!Ð2Ó3Ô4ÙÜ��1‹IˆåPä˜D×5Ñ5Ó6ˆÜ)¨,Ó7ˆßÜ”!Ð6Ó7Ô8Ùä˜1œc ,Ó/Ó0ˆÜ˜\Ó*¨\Õ9ˆØÕ.ˆÜ˜LÓ)¨GÕ3ˆÙBÀ<ÓYÑˆ	Ø×1Ñ1°)·-±-À	Ó2JÓKˆàˆØ×ÑÒ'¨D¯O¯O¨Oð
Ø×*Ñ*×;Ñ;Ø—O‘O ^ð <ó P�à#ŸN™N�	à&×0Ñ0×@Ð@°L�Ø&×4Ñ4�ð 	×'Ñ'¨	ÀTÐ'ÔJä�d—j‘jÐ"3°TÓ:ˆàŠ?˜tŸŸ˜Ü×$Ò$¤Y×/Õ/Ø×%Ñ% d§o¡oÈÐSXÐbfÐ%Ôg÷ 0ð ,8¸1Ô+<Ñ'ÐB]ˆÜŒa�˜<×2OÐ2OÀ-Ø& sÕ+Ð,´c¸,Ó6GÈ"Ô6L©UÐRTÐ,UÐVôXô 	Yä�”1Ð1¼¸T×=VÑ=VÓ9WÔXÐYÐZÔ[ç—|Ø×&Ñ& |Ô4ØÐøô+ ô Ø—‘Ð>ÀÔBÜ”aÐ1¸Ô;Ô<Ýûðú÷ 0×/ús+   ÄAJ ÅJ Ç KÊKÊ(J=Ê=KËK	c               ó   € V ^8„  d   QhRR/# )r   r   r/   r   )r   s   "r   r   rÆ   w  s   € ÷ 	ñ 	¨#ñ 	r   c                ó>  € \        V \        4      '       d   V # \        V \        4      '       dj   V  Uu. uFE  p\        V\        4      '       g   K  VP	                  R4      R8X  g   K3  VP	                  RR4      NKG  	  ppRP                  R V 4       4      # R# u upi )zAFlatten message content (str or content-part list) to plain text.Útyper.   rN   rä   c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irÊ  r   )Ú.0r   s   & r   Ú	<genexpr>Ú8CLISessionMixin._undo_content_to_text.<locals>.<genexpr>  s   é € Ð3© 1³ŸQšQ«ùs   ‚	�
)rd   r/   r   re   rc   r4   )r–   Úpr	  s   &  r   r0  Ú%CLISessionMixin._undo_content_to_textv  s‰   € ô �gœs×#Ò#ØˆNÜ�gœt×$Ò$á+2óÙ+2 a´jÀÄD×6IÔ!ÈaÏeÉeÐTZËmÐ_eÑNeÔ!�—‘�f˜bÖ!©7ð ð ð —9‘9Ñ3©Ó3Ó3Ð3Ùùò	s   ³BÁBÁ(Bc               ó   € V ^8„  d   QhRR/# rŒ   r   )r   s   "r   r   rÆ   ‚  s   € ÷ .ñ .¨Dñ .r   c                ó´   € \         P                  ! \        4      ;_uu_ 4        ^ RIHp V! V P
                  4       RRR4       R#   + '       g   i     R# ; i)zíRecord this terminal's live session for bare ``hermes -c``. Called whenever
``self.session_id`` is (re)assigned so a later bare ``-c`` in THIS terminal resumes
this conversation's live tip. Best-effort; no-op without a terminal identity.)Úwrite_breadcrumbN)rD  rE  r)   Úhermes_cli.terminal_breadcrumbsrH  r…   )rÑ   rH  s   & r   rÍ  Ú*CLISessionMixin._write_terminal_breadcrumb‚  s3   € ô × Ò ¤×+Õ+ÝHá˜TŸ_™_Ô-÷ ,×+×+Ò+ús   £AÁA	c               ó   € V ^8„  d   QhRR/# )r   r   r;   r   )r   s   "r   r   rÆ   ‹  s   € ÷ Wñ W¨ñ Wr   c                ó†   €  ^ RI HpHp T'       d   R# T! \	        T RR4      ;'       g    R4      #   \         d     R# i ; i)z�Whether YOLO bypass is on for this session: reads ``tools.approval._session_yolo``
(not a stale env var) and honors the frozen process-start ``--yolo`` flag.)Ú_YOLO_MODE_FROZENÚis_session_yolo_enabledFTr…   Nr+   )rH  rM  rN  r)   rf   )rÑ   rM  rN  s   &  r   Ú_is_session_yolo_activeÚ'CLISessionMixin._is_session_yolo_active‹  sD   € ð	ßQ÷ Ùñ '¤w¨t°\À4Ó'H×'UÐ'UÈIÓVÐVøô ô 	Úð	ús   ‚1 ±A ¿A c                ó’  aa€ ^ RI Hp ^ RIHp ^ RIHp V'       dJ   VP                   VP                   \        R4       VP                   2pV! R\        RVR7       24       R# ^ R	I
Hp V P                  ;'       g    R
o\        V RR4      oS'       d   SR
8w  d   VV3R lMRpV! SVR7      '       dJ   VP                   VP                   \        R4       VP                   2pV! R\        RVR7       24       R# VP                   VP                   \        R4       VP                   2pV! R\        RVR7       24       R# )aÆ  Toggle per-session YOLO mode (skip dangerous-command approvals).

Mirrors the gateway/TUI ``/yolo`` handlers. Deliberately does NOT touch
``HERMES_YOLO_MODE``: that env var is frozen into ``tools.approval._YOLO_MODE_FROZEN``
at import (so prompt-injected skills can't flip the bypass), making a later set a
silent no-op. ``run_conversation`` binds ``self.session_id`` as the active approval
key, so the bypass applies to the very next dangerous command.
r{   )ÚColors)rM  z cli.session.yolo_state_locked_onr`   zcli.session.yolo_lockedr2  N)Útoggle_session_yolor+   rƒ   c                ó(   <€ SP                  SV 4      # rÊ  )Úset_session_yolo)ÚonÚdbr6  s   &€€r   rË  Ú.CLISessionMixin._toggle_yolo.<locals>.<lambda>°  s   ø€ ˜b×1Ñ1°+¸rÔBr   )Úpersistzcli.shared.label_on_upperzcli.session.yolo_onzcli.shared.label_off_upperzcli.session.yolo_off)r&   rJ   Úhermes_cli.colorsrR  rH  rM  ÚBOLDÚREDr   ÚRESETr×   rS  r…   rf   ÚGREEN)	rÑ   rJ   Ú_ColorsrM  r3  rS  rY  rW  r6  s	   &      @@r   Ú_toggle_yoloÚCLISessionMixin._toggle_yolo˜  s'  ù€ õ 	 Ý7Ý4÷ Ø—|‘|�n W§[¡[ M´!Ð4VÓ2WÐ1XÐY`×YfÑYfÐXgÐhˆEÙ�bœÐ4¸EÔBÐCÐDÔEÙå;Ø—o‘o×2Ð2¨ˆÜ�T˜=¨$Ó/ˆçGIÈkÐ]fÔNfÖBÐlpˆÙ˜{°G×<Ó<Ø—|‘|�n W§]¡] O´AÐ6QÓ4RÐ3SÐT[×TaÑTaÐSbÐcˆEÙ�bœÐ0¸Ô>Ð?Ð@ÖAà—|‘|�n W§[¡[ M´!Ð4PÓ2QÐ1RÐSZ×S`ÑS`ÐRaÐbˆEÙ�bœÐ1¸Ô?Ð@ÐAÖBr   c               ó   € V ^8„  d   QhRR/# )r   Úcmd_originalr/   r   )r   s   "r   r   rÆ   ¸  s   € ÷ IVñ IV¨Sñ IVr   c                óª  € ^ RI Hp ^ RIHpHpHpHpHp \        V P                  ;'       g    R*4      V8  d   \        \        RVR7      4       R# V P                  '       g   \        \        R4      4       R# T;'       g    RP                  4       P                  R^4      pT! \        V4      ^8”  d
   V^,          MR4      p	V	P                  '       d#   \        RV 24       V	P                   '       g   R# V	P                   '       d<   V! V! V P                  V P                  V	4      4       F  p
\        R	V
 24       K  	  R# \        V P                  4      pV P#                  \        R
4      RR7      ;_uu_ 4         V	P$                  '       d"   \        \        RW¹P&                  R7      4       MIV	P(                  '       d"   \        \        RW¹P(                  R7      4       M\        \        RVR7      4       T! V P                  V P                  T	V P*                  ;'       g    RR7      pVP,                  R8w  d)   V! V4       F  p
\        RV
 24       K  	   RRR4       R# VP.                  V n	        \1        V P                  RR4      pV'       d‚   WÐP*                  8w  dr   ^ RIHp V! V P*                  V4       V P                  P*                  V n        V P7                  4        RV n        V P                  P;                  V P                  R4       V! V P                  RR7       VP<                  pVP?                  R4      '       g/   VP?                  R4      '       g   VP?                  R4      '       d   RpMVR,          '       d   R MR!p\        RV R"VR#,           24       \        R$VR%,           24       VR&,          '       d   \        R$VR&,           24       RRR4       R#   \@         dD   pT! T P                  RR7       ^ R'I!H"p \        R\        R(T! T4      R)7       24        Rp?LSRp?ii ; i  + '       g   i     R# ; i)+u,  Manually trigger context compression.

* ``/compress [<focus>]`` â€” compress the whole history; an optional focus topic tells
  the summariser what to preserve while discarding the rest more aggressively.
* ``/compress here [N]`` â€” boundary-aware: summarize everything except the most recent
  ``N`` exchanges (default 2), kept verbatim.
* ``--preview`` reports what would happen and changes nothing.
No ``compression_enabled`` gate: that flag disables *automatic* compaction only, and
the context-overflow error path directs users here when it is off.
)Ú0finalize_context_engine_compression_notification)ÚAGGRESSIVE_UNSUPPORTEDÚMIN_MESSAGESÚcompress_nowÚparse_compress_argsÚrender_compress_resultzcli.session.compress_too_short)r/  Nzcli.session.compress_no_agentrN   rý  u	   ðŸ—œï¸�  zcli.session.compress_busyF)Úblocks_inputz cli.session.compress_summarizing)rù   Ú	keep_lastzcli.session.compress_focus)rù   Úfocuszcli.session.compress_plainrø   r+   )Útask_idÚ
compressedr`   r…   )Útransfer_session_yoloT)Ú	committedÚabortedÚfallback_usedÚrefused_would_growu   âš ï¸�Únoopu   ðŸ—œï¸�u   âœ…r3   Úheadlinez     Ú
token_lineÚnote)Úrefusal_textzcli.session.compress_failedr~   r   )#Úagent.conversation_compressionre  Ú%agent.conversation_compression_manualrf  rg  rh  ri  rj  r6   r–  r@   r   ri   rï  r5   Ú
aggressivern  Ú_busy_commandÚpartialrl  Úfocus_topicr…   ÚstatusÚafter_messagesrf   r×   rp  rÍ  r†   rÜ  Úsummaryrc   r)   Úhermes_cli.cli_chat_error_copyry  )rÑ   rc  re  rf  rg  rh  ri  rj  Ú_partsÚrequestr›  Úoriginal_countÚresultÚ	agent_sidrp  r‚  Úiconr‰   ry  s   &&                 r   Ú_manual_compressÚ CLISessionMixin._manual_compress¸  si  € õ 	d÷	mõ 	mô ˆt×(Ñ(×.Ð.¨BÓ/°,Ô>Ü”!Ð4¸,ÔGÔHÙØ�z�zˆzÜ”!Ð3Ó4Ô5ÙØ×$Ð$ "×+Ñ+Ó-×3Ñ3°D¸!Ó<ˆÙ%´3°v³;À´? f¨Q¦iÈÓKˆØ××ÐÜ�FÐ1Ð2Ð3Ô4Ø—?—?�?ÙØ�?�?ˆ?Ù.©|¸D¿J¹JÈ×HaÑHaÐcjÓ/kÖl�Ü˜	 $ Ð(Ö)ñ máä˜T×6Ñ6Ó7ˆØ×Ñ¤Ð"=Ó >ÈUÐ×SÕSð'VØ—?—?�?Üœ!Ð>Àn×`qÑ`qÔrÕsØ×(×(Ð(Üœ!Ð8À×ViÑViÔjÕkäœ!Ð8ÀÔOÔPÙ% d§j¡j°$×2KÑ2KÈWØ.2¯o©o×.JÐ.JÀôL�à—=‘= LÔ0Ù 6°vÖ >˜Ü  4 &˜kÖ*ñ !?à÷ TÑSð -3×,AÑ,A�Ô)ô $ D§J¡J°¸dÓC�	ß ¯o©oÔ!=ÝIÙ)¨$¯/©/¸9ÔEØ&*§j¡j×&;Ñ&;�D”OØ×3Ñ3Ô5Ø*.�DÔ'à—J‘J×<Ñ<¸T×=VÑ=VÐX\Ô]Ù@ÀÇÁÐW[Õ\Ø Ÿ.™.�Ø—;‘;˜y×)Ò)¨W¯[©[¸×-IÒ-IÈWÏ[É[ÐYm×MnÒMnØ#‘Dà(/°¯¬™9¸U�DÜ˜˜4˜&  '¨*Õ"5Ð!6Ð7Ô8Ü˜˜g lÕ3Ð4Ð5Ô6Ø˜6—?”?Ü˜E '¨&¥/Ð!2Ð3Ô4÷I TÑSøôJ ô VÙ@ÀÇÁÐW\Õ]ÝGÜ˜œ1Ð:Á,ÈqÃ/ÔRÐSÐT×UÑUûðVú÷K T×SÐSús^   Å>QÆ AO0ÇA"O0È(6O0É)C'O0ÍO0Í(O0Í?O0ÎAO0Ï0P>Ï;9P9Ð4QÐ9P>Ð>QÑQ	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   r‰  r/   r²   Údetailr:  r   r<   r   )r   s   "r   r   rÆ     s8   € ÷ Dñ D¨Cð D¸ð DÀSð DÐSVð DÐ[_ñ Dr   c                óÀ   € ^ RI HpHpHpHp VP                  R/ 4      P                  RR4      '       g   R# R W43 4       w  r4V! RV \        RWW4R	7       V 24       R# )
z‘Print a one-line scrollback summary of a resolved modal prompt (approval/clarify
panels vanish on repaint); gated by ``display.persist_prompts``.)rI   Ú_DIMÚ_RSTrJ   ÚdisplayÚpersist_promptsTNc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irÊ  )r7   )rA  Úss   & r   rB  Ú:CLISessionMixin._persist_prompt_summary.<locals>.<genexpr>	  s   é € ÐAÑ/@¨!œ7 1Ÿ:˜:Ó/@ùs   ‚rä   z"cli.session.persist_prompt_summary)r‰  r²   r�  r:  )r&   rI   r�  r�  rJ   rc   r   )	rÑ   r‰  r²   r�  r:  rI   r�  r�  rJ   s	   &&&&&    r   Ú_persist_prompt_summaryÚ'CLISessionMixin._persist_prompt_summary  sn   € ÷ 	8Ó7Ø�~‰~˜i¨Ó,×0Ñ0Ð1BÀD×IÒIÙÙA°Ñ/@ÓA‰ˆÙ�"�T�Fœ1ÐAÈÐbhÔzÐ{ð  }Að  |Bð  Cö  	Dr   c                ó  €  \         P                  pVe   VP                  4       '       g   R#   TP	                  R4       TP                  4        R#   \         d     R# i ; i  \         d�     ^ RIp^ RIHp \        P                  R8X  d   . ROpM#\        P                  ! R4      pT'       d   T.M. pT'       d(   TP                  TTP                  T! 4       RR7        R#  R#   \         d      R# i ; ii ; i)	zùClear screen + scrollback (``ESC[3J ESC[2J ESC[H``) so nothing is stranded above
the exit summary. Only safe after ``app.run()`` returned and prompt_toolkit restored
terminal modes. Skips when stdout isn't a console; falls back to ``clear``/``cls``.Nz[3J[2J[H)Úwindows_hide_flagsÚntÚclearF)ÚstdinÚcreationflagsÚcheck)rö  z/cÚcls)rA   ÚstdoutÚisattyr)   r»   ÚflushÚ
subprocessÚhermes_cli._subprocess_compatr™  rË   Únamerè   ÚwhichÚrunÚDEVNULL)rÑ   Ústreamr£  r™  ÚargvÚ	clear_bins   &     r   Ú_clear_terminal_on_exitÚ'CLISessionMixin._clear_terminal_on_exit  sÜ   € ð	Ü—Z‘ZˆFØŠ~ V§]¡]§_¢_Ùð &5ð	Ø�L‰LÐ/Ô0Ø�L‰LŽNøô	 ô 	Úð	ûô
 ô 	ðÛ!åLä—7‘7˜d”?Ú/‘Dä &§¢¨WÓ 5�Iß*3˜I™;¸�DßØ—N‘NØØ(×0Ñ0Ù&8Ó&:Ø#ð	 #÷ ò øô ô Ûðúð+	úsG   ‚)A °!A% ÁA"Á!A"Á%C>Á1AC*Â3C*Ã $C*Ã*C:Ã5C>Ã9C:Ã:C>c                ót  a aa€ ^ RI Ho \        S RR4      oS'       d   \        SR4      '       g   R# \        SRR4      pR VVV 3R llp Vf
   V! 4        R# V;_uu_ 4        V! 4        RRR4       R#   + '       g   i     R# ; i  \        \
        3 d   pSP                  RT4        Rp?R# Rp?ii ; i)	uÇ   Best-effort flush of the agent's live ``_session_messages`` before ``end_session()``
â€” a terminal close/SIGHUP can unwind the app while the agent thread still holds the
current turn only in memory.r²  ri   NÚ_persist_sessionÚ_session_persist_lockc               ó   € V ^8„  d   QhRR/# rŒ   r   )r   s   "r   r   ÚJCLISessionMixin._persist_active_session_before_close.<locals>.__annotate__<  s   € ÷ 0	2ñ 0	2 tñ 0	2r   c                 ó�  <a€ \        SR R4      p \        SRR4      o\        V \        4      '       g   \        SRR4      p \        V \        4      '       g   R# \        S\        4      '       dG   \        ;QJ d    V3R lV  4       F  '       g   K   RM	  RM! V3R lV  4       4      '       g   . V OSNp V '       g   R# \        SRR4      p\        V\        4      '       d   V'       d   VR,          SJ d   VRR pM\        V\        4      '       d   WJ d   Rp\        SRR4      f    ^ RIHp V! SRV4       \        SRR4      f   R# SP                  4        SP                  W4       \        SRR4      '       d$   SP                  Sn        SP                  4        R# R#   \         d    SP                  R	RR
7        R# i ; i)r  NÚ_pending_cli_user_messager–  c              3  ó*   <"  € T F  qSJ x € K
  	  R # 5irÊ  r   )rA  r!   Úpending_cli_messages   & €r   rB  ÚfCLISessionMixin._persist_active_session_before_close.<locals>._snapshot_and_persist.<locals>.<genexpr>F  s   øé € ð A<Ù2:¨QÐ(Õ(³(ùs   ƒTFÚ_cached_system_prompt)Ú_restore_or_build_system_promptz.Could not build system prompt during CLI closera   r…   r  )rf   rd   r   re   ÚanyÚagent.conversation_loopr¹  r)   rn   Ú_ensure_db_sessionr¯  r…   rÍ  )r  r–  r¹  r¶  ri   rL   rÑ   s      @€€€r   Ú_snapshot_and_persistÚSCLISessionMixin._persist_active_session_before_close.<locals>._snapshot_and_persist<  s©  ù€ ô ˜uÐ&9¸4Ó@ˆHÜ")¨%Ð1LÈdÓ"SÐÜ˜h¬×-Ò-Ü" 4Ð)?ÀÓF�Ü˜h¬×-Ò-ÙÜÐ-¬t×4Ò4¿S»Sô A<Ù2:óA<¿S¿SºSô A<Ù2:óA<÷ ><ò ><ð <˜XÐ;Ð':Ð;�ßÙô $+¨4Ð1GÈÓ#NÐ äÐ/´×6Ò6ß(Ø(¨Õ,Ð0CÓCà';¸C¸RÐ'@Ñ$ÜÐ 4´d×;Ò;Ð?SÓ?_Ø'+Ð$ô �uÐ5°tÓ<ÒDðÝWá3°E¸4ÐAUÔVô �uÐ5°tÓ<ÒDÙà×$Ñ$Ô&Ø×"Ñ" 8ÔBÜ�u˜l¨D×1Ò1Ø"'×"2Ñ"2�”Ø×/Ñ/Ö1ñ 2øô !ô Ø—L‘LÐ!QÐ\`�LÔaÚðús   Ä)F# Æ#GÇGz5Could not persist active CLI session before close: %s)r&   rL   rf   r¿  r)   ÚKeyboardInterruptrn   )rÑ   Úpersist_lockr½  r‰   ri   rL   s   f   @@r   Ú$_persist_active_session_before_closeÚ4CLISessionMixin._persist_active_session_before_close1  s˜   ú€ õ 	Ü˜˜g tÓ,ˆßœG EÐ+=×>Ò>Ùä˜uÐ&=¸tÓDˆ÷0	2ò 0	2ðd	Uð Ò#Ù%Ö'ç!’\Ù)Ô+÷ "—\—\’\ûäÔ,Ð-ô 	UØ�L‰LÐPÐRS×TÒTûð	Uús<   ÁB	 Á
B	 Á#A5Á+B	 Á5B	Â B	 ÂB	 Â	B7ÂB2Â2B7c               ó   € V ^8„  d   QhRR/# )r   Úclear_screenr;   r   )r   s   "r   r   rÆ   €  s   € ÷ Clñ Cl°ñ Clr   c           	     óž  € ^ RI Hp V'       d   V P                  4        \        4        ^ RI pVP                   F  p\        V4       K  	  VP                  P                  4        \        V P                  4      pV'       g&    ^ RIH	p V! \        R4      4      p\        V4       R# \        V P                   Uu. uF  qˆP                  R4      R8X  g   K  VNK  	  up4      p	\        V P                   Uu. uF3  qˆP                  R4      R8X  g   VP                  R4      '       g   K1  VNK5  	  up4      p
VP                  4       V P                  ,
          p\        \!        VP#                  4       4      R	4      w  rÍ\        V^<4      w  rï\        R
VR7      pV^ 8”  d   \        RWÎVR7      pMV^ 8”  d   \        RVVR7      pRpV P$                  '       dQ   \&        P(                  ! \        4      ;_uu_ 4        V P$                  P+                  V P,                  4      pRRR4       \        \        R4      4        ^ RIHp V! 4       pVR 9   d   RMRV 2p\        RV P,                   V 24       V'       d   \        RV RV 24       \        4        \        \        RV P,                  R7      4       V'       d   \        \        RVR7      4       \        \        RVR7      4       \        \        RWYV
R7      4       R#   \         d    \        R4      p ELi ; iu upi u upi   + '       g   i     EL; i  \         d    Rp ELi ; i)!a'  Print session resume info on exit. ``clear_screen`` (interactive TUI teardown)
wipes screen + scrollback first; single-query mode passes False to keep the answer.

Args: clear_screen: When True (default), clear the terminal screen and scrollback before printing
the summary. See #38252, #53009.
r$   N)Úget_active_goodbyezcli.session.goodbyerŒ  r�  rŽ  r”  i  zcli.shared.duration_s)Úsecondszcli.shared.duration_hm_rest)ÚhoursÚminutesÚrestzcli.shared.duration_m_rest)rÉ  rÊ  zcli.session.exit_resume_hint)Úget_active_profile_namer+   rN   z -p z  hermes --resume z  hermes -c "Ú"zcli.session.exit_label_sessionr¢   zcli.session.exit_label_titlerÙ  zcli.session.exit_label_duration)Údurationzcli.session.exit_label_messages)rù   r�  r”  )r+   Úcustom)r&   r%   r¬  r@   Ú_session_end_messagesr›  r6   r–  r  rÆ  r   r)   rc   r¸   rG  Údivmodr1   Útotal_secondsrƒ   rD  rE  Úget_session_titler…   Úhermes_cli.profilesrË  )rÑ   rÄ  r%   Ú_cli_modulerz  Ú	msg_countrÆ  Úgoodbyer!   Ú	user_msgsr”  ÚelapsedrÈ  Ú	remainderrÉ  rÇ  Úduration_strÚsession_titlerË  Ú_active_profileÚprofile_flags   &&                   r   Ú_print_exit_summaryÚ#CLISessionMixin._print_exit_summary€  s¸  € õ 	!ßð ×(Ñ(Ô*ÜŒÛ!à"×8Ô8ˆGÜ�'ŽNñ 9à×)Ñ)×/Ñ/Ô1Ü˜×1Ñ1Ó2ˆ	ßð3ÝEÙ,¬QÐ/DÓ-EÓF�ô �'ŒNÙä D×$=Ò$=ÓYÑ$=˜qÇÁÀvÃÐRXÑAXŸ˜Ñ$=ÑYÓZˆ	ÜØ×0Ò0ódÙ0�!·E±E¸&³MÀVÔ4KÈqÏuÉuÐUa×Ob�AˆAÑ0ñdó eˆ
à—,‘,“. 4×#5Ñ#5Õ5ˆÜ!¤# g×&;Ñ&;Ó&=Ó">ÀÓEÑˆÜ! )¨RÓ0ÑˆÜÐ0¸'ÔBˆØ�1Œ9ÜÐ:À%Ð_kÔl‰LØ�qŒ[ÜÐ9À7ÐQ]Ô^ˆLàˆØ××ÐÜ×$Ò$¤Y×/Õ/Ø $× 0Ñ 0× BÑ BÀ4Ç?Á?Ó S�÷ 0ô 	ŒaÐ.Ó/Ô0ð	(ÝCÙ5Ó7ˆOð -Ð0EÔE‘rÈTÐRaÐQbÐKcˆÜÐ" 4§?¡?Ð"3°L°>ÐBÔCßÜ�N = /°°L°>ÐBÔCÜŒÜŒaÐ0¸T¿_¹_ÔMÔNßÜ”!Ð2¸-ÔHÔIÜŒaÐ1¸LÔIÔJÜŒaÐ1¸Ð_iÔjÖkøôO ô 3ÜÐ1Ó2“ð3üò
 Zùòd÷ 0×/Ð/ûô ô 	(Ø'‹Oð	(úsH   ÂL  Â:LÃLÃ6.L"Ä)L"Ç8&L'È;L; Ì LÌLÌ'L8	Ì;MÍM)	rß  rà  rî  r†   rÞ  r–  rÏ  r…   rG  )é
   )FN)z/save)rü  T)rN   )T)"Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÒ   rÙ   rñ   rû   r&  rX  rd  ru  rŸ  r®  r·  rÁ  r¨  ró  r  r  r'  r;  Ústaticmethodr0  rÍ  rO  r`  rŠ  r–  r¬  rÁ  rÞ  Ú__static_attributes__r   r   r   rÂ   rÂ   Õ   så   † ñ:ð&È÷ &ð:EÈ÷ Eõ8õ	ò%SòN<M÷|ð°Yð ÈR÷ òBEõN3õ$ð& ØEI÷ ô8i4õV÷8<hõ|Gò$,÷\=ð~ ô	ó ð	õ.õWòC÷@IVõVDò#òJMU÷^Cló Clr   rÂ   )éx   )$rå  Ú
__future__r   rD  rË   rè   rA   Ú
agent.i18nr   r´  r   Úhermes_state_idsr   Úpathlibr	   Úrich.consoler
   Úrich.markupr   rD   Útypingr   r   r   r   r"   r,   r7   rE   rv   rŠ   r‘   rŸ   r›   rÀ   rÂ   r   r   r   Ú<module>rð     sy   ðñõ #ã Û 	Û Û 
å Ý ,Ý +Ý Ý  Ý )ß ,Ó ,õZò	÷Dõ9õ1Qõhõ0uò
ò.Sò"5÷<nló nlr   