+
    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	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHt ^ RIHtHtHtHtHtHtHtHtHtHt ]. ] 3,          t!]RÖ,          t"]R×,          t#^€t$RØt%RÙt&RÚt'Rt(Rt)]*! ]! ]"4      4      t+]*! 0 RÛm4      t,]*! 0 RÜm4      t-]*! 0 RÝm4      t.]*! 0 RÞm4      t/Rßt0]*! ]04      t1Rt2Rt3Rt4Rt5Rt6Rt7R t8R!t9R"t:R# R$ lt;R% R& lt<]<! ]8R	4      R']7 2,           t=]<! ]8R4      t>];! ]9 R(2R)]6 R']7 24      t?];! ]:R*4      t@];! R+R,4      tA];! R-R.4      tBR/tCR0R
]8]CR13R2R
]:R3R43R5R
]9 R62]CR73R8R
R9]CR:3R;R]9 R<2R=R>3/tD ! R? R@]E4      tF ! RA RB]F4      tG ! RC RD]F4      tH ! RE RF]F4      tI ! RG RH]F4      tJ ! RI RJ]F4      tK ! RK RL]F4      tL ! RM RN]F4      tM]! ]]G]$RO7      tN]! ]]GRP7      tO]! ]]GRQ]&RRRS7      tPRTRU/RV RW lltQRX RY ltRRZ R[ ltSR\ R] ltTR^ R_ ltU]! RRR`7       ! Ra Rb4      4       tV]! RRR`7       ! Rc Rd4      4       tW]! RRR`7       ! Re Rf4      4       tXRàRg Rh lltYRi Rj ltZRk Rl lt[Rm Rn lt\Ro Rp lt]Rq Rr lt^Rs Rt lt_RuRU/Rv Rw llt`Rx Ry ltaRz R{ ltbR]cR]cR]b! ]c4      R]b! ]PÈ                  4      R] R] R]b! ] 4      R]b! ] 4      R]b! ] 4      /	teR|]fR}&   R~RU/R R€ lltgR�RR/R‚ Rƒ llthRáR„ R… lltiR† R‡ ltjRˆ R‰ ltkRŠ R‹ ltlRŒ R� ltmRŽ R� ltnR� R‘ ltoR’ R“ ltpR” R• ltqR– R— ltrR˜ R™ ltsRâRš R› llttRœ R� ltuRž RŸ ltvR RR¡RRR¢RR£R/R¤ R¥ lltwR¢R/R¦ R§ lltxR]c/R¨ R© lltyRª R« ltzR¬ R­ lt{R® R¯ lt|R° R± lt}R² R³ lt~R´ Rµ ltR¶ R· lt€R¸ R¹ lt�Rº R» lt‚R¼ R½ ltƒR¾ R¿ lt„RÀ RÁ lt…RÂ RÃ lt†RÄ RÅ lt‡RÆ RÇ ltˆRÈ RÉ lt‰RÊ RË ltŠRÌ RÍ lt‹RR/RÎ RÏ lltŒRÐ]'RÑ](/RÒ RÓ llt�RÔ RÕ ltŽR# )ãa*  Durable execution state for a same-gateway hosted room driver.

Owns only the driver lease and task state machine: no model calls, no sessions, no dependency on the
hosted-room event log. Callers supply the database path and clock so recovery and fencing are testable
without process-global state.
)ÚannotationsN)Úclosing)ÚMapping)Ú	dataclass)Úpartial)ÚAnyÚCallableÚLiteralÚget_args)
ÚDbPathÚbounded_intÚcanonical_jsonÚcompact_jsonÚconnectÚfenced_updateÚ
identifierÚtable_columnsÚtextÚtransactionÚrunningÚindeterminateÚdeferredÚstoppingi   iè  Úlease_generationÚ
updated_atÚstatusÚexecution_generationÚcancel_generationÚrun_lease_generationÚresult_jsonÚ
created_atÚ
started_atÚterminal_atÚindeterminate_atz.ORDER BY source_event_seq, created_at, task_idz7SELECT * FROM hosted_room_driver_leases WHERE room_id=?zDSELECT * FROM hosted_room_driver_tasks WHERE room_id=? AND task_id=?zžCREATE INDEX {if_not_exists}idx_hosted_room_driver_tasks_status
           ON hosted_room_driver_tasks(room_id, status, source_event_seq, created_at, task_id)z.execution_generation=? AND cancel_generation=?zHrun_gateway_id=? AND run_process_generation=? AND run_lease_generation=?zZstatus=?, settlement_id=?, settlement_status=?, result_json=?, terminal_at=?, updated_at=?z\status='queued', run_gateway_id=NULL, run_process_generation=NULL, run_lease_generation=NULLzQstatus='cancelled', cancel_generation=?, cancel_id=?, terminal_at=?, updated_at=?c               ó$   € V ^8„  d   QhRRRRRR/# )é   Ú
set_clauseÚstrÚfenceÚreturn© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/gateway/hosted_room_driver.pyÚ__annotate__r-   A   s&   € ÷ iñ i˜Sð i¨ð i°ñ ió    c                ó   € R V  RV 2# )z$UPDATE hosted_room_driver_tasks SET z# WHERE room_id=? AND task_id=? AND r*   )r&   r(   s   &&r,   Ú_task_updater0   A   s   € Ø1°*°Ð=`ÐafÐ`gÐhÐhr.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   r&   r'   r   r)   r*   )r+   s   "r,   r-   r-   E   s&   € ÷ Rñ R 3ð R°ð R¸ñ Rr.   c                ó.   € \        V RV R\         24      # )zbTransition fenced on ``status`` + both generations (terminal settlements and the recovery family).zstatus='z' AND )r0   Ú_GENERATION_FENCE)r&   r   s   &&r,   Ú_generation_updater4   E   s   € ä˜
 h¨v¨h°fÔ=NÐ<OÐ$PÓQÐQr.   z AND z, started_at=NULL, updated_at=?zstatus='running' AND z8status IN ('queued', 'deferred') AND cancel_generation=?zAstatus='stopping', cancel_generation=?, cancel_id=?, updated_at=?z>status IN ('running', 'indeterminate') AND cancel_generation=?z/status='cancelled', terminal_at=?, updated_at=?z9status='stopping' AND cancel_id=? AND cancel_generation=?z%indeterminate task generation changedÚresolvez0indeterminate task changed during reconciliationÚresolve_cancelz)indeterminate cancellation proof is stalez/indeterminate cancellation proof lost its fenceÚrequeuez6, started_at=NULL, indeterminate_at=NULL, updated_at=?z)indeterminate task changed during requeueÚdeferz=status='deferred', result_json=?, terminal_at=?, updated_at=?z*indeterminate task changed during deferralÚrequeue_deferredzZ, result_json=NULL, started_at=NULL, terminal_at=NULL, indeterminate_at=NULL, updated_at=?z deferred task generation changedz$deferred task changed during requeuec                  ó   € ] tR t^itRtRtR# )ÚDriverStateErrorz>Base class for invalid or conflicting driver-state operations.r*   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r*   r.   r,   r;   r;   i   s   † Õ$hr.   r;   c                  ó   € ] tR t^jtRtRtR# )ÚDriverValidationErrorz=Raised when an identifier, clock, TTL, or payload is invalid.r*   Nr<   r*   r.   r,   rD   rD   j   s   † Õ/rr.   rD   c                  ó   € ] tR t^ktRtRtR# )ÚRoomUnavailableErrorz<Raised when the hosted room does not exist or was disbanded.r*   Nr<   r*   r.   r,   rF   rF   k   s   † Õ.pr.   rF   c                  ó   € ] tR t^ltRtRtR# )ÚLeaseHeldErrorz>Raised when another unexpired driver generation owns the room.r*   Nr<   r*   r.   r,   rH   rH   l   s   † Õ(lr.   rH   c                  ó   € ] tR t^mtRtRtR# )ÚStaleLeaseErrorz?Raised when a lease generation can no longer mutate room state.r*   Nr<   r*   r.   r,   rJ   rJ   m   s   † Õ)nr.   rJ   c                  ó   € ] tR t^ntRtRtR# )ÚTaskConflictErrorzBRaised when an idempotency key is reused for different task state.r*   Nr<   r*   r.   r,   rL   rL   n   s   † Õ+sr.   rL   c                  ó   € ] tR t^otRtRtR# )ÚStaleTaskErrorzERaised when an obsolete task attempt or cancellation tries to commit.r*   Nr<   r*   r.   r,   rN   rN   o   s   † Õ(sr.   rN   c                  ó   € ] tR t^ptRtRtR# )ÚInvalidTaskTransitionErrorz7Raised when a requested task transition is not allowed.r*   Nr<   r*   r.   r,   rP   rP   p   s   † Õ4qr.   rP   )ÚerrorÚ	max_chars)rQ   ÚresultT)rQ   ÚlabelÚ	max_bytesÚensure_asciiÚpositiveFc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   ÚcomputezCallable[[], Any]Úmessager'   rW   Úboolr)   Úfloatr*   )r+   s   "r,   r-   r-   y   s*   € ÷ ñ Ð&ð °ð À4ð ÐTYñ r.   c               óè   €  \        V ! 4       4      p\
        P                  ! T4      '       d   T'       d   T^ 8:  d   \	        T4      hT#   \        \        \        3 d   p\	        T4      ThR p?ii ; i©N)r\   Ú	TypeErrorÚ
ValueErrorÚOverflowErrorrD   ÚmathÚisfinite)rY   rZ   rW   ÚvalueÚexcs   &&$  r,   Ú_finiterf   y   sb   € ð6Ü‘g“iÓ ˆô �=Š=˜×Ò§H°¸!´Ü# GÓ,Ð,Ø€Løô	 ”z¤=Ð1ô 6Ü# GÓ,°#Ð5ûð6ús   ‚A
 Á
A1Á A,Á,A1c               ó    € V ^8„  d   QhRRRR/# )r%   ÚclockÚClockr)   r\   r*   )r+   s   "r,   r-   r-   ƒ   s   € ÷ ?ñ ?�eð ? ñ ?r.   c                óR   € \        V 4      '       g   \        R 4      h\        V R4      # )zclock must be callablez!clock must return a finite number)ÚcallablerD   rf   )rh   s   &r,   Ú
_timestamprl   ƒ   s%   € Ü�E�?Š?Ü#Ð$<Ó=Ð=Ü�5Ð=Ó>Ð>r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   Úttl_secondsr   rh   ri   r)   ztuple[float, float]r*   )r+   s   "r,   r-   r-   ‰   s"   € ÷ ñ ˜sð ¨5ð Ð5Hñ r.   c                ó¬   a € \        V 3R lRRR7      p\        V4      p\        P                  ! W2,           4      '       g   \	        R4      hW3V,           3# )zYValidate ttl (first) and clock -> ``(now, expires_at)``; the sum itself must stay finite.c                 ó   <€ S # r^   r*   )rn   s   €r,   Ú<lambda>Ú_lease_window.<locals>.<lambda>‹   s   ø€ ™+r.   z,ttl_seconds must be a finite positive numberT)rW   zlease expiry must be finite)rf   rl   rb   rc   rD   )rn   rh   ÚttlÚnows   f&  r,   Ú_lease_windowru   ‰   sG   ø€ ä
Ô%Ð'UÐ`dÔ
e€CÜ
�UÓ
€CÜ�=Š=˜�×#Ò#Ü#Ð$AÓBÐBØ�c•	ˆ>Ðr.   c               ó    € V ^8„  d   QhRRRR/# )r%   rd   r   r)   úlist[dict[str, Any]]r*   )r+   s   "r,   r-   r-   ’   s   € ÷ [ñ [¨ð [Ð0Dñ [r.   c                óˆ  € ^ RI Hp \        V \        4      '       d	   V '       g   \	        R4      h\
        ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       d   \	        R4      hV  Uu. uF  p\        VR,          RR	7      NK  	  pp T! V  UUUu. uF/  q"P                  4        UUu/ uF  w  rEVR8w  g   K  WEbK  	  uppNK1  	  uppp4      p\        Yc4       UUu. uF  w  r(/ TCRT/CNK  	  upp# u upi u uppi u upppi   \         d   p\	        \        T4      4      ThR
p?ii ; iu uppi )zHValidate store metadata plus the exact source event for each task input.)Úvalidate_task_manifestz$attachments must be a non-empty listc              3  óf   "  € T F'  p\        V\        4      '       * ;'       g    R V9  x € K)  	  R# 5i)Úevent_idN)Ú
isinstancer   )Ú.0Úitems   & r,   Ú	<genexpr>Ú/validate_bound_task_manifest.<locals>.<genexpr>˜   s*   é € Ð
UÉuÀtŒz˜$¤Ó(Ô(×BÐB¨J¸dÑ,BÔBËuùs   ‚ 1£1TFz!task attachment requires event_idr{   zattachment event_id©rT   N)Úgateway.hosted_room_attachmentsry   r|   ÚlistrD   ÚanyÚ_identifierÚitemsr`   r'   Úzip)	rd   ry   r~   Ú	event_idsÚkeyÚvalÚmanifestre   r{   s	   &        r,   Úvalidate_bound_task_manifestrŒ   ’   s  € åFä�eœT×"Ò"¯%Ü#Ð$JÓKÐKß
ƒsÑ
UÉuÓ
U‡s‡s‚sÑ
UÉuÓ
U×UÒUÜ#Ð$GÓHÐHÙX]Ó^ÑX]ÐPT”˜T *Õ-Ð5J×KÑX]€IÐ^ð7Ù)ÙUZõ+\ÙUZÈT§j¡j¤lÔH¡l™(˜#°c¸ZÑ6GŒXˆSŠX¡lÕHÑUZó+\ó ]ˆô BEÀXÔAYÔZÑAY©~¨tÐ*ˆtÐ*�Z Ô*ÑAYÒZÐZùò _ùó Iùô+\øäô 7Ü#¤C¨£HÓ-°3Ð6ûð7üãZsN   Á9DÂD Â!DÂ8D	ÃD	ÃDÃ	D Ã-D>Ä	DÄD ÄD;Ä!D6Ä6D;c               ó    € V ^8„  d   QhRRRR/# )r%   rd   r   r)   ztuple[dict[str, Any], str, str]r*   )r+   s   "r,   r-   r-   £   s   € ÷ Tñ T˜ð TÐ!@ñ Tr.   c                óŽ  € \        V \        4      '       g   \        R 4      h\        V 4      \        ,
          \
        ,
          p\        \        V 4      ,
          pV'       d'   \        RRP                  \        V4      4       24      hV'       d'   \        RRP                  \        V4      4       24      h\        V R,          RR7      p\        V R,          \        R\        RR7      p\        V R	,          R
^R7      pRVRVR	V/pRV 9   d   ^ RIHp  V! V R,          4      VR&   RV 9   d   \        V R,          RR7      VR&   RV 9   d   \!        V R,          4      VR&   \#        V4      p	Wi\$        P&                  ! V	P)                  R4      4      P+                  4       3#   \         d   p\        \        T4      4      ThRp?ii ; i)zpayload must be an objectzunknown payload fields: ú, zmissing payload fields: Útarget_profiler�   ÚpromptF)rQ   rT   rU   ÚstripÚsource_event_seqz+source_event_seq must be a positive integer©rZ   ÚlowÚinput_context)Úvalidate_task_inputNÚtarget_member_idÚattachmentszutf-8)r|   ÚdictrD   ÚsetÚ_TASK_PAYLOAD_REQUIRED_FIELDSÚ_TASK_PAYLOAD_OPTIONAL_FIELDSÚjoinÚsortedr…   r   ÚMAX_PROMPT_BYTESÚ_bounded_intÚgateway.hosted_room_task_inputr—   r`   r'   rŒ   r   ÚhashlibÚsha256ÚencodeÚ	hexdigest)
rd   ÚunknownÚmissingr�   r‘   r“   Ú
normalizedr—   re   Úencodeds
   &         r,   Ú_task_payloadr«   £   s™  € Ü�eœT×"Ò"Ü#Ð$?Ó@Ð@Ü�%‹jÔ8Õ8Ô;XÕX€GÜ+¬c°%«jÕ8€GßÜ#Ð&>¸t¿y¹yÌÐPWËÓ?YÐ>ZÐ$[Ó\Ð\ßÜ#Ð&>¸t¿y¹yÌÐPWËÓ?YÐ>ZÐ$[Ó\Ð\Ü  Ð'7Õ!8Ð@PÔQ€NÜ�%˜•/Ô)>ÀhÔZjÐrwÔx€FÜ#ØÐ Õ!Ð+XÐ^_ôaÐà" N°H¸fÐFXÐZjÐk€JØ˜%ÔÝFð	;Ù*=¸eÀOÕ>TÓ*UˆJ�Ñ'ð ˜UÔ"Ü)4°UÐ;MÕ5NÐVhÔ)iˆ
Ð%Ñ&Ø˜ÔÜ$@ÀÀ}ÕAUÓ$Vˆ
�=Ñ!Ü˜:Ó&€GØ¤§¢¨w¯~©~¸gÓ/FÓ G× QÑ QÓ SÐSÐSøô ô 	;Ü'¬¨C«Ó1°sÐ:ûð	;ús   ÄF ÆGÆ*F?Æ?G)Úfrozenc                  óP   € ] tR t^Àt$ RtR]R&   R]R&   R]R&   R]R&   R R ltR	tR
# )ÚTaskIdentityz+Stable identity for one admitted room turn.r'   Úroom_idÚtask_idÚ	thread_idÚturn_idc               ó   € V ^8„  d   QhRR/# )r%   r)   ÚNoner*   )r+   s   "r,   r-   ÚTaskIdentity.__annotate__È   s   € ÷ \ñ \˜tñ \r.   c                	ól   € R F-  p\         P                  W\        \        W4      VR7      4       K/  	  R# )r¯   r�   N©r¯   r°   r±   r²   )ÚobjectÚ__setattr__r…   Úgetattr)ÚselfÚfields   & r,   Ú__post_init__ÚTaskIdentity.__post_init__È   s*   € ÛCˆEÜ×Ñ˜t¬K¼ÀÓ8LÐTYÔ,ZÖ[ó Dr.   r*   N)r=   r>   r?   r@   rA   Ú__annotations__r½   rB   r*   r.   r,   r®   r®   À   s%   ‡ á5ØƒLØƒLØƒNØƒL÷\ñ \r.   r®   c                  óf   € ] tR t^Ít$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R	]R
&   RtR]R&   RtR# )ÚDriverLeasez7A fenced lease held by one gateway process incarnation.r'   r¯   Ú
gateway_idÚintÚauthority_epochÚprocess_generationr   r\   Ú
expires_atFr[   Ú	reclaimedr*   N)r=   r>   r?   r@   rA   r¿   rÇ   rB   r*   r.   r,   rÁ   rÁ   Í   s1   ‡ áAØƒLØƒOØÓØÓØÓØÓØ€Iˆt×r.   rÁ   c                  óD   € ] tR t^Ùt$ RtR]R&   R]R&   R]R&   R]R&   R	tR
# )ÚTaskAttemptz;The exact running generation authorized to settle one task.r®   ÚidentityrÁ   ÚleaserÃ   r   r   r*   N)r=   r>   r?   r@   rA   r¿   rB   r*   r.   r,   rÉ   rÉ   Ù   s   ‡ áEØÓØÓØÓØ×r.   rÉ   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   Úconnúsqlite3.ConnectionÚtabler'   r)   r´   r*   )r+   s   "r,   r-   r-   â   s(   € ÷ Hñ HÐ/ð H¸ð HÐ]añ Hr.   c                ó0   € V P                  R V R24       R# )zCREATE TABLE IF NOT EXISTS a#   (
            room_id TEXT NOT NULL, task_id TEXT NOT NULL, thread_id TEXT NOT NULL, turn_id TEXT NOT NULL,
            source_event_seq INTEGER NOT NULL CHECK (source_event_seq >= 1),
            payload_json TEXT NOT NULL, payload_digest TEXT NOT NULL,
            status TEXT NOT NULL CHECK (status IN (
                'queued', 'running', 'settled', 'failed', 'cancelled', 'indeterminate', 'deferred', 'stopping')),
            execution_generation INTEGER NOT NULL DEFAULT 0 CHECK (execution_generation >= 0),
            cancel_generation INTEGER NOT NULL DEFAULT 0 CHECK (cancel_generation >= 0),
            run_gateway_id TEXT, run_process_generation TEXT, run_lease_generation INTEGER, cancel_id TEXT,
            settlement_id TEXT, settlement_status TEXT, result_json TEXT, created_at REAL NOT NULL,
            updated_at REAL NOT NULL, started_at REAL, terminal_at REAL, indeterminate_at REAL,
            PRIMARY KEY (room_id, task_id), UNIQUE (room_id, thread_id, turn_id),
            FOREIGN KEY (room_id) REFERENCES hosted_rooms(room_id))N)Úexecute)rÍ   rÏ   s   &&r,   Ú_create_task_tablerÒ   â   s"   € Ø‡L�LØ'¨ wð /Dð 	GöHr.   c               ó    € V ^8„  d   QhRRRR/# ©r%   rÍ   rÎ   r)   r´   r*   )r+   s   "r,   r-   r-   ó   s   € ÷ 	Iñ 	IÐ/ð 	I°Dñ 	Ir.   c                óž   € V P                  R 4       \        V 4       \        V 4       V P                  \        P	                  RR7      4       R# )aá  CREATE TABLE IF NOT EXISTS hosted_room_driver_leases (
            room_id TEXT PRIMARY KEY, gateway_id TEXT NOT NULL,
            authority_epoch INTEGER NOT NULL CHECK (authority_epoch >= 1), process_generation TEXT NOT NULL,
            lease_generation INTEGER NOT NULL CHECK (lease_generation >= 1),
            expires_at REAL NOT NULL, acquired_at REAL NOT NULL, updated_at REAL NOT NULL, released_at REAL,
            FOREIGN KEY (room_id) REFERENCES hosted_rooms(room_id))zIF NOT EXISTS ©Úif_not_existsN)rÑ   rÒ   Ú_validate_schemaÚ_TASK_INDEX_SQLr+   )rÍ   s   &r,   Ú_initialize_schemarÚ   ó   sB   € Ø‡L�Lð Gô Hô �tÔÜ�TÔØ‡L�L”×'Ñ'Ð6FÐ'ÓGÖHr.   c               ó    € V ^8„  d   QhRRRR/# rÔ   r*   )r+   s   "r,   r-   r-   ÿ   s   € ÷ 
Wñ 
WÐ-ð 
W°$ñ 
Wr.   c           	     ó”  € \        V R 4      \        V R4      3pV\        \        38w  d   \        R4      hR
 F�  p\        ;QJ d=    R V P                  RV R24      P                  4        4       F  '       g   K   RM2	  RM.! R V P                  RV R24      P                  4        4       4      '       d   K�  \        V R24      h	  R	# )Úhosted_room_driver_leasesÚhosted_room_driver_taskszhunsupported unpublished hosted-room driver schema; recreate the driver tables before starting the driverc              3  óŠ   "  € T F9  pV^,          R8H  ;'       d!    V^,          R8H  ;'       d    V^,          R8H  x € K;  	  R# 5i)r%   Úhosted_roomsr¯   Nr*   )r}   Úrows   & r,   r   Ú#_validate_schema.<locals>.<genexpr>  sF   é € ð UáS�ð ��F�nÑ$×TÐT¨¨Q­°9Ñ)<×TÐTÀÀQÅÈ9ÑATÔTÛSùs   ‚AšA®AzPRAGMA foreign_key_list(Ú)TFz( is missing its hosted_rooms foreign keyN)rÝ   rÞ   )r   Ú_LEASE_COLUMNSÚ_TASK_COLUMNSr;   r„   rÑ   Úfetchall)rÍ   ÚcolumnsrÏ   s   &  r,   rØ   rØ   ÿ   sÎ   € Ü˜DÐ"=Ó>ÄÈdÐTnÓ@oÐo€GØ”>¤=Ð1Ô1ÜðDóEð 	Eó Kˆß‹sñ Uà—|‘|Ð&>¸u¸gÀQÐ$GÓH×QÑQÔSóU�s�sŠsñ Uà—|‘|Ð&>¸u¸gÀQÐ$GÓH×QÑQÔSóU÷ Uô Uô # e WÐ,TÐ#UÓVÐVó	 Kr.   c               ó    € V ^8„  d   QhRRRR/# ©r%   rÍ   rÎ   r)   r[   r*   )r+   s   "r,   r-   r-     s   € ÷ ñ Ð 2ð °tñ r.   c                óÒ   € V P                  R 4      P                  4       pV Uu0 uF  q"^ ,          kK  	  upRR08w  d   R# V P                  R4      P                  4       pVRJ# u upi )z‚SELECT name FROM sqlite_master WHERE type='table'
           AND name IN ('hosted_room_driver_leases', 'hosted_room_driver_tasks')rÝ   rÞ   Fz]SELECT 1 FROM sqlite_master WHERE type='index' AND name='idx_hosted_room_driver_tasks_status'N)rÑ   ræ   Úfetchone)rÍ   Úrowsrá   Úindexs   &   r,   Ú_schema_objects_existrî     sv   € Ø�<‰<ð Tó UßU]ÑU]ÓU_ð 	áÓ™$�3ˆA�ˆ™$ÑÐ$?ÐA[Ð#\Ô\ÙØ�L‰LØgóißiqÑiqÓisð 
à˜ÐÐùò	  s   ¤A$c               ó    € V ^8„  d   QhRRRR/# rÔ   r*   )r+   s   "r,   r-   r-     s   € ÷ 	;ñ 	;Ð*<ð 	;Àñ 	;r.   c                ó(  € V P                  R4       \        V R4       RP                  \        4      pV P                  RV RV R24       V P                  R4       V P                  R4       V P                  \        P                  R	R
7      4       R# )zDExpand the unpublished task-state CHECK without losing durable work.z8DROP INDEX IF EXISTS idx_hosted_room_driver_tasks_statusÚhosted_room_driver_tasks_nextr�   z+INSERT INTO hosted_room_driver_tasks_next (z	) SELECT z FROM hosted_room_driver_tasksz#DROP TABLE hosted_room_driver_taskszLALTER TABLE hosted_room_driver_tasks_next RENAME TO hosted_room_driver_tasksÚ rÖ   N)rÑ   rÒ   rž   Ú_TASK_COLUMN_ORDERrÙ   r+   )rÍ   rç   s   & r,   Ú_migrate_task_status_constraintrô     s}   € à‡L�LÐKÔLÜ�tÐ<Ô=Ø�i‰iÔ*Ó+€GØ‡L�LØ
5°g°Y¸iÈÀyÐPnÐoôqà‡L�LÐ6Ô7Ø‡L�LÐ_Ô`Ø‡L�L”×'Ñ'°bÐ'Ó9Ö:r.   c               ó    € V ^8„  d   QhRRRR/# )r%   Údb_pathr   r)   rÎ   r*   )r+   s   "r,   r-   r-   "  s   € ÷ ñ �fð Ð!3ñ r.   c                ó¾   a€ . oR V3R llp\        V RVV3R lR7      pS^ ,          '       d    \        V4       V# V#   \         d    TP                  4        h i ; i)zÂOpen the store; existing tables are validated (after the status-constraint migration when needed).
The driver schema never shipped, so an incompatible draft fails closed in ``_validate_schema``.c               ó    € V ^8„  d   QhRRRR/# ré   r*   )r+   s   "r,   r-   Ú_connect.<locals>.__annotate__&  s   € ÷ ;ñ ;Ð&ð ;¨4ñ ;r.   c                ó$  <€ SP                  \        V 4      4       S^ ,          '       g   R# V P                  R4      P                  4       pV'       d+   \	        V^ ,          ;'       g    R4      P                  4       MRpRV9   ;'       d    RV9   # )é    FzTSELECT sql FROM sqlite_master WHERE type='table' AND name='hosted_room_driver_tasks'rò   z
'stopping'z
'deferred')Úappendrî   rÑ   rë   r'   Úlower)rÍ   rá   ÚsqlÚexistings   &  €r,   ÚreadyÚ_connect.<locals>.ready&  sx   ø€ Ø�‰Ô-¨dÓ3Ô4Ø˜�{Œ{ÙØ�l‰lØbódßdlÑdlÓdnð 	ç+.Œc�#�a•&—,�,˜BÓ×%Ñ%Ô'°BˆØ˜sÑ"×:Ð: |°sÑ':Ð:r.   zstate.db (hosted_room_driver)c                óR   <€ S^ ,          '       d   \         ! V 4      # \        ! V 4      # ©rû   )rô   rÚ   )rÍ   rÿ   s   &€r,   rq   Ú_connect.<locals>.<lambda>0  s#   ø€ ÀHÈQÇKÄKÔ!@Ð!gÐimÔ nÔUgÐ!gÐimÔ nr.   )Údb_labelr   Ú
initialize)r   rØ   Ú	ExceptionÚclose)rö   r   rÍ   rÿ   s   &  @r,   Ú_connectr	  "  sl   ø€ ð €H÷;ð ;ô ØÐ9ÀÜnôp€Dð �‡{„{ð	Ü˜TÔ"ð €Kˆ4€Køô ô 	Ø�J‰JŒLØð	ús	   °? ¿Ac               ó   € V ^8„  d   QhRR/# )r%   rö   r   r*   )r+   s   "r,   r-   r-   :  s   € ÷ :ñ :˜&ñ :r.   c                ó&   € \        \        V R R7      # )T)Ú	immediate)r   r	  )rö   s   &r,   Ú_transactionr  :  s   € Ü”x °DÔ9Ð9r.   rÇ   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rá   zsqlite3.Row | dict[str, Any]rÇ   r[   r)   rÁ   r*   )r+   s   "r,   r-   r-   >  s(   € ÷ Bñ BÐ5ð BÀTð BÐVañ Br.   c               ó°   € \        V R ,          V R,          \        V R,          4      V R,          \        V R,          4      \        V R,          4      VR7      # )r¯   rÂ   rÄ   rÅ   r   rÆ   )r¯   rÂ   rÄ   rÅ   r   rÆ   rÇ   )rÁ   rÃ   r\   )rá   rÇ   s   &$r,   Ú_lease_from_rowr  >  sR   € ÜØ�I•¨3¨|Õ+<ÌcÐRUÐVgÕRhÓNiØÐ3Õ4ÄsÈ3ÐOaÕKbÓGcÜ˜˜\Õ*Ó+°yôBð Br.   c               ó    € V ^8„  d   QhRRRR/# )r%   rá   úsqlite3.Rowr)   r®   r*   )r+   s   "r,   r-   r-   E  s   € ÷ lñ l ð l°ñ lr.   c                óX   € \        V R ,          V R,          V R,          V R,          R7      # )r¯   r°   r±   r²   r·   )r®   )rá   s   &r,   Ú_task_identity_from_rowr  E  s.   € ÜØ�I•¨¨I­À#ÀkÕBRÐ\_Ð`iÕ\jôlð lr.   c               ó    € V ^8„  d   QhRRRR/# )r%   ÚcastzCallable[[Any], Any]r)   r*   )r+   s   "r,   r-   r-   J  s    € ÷ Dñ DÐ(ð DÐ-Añ Dr.   c                ó   a € V 3R  l# )c                ó    <€ V e	   S! V 4      # R # r^   r*   )rd   r  s   &€r,   rq   Ú_optional.<locals>.<lambda>K  s   ø€ ¨Ò(9™˜e›ÐC¸tÐCr.   r*   )r  s   fr,   Ú	_optionalr  J  s	   ø€ ÜCÐCr.   zdict[str, Callable[[Any], Any]]Ú_TASK_VIEW_CASTSÚ
idempotentc               ó$   € V ^8„  d   QhRRRRRR/# )r%   rá   r  r  r[   r)   údict[str, Any]r*   )r+   s   "r,   r-   r-   V  s!   € ÷ ñ ˜ð °Dð À^ñ r.   c               ó  €  \        \        P                  ! V R ,          4      4      w  r#pY4TR,          3T R ,          T R,          \        T R,          4      38w  d   \        R4      hR\        T 4      RT/p\        \        P                  R4      R  F1  p\        P                  TR 4      ! Y,          4      YgR	8X  d   R
MT&   K3  	  YR&   T#   \        \        P                  \
        3 d   p\        R4      ThRp?ii ; i)Úpayload_jsonzstored task payload is invalidNr“   Úpayload_digestz.stored task payload failed its integrity checkrÊ   Úpayloadc                ó   € V # r^   r*   )Úvs   &r,   rq   Ú _task_from_row.<locals>.<lambda>`  s   € Ñghr.   r   rS   r  )r«   ÚjsonÚloadsr_   ÚJSONDecodeErrorrD   rL   rÃ   r  ró   rí   r  Úget)rá   r  r"  Úencoded_payloadr!  re   ÚtaskÚcolumns   &$      r,   Ú_task_from_rowr-  V  s  € ðKÜ3@ÄÇÂÈCÐP^ÕL_ÓA`Ó3aÑ0ˆ .ð 	¨Ð1CÕ)DÐEØˆNÕ˜SÐ!1Õ2´C¸Ð<NÕ8OÓ4PðJRô RäÐ PÓQÐQØ&Ô(?ÀÓ(DÀiÐQXÐY€DÜ$Ô%7×%=Ñ%=Ð>NÓ%OÐ%PÓQˆÜ@P×@TÑ@TÐU[Ñ]hÔ@iÐjmÕjuÓ@vˆ =Ô0‰X°fÓ=ñ Rà#ˆÑØ€Køô ”t×+Ñ+Ô-BÐCô KÜÐ @ÓAÀsÐJûðKús   ‚)C Ã C>Ã-C9Ã9C>Úrequiredc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rÍ   rÎ   rÊ   r®   r.  r[   r)   úsqlite3.Row | Noner*   )r+   s   "r,   r-   r-   e  s*   € ÷ ñ Ð'ð °<ð Èdð Ð^pñ r.   c               óâ   € V P                  \        VP                  VP                  34      P	                  4       pVf   V'       d   \        R4      hR # \        V4      V8w  d   \        R4      hV# )Nztask does not existz,task_id is already bound to a different turn)rÑ   Ú_SELECT_TASKr¯   r°   rë   rL   r  )rÍ   rÊ   r.  rá   s   &&$ r,   Ú
_load_taskr3  e  sa   € Ø
�,‰,”| h×&6Ñ&6¸×8HÑ8HÐ%IÓ
J×
SÑ
SÓ
U€CØ
‚{ßÜ#Ð$9Ó:Ð:ÙÜ˜sÓ# xÔ/ÜÐ NÓOÐOØ€Jr.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rÍ   rÎ   r¯   r'   r   z
str | Noner)   zlist[sqlite3.Row]r*   )r+   s   "r,   r-   r-   p  s*   € ÷ 0ñ 0Ð,ð 0°sð 0ÀJð 0ÐZkñ 0r.   c                óx   € Vf   RV33MRW33w  r4RV R\          2pV P                  WT4      P                  4       # )Nrò   z AND status=?z6SELECT * FROM hosted_room_driver_tasks WHERE room_id=?Ú )Ú_TASK_ORDERrÑ   ræ   )rÍ   r¯   r   ÚwhereÚparamsrþ   s   &&&   r,   Ú_tasks_in_orderr:  p  sH   € Ø(.ª�R˜'˜Ñ$¸_ÈwÐN_Ð<`�M€EØBÀ5À'ÈÌ;È-Ð
X€CØ�<‰<˜Ó$×-Ñ-Ó/Ð/r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rÍ   rÎ   r¯   r'   r)   r  r*   )r+   s   "r,   r-   r-   v  s"   € ÷ ñ Ð.ð ¸ð Àñ r.   c                ó"  €  V P                  R V34      P                  4       pTe   TR,          e   \        Tf   R4      hR4      hT#   \        P                   d1   pR\	        T4      P                  4       9   d   \        R4      Thh Rp?ii ; i)zeSELECT room_id, authority_gateway_id, authority_epoch, disbanded_at FROM hosted_rooms WHERE room_id=?zno such tablezhosted room does not existNÚdisbanded_atzhosted room is disbanded)rÑ   rë   Úsqlite3ÚOperationalErrorr'   rý   rF   )rÍ   r¯   rá   re   s   &&  r,   Ú_load_active_roomr@  v  s’   € ðØ�l‰lØsØˆJóç ™›
ð 	ð ‚{�c˜.Õ)Ò5Ü"À3Â;Ð#?ÓoÐoÐTnÓoÐoØ€Jøô ×#Ñ#ô Øœc #›hŸn™nÓ.Ô.Ü&Ð'CÓDÈ#ÐMØûðús   ‚!A	 Á	BÁ+B	Â	Bc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r%   rÍ   rÎ   r¯   r'   rÂ   ÚepochrÃ   r)   r  r*   )r+   s   "r,   r-   r-   „  s3   € ÷ ñ Ð"4ð ¸sð ÐPSð Ð\_ð Ðdoñ r.   c                ó|   € \        W4      pVR ,          V8w  g   \        VR,          4      V8w  d   \        R4      hV# )Úauthority_gateway_idrÄ   zhosted room authority changed)r@  rÃ   rJ   )rÍ   r¯   rÂ   rB  Úrooms   &&&& r,   Ú_require_room_authorityrF  „  s>   € Ü˜TÓ+€DØÐ"Õ# zÔ1´S¸Ð>OÕ9PÓ5QÐUZÔ5ZÜÐ=Ó>Ð>Ø€Kr.   c               ó    € V ^8„  d   QhRRRR/# )r%   rË   rÁ   r)   ztuple[str, str, int]r*   )r+   s   "r,   r-   r-   ‹  s   € ÷ Nñ N�kð NÐ&:ñ Nr.   c                óH   € V P                   V P                  V P                  3# )zRThe ``_RUN_FENCE`` bind order: (gateway_id, process_generation, lease_generation).)rÂ   rÅ   r   )rË   s   &r,   Ú
_run_fencerI  ‹  s!   € à×Ñ˜U×5Ñ5°u×7MÑ7MÐMÐMr.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rá   r0  rË   rÁ   r)   r[   r*   )r+   s   "r,   r-   r-   �  s'   € ÷ eñ eÐ.ð e°{ð eÀtñ er.   c                óà   € V R J;'       dd    V R,          \        V R,          4      V R,          \        V R,          4      3VP                  VP                  VP                  VP                  38H  # )NrÂ   rÄ   rÅ   r   )rÃ   rÂ   rÄ   rÅ   r   )rá   rË   s   &&r,   Ú_lease_row_matchesrL  �  sv   € Ø�dˆ?÷ eð eØˆLÕœ3˜sÐ#4Õ5Ó6¸Ð<PÕ8QÔSVÐWZÐ[mÕWnÓSoð à
×
Ñ
˜E×1Ñ1°5×3KÑ3KÈU×McÑMcÐ	dñ eð er.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rÍ   rÎ   rË   rÁ   rt   r\   r)   r  r*   )r+   s   "r,   r-   r-   –  s+   € ÷ ñ Ð 2ð ¸;ð ÐPUð ÐZeñ r.   c               ó6  € \        WP                  VP                  VP                  4       V P	                  \
        VP                  34      P                  4       p\        W14      '       d#   VR ,          f   \        VR,          4      V8:  d   \        R4      hV# )Úreleased_atrÆ   z driver lease is stale or expired)
rF  r¯   rÂ   rÄ   rÑ   Ú_SELECT_LEASErë   rL  r\   rJ   )rÍ   rË   rt   rá   s   &&$ r,   Ú_require_active_leaserQ  –  sx   € Ü˜D§-¡-°×1AÑ1AÀ5×CXÑCXÔYØ
�,‰,”} u§}¡}Ð&6Ó
7×
@Ñ
@Ó
B€CÜ˜c×)Ò)¨S°Õ-?Ò-KÌuÐUXÐYeÕUfÓOgÐknÔOnÜÐ@ÓAÐAØ€Jr.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rË   rÁ   rÊ   r®   r)   r´   r*   )r+   s   "r,   r-   r-   ž  s&   € ÷ Pñ P˜Kð P°<ð PÀDñ Pr.   c                óR   € V P                   VP                   8w  d   \        R 4      hR# )z(lease and task belong to different roomsN)r¯   rD   )rË   rÊ   s   &&r,   Ú_check_same_roomrT  ž  s%   € Ø‡}�}˜×(Ñ(Ô(Ü#Ð$NÓOÐOñ )r.   c               ó    € V ^8„  d   QhRRRR/# )r%   rd   rÃ   r)   r*   )r+   s   "r,   r-   r-   £  s   € ÷ ñ ˜cð  cñ r.   c                óV   € \        V \        4      '       d   V ^ 8  d   \        R4      hV # )rû   z/expected_cancel_generation must be non-negative)r|   rÃ   rD   ©rd   s   &r,   Ú_cancel_generationrX  £  s&   € ä�eœS×!Ò! U¨Q¤YÜ#Ð$UÓVÐVØ€Lr.   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r%   rË   rÁ   rÊ   r®   r   rÃ   r   r)   r´   r*   )r+   s   "r,   r-   r-   ª  s4   € ÷ *ñ *Øð*Ø".ð*ØFIð*Ø^að*Øfjñ*r.   c                ó‚   € \        W4       \        V\        4      '       d   V^8  d   \        R4      h\	        V4       R# )é   z8expected_execution_generation must be a positive integerN)rT  r|   rÃ   rD   rX  )rË   rÊ   r   r   s   &&&&r,   Ú_expected_generationsr\  ª  s5   € ä�UÔ%ÜÐ*¬C×0Ò0Ð4HÈ1Ô4LÜ#Ð$^Ó_Ð_ÜÐ(Ö)r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   Úsettlement_idr   r   r)   r'   r*   )r+   s   "r,   r-   r-   ²  s!   € ÷ ñ ¨3ð ¸ð Àñ r.   c                óD   € \        V R R7      p VR9  d   \        R4      hV # )r^  r�   z$status must be 'settled' or 'failed'>   ÚfailedÚsettled)r…   rD   )r^  r   s   &&r,   Ú_terminal_settlement_idrb  ²  s)   € Ü °_ÔE€MØÐ*Ô*Ü#Ð$JÓKÐKØÐr.   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r%   r^  r   r   rS   rh   ri   r)   z;tuple[float, Callable[[sqlite3.Row], Any], tuple[Any, ...]]r*   )r+   s   "r,   r-   r-   ¹  s;   € ÷ Oñ OØðOØ #ðOØ-0ðOØ9>ðOà@ñOr.   c                ót   a aa€ \        S S4      o \        V4      o\        V4      pR VV V3R llpWESS SSWD33# )z¹Validate one terminal settlement -> (now, replay predicate, ``_SETTLE_SET`` params); the replay treats an
identical committed settlement as idempotent and a different one as a conflict.c               ó    € V ^8„  d   QhRRRR/# ©r%   rá   r  r)   údict[str, Any] | Noner*   )r+   s   "r,   r-   Ú!_settlement.<locals>.__annotate__Á  s   € ÷ Tñ T�Kð TÐ$9ñ Tr.   c                ó’   <€ V R ,          f   R# V R ,          V R,          V R,          3SSS38X  d   \        V RR7      # \        R4      h)r^  NÚsettlement_statusr   T©r  z0task already has a different terminal settlement)r-  rL   )rá   r   r^  r   s   &€€€r,   ÚreplayÚ_settlement.<locals>.replayÁ  sS   ø€ ØˆÕÒ'ÙØ�Õ  #Ð&9Õ":¸CÀÕ<NÐOÐTaÐciÐkvÐSwÔwÜ! #°$Ô7Ð7ÜÐ RÓSÐSr.   )rb  Ú_canonical_jsonrl   )r^  r   rS   rh   rt   rl  r   s   ff&&  @r,   Ú_settlementro  ¹  sI   ú€ ô
 ,¨M¸6ÓB€MÜ! &Ó)€KÜ
�UÓ
€C÷Tò Tð ˜ °¸ÀSÐNÐNÐNr.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   Ú	cancel_idr'   r   r)   zCallable[[sqlite3.Row], Any]r*   )r+   s   "r,   r-   r-   Ê  s'   € ÷ uñ u˜cð u¨3ð uÐA]ñ ur.   c                ó   a a€ V V3R l# )zAReplay predicate: same cancel_id already committed in ``status``.c                óZ   <€ V R ,          S8X  d   V R,          S8X  d   \        V RR7      # R# )r   rq  Trk  N)r-  )rá   rq  r   s   &€€r,   rq   Ú _cancel_replay.<locals>.<lambda>Ì  s/   ø€ Ø03°HµÀÔ0GÈCÐP[ÕL\Ð`iÔLiŒ�s tÔ,ÐsÐosÐsr.   r*   )rq  r   s   ffr,   Ú_cancel_replayru  Ê  s   ù€ õuð ur.   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r%   rá   r  r   r'   r   rÃ   r   r)   r[   r*   )r+   s   "r,   r-   r-   Ð  s1   € ÷ 9ñ 9˜Kð 9°ð 9ÈCð 9Ðdgð 9Ðlpñ 9r.   c                ód   € V R ,          \        V R,          4      \        V R,          4      3WV38H  # )r   r   r   ©rÃ   )rá   r   r   r   s   &&&&r,   Ú_generations_matchry  Ð  s<   € Ø��Mœ3˜sÐ#9Õ:Ó;¼SÀÐEXÕAYÓ=ZÐ[ØÐ&7ð`9ñ 9ð 9r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rá   r  Úexpected_cancel_generationrÃ   r)   r´   r*   )r+   s   "r,   r-   r-   Õ  s'   € ÷ Eñ E Kð EÈSð EÐUYñ Er.   c                óJ   € \        V R ,          4      V8w  d   \        R4      hR# )r   z$task cancellation generation changedN©rÃ   rN   ©rá   r{  s   &&r,   Ú_require_cancel_generationr  Õ  s(   € Ü
ˆ3Ð"Õ#Ó$Ð(BÔBÜÐCÓDÐDñ Cr.   rË   Úlease_firstrl  Úguardc               óH   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRRRRRR/# )r%   rö   r   rÊ   r®   rþ   r'   Ú
set_paramsútuple[Any, ...]Úfence_paramsÚstalert   r\   rË   zDriverLease | Noner€  r[   rl  z5Callable[[sqlite3.Row], dict[str, Any] | None] | Noner�  z$Callable[[sqlite3.Row], None] | Noner)   r  r*   )r+   s   "r,   r-   r-   Ú  st   € ÷ :ñ :Øð:Ø+ð:Ø58ð:ØFUð:Øetð:àð:àð:à#5ð:àKOð:ð Bð:ð 0ð	:ð <Jñ	:r.   c       	   
     óò  € . VOVP                   NVP                  NVO5p\        V 4      ;_uu_ 4       pVe   V'       d   \        WÇVR7       \	        WÁ4      pV	e   V	! V4      ;pe   VuuRRR4       # Ve   V'       g   \        WÇVR7       V
e	   V
! V4       \        WÂV\        V4      4       ^ RIHp V! WÁP                   4       \        \	        WÁ4      4      uuRRR4       #   + '       g   i     R# ; i)a„  Run one fenced task transition: load -> idempotent replay -> lease/fence guard -> UPDATE.

``sql`` binds ``(*set_params, room_id, task_id, *fence_params)`` and must hit exactly one row or ``stale``
is raised. ``lease_first`` checks the lease before the row load (recovery paths) instead of after the
replay (settlement paths: an identical replay still succeeds after the lease moved on).
N©rt   ©Úcapture_transition_locked)
r¯   r°   r  rQ  r3  r   rN   Ú gateway.hosted_room_work_recordsrŠ  r-  )rö   rÊ   rþ   rƒ  r…  r†  rt   rË   r€  rl  r�  r9  rÍ   rá   ÚreplayedrŠ  s   &&$$$$$$$$$     r,   Ú_transitionr�  Ú  sÑ   € ð NˆzÐM˜8×+Ñ+ÐM¨X×-=Ñ-=ÐMÀÑM€FÜ	�g×	Ô	 $ØÒ§Ü! $°3Õ7Ü˜Ó(ˆØÒ©v°c«{Ð#: 8Ò"GØ÷ 
Ò	ð Ò§[Ü! $°3Õ7ØÒÙ�#ŒJÜ�d ¬¸Ó)>Ô?ÝNÙ! $×(8Ñ(8Ô9Üœj¨Ó8Ó9÷ 
×	×	Ó	ús   ³C%Á )C%Á4C%Â AC%Ã%C6	c               ó@   € V ^8„  d   QhRRRRRRRRR	R
RR
RRRRRRRR/
# )r%   rö   r   rÊ   r®   rË   rÁ   Únamer'   r   rÃ   r   rt   r\   rƒ  r„  rl  z#Callable[[sqlite3.Row], Any] | Noner)   r  r*   )r+   s   "r,   r-   r-   ö  sm   € ÷ dñ dØðdØ+ðdØ4?ðdØGJðdØbeðdàðdà$)ðdà7Fðdð 0ðdð <Jñdr.   c               ó‚   aaaa€ \         V,          w  op	op
R VVVV3R llp\        WW&W‹\        V	S4      VSS3V
R7
      # )z\Lease-first transition from ``_GENERATION_TRANSITIONS`` fenced on status + both generations.c               ó    € V ^8„  d   QhRRRR/# ©r%   rá   r  r)   r´   r*   )r+   s   "r,   r-   Ú,_generation_transition.<locals>.__annotate__ü  s   € ÷ 3ñ 3�;ð 3 4ñ 3r.   c                óF   <€ \        V SSS4      '       g   \        S4      hR # r^   )ry  rN   )rá   r   r   Úgeneration_staler   s   &€€€€r,   r�  Ú%_generation_transition.<locals>.guardü  s(   ø€ Ü! # vÐ/CÐEV×WÒWÜ Ð!1Ó2Ð2ñ Xr.   )rË   rt   rl  r�  rþ   rƒ  r…  r†  )Ú_GENERATION_TRANSITIONSr�  r4   )rö   rÊ   rË   r�  r   r   rt   rƒ  rl  r&   r†  r�  r•  r   s   &&&&ff$$$   @@r,   Ú_generation_transitionr˜  ö  sW   û€ ô
 3JÈ$Õ2OÑ/€FˆJÐ(¨%÷3ó 3ô Ø ¸ÔQcÐdnÐpvÓQwØÐ-AÐCTÐ,UÐ]bôdð dr.   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r%   rö   r   ÚattemptrÉ   Úguard_staler'   r   zCallable[[Any], int]Ú
transitionr   r)   r  r*   )r+   s   "r,   r-   r-     sD   € ÷ rñ rØðrØ)ðrØ;>ðrØRfðràðrà(ñrr.   c               ó¸   aaaa€ SP                   oR VVVV3R llp\        V SP                  3RSRVRSP                  SP                  .\        S4      O5/VB # )zÒTransition fenced on this attempt's running generation under its exact lease (row guard + SQL fence).
``lease_generation`` casts the stored run_lease_generation: ``int`` raises on NULL, ``int(v or 0)`` reads 0.c               ó    € V ^8„  d   QhRRRR/# r’  r*   )r+   s   "r,   r-   Ú+_run_fence_transition.<locals>.__annotate__
  s   € ÷ .ñ .�;ð . 4ñ .r.   c                óÊ   <€ \        V R SP                  SP                  4      '       d/   V R,          V R,          S! V R,          4      3\        S4      8w  d   \	        S4      hR# )r   Úrun_gateway_idÚrun_process_generationr   N)ry  r   r   rI  rN   )rá   rš  r›  rË   r   s   &€€€€r,   r�  Ú$_run_fence_transition.<locals>.guard
  sh   ø€ Ü! # y°'×2NÑ2NÐPW×PiÑPi×jÒjØÐ Õ! 3Ð'?Õ#@ÑBRÐSVÐWmÕSnÓBoðo
ä˜Óôoô ! Ó-Ð-ñor.   rË   r�  r…  )rË   r�  rÊ   r   r   rI  )rö   rš  r›  r   rœ  r�  rË   s   &fdd, @r,   Ú_run_fence_transitionr¤    su   û€ ð
 �M‰M€E÷.ó .ô
 Ø�×!Ñ!ñrØ).ðrØ6;ðrà×2Ñ2°G×4MÑ4MÐbÔPZÐ[`ÓPaÑbðràfpñrð rr.   c               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )r%   rö   r   r¯   r   rÂ   rÄ   rÅ   rn   rh   ri   r)   rÁ   r*   )r+   s   "r,   r-   r-     sV   € ÷ &cñ &cØð&cØ!$ð&cØ25ð&cØHKð&cØadð&cØsvð&càð&cà ñ&cr.   c               óŠ  € \        VRR7      p\        VRR7      p\        VR^R7      p\        VRR7      p\        WV4      w  rx\        V 4      ;_uu_ 4       p	\	        W‘W#4       V	P                  \        V34      P                  4       p
V
fO   V	P                  RWW4W‡V34       \        V	P                  \        V34      P                  4       4      uuRRR4       # V
R,          V8H  ;'       d    \        V
R	,          4      V8H  pV
R
,          RJ ;'       d    \        V
R,          4      V8„  pV'       d|   V
R,          V8X  dn   V'       df   \        \        V
R,          4      V4      pV	P                  RW×V\        V
R,          4      34       \        / \        V
4      CRV/C4      uuRRR4       # V'       d   V'       d   \        R4      h\        V	RW#WHWwV\        V
R,          4      W#V3\        R4      4       \        V	P                  \        V34      P                  4       RR7      uuRRR4       #   + '       g   i     R# ; i)zCAcquire an empty or expired room lease with a monotonic generation.r¯   r�   rÂ   z*authority_epoch must be a positive integerr”   rÅ   Na  INSERT INTO hosted_room_driver_leases (
                       room_id, gateway_id, authority_epoch, process_generation, lease_generation,
                       expires_at, acquired_at, updated_at, released_at
                   ) VALUES (?, ?, ?, ?, 1, ?, ?, ?, NULL)rÄ   rO  rÆ   zfUPDATE hosted_room_driver_leases SET expires_at=?, updated_at=? WHERE room_id=? AND lease_generation=?r   z/room driver lease is held by another generationa†  UPDATE hosted_room_driver_leases
               SET gateway_id=?, authority_epoch=?, process_generation=?, lease_generation=lease_generation + 1,
                   expires_at=?, acquired_at=?, updated_at=?, released_at=NULL
               WHERE room_id=? AND lease_generation=? AND (
                   gateway_id != ? OR authority_epoch != ? OR released_at IS NOT NULL OR expires_at <= ?)z,room driver lease changed during acquisitionT)rÇ   )r…   r¡   ru   r  rF  rÑ   rP  rë   r  rÃ   r\   Úmaxrš   rH   r   )rö   r¯   rÂ   rÄ   rÅ   rn   rh   rt   rÆ   rÍ   rá   Úsame_authorityÚliveÚrenewed_expirys   &$$$$$$       r,   Úacquire_leaser«    s  € ô ˜'¨Ô3€GÜ˜Z¨|Ô<€JÜ" ?Ð<hÐnoÔp€OÜ$Ð%7Ð?SÔTÐÜ# KÓ7�O€CÜ	�g×	Ô	 $Ü ¨zÔKØ�l‰lœ=¨7¨*Ó5×>Ñ>Ó@ˆØŠ;Ø�L‰Lð >ð  oÈ:Ð\_Ð`ô	bô
 # 4§<¡<´À¸zÓ#J×#SÑ#SÓ#UÓV÷ 
Ò	ð ˜\Õ*¨jÑ8×kÐk¼SÀÐEVÕAWÓ=XÐ\kÑ=kˆØ�=Õ! TÐ)×LÐL¬e°C¸Õ4EÓ.FÈÑ.Lˆß˜cÐ"6Õ7Ð;MÔM×RVÜ ¤ s¨<Õ'8Ó!9¸:ÓFˆNØ�L‰LØxØ g¬s°3Ð7IÕ3JÓ/KÐLôNô #Ð#N¤d¨3£iÐ#N°¸~Ñ#NÓO÷# 
Ò	÷$ ŸdÜ Ð!RÓSÐSÜ�dð mð Ð-?ÈSÐW^Ü�CÐ*Õ+Ó,¨jÈ3ðPô ÐIÓJô	Lô ˜tŸ|™|¬M¸G¸:ÓF×OÑOÓQÐ]aÔb÷; 
×	×	Ó	ús?   ÁA9H1ÃH1Ã-'H1ÄH1Ä3H1Å	AH1Æ.H1Æ6H1Æ>A(H1È1I	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r%   rö   r   rË   rÁ   rn   r   rh   ri   r)   r*   )r+   s   "r,   r-   r-   =  s8   € ÷ Rñ R˜ð R¨ð RÀSð RÐQVð RÐ[fñ Rr.   c          
     ód  € \        W#4      w  rE\        V 4      ;_uu_ 4       p\        WaVR7      p\        \	        VR,          4      V4      p\        VRW„VP                  .\        V4      OVN5\        R4      4       \        P                  ! WRR7      uuRRR4       #   + '       g   i     R# ; i)z7Renew the exact active lease generation or fail closed.rˆ  rÆ   zÛUPDATE hosted_room_driver_leases SET expires_at=?, updated_at=?
               WHERE room_id=? AND gateway_id=? AND process_generation=?
                 AND lease_generation=? AND released_at IS NULL AND expires_at > ?z#driver lease changed during renewalF)rÆ   rÇ   N)ru   r  rQ  r§  r\   r   r¯   rI  rJ   ÚdataclassesÚreplace)	rö   rË   rn   rh   rt   Úrequested_expiryrÍ   ÚcurrentrÆ   s	   &&$$     r,   Úrenew_leaser²  =  s—   € ä)¨+Ó=Ñ€CÜ	�g×	Ô	 $Ü'¨¸Ô=ˆÜœ˜w |Õ4Ó5Ð7GÓHˆ
Ü�dð Vð ˜eŸm™mÐE¬j¸Ó.?ÐEÀÑEÜÐAÓBô		Dô
 ×"Ò" 5È5ÔQ÷ 
×	×	Ó	ús   ¡A2BÂB/	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rö   r   rË   rÁ   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   K  s(   € ÷ !ñ !˜6ð !¨+ð !Àð !È>ñ !r.   c               óú  € \        V4      p\        V 4      ;_uu_ 4       p\        WAP                  VP                  VP
                  4       VP                  \        VP                  34      P                  4       p\        WQ4      '       g   \        R4      hVR,          e   R\        V4      RR/uuRRR4       # \        VR,          4      V8:  d   \        R4      hVP                  R	VP                  34      P                  4       e   \        R
4      hVP                  RW3W1P                  VP                  34       R\        / \        V4      CRVRVRV/C4      RR/uuRRR4       #   + '       g   i     R# ; i)z7Release the exact active lease generation idempotently.zdriver lease is stalerO  NrË   r  TrÆ   z#driver lease expired before releasezSSELECT 1 FROM hosted_room_driver_tasks WHERE room_id=? AND status='running' LIMIT 1z3cannot release a room lease while tasks are runningz„UPDATE hosted_room_driver_leases SET expires_at=?, updated_at=?, released_at=?
               WHERE room_id=? AND lease_generation=?r   F)rl   r  rF  r¯   rÂ   rÄ   rÑ   rP  rë   rL  rJ   r  r\   rP   r   rš   )rö   rË   rh   rt   rÍ   rá   s   &&$   r,   Úrelease_leaserµ  K  sL  € ä
�UÓ
€CÜ	�g×	Ô	 $Ü §m¡m°U×5EÑ5EÀu×G\ÑG\Ô]Ø�l‰lœ=¨5¯=©=Ð*:Ó;×DÑDÓFˆÜ! #×-Ò-Ü!Ð"9Ó:Ð:Øˆ}ÕÒ)Øœ_¨SÓ1°<ÀÐF÷ 
Ò	ô ��\Õ"Ó# sÔ*Ü!Ð"GÓHÐHØ�<‰<ØaÐdi×dqÑdqÐcsó
ç
‰(‹*ò!ô -Ð-bÓcÐcØ�‰ð 9à�sŸM™M¨5×+AÑ+AÐBô	Dð ”_Ð%l¬¨S«	Ð%l°<ÀÀlÐTWÐYfÐhkÑ%lÓmØ˜%ð!÷! 
×	×	Ó	ús   ŸBE)Â:B$E)Å)E:	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r%   rö   r   rÊ   r®   r"  r   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   c  s1   € ÷ :ñ :˜ð :¨,ð :ÀCð :ÐPUð :ÐZhñ :r.   c          	     óÈ  € \        V4      w  rEp\        V4      p\        V 4      ;_uu_ 4       p\        W�P                  4       \        W�RR7      p	V	e?   V	R,          V8w  g   V	R,          V8w  d   \        R4      h\        V	RR7      uuRRR4       # VP                  R	VP                  VP                  VP                  34      P                  4       e   \        R
4      hTP                  R. \        P                  ! V4      OVR,          NVNVNVNVN54       ^ RIHp
 V
! W�P                  4       \        \        W�4      4      uuRRR4       #   + '       g   i     R# ; i)z9Persist a queued task, or return the identical admission.F)r.  Nr!  r   z/task_id is already bound to a different payloadTrk  zTSELECT * FROM hosted_room_driver_tasks WHERE room_id=? AND thread_id=? AND turn_id=?z1thread_id and turn_id are already bound to a taska.  INSERT INTO hosted_room_driver_tasks (
                   room_id, task_id, thread_id, turn_id, source_event_seq, payload_json, payload_digest,
                   status, execution_generation, cancel_generation, created_at, updated_at
               ) VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', 0, 0, ?, ?)r“   r‰  )r«   rl   r  r@  r¯   r3  rL   r-  rÑ   r±   r²   rë   r®  Úastupler‹  rŠ  )rö   rÊ   r"  rh   Únormalized_payloadr   r!  rt   rÍ   rÿ   rŠ  s   &&$$       r,   Ú
admit_taskrº  c  sS  € ä7DÀWÓ7MÑ4Ð nÜ
�UÓ
€CÜ	�g×	Ô	 $Ü˜$× 0Ñ 0Ô1Ü˜d°uÔ=ˆØÒØÐ(Õ)¨^Ô;¸xÈÕ?WÐ[gÔ?gÜ'Ð(YÓZÐZÜ! (°tÔ<÷ 
Ò	ð �<‰<ØbØ×Ñ˜x×1Ñ1°8×3CÑ3CÐDóFçFNÁhÃjò]ô $Ð$WÓXÐXØ�‰ð GðÜ×$Ò$ XÓ.ðØ0BÐCUÕ0VðØXdðØftðàðàñô		õ 	OÙ! $×(8Ñ(8Ô9Üœj¨Ó8Ó9÷) 
×	×	Ó	ús   ­AEÂB3EÅE!	c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r%   rö   r   rÊ   r®   rË   rÁ   r{  rÃ   rh   ri   r)   rÉ   r*   )r+   s   "r,   r-   r-   ~  s<   € ÷ #:ñ #:Øð#:Ø+ð#:Ø4?ð#:Ø`cð#:Ølqð#:àñ#:r.   c          
     ól  € \        W!4       \        V4       \        V4      p\        V 4      ;_uu_ 4       p\	        WbVR7       \        Wa4      p\        Ws4       VR,          R8w  d   \        RVR,           R24      hVP                  R\         R2VP                  34      P                  4       e   \        R	4      hVP                  R
\         R2VP                  34      P                  4       pVe   VR,          VP                  8w  d   \        R4      h\        VR,          4      ^,           p	\        VRV	.\        V4      OVNVNVP                  NVP                  NVN5\!        R4      4       ^ RIHp
 V
! WaP                  4       \'        WV	VR7      uuRRR4       #   + '       g   i     R# ; i)z?Move one queued task to running under the current driver lease.rˆ  r   Úqueuedzcannot start task in state 'Ú'z‹SELECT task_id, status FROM hosted_room_driver_tasks
               WHERE room_id=? AND status IN ('running', 'indeterminate', 'stopping') z LIMIT 1NzBroom recovery must resolve the prior task before starting new workzQSELECT task_id FROM hosted_room_driver_tasks WHERE room_id=? AND status='queued' r°   z/task is not next in the hosted room event orderr   a'  UPDATE hosted_room_driver_tasks
               SET status='running', execution_generation=?, run_gateway_id=?, run_process_generation=?,
                   run_lease_generation=?, started_at=?, updated_at=?
               WHERE room_id=? AND task_id=? AND status='queued' AND cancel_generation=?ztask changed during startr‰  )rÊ   rË   r   r   )rT  rX  rl   r  rQ  r3  r  rP   rÑ   r7  r¯   rë   r°   rÃ   r   rI  rN   r‹  rŠ  rÉ   )rö   rÊ   rË   r{  rh   rt   rÍ   rá   Únext_queuedr   rŠ  s   &&&$$      r,   Ú
start_taskrÀ  ~  sÀ  € ô �UÔ%ÜÐ1Ô2Ü
�UÓ
€CÜ	�g×	Ô	 $Ü˜d¨sÕ3Ü˜Ó(ˆÜ" 3ÔCØˆx�=˜HÔ$Ü,Ð/KÈCÐPXÍMÈ?ÐZ[Ð-\Ó]Ð]Ø�<‰<ðWÜWbÐVcÐckðoà×ÑÐó!÷ "*¡£ò8ô -Ð-qÓrÐrØ—l‘lØ_Ô`kÐ_lÐltÐuØ×ÑÐó!ç!)¡£ð 	ð Ò +¨iÕ"8¸H×<LÑ<LÔ"LÜ,Ð-^Ó_Ð_Ü" 3Ð'=Õ#>Ó?À!ÕCÐÜ�dð \ð
 %ð,Ü'1°%Ó'8ð,Ø:=ð,Ø?Bð,ØDL×DTÑDTð,ØV^×VfÑVfð,à*ñ,ä-;Ð<WÓ-Xô	Zõ 	OÙ! $×(8Ñ(8Ô9ÜØÐAUØ8ô:÷5 
×	×	Ó	ús   µE"F"Æ"F3	c               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# )r%   rö   r   rš  rÉ   r^  r   r   ÚTerminalStatusrS   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   ¤  sM   € ÷ `ñ `Øð`Ø)ð`Ø=@ð`ØJXð`Øbeð`Ønsð`àñ`r.   c               óL   € \        W#WE4      w  rgp\        WRRWg\        VRR7	      # )zGCommit one terminal result if every lease and task fence still matches.z"task attempt is stale or cancelledFztask changed during settlement)r›  r€  rt   rl  rþ   rƒ  r†  )ro  r¤  Ú_SETTLE_RUNNING_SQL)	rö   rš  r^  r   rS   rh   rt   rl  rƒ  s	   &&$$$$   r,   Úsettle_taskrÅ  ¤  s8   € ô *¨-ÀÓOÑ€C�Ü ØÐ&JÐX]ÐcfÜ¨JÐ>^ô`ð `r.   c               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# ©r%   rö   r   rÊ   r®   rË   rÁ   Úexpected_execution_generationrÃ   r{  r^  r   r   rÂ  rS   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   ®  s^   € ÷ 4ñ 4Øð4Ø+ð4Ø4?ð4Øcfð4à #ð4à47ð4àAOð4àY\ð4àejð4ð ñ4r.   c               ó˜   € \        WV4       V^8  g   V^8  d   \        R4      h\        WVWx4      w  ršp\        WVRWš\        W³V3RR7
      # )zBCommit a completion that won the race with an unacknowledged Stop.z+stopping settlement generations are invalidFz"task completion lost the stop race)rË   r€  rt   rl  rþ   rƒ  r…  r†  )rb  rD   ro  r�  Ú_SETTLE_STOPPING_SQL©rö   rÊ   rË   rÈ  r{  r^  r   rS   rh   rt   rl  rƒ  s   &&&$$$$$$   r,   Úsettle_stopping_taskrÌ  ®  s^   € ô
 ˜MÔ2Ø$ qÔ(Ð,FÈÔ,JÜ#Ð$QÓRÐRÜ)¨-ÀÓOÑ€C�ÜØ °E¸sÔWkØÐLfÐ,gØ2ô4ð 4r.   c               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# rÇ  r*   )r+   s   "r,   r-   r-   ½  s^   € ÷ 	.ñ 	.Øð	.Ø+ð	.Ø4?ð	.Øcfð	.à #ð	.à47ð	.àAOð	.àY\ð	.àejð	.ð ñ	.r.   c               óZ   € \        W!W44       \        WVWx4      w  ršp\        WVRW4V	W«R7	      # )zBCommit a verified historical receipt under the current room lease.r5   ©rt   rl  rƒ  )r\  ro  r˜  rË  s   &&&$$$$$$   r,   Úresolve_indeterminate_taskrÐ  ½  s=   € ô
 ˜%Ð+HÔeÜ)¨-ÀÓOÑ€C�Ü!Ø˜5 )Ð-JÐloØô.ð .r.   c               ó8   € V ^8„  d   QhRRRRRRRRR	RR
RRRRR/# )r%   rö   r   rÊ   r®   rË   rÁ   rÈ  rÃ   r{  rq  r   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   É  sV   € ÷ 	lñ 	lØð	lØ+ð	lØ4?ð	lØcfð	là #ð	là03ð	là<Að	làFTñ	lr.   c               ó”   € \        W!W44       \        VRR7      p\        V4      p\        WVRW4V\	        V4      V^,           WWV3R7	      # )zACommit a verified terminal cancellation for an uncertain attempt.rq  r�   r6   rÏ  )r\  r…   rl   r˜  ru  )rö   rÊ   rË   rÈ  r{  rq  rh   rt   s   &&&$$$$ r,   Ú"resolve_indeterminate_cancellationrÓ  É  s\   € ô ˜%Ð+HÔeÜ˜I¨[Ô9€IÜ
�UÓ
€CÜ!Ø˜5Ð"2Ð4QÐsvÜ˜iÓ(Ð6PÐSTÕ6TÐV_ÐfiÐ5jôlð lr.   c               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# ©r%   rö   r   rÊ   r®   rË   rÁ   rÈ  rÃ   r{  rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   Õ  sD   € ÷ ñ ØðØ+ðØ4?ðØcfðà #ðà,1ðà6Dñr.   c               óT   € \        W!W44       \        V4      p\        WVRW4VV3R7      # )zMExplicitly retry uncertain work after an operator accepts at-least-once risk.r7   ©rt   rƒ  ©r\  rl   r˜  ©rö   rÊ   rË   rÈ  r{  rh   rt   s   &&&$$$ r,   Úrequeue_indeterminate_taskrÚ  Õ  s8   € ô ˜%Ð+HÔeÜ
�UÓ
€CÜ!Ø˜5 )Ð-JÐloØ�6ôð r.   c               ó8   € V ^8„  d   QhRRRRRRRRR	RR
RRRRR/# )r%   rö   r   rÊ   r®   rË   rÁ   rÈ  rÃ   r{  Úreasonr   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   à  sL   € ÷ ;ñ ;Øð;Ø+ð;Ø4?ð;Øcfð;à #ð;à-0ð;à9>ð;àCQñ;r.   c               ó°   aaa	€ \        W!SS4       \        VRR7      p\        RVRR/4      o	\        V4      pR VVV	3R llp\	        WVRSSVVS	Ww3R	7	      # )
z8Fence one uncertain attempt and release later room work.Údefer_reasonr�   rÜ  Ú	retryableTc               ó    € V ^8„  d   QhRRRR/# rf  r*   )r+   s   "r,   r-   Ú.defer_indeterminate_task.<locals>.__annotate__è  s   € ÷ pñ p�Kð pÐ$9ñ pr.   c                ój   <€ \        V R SS4      pV'       d   V R,          S8X  d   \        V RR7      # R# )r   r   Trk  N)ry  r-  )rá   r   r{  rÈ  r   s   & €€€r,   rl  Ú(defer_indeterminate_task.<locals>.replayè  s7   ø€ Ü% c¨:Ð7TÐVpÓqˆß7?ÀCÈÕDVÐZeÔDeŒ~˜c¨dÔ3ÐoÐkoÐor.   r8   rÏ  )r\  r…   rn  rl   r˜  )
rö   rÊ   rË   rÈ  r{  rÜ  rh   rt   rl  r   s
   &&&dd$$  @r,   Údefer_indeterminate_taskrä  à  sq   ú€ ô ˜%Ð+HÐJdÔeÜ˜ ~Ô6€FÜ! 8¨V°[À$Ð"GÓH€KÜ
�UÓ
€C÷pò pô "Ø˜5 'Ð+HÐJdÐjmØ ;°Ð"9ô;ð ;r.   c               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# rÕ  r*   )r+   s   "r,   r-   r-   ð  sD   € ÷ $ñ $Øð$Ø+ð$Ø4?ð$Øcfð$à #ð$à,1ð$à6Dñ$r.   c               óR   € \        W!W44       \        V4      p\        WVRW4Wf3R7      # )z?Explicitly retry a fenced deferred turn under a new generation.r9   r×  rØ  rÙ  s   &&&$$$ r,   Úrequeue_deferred_taskrç  ð  s6   € ô ˜%Ð+HÔeÜ
�UÓ
€CÜ!Ø˜5Ð"4Ð6SØ˜Fô$ð $r.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rö   r   rš  rÉ   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   û  s/   € ÷ Mñ M vð M¸ð MÈuð MÐYgñ Mr.   c               óž   a€ \        V4      p\        SP                  SP                  4       R V3R llp\	        V SRR W4\
        V3RR7	      # )zFReturn a running task to its durable queue after proven non-admission.c               ó    € V ^8„  d   QhRRRR/# rf  r*   )r+   s   "r,   r-   Ú/requeue_not_admitted_task.<locals>.__annotate__ÿ  s   € ÷ Jñ J�Kð JÐ$9ñ Jr.   c                óÀ   <€ \        V R SP                  SP                  4      ;'       d    V R,          V R,          V R,          3R8H  pV'       d   \        V RR7      # R# )r½  r¡  r¢  r   NTrk  )NNN)ry  r   r   r-  )rá   Úrequeuedrš  s   & €r,   rl  Ú)requeue_not_admitted_task.<locals>.replayÿ  sj   ø€ Ü% c¨8°W×5QÑ5QÐSZ×SlÑSlÓm÷ uð uØÐ Õ! 3Ð'?Õ#@À#ÐF\ÕB]ðs_Øbtñsuˆç7?Œ~˜c¨dÔ3ÐIÀTÐIr.   z(not-admitted task attempt lost its fencec                ó,   € \        T ;'       g    ^ 4      # r  rx  rW  s   &r,   rq   Ú+requeue_not_admitted_task.<locals>.<lambda>  s   € ¤s¨5¯:¨:°A¤r.   z(not-admitted task changed during requeue)r›  r   rt   rl  rþ   rƒ  r†  )rl   rT  rË   rÊ   r¤  Ú_REQUEUE_RUNNING_SQL)rö   rš  rh   rt   rl  s   &f$  r,   Úrequeue_not_admitted_taskrò  û  sV   ø€ ä
�UÓ
€CÜ�W—]‘] G×$4Ñ$4Ô5÷Jð Jô !Ø�Ð&PÙ6¸CÔThØ�6Ð!KôMð Mr.   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# ©r%   rö   r   rÊ   r®   rq  r   r{  rÃ   rh   ri   r)   r  r*   )r+   s   "r,   r-   r-   	  s<   € ÷ 2ñ 2Øð2Ø+ð2Ø;>ð2Ø\_ð2Øhmð2àñ2r.   c               ó²   a€ \        VRR7      p\        S4       \        V4      pR V3R llp\        WV\	        V4      V\
        S^,           W%V3S3RR7	      # )z;Cancel a queued task before any external work was admitted.rq  r�   c               ó    € V ^8„  d   QhRRRR/# r’  r*   )r+   s   "r,   r-   Ú!cancel_task.<locals>.__annotate__  s   € ÷ Dñ D�;ð D 4ñ Dr.   c                ó¢   <€ V R ,          \         9   d   \        RV R ,           R24      hV R ,          R9  d   \        R4      h\        V S4       R# )r   zcannot cancel task in state 'r¾  z9running work requires acknowledged two-phase cancellationN>   r½  r   ©ÚTERMINAL_STATUSESrP   r  r~  s   &€r,   r�  Úcancel_task.<locals>.guard  sO   ø€ Øˆx�=Ô-Ô-Ü,Ð/LÈSÐQYÍ]ÈOÐ[\Ð-]Ó^Ð^Øˆx�=Ð 6Ô6Ü,Ð-hÓiÐiÜ" 3Ð(BÖCr.   z task changed during cancellation©rt   rl  r�  rþ   rƒ  r…  r†  )r…   rX  rl   r�  ru  Ú_CANCEL_QUEUED_SQL©rö   rÊ   rq  r{  rh   rt   r�  s   &&$d$  r,   Úcancel_taskrÿ  	  sh   ø€ ô ˜I¨[Ô9€IÜÐ1Ô2Ü
�UÓ
€C÷Dð Dô Ø˜s¬>¸)Ó+DÈEÔWiØ.°Õ2°IÀCÐHÐXrÐWtØ0ô2ð 2r.   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# rô  r*   )r+   s   "r,   r-   r-     s<   € ÷ 2ñ 2Øð2Ø+ð2Ø;>ð2Ø\_ð2Øhmð2àñ2r.   c               ó²   a€ \        VRR7      p\        S4       \        V4      pR V3R llp\        WV\	        VR4      V\
        S^,           W%3S3RR7	      # )zBPersist a stop intent without claiming the remote run has stopped.rq  r�   c               ó    € V ^8„  d   QhRRRR/# r’  r*   )r+   s   "r,   r-   Ú'begin_task_cancel.<locals>.__annotate__#  s   € ÷ Dñ D�;ð D 4ñ Dr.   c                óŒ   <€ V R ,          \         9   g   V R ,          R8X  d   \        RV R ,           R24      h\        V S4       R# )r   r½  z%cannot request remote stop in state 'r¾  Nrù  r~  s   &€r,   r�  Ú begin_task_cancel.<locals>.guard#  sD   ø€ Øˆx�=Ô-Ô-°°XµÀ(Ô1JÜ,Ð/TÐUXÐYaÕUbÐTcÐcdÐ-eÓfÐfÜ" 3Ð(BÖCr.   r   z task changed during stop requestrü  )r…   rX  rl   r�  ru  Ú_BEGIN_STOP_SQLrþ  s   &&$d$  r,   Úbegin_task_cancelr    si   ø€ ô ˜I¨[Ô9€IÜÐ1Ô2Ü
�UÓ
€C÷Dð Dô Ø˜s¬>¸)ÀZÓ+PÐX]ÔcrØ.°Õ2°IÐCÐSmÐRoØ0ô2ð 2r.   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# rô  r*   )r+   s   "r,   r-   r-   -  s<   € ÷ :ñ :Øð:Ø+ð:Ø;>ð:Ø\_ð:Øhmð:àñ:r.   c               ó�   aa€ \        SRR7      o\        V4      pR VV3R llp\        WV\        S4      V\        WU3SS3RR7	      # )zECommit cancellation only after the transport acknowledges exact Stop.rq  r�   c               ó    € V ^8„  d   QhRRRR/# r’  r*   )r+   s   "r,   r-   Ú*complete_task_cancel.<locals>.__annotate__3  s   € ÷ Gñ G�;ð G 4ñ Gr.   c                ót   <€ V R ,          V R,          \        V R,          4      3RSS38w  d   \        R4      hR# )r   rq  r   r   z"task stop acknowledgement is staleNr}  )rá   rq  r{  s   &€€r,   r�  Ú#complete_task_cancel.<locals>.guard3  sE   ø€ Ø��M˜3˜{Õ+¬S°Ð5HÕ1IÓ-JÐKØ˜	Ð#=ðP?ô ?ä Ð!EÓFÐFñ?r.   z(task changed during stop acknowledgementrü  )r…   rl   r�  ru  Ú_COMPLETE_STOP_SQLrþ  s   &&dd$  r,   Úcomplete_task_cancelr  -  sW   ù€ ô ˜I¨[Ô9€IÜ
�UÓ
€C÷Gñ Gô Ø˜s¬>¸)Ó+DÈEÔWiØ�:¨YÐ8RÐ,SØ8ô:ð :r.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rö   r   rË   rÁ   rh   ri   r)   zdict[str, list[TaskIdentity]]r*   )r+   s   "r,   r-   r-   =  s)   € ÷ 7ñ 7˜&ð 7¨ð 7Àð 7ÐJgñ 7r.   c               ó<  € \        V4      pR\         R2pVP                  .\        V4      O5p\	        V 4      ;_uu_ 4       p\        WaVR7       VP                  RV R\         2V4      P                  4       pV'       d   VP                  RV 2W3.VO54       ^ RI	H
p V! WaP                  4       R	 U	U
u/ uF3  p	T	\        WaP                  V	4       U
u. uF  p
\        V
4      NK  	  up
bK5  	  up
p	uuRRR4       # u up
i u up
p	i   + '       g   i     R# ; i)
zCFence abandoned running attempts without requeueing uncertain work.z(room_id=? AND status='running' AND NOT (rã   rˆ  z-SELECT * FROM hosted_room_driver_tasks WHERE r6  zwUPDATE hosted_room_driver_tasks SET status='indeterminate', indeterminate_at=?, updated_at=?
                    WHERE r‰  N)r½  r   )rl   Ú
_RUN_FENCEr¯   rI  r  rQ  rÑ   r7  ræ   r‹  rŠ  r:  r  )rö   rË   rh   rt   Úforeign_runningr(   rÍ   Ú
stale_rowsrŠ  r   rá   s   &&$        r,   Úrecover_roomr  =  s  € ä
�UÓ
€CØ@ÄÀÈAÐN€OØ�]‰]Ð/œZ¨Ó.Ñ/€EÜ	�g×	Ô	 $Ü˜d¨sÕ3Ø—\‘\Ø;¸OÐ;LÈAÌkÈ]Ð[Ð]bódßdlÑdlÓdnð 	çØ�L‰LðØ*Ð+ð/Ø14Ð0B¸EÑ0BôDõ 	OÙ! $¯©Ô6ñ 6ô7á5�ð ¼_ÈT×S`ÑS`ÐbhÔ=iÓjÑ=i°cÔ,¨SÖ1Ñ=iÑjÒjÙ5ò7÷ 
Ò	ùò kùó7÷ 
×	Ð	ús1   ÁA6D
Â8D
ÃC?Ã*D
Ã1D
Ã?D
ÄD
Ä
D	c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rö   r   rÊ   r®   r)   r  r*   )r+   s   "r,   r-   r-   Q  s!   € ÷ :ñ :�fð :¨ð :¸ñ :r.   c                ó    € \        \        V 4      4      ;_uu_ 4       p\        \        W!4      4      uuRRR4       #   + '       g   i     R# ; i)z)Read one task without mutating its state.N)r   r	  r-  r3  )rö   rÊ   rÍ   s   && r,   Úget_taskr  Q  s0   € ä	”˜'Ó"×	#Ô	# tÜœj¨Ó8Ó9÷ 
$×	#×	#Ó	#ús	   �<¼A	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   rö   r   r¯   r   r   zTaskStatus | Noner)   rw   r*   )r+   s   "r,   r-   r-   W  s0   € ÷ Wñ W˜ð W¨Cð WÐ9Jð WÐVjñ Wr.   c               ó  € \        VRR7      pVe   V\        9  d   \        R4      h\        \	        V 4      4      ;_uu_ 4       p\        W1V4       Uu. uF  p\        V4      NK  	  upuuRRR4       # u upi   + '       g   i     R# ; i)z3Return room tasks in deterministic admission order.r¯   r�   Nzinvalid task status)r…   ÚTASK_STATUSESrD   r   r	  r:  r-  )rö   r¯   r   rÍ   rá   s   &$$  r,   Ú
list_tasksr  W  sp   € ä˜'¨Ô3€GØÒ˜f¬MÔ9Ü#Ð$9Ó:Ð:Ü	”˜'Ó"×	#Ô	# tÜ/>¸tÈfÔ/UÓVÑ/U¨”˜sÖ#Ñ/UÑV÷ 
$Ò	#ùÚV÷ 
$×	#Ð	#ús   ÁA9ÁA4Á'A9Á4A9Á9B
	Úretention_secondsÚretainc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR
/# )r%   rö   r   r¯   r   rh   ri   r  r\   r  rÃ   r)   r*   )r+   s   "r,   r-   r-   `  s<   € ÷ -ñ -Øð-Ø!$ð-Ø-2ð-ØGLð-àð-à25ñ-r.   c               ó<  € \        VRR7      p\        V4      pV^ 8:  d   \        R4      h\        VRR7       \	        V 4      ;_uu_ 4       pVP                  R4      P                  4       pVf    RRR4       ^ # VP                  RV34      P                  4       pV\        V4      ,
          p	\        V4       U
Uu. uFC  w  r«W¤8¼  g'   VR	,          f   K  \        VR	,          4      V	8:  g   K1  \        VR
,          4      NKE  	  upp
R\         pV'       g    RRR4       ^ # VP                  RRP                  R\        V4      ,          4       R2V.VO54      p\        ^ \        VP                   4      4      uuRRR4       # u upp
i   + '       g   i     R# ; i)z@Bound execution rows after outcomes are durable in the room log.r¯   r�   z"retention_seconds must be positivez%retain must be a non-negative integer)rZ   zYSELECT 1 FROM sqlite_master WHERE type='table' AND name='hosted_room_policy_publications'NaÎ  SELECT t.task_id, t.terminal_at FROM hosted_room_driver_tasks t
                WHERE t.room_id=? AND t.status IN ('settled', 'failed', 'cancelled')
                  AND EXISTS (SELECT 1 FROM hosted_room_policy_publications p
                              WHERE p.room_id=t.room_id AND p.task_id=t.task_id
                                AND p.kind IN ('turn.settled', 'turn.failed', 'turn.cancelled'))
                ORDER BY t.terminal_at DESC, t.task_id ASCr"   r°   zEDELETE FROM hosted_room_driver_tasks WHERE room_id=? AND task_id IN (Ú,Ú?rã   )r…   rl   rD   r¡   r  rÑ   rë   ræ   r\   Ú	enumerater'   ÚMAX_TASK_PRUNE_BATCHrž   Úlenr§  rÃ   Úrowcount)rö   r¯   rh   r  r  rt   rÍ   Úpublicationsrì   Úcutoffrí   rá   Ú
candidatesÚdeleteds   &$$$$         r,   Úprune_published_terminal_tasksr+  `  s•  € ô ˜'¨Ô3€GÜ
�UÓ
€CØ˜AÔÜ#Ð$HÓIÐIÜ�Ð!HÕIÜ	�g×	Ô	 $Ø—|‘|ØgóißiqÑiqÓisð 	àÒØ÷	 
Ñ	ð
 �|‰|ð >ð
 AH¸zóK÷
 LTÉ8Ë:ð 	ð ”uÐ.Ó/Õ/ˆä2;¸D´/ô
Ù2A¡J EØŒ 3 }Õ#5ô  ÜFKÈCÐP]ÕL^ÓF_ÐciÑFiô  ŒC��I•Ö±/ò
ð  Ôð!ˆ
÷ Ø÷# 
Ñ	ð$ —,‘,ØSÐTW×T\ÑT\Ð]`ÔcfÐgqÓcrÕ]rÓTsÐStÐtuÐvØÐ"�zÑ"ó$ˆô �1”c˜'×*Ñ*Ó+Ó,÷+ 
Ò	ùó
÷ 
×	Ð	ús>   Á%F
Á:AF
Â;F
ÃF
Ã.F
ÄF
ÄF
Ä"AF
ÆF
Æ
F	c               ó$   € V ^8„  d   QhRRRRRR/# )r%   rö   r   rÊ   r®   r)   rg  r*   )r+   s   "r,   r-   r-   �  s&   € ÷ ñ Øðàðð ñr.   c                ó
  € \        V 4      p VP                  RVP                  VP                  VP                  34      P                  4       pVe   \        V4      MR VP                  4        #   TP                  4        i ; i)zJRead the immutable admission for a turn, including older payload versions.zcSELECT * FROM hosted_room_driver_tasks
               WHERE room_id=? AND thread_id=? AND turn_id=?N)r	  rÑ   r¯   r±   r²   rë   r-  r  )rö   rÊ   rÍ   rá   s   &&  r,   Úget_task_for_turnr.  �  su   € ô
 �GÓ€DðØ�l‰lð@à×Ñ˜x×1Ñ1°8×3CÑ3CÐDó
÷ ‰(‹*ð	 	ð
 '*¢oŒ~˜cÔ"¸4Ð?à�
‰
�øˆ�
‰
�ús   �AA0 Á0B)r½  r   ra  r`  Ú	cancelledr   r   r   )ra  r`  i   i   i �' >   r`  ra  r/  >   r‘   r�   r“   >   r™   r–   r˜   >	   r¯   rÆ   rÂ   r   Úacquired_atrO  rÄ   r   rÅ   )r¯   r°   r±   r²   r“   r   r!  r   r   r   r¡  r¢  r   rq  r^  rj  r   r    r   r!   r"   r#   )rÞ   r^   )r/  )�Ú__conditional_annotations__rA   Ú
__future__r   r®  r£   r&  rb   r>  Ú
contextlibr   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r	   r
   Úgateway.hosted_rooms_commonr   r   r   r   r   r   r   r   r   r   r\   ri   Ú
TaskStatusrÂ  ÚMAX_IDENTIFIER_CHARSr    ÚMAX_RESULT_JSON_BYTESÚTERMINAL_TASK_RETENTION_SECONDSÚMAX_RETAINED_TERMINAL_TASKSr$  Ú	frozensetr  rú  rœ   r�   rä   ró   rå   r7  rP  r2  rÙ   r3   r  Ú_SETTLE_SETÚ_REQUEUE_SETÚ_CANCEL_SETr0   r4   rÄ  rÊ  rñ  rý  r  r  Ú_INDETERMINATE_STALEr—  r`   r;   rD   rF   rH   rJ   rL   rN   rP   r…   r¡   rn  rf   rl   ru   rŒ   r«   r®   rÁ   rÉ   rÒ   rÚ   rØ   rî   rô   r	  r  r  r  r  rÃ   r'  r  r¿   r-  r3  r:  r@  rF  rI  rL  rQ  rT  rX  r\  rb  ro  ru  ry  r  r�  r˜  r¤  r«  r²  rµ  rº  rÀ  rÅ  rÌ  rÐ  rÓ  rÚ  rä  rç  rò  rÿ  r  r  r  r  r  r+  r.  )r1  s   @r,   Ú<module>rB     s	  øðôõ #ã Û Û Û Û Ý Ý #Ý !Ý ß 3Ó 3÷÷ ÷ ð 	��U�Õ€ØÐsÕt€
ØÐ,Õ-€àÐ ØÐ Ø"Ð Ø"3Ð Ø"Ð ØÐ Ù™( :Ó.Ó/€ÙÒ@ÓAÐ á )Ò*ZÓ [Ð Ù )Ò*^Ó _Ð Ùò !ó "€ð'Ð ñ
 Ð,Ó-€Ø>€ØI€ØU€ðb€ð EÐ ØW€
Øj€Øm€Øa€õiõRñ
 )¨°iÓ@ÀUÈ:È,ÐCWÕWÐ Ù)¨+°zÓBÐ Ù#Ø€nÐ3Ð4Ð8MÐN_ÐM`Ð`eÐfpÐeqÐ6rótÐ á! +Ð/iÓjÐ ÙØGØDóF€ñ "Ø5Ð7rótÐ ð
 ?Ð à� Ð.BÐDvÐwØØ˜Ð&QØ9ð;ð Ø˜L˜>Ð)_Ð`ÐbvØ3ð5ð ØÐXÐZnØ4ð6ð ØØˆ.ÐrÐsØ*Ð,RðTðUÐ ô" i�zÔ hÜ rÐ,Ô rÜ pÐ+Ô pÜ lÐ%Ô lÜ nÐ&Ô nÜ sÐ(Ô sÜ sÐ%Ô sÜ qÐ!1Ô qñ �jÐ(=ÐI]Ô^€Ù�{Ð*?Ô@€ÙØÐ/°xÐK`Ðosôu€ðÈ%÷ õ?õõ[õ"Tñ: �$Ô÷	\ð 	\ó ð	\ñ �$Ô÷ð ó ðñ �$Ô÷ð ó ð÷Hõ"	Iõ
Wõõ	;õõ0:ðBÈE÷ Bõlõ
Dð ˜CÐ!4°cÐ;QÑS\Ð]`ÓSaØ‘9˜TŸZ™ZÓ(¨,¸¸|ÈUÐT`ÑbkÐlqÓbrØ‘9˜UÓ#Ð%7¹À5Ó9Ið5KÐ Ð1ó Kð¸5÷ ðÐUY÷ ÷0õõõNõ
eõõPõ
õ*õõO÷"uõ9õ
Eð
:à8<ð:àRVð:ð EIð:ð 37÷	:ð8dð 37÷dðrØil÷rõ &cõRRõ!õ0:õ6#:õL`õ4õ	.õ	lõõ;õ $õMõ2õ&2õ":õ 7õ(:ðWÈT÷ Wð-ØOnð-à-÷-÷Br.   