+
    iHàj`*  ã                  ó¶  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ]P"                  ! ]4      tRŠtR]R&   Rt/ RRbRRbRRbRR	bRR	bR R	bR!R	bR"R	bR#R
bR$R
bR%R
bR&R
bR'R
bR(RbR)RbR*RbR+Rb/ R,RbR-RbR.RbR/RbR0RbR1RbR2RbR3RbR4RbR5RbR6RbR7RbR8RbR9RbR:RbR;RbR<RbC/ R=RbR>RbR?RbR@RbRARbRBRbRCRbRDRbRERbRFRbRGRbRHRbRIRbRJRbRKRbRLRbRMRbC/ RNRbRORbRPRbRQRbRRRbRSRbRTRbRURbRVRbRWRbRXRbRYRbRZRbR[RbR\RbR]RbR^RbCR_RR`RRaRRbRRcRRdR/CtRe]Rf&   / tRg]Rh&   / tRi]Rj&   ]P4                  ! 4       tRk Rl ltRm Rn ltR‹Ro Rp lltR‹Rq Rr lltR‹Rs Rt llt Ru Rv lt!Rw Rx lt"R‹Ry Rz llt#]PH                  3R{ R| llt%]! ^R}7      R~ R l4       t&R€ R� lt'R‚ Rƒ lt(R„ R… lt)R† R‡ lt*R‹Rˆ R‰ llt+. RŒOt,R# )�uN  Lightweight i18n for Hermes' static user-facing strings (approval prompts, gateway replies, CLI, tips).

Catalogs are flat dotted-key mappings resolved through layers, top first:

1. plugin language packs (``PluginContext.register_locale``; last registered wins) â€” ``agent.i18n_layers``
2. the user overlay ``$HERMES_HOME/locales/<lang>.yaml`` of the current profile home
3. the bundled ``locales/<lang>.yaml``
4. the same chain for ``en``
5. the bare key

Every layer may be partial. Language resolution: explicit ``lang=`` > ``HERMES_LANGUAGE`` >
``display.language`` > ``en``; any id that some layer supplies is accepted, so a pack-only language
(``pl``) works the moment its plugin loads. ``t()`` is a hot path: one cached merged dict per
``(home, lang)``, invalidated by :func:`reset_language_cache` (which every pack registration calls).
)ÚannotationsN)Ú	lru_cache)ÚPath)ÚAny)Úi18n_layers)Úlanguage_optionsÚenÚzhúzh-hantÚjaÚdeÚesÚfrÚtrÚukÚafÚkoÚitÚgaÚptÚruÚhuÚarútuple[str, ...]ÚSUPPORTED_LANGUAGESÚenglishzen-uszen-gbÚchineseÚmandarinzzh-cnzzh-hanszzh-sgztraditional-chineseÚtraditional_chinesezzh-twzzh-hkzzh-moÚjapaneseÚjpzja-jpÚgermanÚdeutschzde-dezde-atzde-chÚspanishu   espaÃ±olÚespanolzes-eszes-mxzes-arÚfrenchu	   franÃ§aisÚfrancezfr-frzfr-bezfr-cazfr-chÚ	ukrainianÚ
ukrainischu   ÑƒÐºÑ€Ð°Ñ—Ð½Ñ�ÑŒÐºÐ°zuk-uaÚuaÚturkishu   tÃ¼rkÃ§eztr-trÚ	afrikaanszaf-zaÚkoreanu	   í•œêµ­ì–´zko-krÚitalianÚitalianozit-itzit-chÚirishÚgaeilgezga-ieÚ
portugueseu
   portuguÃªsÚ	portugueszpt-ptzpt-brÚ	brazilianÚ
brasileiroÚrussianu   Ñ€ÑƒÑ�Ñ�ÐºÐ¸Ð¹zru-ruÚ	hungarianÚmagyarzhu-huÚarabicu   Ø§Ù„Ø¹Ø±Ø¨ÙŠØ©zar-sazar-egzar-aezar-mazar-dzúdict[str, str]Ú_LANGUAGE_ALIASESz%dict[tuple[str, str], dict[str, str]]Ú_catalog_cachezdict[str, tuple[str, ...]]Ú_supported_cachec               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú//home/ubuntu/.hermes/hermes-agent/agent/i18n.pyÚ__annotate__rC   H   s   € ÷ >ñ >�dñ >ó    c                 ó\  € \         P                  ! RR4      P                  4       p V '       d+   \        V 4      P	                  4       '       d   \        V 4      # V '       d   \
        P                  RV 4       \        \        4      P                  4       P                  P                  R,          # )zåLocale dir: ``HERMES_BUNDLED_LOCALES`` (sealed packaging, e.g. Nix) if it exists, else ``<repo-root>/locales``.

The source path is returned even when missing so ``_load_bundled`` can log
the path it looked at rather than raise.
ÚHERMES_BUNDLED_LOCALESÚ zlHERMES_BUNDLED_LOCALES points to a non-directory path (%s); falling back to bundled/source locale resolutionÚlocales)
ÚosÚgetenvÚstripr   Úis_dirÚloggerÚwarningÚ__file__ÚresolveÚparent)Úoverrides    rB   Ú_locales_dirrS   H   sz   € ô �yŠyÐ1°2Ó6×<Ñ<Ó>€Hß”D˜“N×)Ñ)×+Ò+Ü�H‹~ÐßÜ�‰ð?Ø@Hô	
ô ”‹>×!Ñ!Ó#×*Ñ*×1Ñ1°IÕ=Ð=rD   c               ó   € V ^8„  d   QhRR/# ©r>   r?   Ústrr@   )rA   s   "rB   rC   rC   Y   s   € ÷ "ñ "�sñ "rD   c                 ó.   € ^ RI Hp  \        V ! 4       4      # )é    ©Úget_hermes_home)Úhermes_constantsrZ   rV   rY   s    rB   Ú_current_homer\   Y   s   € Ý0Ü‰Ó Ó!Ð!rD   c               ó    € V ^8„  d   QhRRRR/# )r>   Úhomeú
str | Noner?   r   r@   )rA   s   "rB   rC   rC   ^   s   € ÷ ñ ˜jð °Oñ rD   c                óÈ  € T ;'       g    \        4       p \        ;_uu_ 4        \        P                  V 4      pVe   VuuRRR4       #  RRR4       \	        \
        4      \        P                  ! V 4      ,          p\        .\        V\        0,
          4      O5p\        ;_uu_ 4        V\        V &   RRR4       V#   + '       g   i     L{; i  + '       g   i     T# ; i)u°   Every language some layer supplies for the current profile home: bundled âˆª user overlay âˆª plugin
packs, ``en`` first then sorted. Cached until :func:`reset_language_cache`.N)
r\   Ú_catalog_lockr<   ÚgetÚsetr   r   Úlayered_languagesÚDEFAULT_LANGUAGEÚsorted)r^   ÚcachedÚlangsÚresults   &   rB   Úsupported_languagesrj   ^   s§   € ð ×"Ð"”=“?€Dß	ŽÜ!×%Ñ% dÓ+ˆØÒØ÷ 
Šà÷ 
ô Ô#Ó$¤{×'DÒ'DÀTÓ'JÕJ€EÜÐD¤¨Ô1AÐ0BÕ(BÓ!CÑD€Fß	ŽØ!'Ô˜Ñ÷ 
à€M÷ 
�ú÷ 
Žà€Mús   £B=Â)
CÂ=C	ÃC!	c               ó$   € V ^8„  d   QhRRRRRR/# )r>   Úvaluer   r^   r_   r?   r@   )rA   s   "rB   rC   rC   m   s!   € ÷ /ñ /˜sð /¨*ð /À
ñ /rD   c                óè   € \         P                  ! V 4      pV'       g   R# \        V4      pW#9   d   V# \        P	                  V4      pWC9   d   V# VP                  R^4      ^ ,          pWS9   d   V# R# )u³   Canonical supported id for a user-supplied value (code, alias, regional tag), or ``None`` when no
layer supplies it â€” the validation ``hermes config set display.language`` runs.NÚ-)r   Únormalize_language_idrj   r:   rb   Úsplit)rl   r^   ÚkeyÚ	supportedÚaliasÚbases   &&    rB   Úresolve_language_idru   m   so   € ô ×
+Ò
+¨EÓ
2€CßÙÜ# DÓ)€IØ
ÔØˆ
Ü×!Ñ! #Ó&€EØÔØˆØ�9‰9�S˜!Ó˜QÕ€DØÔ$ˆ4Ð.¨$Ð.rD   c               ó$   € V ^8„  d   QhRRRRRR/# )r>   rl   r   r^   r_   r?   rV   r@   )rA   s   "rB   rC   rC   }   s&   € ÷ @ñ @˜3ð @ jð @¸Cñ @rD   c                ó4   € \        W4      ;'       g    \        # )zLMap a user-supplied value to a supported code (any layer), else the default.)ru   re   )rl   r^   s   &&rB   Ú_normalize_langrx   }   s   € ä˜uÓ+×?Ð?Ô/?Ð?rD   c               ó    € V ^8„  d   QhRRRR/# )r>   ÚlangrV   r?   r9   r@   )rA   s   "rB   rC   rC   ‚   s   € ÷ 
ñ 
˜ð 
 ñ 
rD   c                ó  € \        4       V  R2,          pVP                  4       '       g   \        P                  RW4       / #  \        P
                  ! V4      #   \         d#   p\        P                  RY4       / u Rp?# Rp?ii ; i)u_   One bundled locale YAML flattened to dotted keys (empty dict on any failure â€” never crashes).z.yamlz!i18n catalog missing for %s at %sz"Failed to load i18n catalog %s: %sN)rS   Úis_filerM   Údebugr   Úparse_locale_fileÚ	ExceptionrN   )rz   ÚpathÚexcs   &  rB   Ú_load_bundledr‚   ‚   sm   € ä‹>˜t˜f E˜NÕ*€DØ�<‰<�>Š>Ü�‰Ð8¸$ÔEØˆ	ðÜ×,Ò,¨TÓ2Ð2øÜô Ü�‰Ð;¸TÔGØ�	ûðús   ÁA ÁBÁ%BÁ<BÂBc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r>   Únoder   ÚprefixrV   Úoutr9   r?   ÚNoner@   )rA   s   "rB   rC   rC   �   s(   € ÷ +ñ +˜ð + Sð +¨~ð +À$ñ +rD   c                ó4   € \         P                  ! WV4       R# )z9Flatten a nested mapping into ``out`` (text leaves only).N)r   Úflatten)r„   r…   r†   s   &&&rB   Ú_flatten_intorŠ   �   s   € ä×Ò˜ cÖ*rD   c               ó$   € V ^8„  d   QhRRRRRR/# )r>   rz   rV   r^   r_   r?   r9   r@   )rA   s   "rB   rC   rC   ”   s!   € ÷ ñ ˜ð  :ð ¸ñ rD   c                óæ  € T;'       g    \        4       pW3p\        ;_uu_ 4        \        P                  V4      pVe   VuuRRR4       #  RRR4       \	        V 4      pVP                  \        P                  ! W4      4       VP                  \        P                  ! V 4      4       \        ;_uu_ 4        V\        V&   RRR4       V#   + '       g   i     L‡; i  + '       g   i     T# ; i)z]Merged catalog for ``lang`` in ``home`` (packs > overlay > bundled); cached per (home, lang).N)	r\   ra   r;   rb   r‚   Úupdater   Úoverlay_layerÚ
pack_layer)rz   r^   rq   rg   Úmergeds   &&   rB   Ú_load_catalogr‘   ”   s­   € à×"Ð"”=“?€DØˆ,€Cß	ŽÜ×#Ñ# CÓ(ˆØÒØ÷ 
Šà÷ 
ô ˜4Ó €FØ
‡M�M”+×+Ò+¨DÓ7Ô8Ø
‡M�M”+×(Ò(¨Ó.Ô/ß	ŽØ$Œ�sÑ÷ 
à€M÷ 
�ú÷ 
Žà€Mús   ¦CÂ8
CÃC	ÃC0	c               ó$   € V ^8„  d   QhRRRRRR/# )r>   rz   rV   Úsurfacer?   r9   r@   )rA   s   "rB   rC   rC   ¤   s!   € ÷ ñ ˜#ð ¨ð È>ñ rD   c                óä   € \        V 4      p / pV\        P                  8w  d    VP                  \	        V  RV 24      4       VP                  \        P
                  ! \        4       W4      4       V# )a>  What ``i18n.catalog`` serves for one surface: packs > overlay > bundled ``locales/<lang>.<surface>.yaml``.

The core surface omits the bundled layer (the Python renderer already has it); the TUI ships only an
English catalog in-tree, so its bundled translations live in ``locales/<lang>.tui.yaml`` and ride
along here.Ú.)rx   r   ÚCORE_SURFACEr�   r‚   Úsurface_catalogr\   )rz   r“   r�   s   && rB   r—   r—   ¤   s]   € ô ˜4Ó €DØ€FØ”+×*Ñ*Ô*Ø�‰”m t f¨A¨g¨YÐ$7Ó8Ô9Ø
‡M�M”+×-Ò-¬m«o¸tÓMÔNØ€MrD   )Úmaxsizec               ó    € V ^8„  d   QhRRRR/# )r>   Úhermes_homerV   r?   r_   r@   )rA   s   "rB   rC   rC   ³   s   € ÷ 
ñ 
¨ð 
°ñ 
rD   c                óö   €  ^ RI Hp V! 4       P                  R4      ;'       g    / P                  R4      pV'       d   \        W 4      # R#   \         d"   p\
        P                  RT4        Rp?R# Rp?ii ; i)zß``display.language`` from config.yaml, read once per profile home (``t()`` is a hot path).
Keyed by home so a multiplexed gateway serving several profiles doesn't freeze the first
profile's language for every other profile.)Úload_config_readonlyÚdisplayÚlanguageNz/Could not read display.language from config: %s)Úhermes_cli.configrœ   rb   rx   r   rM   r}   )rš   rœ   rz   r�   s   &   rB   Ú_config_language_cachedr    ²   sd   € ð
Ý:Ù$Ó&×*Ñ*¨9Ó5×;Ð;¸×@Ñ@ÀÓLˆß59Œ˜tÓ1ÐC¸tÐCøÜô Ü�‰ÐFÈÔLÝûðús'   ‚"A ¥A ¿
A Á
A ÁA8ÁA3Á3A8c               ó   € V ^8„  d   QhRR/# )r>   r?   r_   r@   )rA   s   "rB   rC   rC   À   s   € ÷ 4ñ 4˜*ñ 4rD   c                 ó(   € \        \        4       4      # ©N)r    r\   r@   rD   rB   Ú_config_languager¤   À   s   € Ü"¤=£?Ó3Ð3rD   c               ó   € V ^8„  d   QhRR/# )r>   r?   r‡   r@   )rA   s   "rB   rC   rC   Ä   s   € ÷ ñ ˜dñ rD   c                 óü   € \         P                  4        \        ;_uu_ 4        \        P	                  4        \
        P	                  4        RRR4       \        P                  ! 4        R#   + '       g   i     L'; i)zÌInvalidate cached language resolution, merged catalogs and every layer view (call after
``save_config`` changes ``display.language``, after a pack registers/unregisters, or after editing
an overlay file).N)r    Úcache_clearra   r;   Úclearr<   r   Úclear_cacher@   rD   rB   Úreset_language_cacherª   Ä   sH   € ô ×'Ñ'Ô)ß	ŽÜ×ÑÔÜ×ÑÔ ÷ 
ô ×ÒÖ÷ 
�ús   £)A+Á+A;	c               ó    € V ^8„  d   QhRRRR/# )r>   r^   rV   r?   r@   )rA   s   "rB   rC   rC   Ï   s   € ÷ nñ n˜Cð n Cñ nrD   c                óÔ   € ^ RI HpHp  V! R4      pV'       d   \        W04      # \        V 4      ;'       g    \        #   T d#    \        P                  P                  R4      p LTi ; i)rX   )ÚUnscopedSecretErrorÚ
get_secretÚHERMES_LANGUAGE)	Úagent.secret_scoper­   r®   rI   Úenvironrb   rx   r    re   )r^   r­   r®   Úenv_langs   &   rB   Ú_resolve_languager³   Ï   s]   € ßBð5ÙÐ/Ó0ˆ÷ /7Œ?˜8Ó*ÐmÔ<SÐTXÓ<Y×<mÐ<mÔ]mÐmøð ô 5Ü—:‘:—>‘>Ð"3Ó4Šð5ús   Š> ¾&A'Á&A'c               ó   € V ^8„  d   QhRR/# rU   r@   )rA   s   "rB   rC   rC   Ø   s   € ÷ .ñ .�cñ .rD   c                 ó(   € \        \        4       4      # )a  Resolve the active language using env > config > default order. ``HERMES_LANGUAGE`` is a
per-profile ``.env`` value, so it is read through the secret scope: under multiplexing a raw
environ read would impose the default profile's language on every other profile.)r³   r\   r@   rD   rB   Úget_languager¶   Ø   s   € ô œ]›_Ó-Ð-rD   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r>   rq   rV   rz   r_   Úformat_kwargsr   r?   r@   )rA   s   "rB   rC   rC   ß   s(   € ÷ ñ ˆ3ð �jð ¸#ð À#ñ rD   c                óÌ  € \        4       pV'       d   \        W4      M
\        V4      p\        WC4      P	                  V 4      pVf+   V\
        8w  d    \        \
        V4      P	                  V 4      pVf   \        P                  RW4       T pV'       g   V#  VP                  ! R/ VB #   \        \        \        3 d$   p\        P                  RYY&4       Tu Rp?# Rp?ii ; i)zàTranslate a dotted catalog key to the active (or explicit ``lang``) language.

``format_kwargs`` are applied with ``str.format``. Falls back to English,
then to the bare key; a format failure returns the unformatted string.
Nzi18n miss: key=%r lang=%rz3i18n format failed for key=%r lang=%r kwargs=%r: %sr@   )r\   rx   r³   r‘   rb   re   rM   r}   rA   ÚKeyErrorÚ
IndexErrorÚ
ValueErrorrN   )rq   rz   r¸   r^   Útargetrl   r�   s   &&,    rB   Útr¾   ß   s¿   € ô ‹?€Dß,0Œ_˜TÔ(Ô6GÈÓ6M€FÜ˜&Ó'×+Ñ+¨CÓ0€EØ‚}˜Ô#3Ô3ÜÔ.°Ó5×9Ñ9¸#Ó>ˆØ‚}Ü�‰Ð0°#Ô>ØˆßØˆðØ�|Š|Ñ,˜mÑ,Ð,øÜ”j¤*Ð-ô Ü�‰ÐLÈcÐ[hÔnØ�ûðús   ÂB* Â*C#Ã CÃC#ÃC#)r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r£   )	re   r   r¶   r   rª   ru   rj   r—   r¾   )-Ú__conditional_annotations__Ú__doc__Ú
__future__r   ÚloggingrI   Ú	threadingÚ	functoolsr   Úpathlibr   Útypingr   Úagentr   Úagent.i18n_languagesr   Ú	getLoggerÚ__name__rM   r   Ú__annotations__re   r:   r;   r<   ÚLockra   rS   r\   rj   ru   rx   r‚   rŠ   r‘   r–   r—   r    r¤   rª   r³   r¶   r¾   Ú__all__)r¿   s   @rB   Ú<module>rÎ      sQ  øðôõ  #ã Û 	Û Ý Ý Ý å Ý 1à	×	Ò	˜8Ó	$€ð(Ð �_ó ð Ð ð%Øˆtð%Ø˜dð%Ø$+¨Tð%àˆtð%à ð%à'.°ð%à6?Àð%àGNÐPTð%ð ˜9ð%ð '<¸Yð%ð ˆYð	%ð   ð	%ð -4°Yð	%ð
 �ð%ð
 ˜Dð%ð
 #*¨4ð%ð ˆdñ%ð ˜tð%ð &-¨dð%ð 5<¸Tð%ð DKÈDð%ð ˆtð%ð   ð%ð (1°$ð%ð 9@Àð%ð HOÐPTð%ð W^Ð_cð%ð ˆdð%ð   ð%ð (0°ð%ð 8?Àð%ð GNÈtð%ð V]Ð^bð%ð elÐmqò%ð �ð%ð $ Tð%ð ,BÀ4ð%ð JQÐRVð%ð Y]Ð^bð%ð ˆtð%ð   ð%ð (/°ð%ð �ð%ð  ð%ð ˆdð%ð   ð%ð (/°ð%ð ˆtð%ð   ð%ð (/°ð%ð 7>¸tò%ð ˆTð%ð ˜dð%ð %,¨Tð%ð �$ð%ð % dð%ð -8¸ð%ð  ˆTð!%ð  ˜Dð!%ð  #.¨tð!%ð  6BÀ4ð!%ð" ˆtð#%ð" & tð#%ð" .5°dð#%ð$ �ð%%ð$   ð%%ð$ (/°ð%%ð& ˆdñ'%ð& % dØˆT�7˜D '¨4°¸$ÀÈñ)%Ð �>ó ð0 9;€Ð5Ó :Ø/1Ð Ð,Ó 1Ø—’Ó €õ>õ""÷
÷/÷ @õ

õ+÷
ð  /:×.FÑ.F÷ ñ �1Ôô
ó ð
õ4õõnõ.÷ò.
‚rD   