+
    jHàj’Œ  ã                  ó   a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t
^ RIHtHtHt ^ RIHtHtHt ^ RIHtHtHt ]Ry,          tRzt^<tRsR]R&   ]P6                  ! 4       tRsR]R	&   ]! R
R7       ! R R4      4       t]! R
R7       ! R R4      4       t]! R
R7       ! R R4      4       t ]! R
R7       ! R R4      4       t!Rt"Rt#Rt$R R lt%R R lt&]! R
R7       ! R R4      4       t'R{R R llt(R{R R  llt)R! R" lt*R#R$R%R
R&RR'R(/R) R* llt+R'R(/R+ R, llt,R- R. lt-R/R(R0^</R1 R2 llt.R3 R4 lt/R5R(/R6 R7 llt0R8 R9 lt1R: R; lt2R< R= lt3R> R? lt4R@ RA lt5RB RC lt6RD RE lt7RF RG lt8RH RI lt9RJ RK lt:R{RL RM llt;RN RO lt<RP RQ lt=RR RS lt>RT RU lt?RV RW lt@RXRRYRRZR/R[ R\ lltAR] R^ ltBR_ R` ltCRa Rb ltDRc Rd ltERe Rf ltFRg Rh ltGRi Rj ltHRk Rl ltIRm Rn ltJR]GRo]HRpRq RrRs Rt]JRuRv /tKRw Rx ltLR# )|z3Normalized Nous Portal account entitlement helpers.)ÚannotationsN)Ú	dataclassÚfieldÚfields)ÚdatetimeÚtimezoneÚUTC)ÚAnyÚLiteralÚOptionalz/tuple[str, float, NousPortalAccountInfo] | NoneÚ_account_info_cacheúOptional[str]Ú_account_info_identityT)Úfrozenc                  óz   € ] tR t^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# )ÚNousPortalSubscriptionInfoNr   ÚplanúOptional[int]ÚtierúOptional[float]Úmonthly_chargeÚmonthly_creditsÚcurrent_period_endÚcredits_remainingÚrollover_credits© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__annotations__r   r   r   r   r   r   Ú__static_attributes__r   ó    Ú</home/ubuntu/.hermes/hermes-agent/hermes_cli/nous_account.pyr   r      sK   ‡ à€Dˆ-ÓØ€Dˆ-ÓØ&*€N�OÓ*Ø'+€O�_Ó+Ø(,Ð˜Ó,Ø)-Ð�Ó-Ø(,Ð�o×,r"   r   c                  óø   € ] tR t^*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]R&   RtR# )ÚNousPaidServiceAccessInfoNúOptional[bool]ÚallowedÚpaid_accessr   ÚreasonÚorganisation_idr   Úeffective_at_msÚhas_active_subscriptionÚactive_subscription_is_paidÚsubscription_tierr   Úsubscription_monthly_chargeÚsubscription_credits_remainingÚpurchased_credits_remainingÚtotal_usable_creditsÚmember_spend_cap_exceededÚmember_spend_cap_usdÚmember_spend_usdÚmember_spend_cap_remaining_usdr   )r   r   r   r   r'   r    r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r!   r   r"   r#   r%   r%   *   s­   ‡ à"€Gˆ^Ó"Ø"&€K�Ó&Ø €FˆMÓ Ø%)€O�]Ó)Ø%)€O�]Ó)Ø.2Ð˜^Ó2Ø26Ð Ó6Ø'+Ð�}Ó+Ø37Ð Ó7Ø6:Ð" OÓ:Ø37Ð Ó7Ø,0Ð˜/Ó0Ø04Ð˜~Ó4Ø,0Ð˜/Ó0Ø(,Ð�oÓ,Ø6:Ð" O×:r"   r%   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# )ÚNousUsageWindowInfoa  Portal ``usage_window`` block: a usage-window plan's allowances (``gauges``, the server's list in
display order; see agent/usage_gauges.py), auto top-up, a paused reason while the plan's renewal is
unpaid, and the plan's picks. Absent from the account body for every other account.NúOptional[tuple[Any, ...]]ÚgaugesúOptional[tuple[str, ...]]Úfeatured_model_idsr&   Úauto_top_up_enabledr   Úpaused_reasonÚkeep_going_on_creditsr   )r   r   r   r   Ú__doc__r:   r    r<   r=   r>   r?   r!   r   r"   r#   r8   r8   >   sE   ‡ ñ[ð
 )-€FÐ%Ó,ð 59ÐÐ1Ó8Ø*.Ð˜Ó.Ø#'€M�=Ó'ð -1Ð˜>×0r"   r8   c                  óF   € ] tR t^Pt$ RtRtR]R&   ]! ]R7      t	R]R&   Rt
R	# )
ÚNousToolAccessInfozìFree tool-pool entitlement (Portal ``tool_access``), decoupled from paid/billing access.

``enabled``: a positive pool balance is live and not gated off; ``coverage``: tool category ->
whether the pool funds it (FAL video is excluded).
FÚboolÚenabled)Údefault_factoryzdict[str, bool]Úcoverager   N)r   r   r   r   r@   rD   r    r   ÚdictrF   r!   r   r"   r#   rB   rB   P   s"   ‡ ñð €GˆTÓÙ %°dÔ ;€Hˆo×;r"   rB   Ú	anonymousz5This needs a Nous account. Run `hermes auth upgrade`.z1This needs a Nous account. Use /login to sign in.c               ó    € V ^8„  d   QhRRRR/# )é   Úaccount_infoúOptional[NousPortalAccountInfo]ÚreturnrC   r   )Úformats   "r#   Ú__annotate__rO   b   s   € ÷ Gñ GÐ%Dð GÈñ Gr"   c                ó2   € V R J;'       d    V P                   # ©N)Úis_anonymous_tier)rK   s   &r#   Ú_is_anonymous_tierrS   b   s   € Ø˜tÐ#×FÐF¨×(FÑ(FÐFr"   c               ó    € V ^8„  d   QhRRRR/# )rJ   ÚvalueÚobjectrM   Ústrr   )rN   s   "r#   rO   rO   f   s   € ÷ Cñ C˜6ð C cñ Cr"   c                ón   € \        V \        4      '       d   V P                  4       P                  4       # R# )zÒTier claims arrive verbatim from the JWT claim or the account payload, neither of which
strips or casefolds. Compare them normalized so casing or padding can never turn the
anonymous tier into a registered one.Ú )Ú
isinstancerW   ÚstripÚlower©rU   s   &r#   Ú_normalize_tierr^   f   s*   € ô %/¨u´c×$:Ò$:ˆ5�;‰;‹=×ÑÓ ÐBÀÐBr"   c                  ó   € ] tR t^mt$ 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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]R%&   RtR]R&&   RtR]R'&   ]R( R) l4       t]R* R+ l4       t]R, R- l4       t ]R. R/ l4       t!R0 R1 lt"]R2 R3 l4       t#R4t$R# )5ÚNousPortalAccountInforC   Ú	logged_inÚNousAccountInfoSourceÚsourceÚfreshNr   Úuser_idÚorg_idÚorg_slugÚorg_nameÚ	client_idÚ
product_idÚnous_clientÚportal_base_urlÚinference_base_urlFÚinference_credential_presentÚcredential_sourcezOptional[datetime]Ú
expires_atÚemailÚ	privy_didú$Optional[NousPortalSubscriptionInfo]Úsubscriptionr&   Úpaid_service_accessz#Optional[NousPaidServiceAccessInfo]Úpaid_service_access_infoúOptional[NousToolAccessInfo]Útool_accesszOptional[NousUsageWindowInfo]Úusage_windowúOptional[dict[str, Any]]Ú
raw_claimsÚraw_accountÚerrorÚaccount_tierÚmanaged_toolsc               ó   € V ^8„  d   QhRR/# ©rJ   rM   rC   r   )rN   s   "r#   rO   Ú"NousPortalAccountInfo.__annotate__�   s   € ÷ 0ñ 0˜ñ 0r"   c                	ó   € V P                   R J # )T©ru   ©Úselfs   &r#   Úis_paidÚNousPortalAccountInfo.is_paid�   s   € à×'Ñ'¨4Ð/Ð/r"   c               ó   € V ^8„  d   QhRR/# r�   r   )rN   s   "r#   rO   r‚   ”   s   € ÷ Hñ H 4ñ Hr"   c                ó:   € \        V P                  4      \        8H  # )u›   The free tier: no Nous account, so no billing, credits, or entitlement to speak of.
Compared case- and whitespace-insensitively â€” the claim is wire data.)r^   r~   Ú_ANON_ACCOUNT_TIERr…   s   &r#   rR   Ú'NousPortalAccountInfo.is_anonymous_tier“   s   € ô ˜t×0Ñ0Ó1Ô5GÑGÐGr"   c               ó   € V ^8„  d   QhRR/# r�   r   )rN   s   "r#   rO   r‚   š   s   € ÷ 1ñ 1˜dñ 1r"   c                	ó   € V P                   R J # )Fr„   r…   s   &r#   Úis_free_tierÚ"NousPortalAccountInfo.is_free_tier™   s   € à×'Ñ'¨5Ð0Ð0r"   c               ó   € V ^8„  d   QhRR/# r�   r   )rN   s   "r#   rO   r‚   ž   s   € ÷ gñ g tñ gr"   c                ó”   € V P                   RJ ;'       g4    \        V P                  ;'       d    V P                  P                  4      # )zUPaid access OR a live free tool pool; use ``tool_gateway_entitled_for`` per category.T)ru   rC   rx   rD   r…   s   &r#   Útool_gateway_entitledÚ+NousPortalAccountInfo.tool_gateway_entitled�   s<   € ð ×'Ñ'¨4Ð/×fÐf´4¸×8HÑ8H×8eÐ8eÈT×M]ÑM]×MeÑMeÓ3fÐfr"   c               ó    € V ^8„  d   QhRRRR/# )rJ   ÚcategoryrW   rM   rC   r   )rN   s   "r#   rO   r‚   ¢   s   € ÷ qñ q°#ð q¸$ñ qr"   c                óÎ   € V P                   pV P                  RJ ;'       gE    \        T;'       d2    VP                  ;'       d    VP                  P                  V4      RJ 4      # )zYPaid users are entitled everywhere; pool users only where ``coverage[category]`` is true.T)rx   ru   rC   rD   rF   Úget)r†   r–   Útas   && r#   Útool_gateway_entitled_forÚ/NousPortalAccountInfo.tool_gateway_entitled_for¢   sS   € à×ÑˆØ×'Ñ'¨4Ð/×pÐp´4¸×8oÐ8o¸r¿z¹z×8oÐ8oÈbÏkÉkÏoÉoÐ^fÓNgÐkoÐNoÓ3pÐpr"   c               ó   € V ^8„  d   QhRR/# r�   r   )rN   s   "r#   rO   r‚   ¨   s   € ÷ *ñ *¨$ñ *r"   c                ó   € V P                   RJ # )zTOnly a literal ``true`` from the portal counts; absent and unknown both read as out.T)r   r…   s   &r#   Úmanaged_tools_rolled_outÚ.NousPortalAccountInfo.managed_tools_rolled_out§   s   € ð ×!Ñ! TÐ)Ð)r"   r   )%r   r   r   r   r    re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rt   ru   rv   rx   ry   r{   r|   r}   r~   r   Úpropertyr‡   rR   r�   r“   rš   rž   r!   r   r"   r#   r`   r`   m   s|  ‡ àƒOØ!Ó!ØƒKØ!€Gˆ]Ó!Ø €FˆMÓ Ø"€HˆmÓ"Ø"€HˆmÓ"Ø#€Iˆ}Ó#Ø $€J�Ó$Ø!%€K�Ó%Ø%)€O�]Ó)Ø(,Ð˜Ó,Ø).Ð  $Ó.Ø'+Ð�}Ó+Ø%)€JÐ"Ó)Ø€Eˆ=ÓØ#€Iˆ}Ó#Ø9=€LÐ6Ó=Ø*.Ð˜Ó.ØDHÐÐAÓHØ04€KÐ-Ó4à26€LÐ/Ó6Ø+/€JÐ(Ó/Ø,0€KÐ)Ó0Ø€Eˆ=Óà"&€L�-Ó&ð %)€M�>Ó(àô0ó ð0ð ôHó ðHð
 ô1ó ð1ð ôgó ðgõqð
 ô*ó ô*r"   r`   c               ó    € V ^8„  d   QhRRRR/# ©rJ   rK   rL   rM   rW   r   )rN   s   "r#   rO   rO   ­   s   € ÷ 
)ñ 
)Ð*Ið 
)ÐUXñ 
)r"   c                ó¨   €  ^ RI Hp V e   V P                  MRp\	        V4      '       g   TpVP                  R4       R2#   \         d    Rp LHi ; i)z>Return the billing URL for a normalized Nous account snapshot.)ÚDEFAULT_NOUS_PORTAL_URLúhttps://portal.nousresearch.comNÚ/ú/billing)Úhermes_cli.authr¤   Ú	Exceptionrl   Ú	_nonblankÚrstrip)rK   r¤   Úbases   &  r#   Únous_portal_billing_urlr­   ­   s]   € ðDÝ;ð ,8Ò+Cˆ<×'Ò'È€DÜ�T�?Š?Ø&ˆØ�k‰k˜#ÓÐ˜xÐ(Ð(øô ô DØ"CÒðDús   ‚A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# r¢   r   )rN   s   "r#   rO   rO   º   s   € ÷ (ñ (Ð(Gð (ÐSVñ (r"   c                óÌ   € \        V 4      R\        R4      )  pV e   \        V RR4      MRp\        V4      '       d%   ^ RIHp V RV! VP                  4       RR7       R2# V R2# )	u  Portal top-up URL (``?topup=open`` auto-opens the top-up modal).

Prefers the org-pinned ``{base}/orgs/{slug}/billing`` (skips the legacy shim's multi-org
re-resolution); falls back to ``{base}/billing`` when ``org_slug`` is null â€” never
``/orgs/None/billing``.
Nr§   rg   )Úquotez/orgs/rY   )Úsafez/billing?topup=open)r­   ÚlenÚgetattrrª   Úurllib.parser°   r[   )rK   r¬   Úslugr°   s   &   r#   Únous_portal_topup_urlr¶   º   so   € ô # <Ó0Ð1C´C¸
³OÐ3CÐD€DØ6BÒ6NŒ7�< ¨TÔ2ÐTX€DÜ�‡‚Ý&à��v™e D§J¡J£L°rÔ:Ð;Ð;NÐOÐOØˆVÐ&Ð'Ð'r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rK   rL   rM   r   r   )rN   s   "r#   rO   rO   Ê   s   € ÷ ñ Ð5Tð ÐYfñ r"   c                ó`  € V e   \        V RR4      MRp^ RIHp V! V4      f   R# \        VRR4      ;p'       d)   ^ RIHp V! V4      '       d   RMRpV R\        V 4       2# ^ R	IHpHpH	p \        V P                  R
R4      p	T! \        VRR4      \        V	\        \        34      '       d   \        V	R,          4      MR4      p
W§8X  d   R\        V 4       2# W¦8X  d   R\        V 4       2# R\        V 4       2.p\        VRR4      RJ d   VP                  R4       RP!                  V4      # )aJ  Next step after a usage-window 402: the credits step from :func:`agent.plan_limits.credits_action`
(turn on Keep going, add credits, or both), plus the auto top-up nudge when it is off. None for every
account not on a usage-window plan, so the credit-grant guidance is unchanged. A paused plan points
at the card, not at a top-up.Nry   )Ú_window_seed_fieldsr>   )Úpaused_for_paymentz*Update your card to restore included usagezIncluded usage is pausedz$, or add credits to keep going now: )ÚADD_CREDITS_AND_KEEP_GOINGÚUSE_CREDITSÚcredits_actionr1   r?   i@B z6Turn on Keep going in /topup to use your credits now: z@Add credits and turn on Keep going in /topup to keep going now: zAdd credits to keep going now: r=   FzITurn on auto top-up in the same place so this doesn't stop you next time.Ú
)r³   Úagent.credits_trackerr¹   Úagent.usage_gaugesrº   r­   Úagent.plan_limitsr»   r¼   r½   rv   rZ   ÚintÚfloatr¶   ÚappendÚjoin)rK   Úwindowr¹   Úpausedrº   Úfixr»   r¼   r½   Ú	purchasedÚactionÚliness   &           r#   Ú"format_usage_window_block_guidancerÌ   Ê   sA  € ð
 =IÒ<TŒW�\ >°4Ô8ÐZ^€Få9Ù˜6Ó"Ò*ÙÜ˜ °$Ó7Ð7€vÖ7å9Ù>PÐQW×>XÒ>XÑ:Ð^xˆØ�Ð:Ô;RÐS_Ó;`Ð:aÐbÐbßYÑYÜ˜×=Ñ=Ð?\Ð^bÓc€IÙœG FÐ,CÀTÓJÜ:DÀYÔQTÔV[ÐP\×:]Ò:]œC 	¨IÕ 5Ô6Ðcgói€FàÔØGÔH_Ð`lÓHmÐGnÐoÐoØÔ+àQÔRiÐjvÓRwÐQxÐyÐyØ.Ô/DÀ\Ó/RÐ.SÐTÐU€EÜˆvÐ,¨dÓ3°uÓ<Ø�‰Ð`ÔaØ�9‰9�UÓÐr"   Ú
capabilityzthis featureÚinclude_refresh_hintÚcoverage_categoryÚin_chatFc               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )rJ   rK   rL   rÍ   rW   rÎ   rC   rÏ   r   rÐ   rM   r   )rN   s   "r#   rO   rO   è   sH   € ÷ Bñ BØ1ðBØBEðBàðBà:GðBð ðBð ñ	Br"   c               ó@  € \        V 4      '       d   V'       d   \        # \        # \        V 4      pV eM   Ve5   V P	                  V4      '       d   R# V P
                  '       d	   V RV R2# MV P
                  '       d   R# V f
   RV RV R2# V P                  '       g%   V P                  '       d
   RV RV R2# RV R	V R2# V P                  fN   R
V R2pV P                  '       d   VRV P                   R2,          pV'       d
   VR,          pVRV R2,           # V P                  pV'       d   VP                  MRpVR8X  d   RV R2# VR8X  g   V P                  RJ d3   \        WWTR7      p	V'       d   V P                  '       g
   V	R,          p	V	# RV RV R2# )aò  User-facing guidance for a missing Nous tool-gateway entitlement; ``None`` when entitled.

Entitled = paid access OR a live free pool that covers it (normalized fields, not price:
purchased credits without a subscription count as paid, an exhausted paid subscription does
not). ``coverage_category`` scopes the check to one category; an otherwise-entitled user whose
access doesn't fund it gets a neutral billing nudge, never an "exhausted" message. The
pool-vs-paid distinction is never surfaced.
Nzd isn't included with your current Nous Portal access. Add credits or a subscription to enable it at Ú.z9Hermes could not verify your Nous Portal entitlement, so zO is unavailable. Run `hermes model` to refresh your login, or check billing at zeNous inference credentials are configured, but Hermes cannot verify your Nous Portal paid access for zc. Log in with `hermes model` to enable Portal-managed features. Billing and credits are managed at zLog in to Nous Portal to use z9: run `hermes model`. Billing and credits are managed at z9Hermes could not verify your Nous Portal paid access, so z is unavailable.z Account lookup failed: z, Run `hermes model` to refresh your session.z Check billing at Úaccount_missingzOHermes could not find a Nous Portal account or organisation for this login, so zi is unavailable. Run `hermes model` to authenticate again; if the problem persists, contact Nous support.Úno_usable_creditsF)rÐ   zF If you recently bought credits, run `hermes model` to refresh Hermes.zIYour Nous Portal account does not currently have paid service access, so ú2 is unavailable. Add credits or update billing at )rS   ÚFREE_TIER_NEEDS_ACCOUNT_CHATÚFREE_TIER_NEEDS_ACCOUNTr­   rš   r“   ra   rn   ru   r}   rv   r)   Ú_no_paid_access_messagerd   )
rK   rÍ   rÎ   rÏ   rÐ   Úbilling_urlÚdetailÚaccessr)   Úmessages
   &$$$$     r#   Ú&format_nous_portal_entitlement_messagerÞ   è   s  € ô ˜,×'Ò'ß/6Ô+ÐSÔ<SÐSÜ)¨,Ó7€KàÒØÒ(Ø×5Ñ5Ð6G×HÒHÙØ×1×1Ð1à!�lð #EØEPÀMÐQRðTðð 2ð
 ×/×/Ð/ÙØÒàGÈ
À|ð TMØMXÈMÐYZð\ð	
ð ×!×!Ð!Ø×4×4Ð4ð#Ø#- ,ð /@Ø@K¸}ÈAðOðð ,¨J¨<ð 82Ø2=°¸aðAð	
ð ×'Ñ'Ò/ØLÈZÈLÐXhÐiˆØ××ÐØÐ0°×1CÑ1CÐ0DÀAÐFÕFˆFßØÐDÕDˆFØÐ,¨[¨M¸Ð;Õ;Ð;Ø×2Ñ2€Fß$ˆV�]Š]¨$€FØÐ"Ô"à]Ð^hÐ]ið jwð xð	
ð Ð$Ô$¨×(HÑ(HÈEÓ(QÜ)¨,ÀKÔaˆß¨×(:×(:Ð(:ØÐ_Õ_ˆGØˆðØˆ\ÐKÈKÈ=ÐXYð	[ðr"   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rJ   rK   r`   rÍ   rW   rÚ   rÐ   rC   rM   r   )rN   s   "r#   rO   rO   -  s4   € ÷ ,ñ ,Ø'ð,Ø58ð,ØGJð,ØX\ð,àñ,r"   c               óà  € \        V 4      '       d   V'       d   \        # \        # V P                  ;'       g    \	        4       pVP
                  VP                  reR VP                  3RVP                  3RVP                  33pV UU	u. uF  w  r‰V	f   K  V RV	R 2NK  	  p
pp	V
'       d   RRP                  V
4       R2MRpVP                  '       dD   VP                  VP                  rÜRpVe   Ve   R	VR R
VR R2pMVe   R	VR R2pRV V RV R2# V'       d   V'       d   RV RV RV R2# V'       d   VRJ d
   RV RV R2# VRJ d   RV RV RV R2# RV RV RV R2# u up	pi )Úusablert   rÉ   z $z.2fz (z, Ú)rY   z. Your organisation's per-member spend cap is $z and you've spent $z of it.rÓ   zlYour Nous Portal access is paused because you've exceeded the per-member spend cap set by your organisation.z> Ask your organisation admin to raise the member spend cap at z%, then run `hermes model` to refresh.z&Your Nous Portal credits are exhaustedz, so z, is unavailable. Top up or renew credits at FzGYour current Nous Portal plan does not include paid service access, so z+ is unavailable. Upgrade or add credits at zEYour Nous Portal account has no active subscription or usable creditsz- is unavailable. Subscribe or add credits at z3Your Nous Portal account has no usable paid creditsrÖ   )rS   r×   rØ   rv   r%   r,   r-   r2   r0   r1   rÅ   r3   r4   r5   )rK   rÍ   rÚ   rÐ   rÜ   ÚactiveÚpaidÚlabelledÚlabelÚamountÚpartsÚcredit_detailÚcapÚspentÚ
cap_details   &&&$           r#   rÙ   rÙ   -  sù  € ô ˜,×'Ò'ß/6Ô+ÐSÔ<SÐSØ×2Ñ2×QÐQÔ6OÓ6Q€FØ×1Ñ1°6×3UÑ3UˆDà	�6×.Ñ.Ð/Ø	˜×>Ñ>Ð?Ø	�f×8Ñ8Ð9ð€Hñ
 <DÔZ¹8©-¨%ÀvÔ%�ˆw�b˜ ˜Ó%¹8€EÑZß05�b˜Ÿ™ 5Ó)Ð*¨!Ñ,¸2€MØ×'×'Ð'Ø×0Ñ0°&×2IÑ2IˆUØˆ
ØŠ?˜uÒ0ØIÈ#ÈcÈÐReÐfkÐloÐepÐpwÐx‰JØŠ_ØIÈ#ÈcÈÐRSÐTˆJð!Ø!+ ¨]¨Oð <#Ø#. -Ð/TðVð	
÷
 —$à4°]°OÀ5ÈÈð U*Ø*5¨°að9ð	
÷ �$˜%“-ðØ�ÐHÈÈÐUVðXð	
ð �ƒàSÐTaÐSbð cØ�ÐJÈ;È-ÐWXðZð	
ð
 >¸m¸_ÈEØˆ,ÐHÈÈÐUVð	Xðùó; [s   Â	E*ÂE*c               ó   € V ^8„  d   QhRR/# )rJ   rM   ÚNoner   )rN   s   "r#   rO   rO   \  s   € ÷ "ñ "¨dñ "r"   c                 ó   € Rs RsR# )z7Clear the short-lived account-info cache used by tests.N)r   r   r   r"   r#   Ú$reset_nous_portal_account_info_cacherð   \  s   € ð ÐØ!Òr"   Úforce_freshÚmin_jwt_ttl_secondsc               ó$   € V ^8„  d   QhRRRRRR/# )rJ   rñ   rC   rò   rÂ   rM   r`   r   )rN   s   "r#   rO   rO   c  s(   € ÷ Dñ D°ð DÐTWð DÐavñ Dr"   c                óÂ  €  ^ RI Hp V! R4      ;'       g    / p^ RIHpHp T! T4      '       d   RMT! T4      ;'       g    Rp\        T4      p\        T4      '       g7   \        YT4      ;'       g#    \        T4      ;'       g    \        RRRTR	7      # T '       g   \        YsY�4      p	T	e   T	# \        Y0T4      #   \         d   p\        TRR7      u Rp?# Rp?ii ; i)
zçNormalized Nous Portal account entitlement.

A valid unexpired OAuth JWT serves as a local snapshot (UX gating only; the server stays
authoritative). ``force_fresh=True`` always calls ``/api/oauth/account`` and bypasses the cache.
©Úget_provider_auth_stateÚnousF)r}   ra   N)Úguest_without_free_tierÚheld_connectors_tokenrY   Únone)ra   rc   rd   rl   )r¨   rö   r©   Ú_error_infoÚhermes_cli.anon_authrø   rù   Ú_portal_base_urlrª   Ú_info_from_oauth_poolÚ_info_from_inference_key_poolr`   Ú_info_from_valid_jwtÚ_fresh_account_info)
rñ   rò   rö   ÚstateÚexcrø   rù   Úaccess_tokenrl   Újwt_infos
   $$        r#   Úget_nous_portal_account_infor  c  sÞ   € ð7Ý;á'¨Ó/×5Ð5°2ˆ÷ Tá0°×7Ò7‘2Ñ>SÐTYÓ>Z×>`Ð>`Ð^`€LÜ& uÓ-€OÜ�\×"Ò"ä! +ÀOÓT÷ sð sÜ,¨_Ó=÷sð sä$¨u¸VÈ5ÐbqÔrð	
÷
 Ü'¨¸_ÓbˆØÒØˆOÜ˜u°?ÓCÐCøô' ô 7Ü °Ô6Õ6ûð7ús"   ‚B< —B< Â<CÃCÃCÃCc               ó   € V ^8„  d   QhRR/# )rJ   rM   r&   r   )rN   s   "r#   rO   rO   ƒ  s   € ÷ ñ ˜^ñ r"   c                 óø   €  ^ RI Hp Hp V ! R4      ;'       g    / P                  R4      p\	        V4      '       g   R# V! V4      pV'       d   \        VP                  R4      4      # R#   \         d     R# i ; i)z¤Whether the caller's org carries a restrictive model/provider policy.

``None`` is unknown (older mint / unreadable claim) and must not be reported as "no policy".
)rö   Ú_decode_jwt_claimsr÷   r  NÚpolicy_present)r¨   rö   r	  r˜   rª   Ú_coerce_boolr©   )rö   r	  r  Úclaimss       r#   Únous_policy_presentr  ƒ  sm   € ð
	ßOá/°Ó7×=Ð=¸2×BÑBÀ>ÓRˆÜ˜×&Ò&ÙÙ# LÓ1ˆß=CŒ|˜FŸJ™JÐ'7Ó8Ó9ÐMÈÐMøÜô Úðús'   ‚A* ™#A* ¾A* ÁA* Á(A* Á*A9Á8A9Úany_agec               ó    € V ^8„  d   QhRRRR/# )rJ   r  rC   rM   rL   r   )rN   s   "r#   rO   rO   ”  s   € ÷ ñ °ð ÐA`ñ r"   c                óŠ  €  \         ;_uu_ 4        \        \        r!RRR4       Xf   R# Vw  r4pV '       g(   \        P                  ! 4       V,
          \
        8¼  d   R# Xe   V\        4       8w  d   R# V#   + '       g   i     La; i  \         d0    \        P                  ! \        4      P                  RRR7        R# i ; i)un  The account snapshot in the 60s cache, or None when empty/expired. Never a fresh fetch, never raises â€”
for UI chrome that must not add a round trip (the pickers) after a flow has already fetched the account.
``any_age`` returns the last snapshot even past the TTL, for callers that read only the plan's shape
(window or not, featured models), which rarely changes.Nz#Cached Nous account info unreadableT)Úexc_info)Ú_ACCOUNT_INFO_CACHE_LOCKr   r   ÚtimeÚ	monotonicÚ_ACCOUNT_INFO_CACHE_TTLÚ_current_account_identityr©   ÚloggingÚ	getLoggerr   Údebug)r  ÚcachedÚidentityÚ_Ú	cached_atÚinfos   $     r#   Úcached_nous_portal_account_infor  ”  s›   € ð
ß%Ö%Ü2Ô4J�H÷ &àŠ>ÙØ#Ñˆ�dçœDŸNšNÓ,¨yÕ8Ô=TÔTÙàÒ˜xÔ+DÓ+FÔFÙØˆ÷ &×%ûô ô Ü×Òœ(Ó#×)Ñ)Ð*OÐZ^Ð)Ô_Úðús8   ‚B �A5œB ª2B ÁB Á3B Á5B	Â B Â6CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r  rW   rl   r   rM   r   )rN   s   "r#   rO   rO   «  s!   € ÷ 
1ñ 
1 Cð 
1¸-ð 
1ÈCñ 
1r"   c                ó>  € ^ RI Hp V! V 4      pVP                  R4      VP                  R4      rT\        V4      '       d   \        V4      '       d
   RV RV 2pM3\        P
                  ! V P                  R4      4      P                  4       pT;'       g    R RV 2# )zdPortal + the token's user and org (stable across a refresh); an opaque token falls back to its hash.©r	  Úsubrf   zjwt:Ú:úutf-8rY   )Úhermes_cli.auth_constantsr	  r˜   rª   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r  rl   r	  r  r#  Úorgr  s   &&     r#   Ú_account_identityr,  «  s‡   € å<á Ó-€FØ�z‰z˜%Ó  &§*¡*¨XÓ"6ˆÜ�‡~‚~œ) CŸ.š.Ø˜#˜˜a ˜uÐ%‰ä—>’> ,×"5Ñ"5°gÓ">Ó?×IÑIÓKˆØ×#Ð# Ð$ A h ZÐ0Ð0r"   c               ó   € V ^8„  d   QhRR/# )rJ   rM   r   r   )rN   s   "r#   rO   rO   ¸  s   € ÷ 	Dñ 	D =ñ 	Dr"   c                 ó¤   € ^ RI Hp  V ! R4      ;'       g    / pVP                  R4      p\        V4      '       g   R# \	        V\        V4      4      # )zl``_account_identity`` for the persisted Nous login, without a refresh or network call. None
when logged out.rõ   r÷   r  N)r¨   rö   r˜   rª   r,  rý   )rö   r  r  s      r#   r  r  ¸  sH   € õ 8á# FÓ+×1Ð1¨r€EØ—9‘9˜^Ó,€LÜ�\×"Ò"ÙÜ˜\Ô+;¸EÓ+BÓCÐCr"   c               ó    € V ^8„  d   QhRRRR/# )rJ   ÚremovedrC   rM   rW   r   )rN   s   "r#   rO   rO   Ä  s   € ÷ ñ  4ð ¨Cñ r"   c                ó8   € V '       d   \        4       RJd   R#  R# )uM  One-line notice for a list the org's policy narrowed, else ``""``.

Blocked models are omitted, which reads as "unsupported"; this says which it is without
enumerating them. ``removed`` must reflect whether the filter actually dropped anything â€” the
catalog read fails open, so the claim alone would label a full list as filtered.
TrY   ud   Your organization restricts which models are available â€” models outside its policy are not listed.)r  )r0  s   $r#   Únous_policy_noticer2  Ä  s   € ÷ Ô)Ó+°4Ó7Ùð	4ñr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rJ   r  údict[str, Any]rñ   rC   rl   r   rM   r`   r   )rN   s   "r#   rO   rO   Ó  s0   € ÷ qñ q˜~ð q¸Dð qÐS`ð qÐezñ qr"   c                ó|  €  ^ RI HpHp V! 4       pV! R4      ;'       g    T p\        V4      ;'       g    Tp\        P
                  ! VP                  R4      4      P                  4       pT;'       g    R RV 2p\        ;_uu_ 4        V'       gI   \        eA   \        w  ršpW˜8X  d2   \        P                  ! 4       V
,
          \        8  d   VuuRRR4       # RRR4       \        WVV4      pVP                  R8w  d?   \        WR4      p\        ;_uu_ 4        V\        P                  ! 4       V3s	VsRRR4       V# V#   + '       g   i     Lm; i  + '       g   i     T# ; i  \"         dJ   p\%        T\'        T P)                  R4      4      T\+        T P)                  R	4      4      R
7      u Rp?# Rp?ii ; i)é    )rö   Úresolve_nous_access_tokenr÷   r%  rY   r$  Nr}   r  r~   ©r}   ra   rl   r~   )r¨   rö   r7  rý   r'  r(  r)  r*  r  r   r  r  r  Ú_info_from_fetched_accountrc   r,  r   r©   rû   rC   r˜   Ú_coerce_str)r  rñ   rl   rö   r7  r  Úrefreshed_stateÚdigestÚ	cache_keyÚ
cached_keyr  Úcached_infor  r  r  s   &&&            r#   r  r  Ó  si  € ðqßVá0Ó2ˆÙ1°&Ó9×BÐB¸UˆÜ*¨?Ó;×NÐN¸ˆÜ—’ × 3Ñ 3°GÓ <Ó=×GÑGÓIˆØ&×,Ð,¨"Ð-¨Q¨v¨hÐ7ˆ	ç%Ö%ßÔ#6Ò#BÜ5HÑ2�
 {ØÔ*´·²Ó0@À9Õ0LÔPgÔ/gØ&÷	 &×%Ò%ô *¨,ÈÓYˆØ�;‰;˜'Ô!Ü(¨ÓGˆHß)Ö)Ø'0´$·.².Ó2BÀDÐ&IÐ#Ø)1Ð&÷ *ð ˆˆtˆ÷ &×%ú÷ *Ö)ð ˆûÜô qÜ ´°U·Y±Y¸~Ó5NÓ0OØ+:ÌÐUZ×U^ÑU^Ð_mÓUnÓIoôqõ 	qûðqúsp   ‚E'  E' µ>E' Á4E' Â
AE Ã
E' Ã>E' ÄEÄ4	E' Ä>E' Å E	ÅE' ÅE$	ÅE' Å$E' Å'F;Å2>F6Æ0F;Æ6F;c               ó    € V ^8„  d   QhRRRR/# )rJ   rl   r   rM   rL   r   )rN   s   "r#   rO   rO   ñ  s   € ÷ ñ °=ð ÐEdñ r"   c                ó,  €  \        4       pVf   R# \        \        VRR4      ;'       g    \        VRR4      4      '       g   R# \        RRR\        VRR4      ;'       g    T \	        V4      RR	\        VR
R4       2RR7      #   \
         d     R# i ; i)zEReturn an explicit unknown-entitlement snapshot for opaque Nous keys.NÚruntime_api_keyr  rY   FÚinference_keyrl   Túpool:ræ   ÚunknownÚportal_oauth_missing)ra   rc   rd   rl   rm   rn   ro   r}   )Ú_select_nous_pool_entryrª   r³   r`   Ú_pool_entry_inference_urlr©   )rl   Úentrys   & r#   rÿ   rÿ   ñ  s¡   € ðÜ'Ó)ˆØŠ=ÙÜœ Ð(9¸4Ó@×fÐfÄGÈEÐSaÐceÓDf×gÒgÙÜ$Ø O¸5Ü# EÐ+<¸dÓC×VÐVÀÜ8¸Ó?Ø)-Ø %¤g¨e°W¸iÓ&HÐ%IÐJØ(ô
ð 	
øô ô Úðús'   ‚B ’B «B ÁB Á!"B ÂBÂBc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rJ   rñ   rC   rò   rÂ   rl   r   rM   rL   r   )rN   s   "r#   rO   rO     s2   € ÷ Pñ PØðPØ,/ðPØBOðPà$ñPr"   c                óî  €  \        4       pTe   \        T4      '       g   R # TP                  p\	        TRR 4      ;'       g    TpRTR\	        TRR 4      R\        T4      R\	        TRR 4      RR\	        TRR	4       2/pT '       g   \        YFYQ4      pTe   T#  \        YFT4      #   \         d     R # i ; i  \         d2   p\        TR
T\        TP                  R4      4      R7      u R p?# R p?ii ; i)Nrl   r  ri   rm   Ú	agent_keyro   rD  ræ   rE  Tr~   r8  )rG  r©   Ú_pool_entry_is_portal_oauthr  r³   rH  r   r9  rû   r:  r˜   )	rñ   rò   rl   rI  r  Úentry_portal_urlr  r  r  s	   &&&      r#   rþ   rþ     s  € ðÜ'Ó)ˆð ‚}Ô7¸×>Ò>ÙØ×%Ñ%€LÜ˜uÐ&7¸Ó>×QÐQÀ/Ðà˜ k´7¸5À+ÈtÓ3TØÔ7¸Ó>ÀÌWÐUZÐ\gÐimÓMnØ˜u¤W¨U°G¸YÓ%GÐ$HÐIð€E÷ Ü'¨Ð=MÓcˆØÒØˆOðPÜ)¨,Ð?OÓPÐPøô# ô Úðûô$ ô PÜ °ÐFVÜ(3°E·I±I¸nÓ4MÓ(NôPõ 	PûðPús/   ‚
B& ÂB8 Â&B5Â4B5Â8C4Ã&C/Ã)C4Ã/C4c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rJ   r  rW   r  r4  rl   r   rM   r`   r   )rN   s   "r#   rO   rO   !  s2   € ÷ ]ñ ]Øð]Ø,ð]Ø?Lð]àñ]r"   c                ó  € \        W4      p\        VP                  R4      4      pV'       g   \        RRW$R7      # \	        VP                  R4      \
        4      '       d!   \        VR,          ;'       g    RRW#VR7      # \        W1VR7      # )	zZCall ``/api/oauth/account`` and normalize; empty or ``error`` payloads become error infos.r~   Úempty_account_responseTr8  r}   Úaccount_response_error©r}   ra   rl   r|   r~   )r  rl   )Ú_fetch_nous_account_infor:  r˜   rû   rZ   rW   Ú_info_from_account_payload)r  r  rl   Úpayloadr   s   &&&  r#   r9  r9  !  s…   € ô ' |ÓE€GÜ�u—y‘y Ó0Ó1€DßÜÐ!9ÀTØ+:ôOð 	Oä�'—+‘+˜gÓ&¬×,Ò,ÜØ˜'Õ"×>Ð>Ð&>È$Ø+Ètô
ð 	
ô & gÈOÔ\Ð\r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rI  r	   rM   r   r   )rN   s   "r#   rO   rO   2  s   € ÷ Fñ F Sð F¨]ñ Fr"   c                óp   € \        V R R4      ;'       g#    \        V RR4      ;'       g    \        V RR4      # )rm   NÚruntime_base_urlÚbase_url)r³   )rI  s   &r#   rH  rH  2  sQ   € Ü�5Ð.°Ó5÷  Fð  F¼ÀÐHZÐ\`Ó9a÷  Fð  FÔelÐmrÐt~ð  AEó  fFð  Fr"   c               ó   € V ^8„  d   QhRR/# )rJ   rM   zOptional[Any]r   )rN   s   "r#   rO   rO   6  s   € ÷ -ñ - ñ -r"   c                 óÈ   € ^ RI Hp  V ! R4      pV'       d   VP                  4       '       g   R# \        VP	                  4       4      pV'       g   R# R R lp\        W#R7      # )zVPool entry with the latest agent-key expiry, then access expiry, then lowest priority.)Ú	load_poolr÷   Nc               ó    € V ^8„  d   QhRRRR/# )rJ   rI  r	   rM   ztuple[float, float, int]r   )rN   s   "r#   rO   Ú-_select_nous_pool_entry.<locals>.__annotate__A  s   € ÷ Qñ Q˜sð QÐ'?ñ Qr"   c           	     óÈ   € \        \        V R R4      4      ;'       g    Rp\        \        V RR4      4      ;'       g    RpY\        \        V R^ 4      ;'       g    ^ 4      ) 3# )Úagent_key_expires_atNg        rp   Úpriority)Ú_parse_iso_timestampr³   rÂ   )rI  Ú	agent_expÚ
access_exps   &  r#   Ú_entry_sort_keyÚ0_select_nous_pool_entry.<locals>._entry_sort_keyA  s`   € Ü(¬°Ð8NÐPTÓ)UÓV×]Ð]ÐZ]ˆ	Ü)¬'°%¸ÀtÓ*LÓM×TÐTÐQTˆ
Ø¬¬G°E¸:ÀqÓ,I×,NÐ,NÈQÓ(OÐ'OÐPÐPr"   )Úkey)Úagent.credential_poolr]  Úhas_credentialsÚlistÚentriesÚmax)r]  Úpoolrl  rf  s       r#   rG  rG  6  sL   € å/á�VÓ€Dß�t×+Ñ+×-Ò-ÙÜ�4—<‘<“>Ó"€GßÙõQô
 ˆwÔ,Ð,r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rI  r	   rM   rC   r   )rN   s   "r#   rO   rO   I  s   € ÷ Xñ X sð X¨tñ Xr"   c                ó  € \        \        V R R4      4      '       g   R# \        \        V RR4      ;'       g    R4      P                  4       P	                  4       pVP                  R4      ;'       g    \        \        V RR4      4      # )r  NFÚ	auth_typerY   ÚoauthÚrefresh_token)rª   r³   rW   r[   r\   Ú
startswithrC   )rI  rq  s   & r#   rM  rM  I  sn   € Ü”W˜U N°DÓ9×:Ò:ÙÜ”G˜E ;°Ó3×9Ð9°rÓ:×@Ñ@ÓB×HÑHÓJ€IØ×Ñ Ó(×WÐW¬D´¸ÀÐQUÓ1VÓ,WÐWr"   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r  rW   rl   r   rM   r4  r   )rN   s   "r#   rO   rO   P  s"   € ÷ 8ñ 8¨3ð 8Àð 8ÐZhñ 8r"   c                ó´  € T;'       g    R P                  R4      pRRV  2RR/p\        P                  P                  V R2VR7      p\        P                  P	                  V^R7      ;_uu_ 4       p\
        P                  ! VP                  4       P                  4       4      pR	R	R	4       \        X\        4      '       d   V# / #   + '       g   i     L*; i)
r¥   r¦   ÚAuthorizationzBearer ÚAcceptzapplication/jsonz/api/oauth/account)Úheaders)ÚtimeoutN)r«   ÚurllibÚrequestÚRequestÚurlopenÚjsonÚloadsÚreadÚdecoderZ   rG   )r  rl   r¬   ry  ÚreqÚresprV  s   &&     r#   rT  rT  P  s°   € Ø×@Ð@Ð@×HÑHÈÓM€DØ '¨,¨Ð 8¸(ÐDVÐW€GÜ
�.‰.×
 Ñ
  D 6Ð);Ð!<ÀgÐ
 Ó
N€CÜ	�‰×	Ñ	 ¨QÐ	×	/Ô	/°4Ü—*’*˜TŸY™Y›[×/Ñ/Ó1Ó2ˆ÷ 
0ä  ¬$×/Ò/ˆ7Ð7°RÐ7÷ 
0×	/ús   Á23CÃC	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rJ   ÚtokenrW   r  r4  rl   r   rò   rÂ   rM   rL   r   )rN   s   "r#   rO   rO   Y  s4   € ÷ #ñ #Øð#Ø%ð#Ø8Eð#Ø\_ð#à$ñ#r"   c           
     óø  €  ^ RI Hp T! T 4      pT'       g   R# \        TP	                  R4      \
        4      pTe5   T\        P                  ! 4       \        ^ \        T4      4      ,           8:  d   R# \        TP	                  R4      4      p\        Yw\        TP	                  R4      4      \        TP	                  R4      \        4      R7      p\        R / RR	bR
RbRRbR\        TP	                  R4      4      bR\        TP	                  R4      4      bR\        TP	                  R4      ;'       g    TP	                  R4      4      bR\        TP	                  R4      4      bR\        TP	                  R4      4      bRTbR\        TP	                  R4      4      bRR	bR\        TP	                  R4      4      ;'       g    RbR\        P                  ! T\        R7      bRTbRTbR\!        TP	                  R4      4      bR\#        T4      bR\        TP	                  R4      4      ;'       g    \        TP	                  R4      4      bR\        TP	                  R4      4      b #   \         d     R# i ; i)!r6  r"  NÚexpr(   rf   r.   )r'   r(   r*   r.   ra   Trc   Újwtrd   Fre   r#  ri   rj   rk   rl   rm   rn   ro   Ú
auth_storerp   )Útzru   rv   rx   r{   r~   r   r   )r¨   r	  r©   Ú_coerce_numr˜   rÃ   r  rm  rÂ   r  r%   r:  r`   r   Úfromtimestampr   Ú_tool_access_from_valuerG   )	r†  r  rl   rò   r	  r  rˆ  r(   Úaccess_infos	   &&&&     r#   r   r   Y  sL  € ðÝ6ñ   Ó&€FßÙÜ
�f—j‘j Ó'¬Ó
/€CØ
‚{�cœTŸYšY›[¬3¨q´#Ð6IÓ2JÓ+KÕKÔKÙÜ˜vŸz™z¨-Ó8Ó9€KÜ+ØÄkÐRX×R\ÑR\Ð]eÓRfÓFgÜ% f§j¡jÐ1DÓ&EÄsÓKô€Kô !ò ÙðÙ$ðÙ,1ðä˜FŸJ™J uÓ-Ô.ðô ˜6Ÿ:™: hÓ/Ô0ðô ˜fŸj™j¨Ó5×OÐO¸¿¹À;Ó9OÔPð	ô
 ˜vŸz™z¨,Ó7Ô8ðô   §
¡
¨=Ó 9Ô:ðñ (ðô ' u§y¡yÐ1EÓ'FÔGðñ &*ðô & e§i¡iÐ0CÓ&DÓE×UÐUÈøðô ×)Ò)¨#´#Õ6ðñ (ðñ CNðô ,¨F¯J©J°}Ó,EÔFðô ˜”<ðô ! §¡¨NÓ!;Ó<×fÐfÄÈEÏIÉIÐVdÓLeÓ@føðô  # 6§:¡:¨oÓ#>Ô?ð!ð øô ô Úðús   ‚I* É*I9É8I9c               ó(   € V ^8„  d   QhRRRRRRRR/# )rJ   rV  r4  r  rl   r   rM   r`   r   )rN   s   "r#   rO   rO     s,   € ÷ ñ ØðØ'5ðØHUðàñr"   c               óV  € \        V P                  R 4      4      p\        V P                  R4      4      p\        \        V P                  R4      4      pRpVe'   VP                  e   VP                  MVP
                  p\        R / RRbRRbRRbR	\        VP                  R
4      4      ;'       g    V'       d   VP                  MRbR\        VP                  R4      4      bR\        VP                  R4      4      bR\        VP                  R4      4      bRVbR\        VP                  R4      4      bR\        VP                  R4      ;'       g    VP                  R4      4      bR\        VP                  R4      4      ;'       g    RbR\        VP                  R4      4      bR\        VP                  R4      4      bR\        V P                  R4      4      bRVbRVbR\        V P                  R4      4      bR\        \        V P                  R4      4      bR\        V 4      bR\        V P                  R4      4      ;'       g=    \        VP                  R4      4      ;'       g    \        VP                  R4      4      bR\        V P                  R4      4      b # )!ÚuserÚorganisationru   Nra   Trc   Úaccount_apird   rf   Úidrg   rµ   rh   Únameri   rl   rm   rn   r  rL  ro   rŠ  rq   rr   rt   rv   rx   ry   r|   r~   r   r   )Ú_dict_or_emptyr˜   Ú_coerced_dataclassr%   r'   r(   r`   r:  r*   rC   Ú_subscription_from_payloadrŽ  r8   rG   r  )rV  r  rl   r’  r“  rÜ   r(   s   &$$    r#   rU  rU    sy  € ô ˜'Ÿ+™+ fÓ-Ó.€DÜ! '§+¡+¨nÓ"=Ó>€LÜÔ 9¸7¿;¹;ÐG\Ó;]Ó^€FØ€KØÒØ(.¯©Ò(B�f—n’nÈ×HZÑHZˆÜ ò ÙðÙ,ðÙ48ðä˜<×+Ñ+¨DÓ1Ó2×bÐb×QW°v×7MÒ7MÐ]aøðô ˜\×-Ñ-¨fÓ5Ô6ðô ˜\×-Ñ-¨fÓ5Ô6ð	ô
 ˜eŸi™i¨Ó4Ô5ðñ (ðô ' u§y¡yÐ1EÓ'FÔGðô &*¨%¯)©)°NÓ*C×*]Ð*]ÀuÇyÁyÐQ\ÓG]Ô%^ðô & e§i¡iÐ0CÓ&DÓE×UÐUÈøðô ˜$Ÿ(™( 7Ó+Ô,ðô ˜dŸh™h {Ó3Ô4ðô 0°·±¸NÓ0KÔLðñ (ðñ CIðô ,¨G¯K©K¸Ó,FÔGðô (Ô(;¸W¿[¹[ÈÓ=XÔYðô  ˜”Mð!ô" ! §¡¨^Ó!<Ó=÷ 2ð 2ÄÈTÏXÉXÐVdÓMeÓAf÷ 2ð 2Ü�u—y‘y Ó0Ó1øð%ô& # 7§;¡;¨Ó#?Ô@ð'ð r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   rw   r   )rN   s   "r#   rO   rO   Ÿ  s   € ÷ 	Wñ 	W 3ð 	WÐ+Gñ 	Wr"   c                ó$  € \        V \        4      '       g   R# \        V P                  R4      4      P	                  4        UUu/ uF!  w  r\        V\
        4      '       g   K  WRJ bK#  	  ppp\        V P                  R4      RJ VR7      # u uppi )zµParse a Portal ``tool_access`` object (JWT claim or account API).

Fails closed: a non-object yields ``None``; only literal ``true`` counts for ``enabled`` and
each coverage entry.
NrF   TrD   )rD   rF   )rZ   rG   r—  r˜   ÚitemsrW   rB   )rU   ÚkÚvrF   s   &   r#   rŽ  rŽ  Ÿ  sx   € ô �eœT×"Ò"ÙÜ)7¸¿	¹	À*Ó8MÓ)N×)TÑ)TÔ)VÔmÑ)V¡ ÔZdÐefÔhk×Zl”�˜�9’Ñ)V€HÑmÜ e§i¡i°	Ó&:¸dÐ&BÈXÔVÐVùó ns   ÁBÁ#Bc               ó   € V ^8„  d   QhRR/# ©rJ   rU   r	   r   )rN   s   "r#   rO   rO   «  s   € ÷ {ñ { 3ñ {r"   c                óú   € \        V\        4      '       d`   T ! R/ \        V 4       Uu/ uFC  q"P                  \        VP
                  ,          ! VP                  VP                  4      4      bKE  	  upB # R# u upi )zZBuild ``cls`` from a payload dict (field names = payload keys), coercing by declared type.Nr   )rZ   rG   r   r–  Ú	_COERCERSÚtyper˜   )ÚclsrU   Úfs   && r#   r˜  r˜  «  s\   € äYcÐdiÔko×YpÒYp‰3ÑUÌÈsÌÓTÉÀ1—&‘&œ) A§F¡FÖ+¨E¯I©I°a·f±fÓ,=Ó>Ò>ÉÑTÑUÐzÐvzÐzùÒTs   ¨A	A8c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   rs   r   )rN   s   "r#   rO   rO   °  s   € ÷ Añ A cð AÐ.Rñ Ar"   c                ó"   € \        \        V 4      # rQ   )r˜  r   r]   s   &r#   r™  r™  °  s   € ÜÔ8¸%Ó@Ð@r"   rl   r|   r~   c               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )rJ   r}   rV   ra   rC   rl   r   r|   rz   r~   rM   r`   r   )rN   s   "r#   rO   rO   ´  s>   € ÷ 
ñ 
Øð
Ø!%ð
Ø8Eð
à)ð
à@Mð
ð ñ
r"   c           
     ó8   € \        VRRVV\        V 4      VR7      # )zßA failed-lookup snapshot. ``account_tier`` is carried through when the caller still holds the
stored state, so a guest whose lookup failed still gets the "needs a Nous account" copy rather
than billing or re-login guidance.r}   F)ra   rc   rd   rl   r|   r}   r~   )r`   rW   rS  s   $$$$$r#   rû   rû   ´  s%   € ô !Ø G°5È/Ø¤s¨5£zÀôð r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   rC   r   )rN   s   "r#   rO   rO   Á  s   € ÷ :ñ :�Sð :˜Tñ :r"   c                ód   € \        V \        4      ;'       d    \        V P                  4       4      # rQ   )rZ   rW   rC   r[   r]   s   &r#   rª   rª   Á  s"   € Ü�eœSÓ!×9Ð9¤d¨5¯;©;«=Ó&9Ð9r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   r4  r   )rN   s   "r#   rO   rO   Å  s   € ÷ 4ñ 4˜#ð 4 .ñ 4r"   c                ó6   € \        V \        4      '       d   V # / # rQ   )rZ   rG   r]   s   &r#   r—  r—  Å  s   € Ü˜u¤d×+Ò+ˆ5Ð3°Ð3r"   c               ó   € V ^8„  d   QhRR/# )rJ   rM   rW   r   )rN   s   "r#   rO   rO   É  s   € ÷ Hñ H cñ Hr"   c                 óB   € ^ RI Hp Hp T ! V! R4      ;'       g    / 4      # )r6  ©Ú_nous_portal_base_urlrö   r÷   )r¨   r±  rö   r°  s     r#   Úresolve_nous_portal_base_urlr²  É  s   € ßNá Ñ!8¸Ó!@×!FÐ!FÀBÓGÐGr"   c               ó    € V ^8„  d   QhRRRR/# )rJ   r  r4  rM   r   r   )rN   s   "r#   rO   rO   Ï  s   € ÷ Cñ C˜Nð C¨}ñ Cr"   c                óˆ   € V P                  R 4      p\        V4      '       d    VP                  4       P                  R4      # R# )rl   r¦   N)r˜   rª   r[   r«   )r  rU   s   & r#   rý   rý   Ï  s7   € Ø�I‰IÐ'Ó(€EÜ(1°%×(8Ò(8ˆ5�;‰;‹=×Ñ Ó$ÐB¸dÐBr"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   r   r   )rN   s   "r#   rO   rO   Ô  s   € ÷ 	ñ 	 ð 	¨ñ 	r"   c                ó  € \        V \        4      '       d	   V '       g   R # V P                  4       pVP                  R4      '       d   VR R R,           p \        P
                  ! V4      P                  4       #   \         d     R # i ; i)NÚZz+00:00éÿÿÿÿ)rZ   rW   r[   Úendswithr   ÚfromisoformatÚ	timestampr©   )rU   Útexts   & r#   rc  rc  Ô  so   € Ü�eœS×!Ò!¯ÙØ�;‰;‹=€DØ‡}�}�S×ÒØ�C�Rˆy˜8Õ#ˆðÜ×%Ò% dÓ+×5Ñ5Ó7Ð7øÜô Úðús   Á#A9 Á9BÂBc               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   r   r   )rN   s   "r#   rO   rO   à  s   € ÷ ?ñ ?�sð ?˜}ñ ?r"   c                óF   € \        V \        4      '       d   V '       d   V # R # rQ   ©rZ   rW   r]   s   &r#   r:  r:  à  s   € Ü˜u¤c×*Ò*¯uˆ5Ð>¸$Ð>r"   c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   r&   r   )rN   s   "r#   rO   rO   ä  s   € ÷ 6ñ 6˜ð 6 ñ 6r"   c                ó6   € \        V \        4      '       d   V # R # rQ   )rZ   rC   r]   s   &r#   r  r  ä  s   € Ü˜u¤d×+Ò+ˆ5Ð5°Ð5r"   c               ó   € V ^8„  d   QhRR/# r   r   )rN   s   "r#   rO   rO   è  s   € ÷ ñ �sñ r"   c                ó|   € V e   \        V \        4      '       d   R#  V! V 4      #   \        \        3 d     R# i ; i)zB``cast(value)`` or None; bools and None are rejected, not coerced.N)rZ   rC   Ú	TypeErrorÚ
ValueError)rU   Úcasts   &&r#   rŒ  rŒ  è  s<   € à‚}œ
 5¬$×/Ò/ÙðÙ�E‹{ÐøÜ”zÐ"ô Úðús   ž& ¦;º;c               ó    € V ^8„  d   QhRRRR/# )rJ   rU   r	   rM   r;   r   )rN   s   "r#   rO   rO   ò  s   € ÷ ?ñ ?˜Sð ?Ð%>ñ ?r"   c                óŠ   € \        V \        4      '       g   R# \        ;QJ d    . R V  4       F  NK  	  5# ! R V  4       4      # )uf   A JSON array of non-empty strings â†’ tuple (order kept, non-strings dropped); anything else â†’ None.Nc              3  ój   "  € T F)  p\        V\        4      '       g   K  V'       g   K%  Vx € K+  	  R # 5irQ   r¿  )Ú.0rž  s   & r#   Ú	<genexpr>Ú$_coerce_str_tuple.<locals>.<genexpr>ö  s   é € Ð>™E�q¤Z°´3×%7”¼A—’›Eùs   ‚3Ÿ3©
3)rZ   rk  Útupler]   s   &r#   Ú_coerce_str_tuplerÎ  ò  s4   € ä�eœT×"Ò"ÙßŒ5Ñ>™EÓ>�5Ð>ˆ5Ñ>™EÓ>Ó>Ð>r"   r&   r   c                ó"   € \        V \        4      # rQ   )rŒ  rÂ   ©rž  s   &r#   Ú<lambda>rÑ  ý  s   € œ{¨1¬cÔ2r"   r   c                ó"   € \        V \        4      # rQ   )rŒ  rÃ   rÐ  s   &r#   rÑ  rÑ  þ  s   € ¤¨Q´Ô!6r"   r;   r9   c                ó   € \        V 4      # rQ   )Ú_parse_gaugesrÐ  s   &r#   rÑ  rÑ     s	   € ¬=¸Ô+;r"   c               ó   € V ^8„  d   QhRR/# r   r   )rN   s   "r#   rO   rO     s   € ÷ ñ ˜ñ r"   c                ó   € ^ RI Hp V! V 4      # )r6  )Úparse_gauges)rÀ   r×  )rU   r×  s   & r#   rÔ  rÔ    s   € Ý/Ù˜ÓÐr"   )r‰  r”  rC  rú   r}   )Ú	firecrawlÚfalz	fal-videozopenai-audiozbrowser-useÚmodalrQ   )MÚ__conditional_annotations__r@   Ú
__future__r   r'  r  r  Ú	threadingr  Úurllib.requestr{  Údataclassesr   r   r   r   r   r   Útypingr	   r
   r   rb   ÚTOOL_COVERAGE_CATEGORIESr  r   r    ÚLockr  r   r   r%   r8   rB   r‹   rØ   r×   rS   r^   r`   r­   r¶   rÌ   rÞ   rÙ   rð   r  r  r  r,  r  r2  r  rÿ   rþ   r9  rH  rG  rM  rT  r   rU  rŽ  r˜  r™  rû   rª   r—  r²  rý   rc  r:  r  rŒ  rÎ  r¢  rÔ  )rÛ  s   @r#   Ú<module>rã     sy  øðÜ 9å "ã Û Û Û Û Û ß 0Ñ 0ß ,Ñ ,ß )Ñ )ð  Ð VÕWÐ ð
 eÐ àÐ ØGKÐ ÐDÓ KØ$Ÿ>š>Ó+Ð ð )-Ð ˜Ó ,ñ �$Ô÷-ð -ó ð-ñ �$Ô÷;ð ;ó ð;ñ& �$Ô÷1ð 1ó ð1ñ" �$Ô÷<ð <ó ð<ð !Ð àQÐ ØRÐ õGõCñ �$Ô÷<*ð <*ó ð<*÷~
)÷(õ ð<BØHVðBà!%ðBàJNðBð ÷BðJ,Ø_d÷,õ^"ðD¸ð DÐZ\÷ Dõ@ð"°u÷ õ.
1õ	Dõõqõ<õ(Põ8]õ"Fõ-õ&X÷8õ#õLõ@	Wõ{õ
Að
ØHLð
à,0ð
àPT÷
õ:õ4õHõCõ
	õ?õ6õõ?ð �[Ø�lØÑ2ØÑ6ØÐ!2ØÑ!;ð€	÷r"   