
    @=jH                        d Z ddlmZ ddlZddlZd1d2d	Zd2d
Zd3dZd3dZd3dZ	d3dZ
d3dZd3dZd3dZd3dZd4dZd5dZd6dZd7dZd8dZd9d"Zd:d$Zd%d&d;d(Zd<d)Zd=d,Zd>d-Zd?d0ZdS )@u}  CLI subcommand: ``hermes pets <subcommand>``.

Thin shell around :mod:`agent.pet`.  Browses the public petdex gallery,
installs pets into the profile's ``pets/`` directory, selects the active
mascot (writes ``display.pet.*`` to config.yaml), and runs a doctor check.

No side effects at import time — ``main.py`` wires the argparse subparsers on
demand via :func:`register_cli`.
    )annotationsN msgstrreturnNonec                $    t          |            d S N)printr   s    5/home/rurouni/.hermes/hermes-agent/hermes_cli/pets.py_printr      s    	#JJJJJ    c                <    t          | t          j                   d S )N)file)r   sysstderrr   s    r   _errr      s    	#CJr   intc                   ddl m} t          | dd          rn|                                }|st	          d           dS t	          dt          |           d           |D ]"}t	          d|j        d	d
|j                    #dS ddlm	}m
} 	  |            }n%# |$ r}t          d|            Y d}~dS d}~ww xY wt          | dd          pd                                                                rfd|D             }t          | dd          pd}|dk    r
|d|         n|}	d |                                D             }
t	          dt          |           drdt                    z   nd d           |	D ];}|j        |
v rdnd
}t	          d| d
|j        dd
|j         d|j         d	           <|r6t          |          |k    r#t	          dt          |          |z
   d           t	          d           dS )z@List gallery pets (or only installed ones with ``--installed``).r   store	installedFz0No pets installed. Try: hermes pets install bobazInstalled pets (z):  <24 ManifestErrorfetch_manifest   ✗ N   queryr   c                    g | ]:}|j                                         v s|j                                        v 8|;S  )sluglowerdisplay_name).0er"   s     r   
<listcomp>z_cmd_list.<locals>.<listcomp>1   sP     
 
 
&&%1>3G3G3I3I*I*I *I*I*Ir   limitc                    h | ]	}|j         
S r$   r%   r(   ps     r   	<setcomp>z_cmd_list.<locals>.<setcomp>9       888A888r   u   petdex gallery — z pet(s)z
 matching :u   ✓z<28z  ()u     … z* more (use --limit 0 or --query to filter)z-
Install one with: hermes pets install <slug>)	agent.petr   getattrinstalled_petsr   lenr%   r'   agent.pet.manifestr   r   r   stripr&   reprkind)argsr   petspetr   r   entriesexcr+   shownr   entrymarkr"   s                @r   	_cmd_listrD      s   t[%(( ##%% 	EFFF1/#d))///000 	; 	;C9999s'799::::q@@@@@@@@ .""   \C\\qqqqq T7B''-24466<<>>E 

 
 
 

 
 
 D'1%%*E$qyyGFUFOOgE88!5!5!7!7888I
dWddTY6alT%[[6P6P_adddeee R R
i//uuSPDPP5:PPPE,>PP5:PPPQQQQ ZW%%XGu,XXXYYY
;<<<1s   
B B= B88B=c                   ddl m} ddlm} | j                                        }	 |                    |t          | dd                    }n,# |j        |f$ r}t          d|            Y d }~dS d }~ww xY wt          d	|j         d
|j                    t          | dd          st                      s+t          |           t          d|j         d| d           nt          d|            dS )Nr   r   )r   forceF)rF   u   ✗ install failed: r!   u   ✓ installed u    → selectu   ✓ z) is now the active pet (display.pet.slug=
, enabled)z*  Make it active with: hermes pets select )r4   r   r8   r   r%   r9   install_petr5   PetStoreErrorr   r   r'   	directory_has_active_pet_set_active)r<   r   r   r%   r>   r@   s         r   _cmd_installrN   E   sI   0000009??DGD'5,I,IJJ/   )C))***qqqqq BC,BB3=BBCCCtXu%% D_->-> DDac&aaQUaaabbbbBDBBCCC1s   &A A7A22A7c                    ddl m} | j                                        }|                    |          rt          d|            dS t          d| d           dS )Nr   r   u   ✓ removed    ✗ 'z' is not installedr!   )r4   r   r%   r9   
remove_petr   r   )r<   r   r%   s      r   _cmd_removerR   Z   sv    9??D $d$$%%%q	)	)	)	)***1r   c                   ddl m} t          | dd          pd                                }|s:|                                }|st          d           dS t          |          }|sdS |                    |          }||j        st          d| d|            dS t          |           t          d	|j         d
| d           dS )Nr   r   r%   r   u7   ✗ no pets installed — run: hermes pets install bobar!   rP   u0   ' is not installed — run: hermes pets install u   ✓ active pet set to z (display.pet.slug=rH   )r4   r   r5   r9   r6   r   _interactive_pickload_petexistsrM   r   r'   )r<   r   r%   r=   r>   s        r   _cmd_selectrW   e   s    D&"%%+2244D ##%% 	JKKK1 && 	1
..

C
{#*{QTQQ4QQRRRq
YC$4YYYYYZZZ1r   c                B    t          d           t          d           dS )NFu,   ✓ pet disabled (display.pet.enabled=false)r   )_set_enabledr   )r<   s    r   _cmd_offrZ   |   s$    
9:::1r   c                    t          | j                  \  }}|rt          d|            dS t          d|dd           dS )uA   Persist ``display.pet.scale`` — one knob resizes every surface.r    r!   u   ✓ pet scale set to gz (display.pet.scale)r   )set_pet_scalefactorr   r   )r<   scaleerrs      r   
_cmd_scalera      sX    t{++JE3
 \C\\q
@5@@@@AAA1r   c                d
   ddl }ddlm} ddlm}m}m}mm} ddl	m
} t                      }t          | dd          pd                                p$t          |                    dd          pd          }	|                    |	          }
|
t#          d           d	S t          | d
d          p$t          |                    dd          pd          }t%          t          | dd          p|                    d|          p|          } |||                    dd                    } ||
j        |||          }|j        st#          d|j         d           d	S t          | dd          pd                                                                }|r|g}n-t          | dd          rfd|D             }nj        j        g}|j        dk    }t3          d|dz  t3          d	|                    |d                   pd	          z            }ddl}|                    d          j        }dd}|rdt3          d||z
  d	z
            z  nFt3          d	t=          |j        |j         z            dz            }dt3          d||z
  d	z
            z  }tB          j"        }|#                    d           |$                                 d}	 tK          |
j&         d|j         d           d}	 |D ]y}|                    |          pd	}tO          |          D ]N}|(                    ||          }|rr4d )                    fd!|*                    d           D                       }|r|#                    d"| d#           |#                    |           |#                    d$           |+                    d           d	z   }nv|#                    d%           |#                    |
j&         d&| d'           |r|#                    |           |#                    |           |#                    d            |$                                 |,                    |           P{|d	z  }t          | d(d          r|t[          |          k    rnn# t\          $ r Y nw xY w|#                    d)           |#                    d$           |$                                 nC# |#                    d)           |#                    d$           |$                                 w xY wdS )*u	  Animate the active (or named) pet in the terminal.

    Uses the shared :class:`~agent.pet.render.PetRenderer` — full graphics
    protocol (kitty/iTerm2/sixel) when the terminal supports it, else a
    truecolor Unicode half-block fallback.  Ctrl+C to stop.
    r   Nr   )DEFAULT_SCALELOOP_MS
STATE_ROWSPetStateresolve_cols)build_rendererr%   r   u4   ✗ no pet to show — run: hermes pets install bobar!   moderender_modeautor_   unicode_cols)configured_moder_   rl   uE   ✗ cannot render here (no TTY / graphics disabled). Effective mode: .statecycleFc                0    g | ]}|d  D             v |S )c                    h | ]	}|j         
S r$   )value)r(   r)   s     r   r0   z'_cmd_show.<locals>.<listcomp>.<setcomp>   s    0K0K0KQ0K0K0Kr   r$   )r(   srf   s     r   r*   z_cmd_show.<locals>.<listcomp>   s2    LLL10K0K(0K0K0K+K+K!+K+K+Kr   unicodeg?g     @@)P      r      z[?25lu
    — mode=z  (Ctrl+C to stop)T
c              3  "   K   | ]	}|z   V  
d S r
   r$   )r(   lnindents     r   	<genexpr>z_cmd_show.<locals>.<genexpr>   s'      /Z/Z/Z/Z/Z/Z/Z/Zr   z[Fz[0m
z[2J[3J[Hz [z]
oncez[?25h)/timer4   r   agent.pet.constantsrc   rd   re   rf   rg   agent.pet.renderrh   _pet_configr5   r9   r   getresolve_active_petr   floatspritesheet	availableri   r&   IDLErs   maxframe_countshutilget_terminal_sizecolumnsr   frame_wr_   r   stdoutwriteflushr   r'   rangeframejoinsplitcountsleepr7   KeyboardInterrupt) r<   r   r   rc   rd   re   rg   rh   cfgr%   r>   mode_cfgr_   colsrenderer	requestedstates
is_unicodeframe_delayr   	term_colsg_indent	cell_colsout
prev_linesloopsro   r   iencodedrf   r|   s                                  @@r   	_cmd_showr      s    KKK^^^^^^^^^^^^^^//////
--CD&"%%+2244VCGGFB<O<O<USU8V8VD

"
"4
(
(C
{CDDDqtVT**[c#''-2P2P2ZTZ.[.[H'$++_swww/N/N_R_``E<sww~q99::D~ 	  H  0'}0 0 0	
 	
 	
 q w++1r88::@@BBI '	w	&	& 'LLLLZLLL-%&)+JdWv-Q8L8LVTUY8W8W8\[\1]1]]^^K
 MMM((22:IFH ;s1i$.23333x/(.@AAQFGG	Q	I 5 9:::
*CIIkIIKKKJ##"OOhmOOOPPP	 , , ,,U338qu , ,A&nnUA66G! (! [&*ii/Z/Z/Z/ZgmmTXFYFY/Z/Z/Z&Z&ZG% =II&;j&;&;&;<<<		'***		+... &-]]4%8%81%<

		"8999		S%5"C"C"C"C"CDDD# 0IIh///		'***		$IIKKKJJ{++++),* QJEtVU++ V0D0D5	4     			+		+		 			+		+		1s,   GR S- 
R+(S- *R++S- -A T-c           	     `   ddl m} ddlm}m} t                      }t          |                    d                    }t          |                    dd          pd          }t          |                    dd          pd          }|	                                }|
                    |          }	t          d	           t          d
|                                            t          dt          |           dd                    d |D                       pd d           t          d|            t          d|pd            t          d|	r|	j        nd            t          d|            t          d |                        t          d ||                      d}
|st          d           d}
n-|	t          d           d}
n|st          d|	j        z              	 ddl}n!# t"          $ r t          d           d}
Y nw xY wt          |
r|rd nd!           dS )"zBReport install state, active pet, config, and terminal capability.r   r   )detect_terminal_graphicsresolve_modeenabledr%   r   rj   rk   zpetdex doctorz  pets dir:        z  installed:       z (z, c              3  $   K   | ]}|j         V  d S r
   r-   r.   s     r   r}   z_cmd_doctor.<locals>.<genexpr>  s$      7M7M17M7M7M7M7M7Mr   noner3   z  display.pet.enabled:     z  display.pet.slug:        z(unset)z  active (resolved):       z(none)z  display.pet.render_mode: z  detected graphics:       z  effective mode (TTY):    Tu6     → no pets installed. Run: hermes pets install bobaFNu;     → active pet unresolved. Run: hermes pets select <slug>u7     → pet display is disabled. Run: hermes pets select uC     ✗ Pillow not importable — sprite decoding will be unavailableu     ✓ readyz-  (run the suggestions above to finish setup))r4   r   r   r   r   r   boolr   r   r6   r   r   pets_dirr7   r   r%   PILImportError)r<   r   r   r   r   r   configured_slugr   r=   activeokr   s               r   _cmd_doctorr      s   GGGGGGGG
--C3779%%&&G#''&"--344O377=&11;V<<H!!D%%o66F
?
3!1!133444
ZTZZdii7M7M7M7M7M.M.M.WQWZZZ[[[
222333
G)EIGGHHH
N)LHNNOOO
333444
E)A)A)C)CEEFFF
Ah)?)?AABBB	B XGHHH	LMMM XH6;VWWW



   TUUU B_7_==0_```1s   3G8 8HHdictc                     ddl m}   |             }t          |                    d          t                    r|                    di           ni }|                    di           }t          |t                    r|ni S )Nr   )load_configdisplayr>   )hermes_cli.configr   
isinstancer   r   )r   r   r   r>   s       r   r   r   %  s    ------
+--C(237793E3Et(L(LTcggi$$$RTG
++eR
 
 CS$''/33R/r   r   c                     t          t                                          d                    o-t          t                                          d                    S )Nr   r%   )r   r   r   r$   r   r   rL   rL   .  sA    !!),,--Q${}}7H7H7P7P2Q2QQr   r%   c                    ddl m}m}  |            }|                    di           }|                    di           }| |d<   d|d<    ||           d S )Nr   r   save_configr   r>   r%   Tr   r   r   r   
setdefault)r%   r   r   r   r   r>   s         r   rM   rM   2  su    ::::::::
+--CnnY++G


UB
'
'CCKC	NKr   r   c                    ddl m}m}  |            }|                    di           }|                    di           }| |d<    ||           d S )Nr   r   r   r>   r   r   )r   r   r   r   r   r>   s         r   rY   rY   =  sl    ::::::::
+--CnnY++G


UB
'
'CC	NKr   r_   r   c                    ddl m}m}  |            }|                    di           }|                    di           }| |d<    ||           d S )Nr   r   r   r>   r_   r   )r_   r   r   r   r   r>   s         r   
_set_scaler   G  sl    ::::::::
+--CnnY++G


UB
'
'CCLKr   rs   float | strtuple[float, str | None]c                    ddl m} 	  |t          |                     }n# t          t          f$ r dd| dfcY S w xY wt          |           |dfS )a3  Set ``display.pet.scale`` (clamped to bounds). Returns ``(applied, error)``.

    The single write path behind ``/pet scale`` and the desktop slider, so every
    surface that resolves scale from config picks it up identically. *error* is
    set (and nothing written) only when *value* isn't a number.
    r   )clamp_scaleg        znot a number: u    — try a value like 0.5N)r   r   r   	TypeError
ValueErrorr   )rs   r   r_   s      r   r]   r]   Q  s     0/////HE%LL))z" H H HGUGGGGGGGH u$;s   ! ==#tuple[bool, str | None, str | None]c                    ddl m}  t                      }t          |                    dd          pd          }|                     |          }t          |                    d                    rt          d           d|r|j        nddfS |5| 	                                }|sdS |d         }t          |j                   nt          d	           d	|j        dfS )
zToggle ``display.pet.enabled``.

    Returns ``(enabled, display_name, error_message)``. *error_message* is set
    when turning on but nothing is installed to show.
    r   r   r%   r   r   FN)FNuB   no pets installed — /pet list to browse, or /pet <slug> to adoptT)r4   r   r   r   r   r   r   rY   r'   r6   rM   r%   )r   r   r%   r>   r   s        r   toggle_pet_displayr   c  s      
--Cswwvr""(b))D

"
"4
(
(CCGGI >U#7c&&4==
{((**	 	eddlCHT!4''r      )r+   r+   c           	        ddl m} ddlm}m} 	  |            }n%# |$ r}t          d|            Y d}~dS d}~ww xY wd |                                D             }| dk    r
|d|          n|}t          dt          |           dt          |           d	           |D ]2}|j        |v rd
nd}	t          d|	 d|j        dd|j	                    3t          d           dS )zCPrint a slice of the public petdex gallery (CLI/TUI text fallback).r   r   r   z)(._.) Couldn't reach the petdex gallery: Nc                    h | ]	}|j         
S r$   r-   r.   s     r   r0   z$print_pet_gallery.<locals>.<setcomp>  r1   r   u    (^o^)/ petdex gallery — first z of r2   u   ●u   ○r   r   r   u(     /pet <slug> to adopt · /pet to toggle)
r4   r   r8   r   r   r   r6   r7   r%   r'   )
r+   r   r   r   r?   r@   r   rA   rB   rC   s
             r   print_pet_galleryr   ~  sX   @@@@@@@@ .""   ?#??@@@ 98!5!5!7!7888I$qyyGFUFOOgE	
LSZZ
L
LS\\
L
L
LMMM A A
i//uuU?4??%*???5+=??@@@@	
455555s   
 =8=c                (   ddl m}m}  |            }|                    di                               di           }t	          |t
                    r)t          |                    dd          pd          | k    rdS d|d<   d|d<    ||           d	S )
zDisable + unset the active pet iff it's ``slug`` (e.g. after removal).

    Returns whether anything changed, so callers don't write config needlessly.
    r   r   r   r>   r%   r   Fr   Tr   r   r   r   r   r   r   r   )r%   r   r   r   r>   s        r   _clear_active_ifr     s    
 ;:::::::
+--C
..B
'
'
2
25"
=
=Cc4   C(;(;(Ar$B$Bd$J$JuCKC	NK4r   old_slugnew_slugc                2   |r| |k    rdS ddl m}m}  |            }|                    di                               di           }t	          |t
                    r)t          |                    dd          pd          | k    rdS ||d<    ||           dS )	a1  Repoint the active pet from ``old_slug`` to ``new_slug`` iff it's active.

    Used when a rename realigns a pet's slug/dir: if the renamed pet was the
    active one, the config must follow or surfaces point at a now-missing dir.
    Preserves the ``enabled`` flag. Returns whether anything changed.
    Fr   r   r   r>   r%   r   Tr   )r   r   r   r   r   r>   s         r   _rename_active_ifr     s      x8++u::::::::
+--C
..B
'
'
2
25"
=
=Cc4   C(;(;(Ar$B$Bh$N$NuCKK4r   c           	        t          d           t          | d          D ](\  }}t          d| d|j        dd|j                    )	 t	          d                                          pd}t          |          dz
  }n-# t          t          t          f$ r t          d	           Y d
S w xY wd|cxk    rt          |           k     rn n| |         j        S t          d           d
S )z<Minimal numbered picker (avoids curses dep for a tiny list).zInstalled pets:r!   r   z. r   r   zSelect a pet [1]: 1u   ✗ cancelledr   r   u   ✗ invalid selection)r   	enumerater%   r'   inputr9   r   EOFErrorr   r   r   r7   )r=   r   r>   choiceidxs        r   rT   rT     s   
D!$$ < <3:A:::::(8::;;;;+,,2244;&kkAo'4   _rr 	C#d))Cy~	 !!!2s   
5B   &B*)B*parentargparse.ArgumentParserc                f                           fd                                d          }|                    dd          }|                    dd	d
d           |                    ddd           |                    dt          dd           |                     t
                     |                    dd          }|                    dd           |                    ddd           |                    ddd           |                     t                     |                    dd          }|                    dd	d
d           |                     t                     |                    d d!          }|                    dd	d
d"           |                    d#d
d$%           |                    d&dd'           |                    d(dd)           |                    d*d+d,%           |                    d-t          d.d/           |                     t                     |                    d0d1                               t                     |                    d2d3          }|                    d4d5           |                     t                     |                    d6d7          }|                    dd8           |                     t                     |                    d9d:                               t                     d+S );z<Attach ``pets`` subcommands to *parent* (called by main.py).c                <                                     dfd         S )Nr   r!   )
print_help)ar   s    r   <lambda>zregister_cli.<locals>.<lambda>  s    (9(9(;(;Q'?'B r   )funcpets_command)destlistzBrowse the petdex gallery)helpr"   ?r   zFilter by slug/name substring)nargsdefaultr   z--installed
store_truezOnly show installed pets)actionr   z--limit(   zMax rows (0 = all))typer   r   installzInstall a pet from the galleryr%   zPet slug (e.g. boba)z--forcezRe-download even if presentz--selectzMake it the active petrG   z)Set the active pet (writes display.pet.*)zPet slug (omit for picker)showz&Animate the active pet in the terminalzPet slug (default: active)z--statez.Single state: idle/run/review/failed/wave/jump)r   r   z--cyclezCycle through all statesz--oncezPlay once instead of loopingz--modeNz5Override render mode (kitty/iterm/sixel/unicode/auto)z--scaler   zOverride scale (0 = config)offzDisable the pet displayr_   z-Resize the pet everywhere (display.pet.scale)r^   u*   Scale factor, e.g. 0.5 (clamped 0.1–3.0)removezDelete an installed petzPet slugdoctorz+Check pet setup + terminal graphics support)set_defaultsadd_subparsers
add_parseradd_argumentr   rD   rN   rW   r   r   rZ   ra   rR   r   )r   subsp_list	p_installp_selectp_showp_scalep_removes   `       r   register_clir    sS   
BBBBCCC  n 55D__V*E_FFF
sB=\]]]
lA[\\\
	R>RSSS
Y'''	0PQQI6(>???9\@]^^^:lAYZZZ---x.YZZH&R>Z[[[{+++__V*R_SSF
c2<XYYY
	24deee
	,=WXXX
<Z[[[
$5lmmm
	q?\]]]
Y'''OOE 9O::GGXGVVVoog,[o\\G(TUUUj)))x.GHHH&z222{+++OOH#POQQ^^ _     r   )r   )r   r   r   r   )r   r   )r   r   )r   r   )r%   r   r   r   )r   r   r   r   )r_   r   r   r   )rs   r   r   r   )r   r   )r+   r   r   r   )r%   r   r   r   )r   r   r   r   r   r   )r   r   )r   r   r   r   )__doc__
__future__r   argparser   r   r   rD   rN   rR   rW   rZ   ra   r   r   r   rL   rM   rY   r   r]   r   r   r   r   rT   r  r$   r   r   <module>r
     s    # " " " " "  



           ) ) ) )X   *      .      g g g gT( ( ( (^0 0 0 0R R R R            $( ( ( (6 ') 6 6 6 6 6 6(   "   (   ** * * * * *r   