§
    øžyjÀ'  ã                  óx  — U d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 dZ
dZdddd	œdddd	œdd
dd	œdddd	œdd
dd	œdddd	œdddd	œdddd	œdœZded<    ed¬¦  «         G d„ d¦  «        ¦   «         Zd-d„Zd.d„Zd/d„Zd0d„ZddlZddlZdd lmZ ddlZ ed¬¦  «         G d!„ d"¦  «        ¦   «         Zd1d'„Z	 d2d3d,„ZdS )4uO  Detect xAI models retired on May 15, 2026.

Source: https://docs.x.ai/developers/migration/may-15-retirement

Pure logic: walks a Hermes config dict, returns issues for any reference
to a retired xAI model. No I/O, no CLI dependencies â€” testable in isolation
and reusable from both `hermes doctor` and a future `hermes migrate xai`.
é    )Úannotations)Ú	dataclass)ÚAnyÚDictÚListÚOptionalz8https://docs.x.ai/developers/migration/may-15-retirementzMay 15, 2026zgrok-4.3N)ÚreplacementÚreasoning_effortÚnoteÚnonezgrok-imagine-image-quality)zgrok-4-0709zgrok-4-fast-reasoningzgrok-4-fast-non-reasoningzgrok-4-1-fast-reasoningzgrok-4-1-fast-non-reasoningzgrok-code-fast-1zgrok-3zgrok-imagine-image-proz#Dict[str, Dict[str, Optional[str]]]Ú_RETIRED_MODELST)Úfrozenc                  óN   — e Zd ZU dZded<   ded<   ded<   dZded<   dZded	<   dS )
ÚRetirementIssuez<A reference to a retired xAI model found in a Hermes config.ÚstrÚconfig_pathÚcurrent_modelr	   NúOptional[str]r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r
   r   © ó    ú?/home/ragecks/.hermes/hermes-agent/hermes_cli/xai_retirement.pyr   r   #   s_   € € € € € € àFÐFàÐÐÑØÐÐÑØÐÐÑØ&*ÐÐ*Ð*Ð*Ñ*Ø€DÐÐÐÑÐÐr   r   Úmodel_idr   Úreturnc                ó¸   — |                       ¦   «                              ¦   «         }dD ]0}|                     |¦  «        r|t          |¦  «        d…         } nŒ1|S )uE   Strip provider prefix (``x-ai/grok-4`` â†’ ``grok-4``) and lowercase.)zx-ai/zxai/N)ÚstripÚlowerÚ
startswithÚlen)r   ÚmÚprefixs      r   Ú
_normalizer&   .   sd   € à�ŠÑÔ×ÒÑ Ô €AØ#ð ð ˆØ�<Š<˜ÑÔð 	Ø•#�f‘+”+�,�,”ˆAØˆEð	ð €Hr   r   Úboolc                óœ   — t          | t          ¦  «        r|                      ¦   «         sdS t          | ¦  «                             d¦  «        S )NFzgrok-)Ú
isinstancer   r    r&   r"   )r   s    r   Ú_looks_like_xair*   8   sF   € Ý�h¥Ñ$Ô$ð ¨H¯NªNÑ,<Ô,<ð ØˆuÝ�hÑÔ×*Ò*¨7Ñ3Ô3Ð3r   ÚconfigúDict[str, Any]úList[RetirementIssue]c                ó‚  ‡— g Šdˆfd„}t          | t          ¦  «        s‰S |                      d¦  «        }t          |t          ¦  «        r |d	|                     d¦  «        ¦  «         |                      d
¦  «        }t          |t          ¦  «        rR|                     ¦   «         D ]=\  }}t          |t          ¦  «        r# |d|› d�|                     d¦  «        ¦  «         Œ>|                      d¦  «        }t          |t          ¦  «        r |d|                     d¦  «        ¦  «         |                      d¦  «        }t          |t          ¦  «        rI|                     d¦  «        }t          |t          ¦  «        r |d|                     d¦  «        ¦  «         |                      d¦  «        }	t          |	t          ¦  «        rs|	                     d¦  «        }
t          |
t          ¦  «        rI|
                     d¦  «        }t          |t          ¦  «        r |d|                     d¦  «        ¦  «         ‰S )u'  Walk all model slots in a Hermes config and return retirement issues.

    Slots scanned:
      - ``principal.model``
      - ``auxiliary.<any>.model`` (introspective â€” covers future aux slots)
      - ``delegation.model``
      - ``tts.xai.model``
      - ``plugins.image_gen.xai.model``
    Úpathr   Úmodelr   r   ÚNonec                ó*  •— t          |¦  «        sd S t          |¦  «        }t                               |¦  «        }|€d S ‰                     t          | ||d         |                     d¦  «        |                     d¦  «        ¬¦  «        ¦  «         d S )Nr	   r
   r   )r   r   r	   r
   r   )r*   r&   r   ÚgetÚappendr   )r/   r0   ÚnormÚentryÚissuess       €r   Ú_checkz%find_retired_xai_refs.<locals>._checkJ   s    ø€ Ý˜uÑ%Ô%ð 	ØˆFÝ˜%Ñ Ô ˆÝ×#Ò# DÑ)Ô)ˆØˆ=ØˆFØ�Š•oØØØ˜mÔ,Ø"ŸYšYÐ'9Ñ:Ô:Ø—’˜6Ñ"Ô"ð
ñ 
ô 
ñ 	ô 	ð 	ð 	ð 	r   Ú	principalzprincipal.modelÚ	auxiliaryz
auxiliary.z.modelÚ
delegationzdelegation.modelÚttsÚxaiztts.xai.modelÚpluginsÚ	image_genzplugins.image_gen.xai.model)r/   r   r0   r   r   r1   )r)   Údictr3   Úitems)r+   r8   r9   ÚauxÚ	slot_nameÚslot_cfgr;   r<   Útts_xair>   r?   Úig_xair7   s               @r   Úfind_retired_xai_refsrG   >   s7  ø€ ð %'€Fðð ð ð ð ð õ �f�dÑ#Ô#ð Øˆà—
’
˜;Ñ'Ô'€IÝ�)�TÑ"Ô"ð :ØˆÐ  )§-¢-°Ñ"8Ô"8Ñ9Ô9Ð9à
�*Š*�[Ñ
!Ô
!€CÝ�#•tÑÔð NØ#&§9¢9¡;¤;ð 	Nð 	NÑˆI�xÝ˜(¥DÑ)Ô)ð NØ�Ð5 IÐ5Ð5Ð5°x·|²|ÀGÑ7LÔ7LÑMÔMÐMøà—’˜LÑ)Ô)€JÝ�*�dÑ#Ô#ð <ØˆÐ! :§>¢>°'Ñ#:Ô#:Ñ;Ô;Ð;à
�*Š*�UÑ
Ô
€CÝ�#•tÑÔð :Ø—'’'˜%‘.”.ˆÝ�g�tÑ$Ô$ð 	:ØˆF�? G§K¢K°Ñ$8Ô$8Ñ9Ô9Ð9à�jŠj˜Ñ#Ô#€GÝ�'�4Ñ Ô ð KØ—K’K Ñ,Ô,ˆ	Ý�i¥Ñ&Ô&ð 	KØ—]’] 5Ñ)Ô)ˆFÝ˜&¥$Ñ'Ô'ð KØ�Ð4°f·j²jÀÑ6IÔ6IÑJÔJÐJà€Mr   Úissuec                óô   — | j         › d| j        ›d| j        ›�g}| j        r|                     d| j        › d�¦  «         | j        r|                     d| j        › d�¦  «         d                     |¦  «        S )z8One-line human-readable rendering of a retirement issue.z: u	    â†’ use z(set reasoning_effort: "z")z[note: Ú]Ú )r   r   r	   r
   r4   r   Újoin)rH   Úpartss     r   Úformat_issuerN   {   s–   € ð ÔÐUÐU Ô 3ÐUÐUÀÔ@QÐUÐUð€Eð Ôð LØ�ŠÐJ°Ô0FÐJÐJÐJÑKÔKÐKØ„zð .Ø�ŠÐ,˜uœzÐ,Ð,Ð,Ñ-Ô-Ð-Ø�8Š8�E‰?Œ?Ðr   )ÚPathc                  ó<   — e Zd ZU dZded<   ded<   ded<   ded	<   d
S )ÚApplyResultz#Outcome of an apply_migration call.rO   Ú	file_pathzOptional[Path]Úbackup_pathr-   Úissues_resolvedr'   Úconfig_changedN)r   r   r   r   r   r   r   r   rQ   rQ   ‘   sE   € € € € € € à-Ð-à€O€O�OØÐÐÑØ*Ð*Ð*Ñ*ØÐÐÑÐÐr   rQ   Úyaml_docr   Údotted_pathú'tuple[Any, str]'c                ó  — |                      d¦  «        }t          |¦  «        dk     rt          d|›�¦  «        ‚| }|dd…         D ]8}t          |t          ¦  «        r||vrt          d|›d|›�¦  «        ‚||         }Œ9||d         fS )zÞResolve a dotted slot path to (parent_mapping, leaf_key).

    Example: "auxiliary.vision.model" -> (yaml_doc["auxiliary"]["vision"], "model").
    Raises KeyError if any intermediate node is missing or not a mapping.
    ú.é   z$Path must have at least one parent: NéÿÿÿÿzPath segment z missing in )Úsplitr#   Ú
ValueErrorr)   r@   ÚKeyError)rV   rW   rM   ÚnodeÚsegments        r   Ú_walk_to_parentrb   ›   s®   € ð ×Ò˜cÑ"Ô"€EÝ
ˆ5�z„z�A‚~€~ÝÐOÀÐOÐOÑPÔPÐPØ€DØ˜˜"˜”:ð ð ˆÝ˜$¥Ñ%Ô%ð 	S¨¸Ð)<Ð)<ÝÐQ¨7ÐQÐQÀ+ÐQÐQÑRÔRÐRØ�GŒ}ˆˆØ��r”ˆ?Ðr   r   rO   r7   Úbackupc                ó  — ddl m} t          | ¦  «        } |                      ¦   «         st	          | ¦  «        ‚|st          | dg d¬¦  «        S  |d¬¦  «        }d|_        |                      d	d
¬¦  «        5 }|                     |¦  «        }ddd¦  «         n# 1 swxY w Y   |€t          | dg d¬¦  «        S g }|D ]\}	 t          ||j
        ¦  «        \  }	}
n# t          $ r Y Œ(w xY w|j        |	|
<   |j        r
|j        |	d<   |                     |¦  «         Œ]|st          | dg d¬¦  «        S d}|ret          j                             ¦   «                              d¦  «        }|                      | j        › d|› �¦  «        }t+          j        | |¦  «         ddlm} ddlm}  || ¦  «         t7          j        ¦   «         }|                     ||¦  «          || |                     ¦   «         d¬¦  «         t          | ||d¬¦  «        S )aX  Rewrite ``config_path`` in-place so each issue is resolved.

    For every issue, the model name is replaced by ``issue.replacement``. If the
    issue has ``reasoning_effort`` set (i.e. the migration is from a
    ``*-non-reasoning`` variant), a sibling ``reasoning_effort`` key is added
    or updated alongside the model.

    Uses ``ruamel.yaml`` round-trip mode so comments, key order, indentation,
    and type literals (booleans, ints) are preserved.

    A backup copy is written to
    ``<config_path>.bak-pre-migrate-xai-YYYYMMDD-HHMMSS`` before rewriting,
    unless ``backup=False``.
    r   )ÚYAMLNF)rR   rS   rT   rU   Úrt)ÚtypTÚrzutf-8)Úencodingr
   z%Y%m%d-%H%M%Sz.bak-pre-migrate-xai-)Ú$require_readable_config_before_write)Úatomic_write_text)Úpreserve_mode)Úruamel.yamlre   rO   ÚexistsÚFileNotFoundErrorrQ   Úpreserve_quotesÚopenÚloadrb   r   r_   r	   r
   r4   Ú_dtÚdatetimeÚnowÚstrftimeÚ	with_nameÚnameÚshutilÚcopy2Úhermes_cli.configrj   Úutilsrk   ÚioÚStringIOÚdumpÚgetvalue)r   r7   rc   re   ÚyamlÚfhÚdocÚresolvedrH   ÚparentÚleafrS   Útsrj   rk   Úbufs                   r   Úapply_migrationr‰   ¬   sð  € ð& !Ð Ð Ð Ð Ð å�{Ñ#Ô#€KØ×ÒÑÔð -Ý Ñ,Ô,Ð,àð 
ÝØ!ØØØ ð	
ñ 
ô 
ð 	
ð ˆ4�Dˆ>‰>Œ>€DØ€DÔØ	×	Ò	˜#¨Ð	Ñ	0Ô	0ð °BØ�iŠi˜‰mŒmˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð €{ÝØ!ØØØ ð	
ñ 
ô 
ð 	
ð ')€HØð 	ð 	ˆð	Ý*¨3°Ô0AÑBÔB‰LˆF�D�DøÝð 	ð 	ð 	àˆHð	øøøð Ô(ˆˆt‰ØÔ!ð 	@Ø).Ô)?ˆFÐ%Ñ&Ø�Š˜ÑÔÐÐàð 
ÝØ!ØØØ ð	
ñ 
ô 
ð 	
ð #'€KØð /ÝŒ\×ÒÑÔ×(Ò(¨Ñ9Ô9ˆØ!×+Ò+ØÔÐ:Ð:°bÐ:Ð:ñ
ô 
ˆõ 	Œ�[ +Ñ.Ô.Ð.àFÐFÐFÐFÐFÐFØ'Ð'Ð'Ð'Ð'Ð'à(Ð(¨Ñ5Ô5Ð5õ Œ+‰-Œ-€CØ‡I‚Iˆc�3ÑÔÐð Ð�k 3§<¢<¡>¤>ÀÐFÑFÔFÐFåØØØ Øð	ñ ô ð s$   Á8BÂBÂ!BÃCÃ
C'Ã&C')r   r   r   r   )r   r   r   r'   )r+   r,   r   r-   )rH   r   r   r   )rV   r   rW   r   r   rX   )T)r   rO   r7   r-   rc   r'   r   rQ   )r   Ú
__future__r   Údataclassesr   Útypingr   r   r   r   ÚMIGRATION_GUIDE_URLÚRETIREMENT_DATEr   r   r   r&   r*   rG   rN   rt   rs   r}   ÚpathlibrO   ry   rQ   rb   r‰   r   r   r   ú<module>r�      sP  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð QÐ Ø €ð 5?ÐTXÐcgÐ$hÐ$hØ4>ÐTXÐcgÐ$hÐ$hØ4>ÐTZÐdhÐ$iÐ$iØ4>ÐTXÐcgÐ$hÐ$hØ4>ÐTZÐdhÐ$iÐ$iØ4>ÐTXÐcgÐ$hÐ$hØ4>ÐTXÐcgÐ$hÐ$hØ4PÐfjÐtxÐ$yÐ$yð	8ð 	8€ð 	ð 	ð 	ñ 	ð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôððð ð ð ð4ð 4ð 4ð 4ð:ð :ð :ð :ðz	ð 	ð 	ð 	ð  Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø €€€ð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôððð ð ð ð( ðfð fð fð fð fð fð fr   