+
    lHàjë;  ã                  óÔ  € R t ^ RIHt ^ RIHt ^RIHtHtHt ^RI	H
t
HtHtHt ^RIHt  ! R R]4      t ! R R	]4      t ! R
 R]4      t ! R R]4      t ! R R]4      t ! R R]4      t]! R]]RR7       ]! R]]RR7        ! R R]4      t]! R]]RR7        ! R R]4      t]! R]]RR7        ! R R ]4      t]! R!]]R"R7        ! R# R$]4      t]! R%]]R&R7       ]! R']]R(R7        ! R) R*]4      t]! R+]]R,R7       ]! R-]]R.R7        ! R/ R0]4      t ! R1 R2]4      t]! R3]]R4R7        ! R5 R6]4      t ! R7 R8]4      t]! R9]]R:R7        ! R; R<]4      t ! R= R>]4      t  ! R? R@]4      t! ! RA RB]4      t" ! RC RD]4      t#]! RE]"]#RFR7        ! RG RH]4      t$ ! RI RJ]4      t% ! RK RL]#4      t&]! RM]%]&RNR7        ! RO RP]4      t' ! RQ RR]4      t( ! RS RT]4      t) ! RU RV]4      t* ! RW RX]4      t+ ! RY RZ]4      t,]! R[]+],R\R7        ! R] R^]4      t- ! R_ R`]4      t.]! Ra]-].RbR7        ! Rc Rd]4      t/ ! Re Rf]4      t0]! Rg]/]0RhR7        ! Ri Rj]4      t1]! Rk]]1RlR7        ! Rm Rn]4      t2 ! Ro Rp]4      t3]! Rq]2]3RrR7        ! Rs Rt]4      t4 ! Ru Rv]4      t5 ! Rw Rx]4      t6]! Ry]4]6RzR7        ! R{ R|]4      t7 ! R} R~]4      t8]! R]7]8R€R7       ]! R�]7]8R‚R7        ! Rƒ R„]74      t9]! R…]9]8R†R7        ! R‡ Rˆ]4      t:]! R‰]7]:RŠR7        ! R‹ RŒ]74      t; ! R� RŽ]4      t<]! R�];]<R�R7       ]! R‘]]
R’R7        ! R“ R”]4      t= ! R• R–]4      t>]! R—]=]>R˜R7       R™# )šu  Projects (``projects.*`` â€” per-profile multi-folder workspaces, repo discovery, sidebar tree)
and the pet mascot surface (``pet.*`` â€” gallery, sprite payloads, adopt/remove/rename).

Every method here is profile-scoped: the desktop's ``projectParams`` / ``petRpc`` wrappers add
``profile`` so app-global remote mode reads the focused profile's ``projects.db`` / ``config.yaml``.
The pet wire predates the snake_case rule and travels camelCase (``displayName``,
``spritesheetBase64``); the field names below are those wire keys verbatim.
)Úannotations)ÚField)Ú	JsonValueÚParamsÚResult)ÚOkResultÚ	OpenModelÚProfileParamsÚStoredSessionRow)Úmethodc                  óP   € ] tR t^t$ RtR]R&   RtR]R&   RtR]R	&   RtR
]R&   Rt	R# )ÚProjectFolderz5``hermes_cli/projects_db.py::ProjectFolder.to_dict``.ÚstrÚpathNú
str | NoneÚlabelFÚboolÚ
is_primaryú
int | NoneÚadded_at© )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   r   Ú__static_attributes__r   ó    ÚH/home/ubuntu/.hermes/hermes-agent/tui_gateway/contracts/projects_pets.pyr   r      s(   ‡ Ù?à
ƒIØ€Eˆ:ÓØ€J�ÓØ€Hˆj×r   r   c                  ó´   € ] tR t^t$ RtR]R&   R]R&   R]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R]R&   RtR]R&   R]R&   ]! ]R7      tR]R&   RtR# )ÚProjectInfouW   ``hermes_cli/projects_db.py::Project.to_dict`` â€” one stored project with its folders.r   ÚidÚslugÚnameNr   ÚdescriptionÚiconÚcolorÚ
board_slugÚprimary_pathFr   ÚarchivedÚintÚ
created_at©Údefault_factoryzlist[ProjectFolder]Úfoldersr   )r   r   r   r   r   r   r%   r&   r'   r(   r)   r*   r   Úlistr/   r   r   r   r   r!   r!      se   ‡ ÙaàƒGØ
ƒIØ
ƒIØ"€K�Ó"Ø€Dˆ*ÓØ€Eˆ:ÓØ!€J�
Ó!Ø#€L�*Ó#Ø€HˆdÓØƒOÙ#(¸Ô#>€GÐ ×>r   r!   c                  ó4   € ] tR t^.t$ RtR]R&   RtR]R&   RtR# )ÚProjectsPayloadzZ``methods_projects._projects_payload``: every project (archived included) + the active id.zlist[ProjectInfo]ÚprojectsNr   Ú	active_idr   )r   r   r   r   r   r   r4   r   r   r   r   r2   r2   .   s   ‡ ÙdàÓØ €Iˆz× r   r2   c                  ó"   € ] tR t^5t$ R]R&   RtR# )ÚProjectResultr!   Úprojectr   N©r   r   r   r   r   r   r   r   r   r6   r6   5   s   ‡ Ø×r   r6   c                  ó&   € ] tR t^9t$ RtR]R&   RtR# )ÚOptionalProjectResultNúProjectInfo | Noner7   r   ©r   r   r   r   r7   r   r   r   r   r   r:   r:   9   s   ‡ Ø"&€GÐ×&r   r:   c                  ó&   € ] tR t^=t$ RtR]R&   RtR# )ÚProjectIdParamszVAny method addressed at one stored project (``5062`` when the id resolves to nothing).r   r"   r   N©r   r   r   r   r   r   r   r   r   r   r>   r>   =   s
   ‡ Ù`à‡Gr   r>   zprojects.listzJEvery project of the profile (archived included) plus which one is active.)ÚparamsÚresultÚdoczprojects.getz$One stored project with its folders.c                  ó–   € ] tR t^It$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   Rt	R]R
&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚProjectsCreateParamsz'``use`` also activates the new project.r   r$   Núlist[str] | Noner/   r   r#   r)   r%   r&   r'   r(   Fr   Úuser   )r   r   r   r   r   r   r/   r#   r)   r%   r&   r'   r(   rF   r   r   r   r   rD   rD   I   s[   ‡ Ù1à
ƒIØ $€GÐÓ$Ø€Dˆ*ÓØ#€L�*Ó#Ø"€K�Ó"Ø€Dˆ*ÓØ€Eˆ:ÓØ!€J�
Ó!Ø€Cˆ×r   rD   zprojects.createzSCreate a project from a name + folders; duplicate primary paths are refused (5063).c                  ób   € ] tR t^[t$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   R	tR# )
ÚProjectsUpdateParamszCAbsent keys are left untouched; ``''`` clears ``color`` / ``icon``.Nr   r$   r%   r&   r'   r(   r   )r   r   r   r   r   r$   r   r%   r&   r'   r(   r   r   r   r   rH   rH   [   s7   ‡ ÙMà€Dˆ*ÓØ"€K�Ó"Ø€Dˆ*ÓØ€Eˆ:ÓØ!€J�
×!r   rH   zprojects.updatez@Patch a project's display fields; answers the refreshed project.c                  ó>   € ] tR t^it$ R]R&   RtR]R&   RtR]R&   R	tR# )
ÚProjectsAddFolderParamsr   r   Nr   r   Fr   r   r   )r   r   r   r   r   r   r   r   r   r   r   rJ   rJ   i   s   ‡ Ø
ƒIØ€Eˆ:ÓØ€J�×r   rJ   zprojects.add_folderz>Attach a folder to a project (optionally as its primary path).c                  ó"   € ] tR t^st$ R]R&   RtR# )ÚProjectFolderParamsr   r   r   Nr8   r   r   r   rL   rL   s   ó   ‡ Ø
‡Ir   rL   zprojects.remove_folderzDetach a folder from a project.zprojects.set_primaryz4Make one attached folder the project's primary path.c                  ó&   € ] tR t^}t$ RtR]R&   RtR# )ÚProjectsArchiveParamsFr   Úrestorer   N)r   r   r   r   rP   r   r   r   r   r   rO   rO   }   s   ‡ Ø€GˆT×r   rO   zprojects.archivezMArchive (or with ``restore`` un-archive) a project; answers the full listing.zprojects.deletez;Delete a project and its folders; answers the full listing.c                  ó*   € ] tR t^‡t$ RtRtR]R&   RtR# )ÚProjectsSetActiveParamsz.No ``id`` (or null) clears the active project.Nr   r"   r   )r   r   r   r   r   r"   r   r   r   r   r   rR   rR   ‡   s   ‡ Ù8à€Bˆ
×r   rR   c                  ó&   € ] tR t^�t$ RtR]R&   RtR# )ÚActiveIdResultNr   r4   r   )r   r   r   r   r4   r   r   r   r   r   rT   rT   �   s   ‡ Ø €Iˆz× r   rT   zprojects.set_activez5Switch (or clear) the active project for the profile.c                  ó*   € ] tR t^•t$ RtRtR]R&   RtR# )ÚProjectsForCwdParamsz=Absent ``cwd`` resolves the gateway's default completion cwd.Nr   Úcwdr   )r   r   r   r   r   rW   r   r   r   r   r   rV   rV   •   s   ‡ ÙGà€Cˆ×r   rV   c                  ó>   € ] tR t^›t$ RtR]R&   R]R&   RtR]R&   RtR# )	ÚProjectsForCwdResultNr;   r7   r   rW   Ú Úbranchr   )r   r   r   r   r7   r   r[   r   r   r   r   rY   rY   ›   s   ‡ Ø"&€GÐÓ&Ø	ƒHØ€FˆC×r   rY   zprojects.for_cwdzRWhich project (if any) owns a directory, plus the resolved cwd and its git branch.c                  ó:   € ] tR t^¨t$ RtR]R&   R]R&   R]R&   RtR# )	ÚRepoDiscoveryPolicyu]   ``methods_projects._repo_discovery_policy`` â€” the effective ``desktop.repo_scan_*`` config.r   Úenabledú	list[str]ÚrootsÚexclude_pathsr   Nr?   r   r   r   r]   r]   ¨   s   ‡ ÙgàƒMØÓØ×r   r]   c                  óp   € ] tR t^°t$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R	&   RtR]R
&   RtR# )ÚRepoDiscoveryPolicyParamszXThe policy the desktop scanned under (short or ``repo_scan_*`` long keys both accepted).Núbool | Noner^   rE   r`   ra   Úrepo_scan_enabledÚrepo_scan_rootsÚrepo_scan_exclude_pathsr   )r   r   r   r   r   r^   r   r`   ra   re   rf   rg   r   r   r   r   rc   rc   °   sG   ‡ Ùbà€Gˆ[ÓØ"€EÐÓ"Ø&*€MÐ#Ó*Ø%)Ð�{Ó)Ø(,€OÐ%Ó,Ø04ÐÐ-×4r   rc   c                  óP   € ] tR t^»t$ RtR]R&   RtR]R&   ^ tR]R&   RtR	]R
&   Rt	R# )ÚDiscoveredRepozQ``methods_projects._discover_repos_payload`` row: a git root with session totals.r   ÚrootrZ   r   r+   Úsessionsç        ÚfloatÚlast_activer   N)
r   r   r   r   r   r   r   rk   rn   r   r   r   r   ri   ri   »   s'   ‡ Ù[à
ƒIØ€Eˆ3ƒOØ€HˆcÓØ€K�×r   ri   c                  ó*   € ] tR t^Ät$ RtRtR]R&   RtR# )ÚProjectsDiscoverReposParamszP``scan`` asks the host to walk the policy roots itself (remote-gateway desktop).Fr   Úscanr   N)r   r   r   r   r   rq   r   r   r   r   r   rp   rp   Ä   s   ‡ ÙZà€Dˆ$×r   rp   c                  ó0   € ] tR t^Êt$ R]R&   RtR]R&   RtR# )ÚProjectsDiscoverReposResultzlist[DiscoveredRepo]ÚreposNzRepoDiscoveryPolicy | NoneÚdiscovery_policyr   )r   r   r   r   r   ru   r   r   r   r   rs   rs   Ê   s   ‡ ØÓØ37ÐÐ0×7r   rs   zprojects.discover_reposuO   Repos for the desktop overview: scanned-from-disk (cached) âˆª session-derived.c                  ó0   € ] tR t^Ót$ R]R&   RtR]R&   RtR# )ÚRecordRepoItemr   rj   Nr   r   r   )r   r   r   r   r   r   r   r   r   r   rw   rw   Ó   s   ‡ Ø
ƒIØ€Eˆ:×r   rw   c                  ó8   € ] tR t^Øt$ RtRtR]R&   RtR]R&   RtR# )ÚProjectsRecordReposParamsz\Repos as ``{root, label}`` objects or bare root strings; entries without a root are skipped.Nz!list[RecordRepoItem | str] | Nonert   z RepoDiscoveryPolicyParams | Noneru   r   )	r   r   r   r   r   rt   r   ru   r   r   r   r   ry   ry   Ø   s   ‡ Ùfà/3€EÐ,Ó3Ø9=ÐÐ6×=r   ry   c                  ó"   € ] tR t^ßt$ R]R&   RtR# )ÚProjectsRecordReposResultr   Úacceptedr   Nr8   r   r   r   r{   r{   ß   s   ‡ Ø‡Nr   r{   zprojects.record_reposzUPersist repo roots found by the client's (desktop-side) scan; return the merged list.c                  ó*   € ] tR t^êt$ RtRtR]R&   RtR# )ÚProjectTreeSessionz•``methods_projects._project_tree_row`` + ``project_tree.stamp_profile``: the minimal row the
sidebar renders, stamped with the profile it belongs to.Nr   Úprofiler   )r   r   r   r   r   r   r   r   r   r   r   r~   r~   ê   s   ‡ ñ@ð €GˆZ×r   r~   c                  ó„   € ] tR t^ñt$ RtR]R&   R]R&   RtR]R&   RtR	]R
&   RtR	]R&   Rt	R	]R&   ]
! ]R7      tR]R&   RtR# )ÚProjectTreeLanezYOne branch / worktree / kanban lane inside a repo; ``sessions`` is empty unless hydrated.r   r"   r   Nr   r   Fr   ÚisMainÚisKanbanTÚisGitr-   úlist[ProjectTreeSession]rk   r   )r   r   r   r   r   r   r   r‚   rƒ   r„   r   r0   rk   r   r   r   r   r�   r�   ñ   sI   ‡ ÙcàƒGØƒJØ€Dˆ*ÓØ€FˆDÓØ€HˆdÓð €Eˆ4ÓÙ).¸tÔ)D€HÐ&×Dr   r�   c                  ód   € ] tR tRt$ R]R&   R]R&   RtR]R&   ]! ]R7      tR	]R
&   ^ t	R]R&   Rt
R# )ÚProjectTreeRepoé   r   r"   r   Nr   r   r-   zlist[ProjectTreeLane]Úgroupsr+   ÚsessionCountr   )r   r   r   r   r   r   r   r0   r‰   rŠ   r   r   r   r   r‡   r‡      s0   ‡ ØƒGØƒJØ€Dˆ*ÓÙ$)¸$Ô$?€FÐ!Ó?Ø€L�#×r   r‡   c                  ó  € ] tR tRt$ RtR]R&   R]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R]R&   ^ tR]R&   RtR]R&   ^ tR]R&   RtR]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   RtR# )ÚProjectTreeNodei  uZ   ``project_tree._project_node`` â€” explicit, auto (git root) or the synthetic Home bucket.r   r"   r   Nr   r   r'   r&   Fr   ÚisAutoÚisNoProjectr+   rŠ   rl   rm   Ú
lastActiveÚtotalTokensÚtotalCostUsdr-   zlist[ProjectTreeRepo]rt   r…   ÚpreviewSessionsr_   Ú
sessionIdsr   )r   r   r   r   r   r   r   r'   r&   r�   rŽ   rŠ   r�   r�   r‘   r   r0   rt   r’   r“   r   r   r   r   rŒ   rŒ     s˜   ‡ ÙdàƒGØƒJØ€Dˆ*ÓØ€Eˆ:ÓØ€Dˆ*ÓØ€FˆDÓØ€K�ÓØ€L�#ÓØ€J�ÓØ€K�ÓØ€L�%ÓÙ#(¸Ô#>€EÐ Ó>Ù05ÀdÔ0K€OÐ-ÓKÙ!°$Ô7€J�	×7r   rŒ   c                  ó4   € ] tR tRt$ RtR]R&   RtR]R&   RtR# )ÚProjectsTreeParamsi  Nr   Úpreview_limitÚsession_limitr   )r   r   r   r   r–   r   r—   r   r   r   r   r•   r•     s   ‡ Ø $€M�:Ó$Ø $€M�:×$r   r•   c                  óL   € ] tR tRt$ R]R&   RtR]R&   ]! ]R7      tR]R	&   R
t	R# )ÚProjectsTreeResulti   zlist[ProjectTreeNode]r3   Nr   r4   r-   r_   Úscoped_session_idsr   )
r   r   r   r   r   r4   r   r0   rš   r   r   r   r   r™   r™      s"   ‡ Ø#Ó#Ø €IˆzÓ Ù$)¸$Ô$?Ð˜	×?r   r™   zprojects.treeuV   Project â†’ repo â†’ lane overview with counts and a few preview sessions per project.c                  ó0   € ] tR tRt$ R]R&   RtR]R&   RtR# )ÚProjectsProjectSessionsParamsi*  r   Ú
project_idNr   r—   r   )r   r   r   r   r   r—   r   r   r   r   rœ   rœ   *  s   ‡ ØƒOØ $€M�:×$r   rœ   c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚProjectsProjectSessionsResulti/  NzProjectTreeNode | Noner7   r   r<   r   r   r   rŸ   rŸ   /  s   ‡ Ø&*€GÐ#×*r   rŸ   zprojects.project_sessionszNFully hydrated lanes for one project, from the same grouping as projects.tree.c                  ó*   € ] tR tRt$ RtRtR]R&   RtR# )ÚPetInfoParamsi:  zW``knownRevision``: the spritesheet revision the caller already holds (send-once bytes).Nr   ÚknownRevisionr   )r   r   r   r   r   r¢   r   r   r   r   r   r¡   r¡   :  s   ‡ Ùaà $€M�:×$r   r¡   c                  óê   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   Rt	R]R
&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚPetInfoResulti@  z«``server._pet_sprite_payload`` behind ``enabled``; every sprite field is absent when the pet
display is off, ``spritesheetBase64`` is elided when ``spritesheetUnchanged``.r   r^   Nr   r#   ÚdisplayNameÚmimeÚspritesheetBase64ÚspritesheetRevisionrd   ÚspritesheetUnchangedr   ÚframeWÚframeHÚframesPerStatezdict[str, int] | NoneÚframesByStateÚframesByRowÚloopMsúfloat | NoneÚscalerE   Ú	stateRowsr   )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¤   r¤   @  s¡   ‡ ñVð ƒMØ€Dˆ*ÓØ"€K�Ó"Ø€Dˆ*ÓØ$(Ð�zÓ(Ø&*Ð˜Ó*Ø(,Ð˜+Ó,Ø€FˆJÓØ€FˆJÓØ!%€N�JÓ%Ø+/€MÐ(Ó/Ø)-€KÐ&Ó-Ø€FˆJÓØ€Eˆ<ÓØ"&€IÐ×&r   r¤   zpet.infoz\Active pet for sprite renderers: spritesheet (base64) + frame geometry + state-row taxonomy.c                  óZ   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R# )ÚPetInfoMetaResultiY  r   r^   Nr   r#   r¥   r°   r±   r¨   r   )
r   r   r   r   r   r#   r¥   r±   r¨   r   r   r   r   r´   r´   Y  s0   ‡ ØƒMØ€Dˆ*ÓØ"€K�Ó"Ø€Eˆ<ÓØ&*Ð˜×*r   r´   zpet.info.metaz?Cheap active-pet metadata used to avoid full payload refreshes.c                  óF   € ] tR tRt$ RtRtR]R&   RtR]R&   RtR	]R
&   Rt	R# )ÚPetCellsParamsie  z^``graphics`` opts into the kitty payload when the TTY speaks it; ``cols`` overrides the width.Nr   Ústater   ÚcolsFr   Úgraphicsr   )
r   r   r   r   r   r·   r   r¸   r¹   r   r   r   r   r¶   r¶   e  s#   ‡ Ùhà€Eˆ:ÓØ€Dˆ*ÓØ€Hˆd×r   r¶   c                  óÎ   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   Rt	R
]R&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR
]R&   RtR]R&   RtR
]R&   RtR]R&   RtR# )ÚPetCellsResultim  uª   Unicode: ``frames`` is frame â†’ row â†’ cell ``[tr,tg,tb,ta, br,bg,bb,ba]``; kitty (``graphics``
set): ``frames`` are transmit escapes and ``placeholder`` the text grid.r   r^   Nr   r#   r¥   r·   r   r¸   r°   ÚframeMsz.list[list[list[list[int]]]] | list[str] | NoneÚframesr±   r¹   ÚimageIdr'   ÚrowsrE   Úplaceholderr   )r   r   r   r   r   r   r#   r¥   r·   r¸   r¼   r½   r±   r¹   r¾   r'   r¿   rÀ   r   r   r   r   r»   r»   m  s‰   ‡ ñPð ƒMØ€Dˆ*ÓØ"€K�Ó"Ø€Eˆ:ÓØ€Dˆ*ÓØ €Gˆ\Ó Ø=A€FÐ:ÓAØ€Eˆ<ÓØ€HˆjÓØ€GˆZÓØ€Eˆ:ÓØ€Dˆ*ÓØ$(€KÐ!×(r   r»   z	pet.cellsz@Half-block cell frames (or a kitty placement) for one pet state.c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚPetGalleryParamsi‡  Fr   Ú	localOnlyr   N)r   r   r   r   rÃ   r   r   r   r   r   rÂ   rÂ   ‡  s   ‡ Ø€Iˆt×r   rÂ   c                  ó`   € ] tR tRt$ R]R&   R]R&   R]R&   RtR]R&   R	tR
]R&   RtR]R&   RtR	# )ÚPetGalleryEntryi‹  r   r#   r¥   r   Ú	installedrZ   ÚspritesheetUrlNrd   ÚcuratedFÚ	generatedr   )	r   r   r   r   r   rÇ   rÈ   rÉ   r   r   r   r   rÅ   rÅ   ‹  s0   ‡ Ø
ƒIØÓØƒOØ€N�CÓØ€Gˆ[ÓØ€Iˆt×r   rÅ   c                  óL   € ] tR tRt$ R]R&   RtR]R&   ]! ]R7      tR]R	&   R
t	R# )ÚPetGalleryResulti”  r   r^   rZ   r   Úactiver-   zlist[PetGalleryEntry]Úpetsr   N)
r   r   r   r   r   rÌ   r   r0   rÍ   r   r   r   r   rË   rË   ”  s!   ‡ ØƒMØ€FˆCÓÙ"'¸Ô"=€DÐ
×=r   rË   zpet.galleryzcPetdex gallery + local install state (installed-only offline); localOnly skips the remote manifest.c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚPetSlugParamsiž  r   r#   r   Nr8   r   r   r   rÏ   rÏ   ž  rM   r   rÏ   c                  ó:   € ] tR tRt$ R]R&   R]R&   RtR]R&   R	tR# )
ÚPetSlugResulti¢  r   Úokr   r#   Nr   r¥   r   )r   r   r   r   r   r¥   r   r   r   r   rÑ   rÑ   ¢  s   ‡ ØƒHØ
ƒIØ"€K�×"r   rÑ   z
pet.selectzLAdopt a pet: install (if needed) + activate; writes display.pet.* to config.z
pet.removezOUninstall a pet (delete its directory); if it was active, turn the display off.c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚPetRenameParamsi®  r   r$   r   Nr8   r   r   r   rÔ   rÔ   ®  rM   r   rÔ   z
pet.renamezVRename a pet's display name + realign its slug/dir; follows the active slug in config.c                  ó6   € ] tR tRt$ R]R&   R]R&   R]R&   RtR# )	ÚPetExportResulti¶  r   rÒ   r   ÚfilenameÚ	zipBase64r   Nr8   r   r   r   rÖ   rÖ   ¶  s   ‡ ØƒHØƒMØ‡Nr   rÖ   z
pet.exportz0Export an installed pet as a re-importable .zip.c                  ó*   € ] tR tRt$ RtRtR]R&   RtR# )ÚPetThumbParamsiÀ  z8``url``: spritesheet source for a not-yet-installed pet.Nr   Úurlr   )r   r   r   r   r   rÛ   r   r   r   r   r   rÚ   rÚ   À  s   ‡ ÙBà€Cˆ×r   rÚ   c                  ó:   € ] tR tRt$ R]R&   R]R&   RtR]R&   R	tR# )
ÚPetThumbResultiÆ  r   rÒ   r   r#   Nr   ÚdataUrir   )r   r   r   r   r   rÞ   r   r   r   r   rÝ   rÝ   Æ  s   ‡ ØƒHØ
ƒIØ€GˆZ×r   rÝ   z	pet.thumbzFIdle-frame PNG data URI for the picker (desktop CSP breaks CDN <img>).zpet.disablez1Turn the pet display off from the desktop picker.c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚPetScaleParamsiÓ  Nr   r±   r   )r   r   r   r   r±   r   r   r   r   r   rà   rà   Ó  s   ‡ Ø€Eˆ9×r   rà   c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚPetScaleResulti×  r   rÒ   rm   r±   r   Nr8   r   r   r   râ   râ   ×  s   ‡ ØƒHØ‡Lr   râ   z	pet.scalezMPersist display.pet.scale (clamped to engine bounds) from the desktop slider.N)?r   Ú
__future__r   Úpydanticr   Úbaser   r   r   Úcommonr   r   r	   r
   Úregistryr   r   r!   r2   r6   r:   r>   rD   rH   rJ   rL   rO   rR   rT   rV   rY   r]   rc   ri   rp   rs   rw   ry   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â   r   r   r   Ú<module>rè      sy  ðñõ #å ç +Ñ +ß HÓ HÝ ô
 �Fô  ô?�&ô ?ô !�fô !ô�Fô ô'˜Fô 'ô�mô ñ €˜}°_ØWõYá €~˜o°mØ1õ3ô˜=ô ñ ÐÐ!5Ð>SØ`õbô"˜?ô "ñ ÐÐ!5¸mØMõOô˜oô ñ ÐÐ%<À]ØKõMô˜/ô ñ ÐÐ(;ÀMØ,õ.á ÐÐ&9À-ØAõCô˜Oô ñ ÐÐ"7ÀØZõ\á Ð ¸ØHõJô˜mô ô!�Vô !ñ ÐÐ%<À^ØBõDô˜=ô ô˜6ô ñ ÐÐ"6Ð?SØ_õaô˜&ô ô5 ô 5ô�Vô ô -ô ô8 &ô 8ñ
 Ð Ð)DÐMhØ\õ^ô�Vô ô
> ô >ôÐ ;ô ñ ÐÐ'@ÐIbØbõdôÐ)ô ôE�fô Eô�fô ô8�fô 8ô&%˜ô %ô
@˜ô @ñ €Ð1Ð:LØcõeô% Mô %ô
+ Fô +ñ Ð"Ð+HÐQnØ[õ]ô%�Mô %ô'�Iô 'ñ* €z˜-°Øiõkô+˜ô +ñ €˜}Ð5FØLõNô�]ô ô)�Vô )ñ& €{˜>°.ØMõOô�}ô ô�fô ô>�vô >ñ €}Ð-Ð6FØpõrô�Mô ô#�Fô #ñ €|˜M°-ØYõ[á €|˜M°-Ø\õ^ô�mô ñ €|˜O°MØcõeô�fô ñ €|˜M°/Ø=õ?ô�]ô ô�Vô ñ €{˜>°.ØSõUñ €}˜]°8Ø>õ@ô�]ô ô�Vô ñ
 €{˜>°.ØZ÷\r   