+
    jHàjW4  ã                  óJ  € 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	t	^ RI
t
^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ]'       d   ^ RI&H't' ]PP                  ! R4      t) ! R R4      t*R# )zKExtracted gateway session_execution responsibility; consumed by TurnRunner.)ÚannotationsN)Úsuppress)Údatetime)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional)Ú_accepts_keyword)Ú#strip_stale_dangerous_confirmations)ÚPlatform)Ú(repair_explicit_computer_use_media_paths)ÚBasePlatformAdapter)Úapi_runtime_locked)ÚTurnContext)Úcfg_get)Úis_truthy_value)ÚGatewayRunnerzgateway.runc                  óŠ   € ] tR t^!t]P
                   ! R R4      4       tR R ltR R ltR t	R t
R	 tR
 R ltR tR tRtR# )ÚGatewaySessionAgentMixinc                  óB   € ] tR t^$t$ RtR]R&   RtR]R&   RtR]R&   RtR# )	Ú+GatewaySessionAgentMixin._CachedAgentLookupNr   ÚagentFÚboolÚreusedÚevicted© )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__annotations__r   r   Ú__static_attributes__r   ó    Ú>/home/ubuntu/.hermes/hermes-agent/gateway/session_execution.pyÚ_CachedAgentLookupr   $   s    ‡ àˆˆsÓØˆ�ÓØˆ�×r#   r%   c               ó   € V ^8„  d   QhRR/# )é   Úreturnr   r   )Úformats   "r$   Ú__annotate__Ú%GatewaySessionAgentMixin.__annotate__*   s   € ÷ Wñ W°4ñ Wr#   c                óª  € ^ RI Hp V! V P                  V P                  P                  4      pV'       d   VP
                  # V P                  P                  P                  R4      ;'       g    / P                  R4      ;'       g    / p\        V\        4      '       g   R# \        VP                  V4      ;'       g    / P                  R4      4      # )z›gateway.platforms.<plat>.skip_context_files: messaging platforms may opt out of
filesystem-heavy context-file discovery (SOUL.md, AGENTS.md, .cursorrules).©Úpolicy_for_sourceÚgatewayÚ	platformsFÚskip_context_files)Úgateway.session_policyr.   Ú_runnerÚ_ctxÚsourceÚignore_rulesÚuser_configÚgetÚ
isinstanceÚdictr   )ÚselfÚplatform_keyr.   ÚpolicyÚplatforms_cfgs   &&   r$   Ú_skip_context_filesÚ,GatewaySessionAgentMixin._skip_context_files*   s¢   € õ 	=Ù" 4§<¡<°·±×1AÑ1AÓBˆßØ×&Ñ&Ð&ØŸ™×.Ñ.×2Ñ2°9Ó=×CÐCÀ×HÑHÈÓU×[Ð[ÐY[ˆô ˜-¬×.Ò.ÙÜ�]×&Ñ& |Ó4×:Ð:¸×?Ñ?Ð@TÓUÓVÐVr#   c               ó   € V ^8„  d   QhRR/# )r'   r(   Útupler   )r)   s   "r$   r*   r+   8   s   € ÷ ñ ¸ñ r#   c                ó  € V P                   pRpV'       dT   VeP   V;_uu_ 4        VP                  VP                  4      pRRR4       X'       d   \        V4      ^8”  d
   V^,          pRpVer   VP                  ed   WCP                  8w  dT   \        \        4      ;_uu_ 4        V P                  P                  P                  WCP                  R7      pRRR4       WF3# WF3#   + '       g   i     L«; i  + '       g   i     YF3# ; i)u  (peeked cached session_id, is_dead) â€” checked OUTSIDE the cache lock. "cached sid != current
sid" normally means an intentional switch (reuse), but the routing-key self-heal yields the same
shape with an agent bound to a DEAD session; reusing it re-binds the dead sid and loops.NF)Úsession_key)
r4   r8   rD   ÚlenÚ
session_idr   Ú	Exceptionr3   Úsession_storeÚ_is_session_ended_in_db)r;   Ú
cache_lockÚcacheÚctxÚpeek_sidÚentryÚdeads   &&&    r$   Ú_cached_sid_is_deadÚ,GatewaySessionAgentMixin._cached_sid_is_dead8   sÆ   € ð �i‰iˆØˆß˜%Ò+ß’ØŸ	™	 #§/¡/Ó2�÷ çœ˜U› aœØ  �8�ØˆØÒ C§N¡NÒ$>À8Ï~É~ÔC]ô œ)×$Õ$Ø—|‘|×1Ñ1×IÑIÈ(×`oÑ`oÐIÓp�÷ %àˆ~Ðˆxˆ~Ð÷ —ú÷ %Ö$àˆ~Ðús   ¥C$Â%1C7Ã$C4	Ã7D		c                óˆ  € V P                   pV P                  P                  e   VP                  '       g   R# Rp\	        \
        4      ;_uu_ 4        V P                  P                  P                  P                  VP                  4      pV'       d   VP                  R^ 4      pRRR4       V#   + '       g   i     T# ; i)zRCross-process write guard input: the session's current DB message_count (or None).NÚmessage_count)	r4   r3   Ú_session_dbrF   r   rG   Ú_dbÚget_sessionr8   )r;   rL   ÚcountÚrows   &   r$   Ú_current_message_countÚ/GatewaySessionAgentMixin._current_message_countK   s‰   € à�i‰iˆØ�<‰<×#Ñ#Ò+°3·>·>°>ÙØˆÜ”i× Õ à—,‘,×*Ñ*×.Ñ.×:Ñ:¸3¿>¹>ÓJˆCßØŸ™ °Ó3�÷	 !ð
 ˆ÷ !Ö ð
 ˆús   ÁAB0Â0C	c                óö   € ^ RI Hp V P                  P                  P	                  V P
                  P                  R4      p\        V\        4      '       d   V'       d
   V^ ,          MRpV'       d   W1Jd   V# R# )a  Evict under the lock but DEFER release (release_clients can block on memory-provider /
socket teardown while the idle sweeper waits on this lock). The turn rebuilds a fresh agent, so
the caller does a SOFT release that keeps sandbox / browser / bg processes.)Ú_AGENT_PENDING_SENTINELN)	Úgateway.runr\   r3   Ú_agent_cacheÚpopr4   rD   r9   rB   )r;   r\   r   r   s   &   r$   Ú_pop_cached_agent_for_evictionÚ7GatewaySessionAgentMixin._pop_cached_agent_for_evictionX   sX   € õ 	8Ø—,‘,×+Ñ+×/Ñ/°·	±	×0EÑ0EÀtÓLˆÜ(¨´%×8Ò8¿W�˜–
È$ˆß %Ó"FˆuÐPÈDÐPr#   c           	     	ó¼  € V P                   pV P                  4       p	V'       d   Vf   V	# T;_uu_ 4        VP                  VP                  4      p
V
'       d   V
^,          V8X  g   V	uuR R R 4       # \	        V
4      ^8”  d
   V
^,          MR p\	        V
4      ^8”  d
   V
^,          MR pVR J;'       d%    VP
                  R J;'       d    WÈP
                  8g  pV'       d2   V'       d*   WÅ8X  d$   \        P                  RVP                  V4       EMV'       g1   Ve-   Ve)   W{8w  d#   \        P                  RVP                  W·4       MÎV
^ ,          V	n        \        VR4      '       d<   \        \        4      ;_uu_ 4        VP                  VP                  4       R R R 4       V P                  P                  V	P                  VP                  4       WIP                  n        \        P#                  RVP                  4       RV	n        V	uuR R R 4       # V P'                  4       V	n        R R R 4       V	#   + '       g   i     L¢; i  + '       g   i     T	# ; i)NuÃ   Agent cache invalidated for session %s: cached agent's session_id %s is ended in state.db (stale self-heal artifact, #54878 x #54947) â€” discarding instead of reusing across the routing recoveryzfAgent cache invalidated for session %s: message_count changed (%s -> %s), possible cross-process writeÚmove_to_endz#Reusing cached agent for session %sT)r4   r%   r8   rD   rE   rF   ÚloggerÚinfor   Úhasattrr   ÚKeyErrorrc   r3   Ú_init_cached_agent_for_turnÚ_interrupt_depthÚmax_iterationsÚdebugr   r`   r   )r;   ÚsigrJ   rK   rj   rM   rO   Ú	msg_countrL   ÚoutÚcachedÚ	cached_mcÚ
cached_sidÚsid_mismatchs   &&&&&&&&      r$   Ú_lookup_cached_agentÚ-GatewaySessionAgentMixin._lookup_cached_agenta   sÊ  € Ø�i‰iˆØ×%Ñ%Ó'ˆß˜uÒ0ØˆJßŠZØ—Y‘Y˜sŸ™Ó/ˆFß˜v a�y¨CÔ/Ø÷ ŠZô &)¨£[°1¤_˜˜qž	¸$ˆIÜ&)¨&£k°A¤o˜ ž¸4ˆJð &¨TÐ1×qÐq°c·n±nÈDÐ6P×qÐqÐU_×cqÑcqÑUqˆL÷ §¨Ô)?Ü—‘ð:ð <?¿?¹?ÈJö÷ " iÒ&;À	Ò@UÐZcÔZpÜ—‘ð3à47·O±OÀYõð # 1�I�”	ä˜5 -×0Ò0Ü!¤(×+Õ+Ø×)Ñ)¨#¯/©/Ô:÷ ,à—‘×8Ñ8¸¿¹ÀC×DXÑDXÔYà+9—	‘	Ô(Ü—‘ÐBÀCÇOÁOÔTØ!�”
Ø÷M ŠZðN ×=Ñ=Ó?ˆCŒK÷O ðP ˆ
÷ ,×+ú÷? ŽZðP ˆ
úsP   µ3I
Á3A I
Â4I
Ã
I
Ã!I
Ã)0I
ÄA'I
ÆH7	ÆA0I
ÈI
È7IÉI
É
I	c               ó   € V ^8„  d   QhRR/# )r'   r(   ÚNoner   )r)   s   "r$   r*   r+   �   s   € ÷ 
ñ 
¨tñ 
r#   c                ó¼   € V P                   P                  V P                   P                  V3R\        V P                  P
                  4      R,           2RR7       R# )zSOff-lock soft release on a daemon thread so teardown never blocks the gateway loop.zagent-xproc-evict-:Né   NT)Úinline_fallbackN)r3   Ú_spawn_release_threadÚ_release_evicted_agent_softÚstrr4   rD   )r;   r   s   &&r$   Ú_release_evicted_agentÚ/GatewaySessionAgentMixin._release_evicted_agent�   sQ   € à�‰×*Ñ*Ø�L‰L×4Ñ4°u°hÐBTÔUXÐY]×YbÑYb×YnÑYnÓUoÐpsÕUtÐTuÐ@vØ ð 	+ö 	
r#   c                	óº  € ^ RI Hp V P                  p	V P                  p
V	P                  p^ RIHp ^ RIHp ^ RI	H
p V! W«4      pV	P                  ! R1RVR,          /VR,          BV! V	P                  4      B/ RVbR\        T;'       d    VP                  4      '       * bR	R
bRV	P                  bRV	P                   bRT;'       g    RbRV'       d   V! V! V
4      WûP"                  4      MV
P$                  ;'       g    RbRVbRV
P&                  bRVP)                  R4      bRVP)                  R4      bRVP)                  R4      bRVP)                  R4      bRVP)                  R4      bRVP)                  RR
4      bRVP)                  R4      bRV	P*                  bR VbR!VP,                  bR"VP.                  bR#VP0                  bR$VP"                  bR%VP2                  bR&VP4                  bR'VP6                  bR(V	P8                  bR)\;        V
P<                  R*V
P<                  4      bR+\?        4       '       d   RMV P                  PA                  4       bR,VbR-\        T;'       d    VPB                  4      '       * bR.\        T;'       d    VPB                  4      bR/\        T;'       d    VPD                  4      bR0V'       d   VPF                  bB # RbB # )2é    )Ú_checkpoint_agent_kwargs)Úactive_authorityr-   )Úsession_prefillÚmodelÚruntimerj   Ú
quiet_modeÚverbose_loggingFÚenabled_toolsetsÚdisabled_toolsetsÚephemeral_system_promptNÚprefill_messagesÚreasoning_configÚservice_tierÚrequest_overridesÚproviders_allowedÚonlyÚproviders_ignoredÚignoreÚproviders_orderÚorderÚprovider_sortÚsortÚprovider_require_parametersÚrequire_parametersÚprovider_data_collectionÚdata_collectionrF   ÚplatformÚuser_idÚuser_id_altÚ	user_nameÚchat_idÚ	chat_nameÚ	chat_typeÚ	thread_idÚgateway_session_keyÚ
session_dbrU   Úfallback_modelr1   Úload_soul_identityÚskip_memoryÚpass_session_idÚrun_budget_secondsr   )$r]   r�   r4   r3   r5   Úgateway.session_authoritiesr‚   r2   r.   Ú gateway.session_worker_constructrƒ   ÚAIAgentr7   r   Úverboserˆ   r‰   rŸ   Ú_prefill_messagesÚ_service_tierr8   rF   rœ   r�   rž   r    r¡   r¢   rD   ÚgetattrrT   r   Ú_refresh_fallback_modelr6   r¨   r©   )r;   Ú
turn_router<   Úcombined_ephemeralrj   rŒ   Úprr1   r�   rL   ÚrunnerÚsrcr‚   r.   rƒ   r=   s   &&&&&&&&        r$   Ú_build_fresh_agentÚ+GatewaySessionAgentMixin._build_fresh_agent—   s  € å8Ø�i‰iˆØ—‘ˆØ�j‰jˆÝ@Ý<ÝDÙ" 6Ó/ˆØ�{Š{ñ 
Ø˜WÕ%ð
Ø)3°IÕ)>ð
ÙBZÐ[^×[jÑ[jÓBkò
á)ð
ä:>¸v×?XÐ?XÈ&Ï.É.Ó:YÕ6Yð
ákpð
ð !×1Ò1ð
ð FI×EZÒEZð
ð %7×$>Ð$>¸$øð	
÷
 ag™oÑ.>¸vÓ.FÈ×P[ÑP[Ô\Ø#)×#;Ñ#;÷Eð EØ@Døð
ñ .ð
ð =C×<PÒ<Pð
ð )Ÿn™nÐ-@ÔAð
ð !Ÿf™f Vœnð
ð ACÇÁÀxÔ@Pð
ð ce×bhÑbhÐipÔbqð
ð Ÿ&™& œ.ð
ð GIÇfÁfÐMaÐchÔFið
ð &(§V¡VÐ,=Ô%>ð
ð —~’~ð
ñ 1=ð
ð —K’Kð
ð .1¯_ª_ð
ð ILÏÊð
ð —K’Kð
ð ,/¯=ª=ð
ð EHÇMÂMð
ð ^a×]jÒ]jð
ð !$§¢ð
ô  ˜v×1Ñ1°5¸&×:LÑ:LÔMð!
ô& $6×#7Ò#7™4¸T¿\¹\×=aÑ=aÓ=cøð'
ñ(  2ð)
ô, $(¨×(FÐ(F°6×3FÑ3FÓ#GÕGð-
ô. ˜V×;Ð;¨×(;Ñ(;Ô<ð/
ô0 ! ×!BÐ!B¨F×,BÑ,BÔCð1
÷6 =C˜v×8Ò8ñ7
ð 	
ñ6 IMñ7
ð 	
r#   c                óF  € V P                   pV P                  pV P                  V4      p	VP                  VR,          VR,          VP                  VVP                  VP                  4      \        VP                  RR4      \        VP                  RR4      V	R7      p
\        VRR4      p\        VRR4      pV P                  W¼4      w  rÞV P                  4       pV P                  W«WÄWÞV4      pVP                  p\        4       RJpVP                  '       d`   Ve\   V'       dT   \        VR	R
4      '       dA   VR
RuVn        Vn        pV;_uu_ 4        VP!                  VP"                  R4       RRR4       VP                  '       d9   Ve5   V P                  P%                  TV'       d   RMVP'                  4       4       VP                  e   V P)                  VP                  4       Vf€   V P+                  WW4WVV	4      pV'       dC   Ve?   V;_uu_ 4        VW¯VP,                  3WÇP"                  &   VP/                  4        RRR4       \0        P3                  RVP"                  V
4       VVP                  3#   + '       g   i     EL; i  + '       g   i     LS; i)u›   Reuse this session's cached AIAgent (frozen system prompt + tool schemas â†’ prompt cache
hits) or build a fresh one. Returns (agent, reused_cached_agent).r„   r…   rœ   Nr�   )Ú
cache_keysrœ   r�   r1   Ú_agent_cache_lockr^   Ú_fallback_activatedFz)Created new agent for session %s (sig=%s))r4   r3   r?   Ú_agent_config_signaturerˆ   Ú_extract_cache_busting_configr7   r°   r5   rP   rY   rs   r   r   r   r   r_   rD   Ú_apply_fallback_chain_to_agentr±   r}   r·   rF   Ú_enforce_agent_cache_caprd   rk   )r;   r²   r<   r³   rj   rŒ   r´   rL   rµ   r1   rl   rJ   rK   rM   rO   rm   Úfoundr   Úlockeds   &&&&&&&            r$   Ú_resolve_turn_agentÚ,GatewaySessionAgentMixin._resolve_turn_agent¿   s)  € ð �i‰iˆØ—‘ˆØ!×5Ñ5°lÓCÐØ×,Ñ,Ø�wÕ ¨IÕ!6¸×8LÑ8LÐN`Ø×;Ñ;¸C¿O¹OÓLÜ˜CŸJ™J¨	°4Ó8Ü §
¡
¨M¸4Ó@Ø1ð -ó 
ˆô ˜VÐ%8¸$Ó?ˆ
Ü˜ °Ó5ˆØ×1Ñ1°*ÓD‰ˆØ×/Ñ/Ó1ˆ	Ø×)Ñ)¨#¸5ÐRZÐbkÓlˆØ—‘ˆô $Ó%¨TÐ1ˆØ�<�<ˆ<˜EÒ-·&¼WÀUÐLaÐch×=iÒ=ià16¸¸tÐ.ˆEŒM˜5œ<¨ß’Ø—	‘	˜#Ÿ/™/¨4Ô0÷ à�<�<ˆ<˜EÒ-Ø�L‰L×7Ñ7¸Çv¹tÐSY×SqÑSqÓSsÔtØ�=‰=Ò$Ø×'Ñ'¨¯©Ô6ØŠ=Ø×+Ñ+ØÐ*<ÐN^ÐdvóˆE÷ ˜eÒ/ß’Zð /4°SÀSÇ^Á^Ð-T�EŸ/™/Ñ*Ø×3Ñ3Ô5÷	  ô
 �L‰LÐDÀcÇoÁoÐWZÔ[Ø�e—l‘lÐ"Ð"÷# —�ú÷  —Zús   ÅI<È,JÉ<J	ÊJ 	r   N)r   r   r   r    ÚdataclassesÚ	dataclassr%   r?   rP   rY   r`   rs   r}   r·   rÃ   r"   r   r#   r$   r   r   !   sM   † ð ×Ñ÷ð ó ðõ
Wõò&òQò-õ^
ò&
öP+#r#   r   )+Ú__doc__Ú
__future__r   ÚasynciorÅ   ÚjsonÚloggingÚqueueÚreÚ	threadingÚtimeÚ
contextlibr   r   Útypingr   r   r   r   r	   Úagent.interrupt_compatr
   Úagent.replay_cleanupr   Úgateway.configr   Úgateway.media_repairr   Úgateway.platforms.baser   Úgateway.session_api_turnr   Úgateway.turn_contextr   Úhermes_cli.configr   Úutilsr   r]   r   Ú	getLoggerrd   r   r   r#   r$   Ú<module>rÜ      sn   ðÙ QÝ "ã Û Û Û Û Û 	Û Û Ý Ý ß ;Õ ;å 3Ý DÝ #Ý IÝ 6Ý 7Ý ,Ý %Ý !çÝ)ð 
×	Ò	˜=Ó	)€÷I#ó I#r#   