+
    jHàj<   ã                   óh   € R t ^ RIt^ RIt^ RIHt ^ RIHt ]P                  ! ]	4      t
R tR tR tR# )ap  A model pick on a session with a running turn lands for the next turn (RT-12).

The pick is authorized and validated when it arrives, kept durably in ``state_meta`` (latest pick
wins, survives an owner restart), and committed through ``session.mutate``'s own writer by the
drain at the next claim boundary, when nothing is executing. The running turn keeps its route.
N)ÚDEFERRED_PICK_PREFIX)ÚRuntimeStoreErrorc                óº  a aaaaa	a
aa€ ^ RI Hp ^ RIHoHoHpHo V! RSR,          4       V! VP                  SP                  SR,          RSR,          SP                  R4      SP                  R4      R7      w  o
o	S! R	VP                  RSR,          RSR,          R
RSR,          ,           /4      oVVV V	V
VVVV3	R lpS P                  P                  V4      # )aa  Record *params* (an authorized ``model`` mutation refused only because a turn is running).

Blocking SQLite: callers run it off the event loop. Acceptance writes the request's durable
mutation receipt in the same transaction, so an exact retry returns this result instead of
overwriting a newer pick, and the stored pick carries a stable application id.)Úvalidate_action)Ú_epochÚ_jsonÚmutation_receipt_keyÚreplay_mutation_receiptÚmodelÚpayloadÚ
request_idÚexpected_revisionÚexpected_generation)Ú	operationr   r   r   Úprincipal_idÚapplication_idzdeferred-pick:c                 ó¸  <	€ S! V SP                   4       S! V SS4      pVe   V# V P                  RS
P                  34      P                  4       pVf   \	        R4      hRS
P                  RRRRRS	R,          R,          R	V^ ,          R
V^,          /pV P                  R\
        S
P                  ,           S34       V P                  RSS! RSRV/4      34       V# )NzDSELECT runtime_revision, runtime_generation FROM sessions WHERE id=?Ú	not_foundÚ
session_idr   r
   ÚstatusÚdeferredr   ÚrevisionÚexecution_generationzaINSERT INTO state_meta(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.valuez-INSERT INTO state_meta(key,value) VALUES(?,?)ÚdigestÚresult)ÚepochÚexecuter   Úfetchoner   Ú_PREFIX)ÚconnÚreplayÚrowr   r   r   Ú	authorityr   ÚkeyÚparamsÚrefr	   Úvalues   &   €€€€€€€€€ÚB/home/ubuntu/.hermes/hermes-agent/gateway/session_deferred_pick.pyÚwriteÚdefer_pick.<locals>.write   sç   ø€ Ùˆt�Y—_‘_Ô%Ù(¨¨s°FÓ;ˆØÒØˆMØ�l‰lÐaØŸN™NÐ,ó.ß.6©h«jð 	àŠ;Ü# KÓ0Ð0Ø §¡°¸WÀhÐPZØ˜6 )Õ,¨WÕ5°zÀ3ÀqÅ6ÐKaÐcfÐghÕciðkˆà�‰ÐxÜ §¡Õ.°Ð6ô	8à�‰ÐDÀsÉEÐS[Ð]cÐemÐouÐRvÓLwÐFxÔyØˆó    )Úhermes_state_mutationsr   Úhermes_state_runtimer   r   r   r	   Úsubjectr   ÚgetÚdbÚ_execute_write)r"   Úactorr%   r$   r   r   r(   r   r   r   r#   r	   r&   s   f&ff   @@@@@@r'   Ú
defer_pickr2      sÈ   ÿø€ õ 7ßaÓaÙ�G˜V IÕ.Ô/Ù& u§}¡}°c·n±nÀfÈ\ÕFZÐfmØ/5°iÕ/@ÐTZ×T^ÑT^Ð_rÓTsØ;A¿:¹:ÐF[Ó;\ô^�K€Cˆñ �> 5§=¡=°,ÀÀ|Õ@TÐV_ÐagÐhqÕarØ#Ð%5¸¸|Õ8LÕ%LðNó O€E÷õ ð �<‰<×&Ñ& uÓ-Ð-r*   c              ƒ  óâ   a a"  € ^ RI pV V3R lpVP                  V4      G Rj  x€L
 pVe?   R\        P                  ! V^ ,          4      9   d   RVn        S P                  S4       R# R# R#  LH5i)z³A guarded pick asked only the viewers present at its boundary (and an owner restart drops
the stream): a newly attached viewer gets the ask again, re-checked at the next boundary.Nc                  óò   <€ SP                   P                  4       ;_uu_ 4       p V P                  R \        SP                  ,           34      P                  4       uuRRR4       #   + '       g   i     R# ; i©z(SELECT value FROM state_meta WHERE key=?N)r/   Ú	_read_ctxr   r   r   r   )r   r"   r%   s    €€r'   ÚreadÚreask_on_attach.<locals>.read6   sN   ø€ Ø�\‰\×#Ñ#×%Ô%¨Ø—<‘<Ð JÌWÐWZ×WeÑWeÕMeÐLgÓh×qÑqÓs÷ &×%×%Ó%ús   ¤6A%Á%A6	Úawaiting_confirmT)ÚasyncioÚ	to_threadÚjsonÚloadsÚ
reask_pickÚ	_schedule)r"   r%   Úliver:   r7   Ústoreds   ff&   r'   Úreask_on_attachrB   1   sd   ùé € ó ötð ×$Ñ$ TÓ*×*€FØÒÐ0´D·J²J¸vÀa½yÓ4IÔIØˆŒØ×Ñ˜CÖ ñ JÑñ +ùs   „ A/¤A-¥A	A/c              ƒ  ó
  a aaaaa"  € ^ RI p^ RIHp ^ RIHp \
        VP                  ,           oV V3R lpVP                  V4      G Rj  x€L
 oSf   R# \        P                  ! S^ ,          4      oRS9   dB   VP                  '       g   R# SP                  4        UUu/ uF  w  rxVR8w  g   K  WxbK  	  uppoRVn
        SR,          p	VP                  VS P                  SR,          VP                  V	4      G Rj  x€L
 '       d6   VP                  S P                  P                  VV3R	 l4      G Rj  x€L
  R# VP                  S P                  P                  VP                  4      G Rj  x€L
 p
R
VP                  RV	RV
R,          RV
R,          RRRSR,          /p^ RIHp  V! S WRSR,          R7      G Rj  x€L
 oSP-                  R4      R8X  Ed   ^ RIHo TP                  S P                  P                  TTTTT3R l4      G Rj  x€L
  TP                  S P                  P                  TP                  4      G Rj  x€L
 ;'       g    / p\        P                  ! TP-                  R4      ;'       g    R4      P-                  R 4      pTP2                  P5                  TP                  / SCRSR,          R!TP-                  R4      /CT'       d   R"T/M/ CR#R$7       R# TP                  S P                  P                  TT3R% l4      G Rj  x€L
  SP-                  R4      R8X  Ed   \(        P7                  R&TP                  SP-                  R4      4       TP                  S P                  P                  TP                  4      G Rj  x€L
 ;'       g    / p\        P                  ! TP-                  R4      ;'       g    R4      P-                  R 4      pTP2                  P5                  TP                  / SCR'SR,          R,          RTP-                  R4      /CT'       d   R T/M/ CR#R$7       R# R#  ELüu uppi  ELR EL ELå EL™  T d     R# \"         dA   pTP$                  R8X  d    Rp?R# R
TP                  RRRRRTP$                  /o Rp?ELæRp?i\&         d9    \(        P+                  RTP                  4       R
TP                  RRRRRR/o EL+i ; i ELá EL¬ ELÞ ELb5i)(zµCommit a deferred pick. The drain calls this under the claim gate and mutation lock, before
claiming, so no turn is running. A pick that no longer resolves is dropped and announced.N)Úwrite_mutation)Úhas_mutation_receiptc                  óÈ   <€ SP                   P                  4       ;_uu_ 4       p V P                  R S34      P                  4       uuRRR4       #   + '       g   i     R# ; ir5   )r/   r6   r   r   )r   r"   r#   s    €€r'   r7   Ú!apply_deferred_pick.<locals>.readG   sA   ø€ Ø�\‰\×#Ñ#×%Ô%¨Ø—<‘<Ð JÈSÈFÓS×\Ñ\Ó^÷ &×%×%Ó%ús   ¤!AÁA!	r9   Fr   r   c                 ó:   <€ V P                  R SS^ ,          34      # ©z.DELETE FROM state_meta WHERE key=? AND value=?©r   ©r   r#   rA   s   &€€r'   Ú<lambda>Ú%apply_deferred_pick.<locals>.<lambda>Y   s   ø€ È$Ï,É,Ø<¸sÀFÈ1ÅIÐ>NôKPr*   r   r   r   Úruntime_revisionr   Úruntime_generationr   r
   r   )ÚMUTATION_GUARD_REFUSALS)r   Úsession_busyr   ÚrefusedÚreasonz+Deferred model pick on %s failed to resolveÚmodel_resolution_failedÚconfirmation_required)r   c           	      ób   <€ V P                  R S! / SCRSR,          /C4      SS^ ,          34      # )z5UPDATE state_meta SET value=? WHERE key=? AND value=?r9   ÚconfirmrJ   )r   r   r#   Úpickr   rA   s   &€€€€€r'   rL   rM   t   s:   ø€ È$Ï,É,ØCÙÐB�dÐBÐ.°°yÕ0AÑBÓCÀSÈ&ÐQRÍ)ÐTôKVr*   Úmodel_configz{}ÚproviderÚcommitted_modelÚcommitted_providerzsession.updated)Ú
event_typec                 ó:   <€ V P                  R SS^ ,          34      # rI   rJ   rK   s   &€€r'   rL   rM   ~   s   ø€ ÀdÇlÁlØ8¸3ÀÀqÅ	Ð:JôGLr*   z)Deferred model pick on %s not applied: %sÚtarget_model)r:   Úgateway.session_mutationsrD   Ú hermes_state_mutation_retirementrE   r   r   r;   r<   r=   r>   Úitemsr/   r0   Úget_sessionÚhermes_state_mutation_guardsrP   r   rS   Ú	ExceptionÚloggerÚ	exceptionr.   r,   r   Úevent_streamÚpublishÚwarning)r"   r%   r@   r:   rD   rE   r7   ÚkÚvr   r!   r$   rP   ÚexcÚcurrentrZ   r   r#   rX   r   rA   s   f&&             @@@@@r'   Úapply_deferred_pickro   ?   s}  ýé € ó Ý8ÝEÜ
�C—N‘NÕ
"€Cö_ð ×$Ñ$ TÓ*×*€FØ‚~ÙÜ�:Š:�f˜Q•iÓ €DØ˜TÔ!Ø��ˆÙð "&§¡¤ÔI¡™˜°Ð6HÑ1H”�’¡ÒIˆØ€D„OØÐ*Õ+€NØ×ÑÐ3°Y·\±\À4ÈÕCWÐY\×YgÑYgØ-ó/÷ /ö /ð ×Ñ 	§¡× ;Ñ ;õ >Pó Q÷ 	Qð 	QáØ×!Ñ! )§,¡,×":Ñ":¸C¿N¹NÓK×
K€CØ˜CŸN™N¨L¸.Ø! 3Ð'9Õ#:Ð<QÐSVÐWkÕSlØ˜7 I¨t°I­ð@€Fõ Eð7Ù% i°¸dÐQUÐVdÕQeÔf×fˆð ‡z�z�(ÓÐ6Õ6õ 	/Ø×Ñ 	§¡× ;Ñ ;÷ >Vð >Vó W÷ 	Wð 	Wð  ×)Ñ)¨)¯,©,×*BÑ*BÀCÇNÁNÓS×S×YÐYÐWYˆÜ—:’:˜gŸk™k¨.Ó9×AÐA¸TÓB×FÑFÀzÓRˆà×Ñ×!Ñ! #§.¡.ð 3FØð3FØ  i¥Ð2CÀWÇ[Á[ÐQXÓEYñ3Fç3;Ð$ hÑ/Àð3FàRcð 	"ô 	eñ 	Ø
×
Ñ
˜IŸL™L×7Ñ7õ :Ló M÷ Mð Mà‡z�z�(Ó˜yÕ(Ü�‰ÐBÀCÇNÁNÐTZ×T^ÑT^Ð_gÓThÔið  ×)Ñ)¨)¯,©,×*BÑ*BÀCÇNÁNÓS×S×YÐYÐWYˆÜ—:’:˜gŸk™k¨.Ó9×AÐA¸TÓB×FÑFÀzÓRˆØ×Ñ×!Ñ! #§.¡.ð 3<Øð3<Ø$ d¨9¥o°gÕ&>ÀÈÏÉÐU\ÓI]ñ3<ç)1�
˜HÑ%°rð3<àHYð 	"ö 	[ñ )òm +ùó Jò/ò	Qò Lò gøØ"ô ÚÜô qØ�:‰:˜Ô'ÝØ §¡°¸WÀhÐPYÐ[cÐeh×eoÑeoÐpŽûÜô 7ô 	×ÑÐFÈÏÉÔWØ §¡°¸WÀhÐPYØÐ5ð7‹ð	7úò	Wò TòMò Tùs=  ˆAT ÁQÁ?T ÂT Â!Q
Â1Q
Â7AT Ã>QÃ?	T Ä	.T Ä7QÄ89T Å1QÅ27T Æ*Q Ç QÇQ ÇAT ÈS4È7T ÉS7É
T É*T ÊAT Ë=T ÌS:ÌA>T ÎS=Î
T Î'*T ÏA#T Ð6T Ñ
T ÑT ÑT ÑQ ÑS1Ñ#T Ñ&S1Ñ/S1Ñ0R+ÒT ÒR+Ò%T Ò+S1Ò85S1Ó-T Ó0S1Ó1T Ó7T Ó:T Ó=T )Ú__doc__r<   ÚloggingÚhermes_state_mutation_preparedr   r   r,   r   Ú	getLoggerÚ__name__rf   r2   rB   ro   © r*   r'   Ú<module>rv      s:   ðñó Û å JÝ 2à	×	Ò	˜8Ó	$€ò.òB!ôI[r*   