§
    øžyj¶Q  ã                  ó^  — U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 dZ
dZdd	d
œddd
œgZded<   ddd
œZded<   dZded<   dFd„ZdGd„ZdGd„ZdHd„ZdId„ZdJd „ZdHd!„ZdHd"„ZdKd$„ZdLdMd'„Zd(d)œdNd-„ZdOd.„ZdPd1„ZdQd3„ZdRd4„ZdRd5„ZdSd7„Z dTdUd9„Z!dVd;„Z"dUd<„Z#dWdXd?„Z$dYdB„Z%dWdZdD„Z&d[dE„Z'dS )\z:Mixture-of-Agents configuration and slash-command helpers.é    )ÚannotationsN)Údeepcopy)ÚAnyÚ__HERMES_MOA_TURN_V1__Údefaultzopenai-codexzgpt-5.5©ÚproviderÚmodelÚ
openrouterzdeepseek/deepseek-v4-prozlist[dict[str, str]]ÚDEFAULT_MOA_REFERENCE_MODELSzanthropic/claude-opus-4.8zdict[str, str]ÚDEFAULT_MOA_AGGREGATORúfloat | NoneÚDEFAULT_MOA_REFERENCE_TIMEOUTÚreturnúlist[dict[str, Any]]c                 ó>   — d„ t          t          ¦  «        D ¦   «         S )Nc                ó   — g | ]
}i |¥d di¥‘ŒS )ÚenabledT© )Ú.0Úslots     ú;/home/ragecks/.hermes/hermes-agent/hermes_cli/moa_config.pyú
<listcomp>z-_default_reference_models.<locals>.<listcomp>   s(   € ÐYÐYÐY¨$Ð%ˆtÐ%�Y Ð%Ð%ÐYÐYÐYó    )r   r   r   r   r   Ú_default_reference_modelsr      s   € ØYÐYµ(Õ;WÑ2XÔ2XÐYÑYÔYÐYr   Úvaluer   c                óf   — | �| dk    rdS 	 t          | ¦  «        S # t          t          f$ r Y dS w xY w)uF  Coerce to a float, or None when unset/blank/invalid.

    Used for optional sampling params (reference_temperature /
    aggregator_temperature) where None means 'don't send the parameter â€”
    provider default applies', matching how a single-model Hermes agent
    never sends temperature unless explicitly configured.
    NÚ )ÚfloatÚ	TypeErrorÚ
ValueError)r   s    r   Ú_coerce_float_or_noner"      sN   € ð €}˜ š˜ØˆtðÝ�U‰|Œ|ÐøÝ•zÐ"ð ð ð Øˆtˆtðøøøs   Œ ›0¯0c                óî   — | �| dk    st          | t          ¦  «        rt          S 	 t          | ¦  «        }n# t          t
          f$ r
 t          cY S w xY wt          j        |¦  «        r|dk    rt          S |S )uæ  Return a finite positive advisor timeout, or None to inherit.

    ``None`` (the default) means "no per-preset override": the reference
    fan-out inherits the ``auxiliary.moa_reference.timeout`` config value
    (900s by default) via ``call_llm``'s own resolution, exactly like every
    other auxiliary task. An explicit finite positive per-preset value is
    honored as-is â€” no artificial cap, since long-thinking advisor models
    legitimately run far beyond five minutes.
    Nr   r   )Ú
isinstanceÚboolr   r   r    r!   ÚmathÚisfinite)r   Útimeouts     r   Ú_coerce_reference_timeoutr)   /   sˆ   € ð €}˜ š˜¥z°%½Ñ'>Ô'>˜Ý,Ð,ð-Ý˜‘,”,ˆˆøÝ•zÐ"ð -ð -ð -Ý,Ð,Ð,Ð,ð-øøøåŒ=˜Ñ!Ô!ð - W°¢\ \Ý,Ð,Ø€Ns   ¦6 ¶AÁAÚstrc                ó|   — t          | pd¦  «                             ¦   «                              ¦   «         }|dv r|ndS )zENormalize failed-advisor disclosure policy; unknown values fail loud.Úloud>   r,   Úsilent©r*   ÚstripÚlower)r   Úpolicys     r   Ú!_coerce_degraded_reference_policyr2   D   s@   € å��˜&Ñ!Ô!×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1€FØÐ1Ð1Ð1ˆ6ˆ6°vÐ=r   Úintc                óÔ   — | �| dk    r|S 	 t          | ¦  «        S # t          t          f$ r; 	 t          t          | ¦  «        ¦  «        cY S # t          t          f$ r |cY cY S w xY ww xY w)Nr   ©r3   r    r!   r   )r   r   s     r   Ú_coerce_intr6   J   s‘   € Ø€}˜ š˜ØˆðÝ�5‰zŒzÐøÝ•zÐ"ð ð ð ð	Ý•u˜U‘|”|Ñ$Ô$Ð$Ð$Ð$øÝ�:Ð&ð 	ð 	ð 	ØˆNˆNˆNˆNˆNð	øøøðøøøs,   Œ ›A'­AÁA'ÁA#ÁA'Á"A#Á#A'ú
int | Nonec                óè   — | �| dk    rdS 	 t          | ¦  «        }nN# t          t          f$ r: 	 t          t          | ¦  «        ¦  «        }n# t          t          f$ r Y Y dS w xY wY nw xY w|dk    r|ndS )uà   Coerce to a positive int, or None when unset/blank/invalid/non-positive.

    Used for optional caps (e.g. reference_max_tokens) where None means
    'no cap' â€” the safe default that preserves prior uncapped behavior.
    Nr   r   r5   )r   Úns     r   Ú_coerce_int_or_noner:   V   s¦   € ð €}˜ š˜ØˆtðÝ�‰JŒJˆˆøÝ•zÐ"ð ð ð ð	Ý•E˜%‘L”LÑ!Ô!ˆAˆAøÝ�:Ð&ð 	ð 	ð 	Ø�4�4�4ð	øøøð ˆAðøøøð
 �A’�ˆ1ˆ1˜4Ðs2   Œ œA'®AÁ
A'ÁA!ÁA'Á A!Á!A'Á&A'c                ó„  — t          | t          ¦  «        rˆt          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }|dk    r8t          |                      d¦  «        d¦  «        }|dk    rd|› �S |dk    rd	nd
S |} t          | pd¦  «                             ¦   «                              ¦   «         }|dv r|S |                     d¦  «        rR|                     d¦  «        \  }}}|r"t          |                     ¦   «         d¦  «        nd}|dk    rd|› �S |dk    rd	S d
S )up  Normalize the fan-out cadence; unknown values fall back to default.

    Canonical values are the strings ``per_iteration``, ``user_turn``, and
    ``every_n:<N>`` (N >= 2). The ``every_n`` cadence also accepts the mapping
    form ``{mode: every_n, n: N}`` from hand-edited YAML and normalizes it to
    the canonical string, so the rest of the pipeline (presets, flattened
    view, runtime) only ever sees one shape. ``every_n:1`` semantically means
    "run every iteration" and collapses to ``per_iteration``; anything
    unparseable falls back to ``user_turn`` (the default â€” cheapest cadence;
    see #67199).
    Úmoder   Úevery_nr9   r   é   zevery_n:é   Úper_iterationÚ	user_turn>   rA   r@   ú:)	r$   Údictr*   Úgetr/   r0   r6   Ú
startswithÚ	partition)r   r<   r9   Ú_ÚsepÚrests         r   Ú_coerce_fanoutrJ   h   sL  € õ �%�ÑÔð 	õ �5—9’9˜VÑ$Ô$Ð*¨Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;ˆØ�9ÒÐÝ˜EŸIšI c™NœN¨AÑ.Ô.ˆAØ�AŠvˆvØ% !�~�~Ð%Ø&'¨1¢f f�?�?°+Ð=ØˆÝˆuˆ{˜ÑÔ×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+€DØÐ-Ð-Ð-ØˆØ‡‚�yÑ!Ô!ð #Ø—~’~ cÑ*Ô*‰ˆˆ3�Ø,/Ð6�K˜Ÿ
š
™œ aÑ(Ô(Ð(°QˆØ�Š6ˆ6Ø!˜a�>�>Ð!Ø�Š6ˆ6Ø"�?Øˆ;r   c                ó    — | du rdS | �| du rdS t          | ¦  «                             ¦   «                              ¦   «         }|dv r|S |dv rdS dS )uè  Normalize ``moa.privacy_filter`` to '' (off), 'display', or 'full'.

    - ``''`` (empty string): filter off â€” the default. ``false``/``None``/
      unknown values land here so a hand-edited config degrades to prior
      behavior (tolerant-read contract).
    - ``'display'``: redact user-visible surfaces only â€” the reference blocks
      shown in the UI and the saved MoA trace records. The aggregator still
      sees raw advisor text, so answer quality is unaffected.
    - ``'full'``: additionally redact the advisor text injected into the
      aggregator prompt (issue #59959's literal ask). A hand-edited boolean
      ``true`` maps here because the issue framed the toggle as "redact
      before passing to the aggregator".
    TÚfullNFr   >   rL   Údisplay>   Ú1ÚonÚyesÚtruer.   )r   r<   s     r   Úcoerce_privacy_filterrR   ‹   sn   € ð �€}€}ØˆvØ€}˜ ˜˜ØˆrÝˆu‰:Œ:×ÒÑÔ×#Ò#Ñ%Ô%€DØÐ"Ð"Ð"ØˆØÐ)Ð)Ð)ØˆvØˆ2r   ú
str | Nonec                ó˜   — ddl m} | �| du rdS  || ¦  «        }|€dS |                     d¦  «        du rdS |                     d¦  «        S )	zIReturn a canonical per-slot reasoning effort, or None when unset/invalid.r   )Úparse_reasoning_effortNTr   FÚnoneÚeffort)Úhermes_constantsrU   rD   )r   rU   Úparseds      r   Ú_clean_reasoning_effortrZ   ¥   sn   € à7Ð7Ð7Ð7Ð7Ð7à€}˜ ˜˜ØˆtØ#Ð# EÑ*Ô*€FØ€~ØˆtØ‡z‚z�)ÑÔ Ð%Ð%ØˆvØ�:Š:�hÑÔÐr   Tr%   c                óè   — | €|S t          | t          ¦  «        r| S t          | t          ¦  «        r4|                      ¦   «                              ¦   «         }|dv rdS |dv rdS |S t          | ¦  «        S )N>   Ú0ÚnoÚoffÚfalseF>   rN   rO   rP   rQ   T)r$   r%   r*   r/   r0   )r   r   Útexts      r   Ú_coerce_boolra   ³   s�   € Ø€}ØˆÝ�%�ÑÔð ØˆÝ�%�ÑÔð Ø�{Š{‰}Œ}×"Ò"Ñ$Ô$ˆØÐ.Ð.Ð.Ø�5ØÐ-Ð-Ð-Ø�4ØˆÝ�‰;Œ;Ðr   F©Úinclude_enabledr   rc   údict[str, Any] | Nonec               óJ  — t          | t          ¦  «        sd S t          |                      d¦  «        pd¦  «                             ¦   «         }t          |                      d¦  «        pd¦  «                             ¦   «         }|r|sd S |                     ¦   «         dk    rd S ||dœ}t          |                      d¦  «        ¦  «        }|r||d<   t          |                      d¦  «        ¦  «        }|�||d<   |r&t          |                      d¦  «        d	¦  «        |d<   |S )
Nr	   r   r
   Úmoar   Úreasoning_effortÚ
max_tokensr   T)	r$   rC   r*   rD   r/   r0   rZ   r:   ra   )r   rc   r	   r
   ÚcleanrW   Úslot_mts          r   Ú_clean_slotrk   Â   s0  € Ý�d�DÑ!Ô!ð ØˆtÝ�4—8’8˜JÑ'Ô'Ð-¨2Ñ.Ô.×4Ò4Ñ6Ô6€HÝ�—’˜Ñ!Ô!Ð' RÑ(Ô(×.Ò.Ñ0Ô0€EØð ˜5ð Øˆtð ‡~‚~ÑÔ˜5Ò Ð ØˆtØ)1¸EÐBÐB€EÝ$ T§X¢XÐ.@Ñ%AÔ%AÑBÔB€FØð +Ø$*ˆÐ Ñ!õ " $§(¢(¨<Ñ"8Ô"8Ñ9Ô9€GØÐØ%ˆˆlÑØð CÝ'¨¯ª°Ñ(;Ô(;¸TÑBÔBˆˆiÑØ€Lr   c                ód  — t          | t          ¦  «        sdS t          |                      d¦  «        pd¦  «                             ¦   «         }t          |                      d¦  «        pd¦  «                             ¦   «         }|s|sdS |sdS |sd|› d�S |                     ¦   «         d	k    rd
S dS )a/  Return a human-readable problem for a slot ``_clean_slot`` would drop.

    None means the slot is complete and valid. Mirrors ``_clean_slot`` exactly
    so the write-boundary validator (``validate_moa_payload``) and the
    tolerant runtime normalizer can never disagree about what is acceptable.
    z-must be an object with 'provider' and 'model'r	   r   r
   zprovider and model are requiredzprovider is requiredzmodel is required (provider 'z' has no model selected)rf   zMthe Mixture of Agents provider cannot be used inside a preset (recursive MoA)N)r$   rC   r*   rD   r/   r0   )r   r	   r
   s      r   Ú_slot_problemrm   á   sÍ   € õ �d�DÑ!Ô!ð ?Ø>Ð>Ý�4—8’8˜JÑ'Ô'Ð-¨2Ñ.Ô.×4Ò4Ñ6Ô6€HÝ�—’˜Ñ!Ô!Ð' RÑ(Ô(×.Ò.Ñ0Ô0€EØð 1˜Eð 1Ø0Ð0Øð &Ø%Ð%Øð RØQ¨xÐQÐQÐQÐQØ‡~‚~ÑÔ˜5Ò Ð Ø^Ð^Øˆ4r   Úrawú	list[str]c           
     ód  — t          | t          ¦  «        sdgS |                      d¦  «        }t          |t          ¦  «        r|r|}n	t          | i}g }|                     ¦   «         D �]G\  }}t          |pd¦  «                             ¦   «         pd}t          |t          ¦  «        s|                     d|› d�¦  «         ŒZ|                     d¦  «        }t          |t          ¦  «        st          |t          ¦  «        r|gng }d}t          |¦  «        D ]=\  }	}
t          |
¦  «        }|r"|                     d|› d	|	d
z   › d|› �¦  «         Œ8|d
z  }Œ>|s|                     d|› d�¦  «         t          |                     d¦  «        ¦  «        }|r|                     d|› d|› �¦  «         �ŒI|S )ue  Return the problems ``normalize_moa_config`` would silently paper over.

    ``normalize_moa_config`` is deliberately tolerant: at *read* time a
    hand-edited config must degrade to defaults rather than crash the agent.
    That same tolerance at *write* time is a corruption engine â€” a client that
    sends a half-filled slot gets its whole preset silently replaced with the
    hardcoded defaults (#64156). API write paths call this first and reject
    invalid payloads loudly instead of saving something the user never chose.

    Returns a list of human-readable problems; empty means safe to save.
    zMoA config must be an objectÚpresetsr   z	(unnamed)zpreset 'z': must be an objectÚreference_modelsr   z' reference r?   z: z.': needs at least one complete reference modelÚ
aggregatorz' aggregator: )r$   rC   rD   ÚDEFAULT_MOA_PRESET_NAMEÚitemsr*   r/   ÚappendÚlistÚ	enumeraterm   )rn   Úpresets_rawrq   ÚproblemsÚnameÚpresetÚlabelÚrefsÚcomplete_refsÚindexr   ÚissueÚ	agg_issues                r   Úvalidate_moa_payloadrƒ   ÷   sò  € õ �c�4Ñ Ô ð 0Ø.Ð/Ð/à—'’'˜)Ñ$Ô$€KÝ�+�tÑ$Ô$ð 1¨ð 1Ø"-ˆˆõ +¨CÐ0ˆà€HØŸš™œð Iñ I‰ˆˆfÝ�D�J˜B‘”×%Ò%Ñ'Ô'Ð6¨;ˆÝ˜&¥$Ñ'Ô'ð 	Ø�OŠOÐB uÐBÐBÐBÑCÔCÐCØà�zŠzÐ,Ñ-Ô-ˆÝ˜$¥Ñ%Ô%ð 	<Ý'¨­dÑ3Ô3Ð;�D�6�6¸ˆDØˆÝ$ T™?œ?ð 	#ð 	#‰KˆE�4Ý! $Ñ'Ô'ˆEØð #Ø—’Ð R¨5Ð RÐ R¸eÀa¹iÐ RÐ RÈ5Ð RÐ RÑSÔSÐSÐSà Ñ"��Øð 	^Ø�OŠOÐ\ uÐ\Ð\Ð\Ñ]Ô]Ð]å! &§*¢*¨\Ñ":Ô":Ñ;Ô;ˆ	Øð 	IØ�OŠOÐG uÐGÐG¸IÐGÐGÑHÔHÐHùà€Or   údict[str, Any]c                 ób   — t          ¦   «         t          t          ¦  «        d d t          ddd dddœ
S )Nr,   é   rA   T)
rr   rs   Úreference_temperatureÚaggregator_temperatureÚreference_timeoutÚdegraded_reference_policyrh   Úreference_max_tokensÚfanoutr   )r   r   r   r   r   r   r   Ú_default_presetr�   (  s@   € å5Ñ7Ô7ÝÕ5Ñ6Ô6ð "&Ø"&Ý:Ø%+ØØ $ØØðð ð r   c                ó$  — t          | t          ¦  «        si } |                      d¦  «        }t          |t          ¦  «        r4	 t	          j        |¦  «        }n# t          j        t          f$ r g }Y nw xY wt          |t          ¦  «        st          |t          ¦  «        r|gng }d„ |D ¦   «         }d„ |D ¦   «         }|st          ¦   «         }t          |                      d¦  «        ¦  «        pt          t          ¦  «        }t          |                      d¦  «        d¦  «        ||t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d	¦  «        ¦  «        t!          |                      d
¦  «        ¦  «        t#          |                      d¦  «        d¦  «        t%          |                      d¦  «        ¦  «        t'          |                      d¦  «        ¦  «        dœ
S )Nrr   c                ó0   — g | ]}t          |d ¬¦  «        ‘ŒS )Trb   )rk   ©r   Úitems     r   r   z%_normalize_preset.<locals>.<listcomp>I  s%   € ÐIÐIÐI¸�K˜¨dÐ3Ñ3Ô3ÐIÐIÐIr   c                ó   — g | ]}|®|‘ŒS ©Nr   r�   s     r   r   z%_normalize_preset.<locals>.<listcomp>J  s   € Ð6Ð6Ð6�T TÐ%5ˆDÐ%5Ð%5Ð%5r   rs   r   Tr‡   rˆ   r‰   rŠ   rh   r†   r‹   rŒ   )
r   rr   rs   r‡   rˆ   r‰   rŠ   rh   r‹   rŒ   )r$   rC   rD   r*   ÚjsonÚloadsÚJSONDecodeErrorr!   rw   r   rk   r   r   ra   r"   r)   r2   r6   r:   rJ   )rn   Úraw_refsr~   rs   s       r   Ú_normalize_presetr˜   9  sò  € Ý�c�4Ñ Ô ð Øˆà�wŠwÐ)Ñ*Ô*€Hå�(�CÑ Ô ð ð	Ý”z (Ñ+Ô+ˆHˆHøÝÔ$¥jÐ1ð 	ð 	ð 	ØˆHˆHˆHð	øøøå�h¥Ñ%Ô%ð Dõ ",¨HµdÑ!;Ô!;ÐC�H�:�:ÀˆØIÐIÀÐIÑIÔI€DØ6Ð6˜TÐ6Ñ6Ô6€DØð +Ý(Ñ*Ô*ˆå˜SŸWšW \Ñ2Ô2Ñ3Ô3ÐWµxÕ@VÑ7WÔ7W€Jõ   §¢¨	Ñ 2Ô 2°DÑ9Ô9Ø Ø Ý!6°s·w²wÐ?VÑ7WÔ7WÑ!XÔ!XÝ"7¸¿ºÐ@XÑ8YÔ8YÑ"ZÔ"ZÝ6°s·w²wÐ?RÑ7SÔ7SÑTÔTÝ%FØ�GŠGÐ/Ñ0Ô0ñ&
ô &
õ " #§'¢'¨,Ñ"7Ô"7¸Ñ>Ô>õ !4°C·G²GÐ<RÑ4SÔ4SÑ TÔ Tõ ! §¢¨Ñ!2Ô!2Ñ3Ô3ðA!ð !ð !s   ÁA ÁA3Á2A3c                ó  — t          | t          ¦  «        si } |                      d¦  «        }i }t          |t          ¦  «        rQ|                     ¦   «         D ]<\  }}t	          |pd¦  «                             ¦   «         }|rt          |¦  «        ||<   Œ=|st          | ¦  «        |t          <   t	          |                      d¦  «        pd¦  «                             ¦   «         }|r||vr"t          t          |¦  «        t          ¦  «        }||vrt          ¦   «         ||<   t	          |                      d¦  «        pd¦  «                             ¦   «         }||vrd}||         }|||t          |d         ¦  «        t          |d         ¦  «        |d         |d         |d	         |d
         |d         |                     d¦  «        |                     dd¦  «        |d         t          |                      d¦  «        ¦  «        dœS )zºReturn validated MoA config with named presets.

    Backward compatible with the first PR shape where ``moa`` itself contained
    ``reference_models`` and ``aggregator`` directly.
    rq   r   Údefault_presetÚactive_presetrr   rs   r‡   rˆ   r‰   rŠ   rh   r‹   rŒ   rA   r   Úprivacy_filter)rš   r›   rq   rr   rs   r‡   rˆ   r‰   rŠ   rh   r‹   rŒ   r   rœ   )r$   rC   rD   ru   r*   r/   r˜   rt   ÚnextÚiterr�   r   rR   )	rn   ry   rq   r{   r|   Ú
clean_nameÚdefault_nameÚactive_nameÚactives	            r   Únormalize_moa_configr£   t  s  € õ �c�4Ñ Ô ð Øˆà—'’'˜)Ñ$Ô$€KØ)+€GÝ�+�tÑ$Ô$ð @Ø'×-Ò-Ñ/Ô/ð 	@ð 	@‰LˆD�&Ý˜T˜Z R™œ×.Ò.Ñ0Ô0ˆJØð @Ý&7¸Ñ&?Ô&?�˜
Ñ#øð ð BÝ+<¸SÑ+AÔ+AˆÕ'Ñ(å�s—w’wÐ/Ñ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?€LØð D˜<¨wÐ6Ð6Ý�D ™MœMÕ+BÑCÔCˆØ˜7Ð"Ð"Ý /Ñ 1Ô 1ˆ�Ñå�c—g’g˜oÑ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=€KØ˜'Ð!Ð!Øˆà�\Ô"€Fà&Ø$Øå$ VÐ,>Ô%?Ñ@Ô@Ý˜v lÔ3Ñ4Ô4Ø!'Ð(?Ô!@Ø"(Ð)AÔ"BØ#Ð$7Ô8Ø%+Ð,GÔ%HØ˜\Ô*Ø &§
¢
Ð+AÑ BÔ BØ—*’*˜X {Ñ3Ô3Ø˜)Ô$õ 0°·²Ð8HÑ0IÔ0IÑJÔJð%ð ð r   Úconfigc                ón   — t          | ¦  «        }t          |d                              ¦   «         ¦  «        S )Nrq   )r£   rw   Úkeys)r¤   Úcfgs     r   Úlist_moa_presetsr¨   ª  s-   € Ý
˜vÑ
&Ô
&€CÝ��I”×#Ò#Ñ%Ô%Ñ&Ô&Ð&r   r{   c                ó\  — t          | ¦  «        }t          |p|                     d¦  «        pt          ¦  «                             ¦   «         }|d                              |¦  «        }|€5ddlm} d                     |d         ¦  «        pd} |d|› d|› d	�¦  «        ‚t          |¦  «        S )
Nrš   rq   r   )ÚMoAPresetNotFoundErrorz, z(none)zMoA preset 'z$' was not found. Available presets: z. Run `hermes moa list`.)	r£   r*   rD   rt   r/   Úagent.errorsrª   Újoinr   )r¤   r{   r§   Úpreset_namer|   rª   Ú	availables          r   Úresolve_moa_presetr¯   ¯  sÐ   € Ý
˜vÑ
&Ô
&€CÝ�dÐR˜cŸgšgÐ&6Ñ7Ô7ÐRÕ;RÑSÔS×YÒYÑ[Ô[€KØ�Œ^×Ò Ñ,Ô,€FØ€~Ø7Ð7Ð7Ð7Ð7Ð7à—I’I˜c )œnÑ-Ô-Ð9°ˆ	Ø$Ð$ð3˜;ð 3ð 3Øð3ð 3ð 3ñ
ô 
ð 	
õ �FÑÔÐr   r`   c                óÜ   — t          |pd¦  «                             ¦   «         }|sdS t          | ¦  «        }|d                              |¦  «        }|�|                     dd¦  «        sdS |S )aï  Return the preset name iff ``text`` exactly matches an *enabled* preset.

    Used by the no-explicit-provider switch path (PATH B in
    ``hermes_cli/model_switch.py``) to recognize a bare ``/model <preset>``
    that the user typed without the ``moa:`` prefix. This is an *implicit*
    match, so it must honor the per-preset ``enabled`` opt-out: a user who set
    ``enabled: false`` to disable a preset must not have a plain model switch
    whose name happens to collide with that preset key silently pivot the
    session onto the MoA virtual provider (issue #55187). Explicit selection
    via ``--provider moa`` / the model picker does not go through here, so a
    disabled preset is still reachable when the user explicitly asks for it.
    r   Nrq   r   T)r*   r/   r£   rD   )r¤   r`   Úwantedr§   r|   s        r   Úexact_moa_preset_namer²   ¾  sq   € õ ��˜‰_Œ_×"Ò"Ñ$Ô$€FØð ØˆtÝ
˜vÑ
&Ô
&€CØ�Œ^×Ò Ñ'Ô'€FØ€~˜VŸZšZ¨	°4Ñ8Ô8€~ØˆtØ€Mr   c                óª   — t          | ¦  «        }t          |pd¦  «                             ¦   «         }|r||d         vrt          |¦  «        ‚||d<   |S )Nr   rq   r›   )r£   r*   r/   ÚKeyError)r¤   r{   r§   ri   s       r   Úset_active_moa_presetrµ   Õ  s[   € Ý
˜vÑ
&Ô
&€CÝ��
˜‰OŒO×!Ò!Ñ#Ô#€EØð �˜c )œnÐ,Ð,Ý�u‰oŒoÐØ €CˆÑØ€Jr   Úpromptr|   c                óþ   — t          | pd¦  «        t          |pi |¦  «        dœ}t          j        t	          j        |dd¬¦  «                             d¦  «        ¦  «                             d¦  «        }t          › |› �S )zBEncode a /moa one-shot turn for frontends that can only send text.r   )r¶   r¤   )ú,rB   F)Ú
separatorsÚensure_asciiúutf-8Úascii)	r*   r¯   Úbase64Úurlsafe_b64encoder”   ÚdumpsÚencodeÚdecodeÚMOA_MARKER_PREFIX)r¶   r¤   r|   ÚpayloadÚencodeds        r   Úencode_moa_turnrÅ   Þ  s‡   € õ �f�l Ñ#Ô#Ý$ V \¨r°6Ñ:Ô:ðð €Gõ Ô&ÝŒ
�7 zÀÐFÑFÔF×MÒMÈgÑVÔVñô ç‚fˆW�o„oð õ  Ð* Ð*Ð*Ð*r   Úmessageú!tuple[str, dict[str, Any] | None]c                ó  — t          | t          ¦  «        r|                      t          ¦  «        s| dfS | t	          t          ¦  «        d…                              ¦   «         }	 t          j        t          j	        | 
                    d¦  «        ¦  «                             d¦  «        ¦  «        }n# t          $ r | dfcY S w xY wt          |                     d¦  «        pd¦  «        }|t          |                     d¦  «        pi ¦  «        fS )z%Decode a hidden /moa one-shot marker.Nr¼   r»   r¶   r   r¤   )r$   r*   rE   rÂ   Úlenr/   r”   r•   r½   Úurlsafe_b64decoderÀ   rÁ   Ú	ExceptionrD   r˜   )rÆ   rÄ   rÃ   r¶   s       r   Údecode_moa_turnrÌ   ê  s  € å�g�sÑ#Ô#ð ¨7×+=Ò+=Õ>OÑ+PÔ+Pð Ø˜ˆ}ÐØ•cÕ+Ñ,Ô,Ð-Ð-Ô.×4Ò4Ñ6Ô6€GðÝ”*�VÔ5°g·n²nÀWÑ6MÔ6MÑNÔN×UÒUÐV]Ñ^Ô^Ñ_Ô_ˆˆøÝð ð ð Ø˜ˆ}ÐÐÐðøøøå�—’˜XÑ&Ô&Ð,¨"Ñ-Ô-€FØÕ$ W§[¢[°Ñ%:Ô%:Ð%@¸bÑAÔAÐAÐAs   Á#AB0 Â0CÃ CÚuser_promptc                ó&   — t          | ||¬¦  «        S )z>Build the hidden one-shot payload used by TUI/gateway routing.)r|   )rÅ   )rÍ   r¤   r|   s      r   Úbuild_moa_turn_promptrÏ   ÷  s   € å˜;¨°vÐ>Ñ>Ô>Ð>r   c                 ó   — dS )NzŸUsage: /moa <prompt>  (runs one prompt through the default MoA preset, then restores your model; pick a preset from the model picker to switch for the session)r   r   r   r   Ú	moa_usagerÑ   ü  s   € ð mð  mr   )r   r   )r   r   r   r   )r   r   r   r*   )r   r   r   r3   r   r3   )r   r   r   r7   )r   r   r   rS   )T)r   r   r   r%   r   r%   )r   r   rc   r%   r   rd   )r   r   r   rS   )rn   r   r   ro   )r   r„   )rn   r   r   r„   )r¤   r   r   ro   r“   )r¤   r   r{   rS   r   r„   )r¤   r   r`   r*   r   rS   )NN)r¶   r*   r¤   r   r|   rS   r   r*   )rÆ   r   r   rÇ   )rÍ   r*   r¤   r   r|   rS   r   r*   )r   r*   )(Ú__doc__Ú
__future__r   r½   r”   r&   Úcopyr   Útypingr   rÂ   rt   r   Ú__annotations__r   r   r   r"   r)   r2   r6   r:   rJ   rR   rZ   ra   rk   rm   rƒ   r�   r˜   r£   r¨   r¯   r²   rµ   rÅ   rÌ   rÏ   rÑ   r   r   r   ú<module>r×      sü  ðØ @Ð @Ð @à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à,Ð Ø#Ð ð  ¨)Ð4Ð4ØÐ(BÐCÐCð6Ð ð ð ð ñ ð Ø(ð*ð *Ð ð ð ð ñ ð
 /3Ð Ð 2Ð 2Ð 2Ñ 2ðZð Zð Zð Zðð ð ð ð ð ð ð ð*>ð >ð >ð >ð	ð 	ð 	ð 	ð ð  ð  ð  ð$ ð  ð  ð  ðFð ð ð ð4 ð  ð  ð  ðð ð ð ð ð 7<ð ð ð ð ð ð ð>ð ð ð ð,.ð .ð .ð .ðbð ð ð ð"8ð 8ð 8ð 8ðv3ð 3ð 3ð 3ðl'ð 'ð 'ð 'ð
ð ð ð ð ðð ð ð ð.ð ð ð ð	+ð 	+ð 	+ð 	+ð 	+ð
Bð 
Bð 
Bð 
Bð?ð ?ð ?ð ?ð ?ð
mð mð mð mð mð mr   