§
    øžyjvd ã                  óÜ   — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZmZmZmZm Z m!Z!  G d„ d¦  «        Z"dS )u  Slash-command handlers for the interactive CLI (god-file decomposition Phase 4).

This module hosts the ``_handle_*_command`` slash-command handlers lifted out of
``cli.py``'s ``HermesCLI`` class. ``HermesCLI`` inherits ``CLICommandsMixin`` so
every ``self.<handler>`` call resolves unchanged via the MRO â€” behavior-neutral.

Import discipline (mirrors gateway/slash_commands.py, PR #41886):
  * Neutral, non-cyclic deps are imported at module top-level below.
  * cli.py-internal symbols (the ``_cprint``/``_ACCENT``/``save_config_value``â€¦
    module-level helpers and constants) are imported LAZILY inside each handler
    via ``from cli import ...`` â€” that resolves at call time when ``cli`` is fully
    loaded, so the mixin module never imports ``cli`` at top level (no cycle).
é    )ÚannotationsN)Údatetime)Úurlparse)Úbox)Úescape)ÚPanel)Údisplay_hermes_homeÚ	is_termux)Úextract_api_content_sidecar)ÚDEFAULT_BROWSER_CDP_URLÚdiscover_local_cdp_urlÚfind_free_debug_portÚis_browser_debug_readyÚlaunch_chrome_debugÚlocal_port_in_useÚmanual_chrome_debug_commandc                  óæ  — e Zd ZdZdOd„ZdOd„ZdPd	„ZdQd„ZdOd„ZdOd„Z	dOd„Z
d„ Zd„ ZdRd„Zd„ ZdRd„ZdSd„ZdTd„Zd„ ZdUd„ZdRd„ZdRd„ZdRd„ZdTd„ZdTd „ZdTd!„ZdTd"„ZdTd#„ZdTd$„ZdTd%„ZdTd&„ZdTd'„ZdTd(„Z dTd)„Z!dTd*„Z"dVd-„Z#dTd.„Z$dWd/„Z%dTd0„Z&dWd1„Z'dWd2„Z(dWd3„Z)dXd5„Z*dWd6„Z+dTd7„Z,dYdZd:„Z-dRd;„Z.dRd<„Z/d[d>„Z0d\d@„Z1d]dA„Z2dRdB„Z3dRdC„Z4dRdD„Z5dTdE„Z6dTdF„Z7dTdG„Z8dTdH„Z9dYdSdI„Z:d^dJ„Z;dOdK„Z<dOdL„Z=d_dM„Z>dNS )`ÚCLICommandsMixinzñMixin holding the interactive-CLI slash-command handlers.

    All methods use only ``self`` state plus the imports above and per-method
    lazy ``from cli import ...`` lines, so they compose cleanly onto
    ``HermesCLI`` via the MRO.
    ÚcommandÚstrc           	     ó’  — ddl m} t          | d¦  «        r| j        st	          d¦  «         dS | j        j        }|j        s/t	          d¦  «         t	          d¦  «         t	          d¦  «         dS t          j        d	t          j	        ¦   «         ¦  «        }| 
                    ¦   «         }t          |¦  «        d
k    r
|d
d…         ng }|s0|                     |¦  «        }t	           |||¦  «        ¦  «         dS |d                              ¦   «         dk    �r…t          |¦  «        dk     rt	          d¦  «         dS |                     |¦  «        }|st	          d|› �¦  «         dS |                      |d
         |¦  «        }|sdS |                     ||¦  «        }	|	d         rÞ|	                     dd¦  «        }
|	                     dd¦  «        }|
s|st	          d¦  «         n¶|
rt	          d|
› �¦  «         |r‡|                     ¦   «         }t          |¦  «        dk    rNt	          d                     |dd…         ¦  «        ¦  «         t	          dt          |¦  «        dz
  › d�¦  «         n+t	          d|› �¦  «         nt	          d|	d         › �¦  «         dS |                     |¦  «        }|st	          d|› �¦  «         dS |                      |d         |¦  «        }|sdS t          |¦  «        d
k    r|d
         nd}|                     |||¬¦  «        }	|	d         r‡|r%t	          d|› d|	d         › d|	d         › �¦  «         n!t	          d|	d         › d|	d         › �¦  «         t	          d ¦  «         | j        r'|                      d!¬"¦  «         t	          d#¦  «         dS dS t	          d|	d         › �¦  «         dS )$u“  Handle /rollback â€” list, diff, or restore filesystem checkpoints.

        Syntax:
            /rollback                 â€” list checkpoints
            /rollback <N>             â€” restore checkpoint N (also undoes last chat turn)
            /rollback diff <N>        â€” preview changes since checkpoint N
            /rollback <N> <file>      â€” restore a single file from checkpoint N
        r   )Úformat_checkpoint_listÚagentú  No active agent session.Nz  Checkpoints are not enabled.ú#  Enable with: hermes --checkpointsú3  Or in config.yaml: checkpoints: { enabled: true }ÚTERMINAL_CWDé   Údiffé   z  Usage: /rollback diff <N>z  No checkpoints found for ÚsuccessÚstatÚ z#  No changes since this checkpoint.Ú
éP   ú
  ... (z more lines, showing first 80)u     â�Œ Úerror)Ú	file_pathu     âœ… Restored z from checkpoint Úrestored_toú: Úreasonu     âœ… Restored to checkpoint z2  A pre-rollback snapshot was saved automatically.F)Úprefillz0  Chat turn undone to match restored file state.)Útools.checkpoint_managerr   Úhasattrr   ÚprintÚ_checkpoint_mgrÚenabledÚosÚgetenvÚgetcwdÚsplitÚlenÚlist_checkpointsÚlowerÚ_resolve_checkpoint_refr   ÚgetÚ
splitlinesÚjoinÚrestoreÚconversation_historyÚ	undo_last)Úselfr   r   ÚmgrÚcwdÚpartsÚargsÚcheckpointsÚtarget_hashÚresultr"   r   Ú
diff_linesr(   s                 úC/home/ragecks/.hermes/hermes-agent/hermes_cli/cli_commands_mixin.pyÚ_handle_rollback_commandz)CLICommandsMixin._handle_rollback_command3   sL  € ð 	DÐCÐCÐCÐCÐCå�t˜WÑ%Ô%ð 	¨T¬Zð 	ÝÐ.Ñ/Ô/Ð/ØˆFàŒjÔ(ˆØŒ{ð 	ÝÐ2Ñ3Ô3Ð3ÝÐ7Ñ8Ô8Ð8ÝÐGÑHÔHÐHØˆFåŒi˜­¬	©¬Ñ4Ô4ˆØ—’‘”ˆÝ ™JœJ¨šN˜Nˆu�Q�R�RŒyˆy°ˆàð 	à×.Ò.¨sÑ3Ô3ˆKÝÐ(Ð(¨°cÑ:Ô:Ñ;Ô;Ð;ØˆFð �Œ7�=Š=‰?Œ?˜fÒ$Ñ$Ý�4‰yŒy˜1Š}ˆ}ÝÐ3Ñ4Ô4Ð4Ø�Ø×.Ò.¨sÑ3Ô3ˆKØð ÝÐ9°CÐ9Ð9Ñ:Ô:Ð:Ø�Ø×6Ò6°t¸A´wÀÑLÔLˆKØð Ø�Ø—X’X˜c ;Ñ/Ô/ˆFØ�iÔ ð 2Ø—z’z &¨"Ñ-Ô-�Ø—z’z &¨"Ñ-Ô-�Øð / Dð /ÝÐ?Ñ@Ô@Ð@Ð@àð +Ý˜k 4˜k˜kÑ*Ô*Ð*Øð /à%)§_¢_Ñ%6Ô%6˜
Ý˜z™?œ?¨RÒ/Ð/Ý! $§)¢)¨J°s¸°s¬OÑ"<Ô"<Ñ=Ô=Ð=Ý!Ð"b­c°*©o¬oÀÑ.BÐ"bÐ"bÐ"bÑcÔcÐcÐcå! + t + +Ñ.Ô.Ð.øåÐ0˜v gœÐ0Ð0Ñ1Ô1Ð1ØˆFð ×*Ò*¨3Ñ/Ô/ˆØð 	ÝÐ5°Ð5Ð5Ñ6Ô6Ð6ØˆFà×2Ò2°4¸´7¸KÑHÔHˆØð 	ØˆFõ  # 4™yœy¨1š}˜}�D˜”G�G°$ˆ	à—’˜S +¸�ÑCÔCˆØ�)Ôð 	.Øð cÝÐo¨	ÐoÐoÀFÈ=ÔDYÐoÐoÐ]cÐdlÔ]mÐoÐoÑpÔpÐpÐpåÐa°f¸]Ô6KÐaÐaÈvÐV^ÔO_ÐaÐaÑbÔbÐbÝÐFÑGÔGÐGð Ô(ð JØ—’ u�Ñ-Ô-Ð-ÝÐHÑIÔIÐIÐIÐIðJð Jõ Ð,˜6 'œ?Ð,Ð,Ñ-Ô-Ð-Ð-Ð-ó    c                óÞ  — ddl }	 |                     |¦  «        dd…         }n,# t          $ r |                     ¦   «         dd…         }Y nw xY wd}d}g }|D ]I}|                     ¦   «         }|dv rd}Œ|dv rd	}Œ$|d
v rd}Œ+|dk    rd}Œ4|                     |¦  «         ŒJt          j        dt          j        ¦   «         ¦  «        }	|dk    r|                      |	|¦  «         dS ddl	m
}
  |
|	||pd¬¦  «        }|                     d¦  «        s(t          d|                     dd¦  «        › �¦  «         dS |                     dd¦  «        }|                     dd¦  «        }|                     dg ¦  «        }|                     d¦  «        s|s|s|st          d¦  «         dS ddddœ|         }|r(t          d|› d�¦  «         |                      |¦  «         |rh|d v rdt          d!¦  «         |dd"…         D ]}t          d#|› �¦  «         Œt          |¦  «        d"k    r#t          d$t          |¦  «        d"z
  › d%�¦  «         |s|sdS |                     ¦   «         }t          d¦  «         t          |¦  «        d&k    rU|                      d'                     |dd&…         ¦  «        ¦  «         t          d(t          |¦  «        d&z
  › d)�¦  «         dS |                      |¦  «         dS )*u  Handle /diff â€” show git changes in the working directory.

        Syntax:
            /diff                  â€” unstaged changes + untracked files
            /diff staged           â€” staged changes (git diff --cached)
            /diff all              â€” staged + unstaged + untracked (vs HEAD)
            /diff session          â€” everything Hermes changed (checkpoint baseline)
            /diff [mode] --stat    â€” summary only (changed files + counts)
            /diff [mode] <path...> â€” restrict to specific paths
        r   Nr   FÚworking)z--statr"   T)Ústagedz--stagedÚcachedz--cachedrN   )Úallú--allÚheadrP   Úsessionr   )Úcollect_working_diff)ÚmodeÚpathsr!   ú  r'   úCould not generate diffr"   r#   r   Ú	untrackedÚemptyz  No changes.ÚUnstagedÚStagedzAll (vs HEAD))rM   rN   rP   ú
  ú:)rM   rP   z
  Untracked:é   z    + z    ... and z moreé�  r$   r&   u/    more lines â€” run /diff --stat for a summary))Úshlexr5   Ú
ValueErrorr8   Úappendr2   r3   r4   Ú_print_session_diffÚtools.working_diffrT   r:   r/   Ú_print_diff_textr6   r;   r<   )r@   r   ra   rC   Ú	stat_onlyrU   rV   ÚargÚlowrB   rT   rG   r"   r   rY   ÚlabelÚrelrH   s                     rI   Ú_handle_diff_commandz%CLICommandsMixin._handle_diff_command‘   s�  € ð 	ˆˆˆð	(Ø—K’K Ñ(Ô(¨¨¨Ô,ˆEˆEøÝð 	(ð 	(ð 	(Ø—M’M‘O”O A B BÔ'ˆEˆEˆEð	(øøøð ˆ	ØˆØˆØð 	"ð 	"ˆCØ—)’)‘+”+ˆCØÐ(Ð(Ð(Ø �	�	ØÐDÐDÐDØ��ØÐ0Ð0Ð0Ø��Ø˜	Ò!Ð!Ø ��à—’˜SÑ!Ô!Ð!Ð!åŒi˜­¬	©¬Ñ4Ô4ˆà�9ÒÐØ×$Ò$ S¨)Ñ4Ô4Ð4ØˆFà;Ð;Ð;Ð;Ð;Ð;à%Ð% c°¸E¸MÀTÐJÑJÔJˆØ�zŠz˜)Ñ$Ô$ð 	ÝÐG�v—z’z 'Ð+DÑEÔEÐGÐGÑHÔHÐHØˆFà�zŠz˜& "Ñ%Ô%ˆØ�zŠz˜& "Ñ%Ô%ˆØ—J’J˜{¨BÑ/Ô/ˆ	Ø�:Š:�gÑÔð 	 tð 	°Dð 	Àð 	Ý�/Ñ"Ô"Ð"ØˆFà&°(À?ÐSÐSÐTXÔYˆØð 	(Ý�/˜�/�/�/Ñ"Ô"Ð"Ø×!Ò! $Ñ'Ô'Ð'Øð 	A˜Ð!3Ð3Ð3ÝÐ"Ñ#Ô#Ð#Ø   " ”~ð &ð &�Ý�n˜s�n�nÑ%Ô%Ð%Ð%Ý�9‰~Œ~ Ò"Ð"ÝÐ?¥S¨¡^¤^°bÑ%8Ð?Ð?Ð?Ñ@Ô@Ð@Øð 	˜Dð 	ØˆFà—_’_Ñ&Ô&ˆ
Ýˆb‰	Œ	ˆ	Ýˆz‰?Œ?˜SÒ Ð Ø×!Ò! $§)¢)¨J°t¸°tÔ,<Ñ"=Ô"=Ñ>Ô>Ð>Ýð2�C 
™OœO¨cÑ1ð 2ð 2ð 2ñô ð ð ð ð
 ×!Ò! $Ñ'Ô'Ð'Ð'Ð's   †$ ¤&AÁArB   rg   Úboolc                óÈ  — t          | d¦  «        r| j        st          d¦  «         dS | j        j        }|j        s>t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         dS |                     |¦  «        }|                     d¦  «        s(t          d	|                     d
d¦  «        › �¦  «         dS |                     dd¦  «        }|                     dd¦  «        }|                     d¦  «        s|s|st          d¦  «         dS |r|                      d|› �¦  «         |s|sdS |                     ¦   «         }t          d¦  «         t          |¦  «        dk    rU|                      d 
                    |dd…         ¦  «        ¦  «         t          dt          |¦  «        dz
  › d�¦  «         dS |                      |¦  «         dS )z>Print the cumulative checkpoint-baseline diff (/diff session).r   r   Nz>  Checkpoints are not enabled, so there's no session baseline.r   r   u5     (Plain /diff still works â€” it uses git directly.)r!   rW   r'   rX   r"   r#   r   rZ   u9     No changes â€” Hermes hasn't edited any files here yet.r$   r`   r&   u7    more lines â€” run /diff session --stat for a summary))r.   r   r/   r0   r1   Úsession_diffr:   rf   r;   r6   r<   )r@   rB   rg   rA   rG   r"   r   rH   s           rI   rd   z$CLICommandsMixin._print_session_diffß   s  € å�t˜WÑ%Ô%ð 	¨T¬Zð 	ÝÐ.Ñ/Ô/Ð/ØˆFàŒjÔ(ˆØŒ{ð 	ÝÐRÑSÔSÐSÝÐ7Ñ8Ô8Ð8ÝÐGÑHÔHÐHÝÐIÑJÔJÐJØˆFà×!Ò! #Ñ&Ô&ˆØ�zŠz˜)Ñ$Ô$ð 	ÝÐG�v—z’z 'Ð+DÑEÔEÐGÐGÑHÔHÐHØˆFà�zŠz˜& "Ñ%Ô%ˆØ�zŠz˜& "Ñ%Ô%ˆØ�:Š:�gÑÔð 	 tð 	°Dð 	ÝÐMÑNÔNÐNØˆFàð 	/Ø×!Ò! + t + +Ñ.Ô.Ð.Øð 	˜Dð 	ØˆFØ—_’_Ñ&Ô&ˆ
Ýˆb‰	Œ	ˆ	Ýˆz‰?Œ?˜SÒ Ð Ø×!Ò! $§)¢)¨J°t¸°tÔ,<Ñ"=Ô"=Ñ>Ô>Ð>Ýð:�C 
™OœO¨cÑ1ð :ð :ð :ñô ð ð ð ð
 ×!Ò! $Ñ'Ô'Ð'Ð'Ð'rK   ÚtextÚreturnÚNonec                ó¸   — t          | dd¦  «        }|�7	 ddlm} |                      ||¦  «        ¦  «         dS # t          $ r Y nw xY wt          |¦  «         dS )zËRender diff/stat text with color when a rich console is present.

        Falls back to plain print when the console isn't available (e.g. unit
        tests instantiating the mixin standalone).
        ÚconsoleNr   )Ú_rich_text_from_ansi)ÚgetattrÚcliru   r/   Ú	Exception)r@   rp   rt   ru   s       rI   rf   z!CLICommandsMixin._print_diff_text  s„   € õ ˜$ 	¨4Ñ0Ô0ˆØÐðØ4Ð4Ð4Ð4Ð4Ð4Ø—’Ð2Ð2°4Ñ8Ô8Ñ9Ô9Ð9Ø�øÝð ð ð Ø�ðøøøåˆd‰Œˆˆˆs   •$; »
AÁAc                óT  — ddl m}m}m}m} ddlm} |                     ¦   «         }t          |¦  «        dk    r|d          	                    ¦   «         nd}|dv �r0 |¦   «         }	|	s t          d¦  «         t          d¦  «         d	S t          d
 |¦   «         › d�¦  «         t          ddd›ddd›ddd›ddd›dd› �
¦  «         t          dd› dd› dd› dd› dd› �
¦  «         t          |	d¦  «        D ]–\  }
}|                     dd¦  «        }|dk     r|› d�}n|dk     r
|dz  d ›d!�}n|dz  dz  d"›d#�}|                     d$¦  «        pd%}t          d|
d&›d|d'         d›d|                     d(d¦  «        d›d|d›d|› �
¦  «         Œ—d	S |d)k    ret          |¦  «        d*k    rd                     |d*d	…         ¦  «        nd	} ||¬+¦  «        }|rt          d,|› �¦  «         d	S t          d-¦  «         d	S |d.v �rt          |¦  «        d/k     r=t          d0¦  «          |d¬1¦  «        }	|	rt          d2|	d         d'         › �¦  «         d	S |d*         }	 t          |¦  «        } |¦   «         }	d|cxk    rt          |	¦  «        k    rn n|	|dz
           d'         }n"t          d3t          |	¦  «        › d4�¦  «         d	S n# t          $ r Y nw xY w ||¦  «        r#t          d5|› �¦  «         t          d6¦  «         d	S t          d7|› �¦  «         d	S |d8k    rpd9}t          |¦  «        d*k    r7	 t          |d*         ¦  «        }n # t          $ r t          d:¦  «         Y d	S w xY w ||¬;¦  «        }t          d<|› d=|› d>�¦  «         d	S t          d?|› �¦  «         t          d@¦  «         d	S )Auu  Handle /snapshot â€” lightweight state snapshots for Hermes config/state.

        Syntax:
            /snapshot                  â€” list recent snapshots
            /snapshot create [label]   â€” create a snapshot
            /snapshot restore <id>     â€” restore state from snapshot
            /snapshot prune [N]        â€” prune to N snapshots (default 20)
        r   )Úcreate_quick_snapshotÚlist_quick_snapshotsÚrestore_quick_snapshotÚprune_quick_snapshots)r	   r   Úlist>   Úlsr~   z  No state snapshots yet.z&  Create one: /snapshot create [label]Nz  State snapshots (z/state-snapshots/):
rW   ú#z>3ÚIDz<35Ú ÚFilesz>5ÚSizez>10ÚLabelu	   â”€â”€â”€ui   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u   â”€â”€â”€â”€â”€u   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u<   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€Ú
total_sizei   z Bi   ú.0fz KBz.1fz MBrj   r#   Ú3ÚidÚ
file_countÚcreater    )rj   z  Snapshot created: z#  No state files found to snapshot.>   Úrewindr=   é   z(  Usage: /snapshot restore <snapshot-id>©Úlimitz  Most recent: z!  Invalid snapshot number. Use 1-ú.z  Restored state from: z:  Restart recommended for state.db changes to take effect.z  Snapshot not found: Úpruner_   z%  Usage: /snapshot prune [keep-count])Úkeepz	  Pruned z old snapshot(s) (keeping ú).z  Unknown subcommand: z?  Usage: /snapshot [list|create [label]|restore <id>|prune [N]])Úhermes_cli.backuprz   r{   r|   r}   Úhermes_constantsr	   r5   r6   r8   r/   Ú	enumerater:   r<   Úintrb   )r@   r   rz   r{   r|   r}   r	   rC   ÚsubcmdÚsnapsÚiÚsÚsizeÚsize_strrj   Úsnap_idÚidxr’   Údeleteds                      rI   Ú_handle_snapshot_commandz)CLICommandsMixin._handle_snapshot_command  s/  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	9Ð8Ð8Ð8Ð8Ð8à—’‘”ˆÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸ˆà�^Ð#Ñ#Ø(Ð(Ñ*Ô*ˆEØð ÝÐ1Ñ2Ô2Ð2ÝÐ>Ñ?Ô?Ð?Ø�ÝÐTÐ(;Ð(;Ñ(=Ô(=ÐTÐTÐTÑUÔUÐUÝÐO�sÐOÐOÐO ÐOÐOÐO¨GÐOÐOÐO¸ÐOÐOÐOÀgÐOÐOÑPÔPÐPÝÐL�wÐLÐL (ÐLÐL¨WÐLÐL°xÐLÐLÀ(ÐLÐLÑMÔMÐMÝ! %¨Ñ+Ô+ð 	dð 	d‘��1Ø—u’u˜\¨1Ñ-Ô-�Ø˜$’;�;Ø"&˜{˜{˜{�H�HØ˜KÒ'Ð'Ø"&¨¡+Ð6Ð6Ð6Ð6�H�Hà"&¨¡+°Ñ"4Ð=Ð=Ð=Ð=�HØŸš˜g™œÐ,¨"�ÝÐb˜1ÐbÐbÐb ! D¤'ÐbÐbÐb°·²°lÀAÑ0FÔ0FÐbÐbÐbÈHÐbÐbÐbÐ[`ÐbÐbÑcÔcÐcÐcð	dð 	dð �xÒÐÝ+.¨u©:¬:¸ª>¨>�C—H’H˜U 1 2 2œYÑ'Ô'Ð'¸tˆEØ+Ð+°%Ð8Ñ8Ô8ˆGØð =ÝÐ6¨WÐ6Ð6Ñ7Ô7Ð7Ð7Ð7åÐ;Ñ<Ô<Ð<Ð<Ð<àÐ,Ð,Ñ,Ý�5‰zŒz˜AŠ~ˆ~ÝÐ@ÑAÔAÐAà,Ð,°1Ð5Ñ5Ô5�Øð >ÝÐ<¨E°!¬H°T¬NÐ<Ð<Ñ=Ô=Ð=Ø�Ø˜A”hˆGð	Ý˜'‘l”l�Ø,Ð,Ñ.Ô.�Ø˜Ð)Ð)Ò)Ð)�s 5™zœzÒ)Ð)Ð)Ð)Ð)Ø# C¨!¡Gœn¨TÔ2�G�GåÐK½cÀ%¹j¼jÐKÐKÐKÑLÔLÐLØ�Fð øõ ð ð ð Ø�ðøøøà%Ð% gÑ.Ô.ð :ÝÐ9°Ð9Ð9Ñ:Ô:Ð:ÝÐRÑSÔSÐSÐSÐSåÐ8¨wÐ8Ð8Ñ9Ô9Ð9Ð9Ð9à�wÒÐØˆDÝ�5‰zŒz˜AŠ~ˆ~ðÝ˜u Qœx™=œ=�D�DøÝ!ð ð ð ÝÐAÑBÔBÐBØ�F�Fðøøøð ,Ð+°Ð6Ñ6Ô6ˆGÝÐI˜gÐIÐIÀÐIÐIÐIÑJÔJÐJÐJÐJõ Ð3¨6Ð3Ð3Ñ4Ô4Ð4ÝÐSÑTÔTÐTÐTÐTs%   ÉA(J? Ê?
KËKÌ-M ÍM ÍM c                ó  — ddl m}m} |                     ¦   «         dd…         }d}d|v r_|                     d¦  «        }|dz   t          |¦  «        k    rt          d¦  «         dS ||dz            }|d|…         ||dz   d…         z   }|r|d         n |¦   «         pd}|s|› d	�}	  |||¦  «        }t          d
|› d|› �¦  «         t          d¦  «         dS # t          t          f$ r}	t          d|	› �¦  «         Y d}	~	dS d}	~	ww xY w)u/  Handle /export â€” export a profile to a shareable .tar.gz archive.

        Syntax:
            /export                       â€” export the active profile
            /export <profile>             â€” export a named profile
            /export [profile] -o <path>   â€” choose the output path
        r   )Úexport_profileÚget_active_profile_namer   Nz-oz-  Usage: /export [profile] [-o output.tar.gz]r    Údefaultz.tar.gzu     âœ“ Exported 'z' to zM  Share it: the other user runs /import or `hermes profile import <archive>`.ú	  Error: )	Úhermes_cli.profilesr£   r¤   r5   Úindexr6   r/   rb   ÚFileNotFoundError)
r@   r   r£   r¤   rC   ÚoutputrŸ   ÚnamerG   Úes
             rI   Ú_handle_export_commandz'CLICommandsMixin._handle_export_commandn  sr  € ð 	PÐOÐOÐOÐOÐOÐOÐOà—’‘”   Ô#ˆØˆØ�5ˆ=ˆ=Ø—+’+˜dÑ#Ô#ˆCØ�Q‰w�#˜e™*œ*Ò$Ð$ÝÐEÑFÔFÐFØ�Ø˜3 ™7”^ˆFØ˜$˜3˜$”K %¨¨a©¨¨¤/Ñ1ˆEà ÐNˆu�QŒxˆxÐ'>Ð'>Ñ'@Ô'@Ð'MÀIˆØð 	&ØÐ%Ð%Ð%ˆFð	#Ø#�^ D¨&Ñ1Ô1ˆFÝÐ8 TÐ8Ð8°Ð8Ð8Ñ9Ô9Ð9ÝÐaÑbÔbÐbÐbÐbøÝÕ-Ð.ð 	#ð 	#ð 	#Ý�/˜a�/�/Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"øøøøð	#øøøs   Â(0C ÃDÃ+DÄDc                óÌ  — ddl m}m}m} |                     ¦   «         dd…         }d}d|v r_|                     d¦  «        }|dz   t          |¦  «        k    rt          d¦  «         dS ||dz            }|d|…         ||dz   d…         z   }|st          d¦  «         dS d                     |¦  «        }	  |||¬	¦  «        }	n7# t          t          t          f$ r}
t          d
|
› �¦  «         Y d}
~
dS d}
~
ww xY w|	j        }t          d|› d|	› �¦  «         	  ||¦  «        s ||¦  «        }|rt          d|› �¦  «         n# t          $ r Y nw xY wt          d|› �¦  «         dS )u“   Handle /import â€” import a shared profile archive as a new profile.

        Syntax:
            /import <archive.tar.gz> [--name <name>]
        r   )Úcheck_alias_collisionÚcreate_wrapper_scriptÚimport_profiler   Nú--namez1  Usage: /import <archive.tar.gz> [--name <name>]r    r‚   ©r«   r¦   u     âœ“ Imported profile 'z' at z  Wrapper created: z  Use it: hermes -p )r§   r¯   r°   r±   r5   r¨   r6   r/   r<   rb   ÚFileExistsErrorr©   r«   rx   )r@   r   r¯   r°   r±   rC   r«   rŸ   ÚarchiveÚprofile_dirr¬   ÚimportedÚwrapper_paths                rI   Ú_handle_import_commandz'CLICommandsMixin._handle_import_command�  sÿ  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —’‘”   Ô#ˆØˆØ�uÐÐØ—+’+˜hÑ'Ô'ˆCØ�Q‰w�#˜e™*œ*Ò$Ð$ÝÐIÑJÔJÐJØ�Ø˜˜q™”>ˆDØ˜$˜3˜$”K %¨¨a©¨¨¤/Ñ1ˆEàð 	ÝÐEÑFÔFÐFØˆFà—(’(˜5‘/”/ˆð	Ø(˜.¨°tÐ<Ñ<Ô<ˆKˆKøÝ�OÕ->Ð?ð 	ð 	ð 	Ý�/˜a�/�/Ñ"Ô"Ð"ØˆFˆFˆFˆFˆFøøøøð	øøøð Ô#ˆÝÐE¨ÐEÐE¸ÐEÐEÑFÔFÐFð	Ø(Ð(¨Ñ2Ô2ð @Ø4Ð4°XÑ>Ô>�Øð @ÝÐ>°Ð>Ð>Ñ?Ô?Ð?øøÝð 	ð 	ð 	ØˆDð	øøøåÐ/ XÐ/Ð/Ñ0Ô0Ð0Ð0Ð0s*   Â5C ÃC7ÃC2Ã2C7Ä*E Å
EÅEc                ó¬  — ddl m} |                     ¦   «         }d„ |D ¦   «         }	 ddlm}m}  |¦   «         }n# t          $ r d}d}Y nw xY w|s|st          d¦  «         dS |rGt          dt          |¦  «        › d�¦  «         | 	                    ¦   «         }t          d	|› d
�¦  «         |r#|�# |d¬¦  «        }t          d|› d�¦  «         dS dS dS )u  Handle /stop â€” kill all running background processes and
        background (async) delegations.

        Inspired by OpenAI Codex's separation of interrupt (stop current turn)
        from /stop (clean up background processes). See openai/codex#14602.
        r   )Úprocess_registryc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©ÚstatusÚrunning©r:   ©Ú.0Úps     rI   ú
<listcomp>z9CLICommandsMixin._handle_stop_command.<locals>.<listcomp>Â  ó,   € ÐHÐHÐH˜¨1¯5ª5°©?¬?¸iÒ+GÐ+G�1Ð+GÐ+GÐ+GrK   )Úactive_countÚinterrupt_allNz"  No running background processes.z  Stopping z background process(es)...u     âœ… Stopped z process(es).z/stop©r+   u     âœ… Interrupted z background delegation(s).)
Útools.process_registryr»   Úlist_sessionsÚtools.async_delegationrÆ   rÇ   rx   r/   r6   Úkill_all)	r@   r»   Ú	processesr¿   rÆ   rÇ   Ún_asyncÚkilledÚstoppeds	            rI   Ú_handle_stop_commandz%CLICommandsMixin._handle_stop_command¸  sW  € ð 	<Ð;Ð;Ð;Ð;Ð;à$×2Ò2Ñ4Ô4ˆ	ØHÐH˜iÐHÑHÔHˆð	!ØJÐJÐJÐJÐJÐJÐJÐJØ"�l‘n”nˆGˆGøÝð 	!ð 	!ð 	!ØˆGØ ˆMˆMˆMð	!øøøð ð 	˜wð 	ÝÐ6Ñ7Ô7Ð7ØˆFàð 	:ÝÐH¥ G¡¤ÐHÐHÐHÑIÔIÐIØ%×.Ò.Ñ0Ô0ˆFÝÐ8 6Ð8Ð8Ð8Ñ9Ô9Ð9Øð 	L�}Ð0Ø#�m¨7Ð3Ñ3Ô3ˆGÝÐJ wÐJÐJÐJÑKÔKÐKÐKÐKð	Lð 	LÐ0Ð0s   ¨; »AÁAc           	     ól  — ddl m} ddlm}m} |                     ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         } |dt          |¦  «        › �¦  «         |D ]g}|                     dd¦  «        d	d
…         } ||                     dd¦  «        ¦  «        }	 |d|                     dd¦  «        › d|	› d|› �¦  «         Œh|r |dt          |¦  «        › �¦  «         	 ddlm	}
  |
¦   «         }n# t          $ r g }Y nw xY wd„ |D ¦   «         }|�r� |dt          |¦  «        › d�¦  «         |D �]a}|                     d¦  «        pdd	d…         }|                     dd¦  «        }d|                     dd¦  «        › d|› d|› �}|dk    r"|                     d¦  «        }|�
|d|d›d�z  }n+|dv r'|                     d¦  «        }|�|dk    r
|d |d›d!�z  } ||¦  «         t          |                     d"¦  «        pg ¦  «        D ]‡\  }}t          |t          ¦  «        sŒ|                     d#¦  «        }|rd$|› �nd%}d&|d'z   › d(|                     d)d¦  «        › d*|› �}|                     d+¦  «        }|�
|d,|d›d-�z  } ||¦  «         Œˆ�Œct          | d.d/¦  «        } |d0|rd1nd2› �¦  «         d	S )3u>   Handle /agents â€” show background processes and agent status.r   ©Ú_cprint)Úformat_uptime_shortr»   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS r½   rÀ   rÁ   s     rI   rÄ   z;CLICommandsMixin._handle_agents_command.<locals>.<listcomp>ß  rÅ   rK   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS r½   rÀ   rÁ   s     rI   rÄ   z;CLICommandsMixin._handle_agents_command.<locals>.<listcomp>à  s,   € ÐIÐIÐI˜!¨A¯EªE°(©O¬O¸yÒ,HÐ,H�AÐ,HÐ,HÐ,HrK   z  Running processes: r   r#   Nr%   Úuptime_secondsú    Ú
session_idú?u    Â· z  Recently finished: )Úlist_async_delegationsc                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )r¾   )r¿   ÚstallingrÀ   )rÂ   Úds     rI   rÄ   z;CLICommandsMixin._handle_agents_command.<locals>.<listcomp>ñ  s8   € ð 
ð 
ð 
ØØ�uŠu�X‰ŒÐ"9Ð9Ð9ð Ø9Ð9Ð9rK   z  Background delegations: z runningÚgoalé<   r¾   Údelegation_idrÞ   Ústalled_after_quiet_secondsu    Â· no progress r‡   u   s â€” interrupting)r¿   Úseconds_since_progressu
    Â· quiet r›   Úchildren_activityÚcurrent_toolzin zbetween turnsu         â”” child r   r*   Ú	api_callsu    api calls Â· Úseconds_since_activityu    Â· last activity zs agoÚ_agent_runningFz	  Agent: r¿   Úidle)rw   rÔ   rÉ   rÕ   r»   rÊ   r6   r:   rË   rÜ   rx   r–   Ú
isinstanceÚdictrv   )r@   rÔ   rÕ   r»   rÍ   r¿   ÚfinishedrÃ   ÚcmdÚuprÜ   ÚdelegationsÚ	running_drß   rà   r¾   ÚlineÚquietrš   ÚchildÚtoolÚdoingÚpartrê   Úagent_runnings                            rI   Ú_handle_agents_commandz'CLICommandsMixin._handle_agents_commandÙ  s  € àÐÐÐÐÐØPÐPÐPÐPÐPÐPÐPÐPà$×2Ò2Ñ4Ô4ˆ	ØHÐH˜iÐHÑHÔHˆØIÐI˜yÐIÑIÔIˆàˆÐ6­¨G©¬Ð6Ð6Ñ7Ô7Ð7Øð 	Hð 	HˆAØ—%’%˜	 2Ñ&Ô& s¨ sÔ+ˆCØ$Ð$ Q§U¢UÐ+;¸QÑ%?Ô%?Ñ@Ô@ˆBØˆGÐF˜1Ÿ5š5 ¨sÑ3Ô3ÐFÐF¸ÐFÐFÀÐFÐFÑGÔGÐGÐGàð 	=ØˆGÐ;­C°©M¬MÐ;Ð;Ñ<Ô<Ð<ð	ØEÐEÐEÐEÐEÐEØ0Ð0Ñ2Ô2ˆKˆKøÝð 	ð 	ð 	ØˆKˆKˆKð	øøøð
ð 
Ø"ð
ñ 
ô 
ˆ	ð ñ !	"ØˆGÐIµ°Y±´ÐIÐIÐIÑJÔJÐJØ ð "ñ "�ØŸš˜f™œÐ+¨¨S¨b¨SÔ1�ØŸš˜x¨Ñ-Ô-�ð*˜1Ÿ5š5 °#Ñ6Ô6ð *ð *Øð*ð *Ø#'ð*ð *ð ð
 ˜ZÒ'Ð'ØŸEšEÐ"?Ñ@Ô@�EØÐ(ØØL¨uÐLÐLÐLÐLñ˜øð ˜|Ð+Ð+ØŸEšEÐ":Ñ;Ô;�EØÐ(¨U°bª[¨[ØÐ 9¨UÐ 9Ð 9Ð 9Ð 9Ñ9˜Ø�˜‘”�Ý )¨!¯%ª%Ð0CÑ*DÔ*DÐ*JÈÑ KÔ Kð "ð "‘H�A�uÝ% e­TÑ2Ô2ð !Ø Ø Ÿ9š9 ^Ñ4Ô4�DØ,0ÐE˜L $˜L˜L˜L°o�EðN¨1¨q©5ð Nð NØ Ÿ9š9 [°#Ñ6Ô6ðNð NØFKðNð Nð ð !Ÿ9š9Ð%=Ñ>Ô>�DØÐ'ØÐ D°TÐ DÐ DÐ DÐ DÑD˜Ø�G˜D‘M”M�M�Mñ"õ   Ð&6¸Ñ>Ô>ˆØˆÐD¨ÐB˜I˜I¸FÐDÐDÑEÔEÐEÐEÐEs   ÃC/ Ã/C>Ã=C>Úcmd_originalc                ó
  — ddl }ddl}ddl}ddlm} ddlm} ddlm} | 	                    dd¬¦  «        } ||¦  «         | 
                    dd	¦  «        }		 |                     t          |	¦  «        d	k    r| 
                    |	d	         ¦  «        ng ¦  «        }
n# t          $ r Y dS w xY wt          |
d
d¦  «        dv }	 |r|
                     |
¦  «         dS d|
_        |                     ¦   «         } ||¦  «        5  |
                     |
¦  «         ddd¦  «         n# 1 swxY w Y    ||                     ¦   «                              d¦  «        ¦  «         dS # t(          $ r} |d|› �¦  «         Y d}~dS d}~ww xY w)ur  Handle /journey â€” the learning timeline (see `hermes journey`).

        The read-only views (default + ``list``) render Rich color, which
        patch_stdout would swallow as raw escapes; capture with forced ANSI and
        re-emit through ``_cprint``. ``delete``/``edit`` are interactive
        (confirm prompt / ``$EDITOR``) so they keep the real stdio.
        r   N©Úredirect_stdoutrÓ   )Úregister_cliz/journeyF)ÚprogÚadd_helpr   Újourney_action)ÚdeleteÚeditTr$   z  /journey failed: )ÚargparseÚiora   Ú
contextlibrý   rw   rÔ   Úhermes_cli.journeyrþ   ÚArgumentParserr5   Ú
parse_argsr6   Ú
SystemExitrv   ÚfuncÚforce_colorÚStringIOÚgetvalueÚrstriprx   )r@   rú   r  r  ra   rý   rÔ   rþ   ÚparserÚrestrD   ÚinteractiveÚbufÚexcs                 rI   Ú_handle_journey_commandz(CLICommandsMixin._handle_journey_command  s,  € ð 	ˆˆˆØˆ	ˆ	ˆ	ØˆˆˆØ.Ð.Ð.Ð.Ð.Ð.àÐÐÐÐÐØ3Ð3Ð3Ð3Ð3Ð3à×(Ò(¨jÀ5Ð(ÑIÔIˆØˆ�VÑÔÐØ×!Ò! $¨Ñ*Ô*ˆð	Ø×$Ò$½SÀ¹Y¼YÈº]¸] U§[¢[°°a´Ñ%9Ô%9Ð%9ÐPRÑSÔSˆDˆDøÝð 	ð 	ð 	ØˆFˆFð	øøøõ ˜dÐ$4°dÑ;Ô;Ð?QÐQˆð
	1Øð Ø—	’	˜$‘”�Ø�Ø#ˆDÔØ—+’+‘-”-ˆCØ � Ñ%Ô%ð  ð  Ø—	’	˜$‘”�ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  àˆG�C—L’L‘N”N×)Ò)¨$Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0øÝð 	1ð 	1ð 	1ØˆGÐ/¨#Ð/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð	1øøøsU   ÁAB Â
B*Â)B*ÃE Ã&E Ä D"ÄE Ä"D&Ä&E Ä)D&Ä*3E Å
FÅ)E=Å=Fc                óN  — ddl m}m}m}m} t          ¦   «         r |d|› d |¦   «         › |› �¦  «         dS ddlm}  |¦   «         rL|                      ¦   «         r%t          | j
        ¦  «        } |d|› d�¦  «         dS  |d|› d	|› �¦  «         dS  |d|› d
|› �¦  «         dS )u   Handle /paste â€” explicitly check clipboard for an image.

        This is the reliable fallback for terminals where BracketedPaste
        doesn't fire for image-only clipboard content (e.g., VSCode terminal,
        Windows Terminal with WSL2).
        r   )Ú_DIMÚ_RSTrÔ   Ú_termux_example_image_pathrW   uh   Clipboard image paste is not available on Termux â€” use /image <path> or paste a local image path like N)Úhas_clipboard_imageu     ðŸ“Ž Image #z attached from clipboardz2(>_<) Clipboard has an image but extraction failedz!(._.) No image found in clipboard)rw   r  r  rÔ   r  Ú_is_termux_environmentÚhermes_cli.clipboardr  Ú_try_attach_clipboard_imager6   Ú_attached_images)r@   r  r  rÔ   r  r  Úns          rI   Ú_handle_paste_commandz&CLICommandsMixin._handle_paste_command@  s;  € ð 	HÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÝ!Ñ#Ô#ð 	ØˆGð8�Tð 8ð 8à-Ð-Ñ/Ô/ð8à15ð8ð 8ñô ð ð
 ˆFà<Ð<Ð<Ð<Ð<Ð<ØÐÑ Ô ð 	HØ×/Ò/Ñ1Ô1ð ]Ý˜Ô-Ñ.Ô.�Ø�ÐD¨ÐDÐDÐDÑEÔEÐEÐEÐEà�Ð[˜TÐ[Ð[ÐUYÐ[Ð[Ñ\Ô\Ð\Ð\Ð\àˆGÐF˜ÐFÐFÀÐFÐFÑGÔGÐGÐGÐGrK   c                óf  — ddl m}m} |                     d¬¦  «        }t	          |¦  «        dk    r|d                              ¦   «         nd}d„ | j        D ¦   «         }|s |d¦  «         dS |rh	 t          |¦  «        dz
  }n# t          $ r  |d	¦  «         Y dS w xY w|dk     s|t	          |¦  «        k    r |d
t	          |¦  «        › d�¦  «         dS n~t	          |¦  «        dz
  }|dk    rS |||          	                    d¦  «        ¦  «        s/|dz  }|dk    r$ |||          	                    d¦  «        ¦  «        ¯/|dk     r |d¦  «         dS  |||          	                    d¦  «        ¦  «        }|s |d¦  «         dS 	 ddl
m}	m}
  |	¦   «         r)|                      |¦  «          |d|dz   › d�¦  «         dS  |
|¦  «        r |d|dz   › d�¦  «         dS |                      |¦  «          |d|dz   › d�¦  «         dS # t          $ r} |d|› �¦  «         Y d}~dS d}~ww xY w)u=   Handle /copy [number] â€” copy assistant output to clipboard.r   )Ú_assistant_copy_textrÔ   r   ©Úmaxsplitr#   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚroleÚ	assistantrÀ   ©rÂ   Úms     rI   rÄ   z9CLICommandsMixin._handle_copy_command.<locals>.<listcomp>`  s,   € ÐZÐZÐZ˜1¸Q¿UºUÀ6¹]¼]ÈkÒ=YÐ=Y�QÐ=YÐ=YÐ=YrK   z  Nothing to copy yet.Nz  Usage: /copy [number]z!  Invalid response number. Use 1-r�   Úcontentz-  Nothing to copy in assistant responses yet.z-  Nothing to copy in that assistant response.)Úis_remote_shell_sessionÚwrite_clipboard_textz  Copied assistant response #z' via OSC 52 (terminal support required)z to clipboardz  Clipboard copy failed: )rw   r"  rÔ   r5   r6   Ústripr>   r—   rb   r:   r  r+  r,  Ú_write_osc52_clipboardrx   )r@   rú   r"  rÔ   rC   rh   r'  rŸ   rp   r+  r,  r¬   s               rI   Ú_handle_copy_commandz%CLICommandsMixin._handle_copy_commandZ  sQ  € à5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø×"Ò"¨AÐ"Ñ.Ô.ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆàZÐZ Ô 9ÐZÑZÔZˆ	Øð 	ØˆGÐ,Ñ-Ô-Ð-ØˆFàð 	ðÝ˜#‘h”h ‘l��øÝð ð ð Ø�Ð1Ñ2Ô2Ð2Ø��ðøøøð �QŠwˆw˜#¥ Y¡¤Ò/Ð/Ø�ÐM½CÀ	¹N¼NÐMÐMÐMÑNÔNÐNØ�ð 0õ �i‘.”. 1Ñ$ˆCØ˜’(�(Ð#7Ð#7¸	À#¼×8JÒ8JÈ9Ñ8UÔ8UÑ#VÔ#V�(Ø�q‘�ð ˜’(�(Ð#7Ð#7¸	À#¼×8JÒ8JÈ9Ñ8UÔ8UÑ#VÔ#V�(à�QŠwˆwØ�ÐGÑHÔHÐHØ�à#Ð# I¨c¤N×$6Ò$6°yÑ$AÔ$AÑBÔBˆØð 	ØˆGÐCÑDÔDÐDØˆFð	5ðð ð ð ð ð ð ð ð 'Ð&Ñ(Ô(ð 	ð ×+Ò+¨DÑ1Ô1Ð1Ø�ð2°C¸!±Gð 2ð 2ð 2ñô ð ð �Ø#Ð# DÑ)Ô)ð Ø�ÐN¸¸a¹ÐNÐNÐNÑOÔOÐOØ�ð ×'Ò'¨Ñ-Ô-Ð-ØˆGð.°°a±ð .ð .ð .ñô ð ð ð øõ ð 	5ð 	5ð 	5ØˆGÐ3°Ð3Ð3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð	5øøøs6   Á1B ÂBÂBÆ
9H ÇH Ç$'H È
H0ÈH+È+H0c                óª  — ddl m}m}m}m}m}m}m} d|v r.|                     dd¦  «        d          	                    ¦   «         nd}	|	s/t          ¦   «         r
 |¦   «         nd}
 |d|› d	|
› |› �¦  «         dS  ||	¦  «        \  }} ||¦  «        }|€ |d|› d
|› |› �¦  «         dS |j                             ¦   «         |vr |d|› d|j        › |› �¦  «         dS | j                             |¦  «          |d|j        › �¦  «         |r |d|› d|› |› �¦  «         dS t          ¦   «         r$ |d|› d ||j        ¦  «        › d|› �¦  «         dS dS )uG   Handle /image <path> â€” attach a local image file for the next prompt.r   )r  Ú_IMAGE_EXTENSIONSr  rÔ   Ú_resolve_attachment_pathÚ_split_path_inputr  r‚   Nr   r#   z/path/to/image.pngrW   z"Usage: /image <path>  e.g. /image z(>_<) File not found: z"(._.) Not a supported image file: u     ðŸ“Ž Attached image: z<Now type your prompt (or use --image in single-query mode): z;Tip: type your next message, or run hermes chat -q --image z "What do you see?")rw   r  r1  r  rÔ   r2  r3  r  r5   r-  r  Úsuffixr8   r«   r  rc   )r@   rú   r  r1  r  rÔ   r2  r3  r  Úraw_argsÚhintÚ
path_tokenÚ
_remainderÚ
image_paths                 rI   Ú_handle_image_commandz&CLICommandsMixin._handle_image_command—  sŽ  € ð 	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	HØ>AÀ\Ð>QÐ>Q�L×&Ò& t¨QÑ/Ô/°Ô2×8Ò8Ñ:Ô:Ð:ÐWYˆØð 	Ý3IÑ3KÔ3KÐeÐ-Ð-Ñ/Ô/Ð/ÐQeˆDØˆGÐM˜ÐMÐMÀÐMÀtÐMÐMÑNÔNÐNØˆFà!2Ð!2°8Ñ!<Ô!<Ñˆ
�JØ-Ð-¨jÑ9Ô9ˆ
ØÐØˆGÐG˜ÐGÐG°ZÐGÀÐGÐGÑHÔHÐHØˆFØÔ×"Ò"Ñ$Ô$Ð,=Ð=Ð=ØˆGÐX˜ÐXÐXÀÄÐXÐRVÐXÐXÑYÔYÐYØˆFàÔ×$Ò$ ZÑ0Ô0Ð0ØˆÐ;¨*¬/Ð;Ð;Ñ<Ô<Ð<Øð 	dØˆGÐm˜ÐmÐmÐ[eÐmÐgkÐmÐmÑnÔnÐnÐnÐnÝ#Ñ%Ô%ð 	dØˆGð  c˜ð  cð  cÐZtÐZtÐuô  vEñ  [Fô  [Fð  cð  cð  ]að  cð  cñ  dô  dð  dð  dð  dð	dð 	drK   rî   c                óJ  ‡ ‡‡‡‡— ddl m}m}m}mŠ ddl}ddlm} ddlm	Š ddl
mŠ ddlmŠ d$ˆˆˆˆ ˆfd„}	 |                     |¦  «        }n$# t          $ r |                     ¦   «         }Y nw xY wt!          |¦  «        dk    r|d         nd}	|	dvr‰                      ¦   «          dS |	dk    r | |dd¬¦  «        ¦  «         dS |dd…         }
|
s;t%          d|	› d�¦  «         t%          d|	› d�¦  «         t%          d|	› d�¦  «         dS |	dk    rdnd}d                     |
¦  «        } ‰|› |› d|› d|› �¦  «          | ||	|
d¬ ¦  «        ¦  «         dd!lm} dd"lm}  | |¦   «         d¦  «        ‰ _        ‰                      ¦   «           ‰|› d#|› �¦  «         dS )%a`  Handle /tools [list|disable|enable] slash commands.

        /tools (no args) shows the tool list.
        /tools list shows enabled/disabled status per toolset.
        /tools disable/enable saves the change to config and resets
        the session so the new tool set takes effect cleanly (no
        prompt-cache breakage mid-conversation).
        r   )Ú_ACCENTr  r  rÔ   N)Ú	Namespacerü   )r  )Útools_disable_enable_commandÚnsr=  rq   rr   c                ó8  •— t          ‰dd¦  «        € ‰| ¦  «         dS  G d„ d‰¦  «        } |¦   «         } ‰|¦  «        5   ‰| ¦  «         ddd¦  «         n# 1 swxY w Y   |                     ¦   «                              ¦   «         D ]} ‰|¦  «         ŒdS )a�  Run tools_disable_enable_command, routing its ANSI-colored
            print() output through _cprint when inside the interactive TUI
            so escapes aren't mangled by patch_stdout's StdoutProxy into
            garbled '?[32m...?[0m' text.

            Outside the TUI (standalone mode, tests), call straight through
            so real stdout / pytest capture works as expected.
            Ú_appNc                  ó   — e Zd Zdd„ZdS )úMCLICommandsMixin._handle_tools_command.<locals>._run_capture.<locals>._TTYBufrq   rm   c                ó   — dS )NT© )r@   s    rI   ÚisattyzTCLICommandsMixin._handle_tools_command.<locals>._run_capture.<locals>._TTYBuf.isattyÒ  s   € Ø˜4rK   N©rq   rm   )Ú__name__Ú
__module__Ú__qualname__rF  rE  rK   rI   Ú_TTYBufrC  Ñ  s(   € € € € € ð ð  ð  ð  ð  ð  rK   rK  )rv   r  r;   )	r?  rK  r  rò   r  rÔ   rý   r@   r>  s	       €€€€€rI   Ú_run_capturez<CLICommandsMixin._handle_tools_command.<locals>._run_captureÀ  s  ø€ õ �t˜V TÑ*Ô*Ð2Ø,Ð,¨RÑ0Ô0Ð0Ø�ð
 ð  ð  ð  ð  ˜(ñ  ô  ð  ð �'‘)”)ˆCØ � Ñ%Ô%ð 1ð 1Ø,Ð,¨RÑ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1àŸš™œ×1Ò1Ñ3Ô3ð ð �Ø�˜‘”��ðð s   ÁAÁAÁ"Ar   r#   >   r~   ÚenableÚdisabler~   rw   )Útools_actionÚplatformr    z(._.) Usage: /tools z <name> [name ...]z  Built-in toolset:  /tools z webz  MCP tool:          /tools z github:create_issuerN  Ú	DisablingÚEnablingú, r‚   ú...)rO  ÚnamesrP  )Ú_get_platform_tools©Úload_configz0Session reset. New tool configuration is active.)r?  r=  rq   rr   )rw   r<  r  r  rÔ   ra   r  r=  r  rý   r  r  Úhermes_cli.tools_configr>  r5   rb   r6   Ú
show_toolsr/   r<   rV  Úhermes_cli.configrX  Úenabled_toolsetsÚnew_session)r@   rî   r<  r  r  ra   r=  rL  rC   Ú
subcommandrU  Úverbrj   rV  rX  r  rÔ   rý   r>  s   `              @@@@rI   Ú_handle_tools_commandz&CLICommandsMixin._handle_tools_command°  s³  øøøøø€ ð 	5Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØˆˆˆØ&Ð&Ð&Ð&Ð&Ð&Ø.Ð.Ð.Ð.Ð.Ð.ØÐÐÐÐÐØHÐHÐHÐHÐHÐHð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð6	 Ø—K’K Ñ$Ô$ˆEˆEøÝð 	 ð 	 ð 	 Ø—I’I‘K”KˆEˆEˆEð	 øøøõ "% U¡¤¨a¢ �U˜1”X�X°Rˆ
ØÐ:Ð:Ð:Ø�OŠOÑÔÐØˆFà˜ÒÐØˆL˜˜°ÀÐGÑGÔGÑHÔHÐHØˆFà�a�b�b”	ˆØð 	ÝÐG¨ÐGÐGÐGÑHÔHÐHÝÐA°ÐAÐAÐAÑBÔBÐBÝÐQ°ÐQÐQÐQÑRÔRÐRØˆFð
 )¨IÒ5Ð5ˆ{ˆ{¸:ˆØ—	’	˜%Ñ Ô ˆØˆ�7Ð3˜DÐ3Ð3 5Ð3Ð3¨TÐ3Ð3Ñ4Ô4Ð4àˆ�Y�Y¨J¸eÈeÐTÑTÔTÑUÔUÐUð 	@Ð?Ð?Ð?Ð?Ð?Ø1Ð1Ð1Ð1Ð1Ð1Ø 3Ð 3°K°K±M´MÀ5Ñ IÔ IˆÔØ×ÒÑÔÐØˆ�4ÐOÐOÈÐOÐOÑPÔPÐPÐPÐPs   ¹A ÁA0Á/A0c                óö   — ddl m}m}  |d |d¬¦  «        ¦  «        }|j        d         }|j        d         }t	          ¦   «          t	          d|› �¦  «         t	          d|› �¦  «         t	          ¦   «          d	S )
z/Display active profile name and home directory.r   ©ÚCommandContextÚexecute_commandÚprofilerw   ©ÚsurfaceÚhomez  Profile: z  Home:    N)Úhermes_cli.slash_execrc  rd  Údatar/   )r@   rc  rd  ÚreplyÚprofile_nameÚdisplays         rI   Ú_handle_profile_commandz(CLICommandsMixin._handle_profile_command   s”   € àIÐIÐIÐIÐIÐIÐIÐIà� 	¨>¨>À%Ð+HÑ+HÔ+HÑIÔIˆØ”z )Ô,ˆØ”*˜VÔ$ˆå‰ŒˆÝÐ*˜LÐ*Ð*Ñ+Ô+Ð+ÝÐ%˜GÐ%Ð%Ñ&Ô&Ð&Ý‰ŒˆˆˆrK   c           	     óN
  — ddl m} ddlm} |                     d¬¦  «        }t          |¦  «        dk     s|d                              ¦   «         s# |d¦  «          |d¦  «          |d	¦  «         d
S |d                              ¦   «                              ¦   «         }	 ddlm	}m
} n&# t          $ r} |d|› �¦  «         Y d}~d
S d}~ww xY w	  ||¦  «        }	n'# t          t          f$ r  |d|› d�¦  «         Y d
S w xY w	  |¦   «         }
n&# t          $ r} |d|› �¦  «         Y d}~d
S d}~ww xY w|
j                             |	¦  «        }|r|j        sod}	 ddlm} |
j                             |j        ¦  «        }|r|j        rd„  |¦   «         D ¦   «         }||v }n# t          $ r d}Y nw xY w|s |d|› d�¦  «         d
S |
                     |	¦  «        }|r|j        s |d|› d�¦  «          |d¦  «         d
S t-          | dd¦  «        r |d¦  «         d
S | j        s'	 ddlm}  |¦   «         | _        n# t          $ r Y nw xY w| j        s |d |¦   «         › �¦  «         d
S 	 | j                             | j        ¦  «        }|s2d| j        dd…         › �}| j                             | j        |¦  «         n&# t          $ r} |d|› �¦  «         Y d}~d
S d}~ww xY wd}	 | j                             | j        ¦  «        }|r|                     d ¦  «        pd}n# t          $ r Y nw xY w|s| j        dd…         }| j                             | j        |¦  «        }|s |d!¦  «         d
S  |d"|› d#|› d$|j        › d%�¦  «          |d&¦  «         ddl}|                     ¦   «         d'z   }d(}|                     ¦   «         |k     �r	 | j                             | j        ¦  «        }n# t          $ r d}Y nw xY w|pi                      d)¦  «        pd(}||k    r|d*k    r |d+¦  «         |}|d,k    r< |d¦  «          |d-|› d�¦  «          |d.|› �¦  «          |d¦  «         d
| _         dS |d/k    r4|pi                      d0¦  «        pd1} |d2|› �¦  «          |d3¦  «         d
S | !                    d4¦  «         |                     ¦   «         |k     �°	 | j         "                    | j        d5¦  «         n# t          $ r Y nw xY w |d6¦  «          |d7¦  «         d
S )8u  Handle ``/handoff <platform>`` â€” transfer this CLI session to a gateway platform.

        Flow:
          1. Validate platform name + the gateway has a home channel for it.
          2. Reject if the agent is currently running (the in-flight turn
             would race with the gateway's switch_session).
          3. Write ``handoff_state='pending'`` on this session row.
          4. Block-poll ``state.db`` for terminal state (timeout 60s).
          5. On ``completed`` â†’ print resume hint and signal CLI exit by
             returning False (the caller honors that like ``/quit``).
          6. On ``failed`` / timeout â†’ print error and return True so the
             user keeps their CLI session.

        Returns:
            False to signal CLI exit, True to keep going.
        r   rÓ   ©Úformat_session_db_unavailabler   r#  r    z  Usage: /handoff <platform>z@  Hands the current session off to that platform's home channel.z:  The CLI session ends here; resume it later with /resume.T)Úload_gateway_configÚPlatformz!  Could not load gateway config: Nz  Unknown platform 'z'.F)Úrelay_platform_identitiesc                ó   — h | ]\  }}|’ŒS rE  rE  )rÂ   rÃ   Ú_s      rI   ú	<setcomp>z;CLICommandsMixin._handle_handoff_command.<locals>.<setcomp>L  s   € ÐIÐIÐI¡T Q¨˜qÐIÐIÐIrK   z  Platform 'z+' is not configured/enabled in the gateway.z!  No home channel configured for r�   z6  Set one with /sethome on the destination chat first.ré   zJ  Agent is busy. Wait for the current turn to finish, then retry /handoff.)Ú	SessionDBrW   zhandoff-é   z,  Could not ensure session row in state.db: r#   ÚtitlezN  Session is already in flight for handoff. Wait for it to settle, then retry.z  Queued handoff of 'u   ' â†’ z (home: r“   z*  Waiting for the gateway to pick it up...g      N@ÚpendingÚstater¿   z'  Gateway picked it up; transferring...Ú	completedu5     â†» Handoff complete. The session is now active on z,  Resume it on this CLI later with: /resume Úfailedr'   zunknown errorz  Handoff failed: zV  Your CLI session is intact. Try /handoff again, or /resume on the platform manually.ç      à?ztimed out waiting for gatewayzA  Timed out waiting for the gateway. Is `hermes gateway` running?z  Your CLI session is intact.)#rw   rÔ   Úhermes_staterq  r5   r6   r-  r8   Úgateway.configrr  rs  rx   rb   ÚKeyErrorÚ	platformsr:   r1   Úgateway.relayrt  ÚRELAYÚget_home_channelÚchat_idrv   Ú_session_dbrx  Úget_sessionrÚ   Úset_session_titleÚrequest_handoffr«   ÚtimeÚget_handoff_stateÚ_should_exitÚsleepÚfail_handoff)r@   rú   rÔ   rq  rC   Úplatform_namerr  rs  r  rP  Ú	gw_configÚpcfgÚrelay_frontsrt  Ú	relay_cfgÚfrontedrh  rx  ÚrowÚplaceholder_titleÚsession_titleÚokÚ_timeÚdeadlineÚ
last_stateÚ	state_rowÚcurrentÚerrs                               rI   Ú_handle_handoff_commandz(CLICommandsMixin._handle_handoff_command  sl  € ð" 	 ÐÐÐÐÐØ>Ð>Ð>Ð>Ð>Ð>à×"Ò"¨AÐ"Ñ.Ô.ˆÝˆu‰:Œ:˜Š>ˆ>  q¤§¢Ñ!1Ô!1ˆ>ØˆGÐ2Ñ3Ô3Ð3ØˆGÐVÑWÔWÐWØˆGÐPÑQÔQÐQØ�4à˜aœŸšÑ(Ô(×.Ò.Ñ0Ô0ˆð	ØDÐDÐDÐDÐDÐDÐDÐDÐDøÝð 	ð 	ð 	ØˆGÐ=¸Ð=Ð=Ñ>Ô>Ð>Ø�4�4�4�4�4øøøøð	øøøð	Ø�x Ñ.Ô.ˆHˆHøÝ�HÐ%ð 	ð 	ð 	ØˆGÐ<¨=Ð<Ð<Ð<Ñ=Ô=Ð=Ø�4�4ð	øøøð	Ø+Ð+Ñ-Ô-ˆIˆIøÝð 	ð 	ð 	ØˆGÐ=¸Ð=Ð=Ñ>Ô>Ð>Ø�4�4�4�4�4øøøøð	øøøð Ô"×&Ò& xÑ0Ô0ˆØð 	˜4œ<ð 	ð !ˆLð%ØCÐCÐCÐCÐCÐCØ%Ô/×3Ò3°H´NÑCÔC�	Øð < Ô!2ð <ØIÐIÐ-FÐ-FÑ-HÔ-HÐIÑIÔI�GØ#0°GÐ#;�LøøÝð %ð %ð %Ø$���ð%øøøàð Ø�Ða }ÐaÐaÐaÑbÔbÐbØ�tà×)Ò)¨(Ñ3Ô3ˆØð 	˜4œ<ð 	ØˆGÐH¸ÐHÐHÐHÑIÔIÐIØˆGÐLÑMÔMÐMØ�4õ �4Ð)¨5Ñ1Ô1ð 	ØˆGÐ`ÑaÔaÐaØ�4ð Ôð 	ðØ2Ð2Ð2Ð2Ð2Ð2Ø#, 9¡;¤;�Ô Ð øÝð ð ð Ø�ðøøøàÔð 	ØˆGÐ:Ð6Ð6Ñ8Ô8Ð:Ð:Ñ;Ô;Ð;Ø�4ð	ØÔ"×.Ò.¨t¬Ñ?Ô?ˆCØð Wð
 %E¨t¬¸rÀ¸rÔ/BÐ$DÐ$DÐ!ØÔ ×2Ò2°4´?ÐDUÑVÔVÐVøøÝð 	ð 	ð 	ØˆGÐHÀ3ÐHÐHÑIÔIÐIØ�4�4�4�4�4øøøøð	øøøð
 ˆð	ØÔ"×.Ò.¨t¬Ñ?Ô?ˆCØð 7Ø #§¢¨Ñ 0Ô 0Ð 6°B�øøÝð 	ð 	ð 	ØˆDð	øøøàð 	0Ø œO¨B¨Q¨BÔ/ˆMð Ô×-Ò-¨d¬o¸}ÑMÔMˆØð 	ØˆGÐdÑeÔeÐeØ�4àˆÐa¨ÐaÐa¸]ÐaÐaÐTXÔT]ÐaÐaÐaÑbÔbÐbØˆÐ<Ñ=Ô=Ð=ð 	ÐÐÐØ—:’:‘<”< $Ñ&ˆØˆ
Ø�jŠj‰lŒl˜XÒ%Ñ%ð!Ø Ô,×>Ò>¸t¼ÑOÔO�	�	øÝð !ð !ð !Ø �	�	�	ð!øøøà � B×+Ò+¨GÑ4Ô4ÐA¸	ˆGØ˜*Ò$Ð$Ø˜iÒ'Ð'Ø�GÐEÑFÔFÐFØ$�
Ø˜+Ò%Ð%Ø�˜‘”�Ø�Ð`ÐP]Ð`Ð`Ð`ÑaÔaÐaØ�ÐVÀ}ÐVÐVÑWÔWÐWØ�˜‘”�à$(�Ô!Ø�uØ˜(Ò"Ð"Ø � B×+Ò+¨GÑ4Ô4ÐG¸�Ø�Ð2¨SÐ2Ð2Ñ3Ô3Ð3Ø�ÐpÑqÔqÐqØ�tØ�KŠK˜ÑÔÐð/ �jŠj‰lŒl˜XÒ%Ñ%ð4	ØÔ×)Ò)¨$¬/Ð;ZÑ[Ô[Ð[Ð[øÝð 	ð 	ð 	ØˆDð	øøøàˆÐSÑTÔTÐTØˆÐ/Ñ0Ô0Ð0Øˆts¶   Â B) Â)
CÂ3CÃCÃC Ã D Ã?D Ä
D Ä
D2ÄD-Ä-D2ÅAF" Æ"F1Æ0F1È'H= È=
I
É	I
É-AK Ë
K$ËKËK$Ë*8L# Ì#
L0Ì/L0ÏO/ Ï/O>Ï=O>Ó S? Ó?
TÔTc                ó0  ‡— ddl m}m} |                     dd¦  «        }t	          |¦  «        dk    r|d                              ¦   «         nd}t	          |¦  «        dk    r||d         dk    r|d         d	k    sH|d         d
k    r|d         dk    s0|d         dk    r|d         dk    s|d         dk    r(|d         dk    r|dd…                              ¦   «         }|sK |d¦  «         |                      d¬¦  «        r|                      d¬¦  «        | _        dS  |d¦  «         dS d| _        | j	        sddl
m}  |d |¦   «         › �¦  «         dS |                     ¦   «         rn|                      d¬¦  «        }t          |¦  «        }|dk     s|t	          |¦  «        k    r |d|› d�¦  «          |d¦  «         dS ||dz
           }	|	d         }
nddlm}  ||¦  «        }|p|}
| j	                             |
¦  «        }|s |d|› �¦  «          |d¦  «         dS 	 | j	                             |
¦  «        }n# t$          $ r |
}Y nw xY w|r8||
k    r2 |d|
› d|› d�¦  «         |}
| j	                             |
¦  «        }|r|}|
| j        k    r |d ¦  «         dS | j        }| j        r8	 | j                             | j        | j        ¬!¦  «         n# t$          $ r Y nw xY w	 | j	                             | j        d"¦  «         n# t$          $ r Y nw xY w|
| _        d#| _        d| _         ||
¦  «         | j	                             |
¦  «        \  }}d$„ |pg D ¦   «         }|| _        d%„ |pg D ¦   «         | _        	 | j	                             |
¦  «         n# t$          $ r Y nw xY w| j        �r|
| j        _        | j                             ¦   «          t=          | j        d&¦  «        rt	          | j        ¦  «        | j        _        t=          | j        d'¦  «        r,	 dd(l m!}  |¦   «         | j        _"        n# t$          $ r Y nw xY wt=          | j        d)¦  «        r| j         #                    ¦   «          	 tI          | j        d*d¦  «        }|�| %                    |
|pdd+d¬,¦  «         n# t$          $ r Y nw xY w| &                    d-¦  «        rd.|d-         › d�nd}dd/l'm(Š t	          ˆfd0„| j        D ¦   «         ¦  «        }| j        rI |d1|
› |› d2|› d3|dk    rd4nd› d5t	          | j        ¦  «        › d6�
¦  «         |  )                    ¦   «          n |d1|
› |› d7�¦  «         |  *                    |¦  «         |  +                    |¦  «         dS )8uW   Handle /resume <session_id_or_title> â€” switch to a previous session mid-conversation.r   ©rÔ   Ú_sync_process_session_idNr   r#   r    Ú<éÿÿÿÿÚ>Ú[Ú]ú"ú'z-  Usage: /resume <number|session_id_or_title>ÚresumerÈ   é
   rŽ   zA  Tip:   Use /history or `hermes sessions list` to find sessions.rp  rW   z  Resume index z is out of range.z:  Use /resume with no arguments to see available sessions.r‰   )Ú_resolve_session_by_name_or_idz  Session not found: zC  Use /history or `hermes sessions list` to see available sessions.z
  Session z was compressed into z/; resuming the descendant with your transcript.z  Already on that session.©r>   Úresumed_otherTc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©r&  Úsession_metarÀ   r(  s     rI   rÄ   z;CLICommandsMixin._handle_resume_command.<locals>.<listcomp>-  s,   € ÐXÐXÐX˜!¸¿º¸f¹¼ÈÒ8WÐ8W�AÐ8WÐ8WÐ8WrK   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS r²  rÀ   r(  s     rI   rÄ   z;CLICommandsMixin._handle_resume_command.<locals>.<listcomp>/  s3   € ð (
ð (
ð (
Ø°!·%²%¸±-´-À>Ò2QÐ2QˆAÐ2QÐ2QÐ2QrK   Ú_last_flushed_db_idxÚ_todo_store©Ú	TodoStoreÚ_invalidate_system_promptÚ_memory_managerF©Úparent_session_idÚresetr+   rz  z ")Úis_user_originated_turnc                ó*   •— g | ]} ‰|¦  «        ¯|‘ŒS rE  rE  )rÂ   r)  r¾  s     €rI   rÄ   z;CLICommandsMixin._handle_resume_command.<locals>.<listcomp>]  s+   ø€ Ð_Ð_Ð_˜qÐD[ÐD[Ð\]ÑD^ÔD^Ð_˜Ð_Ð_Ð_rK   u     â†» Resumed session ú (ú user messager›   rS  z total)u!    â€” no messages, starting fresh.),rw   rÔ   r¤  r5   r6   r-  Ú_show_recent_sessionsÚ_list_recent_sessionsÚ_pending_resume_sessionsrˆ  r€  rq  Úisdigitr—   Úhermes_cli.mainr®  r‰  Úresolve_resume_session_idrx   rÚ   r   Ú_flush_messages_to_session_dbr>   Úend_sessionÚ_resumedÚ_pending_titleÚget_resume_conversationsÚ_resume_display_historyÚreopen_sessionÚreset_session_stater.   rµ  Útools.todo_toolr¸  r¶  r¹  rv   Úon_session_switchr:   Úagent.context_compressorr¾  Ú_display_resumed_historyÚ_restore_session_cwdÚ_restore_session_yolo)r@   rú   rÔ   r¤  rC   Útargetrq  Úsessionsr¨   ÚselectedÚ	target_idr®  Úresolvedr³  Úresolved_idÚresolved_metaÚold_session_idÚmodel_historyÚdisplay_historyÚrestoredr¸  Ú_mmÚ
title_partÚ	msg_countr¾  s                           @rI   Ú_handle_resume_commandz'CLICommandsMixin._handle_resume_command¶  sµ  ø€ à9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø×"Ò" 4¨Ñ+Ô+ˆÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸ˆõ ˆv‰;Œ;˜!ÒÐØ�AŒY˜#ÒÐ &¨¤*°Ò"3Ð"3Ø�q”	˜SÒ Ð  V¨B¤Z°3Ò%6Ð%6Ø�q”	˜SÒ Ð  V¨B¤Z°3Ò%6Ð%6Ø�q”	˜SÒ Ð  V¨B¤Z°3Ò%6Ð%6à˜A˜b˜D”\×'Ò'Ñ)Ô)ˆFàð 	ØˆGÐCÑDÔDÐDØ×)Ò)°Ð)Ñ:Ô:ð ð 15×0JÒ0JÐQSÐ0JÑ0TÔ0T�Ô-Ø�ØˆGÐWÑXÔXÐXØˆFð )-ˆÔ%àÔð 	ØBÐBÐBÐBÐBÐBØˆGÐ:Ð6Ð6Ñ8Ô8Ð:Ð:Ñ;Ô;Ð;ØˆFð �>Š>ÑÔð 	+Ø×1Ò1¸Ð1Ñ;Ô;ˆHÝ˜‘K”KˆEØ�qŠyˆy˜E¥C¨¡M¤MÒ1Ð1Ø�ÐB¨%ÐBÐBÐBÑCÔCÐCØ�ÐTÑUÔUÐUØ�Ø ¨¡	Ô*ˆHØ  œˆIˆIàFÐFÐFÐFÐFÐFØ5Ð5°fÑ=Ô=ˆHØ Ð* FˆIàÔ'×3Ò3°IÑ>Ô>ˆØð 	ØˆGÐ4¨FÐ4Ð4Ñ5Ô5Ð5ØˆGÐYÑZÔZÐZØˆFð	$ØÔ*×DÒDÀYÑOÔOˆKˆKøÝð 	$ð 	$ð 	$Ø#ˆKˆKˆKð	$øøøàð 	-˜;¨)Ò3Ð3ØˆGðA˜Yð Að A¸[ð Að Að Añô ð ð $ˆIØ Ô,×8Ò8¸ÑCÔCˆMØð -Ø,�à˜œÒ'Ð'ØˆGÐ0Ñ1Ô1Ð1ØˆFàœˆàŒ:ð 	ðØ”
×8Ò8ØÔ-Ø)-Ô)Bð 9ñ ô ð ð øõ ð ð ð Ø�ðøøøð	ØÔ×(Ò(¨¬¸/ÑJÔJÐJÐJøÝð 	ð 	ð 	ØˆDð	øøøð $ˆŒØˆŒØ"ˆÔØ Ð  Ñ+Ô+Ð+ð *.Ô)9×)RÒ)RØñ*
ô *
Ñ&ˆ�ð YÐX Ð 3°ÐXÑXÔXˆØ$,ˆÔ!ð(
ð (
Ø'Ð-¨2ð(
ñ (
ô (
ˆÔ$ð
	ØÔ×+Ò+¨IÑ6Ô6Ð6Ð6øÝð 	ð 	ð 	ØˆDð	øøøð Œ:ñ 	Ø$-ˆDŒJÔ!ØŒJ×*Ò*Ñ,Ô,Ð,Ý�t”zÐ#9Ñ:Ô:ð QÝ25°dÔ6OÑ2PÔ2P�”
Ô/Ý�t”z =Ñ1Ô1ð ðØ9Ð9Ð9Ð9Ð9Ð9Ø-6¨Y©[¬[�D”JÔ*Ð*øÝ ð ð ð Ø�Dðøøøå�t”zÐ#>Ñ?Ô?ð 7Ø”
×4Ò4Ñ6Ô6Ð6ð
Ý˜dœjÐ*;¸TÑBÔB�Ø�?Ø×)Ò)Ø!Ø*8Ð*>¸BØ#Ø'ð	 *ñ ô ð øøõ ð ð ð Ø�ðøøøð 9E×8HÒ8HÈÑ8QÔ8QÐYÐ4˜<¨Ô0Ð4Ð4Ð4Ð4ÐWYˆ
ØDÐDÐDÐDÐDÐDõ Ð_Ð_Ð_Ð_ DÔ$@Ð_Ñ_Ô_Ñ`Ô`ˆ	ØÔ$ð 	gØˆGð<¨ð <°Jð <ð <Øð<ð <Ø4=À²N°N¨S¨SÈð<ð <å˜Ô1Ñ2Ô2ð<ð <ð <ñô ð ð
 ×)Ò)Ñ+Ô+Ð+Ð+àˆGÐe¨YÐe¸
ÐeÐeÐeÑfÔfÐfð 	×!Ò! ,Ñ/Ô/Ð/ð 	×"Ò" <Ñ0Ô0Ð0Ð0Ð0sl   È&I ÉIÉIÊ4&K Ë
K(Ë'K(Ë, L Ì
LÌLÎN Î
N+Î*N+Ð$P? Ð?
QÑQÑ>3R2 Ò2
R?Ò>R?c                ó�  — ddl m} |                     dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}|                     ¦   «         }|r|dv rH| j        sddlm}  |d |¦   «         › �¦  «         dS |  	                    d	¬
¦  «        s |d¦  «         dS |  
                    d|› �¦  «         dS )u&  Handle /sessions [list|<id_or_title>] â€” browse or resume previous sessions.

        Without arguments, prints the same recent-sessions table that /resume
        shows when called without a target, and tells the user how to resume.
        With an explicit subcommand or target, delegates to the resume flow so
        ``/sessions <id>`` and ``/resume <id>`` behave identically.

        The TUI ships an interactive picker overlay for this command; the
        classic CLI prints an inline list because there is no equivalent
        overlay primitive here. Without this handler the canonical name
        ``sessions`` falls through ``process_command``'s elif chain and
        prints ``Unknown command: sessions`` even though the command is
        registered in the central COMMAND_REGISTRY.
        r   rÓ   Nr   r#   >   r   r~   Úbrowserp  rW   r×  rÈ   z!  (._.) No previous sessions yet.z/resume )rw   rÔ   r5   r6   r-  r8   rˆ  r€  rq  rÂ  rä  )r@   rú   rÔ   rC   rh   Úsubrq  s          rI   Ú_handle_sessions_commandz)CLICommandsMixin._handle_sessions_commandv  s  € ð 	 ÐÐÐÐÐØ×"Ò" 4¨Ñ+Ô+ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆØ�iŠi‰kŒkˆð ð 	�cÐ5Ð5Ð5ØÔ#ð ØFÐFÐFÐFÐFÐFØ�Ð>Ð:Ð:Ñ<Ô<Ð>Ð>Ñ?Ô?Ð?Ø�Ø×-Ò-°ZÐ-Ñ@Ô@ð =Ø�Ð;Ñ<Ô<Ð<ØˆFð 	×#Ò#Ð$4¨sÐ$4Ð$4Ñ5Ô5Ð5Ð5Ð5rK   c           	     ón  — ddl m}m} | j        s |d¦  «         dS | j        sddlm}  |d |¦   «         › �¦  «         dS |                     dd¦  «        }t          |¦  «        dk    r|d          	                    ¦   «         nd}t          j        ¦   «         }|                     d	¦  «        }t          j        ¦   «         j        dd
…         }	|› d|	› �}
|r|}nFd}| j        r| j                             | j        ¦  «        }|pd}| j                             |¦  «        }| j        }| j        r8	 | j                             | j        | j        ¬¦  «         n# t*          $ r Y nw xY w	 | j                             | j        d¦  «         n# t*          $ r Y nw xY w	 | j                             |
t0          j                             dd¦  «        | j        | j        | j        |dœ|¬¦  «         n&# t*          $ r} |d|› �¦  «         Y d}~dS d}~ww xY w	 | j                             |
d„ | j        D ¦   «         d¬¦  «         n# t*          $ r Y nw xY w	 | j                             |
|¦  «         n# t*          $ r Y nw xY w|                       | j        |
¦  «         |
| _        || _!        d| _"        d| _#         ||
¦  «         | j        �r|
| j        _        || j        _!        | j         $                    ¦   «          tK          | j        d¦  «        rt          | j        ¦  «        | j        _&        tK          | j        d¦  «        r,	 ddl'm(}  |¦   «         | j        _)        n# t*          $ r Y nw xY wtK          | j        d¦  «        r| j         *                    ¦   «          	 tW          | j        dd¦  «        }|�| ,                    |
|pddd¬¦  «         n# t*          $ r Y nw xY wt          d„ | j        D ¦   «         ¦  «        } |d |› d!|› d"|dk    rd#nd› d$�¦  «          |d%|› �¦  «          |d&|
› �¦  «         dS )'u*  Handle /branch [name] â€” fork the current session into a new independent copy.

        Copies the full conversation history to a new session so the user can
        explore a different approach without losing the original session state.
        Inspired by Claude Code's /branch command.
        r   r£  u5     No conversation to branch â€” send a message first.Nrp  rW   r   r#   z%Y%m%d_%H%M%Sé   rv  Úbranchr¯  ÚbranchedÚHERMES_SESSION_SOURCErw   )Úmax_iterationsÚreasoning_configÚ_branched_from)rÚ   ÚsourceÚmodelÚmodel_configr¼  z#  Failed to create branch session: c                óì  — g | ]ñ}|                      d d¦  «        |                      d¦  «        |                      d¦  «        p|                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d	¦  «        |                      d
¦  «        t          |¦  «        |                      d¦  «        dœ‘ŒòS )r&  Úuserr*  Ú	tool_namer«   Ú
tool_callsÚtool_call_idÚ	reasoningÚreasoning_detailsÚcodex_reasoning_itemsÚcodex_message_itemsÚ	timestamp)r&  r*  rö  r÷  rø  rù  rú  rû  rü  Úapi_contentrý  )r:   r   )rÂ   Úmsgs     rI   rÄ   z;CLICommandsMixin._handle_branch_command.<locals>.<listcomp>ê  sé   € ð ð ð ð" ð !$§¢¨°Ñ 7Ô 7Ø#&§7¢7¨9Ñ#5Ô#5Ø%(§W¢W¨[Ñ%9Ô%9Ð%L¸S¿WºWÀV¹_¼_Ø&)§g¢g¨lÑ&;Ô&;Ø(+¯ª°Ñ(?Ô(?Ø%(§W¢W¨[Ñ%9Ô%9Ø-0¯WªWÐ5HÑ-IÔ-IØ14·²Ð9PÑ1QÔ1QØ/2¯wªwÐ7LÑ/MÔ/Mõ (CÀ3Ñ'GÔ'GØ%(§W¢W¨[Ñ%9Ô%9ðð ðð ð rK   iô  )Ú
chunk_rowsTrµ  r¶  r·  r¹  rº  Fr»  c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )r&  rõ  rÀ   r(  s     rI   rÄ   z;CLICommandsMixin._handle_branch_command.<locals>.<listcomp>0  s-   € ÐYÐYÐY˜qÀÇÂÀvÁÄÐRXÒAXÐAX˜ÐAXÐAXÐAXrK   u     â‘‚ Branched session "z" (rÁ  r›   ú)z  Original session: z  Branch session:   )-rw   rÔ   r¤  r>   rˆ  r€  rq  r5   r6   r-  r   ÚnowÚstrftimeÚuuidÚuuid4ÚhexÚget_session_titlerÚ   Úget_next_title_in_lineager   rÈ  rx   rÉ  Úcreate_sessionr2   Úenvironr:   rò  Ú	max_turnsrï  Úappend_messages_batchrŠ  Ú_transfer_session_yoloÚsession_startrË  rÊ  rÏ  r.   rµ  rÐ  r¸  r¶  r¹  rv   rÑ  )r@   rú   rÔ   r¤  rq  rC   Úbranch_namer  Útimestamp_strÚ
short_uuidÚnew_session_idÚbranch_titleÚcurrent_titleÚbaser¼  r¬   r¸  rá  rã  s                      rI   Ú_handle_branch_commandz'CLICommandsMixin._handle_branch_command—  sÄ  € ð 	:Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØÔ(ð 	ØˆGÐKÑLÔLÐLØˆFàÔð 	ØBÐBÐBÐBÐBÐBØˆGÐ:Ð6Ð6Ñ8Ô8Ð:Ð:Ñ;Ô;Ð;ØˆFà×"Ò" 4¨Ñ+Ô+ˆÝ*-¨e©*¬*°qª.¨.�e˜A”h—n’nÑ&Ô&Ð&¸bˆõ Œl‰nŒnˆØŸš _Ñ5Ô5ˆÝ”Z‘\”\Ô% b q bÔ)ˆ
Ø)Ð8Ð8¨JÐ8Ð8ˆð ð 	LØ&ˆLˆLð !ˆMØÔð TØ $Ô 0× BÒ BÀ4Ä?Ñ SÔ S�Ø Ð, HˆDØÔ+×EÒEÀdÑKÔKˆLð !œOÐð Œ:ð 	ðØ”
×8Ò8ØÔ-Ø)-Ô)Bð 9ñ ô ð ð øõ ð ð ð Ø�ðøøøð	ØÔ×(Ò(¨¬¸*ÑEÔEÐEÐEøÝð 	ð 	ð 	ØˆDð	øøøð	ØÔ×+Ò+Ø)Ý”z—~’~Ð&=¸uÑEÔEØ”jà&*¤nØ(,Ô(=Ø&7ðð ð
 #4ð ,ñ 
ô 
ð 
ð 
øõ ð 	ð 	ð 	ØˆGÐ=¸!Ð=Ð=Ñ>Ô>Ð>ØˆFˆFˆFˆFˆFøøøøð	øøøð	ØÔ×2Ò2Øðð ð"  $Ô8ð#ñ ô ð& ð+ 3ñ ô ð ð øõ. ð 	ð 	ð 	ØˆDð	øøøð	ØÔ×.Ò.¨~¸|ÑLÔLÐLÐLøÝð 	ð 	ð 	ØˆDð	øøøð 	×#Ò# D¤O°^ÑDÔDÐDØ(ˆŒØ ˆÔØ"ˆÔØˆŒØ Ð  Ñ0Ô0Ð0ð Œ:ñ 	Ø$2ˆDŒJÔ!Ø'*ˆDŒJÔ$ØŒJ×*Ò*Ñ,Ô,Ð,Ý�t”zÐ#9Ñ:Ô:ð QÝ25°dÔ6OÑ2PÔ2P�”
Ô/Ý�t”z =Ñ1Ô1ð ðØ9Ð9Ð9Ð9Ð9Ð9Ø-6¨Y©[¬[�D”JÔ*Ð*øÝ ð ð ð Ø�Dðøøøå�t”zÐ#>Ñ?Ô?ð 7Ø”
×4Ò4Ñ6Ô6Ð6ð
Ý˜dœjÐ*;¸TÑBÔB�Ø�?Ø×)Ò)Ø&Ø*;Ð*A¸rØ#Ø'ð	 *ñ ô ð øøõ ð ð ð Ø�ðøøøõ ÐYÐY DÔ$=ÐYÑYÔYÑZÔZˆ	ØˆðJ¨ð Jð JØðJð JØ09¸Q²°¨¨ÀBðJð Jð Jñ	
ô 	
ð 	
ð 	ˆÐ:Ð'8Ð:Ð:Ñ;Ô;Ð;ØˆÐ7 ~Ð7Ð7Ñ8Ô8Ð8Ð8Ð8s…   Ä0&E Å
E$Å#E$Å( F	 Æ	
FÆFÆAG+ Ç+
HÇ5H	È	HÈ,H? È?
IÉIÉI, É,
I9É8I9Í M Í
M(Í'M(Î3O Ï
OÏOc           
     ó  — ddl m}m}m}m}m} |                     d¬¦  «        }t          |¦  «        dk    �r¢|d                              ¦   «         }	  ||t          | dd¦  «        ¦  «        \  }	}
nq# t          $ rd t          d|                     ¦   «         › �¦  «         t          dd	                     | j                             ¦   «         ¦  «        › �¦  «         Y dS w xY w ||	¦  «        }|	s	 dd
lm}m}  | | |¦   «         ddd¬¦  «        ¦  «        | _        n# t(          $ r
 d| _        Y nw xY wd| _        |rt          d¦  «         nt          d¦  «         t          d¦  «         dS |
| _        d| _        |rt          d|	› d�¦  «         nt          d|	› d�¦  «         t          d|
dd…         › t          |
¦  «        dk    rdnd› d�¦  «         dS 	 ddlm}  | |¦   «                              d¦  «        pi                      dd¦  «        ¦  «        }n# t(          $ r d}Y nw xY wt          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          |sdnd }t          d!|› d"d#›d$�¦  «         | j                             ¦   «         D ]0\  }	}|	|k    rdnd }t          d!|› |	d#›d% ||¦  «        › �¦  «         Œ1t          ¦   «          t          d&¦  «         t          ¦   «          dS )'uÕ   Handle the /personality command to set predefined personalities.

        All resolution/persistence goes through hermes_cli.personality â€”
        the single owner of personality state on every surface.
        r   )Údescribe_personalityÚnormalize_personality_nameÚpersist_personalityÚprompt_textÚresolve_personalityr   r#  ÚconfigNz(._.) Unknown personality: z  Available: none, rS  )Úcfg_getÚread_raw_configr   Úsystem_promptr#   )r¥   z,(^_^)b Personality cleared (saved to config)z((^_^) Personality cleared (session only)u7     No personality overlay â€” using base agent behavior.z(^_^)b Personality set to 'ú' (saved to config)z(^_^) Personality set to 'ú' (session only)z  "rá   rT  rª  )r   rm  Úpersonalityz4+--------------------------------------------------+z1|            (^o^)/ Personalities               |z *rW   r‚   Únoneú<12z - (no personality overlay)z - z+  Usage: /personality <name>   (* = active))Úhermes_cli.personalityr  r  r  r  r  r5   r6   r-  rv   rb   r/   r8   r<   ÚpersonalitiesÚkeysr[  r  r   r!  rx   r   r:   Úitems)r@   rî   r  r  r  r  r  rC   Úpersonality_namer«   Úpersonality_promptÚsavedr  r   rŸ  ÚmarkerÚprompts                    rI   Ú_handle_personality_commandz,CLICommandsMixin._handle_personality_command8  s   € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —	’	 1�	Ñ%Ô%ˆåˆu‰:Œ:˜Š>‰>à$ QœxŸ~š~Ñ/Ô/ÐðØ+>Ð+>Ø$¥g¨d°H¸dÑ&CÔ&Cñ,ô ,Ñ(�Ð(Ð(øõ ð ð ð ÝÐNÐ4D×4JÒ4JÑ4LÔ4LÐNÐNÑOÔOÐOÝÐR¨D¯IªI°dÔ6H×6MÒ6MÑ6OÔ6OÑ,PÔ,PÐRÐRÑSÔSÐSØ��ðøøøð
 (Ð'¨Ñ-Ô-ˆEØð ið,ØJÐJÐJÐJÐJÐJÐJÐJà)4¨Ø˜  Ñ 1Ô 1°7¸OÐUWÐXÑXÔXñ*ô *�DÔ&Ð&øõ !ð ,ð ,ð ,Ø)+�DÔ&Ð&Ð&ð,øøøà!�”
Øð FÝÐHÑIÔIÐIÐIåÐDÑEÔEÐEÝÐOÑPÔPÐPÐPÐPà%7�Ô"Ø!�”
Øð OÝÐQ¸ÐQÐQÐQÑRÔRÐRÐRåÐM°tÐMÐMÐMÑNÔNÐNÝÐgÐ/°°°Ô4Ðg½sÐCUÑ?VÔ?VÐY[Ò?[Ð?[°e°eÐacÐgÐgÐgÑhÔhÐhÐhÐhðØ=Ð=Ð=Ð=Ð=Ð=à4Ð4Ø$�_Ñ&Ô&×*Ò*¨9Ñ5Ô5Ð;¸×@Ò@ÀÐPRÑSÔSñô ��øõ ð ð ð Ø���ðøøøå‰GŒGˆGÝÐ&Ñ'Ô'Ð'ÝÐJÑKÔKÐKÝÐ&Ñ'Ô'Ð'Ý‰GŒGˆGØ!(Ð2�T�T¨dˆFÝÐE�fÐE˜fÐEÐEÐEÐEÑFÔFÐFØ $Ô 2× 8Ò 8Ñ :Ô :ð Oð O‘��fØ!%¨¢ ˜˜°d�ÝÐM˜&ÐM $ÐMÐMÐMÐ/CÐ/CÀFÑ/KÔ/KÐMÐMÑNÔNÐNÐNÝ‰GŒGˆGÝÐ?Ñ@Ô@Ð@Ý‰GŒGˆGˆGˆGs8   ÁA3 Á3A*C!Ã C!Ã2-D  Ä D4Ä3D4ÇAH ÈH.È-H.c                ó  — ddl m} ddlm} ddlm}m}m}m}m	} | 
                    d¬¦  «        }	t          |	¦  «        dk    r|	d                              ¦   «         nd}
|
                     ¦   «         }|
r|dk    rS |¦   «         \  }}}|rt          d	|› �¦  «         d
S |rt          d|› d�¦  «         nt          |rd|› d�nd¦  «         d
S |dv r |¦   «          d
S |dk    s|                     d¦  «        rg|
t          d¦  «        d
…                              ¦   «         }|st          d¦  «         d
S  ||¦  «        \  }}t          |rd	|› �nd|d›d�¦  «         d
S |dk    r |d¦  «         t          d¦  «         d
S t          d|
› d�¦  «         	 |                     |
¦  «        }n/# |j        |f$ r }t          d|
› d|› �¦  «         Y d
}~d
S d
}~ww xY w ||
¦  «         t          d|j        › d�¦  «         d
S )u1  Toggle, browse, or adopt a petdex mascot.

        ``/pet`` / ``/pet toggle`` â†’ flip ``display.pet.enabled`` on/off
        ``/pet list``            â†’ browse the petdex gallery
        ``/pet scale <n>``       â†’ resize the pet everywhere (e.g. 0.5)
        ``/pet <slug>``          â†’ adopt (install if needed) + make active
        ``/pet off``             â†’ disable (alias for toggle-off)

        Writes ``display.pet.*`` to config; the CLI/TUI/desktop pet surfaces
        pick the change up on their next poll, so the pet appears shortly.
        r   ©Ústore)ÚManifestError)Ú_set_activeÚ_set_enabledÚprint_pet_galleryÚset_pet_scaleÚtoggle_pet_displayr   r#  r#   Útogglez(x_x) Nú(^_^)b u!    is out â€” it'll pop in shortly.z	(-_-)zzZ z
 put away.z(-_-)zzZ Pet put away.)r~   Úgalleryræ  rP   Úscalezscale z7(o_o) Usage: /pet scale <factor>  (e.g. /pet scale 0.5)u   (^_^) Pet scale â†’ Úgr�   ÚoffFz(o_o) Fetching 'u   ' from petdexâ€¦z(x_x) Couldn't adopt 'z': )Ú	agent.petr3  Úagent.pet.manifestr4  Úhermes_cli.petsr5  r6  r7  r8  r9  r5   r6   r-  r8   r/   Ú
startswithÚinstall_petÚPetStoreErrorÚdisplay_name)r@   rî   r3  r4  r5  r6  r7  r8  r9  rC   rh   ri   r1   r«   r   Úvaluer=  Úpetr  s                      rI   Ú_handle_pet_commandz$CLICommandsMixin._handle_pet_command…  sÐ  € ð 	$Ð#Ð#Ð#Ð#Ð#Ø4Ð4Ð4Ð4Ð4Ð4ØsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsà—	’	 1�	Ñ%Ô%ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆØ�iŠi‰kŒkˆàð 		�c˜X’o�oØ!3Ð!3Ñ!5Ô!5ÑˆG�T˜3Øð Ý�n˜s�n�nÑ%Ô%Ð%Ø�Øð ZÝÐG ÐGÐGÐGÑHÔHÐHÐHå°dÐXÐ2 $Ð2Ð2Ð2Ð2Ð@XÑYÔYÐYØˆFàÐ6Ð6Ð6ØÐÑÔÐØˆFà�'Š>ˆ>˜SŸ^š^¨HÑ5Ô5ˆ>Ø�˜G™œ˜˜Ô&×,Ò,Ñ.Ô.ˆEØð ÝÐOÑPÔPÐPØ�Ø&˜ uÑ-Ô-‰JˆE�3Ý CÐN�.˜3�.�.�.Ð-NÀEÐ-NÐ-NÐ-NÐ-NÑOÔOÐOØˆFà�%Š<ˆ<ØˆL˜ÑÔÐÝÐ*Ñ+Ô+Ð+ØˆFåÐ6 Ð6Ð6Ð6Ñ7Ô7Ð7ð	Ø×#Ò# CÑ(Ô(ˆCˆCøØÔ# ]Ð3ð 	ð 	ð 	ÝÐ8¨3Ð8Ð8°3Ð8Ð8Ñ9Ô9Ð9ØˆFˆFˆFˆFˆFøøøøð	øøøð 	ˆ�CÑÔÐÝÐK˜Ô(ÐKÐKÐKÑLÔLÐLÐLÐLs   ÆF- Æ-GÆ9GÇGc                ó,  — ddl m} ddlm} ddlm} ddlm} |                     d¬¦  «        }t          |¦  «        dk    r|d          
                    ¦   «         nd}|sI	 t          d	¦  «         
                    ¦   «         }n&# t          t          f$ r t          ¦   «          Y d
S w xY w|st          d¦  «         d
S d                     d„ |                     ¦   «         d
d…         D ¦   «         ¦  «        d
d…          
                    ¦   «         pd}|                     |¦  «        p|                     |¦  «        pd}	t          d|› d�¦  «         	 |                     |d¬¦  «        }
n%# |$ r}t          d|› �¦  «         Y d
}~d
S d
}~ww xY w|
st          d¦  «         d
S d!d„}	 |                     |
d         |	|||¬¦  «        }n%# |$ r}t          d|› �¦  «         Y d
}~d
S d
}~ww xY w ||j        ¦  «         t          d|j        › d �¦  «         d
S )"aÕ  Generate ("hatch") a brand-new petdex pet from a description.

        ``/hatch <description>`` runs the full pet pipeline in-process: a base
        look, then one grounded animation row per state, sliced + normalized into
        a spritesheet, then adopted as the active mascot. Progress streams inline
        (it's ~a minute of image-model calls). In the desktop app this command
        opens the richer generate overlay instead; here we run it directly.
        r   r2  )Úorchestrate)ÚGenerationError)r5  r   r#  r#   z(o_o) Describe your pet: NzA(o_o) Usage: /hatch <description>  (e.g. /hatch a tiny cyber fox)r‚   c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Ú
capitalize©rÂ   Úws     rI   ú	<genexpr>z9CLICommandsMixin._handle_hatch_command.<locals>.<genexpr>Ü  s*   è è € ÐLÐL°1 §¢¡¤ÐLÐLÐLÐLÐLÐLrK   r�   é   ÚPetrH  z(o_o) Designing 'u$   'â€¦ (a minute of image-model calls))r  z%(x_x) Couldn't generate a base look: u,   (x_x) No base draft came back â€” try again.Úeventr   Údetailrq   rr   c                óÐ   — | dk    r1|                      dd¦  «        d         }t          d|› d�¦  «         d S | dk    rt          d¦  «         d S | d	k    rt          d
¦  «         d S d S )Nr—  r^   r   r   u     â”Š drawing u   â€¦Úcomposeu     â”Š composing spritesheetâ€¦Úsaveu     â”Š savingâ€¦)r5   r/   )rU  rV  r|  s      rI   Ú	_progressz9CLICommandsMixin._handle_hatch_command.<locals>._progressê  sˆ   € Ø˜Š~ˆ~àŸš S¨!Ñ,Ô,¨QÔ/�ÝÐ1 uÐ1Ð1Ð1Ñ2Ô2Ð2Ð2Ð2Ø˜)Ò#Ð#ÝÐ6Ñ7Ô7Ð7Ð7Ð7Ø˜&’�ÝÐ'Ñ(Ô(Ð(Ð(Ð(ð !�rK   )Ú
base_imageÚslugrF  ÚconceptÚon_progressz(x_x) Hatch failed: r;  u.    hatched and adopted â€” it'll pop in shortly!)rU  r   rV  r   rq   rr   )r@  r3  Úagent.pet.generaterK  Úagent.pet.generate.imagegenrL  rB  r5  r5   r6   r-  ÚinputÚEOFErrorÚKeyboardInterruptr/   r<   ÚslugifyÚgenerate_base_draftsÚ	hatch_petr\  rF  )r@   rî   r3  rK  rL  r5  rC   r]  rF  r\  Údraftsr  rZ  rG   s                 rI   Ú_handle_hatch_commandz&CLICommandsMixin._handle_hatch_command¿  sÐ  € ð 	$Ð#Ð#Ð#Ð#Ð#Ø2Ð2Ð2Ð2Ð2Ð2Ø?Ð?Ð?Ð?Ð?Ð?Ø/Ð/Ð/Ð/Ð/Ð/à—	’	 1�	Ñ%Ô%ˆÝ&)¨%¡j¤j°1¢n n�%˜”(—.’.Ñ"Ô"Ð"¸"ˆàð 	ðÝÐ ;Ñ<Ô<×BÒBÑDÔD��øÝÕ/Ð0ð ð ð Ý‘”�Ø��ðøøøð ð 	ÝÐUÑVÔVÐVØˆFð —x’xÐLÐL¸¿º¹¼ÈÈÈÔ8KÐLÑLÔLÑLÔLÈSÈbÈSÔQ×WÒWÑYÔYÐbÐ]bˆØ�}Š}˜\Ñ*Ô*ÐM¨e¯mªm¸GÑ.DÔ.DÐMÈˆåÐO 'ÐOÐOÐOÑPÔPÐPð	Ø ×5Ò5°gÀÐ5ÑCÔCˆFˆFøØð 	ð 	ð 	ÝÐ?¸#Ð?Ð?Ñ@Ô@Ð@ØˆFˆFˆFˆFˆFøøøøð	øøøð ð 	ÝÐ@ÑAÔAÐAØˆFð	)ð 	)ð 	)ð 	)ð
	Ø ×*Ò*Ø! !œ9ØØ)ØØ%ð +ñ ô ˆFˆFøð ð 	ð 	ð 	ÝÐ.¨Ð.Ð.Ñ/Ô/Ð/ØˆFˆFˆFˆFˆFøøøøð	øøøð 	ˆ�F”KÑ Ô Ð ÝÐ[˜Ô+Ð[Ð[Ð[Ñ\Ô\Ð\Ð\Ð\sB   Á!!B ÂB&Â%B&ÅE) Å)FÅ.FÆFÆ& G ÇG)ÇG$Ç$G)c           
     óÔ  ‡‡— ddl m} ddl}ddlmŠ ˆfd„}d„ }d„ }|                     |¦  «        }t          |¦  «        dk    �rat          ¦   «          t          d	¦  «         t          d
¦  «         t          d	¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «           |d¬¦  «        }|                     d¦  «        r|                     dg ¦  «        ng }	|	�r
t          d¦  «         t          d¦  «         |	D ]è}
|
                     dd¦  «        }t          d|
d         dd …         d!›d"|
d#         d$›d"|d%›�¦  «         |
                     d&¦  «        r+t          d'd( 	                    |
d&         ¦  «        › �¦  «         t          d)|
                     d*d+¦  «        › �¦  «         |
                     d,¦  «        rt          d-|
d,         › �¦  «         t          ¦   «          Œént          d.¦  «         t          ¦   «          dS |d          
                    ¦   «         } ||d/d…         ¦  «        }|€dS |dk    �rí |d|d0         ¬1¦  «        }|                     d¦  «        r|                     dg ¦  «        ng }	|	st          d2¦  «         dS t          ¦   «          t          d3¦  «         t          d4¦  «         |	D �]h}
t          d5|
d         › �¦  «         t          d6|
d7         › �¦  «         t          d8|
                     d9d¦  «        › �¦  «         t          d:|
d#         › d;|
                     dd¦  «        › d<�¦  «         t          d=|
                     d,d>¦  «        › �¦  «         |
                     d&¦  «        r+t          d?d( 	                    |
d&         ¦  «        › �¦  «         t          d@|
                     d*d+¦  «        › �¦  «         |
                     dA¦  «        r0t          dB|
dA         › d;|
                     dCd¦  «        › d<�¦  «         t          ¦   «          �ŒjdS |dDv �rc|dE         }|st          dF¦  «         dS |d#         p|d         }|dG         pdH 	                    |dd…         ¦  «        } ||d&         ¦  «        }|s|st          dI¦  «         dS  |dJ||pd|d7         |dK         |d         |pd¬L¦  «        }|                     d¦  «        r‰t          dM|d         › �¦  «         t          d:|d#         › �¦  «         |                     d&¦  «        r+t          d?d( 	                    |d&         ¦  «        › �¦  «         t          d=|d,         › �¦  «         n%t          dN|                     dO¦  «        › �¦  «         dS |dPk    �r|dE         }|st          dQ¦  «         dS |d         } ||¦  «        }|st          dR|› �¦  «         dS d} ||d&         ¦  «        } ||dS         ¦  «        }t           ||dT         ¦  «        ¦  «        Št          |                     d&¦  «        p,|                     dU¦  «        sg n|                     dU¦  «        g¦  «        }|dV         rg }n5|r|}n0|s‰r,ˆfdW„|D ¦   «         }|D ]}||vr|                     |¦  «         Œ |dX||d#         |dG         |d7         |dK         |d         |¬Y¦  «        }|                     d¦  «        r‰|dZ         }
t          d[|
d         › �¦  «         t          d:|
d#         › �¦  «         |
                     d&¦  «        r,t          d?d( 	                    |
d&         ¦  «        › �¦  «         n5t          d\¦  «         n%t          d]|                     dO¦  «        › �¦  «         dS |d^v �r{|dE         }|st          d_|› d`�¦  «         dS |d         }|dav rdbn|} ||||dck    rddnd¬e¦  «        }|                     d¦  «        s*t          df|› dg|                     dO¦  «        › �¦  «         dS |dck    r#t          dh|dZ         d7         › d;|› d<�¦  «         nÌ|dik    rNt          dj|dZ         d7         › d;|› d<�¦  «         t          d=|dZ                              d,¦  «        › �¦  «         nx|dkk    r2t          dl|dZ         d7         › d;|› d<�¦  «         t          dm¦  «         n@|                     dni ¦  «        }t          do|                     d7|¦  «        › d;|› d<�¦  «         dS t          dp|› �¦  «         t          dq¦  «         dS )rz3Handle the /cron command to manage scheduled tasks.r   )Úget_jobN)Úcronjobc                 ó8   •— t          j         ‰di | ¤Ž¦  «        S )NrE  )ÚjsonÚloads)ÚkwargsÚcronjob_tools    €rI   Ú	_cron_apiz8CLICommandsMixin._handle_cron_command.<locals>._cron_api	  s#   ø€ Ý”:˜l˜lÐ4Ð4¨VÐ4Ð4Ñ5Ô5Ð5rK   c                ó�   — g }| D ]@}t          |pd¦  «                             ¦   «         }|r||vr|                     |¦  «         ŒA|S )Nr#   )r   r-  rc   )ÚvaluesÚ
normalizedrG  rp   s       rI   Ú_normalize_skillsz@CLICommandsMixin._handle_cron_command.<locals>._normalize_skills  s`   € ØˆJØð ,ð ,�Ý˜5˜; BÑ'Ô'×-Ò-Ñ/Ô/�Øð ,˜D¨
Ð2Ð2Ø×%Ò% dÑ+Ô+Ð+øØÐrK   c                óô  — d d d g g g ddd d g dœ}d}|t          | ¦  «        k     �rS| |         }|dk    r+|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }�n|dk    r+|dz   t          | ¦  «        k     r| |dz            |d	<   |dz  }�nÕ|d
k    rZ|dz   t          | ¦  «        k     rD	 t          | |dz            ¦  «        |d<   n # t          $ r t          d¦  «         Y d S w xY w|dz  }�nu|dk    rA|dz   t          | ¦  «        k     r+|d                              | |dz            ¦  «         |dz  }�n.|dk    r@|dz   t          | ¦  «        k     r*|d                              | |dz            ¦  «         |dz  }nè|dk    r@|dz   t          | ¦  «        k     r*|d                              | |dz            ¦  «         |dz  }n¢|dk    rd|d<   |dz  }n‘|dk    rd|d<   |dz  }n€|dk    r*|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }nP|dk    r*|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }n |d                              |¦  «         |dz  }|t          | ¦  «        k     �°S|S )NF)r«   ÚdeliverÚrepeatÚskillsÚ
add_skillsÚremove_skillsÚclear_skillsrP   r/  ÚscheduleÚpositionalsr   r²   r   r«   r    z	--deliverrw  z--repeatrx  z!(._.) --repeat must be an integerz--skillry  z--add-skillrz  z--remove-skillr{  z--clear-skillsTr|  rQ   rP   z--promptr/  z
--scheduler}  r~  )r6   r—   rb   r/   rc   )ÚtokensÚoptsrš   Útokens       rI   Ú_parse_flagsz;CLICommandsMixin._handle_cron_command.<locals>._parse_flags  s  € àØØØØ Ø!#Ø %ØØØ Ø!ðð ˆDð ˆAØ•c˜&‘k”k’/‘/Ø˜qœ	�Ø˜HÒ$Ð$¨¨Q©µ°V±´Ò)<Ð)<Ø#)¨!¨a©%¤=�D˜‘LØ˜‘F�A‘AØ˜kÒ)Ð)¨a°!©eµc¸&±k´kÒ.AÐ.AØ&,¨Q°©U¤m�D˜‘OØ˜‘F�A‘AØ˜jÒ(Ð(¨Q°©UµS¸±[´[Ò-@Ð-@ð$Ý),¨V°A¸±E¬]Ñ);Ô);˜˜X™˜øÝ%ð $ð $ð $ÝÐAÑBÔBÐBØ#˜t˜tð$øøøð ˜‘F�A‘AØ˜iÒ'Ð'¨A°©EµC¸±K´KÒ,?Ð,?Ø˜”N×)Ò)¨&°°Q±¬-Ñ8Ô8Ð8Ø˜‘F�A‘AØ˜mÒ+Ð+°°A±½¸F¹¼Ò0CÐ0CØ˜Ô&×-Ò-¨f°Q¸±U¬mÑ<Ô<Ð<Ø˜‘F�A�AØÐ.Ò.Ð.°1°q±5½3¸v¹;¼;Ò3FÐ3FØ˜Ô)×0Ò0°¸¸A¹´Ñ?Ô?Ð?Ø˜‘F�A�AØÐ.Ò.Ð.Ø+/�D˜Ñ(Ø˜‘F�A�AØ˜gÒ%Ð%Ø"&�D˜‘KØ˜‘F�A�AØ˜jÒ(Ð(¨Q°©UµS¸±[´[Ò-@Ð-@Ø%+¨A°©E¤]�D˜‘NØ˜‘F�A�AØ˜lÒ*Ð*¨q°1©uµs¸6±{´{Ò/BÐ/BØ'-¨a°!©e¤}�D˜Ñ$Ø˜‘F�A�Aà˜Ô'×.Ò.¨uÑ5Ô5Ð5Ø˜‘F�AðM •c˜&‘k”k’/‘/ðN ˆKs   Â,C ÃC%Ã$C%r   zF+--------------------------------------------------------------------+zD|                      (^_^) Scheduled Tasks                       |z  Commands:z    /cron listzD    /cron add "every 2h" "Check server status" [--skill blogwatcher]zA    /cron edit <job_id> --schedule "every 4h" --prompt "New task"z8    /cron edit <job_id> --skill blogwatcher --skill mapsz2    /cron edit <job_id> --remove-skill blogwatcherz&    /cron edit <job_id> --clear-skillsz    /cron pause <job_id>z    /cron resume <job_id>z    /cron run <job_id>z    /cron remove <job_id>r~   )Úactionr!   Újobsz  Current Jobs:zA  ---------------------------------------------------------------rx  rÛ   rÙ   Újob_idé   r&  z | r}  z<15z<8ry  z      Skills: rS  z      Úprompt_previewr#   Únext_run_atz      Next: z3  No scheduled jobs. Use '/cron add' to create one.r    rP   )rƒ  Úinclude_disabledz(._.) No scheduled jobs.zScheduled Jobs:zP--------------------------------------------------------------------------------z  ID: z  Name: r«   z	  State: r|  z  Schedule: rÀ  r  z  Next run: zN/Az
  Skills: z
  Prompt: Úlast_run_atz  Last run: Úlast_status>   Úaddr‹   r~  z*(._.) Usage: /cron add <schedule> <prompt>r/  r‚   z3(._.) Please provide a prompt or at least one skillr‹   rw  )rƒ  r}  r/  r«   rw  rx  ry  z(^_^)b Created job: z(x_x) Failed to create job: r'   r  zN(._.) Usage: /cron edit <job_id> [--schedule ...] [--prompt ...] [--skill ...]z(._.) Job not found: rz  r{  Úskillr|  c                ó   •— g | ]}|‰v¯|‘Œ	S rE  rE  )rÂ   r�  r{  s     €rI   rÄ   z9CLICommandsMixin._handle_cron_command.<locals>.<listcomp>Ã  s$   ø€ ÐaÐaÐa¨%ÀeÐS`ÐF`ÐF` ÐF`ÐF`ÐF`rK   Úupdate)rƒ  r…  r}  r/  r«   rw  rx  ry  Újobz(^_^)b Updated job: z  Skills: nonez(x_x) Failed to update job: >   ÚrmÚrunÚpauser  Úremover¬  z(._.) Usage: /cron z	 <job_id>>   r‘  r  r”  r”  r“  zpaused from /cron)rƒ  r…  r+   z(x_x) Failed to z job: z(^_^)b Paused job: r¬  z(^_^)b Resumed job: r’  z(^_^)b Triggered job: z)  It will run on the next scheduler tick.Úremoved_jobz(^_^)b Removed job: z(._.) Unknown cron command: z8  Available: list, add, edit, pause, resume, run, remove)rw   rj  ra   Útools.cronjob_toolsrk  r5   r6   r/   r:   r<   r8   Úsetr~   rc   )r@   rî   rj  ra   rq  ru  r‚  r  rG   r„  r�  Ú
repeat_strr^  r€  r~  r}  r/  ry  r…  ÚexistingÚfinal_skillsÚreplacement_skillsrz  Úexisting_skillsr�  rƒ  Úremovedrp  r{  s                              @@rI   Ú_handle_cron_commandz%CLICommandsMixin._handle_cron_command  s•  øø€ àÐÐÐÐÐØˆˆˆØ?Ð?Ð?Ð?Ð?Ð?ð	6ð 	6ð 	6ð 	6ð 	6ð	ð 	ð 	ð6	ð 6	ð 6	ðp —’˜SÑ!Ô!ˆåˆv‰;Œ;˜!ÒÑÝ‰GŒGˆGÝÐ&Ñ'Ô'Ð'ÝÐKÑLÔLÐLÝÐ&Ñ'Ô'Ð'Ý‰GŒGˆGÝ�-Ñ Ô Ð ÝÐ"Ñ#Ô#Ð#ÝÐXÑYÔYÐYÝÐUÑVÔVÐVÝÐLÑMÔMÐMÝÐFÑGÔGÐGÝÐ:Ñ;Ô;Ð;ÝÐ,Ñ-Ô-Ð-ÝÐ-Ñ.Ô.Ð.ÝÐ*Ñ+Ô+Ð+ÝÐ-Ñ.Ô.Ð.Ý‰GŒGˆGØ�Y fÐ-Ñ-Ô-ˆFØ-3¯ZªZ¸	Ñ-BÔ-BÐJ�6—:’:˜f bÑ)Ô)Ð)ÈˆDØñ MÝÐ'Ñ(Ô(Ð(Ý�oÑ&Ô&Ð&Øð ð �CØ!$§¢¨°3Ñ!7Ô!7�JÝÐc  X¤¨s°¨sÔ!3ÐcÐcÐc¸CÀ
¼OÐcÐcÐcÐT^ÐcÐcÐcÑdÔdÐdØ—w’w˜xÑ(Ô(ð KÝÐI¨t¯yªy¸¸X¼Ñ/GÔ/GÐIÐIÑJÔJÐJÝÐB 3§7¢7Ð+;¸RÑ#@Ô#@ÐBÐBÑCÔCÐCØ—w’w˜}Ñ-Ô-ð CÝÐA¨S°Ô-?ÐAÐAÑBÔBÐBÝ‘G”G�G�Gðõ ÐKÑLÔLÐLÝ‰GŒGˆGØˆFà˜A”Y—_’_Ñ&Ô&ˆ
Øˆ|˜F 1 2 2œJÑ'Ô'ˆØˆ<ØˆFà˜ÒÑØ�Y f¸tÀE¼{ÐKÑKÔKˆFØ-3¯ZªZ¸	Ñ-BÔ-BÐJ�6—:’:˜f bÑ)Ô)Ð)ÈˆDØð ÝÐ0Ñ1Ô1Ð1Ø�å‰GŒGˆGÝÐ#Ñ$Ô$Ð$Ý�(‰OŒOˆOØð ñ �ÝÐ.˜s 8œ}Ð.Ð.Ñ/Ô/Ð/ÝÐ.  V¤Ð.Ð.Ñ/Ô/Ð/ÝÐ9 #§'¢'¨'°3Ñ"7Ô"7Ð9Ð9Ñ:Ô:Ð:ÝÐQ S¨¤_ÐQÐQ¸¿ºÀÈ#Ñ8NÔ8NÐQÐQÐQÑRÔRÐRÝÐD S§W¢W¨]¸EÑ%BÔ%BÐDÐDÑEÔEÐEØ—7’7˜8Ñ$Ô$ð CÝÐA t§y¢y°°X´Ñ'?Ô'?ÐAÐAÑBÔBÐBÝÐB 3§7¢7Ð+;¸RÑ#@Ô#@ÐBÐBÑCÔCÐCØ—7’7˜=Ñ)Ô)ð _ÝÐ]¨¨]Ô);Ð]Ð]¸s¿wºwÀ}ÐVYÑ?ZÔ?ZÐ]Ð]Ð]Ñ^Ô^Ð^Ý‘”�‘ØˆFàÐ*Ð*Ñ*Ø˜}Ô-ˆKØð ÝÐBÑCÔCÐCØ�Ø˜JÔ'Ð9¨;°q¬>ˆHØ˜(”^Ð@ s§x¢x°¸A¸B¸B´Ñ'@Ô'@ˆFØ&Ð& t¨H¤~Ñ6Ô6ˆFØð  &ð ÝÐKÑLÔLÐLØ�Ø�YØØ!Ø�~ Ø˜&”\Ø˜YœØ˜H”~Ø�~ ðñ ô ˆFð �zŠz˜)Ñ$Ô$ð LÝÐ?¨V°HÔ-=Ð?Ð?Ñ@Ô@Ð@ÝÐ9 V¨JÔ%7Ð9Ð9Ñ:Ô:Ð:Ø—:’:˜hÑ'Ô'ð FÝÐD t§y¢y°¸Ô1AÑ'BÔ'BÐDÐDÑEÔEÐEÝÐ< V¨MÔ%:Ð<Ð<Ñ=Ô=Ð=Ð=åÐJ°V·Z²ZÀÑ5HÔ5HÐJÐJÑKÔKÐKØˆFà˜ÒÑØ˜}Ô-ˆKØð ÝÐfÑgÔgÐgØ�Ø  ”^ˆFØ�w˜v‘”ˆHØð ÝÐ6¨fÐ6Ð6Ñ7Ô7Ð7Ø�àˆLØ!2Ð!2°4¸´>Ñ!BÔ!BÐØ*Ð*¨4°Ô+=Ñ>Ô>ˆJÝÐ 1Ð 1°$°Ô2GÑ HÔ HÑIÔIˆMÝ" 8§<¢<°Ñ#9Ô#9Ð#{ÈÏÊÐU\ÑH]ÔH]Ð>z¸b¸bÐdl×dpÒdpÐqxÑdyÔdyÐczÑ|Ô|ˆOØ�NÔ#ð 3Ø!��Ø#ð 3Ø1��Øð 3˜}ð 3ØaÐaÐaÐa°?ÐaÑaÔa�Ø'ð 3ð 3�EØ LÐ0Ð0Ø$×+Ò+¨EÑ2Ô2Ð2øà�YØØØ˜jÔ)Ø˜H”~Ø˜&”\Ø˜YœØ˜H”~Ø#ð	ñ 	ô 	ˆFð �zŠz˜)Ñ$Ô$ð 	LØ˜U”m�ÝÐ<¨S°¬]Ð<Ð<Ñ=Ô=Ð=ÝÐ6 S¨¤_Ð6Ð6Ñ7Ô7Ð7Ø—7’7˜8Ñ$Ô$ð ,ÝÐA t§y¢y°°X´Ñ'?Ô'?ÐAÐAÑBÔBÐBÐBåÐ*Ñ+Ô+Ð+Ð+åÐJ°V·Z²ZÀÑ5HÔ5HÐJÐJÑKÔKÐKØˆFàÐMÐMÑMØ˜}Ô-ˆKØð ÝÐA¨JÐAÐAÐAÑBÔBÐBØ�Ø  ”^ˆFØ!+Ð/IÐ!IÐ!I�X�XÈzˆFØ�Y f°VÐ[aÐelÒ[lÐ[lÐDWÐDWÐrvÐwÑwÔwˆFØ—:’:˜iÑ(Ô(ð ÝÐL¨ÐLÐL°v·z²zÀ'Ñ7JÔ7JÐLÐLÑMÔMÐMØ�Ø˜Ò Ð ÝÐN¨F°5¬M¸&Ô,AÐNÐNÀVÐNÐNÐNÑOÔOÐOÐOØ˜8Ò#Ð#ÝÐO¨V°E¬]¸6Ô-BÐOÐOÀfÐOÐOÐOÑPÔPÐPÝÐG V¨E¤]×%6Ò%6°}Ñ%EÔ%EÐGÐGÑHÔHÐHÐHØ˜5’�ÝÐQ¨v°e¬}¸VÔ/DÐQÐQÈÐQÐQÐQÑRÔRÐRÝÐAÑBÔBÐBÐBà Ÿ*š* ]°BÑ7Ô7�ÝÐU¨W¯[ª[¸ÀÑ-HÔ-HÐUÐUÈFÐUÐUÐUÑVÔVÐVØˆFåÐ9¨ZÐ9Ð9Ñ:Ô:Ð:ÝÐHÑIÔIÐIÐIÐIrK   c                ób  — ddl }	 |r|                     |¦  «        dd…         ng }n.# t          $ r! |pd                     ¦   «         dd…         }Y nw xY wd                     |¦  «        }	 ddlm}  ||¦  «        }n# t          $ r}d|› �}Y d}~nd}~ww xY w|                      |¦  «         dS )u  Handle /suggestions â€” review/accept/dismiss suggested automations.

        Delegates to the shared handler so CLI and gateway never drift. CLI
        origin is the local platform so an accepted job's "origin" delivery
        resolves to a configured home channel.
        r   Nr   r#   r‚   )Úhandle_suggestions_commandzSuggestions command failed: )ra   r5   rb   r<   Úhermes_cli.suggestions_cmdr   rx   Ú_console_print)r@   rî   ra   r  rD   r   rª   r¬   s           rI   Ú_handle_suggestions_commandz,CLICommandsMixin._handle_suggestions_commandù  sÿ   € ð 	ˆˆˆð	-Ø-0Ð8�U—[’[ Ñ%Ô% a b bÔ)Ð)°bˆFˆFøÝð 	-ð 	-ð 	-Ø�i˜R×&Ò&Ñ(Ô(¨¨¨Ô,ˆFˆFˆFð	-øøøà�xŠx˜ÑÔˆð	8ØMÐMÐMÐMÐMÐMØ/Ð/°Ñ5Ô5ˆFˆFøÝð 	8ð 	8ð 	8Ø7°AÐ7Ð7ˆFˆFˆFˆFˆFˆFøøøøð	8øøøà×Ò˜FÑ#Ô#Ð#Ð#Ð#s'   †!( ¨(AÁAÁ,A> Á>
BÂBÂBc                óæ  ‡— ddl Š	 |r‰                     |¦  «        dd…         ng }n.# t          $ r! |pd                     ¦   «         dd…         }Y nw xY wd                     ˆfd„|D ¦   «         ¦  «        }	 ddlm}  ||¦  «        }n0# t          $ r#}|                      d|› �¦  «         Y d}~dS d}~ww xY w|                      |j        ¦  «         t          |d	d¦  «        }|r	|| _
        dS dS )
u  Handle /blueprint â€” set up an automation from a blueprint template.

        Delegates to the shared handler. A bare ``/blueprint`` lists the
        catalog; ``/blueprint <name>`` name-matches a blueprint and seeds the
        agent to ask the user for each value conversationally (the result's
        ``agent_seed``); ``/blueprint <name> slot=val â€¦`` creates the job
        directly. When a seed is returned it is stashed as a one-shot pending
        message the interactive loop runs as the next agent turn.
        r   Nr   r#   r‚   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rN  )Úquote)rÂ   Útra   s     €rI   rR  z=CLICommandsMixin._handle_blueprint_command.<locals>.<genexpr>  s-   øè è € Ð7Ð7¨1˜Ÿš A™œÐ7Ð7Ð7Ð7Ð7Ð7rK   )Úhandle_blueprint_commandzCron blueprint command failed: Ú
agent_seed)ra   r5   rb   r<   Úhermes_cli.blueprint_cmdr¨  rx   r¢  rp   rv   Ú_pending_agent_seed)	r@   rî   r  rD   r¨  rG   r¬   Úseedra   s	           @rI   Ú_handle_blueprint_commandz*CLICommandsMixin._handle_blueprint_command  sY  ø€ ð 	ˆˆˆð	-Ø-0Ð8�U—[’[ Ñ%Ô% a b bÔ)Ð)°bˆFˆFøÝð 	-ð 	-ð 	-Ø�i˜R×&Ò&Ñ(Ô(¨¨¨Ô,ˆFˆFˆFð	-øøøà�xŠxÐ7Ð7Ð7Ð7°Ð7Ñ7Ô7Ñ7Ô7ˆð	ØIÐIÐIÐIÐIÐIØ-Ð-¨dÑ3Ô3ˆFˆFøÝð 	ð 	ð 	Ø×ÒÐ EÀ!Ð EÐ EÑFÔFÐFØˆFˆFˆFˆFˆFøøøøð	øøøð 	×Ò˜FœKÑ(Ô(Ð(Ý�v˜|¨TÑ2Ô2ˆØð 	,ð (,ˆDÔ$Ð$Ð$ð	,ð 	,s'   ‡!) ©(AÁAÁ9B Â
B8ÂB3Â3B8c                óê   — ddl }|r|                     |¦  «        dd…         ng }|sdg}	 ddlm}  ||¦  «         dS # t          $ r Y dS t
          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)z£Handle /curator slash command.

        Delegates to hermes_cli.curator so the CLI and the `hermes curator`
        subcommand share the same handler set.
        r   Nr   r¾   )Úcli_mainz(._.) curator: )ra   r5   Úhermes_cli.curatorr¯  r
  rx   r/   )r@   rî   ra   r  r¯  r  s         rI   Ú_handle_curator_commandz(CLICommandsMixin._handle_curator_command,  sÐ   € ð 	ˆˆˆà),Ð4�—’˜SÑ!Ô! ! " "Ô%Ð%°"ˆØð 	 Ø�ZˆFð	+Ø3Ð3Ð3Ð3Ð3Ð3ØˆH�VÑÔÐÐÐøÝð 	ð 	ð 	ð ˆDˆDÝð 	+ð 	+ð 	+ÝÐ) CÐ)Ð)Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øøøøð	+øøøs   ¬? ¿
A2Á	A2ÁA-Á-A2c                ó‚  — ddl m} |                     ¦   «         }|                     d¦  «        r|                     d¦  «        }|                     d¦  «        r)|t          d¦  «        d…                              ¦   «         }	  ||¦  «        }n# t          $ r}d|› �}Y d}~nd}~ww xY w|rt          |¦  «         dS dS )u#  Handle the /kanban command â€” delegate to the shared kanban CLI.

        The string form passed here is the user's full ``/kanban ...``
        including the leading slash; we strip it and hand the remainder
        to ``kanban.run_slash`` which returns a single formatted string.
        r   )Ú	run_slashú/ÚkanbanNz(._.) kanban error: )Úhermes_cli.kanbanr³  r-  rC  Úlstripr6   rx   r/   )r@   rî   r³  r  rª   r  s         rI   Ú_handle_kanban_commandz'CLICommandsMixin._handle_kanban_commandB  sç   € ð 	0Ð/Ð/Ð/Ð/Ð/à�yŠy‰{Œ{ˆØ�?Š?˜3ÑÔð 	$Ø—;’;˜sÑ#Ô#ˆDØ�?Š?˜8Ñ$Ô$ð 	1Ø�˜H™œ˜˜Ô'×.Ò.Ñ0Ô0ˆDð	2Ø�Y˜t‘_”_ˆFˆFøÝð 	2ð 	2ð 	2Ø1¨CÐ1Ð1ˆFˆFˆFˆFˆFˆFøøøøð	2øøøàð 	Ý�&‰MŒMˆMˆMˆMð	ð 	s   ÂB Â
B)ÂB$Â$B)c                óx  ‡ — ddl m} |                     ¦   «                              ¦   «         }t	          |¦  «        dk    r
|dd…         ng }|rQ|d                              ¦   «         dv r5ddlm} ddlm	}  ||j
        |ˆ fd„¬	¦  «        }|�t          |¦  «         dS dd
lm}  || |¦   «         ¦  «         dS )uD   Handle /skills slash command â€” delegates to hermes_cli.skills_hub.r   )ÚChatConsoler   N>	   Údenyr   ÚdroprU   ÚapplyÚrejectÚapprover{  Úapproval©Úhandle_pending_subcommand©Úwrite_approvalc                ó0   •— ‰                      d| ¦  «        S )Nry  ©Ú_save_write_approval©r1   r@   s    €rI   ú<lambda>z9CLICommandsMixin._handle_skills_command.<locals>.<lambda>d  s   ø€ ¨D×,EÒ,EÀhÐPWÑ,XÔ,X€ rK   )Úset_mode_fn)Úhandle_skills_slash)rw   rº  r-  r5   r6   r8   Ú"hermes_cli.write_approval_commandsrÂ  ÚtoolsrÄ  ÚSKILLSr/   Úhermes_cli.skills_hubrË  )	r@   rî   rº  rC   rD   rÂ  ÚwaÚoutrË  s	   `        rI   Ú_handle_skills_commandz'CLICommandsMixin._handle_skills_commandW  s  ø€ à#Ð#Ð#Ð#Ð#Ð#ð —	’	‘”×!Ò!Ñ#Ô#ˆÝ ™JœJ¨šN˜Nˆu�Q�R�RŒyˆy°ˆØð 
	�D˜”G—M’M‘O”Oð (Tð Tð TàTÐTÐTÐTÐTÐTØ2Ð2Ð2Ð2Ð2Ð2Ø+Ð+Ø”	˜4ØXÐXÐXÐXðñ ô ˆCð ˆÝ�c‘
”
�
Ø�Ø=Ð=Ð=Ð=Ð=Ð=ØÐ˜C  ¡¤Ñ/Ô/Ð/Ð/Ð/rK   c                óŽ  — ddl m} |                     ¦   «                              dd¦  «        }t	          |¦  «        dk    r|d                              ¦   «         nd} ||¦  «        }|rt          d¦  «         nt          d¦  «         t          | d¦  «        r| j                             |¦  «         dS t          d	¦  «         dS )
uÿ  Handle /learn â€” distill a reusable skill from anything the user describes.

        Open-ended: the argument is free text describing the source(s) â€” a
        directory, a URL, "what we just did", pasted notes. We build a
        standards-guided prompt and inject it onto the agent's input queue; the
        live agent gathers the material with the tools it already has and
        authors the skill via ``skill_manage``. No engine, no model-tool
        footprint, works on any terminal backend.
        r   )Úbuild_learn_promptNr   r#   u0   
âš¡ Learning a skill from what you described...u/   
âš¡ Learning a skill from this conversation...Ú_pending_inputz-  /learn needs an active chat session to run.)	Úagent.learn_promptrÔ  r-  r5   r6   r/   r.   rÕ  Úput)r@   rî   rÔ  rC   Úuser_requestrÿ  s         rI   Ú_handle_learn_commandz&CLICommandsMixin._handle_learn_commandl  sÛ   € ð 	:Ð9Ð9Ð9Ð9Ð9ð —	’	‘”×!Ò! $¨Ñ*Ô*ˆÝ+.¨u©:¬:¸ª>¨>�u˜Q”x—~’~Ñ'Ô'Ð'¸rˆà Ð  Ñ.Ô.ˆØð 	FÝÐEÑFÔFÐFÐFåÐDÑEÔEÐEÝ�4Ð)Ñ*Ô*ð 	CØÔ×#Ò# CÑ(Ô(Ð(Ð(Ð(åÐAÑBÔBÐBÐBÐBrK   c                ó”  — ddl m} |                     ¦   «                              dd¦  «        }t	          |¦  «        dk    r|d                              ¦   «         nd} ||¬¦  «        }d|v rt          d¦  «         nt          d	¦  «         t          | d
¦  «        r| j                             |¦  «         dS t          d¦  «         dS )uì  Handle /init â€” generate or update AGENTS.md from a project scan.

        Mirrors /learn: build a guidance-laden prompt and inject it onto the
        agent's input queue as a normal user turn. The live agent scans the
        project with its own read-only tools and writes/updates AGENTS.md via
        ``write_file``. No engine, no model-tool footprint, works on any
        terminal backend, and preserves prompt-cache invariants (no system
        prompt or history mutation).
        r   )Úbuild_init_prompt_for_cwdNr   r#   )ÚextrazUPDATE the existing AGENTS.mdu.   
âš¡ Updating AGENTS.md from a project scan...u0   
âš¡ Generating AGENTS.md from a project scan...rÕ  z,  /init needs an active chat session to run.)	Úhermes_cli.init_commandrÛ  r-  r5   r6   r/   r.   rÕ  r×  )r@   rî   rÛ  rC   rÜ  rÿ  s         rI   Ú_handle_init_commandz%CLICommandsMixin._handle_init_command†  sá   € ð 	FÐEÐEÐEÐEÐEð —	’	‘”×!Ò! $¨Ñ*Ô*ˆÝ$'¨¡J¤J°¢N N��a”—’Ñ Ô Ð ¸ˆà'Ð'¨eÐ4Ñ4Ô4ˆØ*¨cÐ1Ð1ÝÐCÑDÔDÐDÐDåÐEÑFÔFÐFÝ�4Ð)Ñ*Ô*ð 	BØÔ×#Ò# CÑ(Ô(Ð(Ð(Ð(åÐ@ÑAÔAÐAÐAÐArK   c                ót  ‡ — ddl m} ddlm} |                     ¦   «                              ¦   «         }t          |¦  «        dk    r
|dd…         ng }t          ‰ dd¦  «        rt          ‰ j        dd¦  «        nd}|€ddl	m
}  |¦   «         } ||j        ||ˆ fd	„¬
¦  «        }|€d}t          |¦  «         dS )uG   Handle /memory slash command â€” pending review + approval-gate toggle.r   rÁ  rÃ  r   Nr   Ú_memory_store)Úload_on_disk_storec                ó0   •— ‰                      d| ¦  «        S )NÚmemoryrÆ  rÈ  s    €rI   rÉ  z9CLICommandsMixin._handle_memory_command.<locals>.<lambda>µ  s   ø€ ¨×(AÒ(AÀ(ÈGÑ(TÔ(T€ rK   )Úmemory_storerÊ  zWUnknown /memory subcommand. Use: pending, approve <id>, reject <id>, approval <on|off>.)rÌ  rÂ  rÍ  rÄ  r-  r5   r6   rv   r   Útools.memory_toolrá  ÚMEMORYr/   )	r@   rî   rÂ  rÐ  rC   rD   r3  rá  rÑ  s	   `        rI   Ú_handle_memory_commandz'CLICommandsMixin._handle_memory_command   sü   ø€ àPÐPÐPÐPÐPÐPØ.Ð.Ð.Ð.Ð.Ð.Ø—	’	‘”×!Ò!Ñ#Ô#ˆÝ ™JœJ¨šN˜Nˆu�Q�R�RŒyˆy°ˆÝ>EÀdÈGÐUYÑ>ZÔ>ZÐd•˜œ
 O°TÑ:Ô:Ð:Ð`dˆØˆ=ð =Ð<Ð<Ð<Ð<Ð<Ø&Ð&Ñ(Ô(ˆEØ'Ð'ØŒI�tØØTÐTÐTÐTð
ñ 
ô 
ˆð
 ˆ;ðQˆCåˆc‰
Œ
ˆ
ˆ
ˆ
rK   Ú	subsystemr1   c                óJ   — ddl m}  ||› d�t          |¦  «        ¦  «         dS )zLPersist <subsystem>.write_approval to config (for /memory|/skills approval).r   )Úsave_config_valuez.write_approvalN)rw   rê  rm   )r@   rè  r1   rê  s       rI   rÇ  z%CLICommandsMixin._save_write_approval¼  s<   € à)Ð)Ð)Ð)Ð)Ð)ØÐ˜YÐ7Ð7Ð7½¸g¹¼ÑGÔGÐGÐGÐGrK   c                óÈ  ‡ ‡‡‡‡‡	‡
‡‡‡‡‡‡‡— ddl mŠmŠmŠmŠmŠ	mŠ
mŠmŠm	Š | 
                    ¦   «                              d¬¦  «        }t          |¦  «        dk     s|d          
                    ¦   «         s# ‰d¦  «          ‰d¦  «          ‰d¦  «         d	S |d          
                    ¦   «         Š‰ xj        dz  c_        ‰ j        Šd
t          j        ¦   «                              d¦  «        › dt#          j        ¦   «         j        d	d…         › �Š‰                      ¦   «         s ‰d¦  «         d	S  ‰d‰› d‰d	d…         › t          ‰¦  «        dk    rdnd› d�¦  «          ‰d‰› �¦  «          ‰d¦  «         ‰                      ‰¦  «        Šˆˆˆˆˆ	ˆ
ˆˆ ˆˆˆˆˆˆfd„}t-          j        |dd‰› �¬¦  «        }|‰ j        ‰<   |                     ¦   «          d	S )u  Handle /background <prompt> â€” run a prompt in a separate background session.

        Spawns a new AIAgent in a background thread with its own session.
        When it completes, prints the result to the CLI without modifying
        the active session's conversation history.
        r   )	ÚAIAgentrº  Ú_accent_hexrÔ   Ú_maybe_remap_for_light_modeÚ_render_final_assistant_contentÚset_approval_callbackÚset_secret_capture_callbackÚset_sudo_password_callbackr   r#  r    z  Usage: /background <prompt>z9  Example: /background Summarize the top HN stories todayzI  The task runs in a separate session and results display here when done.NÚbg_z%H%M%Srv  rê  z;  (>_<) Cannot start background task: no valid credentials.u     ðŸ”„ Background task #z started: "rá   rT  r#   rª  z  Task ID: u?     You can continue chatting â€” results will appear when done.
c                 ó  •—  ‰‰j         ¦  «          ‰‰j        ¦  «         	  ‰‰j        ¦  «         n# t          $ r Y nw xY w	  ‰dKi d‰d         “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d	‰d                              d
¦  «        “d‰d                              d¦  «        “d‰j        “d‰j        “dd“dd“d‰“dd“d‰j        “d‰j        “d‰j	        “d‰                     d¦  «        “d‰j
        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d ‰j        “Ž} d!„ | _        dLˆfd&„}|| _        |                      ‰‰¬'¦  «        }|r|                     d(d)¦  «        nd)}|s"|r |                     d*¦  «        rd+|d*         › �}‰j        r-‰j                             ¦   «          t/          j        d,¦  «         t3          ¦   «           ‰¦   «                              d- ‰¦   «         › d.d/› d0�¦  «          ‰d1‰› d2�¦  «          ‰d3‰d d4…         › t5          ‰¦  «        d4k    rd5nd)› d6�¦  «          ‰¦   «                              d- ‰¦   «         › d.d/› d0�¦  «         |rç	 d7d8lm}  |¦   «         }|                     d9d:¦  «        } ‰|                     d;d<¦  «        ¦  «        } ‰|                     d=d>¦  «        ¦  «        }n# t          $ r	 d:}d<}d>}Y nw xY w ‰¦   «         }	|	                     t?           ‰|‰j         ¬?¦  «        d-|› d@|› dA‰› dB�dC||tB          j"        dD‰ #                    ¦   «         ¬E¦  «        ¦  «         n ‰dF¦  «         ‰j$        r=tJ          j&         '                    dG¦  «         tJ          j&         (                    ¦   «          nj# t          $ r]}
‰j        r-‰j                             ¦   «          t/          j        d,¦  «         t3          ¦   «           ‰dH‰› dI|
› �¦  «         Y d }
~
nd }
~
ww xY w	  ‰d ¦  «          ‰d ¦  «          ‰d ¦  «         n# t          $ r Y nw xY w‰j)         *                    ‰d ¦  «         ‰j+        sd)‰_,        ‰j        r‰ -                    d7¬J¦  «         d S d S # 	  ‰d ¦  «          ‰d ¦  «          ‰d ¦  «         n# t          $ r Y nw xY w‰j)         *                    ‰d ¦  «         ‰j+        sd)‰_,        ‰j        r‰ -                    d7¬J¦  «         w w xY w)MNrò  Úapi_keyÚruntimeÚbase_urlÚproviderÚapi_modeÚacp_commandr   Úacp_argsrD   Ú
max_tokensrî  r\  Ú
quiet_modeTÚverbose_loggingFrÚ   rP  rw   Ú
session_dbrï  Úservice_tierÚrequest_overridesÚproviders_allowedÚproviders_ignoredÚproviders_orderÚprovider_sortÚprovider_require_parametersÚprovider_data_collectionÚopenrouter_min_coding_scoreÚfallback_modelc                 ó   — d S rN  rE  )Ú_aÚ_kws     rI   rÉ  zUCLICommandsMixin._handle_background_command.<locals>.run_background.<locals>.<lambda>  s   € ¸€ rK   rp   r   rq   rr   c                ól   •— ‰j         s)| ‰_        ‰j        r‰j                             ¦   «          d S d S d S rN  )ré   Ú_spinner_textrA  Ú
invalidate)rp   r@   s    €rI   Ú_bg_thinkingzYCLICommandsMixin._handle_background_command.<locals>.run_background.<locals>._bg_thinking  sN   ø€ àÔ.ð 3Ø-1˜Ô*Øœ9ð 3Ø œI×0Ò0Ñ2Ô2Ð2Ð2Ð2ð3ð 3ð3ð 3rK   )Úuser_messageÚtask_idÚfinal_responser#   r'   zError: gš™™™™™©?r¨  r©  ux   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ú[/]u     âœ… Background task #z	 completez  Prompt: "rá   rT  rª  r   )Úget_active_skinÚresponse_labelu
   âš• HermesÚresponse_borderz#CD7F32Úbanner_textz#FFF8DC)rU   z bold]z (background #z)[/]Úleft)r   é   )rz  Útitle_alignÚborder_styleÚstyler   ÚpaddingÚwidthz  (No response generated)úu     â�Œ Background task #z	 failed: )Úmin_intervalrE  ©rp   r   rq   rr   ).Ú_sudo_password_callbackÚ_approval_callbackÚ_secret_capture_callbackrx   r:   r  r\  rˆ  rï  r   Ú_providers_onlyÚ_providers_ignoreÚ_providers_orderÚ_provider_sortÚ_provider_require_paramsÚ_provider_data_collectionÚ_openrouter_min_coding_scoreÚ_fallback_modelÚ	_print_fnÚthinking_callbackÚrun_conversationrA  r  rŒ  r�  r/   r6   Úhermes_cli.skin_enginer  Úget_brandingÚ	get_colorr   Úfinal_response_markdownÚrich_boxÚHORIZONTALSÚ_scrollback_box_widthÚbell_on_completeÚsysÚstdoutÚwriteÚflushÚ_background_tasksÚpopré   r  Ú_invalidate)Úbg_agentr  rG   Úresponser  Ú_skinrj   Ú_resp_colorÚ
_resp_textÚ_chat_consoler¬   rì  rº  rí  rÔ   rî  rï  r/  r@   rð  rñ  rò  r  Útask_numÚ
turn_routes              €€€€€€€€€€€€€€rI   Úrun_backgroundzCCLICommandsMixin._handle_background_command.<locals>.run_backgroundà  s±  ø€ Ø&Ð& tÔ'CÑDÔDÐDØ!Ð! $Ô"9Ñ:Ô:Ð:ðØ+Ð+¨DÔ,IÑJÔJÐJÐJøÝð ð ð Ø�ðøøøðo5Ø"˜7ð ð ð Ø$ WÔ-Ð-ðà& yÔ1×5Ò5°iÑ@Ô@Ð@ðð (¨	Ô2×6Ò6°zÑBÔBÐBðð (¨	Ô2×6Ò6°zÑBÔBÐBð	ð
 (¨	Ô2×6Ò6°zÑBÔBÐBðð !+¨9Ô 5× 9Ò 9¸)Ñ DÔ DÐ Dðð (¨	Ô2×6Ò6°vÑ>Ô>Ð>ðð  *¨)Ô4×8Ò8¸ÑFÔFÐFðð $(¤> >ðð &*Ô%:Ð%:ðð  $˜tðð %* Eðð  '˜wðð #˜Uðð  $Ô/Ð/ðð  &*Ô%:Ð%:ð!ð" "&Ô!2Ð!2ð#ð$ '1§n¢nÐ5HÑ&IÔ&IÐ&Ið%ð& '+Ô&:Ð&:ð'ð( '+Ô&<Ð&<ð)ð* %)Ô$9Ð$9ð+ð, #'Ô"5Ð"5ð-ð. 15Ô0MÐ0Mð/ð0 .2Ô-KÐ-Kð1ð2 15Ô0QÐ0Qð3ð4 $(Ô#7Ð#7ð5�ð: &=Ð%<�Ô"ð3ð 3ð 3ð 3ð 3ð 3ð .:�Ô*à!×2Ò2Ø!'Ø#ð 3ñ ô �ð
 @FÐM˜6Ÿ:š:Ð&6¸Ñ;Ô;Ð;È2�Øð ; Fð ;¨v¯zªz¸'Ñ/BÔ/Bð ;Ø:¨°¬Ð:Ð:�Hð
 ”9ð %Ø”I×(Ò(Ñ*Ô*Ð*Ý”J˜tÑ$Ô$Ð$Ý‘”�Ø�‘”×#Ò#Ð$G¨¨©¬Ð$GÐ$G¸
Ð$GÐ$GÐ$GÑHÔHÐHØ�ÐE°(ÐEÐEÐEÑFÔFÐFØ�ÐY v¨c¨r¨c¤{ÐY½SÀ¹[¼[È2Ò=MÐ=M°E°EÐSUÐYÐYÐYÑZÔZÐZØ�‘”×#Ò#Ð$G¨¨©¬Ð$GÐ$G¸
Ð$GÐ$GÐ$GÑHÔHÐHØð 9ð	/ØJÐJÐJÐJÐJÐJØ / Ñ 1Ô 1˜Ø %× 2Ò 2Ð3CÀ\Ñ RÔ R˜Ø&AÐ&AÀ%Ç/Â/ÐRcÐenÑBoÔBoÑ&pÔ&p˜Ø%@Ð%@ÀÇÂÐQ^Ð`iÑAjÔAjÑ%kÔ%k˜
˜
øÝ$ð /ð /ð /Ø ,˜Ø&/˜Ø%.˜
˜
˜
ð/øøøð
 %0 K¡M¤M�MØ!×'Ò'­Ø7Ð7¸ÀtÔGcÐdÑdÔdØX +ÐXÐX°UÐXÐXÈ(ÐXÐXÐXØ$*Ø%0Ø(Ý$Ô0Ø &Ø"×8Ò8Ñ:Ô:ð	)ñ 	)ô 	)ñ 	ô 	ð 	ð 	ð �GÐ7Ñ8Ô8Ð8ð Ô(ð 'Ý”J×$Ò$ TÑ*Ô*Ð*Ý”J×$Ò$Ñ&Ô&Ð&øøåð Jð Jð Jà”9ð %Ø”I×(Ò(Ñ*Ô*Ð*Ý”J˜tÑ$Ô$Ð$Ý‘”�Ø�ÐH°(ÐHÐHÀQÐHÐHÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøðØ.Ð.¨tÑ4Ô4Ð4Ø)Ð)¨$Ñ/Ô/Ð/Ø/Ð/°Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�DðøøøàÔ&×*Ò*¨7°DÑ9Ô9Ð9àÔ*ð ,Ø)+�DÔ&Ø”9ð 5Ø×$Ò$°!Ð$Ñ4Ô4Ð4Ð4Ð4ð5ð 5øðØ.Ð.¨tÑ4Ô4Ð4Ø)Ð)¨$Ñ/Ô/Ð/Ø/Ð/°Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�DðøøøàÔ&×*Ò*¨7°DÑ9Ô9Ð9àÔ*ð ,Ø)+�DÔ&Ø”9ð 5Ø×$Ò$°!Ð$Ñ4Ô4Ð4Ð4ð5øøøsž   £4 ´
AÁ AÁJ P Ë&A$M Í
P ÍMÍP ÍMÍB=P ÐT Ð
RÐ&AQ>Ñ9T Ñ>RÒT Ò!R) Ò)
R6Ò5R6ÔU?Ô!T'Ô&U?Ô'
T4Ô1U?Ô3T4Ô4AU?Tzbg-task-)rÖ  Údaemonr«   )rw   rì  rº  rí  rÔ   rî  rï  rð  rñ  rò  r-  r5   r6   Ú_background_task_counterr   r  r  r  r  r  Ú_ensure_runtime_credentialsÚ_resolve_turn_agent_configÚ	threadingÚThreadr=  Ústart)r@   rî   rC   rH  Úthreadrì  rº  rí  rÔ   rî  rï  r/  rð  rñ  rò  r  rF  rG  s   `    @@@@@@@@@@@@@rI   Ú_handle_background_commandz+CLICommandsMixin._handle_background_commandÁ  s×  øøøøøøøøøøøøøø€ ð 	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	QØ—	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>  q¤§¢Ñ!1Ô!1ˆ>ØˆGÐ3Ñ4Ô4Ð4ØˆGÐOÑPÔPÐPØˆGÐ_Ñ`Ô`Ð`ØˆFà�q”—’Ñ!Ô!ˆØÐ%Ô%¨Ñ*Ð%Ô%ØÔ0ˆØR�œ™œ×/Ò/°Ñ9Ô9ÐRÐR½D¼J¹L¼LÔ<LÈRÈaÈRÔ<PÐRÐRˆð ×/Ò/Ñ1Ô1ð 	ØˆGÐQÑRÔRÐRØˆFàˆÐs¨8ÐsÐsÀÈÈÈÄÐsÕWZÐ[aÑWbÔWbÐegÒWgÐWgÈeÈeÐmoÐsÐsÐsÑtÔtÐtØˆÐ'˜gÐ'Ð'Ñ(Ô(Ð(ØˆÐRÑSÔSÐSà×4Ò4°VÑ<Ô<ˆ
ðv	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5ð v	5õp Ô!¨ÀÐK_ÐV]ÐK_ÐK_Ð`Ñ`Ô`ˆØ*0ˆÔ˜wÑ'Ø�Š‰ŒˆˆˆrK   c                óJ  — ddl m}m}m}m}m}m} ddlm}m	}	  |	d |d¬¦  «        ¦  «        }
d|
j
        v r |d|
j
        d         › |› �¦  «         d	S |
j
        d         }|s< |d
¦  «          |d|› d|› �¦  «          |d|› d|
j
        d         › |› �¦  «         d	S  |d|› d|› dt          |¦  «        › d�¦  «         |D ]Í}t          |                     dg ¦  «        ¦  «        }|                     d¦  «        pd|› d�} |¦   «                              d |¦   «         › d|d         d›dt          |¦  «        › d|› d�	¦  «         |                     dg ¦  «        D ]0} |¦   «                              dt          |¦  «        › d�¦  «         Œ1ŒÎ |d |› d!|› �¦  «         d	S )"u  In-session ``/bundles`` â€” show installed skill bundles.

        Mirrors ``hermes bundles list`` but renders inside the running
        CLI so users can discover what's available without dropping out
        of their session. Bundles are loaded via ``/<bundle-name>``.
        r   )rº  Ú_BOLDr  r  rí  rÔ   rb  Úbundlesrw   rf  r'   z%[1;31mBundle subsystem unavailable: Nz  No skill bundles installed.rW   zGCreate one with: hermes bundles create <name> --skill <s1> --skill <s2>zDirectory: Údiru   
  â–£ zSkill BundlesrÀ  z installed):ry  ÚdescriptionzLoad z skillsz
    [bold z]/r\  z<20z[/] [dim]-[/] z [dim](z skills)[/]u           [dim]Â· r  r]   z;Invoke a bundle with /<slug>. Manage with `hermes bundles`.)rw   rº  rS  r  r  rí  rÔ   ri  rc  rd  rj  r6   r:   r/   Ú_escape)r@   rî   rº  rS  r  r  rí  rÔ   rc  rd  rk  rT  ÚinfoÚskill_countÚdescr›   s                   rI   Ú_handle_bundles_commandz(CLICommandsMixin._handle_bundles_command\  s·  € ð 	MÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLØIÐIÐIÐIÐIÐIÐIÐIà� 	¨>¨>À%Ð+HÑ+HÔ+HÑIÔIˆØ�e”jÐ Ð ØˆGÐZ¸u¼zÈ'Ô?RÐZÐTXÐZÐZÑ[Ô[Ð[ØˆFà”*˜YÔ'ˆØð 	ØˆGÐ3Ñ4Ô4Ð4ØˆGð:�Tð :ð :Ø37ð:ð :ñô ð ð ˆGÐC˜ÐCÐC¨%¬*°UÔ*;ÐC¸TÐCÐCÑDÔDÐDØˆFàˆÐQ˜5ÐQÐQ¨tÐQÐQµs¸7±|´|ÐQÐQÐQÑRÔRÐRØð 	Hð 	HˆDÝ˜dŸhšh x°Ñ4Ô4Ñ5Ô5ˆKØ—8’8˜MÑ*Ô*ÐJÐ.J°kÐ.JÐ.JÐ.JˆDØˆK‰MŒM×ÒðL˜[˜[™]œ]ð Lð L¨d°6¬lÐDð Lð LÝ$ T™]œ]ðLð LØ3>ðLð Lð Lñô ð ð —X’X˜h¨Ñ+Ô+ð Hð H�Ø�‘”×#Ò#Ð$Fµw¸q±z´zÐ$FÐ$FÐ$FÑGÔGÐGÐGðHàˆð3�4ð 3ð 3Ø,0ð3ð 3ñ	
ô 	
ð 	
ð 	
ð 	
rK   c                ór  — ddl }|                     ¦   «                              dd¦  «        }t          |¦  «        dk    r,|d                              ¦   «                              ¦   «         nd}t
          }t          j                             dd¦  «                             ¦   «         }| 	                    d¦  «        �rr|                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         n|}t          d	|v r|nd
|› �¦  «        }	|	j        dvr8t          ¦   «          t          d|	j        pd› d�¦  «         t          ¦   «          dS 	 |	j        p|	j        dv rdnd}
n?# t          $ r2 t          ¦   «          t          d|› �¦  «         t          ¦   «          Y dS w xY w|	j        s0t          ¦   «          t          d|› �¦  «         t          ¦   «          dS |	j        }|	j         	                    d¦  «        r|	                     ¦   «         }n+|	                     dddd¬¦  «                             ¦   «         }	 ddlm}  |¦   «          n# t*          $ r Y nw xY wt          ¦   «          ||k    }|rt-          |
d¬¦  «        }|du}|r|}nt/          |d¬¦  «        }|rt          d|› �¦  «         �n�|�rx|
}t1          |
¦  «        r6t3          |
¦  «        }t          d|
› d�¦  «         t          d|› d�¦  «         nt          d¦  «         t5          ||                     ¦   «         ¦  «        }|j        rwt;          d¦  «        D ]/}t-          |d¬¦  «        }|r|}d } nt=          j        d!¦  «         Œ0|rt          d"|› �¦  «         nºt          d#|› d$�¦  «         t          d%¦  «         n—t          d&¦  «         |j         }|rt          d'|› �¦  «         |                     ¦   «         }tC          ||¦  «        }|r"t          d(¦  «         t          d'|› �¦  «         n%t          d)¦  «         nt          d|
› d*|› �¦  «         |s-t          ¦   «          t          d+¦  «         t          ¦   «          dS |t          j        d<   	 dd,lm"}  |d-¦  «         n# t*          $ r Y nw xY wt          ¦   «          t          d.¦  «         t          d/|› �¦  «         t          ¦   «          tG          | d0¦  «        r| j$         %                    d1¦  «         dS dS |d2k    ræ|r·t          j         &                    dd¦  «         	 dd3lm}m'}  |d-¦  «          |¦   «          n# t*          $ r Y nw xY wt          ¦   «          t          d4¦  «         t          d5¦  «         t          ¦   «          tG          | d0¦  «        r| j$         %                    d6¦  «         dS dS t          ¦   «          t          d7¦  «         t          ¦   «          dS |dk    �r/t          ¦   «          |�rt          d8¦  «         t          d/|› �¦  «         d9}
	 tQ          | )                    d:d¦  «        d;                              d<¦  «        d         ¦  «        }
n# t          tT          f$ r Y nw xY w	 ddl+}| +                    |j,        |j-        ¦  «        }| .                    d¦  «         | /                    d=|
f¦  «         | 0                    ¦   «          t          d>¦  «         nï# tb          t*          f$ r t          d?¦  «         Y nÍw xY w	 dd@lm2}  |¦   «         }n# t*          $ r d}Y nw xY w|�&t          dA| 3                    ¦   «         › dB�¦  «         n}	 ddClm4}  |¦   «         }n# t*          $ r dD}Y nw xY w|dEk    r.t          dF¦  «         t          dG¦  «         t          dH¦  «         n%|dIk    rt          dJ¦  «         nt          dK¦  «         t          ¦   «          t          dL¦  «         t          dM¦  «         t          ¦   «          dS t          ¦   «          t          dN¦  «         t          ¦   «          t          dO¦  «         t          dP¦  «         t          dQ¦  «         t          ¦   «          dS )RuY   Handle /browser connect|disconnect|status â€” manage live Chromium-family CDP connection.r   Nr   r¾   ÚBROWSER_CDP_URLr#   Úconnectr    z://zhttp://>   ÚwsÚwssÚhttpÚhttpsu'      âš  Unsupported browser url scheme: z	(missing)z( (expected one of: http, https, ws, wss)>   r`  rb  i»  r%   u$      âš  Invalid port in browser url: u$      âš  Missing host in browser url: z/devtools/browser/)ÚpathÚparamsÚqueryÚfragment)Úcleanup_all_browsersg      ð?)Útimeoutu7      âœ“ Chromium-family browser is already listening at u      âš  Port z< is occupied by another application that isn't a CDP browseruK        (an IDE debugger or dev server may be using it) â€” launching on port z instead...uZ      Chromium-family browser isn't running with remote debugging â€” attempting to launch...r­  Tr  u>      âœ“ Chromium-family browser launched and listening on port u!      âš  Browser launched but port z isn't responding yetuL        Try again in a few seconds â€” the debug instance may still be startingu6      âš  Could not auto-launch a Chromium-family browserz     z/     Launch a Chromium-family browser manually:zN     No supported Chromium-family browser executable found in this environmentz is not reachable at uj   Browser not connected â€” start a Chromium-family browser with remote debugging and retry /browser connect)Ú_ensure_cdp_supervisorr¥   u>   ðŸŒ� Browser connected to live Chromium-family browser via CDPz   Endpoint: rÕ  aá  [System note: The user invoked /browser connect and connected your browser tools to a Chromium-family dev/debug browser via Chrome DevTools Protocol. Your browser_navigate, browser_snapshot, browser_click, and other browser tools now control that CDP browser. The command itself is a signal that using browser tools for their current browser-related request is expected; do not wait for separate permission just because CDP is connected. This is typically a Hermes-managed isolated debug profile, not the user's main everyday browser. It is still user-visible and may contain pages, logged-in sessions, or cookies in that debug profile, so avoid destructive actions, closing tabs, or navigating away unless the user's task calls for it.]Ú
disconnect)rg  Ú_stop_cdp_supervisoru;   ðŸŒ� Browser disconnected from live Chromium-family browserzL   Browser tools reverted to default mode (local headless or cloud provider)z¶[System note: The user has disconnected the browser tools from their live Chromium-family browser. Browser tools are back to default mode (headless local browser or cloud provider).]zWBrowser is not connected to a live Chromium-family browser (already using default mode)u?   ðŸŒ� Browser: connected to live Chromium-family browser via CDPi$  r^   r¦  r´  z	127.0.0.1u      Status: âœ“ reachableu9      Status: âš  not reachable (browser may not be running))Ú_get_cloud_provideru   ðŸŒ� Browser: z (cloud))Ú_get_browser_engineÚautoÚ
lightpandauB   ðŸŒ� Browser: local Lightpanda (agent-browser --engine lightpanda)u;      âš¡ Lightpanda: faster navigation, no screenshot supportzB   Automatic Chromium fallback for screenshots and failed commandsÚchromeuE   ðŸŒ� Browser: local headless Chromium (agent-browser --engine chrome)u5   ðŸŒ� Browser: local headless Chromium (agent-browser)uI      /browser connect      â€” connect to your live Chromium-family browseru.      /browser disconnect   â€” revert to defaultz)Usage: /browser connect|disconnect|statuszR   connect      Connect browser tools to your live Chromium-family browser sessionz1   disconnect   Revert to default browser backendz)   status       Show current browser mode)5rP  r-  r5   r6   r8   r   r2   r  r:   rC  r   Úschemer/   Úportrb   Úhostnamerc  ÚgeturlÚ_replaceÚtools.browser_toolrg  rx   r   r   r   r   r   ÚsystemÚlaunchedÚrangerŒ  r�  r6  r   ri  r.   rÕ  r×  r>  rk  r—   ÚrsplitÚ
IndexErrorÚsocketÚAF_INETÚSOCK_STREAMÚ
settimeoutr^  ÚcloseÚOSErrorrl  Úprovider_namerm  )r@   rî   Ú_platrC   rç  Ú_DEFAULT_CDPrŸ  Úconnect_partsÚcdp_urlÚ
parsed_cdpÚ_portÚ_hostrg  Ú_is_defaultÚ_foundÚ_already_openÚ_launch_portÚ_launchÚ_waitÚ_hintÚsys_nameÚ
chrome_cmdri  rk  r|  r›   rl  rø  rm  Úengines                                 rI   Ú_handle_browser_commandz(CLICommandsMixin._handle_browser_command„  s{
  € à Ð Ð Ð à—	’	‘”×!Ò! $¨Ñ*Ô*ˆÝ*-¨e©*¬*°qª.¨.ˆe�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&Ð&¸hˆå.ˆÝ”*—.’.Ð!2°BÑ7Ô7×=Ò=Ñ?Ô?ˆà�>Š>˜)Ñ$Ô$ñ Y	àŸIšI™KœK×-Ò-¨d°AÑ6Ô6ˆMÝ25°mÑ2DÔ2DÀqÒ2HÐ2H�m AÔ&×,Ò,Ñ.Ô.Ð.ÈlˆGÝ!¨U°gÐ-=Ð-= ' 'ÐCVÈWÐCVÐCVÑWÔWˆJØÔ Ð(FÐFÐFÝ‘”�Ýð>¸jÔ>OÐ>^ÐS^ð >ð >ð >ñô ð õ ‘”�Ø�ðØ"œÐa°:Ô3DÐHXÐ3XÐ3X¨C¨CÐ^`��øÝð ð ð Ý‘”�ÝÐF¸WÐFÐFÑGÔGÐGÝ‘”�Ø��ð	øøøð
 Ô&ð Ý‘”�ÝÐF¸WÐFÐFÑGÔGÐGÝ‘”�Ø�ØÔ'ˆEØŒ×)Ò)Ð*>Ñ?Ô?ð Ø$×+Ò+Ñ-Ô-��à$×-Ò-ØØØØð	 .ñ ô ÷
 ’&‘(”(ð ðØCÐCÐCÐCÐCÐCØ$Ð$Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøõ ‰GŒGˆGð " \Ò1ˆKØð MÝ/°¸sÐCÑCÔC�Ø &¨dÐ 2�Øð %Ø$�Gøå 6°wÈÐ LÑ LÔ L�àð +LÝÐYÐPWÐYÐYÑZÔZÐZÑZØñ )LØ$�Ý$ UÑ+Ô+ð 
xÝ#7¸Ñ#>Ô#>�LÝØj uÐjÐjÐjñô ð õ ØÐfrÐÐÐñô ð ð õ
 ÐvÑwÔwÐwÝ-¨l¸E¿LºL¹N¼NÑKÔK�ØÔ#ð på!& r¡¤ð (ð (˜Ý!7¸ÈcÐ!RÑ!RÔ!R˜Ø!ð "Ø&,˜GØ,0˜MØ!˜EÝœ
 3™œ˜˜Ø$ð nÝÐmÐ_kÐmÐmÑnÔnÐnÐnåÐeÀ,ÐeÐeÐeÑfÔfÐfÝÐlÑmÔmÐmÐmåÐRÑSÔSÐSØ#œL�EØð /Ý˜o e˜o˜oÑ.Ô.Ð.Ø$Ÿ|š|™~œ~�HÝ!<¸\È8Ñ!TÔ!T�JØ!ð pÝÐOÑPÔPÐPÝÐ2 jÐ2Ð2Ñ3Ô3Ð3Ð3åÐnÑoÔoÐoÐoåÐJ UÐJÐJÀÐJÐJÑKÔKÐKà ð Ý‘”�Ýð  Cñ  Dô  Dð  DÝ‘”�Ø�à,3�BŒJÐ(Ñ)ðØEÐEÐEÐEÐEÐEØ&Ð& yÑ1Ô1Ð1Ð1øÝð ð ð Ø�ðøøøå‰GŒGˆGÝÐRÑSÔSÐSÝÐ+ 'Ð+Ð+Ñ,Ô,Ð,Ý‰GŒGˆGõ �tÐ-Ñ.Ô.ð ØÔ#×'Ò'ð]ñ
ô 
ð 
ð 
ð 
ðð ð �LÒ Ð Øð Ý”
—’Ð0°$Ñ7Ô7Ð7ðØ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ø(Ð(¨Ñ3Ô3Ð3Ø(Ð(Ñ*Ô*Ð*Ð*øÝ ð ð ð Ø�Dðøøøå‘”�ÝÐSÑTÔTÐTÝÐdÑeÔeÐeÝ‘”�å˜4Ð!1Ñ2Ô2ð ØÔ'×+Ò+ðnñô ð ð ð ðð õ ‘”�ÝÐoÑpÔpÐpÝ‘”���à�HŠ_‰_Ý‰GŒGˆGØñ )WÝÐWÑXÔXÐXÝÐ/ gÐ/Ð/Ñ0Ô0Ð0à�ðÝ §¢¨s°AÑ 6Ô 6°rÔ :× @Ò @ÀÑ EÔ EÀaÔ HÑIÔI�E�EøÝ"¥JÐ/ð ð ð Ø�DðøøøðWØ!�M�M�MØŸš f¤n°fÔ6HÑIÔI�AØ—L’L ‘O”O�OØ—I’I˜{¨EÐ2Ñ3Ô3Ð3Ø—G’G‘I”I�IÝÐ4Ñ5Ô5Ð5Ð5øÝ¥Ð+ð Wð Wð WÝÐUÑVÔVÐVÐVÐVðWøøøð$ØFÐFÐFÐFÐFÐFØ2Ð2Ñ4Ô4�H�HøÝ ð $ð $ð $Ø#�H�H�Hð$øøøð Ð'ÝÐM¨8×+AÒ+AÑ+CÔ+CÐMÐMÐMÑNÔNÐNÐNð(ØJÐJÐJÐJÐJÐJØ!4Ð!4Ñ!6Ô!6˜˜øÝ$ð (ð (ð (Ø!'˜˜˜ð(øøøà Ò-Ð-ÝÐbÑcÔcÐcÝÐ[Ñ\Ô\Ð\ÝÐbÑcÔcÐcÐcØ 8Ò+Ð+ÝÐeÑfÔfÐfÐfåÐUÑVÔVÐVÝ‰GŒGˆGÝÐ]Ñ^Ô^Ð^ÝÐBÑCÔCÐCÝ‰GŒGˆGˆGˆGõ ‰GŒGˆGÝÐ=Ñ>Ô>Ð>Ý‰GŒGˆGÝÐfÑgÔgÐgÝÐEÑFÔFÐFÝÐ=Ñ>Ô>Ð>Ý‰GŒGˆGˆGˆGs’   Å.F Æ8F?Æ>F?ÉI, É,
I9É8I9Ò"R4 Ò4
SÓ SÕU6 Õ6
VÖVÙAZ ÚZ.Ú-Z.Ú2A3\& Ü& ]	Ý]	Ý] Ý]-Ý,]-Þ^* Þ*^9Þ8^9c                óÎ  — ddl m}m}m} ddlm}m} |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}| 
                    ¦   «         }	|                      ¦   «         }
|
€ |d|› d|› �¦  «         dS |r|	d	k    r" |d|
                     ¦   «         › �¦  «         dS |	d
k    r=|
                     ¦   «         }|€ |d|› d|› �¦  «         n |d|j        › �¦  «         dS |	dk    rb|
                     ¦   «         }|€ |d|› d|› �¦  «         n8|                      ¦   «           |d ||j        ¦  «        › d|j        › �¦  «         dS |	dv r3|
                     ¦   «         r |d¦  «         n |d|› d|› �¦  «         dS |                     dd¦  «        }d}d}|rc|d          
                    ¦   «         dk    rEt          |¦  «        dk    r2 |d|d         › �¦  «        }t          |¦  «        dk    r|d         nd}nL|rJ ||d         ¦  «        }|r5|dk    r/|t          |d         ¦  «        d…                              ¦   «         nd}|€ |d¦  «          |d|› d|› �¦  «         dS |dk     rddlm}  |d|› d�¦  «         dS |                     ¦   «         s |d¦  «         dS 	 |
                     ||¦  «        }n&# t*          $ r} |d|› �¦  «         Y d}~dS d}~ww xY w|                      ¦   «           |d ||j        ¦  «        › d|j        › �¦  «          |d|› d|› �¦  «         dS )u[  Dispatch /heartbeat: set / status / pause / resume / clear.

        ``/heartbeat every 10m Check the deployment`` sets the session's one
        recurring instruction; the idle watchdog injects it as a normal user
        turn whenever due. Session-scoped and in-process â€” for durable
        cross-process schedules use `hermes cron`.
        r   ©r  r  rÔ   )Úparse_intervalÚformat_intervalr#   Nr   rW   z+Heartbeats unavailable (no active session).r¾   r“  zNo heartbeat set.u     â�¸ Heartbeat paused: r¬  zNo heartbeat to resume.u     â–¶ Heartbeat resumed (every z): >   r?  ÚstopÚclearu     âœ“ Heartbeat cleared.r    Úeveryzevery zT  Usage: /heartbeat every <interval> <prompt>   (e.g. /heartbeat every 10m Check CI)z0Also: /heartbeat status | pause | resume | clear)ÚMIN_INTERVAL_SECONDSu$     Interval too small â€” minimum is zs.uI     Usage: /heartbeat every <interval> <prompt> â€” the prompt is required.z  Invalid heartbeat: u     â™¥ Heartbeat set (every uÕ   Fires as a normal turn whenever the session is idle and the interval has elapsed. /heartbeat pause | resume | clear to manage; lives only while this Hermes process runs â€” use `hermes cron` for durable schedules.)rw   r  r  rÔ   Úhermes_cli.heartbeatr—  r˜  r-  r5   r6   r8   Ú_get_heartbeat_managerÚstatus_liner“  r/  r¬  Ú_start_heartbeat_watchdogÚinterval_secondsrš  rœ  r—  rb   )r@   rî   r  r  rÔ   r—  r˜  rC   rh   r8   rA   r|  r  Úintervalr/  rœ  r  s                    rI   Ú_handle_heartbeat_commandz*CLICommandsMixin._handle_heartbeat_commandi	  s¨  € ð 	,Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØHÐHÐHÐHÐHÐHÐHÐHà�˜×!Ò!Ñ#Ô#×)Ò)¨$°Ñ2Ô2ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆØ—	’	‘”ˆà×)Ò)Ñ+Ô+ˆØˆ;ØˆGÐP˜ÐPÐPÈ$ÐPÐPÑQÔQÐQØˆFàð 	�e˜xÒ'Ð'ØˆGÐ,˜ŸšÑ*Ô*Ð,Ð,Ñ-Ô-Ð-ØˆFà�GÒÐØ—I’I‘K”KˆEØˆ}Ø�Ð:˜TÐ:Ð:°DÐ:Ð:Ñ;Ô;Ð;Ð;à�ÐA°5´<ÐAÐAÑBÔBÐBØˆFà�HÒÐØ—J’J‘L”LˆEØˆ}Ø�Ð@˜TÐ@Ð@¸$Ð@Ð@ÑAÔAÐAÐAà×.Ò.Ñ0Ô0Ð0Ø�Ðt¸/¸/È%ÔJ`Ñ:aÔ:aÐtÐtÐfkÔfrÐtÐtÑuÔuÐuØˆFàÐ,Ð,Ð,Ø�yŠy‰{Œ{ð <Ø�Ð2Ñ3Ô3Ð3Ð3à�Ð:˜TÐ:Ð:°DÐ:Ð:Ñ;Ô;Ð;ØˆFð —’˜4 Ñ#Ô#ˆØˆØˆØð 	W�f˜Q”i—o’oÑ'Ô'¨7Ò2Ð2µs¸6±{´{ÀaÒ7GÐ7GØ%�~Ð&:¨v°a¬yÐ&:Ð&:Ñ;Ô;ˆHÝ"% f¡+¤+°¢/ /�V˜A”Y�Y°rˆFˆFØð 	WØ%�~ f¨Q¤iÑ0Ô0ˆHØ5=ÐVÀ(ÈQÂ,À,�S�˜V AœY™œ˜˜Ô)×/Ò/Ñ1Ô1Ð1ÐTVˆFàÐØˆGÐjÑkÔkÐkØˆGÐU˜ÐUÐUÈtÐUÐUÑVÔVÐVØˆFØ�aŠ<ˆ<ØAÐAÐAÐAÐAÐAØˆGÐSÐ;OÐSÐSÐSÑTÔTÐTØˆFØ�|Š|‰~Œ~ð 	ØˆGÐ_Ñ`Ô`Ð`ØˆFð	Ø—G’G˜F HÑ-Ô-ˆEˆEøÝð 	ð 	ð 	ØˆGÐ1¨CÐ1Ð1Ñ2Ô2Ð2ØˆFˆFˆFˆFˆFøøøøð	øøøð 	×&Ò&Ñ(Ô(Ð(ØˆÐh¨o¨o¸eÔ>TÑ.UÔ.UÐhÐhÐZ_ÔZfÐhÐhÑiÔiÐiØˆð(�ð (ð (ð "&ð(ð (ñ	
ô 	
ð 	
ð 	
ð 	
s   ËK6 Ë6
LÌ LÌLc                óx  — ddl m}m}m} |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}t          | dd¦  «        }|€ |d|› d|› �¦  «         dS t          t          | d	d¦  «        pg ¦  «        }|s |d|› d
|› �¦  «         dS dt          |dt          ¦   «         ¦  «        v }		 | 
                    |d|	|pd¬¦  «         n&# t          $ r}
 |d|
› �¦  «         Y d}
~
dS d}
~
ww xY w|rd|› d�nd} |d|› d�¦  «         dS )uŠ  Dispatch /refine â€” run the memory/skill review fork on demand.

        Same machinery as the automatic post-turn self-improvement loop
        (``AIAgent._spawn_background_review``), but user-triggered and with
        optional focus instructions. Writes go to the memory + skill stores
        in a background fork; the live conversation and prompt cache are
        never touched.
        r   r–  r#   Nr   r   rW   u/   Nothing to refine yet â€” send a message first.r>   u4   Nothing to refine yet â€” the conversation is empty.Úskill_manageÚvalid_tool_namesT)Úmessages_snapshotÚreview_memoryÚreview_skillsÚfocusz  /refine failed to start: z	 (focus: r  u3     âš— Reviewing this conversation in the backgroundu9    â€” any memory/skill updates will be reported when done.)rw   r  r  rÔ   r-  r5   r6   rv   r~   r—  Ú_spawn_background_reviewrx   )r@   rî   r  r  rÔ   rC   rª  r   Úsnapshotr©  r  Útails               rI   Ú_handle_refine_commandz'CLICommandsMixin._handle_refine_command¾	  så  € ð 	,Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+à�˜×!Ò!Ñ#Ô#×)Ò)¨$°Ñ2Ô2ˆÝ$'¨¡J¤J°¢N N��a”—’Ñ Ô Ð ¸ˆå˜˜g tÑ,Ô,ˆØˆ=ØˆGÐT˜ÐTÐTÈdÐTÐTÑUÔUÐUØˆFå� Ð&<¸dÑCÔCÐIÀrÑJÔJˆØð 	ØˆGÐY˜ÐYÐYÐSWÐYÐYÑZÔZÐZØˆFà&­'°%Ð9KÍSÉUÌUÑ*SÔ*SÐSˆð		Ø×*Ò*Ø"*Ø"Ø+Ø�m˜tð	 +ñ ô ð ð øõ ð 	ð 	ð 	ØˆGÐ7°#Ð7Ð7Ñ8Ô8Ð8ØˆFˆFˆFˆFˆFøøøøð	øøøð (-Ð4Ð#˜5Ð#Ð#Ð#Ð#°"ˆØˆðDÀ$ð Dð Dð Dñ	
ô 	
ð 	
ð 	
ð 	
s   ÃC; Ã;
DÄDÄDc           	     óî  — ddl m}m}m} |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}|                      ¦   «         }|€ |d|› d|› �¦  «         dS |                     ¦   «         }|r|dk    r" |d| 	                    ¦   «         › �¦  «         dS |d	k    rB |d| 	                    ¦   «         › �¦  «          |d| 
                    ¦   «         › �¦  «         dS |                     d
¦  «        rO|t          d
¦  «        d…                              ¦   «         }	|	s |d¦  «         dS |                      |	¦  «         dS |dk    r?|                     d¬¦  «        }
|
€ |d|› d|› �¦  «         n |d|
j        › �¦  «         dS |dk    rN|                     ¦   «         }
|
€ |d|› d|› �¦  «         n$ |d|
j        › �¦  «          |d|› d|› �¦  «         dS |dv rI|                     ¦   «         }|                     ¦   «          |r |d¦  «         n |d|› d|› �¦  «         dS |dk    s|                     d¦  «        �r|t          d¦  «        d…                              ¦   «         }|s |d¦  «         dS |                     dd¦  «        }	 t%          |d         ¦  «        }n# t&          $ r  |d¦  «         Y dS w xY wt          |¦  «        dk    r|d                              ¦   «         nd}	 |                     ||¬¦  «         n-# t*          t&          f$ r} |d|› �¦  «         Y d}~dS d}~ww xY w|rd|› d�nd} |d|› |› d �¦  «         dS |d!k    r3|                     ¦   «         r |d"¦  «         n |d|› d#|› �¦  «         dS |d$k    s|                     d%¦  «        �rP|t          d$¦  «        d…                              ¦   «         }|                     ¦   «         }|r|d&k    r9|                     ¦   «                              ¦   «         D ]} |d|› �¦  «         ŒdS |                     d'¦  «        r“|t          d(¦  «        d…                              ¦   «         }	 |                     |¦  «        }n-# t*          t&          f$ r} |d)|› �¦  «         Y d}~dS d}~ww xY w |d*|j        › d|j        › d+|j        › d,�¦  «         dS |                     d-¦  «        s|                     d.¦  «        r•|                     dd¦  «        d                              ¦   «         }	 |                     t%          |¦  «        ¦  «        }n3# t*          t&          t<          f$ r} |d/|› �¦  «         Y d}~dS d}~ww xY w |d0|› �¦  «         dS |d1k    rX	 |                     ¦   «         }n&# t*          $ r} |d2|› �¦  «         Y d}~dS d}~ww xY w |d3|› d4|dk    rd5nd› d6�¦  «         dS  |d7¦  «         dS dd8l m!}  ||¦  «        \  }}|p|}	 | "                    || #                    ¦   «         s|nd¬9¦  «        }
n&# t&          $ r} |d:|› �¦  «         Y d}~dS d}~ww xY w |d;|
j$        › d<|
j        › �¦  «         |
 %                    ¦   «         rM |d|› d=|› �¦  «         |
j&         '                    ¦   «                              ¦   «         D ]} |d>|› �¦  «         Œ |d|› d?|
 %                    ¦   «         rd@nd› dA|› �¦  «         	 | j(         )                    |
j        ¦  «         dS # tT          $ r Y dS w xY w)BzXDispatch /goal subcommands: set / draft / show / gate / status / pause / resume / clear.r   r–  r#   Nr   rW   ú&Goals unavailable (no active session).r¾   ÚshowÚdraftz2  Usage: /goal draft <objective in plain language>r“  zuser-pausedrÈ   zNo goal set.u     â�¸ Goal paused: r¬  zNo goal to resume.u     â–¶ Goal resumed: z`Send any message (or press Enter on an empty prompt is a no-op; type 'continue' to kick it off).>   Údoner™  rš  u     âœ“ Goal cleared.zNo active goal.Úwaitzwait z"  Usage: /goal wait <pid> [reason]z2  /goal wait: <pid> must be an integer process id.z  /goal wait: rÀ  r  u     â�³ Goal parked on pid z. Loop pauses until it exits.Úunwaitu1     â–¶ Wait barrier cleared â€” goal loop resumes.zNo wait barrier set.Úgatezgate r~   zadd rŒ  z  /goal gate add: u     âš¿ Gate added: $ z
 retries, z6s timeout). It must pass before the goal can complete.zremove zrm z  /goal gate remove: u     âœ“ Gate removed: $ rš  z  /goal gate clear: õ     âœ“ Cleared z gater›   r�   z?  Usage: /goal gate [list | add <command> | remove <N> | clear])Úparse_contract©Úcontractú  Invalid goal: õ     âŠ™ Goal set (ú-turn budget): zCompletion contract:rÙ   z9After each turn, a judge model checks if the goal is donez against the contract abovez™. Hermes keeps working until it is, you pause/clear it, or the budget is exhausted. Use /goal status, /goal show, /goal pause, /goal resume, /goal clear.)+rw   r  r  rÔ   r-  r5   r6   Ú_get_goal_managerr8   rŸ  Úrender_contractrC  Ú_handle_goal_draftr“  rà   r¬  Úhas_goalrš  r—   rb   Úwait_onÚRuntimeErrorÚstop_waitingÚrender_gatesr;   Úadd_gater   Úmax_retriesÚtimeout_secondsÚremove_gater{  Úclear_gatesÚhermes_cli.goalsr¸  r—  Úis_emptyr  Úhas_contractrº  Úrender_blockrÕ  r×  rx   )r@   rî   r  r  rÔ   rC   rh   rA   r8   Ú	objectiver|  ÚhadÚwait_argÚwtokensÚpidr+   r  ÚrtxtÚgate_argÚ
gate_lowerrò   r   r¶  Úidx_textr�  Úprevr¸  Úheadlinerº  Ú	goal_texts                                 rI   Ú_handle_goal_commandz%CLICommandsMixin._handle_goal_commandç	  s
  € à+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�˜×!Ò!Ñ#Ô#×)Ò)¨$°Ñ2Ô2ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆà×$Ò$Ñ&Ô&ˆØˆ;ØˆGÐK˜ÐKÐKÀTÐKÐKÑLÔLÐLØˆFà—	’	‘”ˆð ð 	�e˜xÒ'Ð'ØˆGÐ,˜ŸšÑ*Ô*Ð,Ð,Ñ-Ô-Ð-ØˆFð �FŠ?ˆ?ØˆGÐ,˜ŸšÑ*Ô*Ð,Ð,Ñ-Ô-Ð-ØˆGÐ0˜×,Ò,Ñ.Ô.Ð0Ð0Ñ1Ô1Ð1ØˆFð ×Ò˜GÑ$Ô$ð 	Ø�C ™LœL˜M˜MÔ*×0Ò0Ñ2Ô2ˆIØð Ø�ÐLÑMÔMÐMØ�Ø×#Ò# IÑ.Ô.Ð.ØˆFà�GÒÐØ—I’I ]�IÑ3Ô3ˆEØˆ}Ø�Ð5˜TÐ5Ð5¨tÐ5Ð5Ñ6Ô6Ð6Ð6à�Ð:¨e¬jÐ:Ð:Ñ;Ô;Ð;ØˆFà�HÒÐØ—J’J‘L”LˆEØˆ}Ø�Ð;˜TÐ;Ð;°TÐ;Ð;Ñ<Ô<Ð<Ð<à�Ð;¨u¬zÐ;Ð;Ñ<Ô<Ð<Ø�ðJ˜ð Jð JØCGðJð Jñô ð ð ˆFàÐ-Ð-Ð-Ø—,’,‘.”.ˆCØ�IŠI‰KŒKˆKØð :Ø�Ð-Ñ.Ô.Ð.Ð.à�Ð8˜TÐ8Ð8°$Ð8Ð8Ñ9Ô9Ð9ØˆFð
 �FŠ?ˆ?˜e×.Ò.¨wÑ7Ô7‰?Ø�3˜v™;œ;˜<˜<Ô(×.Ò.Ñ0Ô0ˆHØð Ø�Ð<Ñ=Ô=Ð=Ø�Ø—n’n T¨1Ñ-Ô-ˆGðÝ˜' !œ*‘o”o��øÝð ð ð Ø�ÐLÑMÔMÐMØ��ðøøøõ ,/¨w©<¬<¸!Ò+;Ð+;�W˜Q”Z×%Ò%Ñ'Ô'Ð'ÀˆFðØ—’˜C¨�Ñ/Ô/Ð/Ð/øÝ ¥*Ð-ð ð ð Ø�Ð.¨Ð.Ð.Ñ/Ô/Ð/Ø�����øøøøðøøøð &,Ð3�>˜�>�>�>�>°ˆDØˆGÐX°ÐX°TÐXÐXÐXÑYÔYÐYØˆFð �HÒÐØ×ÒÑ!Ô!ð ?Ø�ÐKÑLÔLÐLÐLà�Ð=˜TÐ=Ð=°tÐ=Ð=Ñ>Ô>Ð>ØˆFð
 �FŠ?ˆ?˜e×.Ò.¨wÑ7Ô7‰?Ø�3˜v™;œ;˜<˜<Ô(×.Ò.Ñ0Ô0ˆHØ!ŸšÑ)Ô)ˆJØð ˜z¨VÒ3Ð3Ø×,Ò,Ñ.Ô.×9Ò9Ñ;Ô;ð )ð )�DØ�G˜K ˜K˜KÑ(Ô(Ð(Ð(Ø�Ø×$Ò$ VÑ,Ô,ð Ø"¥3 u¡:¤: ; ;Ô/×5Ò5Ñ7Ô7�ðØŸ<š<¨Ñ0Ô0�D�DøÝ$¥jÐ1ð ð ð Ø�GÐ6°Ð6Ð6Ñ7Ô7Ð7Ø�F�F�F�F�Føøøøðøøøð �ðB¨4¬<ð Bð BØÔ(ðBð BØ48Ô4HðBð Bð Bñô ð ð
 �Ø×$Ò$ YÑ/Ô/ð °:×3HÒ3HÈÑ3OÔ3Oð Ø#Ÿ>š>¨$°Ñ2Ô2°1Ô5×;Ò;Ñ=Ô=�ðØ!Ÿošo­c°(©m¬mÑ<Ô<�G�GøÝ$¥jµ*Ð=ð ð ð Ø�GÐ9°CÐ9Ð9Ñ:Ô:Ð:Ø�F�F�F�F�Føøøøðøøøð �Ð:°Ð:Ð:Ñ;Ô;Ð;Ø�Ø˜WÒ$Ð$ðØŸ?š?Ñ,Ô,�D�DøÝ#ð ð ð Ø�GÐ8°3Ð8Ð8Ñ9Ô9Ð9Ø�F�F�F�F�Føøøøðøøøð �ÐO¨ÐOÐO¸4À1º9¸9°C°CÈ"ÐOÐOÐOÑPÔPÐPØ�ØˆGÐUÑVÔVÐVØˆFð 	4Ð3Ð3Ð3Ð3Ð3à+˜^¨CÑ0Ô0Ñˆ�(Ø�O ˆ	ð	Ø—G’G˜IÀ×@QÒ@QÑ@SÔ@SÐ0]°°ÐY]�GÑ^Ô^ˆEˆEøÝð 	ð 	ð 	ØˆGÐ, sÐ,Ð,Ñ-Ô-Ð-ØˆFˆFˆFˆFˆFøøøøð	øøøð 	ˆÐO 5¤?ÐOÐOÀ5Ä:ÐOÐOÑPÔPÐPØ×ÒÑÔð 	'ØˆGÐ9˜Ð9Ð9°4Ð9Ð9Ñ:Ô:Ð:Øœ×3Ò3Ñ5Ô5×@Ò@ÑBÔBð 'ð '�Ø�˜˜t˜˜Ñ&Ô&Ð&Ð&Øˆðf�ð fð fØ05×0BÒ0BÑ0DÔ0DÐLÐ,Ð,È"ðfð fð `dðfð fñ	
ô 	
ð 	
ð	ØÔ×#Ò# E¤JÑ/Ô/Ð/Ð/Ð/øÝð 	ð 	ð 	ØˆDˆDð	øøøsœ   ËK ËK7Ë6K7Ì*M ÍM,ÍM'Í'M,ÒR4 Ò4SÓSÓSÕ "V ÖV3ÖV.Ö.V3×W" ×"
X×,X Ø XÙ
-Y8 Ù8
ZÚZÚZÝ]& Ý&
]4Ý3]4rÏ  c                óh  — ddl m}m}m} ddlm} |                      ¦   «         }|€ |d|› d|› �¦  «         dS  |d|› d|› �¦  «         	  ||¦  «        }nK# t          $ r>}ddl}	|	 	                    t          ¦  «                             d|¦  «         d}Y d}~nd}~ww xY w	 |                     ||¬	¦  «        }
n&# t          $ r} |d
|› �¦  «         Y d}~dS d}~ww xY w |d|
j        › d|
j        › �¦  «         |
                     ¦   «         r_ |d|› d|› �¦  «         |
j                             ¦   «                              ¦   «         D ]} |d|› �¦  «         Œ |d|› d|› �¦  «         n |d|› d|› �¦  «         	 | j                             |
j        ¦  «         dS # t          $ r Y dS w xY w)z±Draft a structured completion contract from a plain objective and
        set it as the active goal. Falls back to a bare goal if the aux model
        can't produce a contract.r   r–  )Údraft_contractNrW   r°  u   Drafting completion contractâ€¦zgoal draft failed: %sr¹  r»  r¼  r½  zDrafted completion contract:rÙ   z�Tighten any field by re-setting the goal with inline lines (e.g. verify: <command>), then /goal resume. Use /goal show to review.ut   Couldn't draft a contract (aux model unavailable) â€” running as a free-form goal. The per-turn judge still applies.)rw   r  r  rÔ   rË  rÝ  r¾  rx   ÚloggingÚ	getLoggerrH  Údebugr—  rb   r  rà   rÍ  rº  rÎ  r;   rÕ  r×  )r@   rÏ  r  r  rÔ   rÝ  rA   rº  r  Ú_loggingr|  rò   s               rI   rÀ  z#CLICommandsMixin._handle_goal_draft”
  s»  € ð 	,Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø3Ð3Ð3Ð3Ð3Ð3à×$Ò$Ñ&Ô&ˆØˆ;ØˆGÐK˜ÐKÐKÀTÐKÐKÑLÔLÐLØˆFàˆÐ@�TÐ@Ð@¸$Ð@Ð@ÑAÔAÐAð	Ø%�~ iÑ0Ô0ˆHˆHøÝð 	ð 	ð 	Ø&Ð&Ð&Ð&Ø×Ò�xÑ(Ô(×.Ò.Ð/FÈÑLÔLÐLØˆHˆHˆHˆHˆHˆHøøøøð	øøøð
	Ø—G’G˜I°�GÑ9Ô9ˆEˆEøÝð 	ð 	ð 	ØˆGÐ, sÐ,Ð,Ñ-Ô-Ð-ØˆFˆFˆFˆFˆFøøøøð	øøøð 	ˆÐO 5¤?ÐOÐOÀ5Ä:ÐOÐOÑPÔPÐPØ×ÒÑÔð 	ØˆGÐA˜ÐAÐA¸4ÐAÐAÑBÔBÐBØœ×3Ò3Ñ5Ô5×@Ò@ÑBÔBð 'ð '�Ø�˜˜t˜˜Ñ&Ô&Ð&Ð&ØˆGð3�Tð 3ð 3à,0ð3ð 3ñô ð ð ð ˆGðX�Tð Xð XØQUðXð Xñô ð ð	ØÔ×#Ò# E¤JÑ/Ô/Ð/Ð/Ð/øÝð 	ð 	ð 	ØˆDˆDð	øøøsB   ÁA Á
B Á"4BÂB Â$B< Â<
CÃCÃCÆF# Æ#
F1Æ0F1c                ó  — ddl m}m}m} |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r/d                     |dd…         ¦  «                             ¦   «         nd}|                      ¦   «         }|€ |d|› d	|› �¦  «         dS | 	                    ¦   «         s |d|› d
|› �¦  «         dS |sB |d| 
                    ¦   «         › �¦  «          |d|                     ¦   «         › �¦  «         dS |                     dd¦  «        }|d                              ¦   «         }	t          |¦  «        dk    r|d                              ¦   «         nd}
|	dk    r«|
s |d¦  «         dS 	 t          |
                     ¦   «         d         ¦  «        }n# t          $ r  |d¦  «         Y dS w xY w	 |                     |¦  «        }n-# t           t"          f$ r} |d|› �¦  «         Y d}~dS d}~ww xY w |d|› d|› �¦  «         dS |	dk    rl	 |                     ¦   «         }n&# t"          $ r} |d|› �¦  «         Y d}~dS d}~ww xY w|r |d|› d|dk    rdnd› d�¦  «         n |d|› d|› �¦  «         dS 	 |                     |¦  «        }n-# t          t"          f$ r} |d|› �¦  «         Y d}~dS d}~ww xY w|j        rt          |j        j        ¦  «        nd} |d|› d|› �¦  «         dS )u‹  Dispatch /subgoal subcommands.

        Forms:
          /subgoal                              show current subgoals
          /subgoal <text>                       append a criterion
          /subgoal remove <n>                   drop subgoal n (1-based)
          /subgoal clear                        wipe all subgoals

        Subgoals are extra criteria the user adds mid-loop. They get
        appended to both the judge prompt (verdict must consider them)
        and the continuation prompt (agent sees them) on the next turn
        boundary. No special kick â€” the running turn finishes, the next
        judge call includes them.
        r   r–  r#   Nr    r   r‚   rW   r°  z*No active goal. Set one with /goal <text>.r”  z  Usage: /subgoal remove <n>z:  /subgoal remove: <n> must be an integer (1-based index).z  /subgoal remove: u     âœ“ Removed subgoal r*   rš  z  /subgoal clear: r·  z subgoalr›   r�   zNo subgoals to clear.z  /subgoal: u     âœ“ Added subgoal )rw   r  r  rÔ   r-  r5   r6   r<   r¾  rÁ  rŸ  Úrender_subgoalsr8   r—   rb   Úremove_subgoalr{  rÃ  Úclear_subgoalsÚadd_subgoalr|  Úsubgoals)r@   rî   r  r  rÔ   rC   rh   rA   r  r_  r  rŸ   r�  r  rØ  rp   s                   rI   Ú_handle_subgoal_commandz(CLICommandsMixin._handle_subgoal_commandÂ
  s  € ð 	,Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�˜×!Ò!Ñ#Ô#×)Ò)¨$°Ñ2Ô2ˆÝ-0°©Z¬Z¸!ª^¨^ˆc�hŠh�u˜Q˜R˜R”yÑ!Ô!×'Ò'Ñ)Ô)Ð)Àˆà×$Ò$Ñ&Ô&ˆØˆ;ØˆGÐK˜ÐKÐKÀTÐKÐKÑLÔLÐLØˆFà�|Š|‰~Œ~ð 	ØˆGÐO˜ÐOÐOÈÐOÐOÑPÔPÐPØˆFð ð 	ØˆGÐ,˜ŸšÑ*Ô*Ð,Ð,Ñ-Ô-Ð-ØˆGÐ0˜×,Ò,Ñ.Ô.Ð0Ð0Ñ1Ô1Ð1ØˆFà—’˜4 Ñ#Ô#ˆØ�aŒy�ŠÑ Ô ˆÝ$'¨¡K¤K°!¢O Oˆv�aŒy�ŠÑ Ô Ð ¸ˆà�8ÒÐØð Ø�Ð6Ñ7Ô7Ð7Ø�ðÝ˜$Ÿ*š*™,œ, qœ/Ñ*Ô*��øÝð ð ð Ø�ÐTÑUÔUÐUØ��ðøøøðØ×,Ò,¨SÑ1Ô1��øÝ¥Ð-ð ð ð Ø�Ð3¨cÐ3Ð3Ñ4Ô4Ð4Ø�����øøøøðøøøð ˆGÐ=¨SÐ=Ð=°GÐ=Ð=Ñ>Ô>Ð>ØˆFà�7Š?ˆ?ðØ×)Ò)Ñ+Ô+��øÝð ð ð Ø�Ð2¨SÐ2Ð2Ñ3Ô3Ð3Ø�����øøøøðøøøð ð @Ø�ÐR¨ÐRÐR¸dÀaºi¸i°s°sÈRÐRÐRÐRÑSÔSÐSÐSà�Ð>˜TÐ>Ð>¸Ð>Ð>Ñ?Ô?Ð?ØˆFð	Ø—?’? 3Ñ'Ô'ˆDˆDøÝ�LÐ)ð 	ð 	ð 	ØˆGÐ( 3Ð(Ð(Ñ)Ô)Ð)ØˆFˆFˆFˆFˆFøøøøð	øøøð *-¬Ð9�c�#”)Ô$Ñ%Ô%Ð%¸ˆØˆÐ4 sÐ4Ð4¨dÐ4Ð4Ñ5Ô5Ð5Ð5Ð5sZ   Æ'F* Æ*GÇGÇG ÇHÇ.HÈHÈ$H9 È9
IÉIÉIÊJ& Ê&KÊ7KËKc                óª  — ddl m}m} 	 ddlm}m}m} n # t          $ r t          d¦  «         Y dS w xY w| 	                    ¦   «          
                    d¬¦  «        }t          |¦  «        dk     s|d          	                    ¦   «         sº |¦   «         } |¦   «         }	t          d	|› �¦  «         t          d
¦  «         |	D ]R}
|
d         |k    rdnd}|
d         dk    rd|
d         › d�nd}t          d|› d|
d         › |› d|
d         › �¦  «         ŒSt          d¦  «         t          dt          ¦   «         › d�¦  «         dS |d          	                    ¦   «                              ¦   «         }d„  |¦   «         D ¦   «         }||vrFt          d|› �¦  «         t          dd                     t          |¦  «        ¦  «        › �¦  «         dS  ||¦  «         |                     ¦   «           |d|¦  «        rt          d|› d �¦  «         nt          d|› �¦  «         t          d!¦  «         |                      ¦   «         rt          d"¦  «         dS dS )#u8   Handle /skin [name] â€” show or change the display skin.r   )r<  rê  )Ú
list_skinsÚset_active_skinÚget_active_skin_namezSkin engine not available.Nr   r#  r    z
  Current skin: z  Available skins:r«   u    â—�rW   rñ  rõ  rÀ  r  r#   z   r‚   u    â€” rV  z
  Usage: /skin <name>z$  Custom skins: drop a YAML file in z/skins/
c                ó   — h | ]
}|d          ’ŒS r³   rE  )rÂ   r›   s     rI   rw  z8CLICommandsMixin._handle_skin_command.<locals>.<setcomp>'  s   € Ð5Ð5Ð5 1�Q�v”YÐ5Ð5Ð5rK   z  Unknown skin: z  Available: rS  zdisplay.skinz  Skin set to: z (saved)z8  Note: banner colors will update on next session start.z  Prompt + TUI colors updated.)rw   r<  rê  r1  rê  rë  rì  ÚImportErrorr/   r-  r5   r6   r	   r8   r<   Úsortedr½  Ú_apply_tui_skin_style)r@   rî   r<  rê  rê  rë  rì  rC   rŸ  Úskinsr›   r.  rñ  Únew_skinÚ	availables                  rI   Ú_handle_skin_commandz%CLICommandsMixin._handle_skin_command  sâ  € à2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð	Ø`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`øÝð 	ð 	ð 	ÝÐ.Ñ/Ô/Ð/ØˆFˆFð	øøøð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>  q¤§¢Ñ!1Ô!1ˆ>à*Ð*Ñ,Ô,ˆGØ�J‘L”LˆEÝÐ0 wÐ0Ð0Ñ1Ô1Ð1ÝÐ&Ñ'Ô'Ð'Øð Qð Q�Ø#$ V¤9°Ò#7Ð#7˜˜¸T�Ø01°(´¸vÒ0EÐ0EÐ,˜a œkÐ,Ð,Ð,Ð,È2�ÝÐO˜FÐOÐO Q v¤YÐO°ÐOÐO¸Q¸}Ô=MÐOÐOÑPÔPÐPÐPÝÐ+Ñ,Ô,Ð,ÝÐYÕ9LÑ9NÔ9NÐYÐYÐYÑZÔZÐZØˆFà˜”8—>’>Ñ#Ô#×)Ò)Ñ+Ô+ˆØ5Ð5¨
¨
©¬Ð5Ñ5Ô5ˆ	Ø˜9Ð$Ð$ÝÐ/ XÐ/Ð/Ñ0Ô0Ð0ÝÐ@ $§)¢)­F°9Ñ,=Ô,=Ñ">Ô">Ð@Ð@ÑAÔAÐAØˆFàˆ˜Ñ!Ô!Ð!Ø�Š‰Œˆð Ð˜^¨XÑ6Ô6ð 	0ÝÐ6 HÐ6Ð6Ð6Ñ7Ô7Ð7Ð7åÐ. HÐ.Ð.Ñ/Ô/Ð/ÝÐHÑIÔIÐIØ×%Ò%Ñ'Ô'ð 	4ÝÐ2Ñ3Ô3Ð3Ð3Ð3ð	4ð 	4s   Š
 •2±2r#   Úinitial_textc                ó  — ddl }ddl}ddl}ddl}|j                             d¦  «        p|j                             d¦  «        }|s|j        dk    rdnd}d}|                     d	d
¬¦  «        \  }}		  |j        |dd¬¦  «        5 }
|
 	                    |¦  «         |r|
 	                    |¦  «         ddd¦  «         n# 1 swxY w Y   	 | 
                    g |                     |¦  «        ¢|	‘¦  «         n?# t          $ r2 | 
                    |› d|                     |	¦  «        › �d¬¦  «         Y nw xY wt          |	dd¬¦  «        5 }
|
                     ¦   «         }ddd¦  «         n# 1 swxY w Y   	  |j        |	¦  «         n6# t"          $ r Y n*w xY w# 	  |j        |	¦  «         w # t"          $ r Y w w xY wxY wd„ |                     ¦   «         D ¦   «         }d                     |¦  «                             ¦   «         S )aw  Open ``$VISUAL``/``$EDITOR`` on a temp markdown file and return the
        saved buffer (comment lines starting with ``#!`` stripped).

        Returns the composed prompt text, or an empty string if the editor
        could not be launched or the buffer was left empty. Factored out so
        the read-back/strip logic is unit-testable without spawning an editor.
        r   NÚVISUALÚEDITORÚntÚnotepadÚnanozv#! Compose your prompt below. Lines starting with '#!' are ignored.
#! Save and quit to send; leave empty to cancel.

z.mdÚhermes_prompt_)r4  ÚprefixrQ  zutf-8)Úencodingr‚   T)ÚshellÚrc                ó<   — g | ]}|                      d ¦  «        °|‘ŒS )z#!)rC  )rÂ   Úlns     rI   rÄ   z7CLICommandsMixin._compose_in_editor.<locals>.<listcomp>b  s)   € ÐJÐJÐJ˜°b·m²mÀDÑ6IÔ6IÐJ�ÐJÐJÐJrK   r$   )r2   ra   Ú
subprocessÚtempfiler  r:   r«   ÚmkstempÚfdopenr;  Úcallr5   rx   r¦  ÚopenÚreadÚunlinkr�  r;   r<   r-  )r@   rõ  r2   ra   r  r  ÚeditorÚheaderÚfdrc  ÚfhÚrawÚliness                rI   Ú_compose_in_editorz#CLICommandsMixin._compose_in_editor9  sß  € ð 	ˆ	ˆ	ˆ	ØˆˆˆØÐÐÐØˆˆˆà”—’ Ñ)Ô)ÐE¨R¬Z¯^ª^¸HÑ-EÔ-EˆØð 	>Ø"$¤'¨T¢/ /�Y�Y°vˆFðCð 	ð ×#Ò#¨5Ð9IÐ#ÑJÔJ‰ˆˆDð	Ø�”˜2˜s¨WÐ5Ñ5Ô5ð +¸Ø—’˜Ñ Ô Ð Øð +Ø—H’H˜\Ñ*Ô*Ð*ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ðMØ—’Ð < %§+¢+¨fÑ"5Ô"5Ð <°tÐ <Ñ=Ô=Ð=Ð=øÝð Mð Mð Mð —’ 6Ð ?Ð ?¨E¯KªK¸Ñ,=Ô,=Ð ?Ð ?Àt�ÑLÔLÐLÐLÐLðMøøøõ �d˜C¨'Ð2Ñ2Ô2ð  °bØ—g’g‘i”i�ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ðØ�”	˜$‘”��øÝð ð ð Ø�ðøøøøðØ�”	˜$‘”��øÝð ð ð Ø�ðøøøøøøð KÐJ˜cŸnšnÑ.Ô.ÐJÑJÔJˆØ�yŠy˜ÑÔ×%Ò%Ñ'Ô'Ð's®   Á3F Â-B?Â3F Â?CÃF ÃCÃF Ã,C8 Ã7F Ã89D4Ä1F Ä3D4Ä4F Å	E*ÅF Å*E.Å.F Å1E.Å2F Å6F Æ
FÆFÆF:ÆF*Æ)F:Æ*
F7Æ4F:Æ6F7Æ7F:c                ód  — ddl m}m}m} d}|pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d         }	 |                      |¦  «        }n+# t          $ r} |d|› d|› |› �¦  «         Y d}~dS d}~ww xY w|s |d|› d|› �¦  «         dS || _	        dS )	uw  Handle /prompt â€” compose the next prompt in $EDITOR and send it.

        Opens the user's editor on a temporary markdown file (optionally
        seeded with text passed after the command), then queues the saved
        buffer as the next agent turn via the one-shot ``_pending_agent_seed``
        the interactive loop already consumes (same path as /blueprint).
        r   r–  r#   Nr   rW   z(>_<) Could not open editor: u$   (._.) Empty prompt â€” nothing sent.)
rw   r  r  rÔ   r-  r5   r6   r  rx   r«  )	r@   rú   r  r  rÔ   ÚinitialrC   Úcomposedr  s	            rI   Ú_handle_prompt_compose_commandz/CLICommandsMixin._handle_prompt_compose_commande  s  € ð 	,Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+àˆØÐ# ×*Ò*Ñ,Ô,×2Ò2°4¸Ñ;Ô;ˆÝˆu‰:Œ:˜Š>ˆ>Ø˜A”hˆGð	Ø×.Ò.¨wÑ7Ô7ˆHˆHøÝð 	ð 	ð 	ØˆGÐG˜ÐGÐG¸CÐGÀÐGÐGÑHÔHÐHØˆFˆFˆFˆFˆFøøøøð	øøøð ð 	ØˆGÐI˜ÐIÐIÀ4ÐIÐIÑJÔJÐJØˆFð $,ˆÔ Ð Ð s   ÁA) Á)
BÁ3BÂBc           
     ó@  — ddl m}m} ddlm} ddlm}m}m}m	}m
}	m}
 d}	 |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         }n# t          $ r d}Y nw xY wt!          t#          | dd	¦  «        ¦  «        } |
||¦  «        \  }}|d
k    r |d¦  «         dS  |	|rt#          | dd¦  «        nt#          | dd¦  «        ¦  «        }|dk    r£ |||¦  «        }|                     d¦  «        \  }}}|                     d¦  «        \  }}}|r|j        n|j        } |d|j        › |› d|j        › |› |› |j        › �|r&d|j        › d|                     ¦   «         › |j        › �ndz   ¦  «         dS ||k    r |d |||¦  «        › �¦  «         dS |r|| _        |                      |¦  «         n|                      |¦  «         d| _        t!          |¦  «        | _        d| _         ||t!          |¦  «        ¦  «         |r|j        › d|j        › �n|j        › d|j        › �} |t!          |¦  «        |¦  «        }dD ]}||v r|                     ||d¦  «        } nŒ  |d|› �¦  «         dS )u  Toggle or inspect focus view â€” the reduced-output display mode.

        Usage:
            /focus            â†’ toggle
            /focus on|off     â†’ explicit
            /focus status     â†’ show current state

        Focus view is a DISPLAY-ONLY mode.  It composes with the existing
        ``/verbose`` tool-progress machinery rather than adding a second
        suppression mechanism: turning it on snaps ``tool_progress_mode`` to
        ``"off"`` (the same value ``/verbose off`` uses, honoured by
        ``agent/tool_executor.py`` and ``_on_tool_progress``) after stashing
        whatever mode the user had, and turning it off restores that mode
        verbatim.  On top of that it adds the two things ``/verbose off``
        lacks: a per-turn hidden-line count with a recovery hint, and a
        persistent ``focus`` segment in the status bar.

        Nothing here touches conversation history, the system prompt, or any
        request payload â€” the model sees an identical turn either way.
        r   ©rÔ   rê  ©ÚColors)ÚFOCUS_CONFIG_KEYÚFOCUS_TOOL_PROGRESS_MODEÚformat_focus_statusÚformat_focus_toggle_messageÚnormalize_tool_progress_modeÚresolve_focus_argr#   Nr   Ú_focus_view_enabledFÚusagez  Usage: /focus [on|off|status]Ú_focus_saved_tool_progressÚtool_progress_moderP   r¾   r$   r^   rW   r1   Údisabled)r1   r$  )rw   rÔ   rê  Úhermes_cli.colorsr  Úhermes_cli.focus_viewr  r  r  r  r  r  r-  r5   r6   rx   rm   rv   Ú	partitionÚGREENÚDIMÚBOLDÚRESETr"  Ú_set_tool_progress_moder   Ú_focus_hidden_linesÚreplace)r@   rú   rÔ   rê  Ú_Colorsr  r  r  r  r  r  rh   rC   rŸ  rƒ  rÖ  Úrestore_modeÚbodyrR   rv  r­  rj   r  Ústate_colorr|  ÚmessageÚwords                              rI   Ú_handle_focus_commandz&CLICommandsMixin._handle_focus_command‚  sÑ  € ð* 	3Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø7Ð7Ð7Ð7Ð7Ð7ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˆð	Ø!Ð' R×.Ò.Ñ0Ô0×6Ò6°t¸QÑ?Ô?ˆEÝ�5‰zŒz˜AŠ~ˆ~Ø˜A”h—n’nÑ&Ô&�øøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøõ •w˜tÐ%:¸EÑBÔBÑCÔCˆØ*Ð*¨3°Ñ8Ô8‰ˆ�à�WÒÐØˆGÐ5Ñ6Ô6Ð6ØˆFð 4Ð3àð<�G�DÐ6¸Ñ=Ô=Ð=å˜Ð3°UÑ;Ô;ñ
ô 
ˆð �XÒÐØ&Ð& w°Ñ=Ô=ˆDØ ŸNšN¨4Ñ0Ô0‰MˆD�!�TØ!Ÿ^š^¨CÑ0Ô0‰NˆE�1�dØ+2ÐC˜'œ-˜-¸¼ˆKØˆGð6�W”\ð 6 5ð 6ð 6¨7¬=ð 6Øð6Ø $ð6Ø&-¤mð6ð 6àHLÐTÐD˜œÐDÐD t§z¢z¡|¤|ÐD°W´]ÐDÐDÐDÐRTñVñô ð ð
 ˆFà�WÒÐàˆGÐMÐ4Ð4°W¸lÑKÔKÐMÐMÑNÔNÐNØˆFàð 	3ð /;ˆDÔ+Ø×(Ò(Ð)AÑBÔBÐBÐBà×(Ò(¨Ñ6Ô6Ð6Ø.2ˆDÔ+å#'¨¡<¤<ˆÔ Ø#$ˆÔ ØÐÐ*­D°©L¬LÑ9Ô9Ð9ð 9?ð 9ˆwŒ}Ð4Ð4 W¤]Ð4Ð4Ð4Ø”KÐ8Ð8¨¬Ð8Ð8ð 	ð .Ð-­d°6©l¬l¸LÑIÔIˆà+ð 	ð 	ˆDØ�wˆˆØ!Ÿ/š/¨$°°qÑ9Ô9�Ø�ð ð 	ˆ��W��ÑÔÐÐÐs   ¢AA: Á:B	ÂB	rU   c                ó’   — ddl m}  ||¦  «        }|| _        t          | dd¦  «        }|�	 ||_        dS # t          $ r Y dS w xY wdS )u-  Set the live tool-progress mode on both the CLI and the agent.

        Extracted so ``/focus`` and ``/verbose`` share one write path â€” the
        agent copy is what ``agent/tool_executor.py`` gates on, and forgetting
        it means the new mode only takes effect after an agent rebuild.
        r   )r  r   N)r&  r  r#  rv   rx   )r@   rU   r  rt  r   s        rI   r,  z(CLICommandsMixin._set_tool_progress_modeã  sƒ   € ð 	GÐFÐFÐFÐFÐFà1Ð1°$Ñ7Ô7ˆ
Ø",ˆÔÝ˜˜g tÑ,Ô,ˆØÐðØ+5�Ô(Ð(Ð(øÝð ð ð Ø��ðøøøð Ðs   ­6 ¶
AÁAÚfunction_namec                óô   — t          | dd¦  «        sdS ddlm} t          | dd¦  «        }t          | dd¦  «        } ||||¦  «        sdS || _        t	          t          | dd¦  «        ¦  «        d	z   | _        dS )
a
  Count one tool line that focus view is suppressing this turn.

        Counted against the mode the user had BEFORE focus snapped things to
        "off", so a user who already ran ``/verbose off`` is never told that
        focus hid lines it did not hide.
        r   FNr   )Úwould_display_tool_liner"  Ú_focus_last_counted_toolr-  r   )rv   r&  r9  r:  r—   r-  )r@   r7  r9  r-  Úlasts        rI   Ú_note_focus_hidden_linez(CLICommandsMixin._note_focus_hidden_lineõ  s¡   € õ �tÐ2°EÑ:Ô:ð 	ØˆFØAÐAÐAÐAÐAÐAå˜Ð:¸DÑAÔAˆÝ�tÐ7¸Ñ>Ô>ˆØ&Ð& u¨m¸TÑBÔBð 	ØˆFØ(5ˆÔ%Ý#&¥w¨tÐ5JÈAÑ'NÔ'NÑ#OÔ#OÐRSÑ#SˆÔ Ð Ð rK   c                ó  — t          t          | dd¦  «        pd¦  «        }d| _        d| _        t          | dd¦  «        sdS ddlm}  ||¦  «        }|sdS 	 ddlm}m}m	}  |d|› |› |› �¦  «         dS # t          $ r Y dS w xY w)	z<Print the dim post-turn recovery line and reset the counter.r-  r   Nr   F)Úformat_hidden_liner–  rW   )r—   rv   r-  r:  r&  r>  rw   r  r  rÔ   rx   )r@   Úcountr>  rò   r  r  rÔ   s          rI   Ú_emit_focus_recovery_linez*CLICommandsMixin._emit_focus_recovery_line  sè   € å•G˜DÐ"7¸Ñ;Ô;Ð@¸qÑAÔAˆØ#$ˆÔ Ø(,ˆÔ%Ý�tÐ2°EÑ:Ô:ð 	ØˆFØ<Ð<Ð<Ð<Ð<Ð<à!Ð! %Ñ(Ô(ˆØð 	ØˆFð	Ø/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/àˆGÐ+˜Ð+˜tÐ+ TÐ+Ð+Ñ,Ô,Ð,Ð,Ð,øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ÁA6 Á6
BÂBc                óè   — ddl m} ddlm} |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d         nd} ||¦  «        } |d|j        › �¦  «         dS )zAShow or persist the profile-wide dangerous-command approval mode.r   rÓ   )Úrun_approval_mode_commandr#   Nr   rW   )rw   rÔ   Úhermes_cli.approval_moderB  r-  r5   r6   r3  )r@   rú   rÔ   rB  rC   Ú	requestedrG   s          rI   Ú_handle_approvals_commandz*CLICommandsMixin._handle_approvals_command  s˜   € àÐÐÐÐÐØFÐFÐFÐFÐFÐFàÐ# ×*Ò*Ñ,Ô,×2Ò2°4¸Ñ;Ô;ˆÝ # E¡
¤
¨Q¢ �E˜!”H�H°Dˆ	Ø*Ð*¨9Ñ5Ô5ˆØˆÐ%�V”^Ð%Ð%Ñ&Ô&Ð&Ð&Ð&rK   c                ót  — ddl m}m} ddlm} ddlm} d}	 |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r,|d                              ¦   «          
                    ¦   «         }n# t          $ r d}Y nw xY w |¦   «         pi }|                     d¦  «        pi                      d	¦  «        pi }	t          |	                     d
d¦  «        ¦  «        }
|	                     d¦  «        pg d¢}|dv r<|
rdnd} |d|j        › d|j        › d|› dd                     |¦  «        › �¦  «         dS |dv rd}n|dv rd}n|dk    r|
 }n |d¦  «         dS  |d|¦  «        r4|r|j        › d|j        › �n|j        › d|j        › �} |d|› �¦  «         dS  |d¦  «         dS )uä   Toggle or inspect ``display.runtime_footer.enabled`` from the CLI.

        Usage:
            /footer           â†’ toggle
            /footer on|off    â†’ explicit
            /footer status    â†’ show current state
        r   r  rW  r  r#   Nr   rm  Úruntime_footerr1   FÚfields)rò  Úcontext_pctrB   >   r¾   rÛ   ÚONÚOFFrW   zRuntime footer:r‚   z
  Fields: rS  >   Ú1ÚonÚtruerM  T>   Ú0r?  ÚfalserN  z   Usage: /footer [on|off|status]zdisplay.runtime_footer.enabledz  Runtime footer: z6  Failed to save runtime_footer setting to config.yaml)rw   rÔ   rê  r[  rX  r%  r  r-  r5   r6   r8   rx   r:   rm   r*  r+  r<   r(  r)  )r@   rú   rÔ   rê  rX  r/  rh   rC   ÚcfgÚ
footer_cfgrŸ  rH  r|  Ú	new_states                 rI   Ú_handle_footer_commandz'CLICommandsMixin._handle_footer_command$  s‰  € ð 	3Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø1Ð1Ð1Ð1Ð1Ð1Ø7Ð7Ð7Ð7Ð7Ð7ð ˆð	Ø!Ð' R×.Ò.Ñ0Ô0×6Ò6°t¸QÑ?Ô?ˆEÝ�5‰zŒz˜AŠ~ˆ~Ø˜A”h—n’nÑ&Ô&×,Ò,Ñ.Ô.�øøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøð ˆk‰mŒmÐ!˜rˆØ—w’w˜yÑ)Ô)Ð/¨R×4Ò4Ð5EÑFÔFÐLÈ"ˆ
Ý�z—~’~ i°Ñ7Ô7Ñ8Ô8ˆØ—’ Ñ)Ô)ÐLÐ-LÐ-LÐ-Lˆà�/Ð!Ð!Ø#Ð.�D�D¨ˆEØˆGð1�W”\ð 1ð 1°'´-ð 1ð 1À%ð 1ð 1Ø!ŸYšY vÑ.Ô.ð1ð 1ñô ð ð ˆFàÐ/Ð/Ð/ØˆIˆIØÐ4Ð4Ð4ØˆIˆIØ�BŠYˆYØ#˜ˆIˆIàˆGÐ6Ñ7Ô7Ð7ØˆFàÐÐ=¸yÑIÔIð 	Nà7@ð 8�7”=Ð3Ð3 G¤MÐ3Ð3Ð3ØœÐ7Ð7¨¬Ð7Ð7ð ð ˆGÐ0¨Ð0Ð0Ñ1Ô1Ð1Ð1Ð1àˆGÐLÑMÔMÐMÐMÐMs   ˜A)B ÂBÂBc                óž  — ddl m}m} ddlm} d}	 |pd                     ¦   «                              dd¦  «        }t          |¦  «        dk    r,|d                              ¦   «                              ¦   «         }n# t          $ r d}Y nw xY wt          t          | dd¦  «        ¦  «        }|d	v r&|rd
nd} |d|j        › d|j        › d|› �¦  «         dS |dv rd}	n|dv rd}	n|dk    r| }	n |d¦  «         dS |	| _         |d|	¦  «        r4|	r|j        › d
|j        › �n|j        › d|j        › �} |d|› �¦  «         dS  |d¦  «         dS )u¥  Toggle or inspect ``display.timestamps`` from the CLI.

        When on, submitted and streamed message labels carry an ``[HH:MM]``
        suffix and ``/history`` prefixes each turn with its time (for turns
        that carry a stored timestamp).

        Usage:
            /timestamps           â†’ toggle
            /timestamps on|off    â†’ explicit
            /timestamps status    â†’ show current state
        r   r  r  r#   Nr   Úshow_timestampsF>   r¾   rÛ   rJ  rK  rW   zMessage timestamps:r‚   >   rL  rM  rN  rM  T>   rO  r?  rP  rN  z$  Usage: /timestamps [on|off|status]zdisplay.timestampsz  Message timestamps: z2  Failed to save timestamps setting to config.yaml)rw   rÔ   rê  r%  r  r-  r5   r6   r8   rx   rm   rv   r*  r+  rV  r(  r)  )
r@   rú   rÔ   rê  r/  rh   rC   rŸ  r|  rS  s
             rI   Ú_handle_timestamps_commandz+CLICommandsMixin._handle_timestamps_commandY  sö  € ð 	3Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø7Ð7Ð7Ð7Ð7Ð7àˆð	Ø!Ð' R×.Ò.Ñ0Ô0×6Ò6°t¸QÑ?Ô?ˆEÝ�5‰zŒz˜AŠ~ˆ~Ø˜A”h—n’nÑ&Ô&×,Ò,Ñ.Ô.�øøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøõ •w˜tÐ%6¸Ñ>Ô>Ñ?Ô?ˆà�/Ð!Ð!Ø#Ð.�D�D¨ˆEØˆGÐQ˜œÐQÐQ¸'¼-ÐQÐQÈ%ÐQÐQÑRÔRÐRØˆFàÐ/Ð/Ð/ØˆIˆIØÐ4Ð4Ð4ØˆIˆIØ�BŠYˆYØ#˜ˆIˆIàˆGÐ:Ñ;Ô;Ð;ØˆFà(ˆÔØÐÐ1°9Ñ=Ô=ð 	Jà7@ð 8�7”=Ð3Ð3 G¤MÐ3Ð3Ð3ØœÐ7Ð7¨¬Ð7Ð7ð ð ˆGÐ4¨UÐ4Ð4Ñ5Ô5Ð5Ð5Ð5àˆGÐHÑIÔIÐIÐIÐIs   ’A)A< Á<BÂ
Bc           
     óÎ  — ddl m}m}m}m}m}m}m} |                     ¦   «          	                    d¬¦  «        }	t          |	¦  «        dk     r™| j        }
|
€d}n0|
                     d¦  «        d	u rd
}n|
                     dd¦  «        }| j        rdnd}t          | dd	¦  «        rdnd} |d|› d|› |› �¦  «          |d|› d|› d|› d|› �¦  «          |d|› d|› �¦  «         dS |	d                              ¦   «                              ¦   «         }| 	                    ¦   «         }d|v }|sd|v rd                     d„ |D ¦   «         ¦  «        }|dv r\d| _        | j        r|                      ¦   «         | j        _         |dd¦  «          |d|› d|› �¦  «          |d|› d |› �¦  «         dS |d!v rKd	| _        | j        r|                      ¦   «         | j        _         |dd	¦  «          |d|› d"|› �¦  «         dS |d#v rOd| _         |d$d¦  «          |d|› d%|› �¦  «          |d|› d&|› �¦  «         | j        s |d|› d'|› �¦  «         dS |d(v r&d	| _         |d$d	¦  «          |d|› d)|› �¦  «         dS  ||¦  «        }|€H |d|› d*|› |› �¦  «          |d|› d+|› �¦  «          |d|› d,|› �¦  «          |d|› d-|› �¦  «         dS || _        d| _        |rX |d.|¦  «        rL|                     d/¦  «        }t+          |t,          ¦  «        si }||d/<   ||d0<    |d|› d1|› d2|› �¦  «         dS |r |d|› d1|› d3|› �¦  «         dS  |d|› d1|› d4|› �¦  «         dS )5u«  Handle /reasoning â€” manage effort level and display toggle.

        Usage:
            /reasoning              Show current effort level and display state
            /reasoning <level>      Set effort for this session only (none, minimal, low, medium, high, xhigh, max, ultra)
            /reasoning <level> --global  Persist reasoning effort to config.yaml
            /reasoning show|on      Show model thinking/reasoning in output
            /reasoning hide|off     Hide model thinking/reasoning from output
            /reasoning full         Show complete thinking (no 10-line clamp)
            /reasoning clamp        Collapse long thinking to the first 10 lines
        r   )Ú
CLI_CONFIGr<  r  r  rÔ   Ú_parse_reasoning_configrê  r   r#  r    Nzmedium (default)r1   Fznone (disabled)ÚeffortÚmediumu   on âœ“r?  Úreasoning_fullÚfullzclamped to 10 linesrW   zReasoning effort:  zReasoning display: rÀ  r  z`Usage: /reasoning <none|minimal|low|medium|high|xhigh|max|ultra|show|hide|full|clamp> [--global]ú--globalú	--sessionr‚   c              3  ó"   K  — | ]
}|d v¯|V — ŒdS ©)r_  r`  NrE  ©rÂ   r�  s     rI   rR  z=CLICommandsMixin._handle_reasoning_command.<locals>.<genexpr>±  s:   è è € ð ð ØØÐ 9Ð9Ð9ð Ø9Ð9Ð9Ð9ðð rK   >   rM  r±  Tzdisplay.show_reasoningu!   âœ“ Reasoning display: ON (saved)z>  Model thinking will be shown during and after each response.>   r?  Úhideu"   âœ“ Reasoning display: OFF (saved)>   rP   r^  zdisplay.reasoning_fullu#   âœ“ Reasoning display: FULL (saved)z;  The post-response recap box will print complete thinking.uC     Note: reasoning display is OFF â€” run /reasoning show to see it.>   ÚclampÚshortÚcollapseu2   âœ“ Reasoning display: CLAMPED to 10 lines (saved)ú(._.) Unknown argument: zAValid levels: none, minimal, low, medium, high, xhigh, max, ultrazDisplay:      show, hidez<Scope:        session-scoped by default, --global to persistzagent.reasoning_effortr   Úreasoning_effortu   âœ“ Reasoning effort set to 'r"  z$' (session only; config save failed)u,   ' (this session â€” use --global to persist))rw   rY  r<  r  r  rÔ   rZ  rê  r-  r5   r6   rï  r:   Úshow_reasoningrv   r8   r<   r   Ú_current_reasoning_callbackÚreasoning_callbackr]  rë   rì   )r@   rî   rY  r<  r  r  rÔ   rZ  rê  rC   ÚrcÚlevelÚdisplay_stateÚ
full_staterh   Ú
arg_tokensÚexplicit_globalÚparsedÚ	agent_cfgs                      rI   Ú_handle_reasoning_commandz*CLICommandsMixin._handle_reasoning_command‹  sˆ  € ð 	mÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlØ—	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆåˆu‰:Œ:˜Š>ˆ>àÔ&ˆBØˆzØ*��Ø—’˜	Ñ"Ô" eÐ+Ð+Ø)��àŸš˜x¨Ñ2Ô2�Ø(,Ô(;ÐF˜H˜HÀˆMÝ#*¨4Ð1AÀ5Ñ#IÔ#IÐd˜˜ÐOdˆJØˆGÐB˜ÐBÐB°UÐB¸DÐBÐBÑCÔCÐCØˆGÐY˜ÐYÐY°]ÐYÐYÀjÐYÐYÐSWÐYÐYÑZÔZÐZØˆGð  F˜ð  Fð  Fð  @Dð  Fð  Fñ  Gô  Gð  GØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆØ—Y’Y‘[”[ˆ
ð %¨
Ð2ˆØð 	˜k¨ZÐ7Ð7Ø—(’(ð ð Ø#-ðñ ô ñ ô ˆCð �.Ð Ð Ø"&ˆDÔØŒzð SØ04×0PÒ0PÑ0RÔ0R�”
Ô-ØÐÐ6¸Ñ=Ô=Ð=ØˆGÐI˜ÐIÐIÀ4ÐIÐIÑJÔJÐJØˆGÐc˜ÐcÐcÐ]aÐcÐcÑdÔdÐdØˆFØ�/Ð!Ð!Ø"'ˆDÔØŒzð SØ04×0PÒ0PÑ0RÔ0R�”
Ô-ØÐÐ6¸Ñ>Ô>Ð>ØˆGÐJ˜ÐJÐJÀDÐJÐJÑKÔKÐKØˆFð �/Ð!Ð!Ø"&ˆDÔØÐÐ6¸Ñ=Ô=Ð=ØˆGÐK˜ÐKÐKÀTÐKÐKÑLÔLÐLØˆGÐ`˜Ð`Ð`ÐZ^Ð`Ð`ÑaÔaÐaØÔ&ð nØ�Ðl˜TÐlÐlÐfjÐlÐlÑmÔmÐmØˆFØÐ0Ð0Ð0Ø"'ˆDÔØÐÐ6¸Ñ>Ô>Ð>ØˆGÐZ˜ÐZÐZÐTXÐZÐZÑ[Ô[Ð[ØˆFð )Ð(¨Ñ-Ô-ˆØˆ>ØˆGÐB˜ÐBÐB°sÐB¸DÐBÐBÑCÔCÐCØˆGÐf˜ÐfÐfÐ`dÐfÐfÑgÔgÐgØˆGÐ=˜Ð=Ð=°tÐ=Ð=Ñ>Ô>Ð>ØˆGÐa˜ÐaÐaÐ[_ÐaÐaÑbÔbÐbØˆFà &ˆÔØˆŒ
àð 
	xÐ0Ð0Ð1IÈ3ÑOÔOð 
	xØ"Ÿš wÑ/Ô/ˆIÝ˜i­Ñ.Ô.ð 0Ø�	Ø&/�
˜7Ñ#Ø,/ˆIÐ(Ñ)ØˆGÐ]˜Ð]Ð]¸sÐ]Ð]ÐW[Ð]Ð]Ñ^Ô^Ð^Ð^Ð^Øð 	xØˆGÐn˜ÐnÐn¸sÐnÐnÐhlÐnÐnÑoÔoÐoÐoÐoàˆGÐv˜ÐvÐv¸sÐvÐvÐptÐvÐvÑwÔwÐwÐwÐwrK   c                ó"  — ddl m}m}m}m}m} |                     ¦   «                              d¬¦  «        }t          |¦  «        dk     s0|d                              ¦   «          	                    ¦   «         dk    r\ |d|› d| j
        › |› �¦  «         | j
        d	k    rd
}n| j
        dk    rd}nd} |d|› d|› |› �¦  «          |d|› d|› �¦  «         dS |d                              ¦   «          	                    ¦   «         }	|	dvr& |d|› d|	› |› �¦  «          |d|› d|› �¦  «         dS |	| _
         |d|	¦  «        r<|	d	k    rd}
n|	dk    rd}
nd}
 |d|› d|	› d|› �¦  «          |d|› |
› |› �¦  «         dS  |d|› d|	› d|› �¦  «         dS )uÍ  Handle /busy â€” control what Enter does while Hermes is working.

        Usage:
            /busy               Show current busy input mode
            /busy status        Show current busy input mode
            /busy queue         Queue input for the next turn instead of interrupting
            /busy steer         Inject Enter mid-run via /steer (after next tool call)
            /busy interrupt     Redirect the current run on Enter (default)
        r   ©r<  r  r  rÔ   rê  r   r#  r    r¾   rW   zBusy input mode: Úqueuezqueues for next turnÚsteerz.steers into current run (after next tool call)z!redirects current run immediatelyzEnter while busy: z+Usage: /busy [queue|steer|interrupt|status]N>   rx  ry  Ú	interruptrh  zdisplay.busy_input_modez6Enter will queue follow-up input while Hermes is busy.zNEnter will steer your message into the current run (after the next tool call).zQEnter will redirect the current run while Hermes is busy; /stop still cancels it.u   âœ“ Busy input mode set to 'r"  r#  )rw   r<  r  r  rÔ   rê  r-  r5   r6   r8   Úbusy_input_mode)r@   rî   r<  r  r  rÔ   rê  rC   Ú	_behaviorrh   Úbehaviors              rI   Ú_handle_busy_commandz%CLICommandsMixin._handle_busy_commandî  sb  € ð 	HÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGØ—	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>˜U 1œXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5¸ÒAÐAØˆGÐO˜ÐOÐO°4Ô3GÐOÈÐOÐOÑPÔPÐPØÔ# wÒ.Ð.Ø2�	�	ØÔ%¨Ò0Ð0ØL�	�	à?�	ØˆGÐB˜ÐBÐB°ÐB¸DÐBÐBÑCÔCÐCØˆGÐP˜ÐPÐPÈ$ÐPÐPÑQÔQÐQØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆØÐ5Ð5Ð5ØˆGÐB˜ÐBÐB°sÐB¸DÐBÐBÑCÔCÐCØˆGÐP˜ÐPÐPÈ$ÐPÐPÑQÔQÐQØˆFà"ˆÔØÐÐ6¸Ñ<Ô<ð 
	[Ø�gŠ~ˆ~ØS��Ø˜’�Øk��àn�ØˆGÐ\˜Ð\Ð\¸cÐ\Ð\ÐVZÐ\Ð\Ñ]Ô]Ð]ØˆGÐ/˜Ð/˜xÐ/¨Ð/Ð/Ñ0Ô0Ð0Ð0Ð0àˆGÐY˜ÐYÐY¸cÐYÐYÐSWÐYÐYÑZÔZÐZÐZÐZrK   c                ó†  — ddl m}m}m}m}m} ddlm}m} |}	| j	         
                    d¦  «        pi  
                    d|¦  «        }
|                     ¦   «                              d¬¦  «        }t          |¦  «        dk     s0|d                              ¦   «                              ¦   «         d	k    r< |d
|› d|
› |› �¦  «          |d
|› dd                     |	¦  «        › d|› �¦  «         dS |d                              ¦   «                              ¦   «         }||	vr< |d
|› d|› |› �¦  «          |d
|› dd                     |	¦  «        › d|› �¦  «         dS || j	                             di ¦  «        d<    |d|¦  «        r' |d
|› d|› d|› �¦  «          |d
|› d|› �¦  «         dS  |d
|› d|› d|› �¦  «         dS )uj  Handle /indicator â€” pick the TUI busy-indicator style.

        Usage:
            /indicator              Show the current busy-indicator style
            /indicator status       Show the current busy-indicator style
            /indicator kaomoji      Animated kaomoji faces (default)
            /indicator emoji        Emoji spinner
            /indicator unicode      Braille spinner
            /indicator ascii        Plain ASCII spinner

        Persists to ``display.tui_status_indicator`` â€” the same config key the
        TUI reads â€” so the change is picked up the next time the TUI renders.
        r   rw  )ÚDEFAULT_INDICATOR_STYLEÚINDICATOR_STYLESrm  Útui_status_indicatorr   r#  r    r¾   rW   zBusy-indicator style: zUsage: /indicator [Ú|r©  Nz(._.) Unknown indicator style: zdisplay.tui_status_indicatoru!   âœ“ Busy-indicator style set to 'r"  z2The TUI picks up the new style on its next render.r#  )rw   r<  r  r  rÔ   rê  r•   r€  r�  r  r:   r-  r5   r6   r8   r<   Ú
setdefault)r@   rî   r<  r  r  rÔ   rê  r€  r�  ÚstylesrŸ  rC   rh   s                rI   Ú_handle_indicator_commandz*CLICommandsMixin._handle_indicator_command  sl  € ð 	HÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGØNÐNÐNÐNÐNÐNÐNÐNØ!ˆàŒ[�_Š_˜YÑ'Ô'Ð-¨2×2Ò2Ð3IÐKbÑcÔcð 	ð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>˜U 1œXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5¸ÒAÐAØˆGÐG˜ÐGÐG¸ÐGÀÐGÐGÑHÔHÐHØˆGÐK˜ÐKÐK°#·(²(¸6Ñ2BÔ2BÐKÐKÀTÐKÐKÑLÔLÐLØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆØ�fÐÐØˆGÐI˜ÐIÐI¸cÐIÀ4ÐIÐIÑJÔJÐJØˆGÐK˜ÐKÐK°#·(²(¸6Ñ2BÔ2BÐKÐKÀTÐKÐKÑLÔLÐLØˆFàHKˆŒ×Ò˜y¨"Ñ-Ô-Ð.DÑEØÐÐ;¸SÑAÔAð 	`ØˆGÐa˜ÐaÐaÀ3ÐaÐaÐ[_ÐaÐaÑbÔbÐbØˆGÐW˜ÐWÐWÐQUÐWÐWÑXÔXÐXÐXÐXàˆGÐ^˜Ð^Ð^À3Ð^Ð^ÐX\Ð^Ð^Ñ_Ô_Ð_Ð_Ð_rK   c           
     ón  — ddl m}m}m}m}m} |                      ¦   «         s |d¦  «         dS 	 ddlm} t          | dd¦  «        }t          |dd¦  «        pt          | dd¦  «        }	 ||	¦  «        rdnd	}
n# t          $ r d
}
Y nw xY w|                     ¦   «                              d¬¦  «        }t          |¦  «        dk     s0|d                              ¦   «                              ¦   «         dk    r7| j        dk    rdnd} |d|› |
› d|› |› �¦  «          |d|› d|› �¦  «         dS |d                              ¦   «                              ¦   «                              ¦   «         }d|v }d                     d„ |D ¦   «         ¦  «        }|dv rd| _        d}d}n6|dv rd| _        d}d}n& |d|› d|› |› �¦  «          |d|› d|› �¦  «         dS d| _        |r% |d|¦  «        r |d|› d|
› d|› d |› �¦  «         dS |r |d|› d|
› d|› d!|› �¦  «         dS  |d|› d|
› d|› d"|› �¦  «         dS )#uç   Handle /fast â€” toggle fast mode (OpenAI Priority Processing / Anthropic Fast Mode).

        Session-scoped by default; ``--global`` persists agent.service_tier
        to config.yaml (parity with /model and /reasoning).
        r   rw  zv  (._.) /fast is only available for models that support fast mode (OpenAI Priority Processing or Anthropic Fast Mode).N)Ú_is_anthropic_fast_modelr   rò  zAnthropic Fast ModezPriority Processingz	Fast moder   r#  r    r¾   ÚpriorityÚfastÚnormalrW   r*   z,Usage: /fast [normal|fast|status] [--global]r_  r‚   c              3  ó"   K  — | ]
}|d v¯|V — ŒdS rb  rE  rc  s     rI   rR  z8CLICommandsMixin._handle_fast_command.<locals>.<genexpr>^  s:   è è € ð 
ð 
ØØÐ5Ð5Ð5ð Ø5Ð5Ð5Ð5ð
ð 
rK   >   rM  rŠ  ÚFAST>   r?  r‹  ÚNORMALrh  zagent.service_tieru   âœ“ z set to z (saved to config)z# (session only; config save failed)u+    (this session â€” use --global to persist))rw   r<  r  r  rÔ   rê  Ú_fast_command_availableÚhermes_cli.modelsrˆ  rv   rx   r-  r5   r6   r8   r   r<   r   )r@   rî   r<  r  r  rÔ   rê  rˆ  r   rò  Úfeature_namerC   r¾   rq  rr  rh   Úsaved_valuerj   s                     rI   Ú_handle_fast_commandz%CLICommandsMixin._handle_fast_commandA  st  € ð 	HÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGØ×+Ò+Ñ-Ô-ð 	ØˆGð  Mñ  Nô  Nð  NØˆFð	'ØBÐBÐBÐBÐBÐBÝ˜D '¨4Ñ0Ô0ˆEÝ˜E 7¨DÑ1Ô1ÐQµW¸TÀ7ÈDÑ5QÔ5QˆEØ4LÐ4LÈUÑ4SÔ4SÐnÐ0Ð0ÐYnˆLˆLøÝð 	'ð 	'ð 	'Ø&ˆLˆLˆLð	'øøøð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>˜U 1œXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5¸ÒAÐAØ#Ô0°JÒ>Ð>�V�VÀHˆFØˆGÐ@˜Ð@ ,Ð@Ð@°&Ð@¸$Ð@Ð@ÑAÔAÐAØˆGÐQ˜ÐQÐQÈ4ÐQÐQÑRÔRÐRØˆFà˜1”X—^’^Ñ%Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ˆ
Ø$¨
Ð2ˆØ�hŠhð 
ð 
Ø)ð
ñ 
ô 
ñ 
ô 
ˆð
 �.Ð Ð Ø *ˆDÔØ ˆKØˆEˆEØÐ%Ð%Ð%Ø $ˆDÔØ"ˆKØˆEˆEàˆGÐB˜ÐBÐB°sÐB¸DÐBÐBÑCÔCÐCØˆGÐQ˜ÐQÐQÈ4ÐQÐQÑRÔRÐRØˆFàˆŒ
Øð 	vÐ0Ð0Ð1EÀ{ÑSÔSð 	vØˆGÐ[˜Ð[Ð[ lÐ[Ð[¸EÐ[Ð[ÐUYÐ[Ð[Ñ\Ô\Ð\Ð\Ð\Øð 	vØˆGÐl˜ÐlÐl lÐlÐl¸EÐlÐlÐfjÐlÐlÑmÔmÐmÐmÐmàˆGÐt˜ÐtÐt lÐtÐt¸EÐtÐtÐnrÐtÐtÑuÔuÐuÐuÐus   ±AA: Á:B	ÂB	c                ó¶   — ddl m} ddlm} d„ |                     ¦   «         dd…         D ¦   «         }d|v }d|v o| } |d	d
||d¬¦  «        } ||¦  «         dS )u÷  Handle /debug â€” upload debug report + logs and print share URLs.

        Accepts optional destination words after the command:

        - ``/debug``        â†’ upload to the public paste service (default)
        - ``/debug nous``   â†’ upload to Nous-internal storage (private, staff-only)
        - ``/debug local``  â†’ render the report to stdout, no upload

        ``nous`` and ``local`` are mutually exclusive; if both are given,
        ``local`` wins (it never touches the network).
        r   )Úrun_debug_share)ÚSimpleNamespacec                ó6   — h | ]}|                      ¦   «         ’ŒS rE  )r8   rP  s     rI   rw  z9CLICommandsMixin._handle_debug_command.<locals>.<setcomp>‡  s    € Ð=Ð=Ð=˜q�—’‘”Ð=Ð=Ð=rK   r   NÚlocalÚnouséÈ   é   T)r  Úexpirer˜  r™  Úyes)Úhermes_cli.debugr•  Útypesr–  r5   )r@   rú   r•  r–  Úwordsr˜  r™  rD   s           rI   Ú_handle_debug_commandz&CLICommandsMixin._handle_debug_commandx  s¥   € ð 	5Ð4Ð4Ð4Ð4Ð4Ø)Ð)Ð)Ð)Ð)Ð)à=Ð= L×$6Ò$6Ñ$8Ô$8¸¸¸Ô$<Ð=Ñ=Ô=ˆØ˜5Ð ˆØ˜ˆÐ, u 9ˆð ˆØ˜a u°4¸Tð
ñ 
ô 
ˆð 	ˆ˜ÑÔÐÐÐrK   c                ó‚  — ddl m}m}  |¦   «         rt          d |d¦  «        › �¦  «         dS ddg}|                      dd	|¬
¦  «        }|€t          d¦  «         dS |                      ||¦  «        }|dk    rt          d¦  «         dS t          ¦   «          t          d¦  «         t          ¦   «          dg| _        dS )uø  Handle /update â€” update Hermes Agent to the latest version.

        In the classic CLI this exits the session and relaunches as
        ``hermes update`` so the user sees update output directly and gets
        the new version on next launch.

        Returns ``True`` when the update was confirmed (caller should trigger
        app exit so the relaunch is deferred to the main thread after
        prompt_toolkit cleans up terminal modes).  Returns ``False`` / falsy
        when cancelled.
        r   )Ú
is_managedÚformat_managed_messageu     âœ— zupdate Hermes AgentF)Úoncez
Update Nowz0exit the current session and update Hermes Agent)ÚcancelÚCancelzkeep the current sessionu   âš•  Update Hermes Agentz;This will exit the current session and run `hermes update`.)rz  rV  ÚchoicesNu     ðŸŸ¡ /update cancelled.r¥  u     âš• Launching update...r�  T)r[  r£  r¤  r/   Ú_prompt_text_input_modalÚ_normalize_slash_confirm_choiceÚ_pending_relaunch)r@   r£  r¤  r¨  r  Úchoices         rI   Ú_handle_update_commandz'CLICommandsMixin._handle_update_command’  s
  € ð 	IÐHÐHÐHÐHÐHÐHÐHàˆ:‰<Œ<ð 	ÝÐJÐ1Ð1Ð2GÑHÔHÐJÐJÑKÔKÐKØ�5ð WØ<ð
ˆð ×+Ò+Ø,ØPØð ,ñ 
ô 
ˆð
 ˆ;ÝÐ-Ñ.Ô.Ð.Ø�5Ø×5Ò5°c¸7ÑCÔCˆØ�VÒÐÝÐ-Ñ.Ô.Ð.Ø�5å‰ŒˆÝÐ)Ñ*Ô*Ð*Ý‰Œˆð #+ ˆÔØˆtrK   c                óh  — ddl m} |                     ¦   «                              d¬¦  «        }t	          |¦  «        dk    r,|d                              ¦   «                              ¦   «         nd}|dk    r|                      ¦   «          dS |dk    r|                      ¦   «          dS |dk    r|                      ¦   «          dS |d	k    r|  	                    ¦   «          dS |dk    r3| j
        r|                      ¦   «          dS |                      ¦   «          dS  |d
|› �¦  «          |d¦  «         dS )z*Handle /voice [on|off|tts|status] command.r   rÓ   r   r#  r#   rM  r?  Úttsr¾   zUnknown voice subcommand: z!Usage: /voice [on|off|tts|status]N)rw   rÔ   r-  r5   r6   r8   Ú_enable_voice_modeÚ_disable_voice_modeÚ_toggle_voice_ttsÚ_show_voice_statusÚ_voice_mode©r@   r   rÔ   rC   r^  s        rI   Ú_handle_voice_commandz&CLICommandsMixin._handle_voice_commandÆ  sf  € àÐÐÐÐÐØ—’‘”×%Ò%¨qÐ%Ñ1Ô1ˆÝ14°U±´¸a²°�U˜1”X—^’^Ñ%Ô%×+Ò+Ñ-Ô-Ð-ÀRˆ
à˜ÒÐØ×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø˜5Ò Ð Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ø˜5Ò Ð Ø×"Ò"Ñ$Ô$Ð$Ð$Ð$Ø˜8Ò#Ð#Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø˜2ÒÐàÔð *Ø×(Ò(Ñ*Ô*Ð*Ð*Ð*à×'Ò'Ñ)Ô)Ð)Ð)Ð)àˆGÐ=°Ð=Ð=Ñ>Ô>Ð>ØˆGÐ7Ñ8Ô8Ð8Ð8Ð8rK   c                ó   — ddl m} |                     ¦   «                              d¬¦  «        }t	          |¦  «        dk    r,|d                              ¦   «                              ¦   «         nd}|dk    r/|                      d¬¦  «        r|                      d¦  «         dS dS |d	k    r-|                      d¬¦  «         |                      d
¦  «         dS |dv r‰|dk    rmt          | dd
¦  «        r-|                      d¬¦  «         |                      d
¦  «         dS |                      d¬¦  «        r|                      d¦  «         dS dS |  
                    ¦   «          dS  |d|› �¦  «          |d¦  «         dS )u2  Handle /wake [on|off|status] â€” the 'Hey Hermes' hotword listener.

        The toggle IS the config: an explicit on/off (or bare toggle) also
        writes ``wake_word.enabled`` to config.yaml so the choice persists
        across sessions. Startup auto-arm (_maybe_start_wake_word) only reads.
        r   rÓ   r   r#  r#   rM  T)Úannouncer?  F)r#   r¾   Ú_wake_word_activezUnknown wake subcommand: zUsage: /wake [on|off|status]N)rw   rÔ   r-  r5   r6   r8   Ú_start_wake_word_listenerÚ_persist_wake_word_enabledÚ_stop_wake_word_listenerrv   Ú_show_wake_word_statusrµ  s        rI   Ú_handle_wake_commandz%CLICommandsMixin._handle_wake_commandÞ  sÍ  € ð 	 ÐÐÐÐÐØ—’‘”×%Ò%¨qÐ%Ñ1Ô1ˆÝ14°U±´¸a²°�U˜1”X—^’^Ñ%Ô%×+Ò+Ñ-Ô-Ð-ÀRˆ
à˜ÒÐØ×-Ò-°tÐ-Ñ<Ô<ð 6Ø×/Ò/°Ñ5Ô5Ð5Ð5Ð5ð6ð 6à˜5Ò Ð Ø×)Ò)°4Ð)Ñ8Ô8Ð8Ø×+Ò+¨EÑ2Ô2Ð2Ð2Ð2Ø˜>Ð)Ð)Ø˜RÒÐå˜4Ð!4°eÑ<Ô<ð :Ø×1Ò1¸4Ð1Ñ@Ô@Ð@Ø×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ø×3Ò3¸TÐ3ÑBÔBð :Ø×3Ò3°DÑ9Ô9Ð9Ð9Ð9ð:ð :ð ×+Ò+Ñ-Ô-Ð-Ð-Ð-àˆGÐ<°
Ð<Ð<Ñ=Ô=Ð=ØˆGÐ2Ñ3Ô3Ð3Ð3Ð3rK   c           	     ó<  — ddl m}m}m}m} 	 ddlm} t           |¦   «                              d¦  «        ¦  «        |k    rdS n# t          $ r Y nw xY w |d|¦  «        r; ||› d|rdnd› d	t          |¦  «                             ¦   «         › d
|› �¦  «         dS dS )zJSave ``wake_word.enabled`` so the /wake toggle sticks for future sessions.r   )rÔ   r  r  rê  )Úload_wake_word_configr1   Nzwake_word.enabledz
Wake word r$  z in config (wake_word.enabled: r“   )rw   rÔ   r  r  rê  Útools.wake_wordrÀ  rm   r:   rx   r   r8   )r@   r1   rÔ   r  r  rê  rÀ  s          rI   r»  z+CLICommandsMixin._persist_wake_word_enabledý  s.  € à>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð	Ø=Ð=Ð=Ð=Ð=Ð=åÐ)Ð)Ñ+Ô+×/Ò/°	Ñ:Ô:Ñ;Ô;¸wÒFÐFØ�ð Gøåð 	ð 	ð 	ØˆDð	øøøàÐÐ0°'Ñ:Ô:ð 	KØˆG�tð Jð J°GÐ'K y yÀð Jð JÝ+.¨w©<¬<×+=Ò+=Ñ+?Ô+?ðJð JØCGðJð Jñ Kô Kð Kð Kð Kð	Kð 	Ks   Ž4A Á
AÁAN)r   r   )rB   r   rg   rm   r"  )rú   r   rq   rr   )rú   r   )rî   r   )rú   r   rq   rm   )rè  r   r1   rm   )rî   r   rq   rr   )rÏ  r   rq   rr   )r#   )rõ  r   rq   r   )rU   r   rq   rr   )r7  r   rq   rr   )rq   rr   rG  )r1   rm   )?rH  rI  rJ  Ú__doc__rJ   rl   rd   rf   r¡   r­   r¹   rÑ   rù   r  r   r/  r:  r`  rn  r¡  rä  rè  r  r0  rI  rh  rž  r£  r­  r±  r¸  rÒ  rÙ  rÞ  rç  rÇ  rQ  r[  r”  r£  r®  rÛ  rÀ  rè  rô  r  r  r5  r,  r<  r@  rE  rT  rW  ru  r~  r†  r“  r¡  r­  r¶  r¾  r»  rE  rK   rI   r   r   +   sj  € € € € € ðð ð\.ð \.ð \.ð \.ð|L(ð L(ð L(ð L(ð\&(ð &(ð &(ð &(ðPð ð ð ð UUð UUð UUð UUðn#ð #ð #ð #ð>)1ð )1ð )1ð )1ðVLð Lð LðB@Fð @Fð @FðD#1ð #1ð #1ð #1ðJHð Hð Hð4;5ð ;5ð ;5ð ;5ðzdð dð dð dð2NQð NQð NQð NQð`ð ð ðgð gð gð gðR~1ð ~1ð ~1ð ~1ð@6ð 6ð 6ð 6ðB_9ð _9ð _9ð _9ðBKð Kð Kð KðZ8Mð 8Mð 8Mð 8MðtB]ð B]ð B]ð B]ðHtJð tJð tJð tJðl$ð $ð $ð $ð*,ð ,ð ,ð ,ð<+ð +ð +ð +ð,ð ð ð ð*0ð 0ð 0ð 0ð*Cð Cð Cð Cð4Bð Bð Bð Bð4ð ð ð ð8Hð Hð Hð Hð
Yð Yð Yð Yðv&
ð &
ð &
ð &
ðPcð cð cð cðJS
ð S
ð S
ð S
ðj'
ð '
ð '
ð '
ðRkð kð kð kðZ,ð ,ð ,ð ,ð\J6ð J6ð J6ð J6ðX)4ð )4ð )4ð )4ðV*(ð *(ð *(ð *(ð *(ðX,ð ,ð ,ð ,ð:_ ð _ ð _ ð _ ðBð ð ð ð$Tð Tð Tð Tð$ð ð ð ð&'ð 'ð 'ð 'ð3Nð 3Nð 3Nð 3Nðj0Jð 0Jð 0Jð 0Jðdaxð axð axð axðF)[ð )[ð )[ð )[ðV&`ð &`ð &`ð &`ðP5vð 5vð 5vð 5vðnð ð ð ð ð42ð 2ð 2ð 2ðh9ð 9ð 9ð 9ð04ð 4ð 4ð 4ð>Kð Kð Kð Kð Kð KrK   r   )#rÂ  Ú
__future__r   rm  r2   r9  rM  rŒ  r  r   Úurllib.parser   Úrichr   r5  Úrich.markupr   rW  Ú
rich.panelr   r•   r	   r
   r  Úagent.turn_contextr   Úhermes_cli.browser_connectr   r   r   r   r   r   r   r   rE  rK   rI   ú<module>rÊ     s€  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !à  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð à UÐ UÐ UÐ UÐ UÐ UÐ UÐ UØ :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð_7Kð _7Kð _7Kð _7Kð _7Kñ _7Kô _7Kð _7Kð _7Kð _7KrK   