+
    jHàjv ã                  ó
	  € R t ^ RIH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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HtHtH t  ^t!^€t"^€t#^Èt$^@t%^€t&^Èt'^€t(Rñt)Ròt*R	t+Rót,R	t-Rt.R
t/Rôt0Rt1Rõt2Röt3^@t4R÷t5^t6]Pn                  ! R4      t8]9! 0 Røm4      t:R]9! R04      R]9! R04      R]9! 0 Rùm4      R]9! 0 Rúm4      /t;R]'3R]&3R]&33t<]9! RR0R ]< 4       m4      t=Rût>Rt?RRR R!R"]? R#2R$R%3t@]A;QJ d    . R& ]@ 4       F  NK  	  5M! R& ]@ 4       4      tB]B^,          ^,          tCR'tDR(]D R)2tER*]D R+2tFR,tGR-tHR(]G R.2tIR(]H R.2tJR/tKR0tLR1tMRütNR2PŸ                  R3 ]> 4       4      tPR4]P 2tQR5tRR6]R R72tS ! R8 R9]T4      tU ! R: R;]U4      tV ! R< R=]V4      tW ! R> R?]U4      tX ! R@ RA]U4      tY ! RB RC]U4      tZ ! RD RE]U4      t[ ! RF RG][4      t\ ! RH RI]U4      t] ! RJ RK]]4      t^]
! ]]URLRM7      t_]
! ]]URN7      t`]
! ]`R]"RO7      ta]
! ]`RP]#RO7      tb]
! ]_RQRýRR7      tc]
! ]_RS]*RR7      td]
! ]]URN7      te]
! ]`RT]$RRURV7      tf]
! ]`R]%]8RWRV7      tgRX RY lthRZ R[ ltiR\ R] ltjR^ R_ ltkR` Ra ltlRb Rc ltmRd Re ltnRf Rg ltoRh Ri ltpRj Rk ltqRl Rm ltrRn Ro lts]l! Rp4      Pé                  RqRr4      tuRþRÿER RtRuRsRq]u Rq23ER3tvRvtwRw Rx ltxRy Rz 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€]
! ]]RLR‰7      t�RŠ R‹ lt‚RŒ R� ltƒRŽ R� lt„R� R‘ lt…R’RL/R“ R” llt†R’RL/R• R– llt‡R— R˜ ltˆR™ Rš lt‰R› Rœ ltŠR�RL/Rž RŸ llt‹R�RL/R  R¡ lltŒERt�R¢ R£ ltŽR¤R/R¥ R¦ llt�R§R/R¨ R© llt�Rª R« lt‘R¬ R­ lt’R§R/R® R¯ llt“R° R± lt”R² R³ lt•R´ Rµ lt–R§R/R¶ R· llt—R¸ R¹ lt˜Rº R» lt™R§R/R¼ R½ lltšR¾ R¿ lt›R§R/RÀ RÁ lltœR§R/RÂ RÃ llt�R§R/RÄ RÅ lltžRÆ RÇ ltŸR§R/RÈ RÉ llt RRRRRÊR/RË RÌ llt¡RÍ RÎ lt¢RÏ RÐ lt£R§RRÑR/RÒ RÓ llt¤RÔRLRÕ]-RÖ^ /R× RØ llt¥R§R/RÙ RÚ llt¦RRRRR§RRÛR/RÜ RÝ llt§RÞ Rß lt¨Rà Rá lt©R§R/Râ Rã lltªRÔRL/Rä Rå llt«Ræ Rç lt¬R§R/Rè Ré llt­Rê Rë lt®R§R/Rì Rí llt¯Rî^ RÕ^dRÔRL/Rï Rð llt°R# (  ao  Durable state for gateway-hosted Bot Mode rooms.

Owns only hosted-room identity and its append-only event log; delivery, relay leasing and agent turns
belong to the relay and the hosted-room driver, so the log composes with a durable relay without a second
transport queue. Callers supply the database path (production handlers use the gateway's root ``state.db``).
)ÚannotationsN)Úclosing)Úpartial)ÚPath)ÚAnyÚCallableÚMapping)ÚDbPathÚbounded_intÚcanonical_jsonÚclockÚcompact_jsonÚconnectÚfenced_updateÚ
identifierÚopen_sqliteÚtable_columnsÚtable_existsÚtransactionÚutf8_lené   iô  i   iPÃ  z^[a-z][a-z0-9_.-]*$Úuserúmessage.userÚmemberúmessage.memberÚgatewayÚsystemÚdisplay_nameÚprofileÚconnection_idÚkindÚidc              #  ó*   "  € T F	  w  rVx € K  	  R # 5i©N© )Ú.0ÚfieldÚ_s   &  Ú9/home/ubuntu/.hermes/hermes-agent/gateway/hosted_rooms.pyÚ	<genexpr>r)   <   s   é € Ð*XÑAW±X°U­5ÓAWùó   ‚Úroom_idÚauthority_gateway_idÚauthority_epochÚtarget_profilea?  
            room_id TEXT NOT NULL,
            home_install_id TEXT NOT NULL,
            authority_gateway_id TEXT NOT NULL,
            authority_epoch INTEGER NOT NULL CHECK (authority_epoch >= 1),
            member_id TEXT NOT NULL,
            task_id TEXT NOT NULL,
            execution_generation INTEGER NOT NULL CHECK (execution_generation >= 1),
            target_install_id TEXT NOT NULL,
            target_profile TEXT NOT NULL,
            run_id TEXT NOT NULL,
            session_id TEXT NOT NULL,
            created_at REAL NOT NULL,
            updated_at REAL NOT NULL,
            PRIMARY KEY (
                room_id, home_install_id, authority_gateway_id, authority_epoch,
                member_id, target_install_id, target_profile, task_id,
                execution_generation
            )
        ak  CREATE TABLE IF NOT EXISTS hosted_rooms (
            room_id TEXT PRIMARY KEY,
            name TEXT NOT NULL,
            members_json TEXT NOT NULL,
            authority_gateway_id TEXT NOT NULL,
            authority_epoch INTEGER NOT NULL DEFAULT 1 CHECK (authority_epoch >= 1),
            next_seq INTEGER NOT NULL DEFAULT 1 CHECK (next_seq >= 1),
            event_bytes INTEGER NOT NULL DEFAULT 0 CHECK (event_bytes >= 0),
            revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
            created_at REAL NOT NULL,
            updated_at REAL NOT NULL,
            disbanded_at REAL
        )a7  CREATE TABLE IF NOT EXISTS hosted_room_events (
            room_id TEXT NOT NULL,
            seq INTEGER NOT NULL CHECK (seq >= 1),
            event_id TEXT NOT NULL,
            kind TEXT NOT NULL,
            actor_json TEXT NOT NULL,
            authority_epoch INTEGER CHECK (authority_epoch IS NULL OR authority_epoch >= 1),
            payload_json TEXT NOT NULL,
            created_at REAL NOT NULL,
            PRIMARY KEY (room_id, seq),
            UNIQUE (room_id, event_id),
            FOREIGN KEY (room_id) REFERENCES hosted_rooms(room_id)
        )z‰CREATE TABLE IF NOT EXISTS hosted_room_retired_ids (
            room_id TEXT PRIMARY KEY,
            retired_at REAL NOT NULL
        )a!  CREATE TABLE IF NOT EXISTS hosted_room_links (
            room_id TEXT NOT NULL,
            member_id TEXT NOT NULL,
            target_url TEXT NOT NULL,
            target_profile TEXT NOT NULL,
            grant TEXT NOT NULL,
            catalog_json TEXT NOT NULL,
            cancellation_scope_id TEXT NOT NULL,
            trace_id TEXT NOT NULL,
            transport_security TEXT NOT NULL,
            status TEXT NOT NULL DEFAULT 'ready',
            updated_at REAL NOT NULL,
            PRIMARY KEY (room_id, member_id)
        )z4CREATE TABLE IF NOT EXISTS hosted_room_remote_runs (Ú)z¸CREATE TABLE IF NOT EXISTS hosted_room_revoked_grants (
            scope_key TEXT PRIMARY KEY,
            expires_at REAL NOT NULL,
            revoked_before REAL NOT NULL
        )aý  CREATE TABLE IF NOT EXISTS hosted_room_peer_reservations (
            room_id TEXT NOT NULL,
            member_id TEXT NOT NULL,
            target_profile TEXT NOT NULL,
            authority_gateway_id TEXT NOT NULL,
            authority_epoch INTEGER NOT NULL CHECK (authority_epoch >= 1),
            expires_at REAL NOT NULL,
            revoked_at REAL,
            created_at REAL NOT NULL,
            updated_at REAL NOT NULL,
            PRIMARY KEY (room_id, member_id, target_profile)
        )c              #  óú   "  € T Fq  p\         P                  ! R V4      P                  ^4      \        \         P                  ! RVP                  R^4      ^,          \         P                  4      4      3x € Ks  	  R# 5i)zEXISTS (\w+)z!^\s*(\w+) (?:TEXT|INTEGER|REAL)\bÚ(N)ÚreÚsearchÚgroupÚ	frozensetÚfindallÚsplitÚ	MULTILINE)r%   Úddls   & r(   r)   r)   –   sc   é € ð ~áq|Ðjmô ‡Y‚Yˆ Ó$×*Ñ*¨1Ó-ÜŒr�zŠzÐ>ÀÇ	Á	È#ÈqÓ@QÐRSÕ@TÔVX×VbÑVbÓcÓdõfÛq|ùs   ‚A9A;zSroom_id, seq, event_id, kind, actor_json, authority_epoch, payload_json, created_atúSELECT z7 FROM hosted_room_events WHERE room_id=? AND event_id=?z INSERT INTO hosted_room_events (z!) VALUES (?, ?, ?, ?, ?, ?, ?, ?)z|room_id, name, members_json, authority_gateway_id, authority_epoch, next_seq, revision, created_at, updated_at, disbanded_atz‰room_id, name, members_json, authority_gateway_id, authority_epoch, next_seq, event_bytes, revision, created_at, updated_at, disbanded_atz" FROM hosted_rooms WHERE room_id=?z6SELECT COALESCE(SUM(event_bytes), 0) FROM hosted_roomszQINSERT OR IGNORE INTO hosted_room_retired_ids (room_id, retired_at) VALUES (?, ?)z€INSERT OR IGNORE INTO hosted_room_retired_ids (room_id, retired_at) SELECT room_id, disbanded_at FROM hosted_rooms WHERE {where}ú AND c              #  ó*   "  € T F	  q R 2x € K  	  R# 5i©z=?Nr$   )r%   Úcolumns   & r(   r)   r)   ¯   s   é € Ð ZÑ=Y°6 8¨2¥Ó=Yùr*   z,SELECT * FROM hosted_room_remote_runs WHERE zLWHERE room_id=? AND target_profile=? AND expires_at>? AND revoked_at IS NULLz,SELECT 1 FROM hosted_room_peer_reservations z LIMIT 1c                  ó   € ] tR t^µtRtRtR# )ÚHostedRoomErrorz=Base class for invalid or conflicting hosted-room operations.r$   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r$   ó    r(   r@   r@   µ   s   † Õ#frH   r@   c                  ó   € ] tR t^·tRtRtR# )ÚRoomNotFoundErrorz8Raised when a room does not exist or has been disbanded.r$   NrA   r$   rH   r(   rJ   rJ   ·   s   † Õ*hrH   rJ   c                  ó   € ] tR t^¹tRtRtRtR# )ÚRoomHistoryExpiredErrorzERaised when a retired room remains reserved after history compaction.Úroom_history_expiredr$   N©rB   rC   rD   rE   rF   ÚreasonrG   r$   rH   r(   rL   rL   ¹   s
   † ÙOØ#„FrH   rL   c                  ó   € ] tR t^½tRtRtR# )ÚRoomConflictErrorzBRaised when an idempotency key is reused for different room state.r$   NrA   r$   rH   r(   rQ   rQ   ½   s   † Õ*rrH   rQ   c                  ó   € ] tR t^¿tRtRtR# )ÚRoomProbeUnavailableErrorzFRaised when a non-blocking ownership probe cannot read the room store.r$   NrA   r$   rH   r(   rS   rS   ¿   s   † ÝPrH   rS   c                  ó   € ] tR t^ÂtRtRtR# )ÚEventConflictErrorzCRaised when an event id is reused with different immutable content.r$   NrA   r$   rH   r(   rU   rU   Â   s   † Õ+trH   rU   c                  ó   € ] tR t^ÄtRtRtR# )ÚEventCursorConflictErrorzGRaised when new room events invalidate an uncommitted publication plan.r$   NrA   r$   rH   r(   rW   rW   Ä   ó   † ÝQrH   rW   c                  ó   € ] tR t^ÇtRtRtR# )ÚEventAttachmentConflictErrorzGA publication lost its file commitments; use the same fresh-plan retry.r$   NrA   r$   rH   r(   rZ   rZ   Ç   rX   rH   rZ   c                  ó   € ] tR t^ÊtRtRtRtR# )ÚAuthorityConflictErrorzCRaised when a stale room authority attempts to mutate hosted state.Úauthority_conflictr$   NrN   r$   rH   r(   r\   r\   Ê   s
   † ÙMØ!„FrH   r\   c                  ó   € ] tR t^ÎtRtRtR# )ÚAuthoritySupersededErrorz>Raised when a successful authority claim was later superseded.r$   NrA   r$   rH   r(   r_   r_   Î   s   † ÝHrH   r_   F)ÚerrorÚensure_ascii)r`   ©ÚlabelÚ	max_charsÚevent_idÚactor©rc   Ú	max_bytesÚpayloadÚnamezinvalid room name)rc   rd   ÚpatternÚinvalidzinvalid event kindc               ó$   € V ^8„  d   QhRRRRRR/# )é   Úvaluer   rc   ÚstrÚreturnr$   )Úformats   "r(   Ú__annotate__rs   á   s&   € ÷ Rñ R�Sð R ð R¨ñ RrH   c                ó$   € \        W\        R 7      # )rb   )Ú_validate_identifierÚMAX_ACTOR_ID_CHARS©ro   rc   s   &&r(   Ú	_actor_idrx   á   s   € Ü Ô>PÔQÐQrH   c               ó$   € V ^8„  d   QhRRRRRR/# ©rn   ro   r   rc   rp   rq   Úintr$   )rr   s   "r(   rs   rs   å   s&   € ÷ Uñ U ð U¨Sð U°Sñ UrH   c                ó"   € \        W R 2^R7      # )z must be a positive integer)ÚmessageÚlow©Ú_bounded_intrw   s   &&r(   Ú_require_positive_intr�   å   s   € Ü˜¨Ð0KÐ'LÐRSÔTÐTrH   c               ó$   € V ^8„  d   QhRRRRRR/# )rn   ro   r   Úmaximumr{   rq   r$   )rr   s   "r(   rs   rs   é   s&   € ÷ fñ f˜#ð f¨ð f°ñ frH   c                ó&   € \        V R V 2^VR7      # )zlimit must be between 1 and )r}   r~   Úhighr   )ro   rƒ   s   &&r(   Ú_bounded_limitr†   é   s   € Ü˜Ð)EÀgÀYÐ'OÐUVÐ]dÔeÐerH   c               ó$   € V ^8„  d   QhRRRRRR/# rz   r$   )rr   s   "r(   rs   rs   í   s&   € ÷ Rñ R˜ð R Sð R¨Sñ RrH   c                ó    € \        W R 2R7      # )z must be a non-negative integer©r}   r   rw   s   &&r(   Ú_non_negativerŠ   í   s   € Ü˜¨Ð0OÐ'PÔQÐQrH   c               ó    € V ^8„  d   QhRRRR/# )rn   Úactor_idrp   rq   r$   )rr   s   "r(   rs   rs   ñ   s   € ÷ ;ñ ; ð ;¨ñ ;rH   c                ó    € \        R RRV /4      # )r    r   r!   )Ú_actor_json)rŒ   s   &r(   Ú_system_actor_jsonr�   ñ   s   € Ü˜ ¨$°Ð9Ó:Ð:rH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rn   Úprevious_gateway_idrp   Únew_gateway_idÚepochr{   rq   r$   )rr   s   "r(   rs   rs   õ   s/   € ÷ xñ x¨Sð xÀ#ð xÈcð xÐVYñ xrH   c                ó$   € \        R V RVRV/4      # )r‘   r,   r-   )Ú_payload_json)r‘   r’   r“   s   &&&r(   Ú_claim_payload_jsonr–   õ   s%   € ÜØ	Ð 3Ð5KÈ^Ð]nÐpuÐvóxð xrH   c               ó    € V ^8„  d   QhRRRR/# )rn   Úclient_event_idr   rq   rp   r$   )rr   s   "r(   rs   rs   ú   s   € ÷ \ñ \ 3ð \¨3ñ \rH   c                ó€   € R\         P                  ! \        V 4      P                  R4      4      P	                  4        2# )zBMap a client retry key into the server-owned user-event namespace.zuser:úutf-8)ÚhashlibÚsha256Ú	_event_idÚencodeÚ	hexdigest)r˜   s   &r(   Úuser_event_idr    ú   s2   € à”7—>’>¤)¨OÓ"<×"CÑ"CÀGÓ"LÓM×WÑWÓYÐZÐ[Ð[rH   c               ó    € V ^8„  d   QhRRRR/# )rn   ro   r   rq   z tuple[list[dict[str, Any]], str]r$   )rr   s   "r(   rs   rs   ÿ   s   € ÷ `ñ `˜Sð `Ð%Eñ `rH   c                ór  € \        V \        4      '       g   \        R 4      h\        V 4      \        8”  d   \        R4      h\
        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      '       g   \        R4      hV  Uu. uF  p\        V4      NK  	  ppV\        VR\        R7      3# u upi )zmembers must be a listztoo many room membersc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5ir#   )Ú
isinstanceÚdict)r%   r   s   & r(   r)   Ú$_validate_members.<locals>.<genexpr>  s   é € Ð<±e¨FŒz˜&¤$×'Ð'³eùs   ‚FTz"each room member must be an objectÚmembersrg   )	r¤   Úlistr@   ÚlenÚMAX_MEMBERSÚallr¥   Ú_canonical_jsonÚMAX_MEMBERS_JSON_BYTES)ro   r   r§   s   &  r(   Ú_validate_membersr®   ÿ   s’   € Ü�eœT×"Ò"ÜÐ6Ó7Ð7Ü
ˆ5ƒz”KÔÜÐ5Ó6Ð6ß‹3Ñ<±eÓ<�3�3Š3Ñ<±eÓ<×<Ò<ÜÐBÓCÐCÙ*/Ó0©% Œt�FŽ|©%€GÐ0Ø”O G°9ÔH^Ô_Ð_Ð_ùò 1s   Â
B4c               ó$   € V ^8„  d   QhRRRRRR/# )rn   Úexisting_jsonrp   Úproposedúlist[dict[str, Any]]rq   Úboolr$   )rr   s   "r(   rs   rs   
  s#   € ÷ ñ ¨ð Ð8Lð ÐQUñ rH   c                óÈ  €  \         P                  ! V 4      p\	        T\
        4      '       d   \        T4      \        T4      8w  d   R# \        Y!RR7       Fp  w  r4\	        T\        4      '       g    R# \        T4      \        T4      rCTP                  RR4      TP                  RR4      reY48w  g   TR/ 39  g   Kg  YV8w  g   Ko   R# 	  R#   \        \        3 d     R# i ; i)zEAllow adoption to add routing metadata an older room could not store.FT©ÚstrictÚtargetN)
ÚjsonÚloadsÚ	TypeErrorÚ
ValueErrorr¤   r¨   r©   Úzipr¥   Úpop)r°   r±   ÚexistingÚpreviousÚcurrentÚprevious_targetÚcurrent_targets   &&     r(   Ú_legacy_members_matchrÃ   
  sÀ   € ðÜ—:’:˜mÓ,ˆô �h¤×%Ò%¬¨X«¼#¸h»-Ô)GÙÜ  ¸D×AÑˆÜ˜(¤D×)Ò)ÚÜ  ›N¬D°«M�'Ø*2¯,©,°xÀÓ*FÈÏÉÐT\Ð^bÓHc˜ØÔ ?¸4À¸*Ö#DÈÖIjÚñ Bñ øô ”zÐ"ô Úðús   ‚C ÃC!Ã C!c               ó$   € V ^8„  d   QhRRRRRR/# )rn   ro   r   r    rp   rq   ztuple[dict[str, str], str]r$   )rr   s   "r(   rs   rs     s"   € ÷ %ñ %˜3ð %¨ð %Ð1Kñ %rH   c               óö  € \        V \        4      '       g   \        R 4      h\        V 4      \        ,
          pV'       d'   \        RRP                  \        V4      4       24      hV P                  R4      p\        V\        4      '       d   V\        9  d   \        R4      hV\        V,          9  d   \        RV RV R24      hRVR\        V P                  R4      R	4      /p\         F~  w  rVV P                  V4      pVf   K  \        V\        4      '       g   \        R
V R24      h\        VP                  4       ;p4      V8”  d   \        R
V R24      hV'       g   Kz  WtV&   K€  	  V\        V4      3# )zactor must be an objectzunknown actor fields: ú, r    zinvalid actor.kindzactor kind 'z' cannot append 'Ú'r!   zactor.idzactor.z must be a stringz is too long)r¤   r¥   r@   ÚsetÚ_ACTOR_FIELDSÚjoinÚsortedÚgetrp   Ú_EVENT_KINDS_BY_ACTORrx   Ú_OPTIONAL_ACTOR_FIELDSr©   ÚstriprŽ   )ro   r    ÚunknownÚ
actor_kindrf   r&   rd   Úfield_values   &$      r(   Ú_validate_actorrÓ     sU  € Ü�eœT×"Ò"ÜÐ7Ó8Ð8Ü�%‹jœ=Õ(€GßÜÐ 6°t·y±yÄÈÃÓ7QÐ6RÐSÓTÐTØ—‘˜6Ó"€JÜ�j¤#×&Ò&¨*Ô<QÔ*QÜÐ2Ó3Ð3ØÔ(¨Õ4Ô4Ü ¨Z¨LÐ8IÈ$ÈÈqÐQÓRÐRØ�Z ¤y°·±¸4³À*Ó'MÐN€Eß2ÑˆØ—i‘i Ó&ˆØÒÙÜ˜+¤s×+Ò+Ü! F¨5¨'Ð1BÐ"CÓDÐDÜ˜k×/Ñ/Ó1Ð1ˆ{Ó2°YÔ>Ü! F¨5¨'°Ð">Ó?Ð?ß‰;Ø&�%‹Lñ 3ð ”+˜eÓ$Ð$Ð$rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rn   Úconnúsqlite3.ConnectionÚcolumnszfrozenset[str]rq   r³   r$   )rr   s   "r(   rs   rs   6  s(   € ÷ vñ vÐ%7ð vÀ.ð vÐUYñ vrH   c                óJ  € \         P                  V4      '       g   R # V P                  R4       Uu. uF  q"^,          '       g   K  VNK  	  pp\        ;QJ d'    . R \	        VR R7       4       F  NK  	  5\
        8H  # ! R \	        VR R7       4       4      \
        8H  # u upi )Fz*PRAGMA table_info(hosted_room_remote_runs)c              3  óF   "  € T F  p\        V^,          4      x € K  	  R# 5i)é   N)rp   )r%   Úrows   & r(   r)   Ú-_remote_run_schema_current.<locals>.<genexpr>:  s   é € ÐUÑ(T ”�S˜•V—�Ó(Tùs   ‚!c                ó&   € \        V ^,          4      # )é   )r{   ©rÛ   s   &r(   Ú<lambda>Ú,_remote_run_schema_current.<locals>.<lambda>:  s   € ÌÈCÐPQÍFÌrH   )Úkey)Ú_REMOTE_RUN_SCHEMA_COLUMNSÚissubsetÚexecuteÚtuplerË   Ú_REMOTE_RUN_IDENTITY_COLUMNS)rÕ   r×   rÛ   Úpk_rowss   &&  r(   Ú_remote_run_schema_currentré   6  s…   € Ü%×.Ñ.¨w×7Ò7ÙØ"Ÿl™lÐ+WÔXÓcÑX�sÐ`a×\bÑ\b�sˆsÑX€GÐcßŒ5ÑU¬¨wÑ<SÕ(TÓU�5ÔYuÑuÐuˆ5ÑU¬¨wÑ<SÕ(TÓUÓUÔYuÑuÐuùò ds   ±B ÁB c               ó    € V ^8„  d   QhRRRR/# ©rn   rÕ   rÖ   rq   ÚNoner$   )rr   s   "r(   rs   rs   =  s   € ÷ dñ dÐ%7ð d¸Dñ drH   c           	     óH  a€ \        V R4      o\        V S4      '       d   R# V P                  R4       V P                  R\         R24       S'       d-   RpV3R lV 4       w  r#pV P                  RV RV RV R	24       V P                  R
4       V P                  R4       R# )z>Fence legacy receipts behind a complete authority-lineage key.Úhosted_room_remote_runsNz6DROP TABLE IF EXISTS hosted_room_remote_runs_migratingz0CREATE TABLE hosted_room_remote_runs_migrating (r/   c              3  ó>   <"  € T F  w  rVS9   d   TMTx € K  	  R # 5ir#   r$   )r%   r>   Údefaultr×   s   &  €r(   r)   Ú-_migrate_remote_run_schema.<locals>.<genexpr>F  s!   øé € ÐjÑ`iÉ_ÈV¨&°GÔ*;¡ÀÔ HÓ`iùó   ƒat  INSERT OR IGNORE INTO hosted_room_remote_runs_migrating(
                    room_id, home_install_id, authority_gateway_id,
                    authority_epoch, member_id, task_id,
                    execution_generation, target_install_id, target_profile,
                    run_id, session_id, created_at, updated_at
                )
                SELECT room_id, rÆ   zÖ, member_id, task_id,
                       execution_generation, target_install_id, target_profile,
                       run_id, session_id, created_at, updated_at
                  FROM hosted_room_remote_runsz"DROP TABLE hosted_room_remote_runszOALTER TABLE hosted_room_remote_runs_migrating RENAME TO hosted_room_remote_runs))Úhome_install_idú'legacy')r,   rô   )r-   Ú1)r   ré   rå   Ú_REMOTE_RUNS_BODY)rÕ   Ú	fallbacksÚhomer   r“   r×   s   &    @r(   Ú_migrate_remote_run_schemarù   =  s¨   ø€ ä˜DÐ";Ó<€GÜ! $¨×0Ò0ÙØ‡L�LÐIÔJØ‡L�LÐCÔDUÐCVÐVWÐXÔYßØuˆ	ÜjÑ`iÓjÑˆ�uØ�‰ð!ð "&  b¨¨	°°E°7ð ;/ð	2ô
	3ð 	‡L�LÐ5Ô6Ø‡L�LÐbÖcrH   ÚlegacyrÇ   z''úTEXT NOT NULLÚhosted_room_eventsÚ
actor_jsona  UPDATE hosted_rooms
                  SET event_bytes=COALESCE((
                      SELECT SUM(
                          length(CAST(event_id AS BLOB)) +
                          length(CAST(kind AS BLOB)) +
                          length(CAST(actor_json AS BLOB)) +
                          length(CAST(payload_json AS BLOB))
                      )
                      FROM hosted_room_events
                      WHERE hosted_room_events.room_id=hosted_rooms.room_id
                  ), 0) WHERE {where}c               ó    € V ^8„  d   QhRRRR/# rë   r$   )rr   s   "r(   rs   rs   n  s   € ÷ 
>ñ 
>Ð"4ð 
>¸ñ 
>rH   c           	     ó,  € / p\          FR  w  r#rEW!9  d   \        W4      W&   W1V,          9  g   K(  T P                  RV RV RV 2Ve   RV 2MR,           4       KT  	  RVR,          9  d(   V P                  \        P	                  R	R
7      4       R# R# )zMAdd columns draft schemas lacked; backfill event_bytes when first introduced.zALTER TABLE z ADD COLUMN Ú Nz	 DEFAULT Ú Úevent_bytesÚhosted_roomsrõ   ©Úwhere)Ú_LEGACY_COLUMNSr   rå   Ú_EVENT_BYTES_BACKFILLrr   )rÕ   r×   Útabler>   Údeclarationrð   s   &     r(   Ú_migrate_legacy_columnsr
  n  sš   € à)+€Gß/>Ñ+ˆ�{ØÔÜ*¨4Ó7ˆG‰NØ �Ö'Ø�L‰L˜<¨ w¨l¸6¸(À!ÀKÀ=ÐQØ5<Ò5H˜i¨ yÑ1ÈbõRö Sñ	 0?ð ˜G NÕ3Ô3Ø�‰Ô*×1Ñ1¸Ð1Ó<Ö=ñ 4rH   c               ó    € V ^8„  d   QhRRRR/# rë   r$   )rr   s   "r(   rs   rs   {  s   € ÷ Oñ OÐ/ð O°Dñ OrH   c                ó  € \          F  pV P                  V4       K  	  \        V 4       V P                  \        P	                  R R7      4       \        V 4       V P                  R4       \        V 4      '       g   \        R4      hR# )zdisbanded_at IS NOT NULLr  z\CREATE INDEX IF NOT EXISTS idx_hosted_room_events_cursor ON hosted_room_events(room_id, seq)z-hosted room schema migration did not completeN)Ú_SCHEMA_DDLrå   r
  Ú_RETIRE_FROM_ROOMSrr   rù   Ú_schema_is_currentr@   )rÕ   Ú	statements   & r(   Ú_initialize_schemar  {  so   € ß ˆ	Ø�‰�YÖñ !ä˜DÔ!ð 	‡L�LÔ#×*Ñ*Ð1KÐ*ÓLÔMÜ˜tÔ$Ø‡L�LÐoÔpÜ˜d×#Ò#ÜÐMÓNÐNñ $rH   c               ó    € V ^8„  d   QhRRRR/# )rn   rÕ   rÖ   rq   r³   r$   )rr   s   "r(   rs   rs   ‰  s   € ÷ ñ Ð/ð °Dñ rH   c           	     ó\  a € \          UUu. uF  w  r\        S V4      NK  	  ppp\        ;QJ d/    V 3R  l\        \         VRR7       4       F  '       d   K   RM$	  RM ! V 3R  l\        \         VRR7       4       4      ;'       d"    S P	                  R4      P                  4       RJ# u uppi )c              3  ó’   <"  € T F<  w  w  rpVP                  V4      ;'       d    VR 8g  ;'       g    \        SV4      x € K>  	  R# 5i)rî   N)rä   ré   )r%   r  Úrequiredr×   rÕ   s   &   €r(   r)   Ú%_schema_is_current.<locals>.<genexpr>Œ  s[   øé € ð Wñ +VÑ&ÑˆU˜wð 	×Ñ˜'Ó"÷ 	^ð 	^ØÐ/Ñ/×\Ð\Ô3MÈdÐT[Ó3\ô	^ã*Uùs   ƒ!A¥A²ATrµ   FzWSELECT 1 FROM sqlite_master WHERE type='index' AND name='idx_hosted_room_events_cursor'N)Ú_REQUIRED_COLUMNSr   r«   r¼   rå   Úfetchone)rÕ   r  r'   Úactuals   f   r(   r  r  ‰  s¥   ø€ å9JÔKÑ9J©X¨UŒm˜D %Ö(Ñ9J€FÑKß‹3ô Wô +.Ô.?ÀÐPTÕ*UóW�3�3Š3ô Wô +.Ô.?ÀÐPTÕ*UóWó W÷ ð ð \`×[gÑ[gØaó\ç�hƒj˜ð\ðùó Ls   ‹B(c               ó   € V ^8„  d   QhRR/# )rn   rq   r   r$   )rr   s   "r(   rs   rs   ”  s   € ÷ `ñ `˜ñ `rH   c                 óž   € ^ RI Hp  V ! 4       pVP                  P                  R8X  d   VP                  P                  R,          # TR,          # )u—  Return the hosted-room coordination database for the active install.

Profile gateways (``~/.hermes/profiles/<name>/``) resolve to the shared
ROOT ``shared-state.db`` instead of the master ``state.db``: hosted-room
coordination is the only thing this module owns, and pointing profile
gateways at the master session store makes every profile process a
long-lived writer on state.db â€” the recurring multi-writer corruption
vector observed across a 6-gateway fleet (state.db WAL/FTS collisions
during bot-gateway restart storms, 2026-09-03). Keeping the hosted_room*
tables in a dedicated file means profile gateways never open the master
session store writable.
)Úget_hermes_homeÚprofileszshared-state.db)Úhermes_constantsr  Úparentrj   )r  rø   s     r(   Údefault_db_pathr   ”  sA   € õ 1ÙÓ€DØ"&§+¡+×"2Ñ"2°jÔ"@ˆD�K‰K×ÑÐN_Õ_Ð_ÀdÐN_Õ_Ð_rH   c               ó   € V ^8„  d   QhRR/# )rn   rq   rp   r$   )rr   s   "r(   rs   rs   ¦  s   € ÷ Fñ F Cñ FrH   c                 ó`   € ^ RI Hp  V ! 4       pV'       g   \        R4      h\        RV 2R4      # )zBReturn the stable server-owned identity for hosted-room authority.)Úget_install_idz.stable gateway install identity is unavailablezinstall:r,   )Úhermes_cli.install_identityr#  r@   rx   )r#  Ú
install_ids     r(   Úlocal_authority_gateway_idr&  ¦  s1   € å:ÙÓ!€JßÜÐNÓOÐOÜ�x 
˜|Ð,Ð.DÓEÐErH   c               ó$   € V ^8„  d   QhRRRRRR/# )rn   rÕ   rÖ   Údb_pathr   rq   r³   r$   )rr   s   "r(   rs   rs   ¯  s"   € ÷ ?ñ ?Ð)ð ?°Dð ?¸Tñ ?rH   c                óD   € ^ RI Hp \        V 4      ;'       d	    V! W4      # )zZThe store can serve rooms once its schema is current and the pre-isolation import has run.)Úsettled)Ú"gateway.hosted_rooms_legacy_importr*  r  )rÕ   r(  r*  s   && r(   Ú_store_readyr,  ¯  s   € å:ä˜dÓ#×>Ð>©°Ó(>Ð>rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rn   rÕ   rÖ   r(  r   rq   rì   r$   )rr   s   "r(   rs   rs   ¶  s"   € ÷ 'ñ 'Ð.ð '¸ð 'À$ñ 'rH   c                ó8   € ^ RI Hp \        V 4       V! W4       R# )zLCreate or migrate the schema, then copy the pre-isolation rows in (#109775).)Úimport_legacy_roomsN)r+  r/  r  )rÕ   r(  r/  s   && r(   Ú_initialize_storer0  ¶  s   € åFä�tÔÙ˜Ö&rH   c               ó    € V ^8„  d   QhRRRR/# ©rn   r(  r	   rq   rÖ   r$   )rr   s   "r(   rs   rs   ¾  s   € ÷ fñ f�fð fÐ!3ñ frH   c           
     ó|   € \        V 4      p\        VR\        \        VR7      \        \        VR7      \
        R7      # )z_Open the shared room store; ``initialize`` carries the path so the one-shot import can find it.zshared-state.db (hosted_rooms))r(  )Údb_labelÚreadyÚ
initializeÚlock_retries)r   r   r   r,  r0  Ú_JOURNAL_MODE_LOCK_RETRIES)r(  Úpaths   & r(   Ú_connectr:  ¾  s8   € ä�‹=€DÜØÐ7¼wÄ|Ð]aÔ?bÜÔ,°dÔ;ÔJdôfð frH   c               ó    € V ^8„  d   QhRRRR/# r2  r$   )rr   s   "r(   rs   rs   Æ  s   € ÷ 
ñ 
˜fð 
Ð);ñ 
rH   c                ó  € \        V 4      pVP                  4       '       g   \        V4      P                  4        \	        V4      p\        W!4      '       g5   VP                  4        \        V4      P                  4        \	        V4      pV# )zEOpen the room store without steady-state journal or migration writes.)r   Úis_filer:  Úcloser   r,  )r(  r9  rÕ   s   &  r(   Ú_read_connectionr?  Æ  sc   € ä�‹=€DØ�<‰<�>Š>Ü�‹×ÑÔÜ�tÓ€DÜ˜×#Ò#Ø�
‰
ŒÜ�‹×ÑÔÜ˜4Ó ˆØ€KrH   ©Ú	immediatec               ó$   € V ^8„  d   QhRRRRRR/# )rn   rÕ   rÖ   r+   rp   rq   r³   r$   )rr   s   "r(   rs   rs   ×  s'   € ÷ tñ tÐ(ð t°3ð t¸4ñ trH   c                óH   € V P                  R V34      P                  4       RJ# )z5SELECT 1 FROM hosted_room_retired_ids WHERE room_id=?N)rå   r  )rÕ   r+   s   &&r(   Ú_is_retiredrD  ×  s'   € Ø�<‰<ÐOÐRYÐQ[Ó\×eÑeÓgÐosÐsÐsrH   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   rÕ   rÖ   Úsqlrp   Úparamsútuple[Any, ...]r+   rq   úsqlite3.Rowr$   )rr   s   "r(   rs   rs   Û  s2   € ÷ 	5ñ 	5Ð&ð 	5¨Sð 	5¸/ð 	5ÐTWð 	5Ð\gñ 	5rH   c                óä   € V P                  W4      P                  4       pVe   V# V P                  RV34      P                  4       pVf   \        W4      '       d   \        R4      h\	        R4      h)zHFetch one hosted_rooms row or raise the precise not-found/expired error.z*SELECT 1 FROM hosted_rooms WHERE room_id=?z?Group Chat history expired; room_id remains permanently retiredúhosted room not found)rå   r  rD  rL   rJ   )rÕ   rF  rG  r+   rÛ   Úretaineds   &&&&  r(   Ú	_room_rowrM  Û  sg   € à
�,‰,�sÓ
#×
,Ñ
,Ó
.€CØ
‚Øˆ
à�|‰|ÐHÈ7È*ÓU×^Ñ^Ó`€HØÒœK¨×6Ò6Ü%Ð&gÓhÐhÜ
Ð3Ó
4Ð4rH   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   ÚroomrI  Ú
gateway_idrp   r“   r{   r}   rq   rì   r$   )rr   s   "r(   rs   rs   ç  s1   € ÷ .ñ .˜[ð .°cð .À#ð .ÐPSð .ÐX\ñ .rH   c                óx   € \        V R ,          4      V8w  g   \        V R,          4      V8w  d   \        V4      hR# )r,   r-   N)rp   r{   r\   )rO  rP  r“   r}   s   &&&&r(   Ú_require_authorityrR  ç  s9   € Ü
ˆ4Ð&Õ'Ó(¨JÔ6¼#¸dÐCTÕ>UÓ:VÐZ_Ô:_Ü$ WÓ-Ð-ñ ;`rH   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   rÕ   rÖ   rF  rp   rG  ræ   Úmissingrq   rI  r$   )rr   s   "r(   rs   rs   ì  s1   € ÷ ñ Ð$ð ¨3ð ¸ð Èð ÐP[ñ rH   c                ób   € V P                  W4      P                  4       pVf   \        V4      hV# )zLRe-read a row this transaction just wrote; a miss is an invariant violation.)rå   r  ÚRuntimeError)rÕ   rF  rG  rT  rÛ   s   &&&& r(   Ú_reloadrW  ì  s.   € à
�,‰,�sÓ
#×
,Ñ
,Ó
.€CØ
‚{Ü˜7Ó#Ð#Ø€JrH   Ú
idempotentc               ó$   € V ^8„  d   QhRRRRRR/# ©rn   rÛ   rI  rX  r³   rq   údict[str, Any]r$   )rr   s   "r(   rs   rs   ô  s&   € ÷ 	Tñ 	T˜ð 	T°Dð 	TÀ^ñ 	TrH   c               óÄ  € V P                  4       pR V R ,          RV R,          R\        P                  ! V R,          4      RV R,          R\        V R,          4      R\        V R,          4      R\	        V R,          4      R\	        V R,          4      R	V/	R
V9   d    V R
,          e   R
\	        V R
,          4      /M/ CRV9   d   R\        V R,          4      ^,
          /C# / C# )r+   rj   r§   Úmembers_jsonr,   r-   ÚrevisionÚ
created_atÚ
updated_atrX  Údisbanded_atÚnext_seqÚ
latest_seq)Úkeysr¸   r¹   r{   Úfloat)rÛ   rX  rd  s   &$ r(   Ú_room_from_rowrf  ô  só   € Ø�8‰8‹:€Dà�3�y•> 6¨3¨v­;¸	Ä4Ç:Â:ÈcÐR`ÕNaÓCbØ Ð$:Õ ;Ð=NÔPSÐTWÐXiÕTjÓPkØ”C˜˜J�Ó(¨,¼¸cÀ,Õ>OÓ8PØ”e˜C Õ-Ó.°¸jð	Tð
 <JÈTÔ;QÐVYÐZhÕViÒVuˆNœE # nÕ"5Ó6Ñ7ØðTð 8BÀTÔ7IˆLœ#˜c *�oÓ.°Õ2Ð3ðTð Tð PRðTð TrH   c               ó$   € V ^8„  d   QhRRRRRR/# rZ  r$   )rr   s   "r(   rs   rs      s&   € ÷ vñ v˜ð v°Tð vÀnñ vrH   c               ó0  € V R ,          pRV R,          R\        V R,          4      RV R,          RV R,          R\        P                  ! V R,          4      R Ve   \        V4      MRR\        P                  ! V R	,          4      R
\        V R
,          4      RV/	# )r-   r+   Úseqre   r    rf   rý   Nri   Úpayload_jsonr_  rX  )r{   r¸   r¹   re  )rÛ   rX  r“   s   &$ r(   Ú_event_from_rowrk     sŽ   € ØÐ!Õ"€Eà�3�y•> 5¬#¨c°%­j«/¸:ÀsÈ:ÅÐX^Ð`cÐdjÕ`kØ”—’˜C Õ-Ó.Ð0AÐQVÒQbÄ3ÀuÄ:ÐhlØ”4—:’:˜c .Õ1Ó2°LÄ%ÈÈLÕHYÓBZÐ\hÐjtðvð vrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rn   rÕ   rÖ   r+   rp   re   rq   úsqlite3.Row | Noner$   )rr   s   "r(   rs   rs     s0   € ÷ Gñ GÐ(ð G°3ð GÀ#ð GÐJ\ñ GrH   c                óL   € V P                  \        W34      P                  4       # r#   )rå   Ú_SELECT_EVENTr  )rÕ   r+   re   s   &&&r(   Ú_load_eventrp    s   € Ø�<‰<œ¨Ð':Ó;×DÑDÓFÐFrH   c               ó    € V ^8„  d   QhRRRR/# )rn   rÛ   rI  rq   ztuple[Any, Any, Any, Any]r$   )rr   s   "r(   rs   rs     s   € ÷ Wñ W˜ð WÐ(Añ WrH   c                óF   € V R,          V R,          V R,          V R,          3# )zXThe immutable (kind, actor_json, authority_epoch, payload_json) an event id is bound to.r    rý   r-   rj  r$   rß   s   &r(   Ú_event_contentrs    s%   € àˆv�;˜˜LÕ)¨3Ð/@Õ+AÀ3À~ÕCVÐVÐVrH   c               ó    € V ^8„  d   QhRRRR/# )rn   rÕ   rÖ   rq   r{   r$   )rr   s   "r(   rs   rs     s   € ÷ =ñ =Ð1ð =°cñ =rH   c                óh   € \        V P                  \        4      P                  4       ^ ,          4      # )é    )r{   rå   Ú_SUM_EVENT_BYTESr  )rÕ   s   &r(   Ú_gateway_event_bytesrx    s%   € Üˆt�|‰|Ô,Ó-×6Ñ6Ó8¸Õ;Ó<Ð<rH   Úallow_controlc               ó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/# )rn   rÕ   rÖ   rO  rI  r+   rp   ri  r{   re   r    rý   r“   rj  Únowre  ry  r³   rq   r$   )rr   s   "r(   rs   rs     sl   € ÷ ñ Ø
ðØ$/ðØ:=ðØDGðØSVðØ^aðØorðàðà!ðà(-ðàAEðàRUñrH   c
               óX   € \        WWEWhV
R7      pV P                  \        W#WEWgW‰34       V# )zMCapacity-check then INSERT one event at ``seq``; returns its accounted bytes.©ry  )Ú_prepare_eventrå   Ú_INSERT_EVENT)rÕ   rO  r+   ri  re   r    rý   r“   rj  r{  ry  r  s   &&&&&&&&&&$ r(   Ú_insert_eventr€    s3   € ô ! ¨X¸ZÐerÔs€KØ‡L�L” ¨x¸zÐR^Ð dÔeØÐrH   c               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )rn   rÕ   rÖ   rO  rI  re   rp   r    rý   rj  ry  r³   rq   r{   r$   )rr   s   "r(   rs   rs     sL   € ÷ ñ Ø
ðØ$/ðØ;>ðØFIðØWZðØjmðàðà$'ñrH   c          	     óê  € \        W#WE4      pV'       d   \        \        3MRw  r‰\        V	,           p
\	        VR,          4      ^,
          \
        V,           8¼  d   \        R4      h\	        VR,          4      V,           \        V	,           8”  d   \        R4      h\        V 4      pW·,           V
8”  d*   \        V R\        ^ W§,
          4      R7       \        V 4      pW·,           V
8”  d   \        R4      hV# )	zTSize one pending event and enforce per-room and gateway capacity; returns its bytes.rb  zNThis Group Chat reached its history limit. Start a new Group Chat to continue.r  zNThis Group Chat reached its storage limit. Start a new Group Chat to continue.N©r{  Úmax_gateway_event_byteszPGroup Chat storage is full on this host. Delete an old Group Chat and try again.)rv  rv  )r   ÚCONTROL_EVENT_COUNT_RESERVEÚCONTROL_EVENT_BYTE_RESERVEÚMAX_GATEWAY_EVENT_BYTESr{   ÚMAX_EVENTS_PER_ROOMr@   ÚMAX_ROOM_EVENT_BYTESrx  Ú_prune_disbanded_rooms_lockedÚmax)rÕ   rO  re   r    rý   rj  ry  Úadditional_bytesÚcount_reserveÚbyte_reserveÚgateway_byte_limitÚgateway_bytess   &&&&&&$     r(   r~  r~    sÜ   € ô   °
ÓIÐß_lÔ#>Ô@ZÑ"[ÐrxÑ€MÜ0°<Õ?ÐÜ
ˆ4�
ÕÓ˜qÕ Ô$7¸-Õ$GÔGÜÐnÓoÐoÜ
ˆ4�ÕÓÐ"2Õ2Ô5IÈLÕ5XÔXÜÐnÓoÐoÜ(¨Ó.€MØÕ'Ð*<Ô<Ü%Ø�d´C¸Ð;MÕ;`Ó4aõ	cä,¨TÓ2ˆØÕ'Ð*<Ô<ÜÐpÓqÐqØÐrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   rÕ   rÖ   rF  rp   rG  rH  rq   z	list[str]r$   )rr   s   "r(   rs   rs   <  s/   € ÷ Qñ QÐ&ð Q¨Sð Q¸/ð QÈiñ QrH   c                óŠ   € V P                  W4      P                  4        Uu. uF  p\        VR ,          4      NK  	  up# u upi )r+   )rå   Úfetchallrp   )rÕ   rF  rG  rÛ   s   &&& r(   Ú	_room_idsr”  <  s7   € Ø+/¯<©<¸Ó+D×+MÑ+MÔ+OÓPÑ+O CŒC��I•ÖÑ+OÑPÐPùÒPs   ¢A r„  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   rÕ   rÖ   r{  úfloat | Noner„  ú
int | Nonerq   r{   r$   )rr   s   "r(   rs   rs   @  s,   € ÷ ñ Ø
ðØ&2ðØMWðØcfñrH   c               ó  € \        4       pVe)   VP                  \        V RV\        ,
          34      4       VP                  \        V R\        34      4       Vez   \        V 4      pWB8”  di   V P                  R4      P                  4        FE  pVP                  \        VR,          4      4       V\        VR,          4      ,          pWB8:  g   KE   M	  V'       g   ^ # RP                  R V 4       4      p\        \        V4      4      pV P                  \        P                  RV R	2R
7      V4       \          F/  p\#        W4      '       g   K  V P                  RV RV R2V4       K1  	  V P                  RV R2V4       \%        V4      # )NzhSELECT room_id FROM hosted_rooms
                     WHERE disbanded_at IS NOT NULL AND disbanded_at<=?z‰SELECT room_id FROM hosted_rooms WHERE disbanded_at IS NOT NULL
                ORDER BY disbanded_at DESC, room_id ASC LIMIT -1 OFFSET ?z‡SELECT room_id, event_bytes FROM hosted_rooms WHERE disbanded_at IS NOT NULL
                    ORDER BY disbanded_at ASC, room_id ASCr+   r  Ú,c              3  ó&   "  € T F  pR x € K	  	  R# 5i)Ú?Nr$   )r%   r'   s   & r(   r)   Ú0_prune_disbanded_rooms_locked.<locals>.<genexpr>V  s   é € Ð4© A�C«ùs   ‚zroom_id IN (z) AND disbanded_at IS NOT NULLr  zDELETE FROM z WHERE room_id IN (r/   z+DELETE FROM hosted_rooms WHERE room_id IN ()rÈ   Úupdater”  Ú DISBANDED_ROOM_RETENTION_SECONDSÚMAX_DISBANDED_ROOM_TOMBSTONESrx  rå   r“  Úaddrp   r{   rÊ   ræ   rË   r  rr   Ú_DEPENDENT_TABLESr   r©   )	rÕ   r{  r„  Ú
candidatesÚretained_bytesrÛ   ÚplaceholdersÚroom_idsr  s	   &$$      r(   rŠ  rŠ  @  s~  € ä›5€JØ
‚Ø×Ñœ)Øð KØMPÔSsÕMsÐLuówô 	xð ×Ñ”iØð MÜOlÐNnópô qð Ò*Ü-¨dÓ3ˆØÔ3Ø—|‘|ð %>ó ç‰h‹jò�ð —‘œs 3 y¥>Ó2Ô3Ø¤# c¨-Õ&8Ó"9Õ9�Ø!Ö<Ùñ÷ ÙØ—8‘8Ñ4©Ó4Ó4€LÜ”V˜JÓ'Ó(€HØ‡L�LÔ#×*Ñ*°<À¸~ÐMkÐ1lÐ*ÓmÐowÔxß"ˆÜ˜×$Ô$Ø�L‰L˜<¨ wÐ.AÀ,ÀÈqÐQÐS[Ö\ñ #ð 	‡L�LÐ>¸|¸nÈAÐNÐPXÔYÜˆx‹=ÐrH   r{  c               ó$   € V ^8„  d   QhRRRRRR/# )rn   r(  r	   r{  r–  rq   r{   r$   )rr   s   "r(   rs   rs   `  s&   € ÷ Bñ B 6ð B°<ð BÈ3ñ BrH   c               ó–   € \        V RR7      ;_uu_ 4       p\        V\        V4      R7      uuRRR4       #   + '       g   i     R# ; i)zCPurge deleted Group Chat payloads while reserving their identities.Tr@  )r{  N)Ú_transactionrŠ  Ú_now)r(  r{  rÕ   s   &$ r(   Úprune_disbanded_roomsrª  `  s.   € ä	�g¨×	.Õ	.°$Ü,¨T´t¸C³yÔA÷ 
/×	.×	.Ó	.ús	   –7·A	c               ó    € V ^8„  d   QhRRRR/# )rn   r(  r	   rq   r²   r$   )rr   s   "r(   rs   rs   g  s   € ÷ 'ñ ' Fð 'Ð/Cñ 'rH   c                óÞ   € \        V 4      ;_uu_ 4       pVP                  R4      P                  4       pRRR4       X Uu. uF  p\        V4      NK  	  up#   + '       g   i     L+; iu upi )zEReturn private RoomLink records without logging or formatting grants.a  SELECT room_id, member_id, target_url, target_profile, grant,
                      catalog_json, cancellation_scope_id, trace_id,
                      transport_security, status, updated_at
                 FROM hosted_room_links
             ORDER BY room_id, member_idN)r¨  rå   r“  r¥   )r(  rÕ   ÚrowsrÛ   s   &   r(   Úlist_room_link_recordsr®  g  s[   € ä	�g×	Ô	 $Ø�|‰|ð ,ó -÷ .6©X«Zð	 	÷ 
ñ "&Ó&¡˜#ŒD�ŽI¡Ñ&Ð&÷ 
×	üò 's   ” AÁ A*ÁA'	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   r(  r	   ÚrecordúMapping[str, Any]Ú	max_linksr{   rq   rì   r$   )rr   s   "r(   rs   rs   r  s+   € ÷ ?ñ ? Vð ?Ð8Ið ?ÐVYð ?Ð^bñ ?rH   c          	     óæ  a€ \        V RR7      ;_uu_ 4       pVP                  RSR,          SR,          34      P                  4       pVf@   \        VP                  R4      P                  4       ^ ,          4      V8¼  d   \	        R4      hTP                  R	\
        ;QJ d    . V3R
 l\         4       F  NK  	  5M! V3R
 l\         4       4      4       RRR4       R#   + '       g   i     R# ; i)z9Atomically insert or replace one private RoomLink record.Tr@  z?SELECT 1 FROM hosted_room_links WHERE room_id=? AND member_id=?r+   Ú	member_idNz&SELECT COUNT(*) FROM hosted_room_linksztoo many stored room linksaA  INSERT INTO hosted_room_links(
                   room_id, member_id, target_url, target_profile, grant,
                   catalog_json, cancellation_scope_id, trace_id,
                   transport_security, status, updated_at
               ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
               ON CONFLICT(room_id, member_id) DO UPDATE SET
                   target_url=excluded.target_url,
                   target_profile=excluded.target_profile,
                   grant=excluded.grant,
                   catalog_json=excluded.catalog_json,
                   cancellation_scope_id=excluded.cancellation_scope_id,
                   trace_id=excluded.trace_id,
                   transport_security=excluded.transport_security,
                   status=excluded.status,
                   updated_at=excluded.updated_atc              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir#   r$   ©r%   r>   r°  s   & €r(   r)   Ú*upsert_room_link_record.<locals>.<genexpr>‰  s   øé € Ð=©} V�&˜—.’.«}ùó   ƒ)r¨  rå   r  r{   r@   ræ   Ú_LINK_COLUMNS)r(  r°  r²  rÕ   r¾   s   &d$  r(   Úupsert_room_link_recordrº  r  sº   ø€ ä	�g¨×	.Õ	.°$Ø—<‘<ØMÐPVÐW`ÕPaÐciÐjuÕcvÐOwó
ç
‰(‹*ð 	ð Ò¤ D§L¡LÐ1YÓ$Z×$cÑ$cÓ$eÐfgÕ$hÓ iÐmvÔ vÜ!Ð">Ó?Ð?Ø�‰ð 5÷ ŒEÔ=­}Ó=�E‰EÔ=­}Ó=Ó=ô	?÷ 
/×	.×	.Ò	.ús   —B
CÂ"3CÃC0	c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rn   r(  r	   r+   rp   r´  Ústatusr{  r–  rq   r³   r$   )rr   s   "r(   rs   rs   Œ  sD   € ÷ Cñ CØðCØ!$ðCØ14ðCØ>AðCØHTðCØ`dñCrH   c          	     óÀ   € \        V RR7      ;_uu_ 4       pVP                  RV\        V4      W34      P                  ^8H  uuRRR4       #   + '       g   i     R# ; i)z1Persist a non-secret route health classification.Tr@  zSUPDATE hosted_room_links SET status=?, updated_at=? WHERE room_id=? AND member_id=?N)r¨  rå   r©  Úrowcount)r(  r+   r´  r¼  r{  rÕ   s   &$$$$ r(   Úupdate_room_link_statusr¿  Œ  sL   € ô 
�g¨×	.Õ	.°$Ø�|‰|ØaØ”T˜#“Y Ð3ó5ç5=±XÀñC÷ 
/×	.×	.Ó	.ús   –+AÁA	c               ó$   € V ^8„  d   QhRRRRRR/# )rn   r(  r	   r+   rp   rq   r{   r$   )rr   s   "r(   rs   rs   •  s&   € ÷ bñ b fð b¸#ð bÀ#ñ brH   c               ó¤   € \        V RR7      ;_uu_ 4       pVP                  RV34      P                  uuRRR4       #   + '       g   i     R# ; i)zCDelete persisted peer routes after their target grants are revoked.Tr@  z-DELETE FROM hosted_room_links WHERE room_id=?N)r¨  rå   r¾  )r(  r+   rÕ   s   &$ r(   Údelete_room_link_recordsrÂ  •  s7   € ä	�g¨×	.Õ	.°$Ø�|‰|ÐKÈgÈZÓX×aÑa÷ 
/×	.×	.Ó	.ús	   –>¾A	c               ó$   € V ^8„  d   QhRRRRRR/# )rn   Úclaimsr±  rd  ztuple[str, ...]rq   zdict[str, str]r$   )rr   s   "r(   rs   rs   ›  s"   € ÷ =ñ =Ð+ð =°?ð =À~ñ =rH   c           	     ót   € V Uu/ uF'  q"\        V P                  V4      ;'       g    R 4      bK)  	  up# u upi )r  )rp   rÌ   )rÄ  rd  râ   s   && r(   Ú_claim_valuesrÆ  ›  s2   € Ù7;Ó<±t°”�V—Z‘Z “_×*Ð*¨Ó+Ò+±tÑ<Ð<ùÒ<s   …!5§5c               ó    € V ^8„  d   QhRRRR/# )rn   rÄ  r±  rq   rp   r$   )rr   s   "r(   rs   rs   Ÿ  s   € ÷ Lñ LÐ"3ð L¸ñ LrH   c                óæ   € \        V R4      p\        VP                  4       4      '       g   \        R4      h\        P
                  ! \        V4      P                  R4      4      P                  4       # )zFReturn a stable non-secret key for one room/home/target/profile scope.zroom grant scope is incompleterš   )r+   ró   r,   r-   r´  Útarget_install_idr.   )	rÆ  r«   Úvaluesr@   r›   rœ   r   rž   rŸ   )rÄ  Úfieldss   & r(   Ú_room_grant_scope_keyrÌ  Ÿ  sZ   € ä˜6ð $ó €Fô ˆv�}‰}‹×ÒÜÐ>Ó?Ð?Ü�>Š>œ, vÓ.×5Ñ5°gÓ>Ó?×IÑIÓKÐKrH   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# ©rn   r(  r	   rÄ  r±  Ú
expires_atre  r{  r–  rq   rì   r$   )rr   s   "r(   rs   rs   ©  s4   € ÷ :ñ :Øð:Ø 1ð:Ø?Dð:ØKWð:Øcgñ:rH   c               ó®  € \        V4      p\        V4      p\        V4      pWe8:  d   R# \        V RR7      ;_uu_ 4       pVP	                  RV34       VP	                  RWFV34       TP	                  RWU.\        VR4      P                  4       O\        VP                  R4      ;'       g    ^ 4      N54       RRR4       R#   + '       g   i     R# ; i)	zDRevoke every grant issued at or before now for one exact room scope.NTr@  z:DELETE FROM hosted_room_revoked_grants WHERE expires_at<=?aÇ  INSERT INTO hosted_room_revoked_grants(
                   scope_key, expires_at, revoked_before
               ) VALUES (?, ?, ?)
               ON CONFLICT(scope_key) DO UPDATE SET
                   expires_at=MAX(hosted_room_revoked_grants.expires_at,
                                  excluded.expires_at),
                   revoked_before=MAX(hosted_room_revoked_grants.revoked_before,
                                      excluded.revoked_before)zÉUPDATE hosted_room_peer_reservations SET revoked_at=?, updated_at=? WHERE room_id=?
                AND member_id=? AND target_profile=? AND authority_gateway_id=?
                AND authority_epoch=?r-   )r+   r´  r.   r,   )	rÌ  r©  re  r¨  rå   rÆ  rÊ  r{   rÌ   )r(  rÄ  rÏ  r{  Ú	scope_keyÚ	timestampÚexpiryrÕ   s   &$$$    r(   Úrevoke_room_grant_scoperÔ  ©  sÒ   € ô & fÓ-€IÜ�S“	€IÜ�:Ó€FØÔÙÜ	�g¨×	.Õ	.°$Ø�‰ÐQÐT]ÐS_Ô`Ø�‰ð Bð ENÐW`ÐCaô	cð 	�‰ð )ð ð9ä˜vÐ'iÓj×qÑqÓsð9ô �F—J‘JÐ0Ó1×6Ð6°QÓ7ñ9ô	:÷ 
/×	.×	.Ò	.ús   ¿A:CÃC	c               ó    € V ^8„  d   QhRRRR/# )rn   rÄ  r±  rq   ztuple[str, str, str, str, int]r$   )rr   s   "r(   rs   rs   Ä  s   € ÷ ñ Ð 1ð Ð6Tñ rH   c                óÒ   a € \        S P                  R4      4      .V 3R lR 4       O\        S P                  R4      ;'       g    ^ 4      N5pV^,          ^8  d   \        R4      hV# )zUValidate (room_id, member_id, target_profile, authority_gateway_id, authority_epoch).r+   c              3  óZ   <"  € T F   p\        SP                  V4      V4      x € K"  	  R # 5ir#   )rx   rÌ   )r%   râ   rÄ  s   & €r(   r)   Ú&_reservation_claims.<locals>.<genexpr>È  s%   øé € Ð	mÑ5l¨cŒ)�F—J‘J˜s“O S×
)Ð
)Ó5lùs   ƒ(+r-   z authority_epoch must be positive)r´  r.   r,   )Ú_room_idrÌ   r{   r@   )rÄ  rÊ  s   f r(   Ú_reservation_claimsrÚ  Ä  sj   ø€ ô 	�—‘˜IÓ&Ó'ð1ä	mÑ5lÓ	mð1ô 	ˆF�J‰JÐ(Ó)×.Ð.¨QÓ/ñ1€Fð ˆa…y�1„}ÜÐ@ÓAÐAØ€MrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   rÛ   rI  rP  rp   r“   r{   rq   r³   r$   )rr   s   "r(   rs   rs   Ï  s.   € ÷ hñ h ð h¸#ð hÀcð hÈdñ hrH   c                ó€   € \        V R,          4      pW28„  ;'       g"    W28H  ;'       d    \        V R,          4      V8g  # )zLA newer epoch, or the same epoch under another gateway, outranks this claim.r-   r,   )r{   rp   )rÛ   rP  r“   Ú	row_epochs   &&& r(   Ú_reservation_supersededrÞ  Ï  s?   € ä�CÐ)Õ*Ó+€IØÑ×gÐg Ñ!3×!fÐ!f¼¸CÐ@VÕ<WÓ8XÐ\fÑ8fÐgrH   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# rÎ  r$   )rr   s   "r(   rs   rs   Õ  s;   € ÷ "_ñ "_Øð"_Ø 1ð"_Ø?Dð"_ØKWð"_Øcgñ"_rH   c          
     óä  aa€ \        V4      p\        V4      pWT8:  d   \        R4      h\        V4      pVw  rxp	oo\	        V RR7      ;_uu_ 4       p
V
P                  RV34       V
P                  R\         2WyV34      P                  4       p\        ;QJ d     VV3R lV 4       F  '       g   K   RM	  RM! VV3R lV 4       4      '       d   \        R4      hV
P                  R	WDWyS34       V
P                  R
VR,          4      P                  4       pVe   \        VSS4      '       d   \        R4      hV
P                  R. VOVNVNVN54       RRR4       R#   + '       g   i     R# ; i)zCFence direct Desktop prompts before the first peer run is admitted.z/peer room reservation must expire in the futureTr@  z=DELETE FROM hosted_room_peer_reservations WHERE expires_at<=?z`SELECT authority_gateway_id, authority_epoch
                FROM hosted_room_peer_reservations c              3  ó>   <"  € T F  p\        VSS4      x € K  	  R # 5ir#   )rÞ  )r%   rÛ   r“   rP  s   & €€r(   r)   Ú$reserve_peer_room.<locals>.<genexpr>ä  s   øé € ÐYÉ.À3Ô& s¨J¸×>Ð>Ë.ùrò   Fz'peer room reservation authority changedz¥UPDATE hosted_room_peer_reservations SET revoked_at=?, updated_at=? WHERE room_id=?
                AND target_profile=? AND authority_epoch<? AND revoked_at IS NULLz”SELECT authority_gateway_id, authority_epoch FROM hosted_room_peer_reservations
                WHERE room_id=? AND member_id=? AND target_profile=?:Né   NNa¬  INSERT INTO hosted_room_peer_reservations(
                   room_id, member_id, target_profile, authority_gateway_id,
                   authority_epoch, expires_at, revoked_at, created_at, updated_at
               ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?)
               ON CONFLICT(room_id, member_id, target_profile) DO UPDATE SET
                   authority_gateway_id=excluded.authority_gateway_id,
                   authority_epoch=excluded.authority_epoch,
                   expires_at=MAX(hosted_room_peer_reservations.expires_at,
                                  excluded.expires_at),
                   revoked_at=NULL,
                   updated_at=excluded.updated_at)r©  re  r@   rÚ  r¨  rå   Ú_LIVE_RESERVATION_WHEREr“  Úanyr\   r  rÞ  )r(  rÄ  rÏ  r{  rÒ  rÓ  rÊ  r+   r'   r.   rÕ   Úauthority_rowsr¾   r“   rP  s   &$$$         @@r(   Úreserve_peer_roomrç  Õ  sm  ù€ ô �S“	€IÜ�:Ó€FØÔÜÐOÓPÐPÜ  Ó(€FØ4:Ñ1€G� 
¨EÜ	�g¨×	.Õ	.°$Ø�‰ÐTÐW`ÐVbÔcØŸ™ð4Ü4KÐ3LðPØRYÐktÐQuó
÷ ‰(‹*ð 	÷ ‹3ÕYÉ.ÓY�3�3Š3ÕYÉ.ÓY×YÒYÜ(Ð)RÓSÐSØ�‰ð Uà 7¸EÐBô	Dð —<‘<ð !HØIOÐPRÍóUßU]ÑU]ÓU_ð 	àÒÔ$;¸HÀjÐRW×$XÒ$XÜ(Ð)RÓSÐSØ�‰ð 
5ð 7^¸Ð6]ÀÐ6]È	Ð6]ÐS\Ñ6]ô
	_÷ 
/×	.×	.Ò	.ús   ÁAEÂ1EÃBEÅE/	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   r(  r	   rF  rp   rG  rH  rq   rm  r$   )rr   s   "r(   rs   rs   ú  s)   € ÷ 4ñ 4�vð 4 Cð 4°ð 4ÐEWñ 4rH   c                ó¤   € \        V 4      ;_uu_ 4       pVP                  W4      P                  4       uuR R R 4       #   + '       g   i     R # ; ir#   )r¨  rå   r  )r(  rF  rG  rÕ   s   &&& r(   Ú	_read_onerê  ú  s3   € Ü	�g×	Ô	 $Ø�|‰|˜CÓ(×1Ñ1Ó3÷ 
×	×	Ó	ús	   ”>¾A	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   r(  r	   r+   rp   r.   r{  r–  rq   r³   r$   )rr   s   "r(   rs   rs   ÿ  s8   € ÷ Lñ L 6ð L°sð LÈCð LÐVbð LÐnrñ LrH   c               ój   € \        V4      \        VR4      \        V4      3p\        V \        V4      RJ# )zFReturn whether a live target-side RoomLink reservation fences Desktop.r.   N)rÙ  rx   r©  rê  Ú_SELECT_LIVE_RESERVATION©r(  r+   r.   r{  rG  s   &$$$ r(   Úpeer_room_is_reservedrï  ÿ  s5   € ä�wÓ¤¨>Ð;KÓ!LÌdÐSVËiÐX€FÜ�WÔ6¸Ó?ÀtÐKÐKrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	rn   r(  r	   rÄ  r±  r{  r–  rq   r³   r$   )rr   s   "r(   rs   rs     s1   € ÷ wñ w¨ð wÐ;Lð wÐS_ð wÐkoñ wrH   c               óR   € \        V4      p\        V R. \        V4      OVN54      RJ# )z?Require a grant to match the target's current live reservation.zÙSELECT 1 FROM hosted_room_peer_reservations WHERE room_id=? AND member_id=?
            AND target_profile=? AND authority_gateway_id=? AND authority_epoch=?
            AND expires_at>? AND revoked_at IS NULL LIMIT 1N)r©  rê  rÚ  )r(  rÄ  r{  rÒ  s   &$$ r(   Úpeer_room_grant_is_currentró    sD   € ä�S“	€IÜØð ?à@iÔBUÐV\ÓB]Ð@iÐ_hÑ@iókð swðwð wrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# rñ  r$   )rr   s   "r(   rs   rs     s0   € ÷ Iñ I 6ð IÐ6Gð IÈlð IÐfjñ IrH   c               óÔ   € \        V4      p\        V4      p\        VP                  R4      ;'       g    ^ 4      p\	        V RWC34      pVRJ;'       d    V\        VR,          4      8*  # )zCReturn whether a grant predates its exact scope's revocation fence.Ú	issued_atzdSELECT revoked_before FROM hosted_room_revoked_grants
            WHERE scope_key=? AND expires_at>?NÚrevoked_before)r©  rÌ  re  rÌ   rê  )r(  rÄ  r{  rÒ  rÑ  rö  rÛ   s   &$$    r(   Úroom_grant_is_revokedrø    sm   € ä�S“	€IÜ% fÓ-€IÜ�f—j‘j Ó-×2Ð2°Ó3€IÜ
Øð 2Ø4=Ð3IóK€Cð �dˆ?×HÐH˜y¬E°#Ð6FÕ2GÓ,HÑHÐHrH   c               ó    € V ^8„  d   QhRRRR/# )rn   r°  r±  rq   rH  r$   )rr   s   "r(   rs   rs     s   € ÷ Lñ LÐ!2ð L°ñ LrH   c                óx   a € \         ;QJ d    . V 3R  l\         4       F  NK  	  5# ! V 3R  l\         4       4      # )c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir#   r$   r¶  s   & €r(   r)   Ú'_remote_run_identity.<locals>.<genexpr>  s   øé € ÐKÑ.J F�˜—’Ó.Jùr¸  )ræ   rç   )r°  s   fr(   Ú_remote_run_identityrý    s'   ø€ ßŒ5ÔKÕ.JÓK�5ÐKˆ5ÔKÕ.JÓKÓKÐKrH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   r(  r	   r°  r±  r{  r–  rq   rì   r$   )rr   s   "r(   rs   rs     s+   € ÷ ;ñ ; vð ;Ð:Kð ;ÐR^ð ;Ðjnñ ;rH   c               ó   € \        V4      p\        V4      p. VOVR,          NVR,          N5p\        V RR7      ;_uu_ 4       pVP                  \        V4      P                  4       pVeY   . \        V4      OVR,          NVR,          N5V8w  d   \        R4      hVP                  R\         2V.VO54        RRR4       R# TP                  R. VOVNVN54       ^ R	IH	p V! WaR
,          4       RRR4       R#   + '       g   i     R# ; i)zDDurably bind one logical peer task attempt to its remote run handle.Úrun_idÚ
session_idTr@  Nz2remote run receipt conflicts with its logical taskz6UPDATE hosted_room_remote_runs SET updated_at=? WHERE ai  INSERT INTO hosted_room_remote_runs(
                   room_id, home_install_id, authority_gateway_id,
                   authority_epoch, member_id, target_install_id,
                   target_profile, task_id, execution_generation, run_id,
                   session_id, created_at, updated_at
               ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))Úcapture_transition_lockedr+   )
r©  rý  r¨  rå   Ú_SELECT_REMOTE_RUNr  r@   Ú_REMOTE_RUN_WHEREÚ gateway.hosted_room_work_recordsr  )	r(  r°  r{  rÒ  ÚidentityÚ	immutablerÕ   r¾   r  s	   &$$      r(   Úupsert_remote_run_receiptr    s  € ä�S“	€IÜ# FÓ+€HØC�(ÐC˜F 8Õ,ÐC¨f°\Õ.BÑC€IÜ	�g¨×	.Õ	.°$Ø—<‘<Ô 2°HÓ=×FÑFÓHˆØÒØ\Ô% hÓ/Ð\°¸(Õ1CÐ\ÀXÈlÕE[Ñ\Ð`iÔiÜ%Ð&ZÓ[Ð[Ø�L‰LØHÔIZÐH[Ð\Ð_hÐ^tÐksÑ^tôvà÷ 
/Ñ	.ð 	�‰ð Cð
 EgÀiÐDfÐQZÐDfÐ\eÑDfô	hõ 	OÙ! $¨yÕ(9Ô:÷ 
/×	.×	.Ò	.ús   ÁA7C<Ã.C<Ã<D	r  c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rn   r(  r	   r+   z
str | Noner.   r  rq   r²   r$   )rr   s   "r(   rs   rs   4  s4   € ÷ 'ñ 'Øð'Ø!+ð'ØDNð'Øcmð'àñ'rH   c               óÔ  € RV3RV3RV33pV UUu. uF  w  rVVf   K  WV3NK  	  pppV'       d   RRP                  R V 4       4       2MRp\        V 4      ;_uu_ 4       p	T	P                  R	V,           R
,           V U
Uu. uF  w  r¦VNK	  	  upp
4      P                  4       pRRR4       X Uu. uF  p\	        V4      NK  	  up# u uppi u upp
i   + '       g   i     L7; iu upi )z0Return remote run handles in durable task order.r+   r.   r  Nz WHERE r;   c              3  ó0   "  € T F  w  rV R 2x € K  	  R# 5ir=   r$   )r%   r>   r'   s   &  r(   r)   Ú+list_remote_run_receipts.<locals>.<genexpr>:  s   é € Ð"JÁ'±Y°V f X¨R¥=Ã'ùs   ‚r  z%SELECT * FROM hosted_room_remote_runsz3 ORDER BY created_at, task_id, execution_generation)rÊ   r¨  rå   r“  r¥   )r(  r+   r.   r  r¢  r>   ro   Úfiltersr  rÕ   r'   r­  rÛ   s   &$$$         r(   Úlist_remote_run_receiptsr  4  sé   € ð ˜gÐ&Ð)9¸>Ð(JÈ\Ð[eÐLfÐg€JÙ4>ÔT±J¡= 6À%Œ�‹±J€GÑTßPWˆg�g—l‘lÑ"JÁ'Ó"JÓJÐKÑLÐ]_€EÜ	�g×	Ô	 $Ø�|‰|Ø3°eÕ;ØCõDÙ\cÔEdÑ\cÑPXÐPQÃeÑ\cÒEdófçfnÑfnÓfpð 	÷ 
ñ "&Ó&¡˜#ŒD�ŽI¡Ñ&Ð&ùó Uùó
 Fe÷ 
×	üò 's.   ‘CžCÁ  CÂ CÂCÂ/C%ÃCÃC"	c               ó$   € V ^8„  d   QhRRRRRR/# )rn   r(  r	   r°  r±  rq   údict[str, Any] | Noner$   )rr   s   "r(   rs   rs   B  s#   € ÷ 2ñ 2 ð 2Ð3Dð 2ÐI^ñ 2rH   c               óX   € \        V \        \        V4      4      pVe   \        V4      # R# )z@Return the exact durable remote run handle for one task attempt.N)rê  r  rý  r¥   )r(  r°  rÛ   s   &$ r(   Úremote_run_receiptr  B  s*   € ä
�GÔ/Ô1EÀfÓ1MÓ
N€CØšŒ4�‹9Ð1¨TÐ1rH   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )rn   rÕ   rÖ   r¾   rI  r+   rp   r]  r,   r{  re  rq   r[  r$   )rr   s   "r(   rs   rs   I  sM   € ÷ wñ wØ
ðwØ(3ðwØADðwØTWðwØorðwà	ðwà!ñwrH   c               óˆ  € \        VR,          4      ^,           p\        VR,          4      p\        WW'RR\        R4      V\        RWF4      VRR7      p\	        V R	W4WhWR\        VR,          4      V3\        R
4      4       \        V \        V3R4      p\        V \        VR3R4      p	/ \        VRR7      CRRR\        V	4      /C# )zMClaim a 'legacy'-authority room for a real gateway with a fenced claim event.r-   rb  zsystem:authority-adoptedúauthority.claimedúauthority-controlrú   Tr}  aH  UPDATE hosted_rooms
            SET members_json=?, authority_gateway_id=?, authority_epoch=?,
                next_seq=next_seq+1, revision=revision+1, event_bytes=event_bytes+?, updated_at=?
            WHERE room_id=? AND authority_gateway_id='legacy' AND authority_epoch=? AND next_seq=?
            AND disbanded_at IS NULLz#legacy room adoption lost its fencez"adopted room could not be reloadedz+legacy adoption event could not be reloaded©rX  ÚadoptedÚclaim_event)r{   r€  r�   r–   Ú_fenced_updater\   rW  Ú_SELECT_ROOMro  rf  rk  )
rÕ   r¾   r+   r]  r,   r{  Útarget_epochri  Úclaim_bytesr  s
   &&$$$$    r(   Ú_adopt_legacy_roomr  I  sæ   € ô �xÐ 1Õ2Ó3°aÕ7€LÜ
ˆh�zÕ"Ó
#€CÜØ˜Ð&@ÐBUÜÐ.Ó/°Ü˜HÐ&:ÓIÈ3Ð^bôd€Kô �4ð (ð °È3Ü�Ð*Õ+Ó,¨cð	3ä4JÐKpÓ4qôsô �tœ\¨G¨:Ð7[Ó\€HÜØŒm˜gÐ'AÐBÐDqós€KàvŒn˜X°$Ô7Ðv¸ÀDÈ-ÔYhÐitÓYuÑvÐvrH   Úadmitc               ó8   € V ^8„  d   QhRRRRRRRRRRRR	R
RRR/# )rn   r(  r	   r+   r   rj   r§   r,   r{  r–  r  z*Callable[[sqlite3.Connection], Any] | Nonerq   r[  r$   )rr   s   "r(   rs   rs   a  sX   € ÷ -Bñ -BØð-BØ!$ð-BØ,/ð-BØ:=ð-BØUXð-BØ_kð-Bà5ð-Bð ñ-BrH   c               ó   € \        V4      p\        V4      p\        V4      w  rx\        VR4      p\	        V4      p\        V RR7      ;_uu_ 4       p	Ve	   V! V	4       \        W‘4      '       d   \        R4      hV	P                  \        V34      P                  4       p
V
eÒ   V
R,          e   \        R4      hV
R,          R8H  ;'       d    VR8g  pV
R,          V8H  ;'       g    T;'       d    \        V
R,          V4      pV
R	,          V8w  g	   V'       g   \        R
4      hV'       d   \        WšWWER7      uuRRR4       # V
R,          V8w  d   \        R4      h\        V
RR7      uuRRR4       # V	P                  R4      P                  4       ^ ,          p\        V4      \        8¼  d   \!        R4      hV	P                  R\"         R2WW„WU34       \%        V	RV3R4      pRRR4       / \        X4      CRV/C#   + '       g   i     L!; i)zðCreate a room, or return the identical existing room idempotently.

``admit(conn)`` runs first inside the write transaction (after payload validation), so a
caller's side effect such as an owner claim commits only together with this create.r,   Tr@  Nz#room_id belongs to a disbanded roomra  rú   r]  rj   z+room_id already exists with different state)r+   r]  r,   r{  z0room_id already belongs to a different authorityr  z<SELECT COUNT(*) FROM hosted_rooms WHERE disbanded_at IS NULLzDThis host has too many active Group Chats. Delete one and try again.zINSERT INTO hosted_rooms (z=)
                VALUES (?, ?, ?, ?, 1, 1, 0, 1, ?, ?, NULL)z�SELECT room_id, name, members_json, authority_gateway_id, authority_epoch, revision,
                created_at, updated_at FROM hosted_rooms WHERE room_id=?z"created room could not be reloadedr§   )rÙ  Ú_validate_room_namer®   rx   r©  r¨  rD  rQ   rå   Ú_SELECT_ROOM_WITH_BYTESr  rÃ   r  rf  r{   ÚMAX_ACTIVE_ROOMSr@   Ú_ROOM_COLUMNS_WITH_BYTESrW  )r(  r+   rj   r§   r,   r{  r  Únormalized_membersr]  rÕ   r¾   Úlegacy_adoptionÚmembers_matchÚactiverÛ   s   &$$$$$$        r(   Úcreate_roomr*  a  s  € ô �wÓ€GÜ˜tÓ$€DÜ'8¸Ó'AÑ$ÐÜ$Ð%9Ð;QÓRÐÜ
ˆs‹)€CÜ	�g¨×	.Õ	.°$ØÒÙ�$ŒKÜ�t×%Ò%Ü#Ð$IÓJÐJØ—<‘<Ô 7¸'¸ÓD×MÑMÓOˆØÒØ˜Õ'Ò3Ü'Ð(MÓNÐNØ'Ð(>Õ?À8ÑK×pÐpÐPdÐhpÑPpˆOØ$ ^Õ4¸ÑD÷ ið iØ×gÐgÔ$9¸(À>Õ:RÐTfÓ$gð à˜Õ 4Ô'¯}Ü'Ð(UÓVÐVßÜ)Ø¨GØ)=ôH÷ 
/Ò	.ð$ Ð.Õ/Ð3GÔGÜ'Ð(ZÓ[Ð[Ü! (°tÔ<÷) 
/Ò	.ð* —‘Ð\Ó]×fÑfÓhÐijÕkˆÜˆv‹;Ô*Ô*Ü!Ð"hÓiÐiØ�‰Ø*Ô+CÐ*Dð E<ð ?à˜LÀÐIô	Kô Øð LØNUÈZØ0ó2ˆ÷9 
/ð@ BŒn˜SÓ!ÐA 9Ð.@ÑAÐA÷A 
/×	.ús8   ÁA:G=ÃG=Ã$	G=Ã.)G=ÄG=Ä+G=Å%G=Å3A1G=Ç=H	Úinclude_disbandedÚlimitÚoffsetc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   r(  r	   r+  r³   r,  r{   r-  rq   r²   r$   )rr   s   "r(   rs   rs   ‘  s4   € ÷ 1ñ 1Øð1Ø+/ð1Ø@Cð1Øcfð1àñ1rH   c               óP  € \        V\        4      p\        VR4      p\        \	        V 4      4      ;_uu_ 4       pVP                  R\         R2\        V4      W#34      P                  4       pRRR4       X Uu. uF  p\        V4      NK  	  up#   + '       g   i     L+; iu upi )z@Return one bounded read-only page ordered by most recent change.r-  r:   zy FROM hosted_rooms WHERE disbanded_at IS NULL OR ?
                ORDER BY updated_at DESC, room_id ASC LIMIT ? OFFSET ?N)
r†   ÚMAX_ROOM_LIST_LIMITrŠ   r   r?  rå   Ú_ROOM_COLUMNSr{   r“  rf  )r(  r+  r,  r-  rÕ   r­  rÛ   s   &$$$   r(   Ú
list_roomsr2  ‘  sš   € ô ˜5Ô"5Ó6€EÜ˜6 8Ó,€FÜ	Ô! 'Ó*×	+Ô	+¨tØ�|‰|Øœ�ð 'Gð JÜLOÐPaÓLbÐdiÐKró
÷ ‰(‹*ð 	÷ 
,ñ
 ,0Ó0©4 CŒN˜3Ö©4Ñ0Ð0÷ 
,×	+üò
 1s   ¹4BÁ9B#ÂB 	c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rn   r(  r	   r+   r   re   rj   r{  r–  rq   r[  r$   )rr   s   "r(   rs   rs   Ÿ  s@   € ÷ kñ k˜ð k¨Sð k¸Cð kÀsð kÐQ]ð kÐiwñ krH   c               ód  € \        V4      p\        V4      p\        V4      p\        V4      p\	        R4      p\        RV/4      p\        V RR7      ;_uu_ 4       p\        V\        V3V4      pVR,          e   \        R4      h\        WqV4      p	V	eP   V	R,          R	8w  g   V	R
,          V8w  d   \        R4      h/ \        VRR7      CR\        V	RR7      /CuuRRR4       # \        VR,          4      p
\        WxVR	WV4      pVP!                  RW:^,           W´V34       VP!                  \"        WVR	V\        VR,          4      Wd34       VP!                  \$        V34      P'                  4       p/ \        V4      CR\        \        WqV4      4      /CuuRRR4       #   + '       g   i     R# ; i)z:Rename a live room and append its replay event atomically.úroom-controlrj   Tr@  ra  NrK  r    úroom.renamedrj  z8event_id already exists with different immutable contentr  Úeventrb  z˜UPDATE hosted_rooms
                SET name=?, next_seq=?, event_bytes=event_bytes+?, revision=revision+1, updated_at=?
                WHERE room_id=?r-   )rÙ  r�   r"  r©  r�   r•   r¨  rM  r#  rJ   rp  rU   rf  rk  r{   r~  rå   r  r  r  )r(  r+   re   rj   r{  rý   rj  rÕ   rO  r¾   ri  r  Úupdateds   &$$$$        r(   Úrename_roomr9  Ÿ  s–  € ä�wÓ€GÜ˜Ó"€HÜ˜tÓ$€DÜ
ˆs‹)€CÜ# NÓ3€JÜ  &¨$ Ó0€LÜ	�g¨×	.Õ	.°$Ü˜Ô6¸¸
ÀGÓLˆØ�ÕÒ+Ü#Ð$;Ó<Ð<Ü˜t¨hÓ7ˆØÒØ˜Õ >Ô1°X¸nÕ5MÐQ]Ô5]Ü(Ð)cÓdÐdØq”n T°dÔ;Ðq¸WÄoÐV^ÐkoÔFpÑq÷ 
/Ò	.ô �$�zÕ"Ó#ˆÜ$ T°¸>È:Ódˆà�‰ð #à%)°­7°KÀgÐ$Nô	Pð 	�‰”]Ø˜( N°JÄÀDÐIZÕD[Ó@\Ð^jð%qô 	rà—,‘,œ|¨g¨ZÓ8×AÑAÓCˆØj”. Ó)Ðj¨7´OÄKÐPTÐ_gÓDhÓ4iÑj÷% 
/×	.×	.Ó	.ús   ÁA>FÃ#B0FÆF/	Úexpected_latest_seqc               óD   € 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/# )rn   r(  r	   r+   r   re   r    rf   ri   r,   r-   r{  r–  r:  r—  rq   r[  r$   )rr   s   "r(   rs   rs   ¼  sh   € ÷ /?ñ /?Øð/?Ø!$ð/?Ø03ð/?Ø;>ð/?ØGJð/?ØUXð/?àð/?à7:ð/?àHTð/?ð $ð/?ð 0>ñ/?rH   c       	        ó0  € \        V4      p\        V4      pV	e   \        V	RR7       \        V4      p\	        WCR7      w  r«\        VR4      pV
R,          R8X  d   V
R,          V8w  d   \        R	4      h\        VR
4      p\        V\        4      '       g   \        R4      h\        V4      p\        V4      p\        V RR7      ;_uu_ 4       p\        WÑV4      pVe5   \        V4      W;W|38w  d   \        R4      h\!        VRR7      uuRRR4       # \#        VRV3V4      p\%        WöVR4       \'        VR,          4      pV	e   V^,
          V	8w  d   \)        R4      hVR9   d7   ^ RIHp V! WÑV\.        P0                  ! V4      P3                  R. 4      VR7       \5        WßVVW#W·WÈV\6        9   R7      p\9        VRV^,           VW�V3\;        R4      4       \=        VR\>         R2VV3R4      pRRR4       / \!        X4      CRV
/C#   + '       g   i     L!; i)z°Append one immutable event and allocate its per-room sequence atomically; repeating an ``event_id``
with identical content returns the original, different content fails closed.Nz1expected_latest_seq must be a nonnegative integerr‰   )r    r,   r    r   r!   z0gateway actor.id must match authority_gateway_idr-   zpayload must be an objectTr@  ú.event_id already exists with different contentr  zŽSELECT next_seq, event_bytes, authority_gateway_id, authority_epoch
                FROM hosted_rooms WHERE room_id=? AND disbanded_at IS NULLústale hosted room authorityrb  z%room changed before event publication)Úretain_message_attachmentsÚattachments)r+   re   Úmanifestr{  r}  zzUPDATE hosted_rooms SET next_seq=?, event_bytes=event_bytes+?, updated_at=?
                WHERE room_id=? AND next_seq=?z1hosted room sequence advance lost its write fencer:   z2 FROM hosted_room_events WHERE room_id=? AND seq=?z$appended event could not be reloadedrf   >   r   r   ) rÙ  r�   r€   Ú_validate_event_kindrÓ   rx   r@   r�   r¤   r¥   r•   r©  r¨  rp  rs  rU   rk  rM  rR  r{   rW   Úgateway.hosted_room_attachmentsr?  r¸   r¹   rÌ   r€  Ú_CONTROL_EVENT_KINDSr  rV  rW  Ú_EVENT_COLUMNS)r(  r+   re   r    rf   ri   r,   r-   r{  r:  Únormalized_actorrý   rj  rÕ   r¾   rO  ri  r?  r  rÛ   s   &$$$$$$$$$          r(   Úappend_eventrG  ¼  s/  € ô �wÓ€GÜ˜Ó"€HØÒ&ÜÐ(Ð2eÕfÜ Ó%€DÜ#2°5Ô#DÑ Ðä$Ð%9Ð;QÓRÐØ˜Õ 9Ô,Ð1AÀ$Õ1GÐK_Ô1_ÜÐPÓQÐQÜ+¨OÐ=NÓO€OÜ�gœt×$Ò$ÜÐ9Ó:Ð:Ü  Ó)€LÜ
ˆs‹)€CÜ	�g¨×	.Õ	.°$Ü˜t¨hÓ7ˆØÒÜ˜hÓ'¨D¸oÐ+\Ô\Ü(Ð)YÓZÐZÜ" 8¸Ô=÷ 
/Ò	.ô Øð NØPWÈzÐ[bódˆô 	˜4°ÐHeÔfÜ�$�zÕ"Ó#ˆØÒ*¨s°Q­wÐ:MÔ/MÜ*Ð+RÓSÐSØÐ5Ô5ÝRÙ& tÀxÜ04·
²
¸<Ó0H×0LÑ0LÈ]Ð\^Ó0_Ðehõjä#Ø˜  h°jÐS_ØÔ"6Ñ6ô8ˆô 	�tð 2Ø47¸!µG¸[È#ÐX[Ð3\ÜÐLÓMô	Oô Ø�GœNÐ+Ð+]Ð^ÐahÐjmÐ`nØ2ó4ˆ÷/ 
/ð4 ?Œo˜cÓ"Ð> GÐ-=Ñ>Ð>÷5 
/×	.ús   Ã:HÄCHÈH	c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rn   r9  r   r  rp   ÚqueryrG  rH  Úunavailablerq   r³   r$   )rr   s   "r(   rs   rs   î  s8   € ÷ 
>ñ 
>�ð 
>˜cð 
>¨#ð 
>°ð 
>ÐUXð 
>Ð]añ 
>rH   c                ó¶  € V P                  4       '       g   R#  \        \        P                  ! V RR7      4      ;_uu_ 4       pVP	                  RV R24      P                  4       pVRJ;'       d"    VP	                  W#4      P                  4       RJuuRRR4       #   + '       g   i     R# ; i  \        P                   d   p\        T4      ThRp?ii ; i)zMNon-blocking existence probe: short timeout, no schema creation or migration.Fgš™™™™™©?)Útimeoutz9SELECT 1 FROM sqlite_master WHERE type='table' AND name='z	' LIMIT 1N)r=  r   Úsqlite3r   rå   r  ÚErrorrS   )r9  r  rI  rG  rJ  rÕ   Ú	table_rowÚexcs   &&&&&   r(   Ú_proberQ  î  s®   € à�<‰<�>Š>Ùð>Ü”W—_’_ T°4Ô8×9Ô9¸TØŸ™ØKÈEÈ7ÐR[Ð\ó^ß^fÑ^fÓ^hð à DÐ(×_Ð_¨T¯\©\¸%Ó-H×-QÑ-QÓ-SÐ[_Ð-_÷ :×9×9Ó9ûô �=‰=ô >Ü'¨Ó4¸#Ð=ûð>ús6   š)B2 ÁABÂ
B2 ÂB/	Â)B2 Â/B2 Â2CÃCÃCc               ó$   € V ^8„  d   QhRRRRRR/# )rn   r(  r	   r+   r   rq   r³   r$   )rr   s   "r(   rs   rs   û  s&   € ÷ Rñ R˜vð R°3ð R¸4ñ RrH   c               óF   € \        \        V 4      RR\        V4      3R4      # )zùCheck room ownership without creating or migrating the shared store; runs on the synchronous
prompt-admission path for older Desktop clients, so it fails fast under contention instead of blocking
the WebSocket reader for SQLite's ten-second timeout.r  zKSELECT 1 FROM hosted_rooms WHERE room_id=? AND disbanded_at IS NULL LIMIT 1z0hosted room ownership is temporarily unavailable)rQ  r   rÙ  )r(  r+   s   &$r(   Úprobe_hosted_roomrT  û  s-   € ô ÜˆW‹�~Ð'tÜ	�'Ó	ÐÐPóRð RrH   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rn   r(  r	   r+   r   r.   r{  r–  rq   r³   r$   )rr   s   "r(   rs   rs     s4   € ÷ :ñ :Øð:Ø!$ð:Ø69ð:Ø@Lð:ØX\ñ:rH   c               ó|   € \        V4      \        VR4      \        V4      3p\        \	        V 4      R\
        VR4      # )zDCheck a peer reservation without creating or migrating shared state.r.   Úhosted_room_peer_reservationsz.peer room ownership is temporarily unavailable)rÙ  rx   r©  rQ  r   rí  rî  s   &$$$ r(   Úprobe_peer_room_reservationrX    sB   € ô �wÓ¤¨>Ð;KÓ!LÌdÐSVËiÐX€FÜÜˆW‹Ð6Ô8PÐRXØ8ó:ð :rH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   r(  r	   r+   r   r+  r³   rq   r[  r$   )rr   s   "r(   rs   rs     s/   € ÷ yñ y˜ð y¨Cð yÀDð yÐUcñ yrH   c          
     ón  € \        V4      p\        V 4      ;_uu_ 4       p\        VR\         R2V\	        V4      3V4      pVP                  R\         R2V\	        VR,          4      34      P                  4       pRRR4       / \        X4      CXe   R\        V4      /C# / C#   + '       g   i     L1; i)z7Return durable replay and authority state for one room.r:   zR FROM hosted_rooms WHERE room_id=? AND (disbanded_at IS NULL
                OR ?)z… FROM hosted_room_events WHERE room_id=?
                AND kind='authority.claimed' AND authority_epoch=? ORDER BY seq DESC LIMIT 1r-   NÚauthority_claim)
rÙ  r¨  rM  r1  r{   rå   rE  r  rf  rk  )r(  r+   r+  rÕ   rÛ   Ú	claim_rows   &$$   r(   Ú
room_stater]    sË   € ä�wÓ€GÜ	�g×	Ô	 $ÜØØœ�ð 'ð Ø"¤CÐ(9Ó$:Ð;¸WóFˆð —L‘LØœÐ'ð (]ð `à”c˜#Ð/Õ0Ó1Ð2ó4÷ 5=±H³Jð 	÷ 
ð yŒn˜SÓ!ÐxÐYbÒYnÐ'8¼/È)Ó:TÐ&UÐxÐxÐtvÐxÐx÷ 
×	ús   ŸAB$Â$B4	c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rn   r(  r	   r+   r   Ú	cancel_idÚexpected_gateway_idÚexpected_epochrq   r[  r$   )rr   s   "r(   rs   rs     sD   € ÷ tñ tØðtØ!$ðtØ14ðtØKNðtØ`cðtØhvñtrH   c               óÈ   € \        VR\        R7      p\        WR\        P                  ! VP                  4       4      P                  4       R,           2RRRRV/RV/W4R	7      # )
z>Append an idempotent fence that supersedes earlier user turns.r_  rb   z
room-stop::Né    Núroom.stop_requestedr    r   r!   )r+   re   r    rf   ri   r,   r-   )ru   ÚMAX_EVENT_ID_CHARSrG  r›   rœ   rž   rŸ   )r(  r+   r_  r`  ra  s   &$$$$r(   Úrequest_room_stoprf    sj   € ô % Y°kÔM_Ô`€IÜØ¨Z¼¿ºÀy×GWÑGWÓGYÓ8Z×8dÑ8dÓ8fÐgjÕ8kÐ7lÐ+mØ"¨6°9¸dÐDWÐ*XØ˜iÐ(Ð?Rôtð trH   c               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )rn   r(  r	   r+   r   r`  ra  r’   re   r{  r–  rq   r[  r$   )rr   s   "r(   rs   rs   &  sV   € ÷ 0Oñ 0OØð0OØ!$ð0OØ;>ð0OØPSð0OØehð0OØtwð0Oà	ð0Oà!/ñ0OrH   c               óN  € \        V4      p\        VR4      p\        VR4      p\        V4      p\        VR4       \	        V4      pV^,           p\        R4      p\        W$V4      p	\        V RR7      ;_uu_ 4       p
\        V
RV3V4      p\        W¡V4      pVRJpV'       dY   \        V4      R	W‡V	38w  d   \        R
4      h\        VR,          4      V8w  g   \        VR,          4      V8w  d   \        R4      hMV\        W²VR4       \!        W«V\        VR,          4      VR	W‡W–RR7      p\#        V
RWNWaW#3\%        R4      4       \        W¡V4      p\'        V
RV3R4      pRRR4       Xf   \)        R4      h/ \+        XXR7      CR\-        WÍR7      /C#   + '       g   i     L<; i)zæFence a verified authority transfer with a compare-and-swap epoch; does not decide *when* takeover is
safe (a replicated driver calls it only after its lease/quorum policy established that the previous
owner can no longer commit).r`  r’   ra  r  Tr@  zŽSELECT authority_gateway_id, authority_epoch, next_seq, event_bytes
                FROM hosted_rooms WHERE room_id=? AND disbanded_at IS NULLNr  r=  r,   r-   z2authority claim succeeded but was later supersededzhosted room authority changedrb  r}  a"  UPDATE hosted_rooms SET authority_gateway_id=?,
            authority_epoch=authority_epoch+1, next_seq=next_seq+1,
            event_bytes=event_bytes+?, revision=revision+1, updated_at=? WHERE room_id=?
            AND disbanded_at IS NULL AND authority_gateway_id=? AND authority_epoch=?z§SELECT room_id, name, members_json, authority_gateway_id, authority_epoch, next_seq,
                revision, created_at, updated_at FROM hosted_rooms WHERE room_id=?z"claimed room could not be reloadedz+authority claim event could not be reloadedr  r  )rÙ  rx   r�   r�   r©  r�   r–   r¨  rM  rp  rs  rU   rp   r{   r_   rR  r€  r  r\   rW  rV  rf  rk  )r(  r+   r`  ra  r’   re   r{  r  Úclaim_actor_jsonÚclaim_payload_jsonrÕ   rÛ   Úexisting_eventrX  r  Ú	state_rows   &$$$$$$         r(   Úclaim_authorityrm  &  sì  € ô �wÓ€GÜ#Ð$7Ð9NÓOÐÜ˜~Ð/?Ó@€NÜ˜Ó"€HÜ˜.Ð*:Ô;Ü
ˆs‹)€CØ! AÕ%€LÜ)Ð*=Ó>ÐÜ,Ð-@ÐR^Ó_ÐÜ	�g¨×	.Õ	.°$ÜØð NØPWÈzÐ[bódˆô % T°HÓ=ˆØ#¨4Ð/ˆ
ßÜ˜nÓ-Ø#Ð%5ÐEWð2Yô Yä(Ð)YÓZÐZÜ�3Ð-Õ.Ó/°>ÔAÄSÈÐM^ÕI_ÓE`ÐdpÔEpÜ.Ð/cÓdÐdð Fqô ˜s¸ÐIhÔiä'Ø˜7¤C¨¨J­Ó$8¸(ÐDWÐYiØ"°tô=ˆKô ˜4ð "Yð  ¨cÐ<OÐ`Ü&Ð'FÓGôIô )¨¸ÓAˆNÜØð VØX_ÐWaØ0ó2ˆ	÷3 
/ð: ÒÜÐHÓIÐIðOÜ
˜¨zÔ
:ðOà” ~ÔMñOð O÷? 
/×	.ús   Á;C%FÆF$	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rn   rÕ   rÖ   r+   rp   rO  rm  rq   r  r$   )rr   s   "r(   rs   rs   Y  s1   € ÷ ]ñ ]Ð,ð ]°sð ]ÐBTð ]ÐYnñ ]rH   c                ó|  € VfK   V P                  RV34      P                  4       pVf   \        R4      hRVR\        VR,          4      RRR	R/# VR,          f   R# V P                  \        V\        VR,          4      34       \        WR
4      pRVR\        VR,          4      RR/Ve   R\        VRR7      /C# / C# )zVIdempotent replay for a retired or already-disbanded room; None when the room is live.Nz>SELECT retired_at FROM hosted_room_retired_ids WHERE room_id=?rK  r+   ra  Ú
retired_atrX  TÚhistory_expiredúsystem:room-disbandedr7  r  )rå   r  rJ   re  Ú_INSERT_RETIREDrp  rk  )rÕ   r+   rO  Úretiredr7  s   &&&  r(   Ú_disband_replayru  Y  sä   € à‚|Ø—,‘,Ð_ÐbiÐakÓl×uÑuÓwˆØŠ?Ü#Ð$;Ó<Ð<à�w ´°g¸lÕ6KÓ0LÈlÐ\`Ø˜tð%ð 	%ð ˆNÕÒ#ÙØ‡L�L” 7¬E°$°~Õ2FÓ,GÐ"HÔIÜ˜Ð'>Ó?€Eà�7˜N¬E°$°~Õ2FÓ,GÈÐW[ð]àAFÒARˆG”_ U°tÔ<Ð=ð]ð ]àXZð]ð ]rH   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rn   r(  r	   r+   r   r`  ra  r{  r–  rq   r[  r$   )rr   s   "r(   rs   rs   k  sD   € ÷ kñ kØðkØ!$ðkØ;>ðkØPSðkØZfðkàñkrH   c               ó¸  € \        V4      p\        VR4      p\        VR4       \        V4      p\	        V RR7      ;_uu_ 4       pVP                  RV34      P                  4       p\        WQV4      ;pe   VuuRRR4       # \        WbVR4       \        WVV\        VR,          4      R	R
\        R4      \        VR,          4      \        RV/4      VRR7      p\        VRWDW�W#3\        R4      4       VP                  \        W34       \!        V\"        VR	3R4      p	\%        WT\&        R7       RRR4       RVRVRRR\)        X	4      /#   + '       g   i     L#; i)z1Tombstone a room id permanently and idempotently.r`  ra  Tr@  zƒSELECT authority_gateway_id, authority_epoch, next_seq, event_bytes, disbanded_at
                FROM hosted_rooms WHERE room_id=?Nr>  rb  rr  úroom.disbandedr5  r-   r+   r}  a  UPDATE hosted_rooms
                SET disbanded_at=?, updated_at=?, revision=revision+1,
                    next_seq=next_seq+1, event_bytes=event_bytes+?
                WHERE room_id=? AND disbanded_at IS NULL AND authority_gateway_id=?
                AND authority_epoch=?z"hosted room disband lost its fencez(room disband event could not be reloadedrƒ  ra  rX  Fr7  )rÙ  rx   r�   r©  r¨  rå   r  ru  rR  r€  r{   r�   r•   r  rQ   rs  rW  ro  rŠ  r‡  rk  )
r(  r+   r`  ra  r{  rÕ   rO  ÚreplayÚdisband_bytesr7  s
   &$$$$     r(   Údisband_roomr{  k  sg  € ô �wÓ€GÜ#Ð$7Ð9NÓOÐÜ˜.Ð*:Ô;Ü
ˆs‹)€CÜ	�g¨×	.Õ	.°$Ø�|‰|ð 5Ø7>°jóBßBJÁ(Ã*ð 	ä% d°TÓ:Ð:ˆFÒGØ÷	 
/Ò	.ô
 	˜4°nÐFcÔdÜ%Ø˜¤ T¨*Õ%5Ó!6Ð8OÐQaÜ˜~Ó.´°DÐ9JÕ4KÓ0LÌmÐ]fÐhoÐ\pÓNqÐsvØô ˆô 	�tð )ð
 �}Ð/BÐSÜÐBÓCô	Eð 	�‰”_ w nÔ5ÜØ”- 'Ð+BÐ!CÐEoóqˆä% dÔMdÕe÷) 
/ð* �w °°\À5È'ÔSbÐchÓSiÐjÐj÷+ 
/×	.ús   Á3E	ÂB,E	Å	E	Ú	since_seqc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rn   r(  r	   r+   r   r|  r,  r+  r³   rq   r[  r$   )rr   s   "r(   rs   rs   ‹  s<   € ÷ 1ñ 1Øð1Ø!$ð1Ø14ð1ØADð1Ø_cð1àñ1rH   c          
     ój  aaaa€ \        V4      p\        SR4      o\        V\        4      p\	        V 4      ;_uu_ 4       p\        VRV\        V4      3V4      p\        VR,          4      ^,
          oR\        VR,          4      R\        VR,          4      /oSS8”  d   \        R4      hVP                  R	\         R
\         R2VSV\        34      P                  4       pRRR4       X Uu. uF  p\        V4      NK  	  p	pR VVV3R lloR V3R llp
V	'       dw   V
! V	4      '       gi   ^\        V	4      rËW¼8  d9   W¼,           ^,           ^,          pV
! V	RV 4      '       d   WÜ3M	W½^,
          3w  r¼K>  V	RV p	V
! V	4      '       g   \        R4      hS! V	4      #   + '       g   i     LÄ; iu upi )z4Read a monotonic room-log delta after ``since_seq``.r|  zˆSELECT next_seq, authority_gateway_id, authority_epoch FROM hosted_rooms
                WHERE room_id=? AND (disbanded_at IS NULL OR ?)rb  rP  r,   r“   r-   z)since_seq is ahead of the hosted room logz/WITH candidates AS (
                   SELECT a  ,
                          SUM(
                              LENGTH(CAST(event_id AS BLOB)) +
                              LENGTH(CAST(kind AS BLOB)) +
                              LENGTH(CAST(actor_json AS BLOB)) +
                              LENGTH(CAST(payload_json AS BLOB))
                          ) OVER (ORDER BY seq ASC) AS cumulative_bytes
                     FROM hosted_room_events
                    WHERE room_id=? AND seq>?
                    ORDER BY seq ASC LIMIT ?
               )
               SELECT zl
                 FROM candidates
                WHERE cumulative_bytes<=?
                ORDER BY seq ASCNc               ó    € V ^8„  d   QhRRRR/# )rn   Úpage_eventsr²   rq   r[  r$   )rr   s   "r(   rs   Ú!read_events.<locals>.__annotate__¬  s   € ÷ (ñ (Ð 4ð (¸ñ (rH   c           
     óV   <€ V '       d   V R,          R,          MSpRV RVRSRVS8  RS/# )rÚ   ri  ÚeventsÚcursorrc  Úhas_moreÚ	authorityéÿÿÿÿr$   )r€  r„  r†  rc  r|  s   & €€€r(   Ú
build_pageÚread_events.<locals>.build_page¬  s=   ø€ ß+6�˜R• Ö'¸IˆØ˜+ x°¸ÀzÐS]Ð_eÐhrÑ_rØ˜Yð(ð 	(rH   c               ó    € V ^8„  d   QhRRRR/# )rn   r€  r²   rq   r³   r$   )rr   s   "r(   rs   r�  °  s   € ÷ 9ñ 9Ð.ð 9°4ñ 9rH   c                óf   <€ \         P                  ! S! V 4      R RR7      p\        V4      \        8*  # )F)ra   Ú
separators)r™  Ú:)r¸   Údumpsr   ÚMAX_LOG_PAGE_BYTES)r€  Ú	page_jsonrˆ  s   & €r(   ÚfitsÚread_events.<locals>.fits°  s,   ø€ Ü—J’J™z¨+Ó6ÀUÐWaÔbˆ	Ü˜	Ó"Ô&8Ñ8Ð8rH   z+hosted room event exceeds replay page limit)rÙ  rŠ   r†   ÚMAX_LOG_LIMITr¨  rM  r{   rp   r@   rå   rE  r�  r“  rk  r©   )r(  r+   r|  r,  r+  rÕ   rO  r­  rÛ   rƒ  r‘  r~   r…   Úmiddler†  rˆ  rc  s   &$d$$         @@@r(   Úread_eventsr•  ‹  s·  û€ ô �wÓ€GÜ˜i¨Ó5€IÜ˜5¤-Ó0€EÜ	�g×	Ô	 $ÜØð CØELÌcÐRcÓNdÐDeÐgnópˆô ˜˜jÕ)Ó*¨QÕ.ˆ
Ø!¤3 tÐ,BÕ'CÓ#DÀgÌsÐSWÐXiÕSjÓOkÐlˆ	Ø�zÔ!Ü!Ð"MÓNÐNØ�|‰|ðÜ)Ð*ð +ô &Ð&ð '!ð$ð '.¨y¸%ÔASÐ%Tó!V÷  W_ÑV^ÓV`ð! 	÷ 
ñ2 /3Ó3©d sŒo˜cÖ"©d€FÐ3÷(ò (÷9ð 9÷ ‘d˜6—l’là”s˜6“{ˆTØŒjØ•j 1•n¨Õ*ˆFÙ*.¨v°g°v¨×*?Ò*?˜™ÀcÐTUÍ:ÐEV‰IˆC‘Ø˜˜�ˆÙ�F�|Š|Ü!Ð"OÓPÐPÙ�fÓÐ÷U 
×	üò2 4s   ¿B"FÃ-F0ÆF-	i   i   i    i §v i   i   i   >   úauthority.lostrx  r  rd  >	   úturn.failedúturn.settledúturn.startedúroom.activityúturn.deferredúturn.cancelledúturn.reassignedúmember.unavailablerd  >   úroom.createdr6  r–  rx  r  úroom.members_changed)	r+   ró   r,   r-   r´  rÉ  r.   Útask_idÚexecution_generation)r+   r´  Ú
target_urlr.   ÚgrantÚcatalog_jsonÚcancellation_scope_idÚtrace_idÚtransport_securityr¼  r`  i   )r  r,   rû   rô   )r  r-   úINTEGER NOT NULLrõ   )r  r  r©  Ú0)rü   r-   ÚINTEGERN)Ú#hosted_room_policy_transcript_stateÚhosted_room_policy_transcriptÚhosted_room_policy_publicationsÚhosted_room_policy_watermarksÚhosted_room_policy_eventsÚhosted_room_policy_threadsÚhosted_room_policy_cursorsÚhosted_room_driver_tasksÚhosted_room_driver_leasesrî   Úhosted_room_linksrW  rü   )±rF   Ú
__future__r   r›   r¸   r2   rM  Ú
contextlibr   Ú	functoolsr   Úpathlibr   Útypingr   r   r   Úgateway.hosted_rooms_commonr	   r
   r   r   r©  r   r   r   r  r   r   r   r   r   r   ÚPROTOCOL_VERSIONÚMAX_ROOM_ID_CHARSre  ÚMAX_ROOM_NAME_CHARSÚMAX_EVENT_KIND_CHARSrv   ÚMAX_ACTOR_LABEL_CHARSrª   r­   ÚMAX_EVENT_JSON_BYTESr“  r�  r0  r$  rŸ  rž  rˆ  r‰  r‡  r…  r†  r8  ÚcompileÚ_EVENT_KIND_REr5   rD  rÍ   rÎ   rÉ   rç   rö   r  ræ   r  rã   rE  ro  r  r1  r%  r  r#  rw  rs  r  r¹  rÊ   r  r  rä  rí  r»   r@   rJ   rL   rQ   rS   rU   rW   rZ   r\   r_   r¬   ru   rÙ  r�   rŽ   r•   r€   r"  rB  rx   r�   r†   rŠ   r�   r–   r    r®   rÃ   rÓ   ré   rù   ÚreplaceÚ_LEGACY_ACTOR_JSONr  r  r
  r  r  r   r&  r,  r0  r:  r?  r¨  rD  rM  rR  rW  rf  rk  rp  rs  rx  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*  r2  r9  rG  rQ  rT  rX  r]  rf  rm  ru  r{  r•  r$   rH   r(   Ú<module>rÆ     sÀ  ðñõ #ã Û Û 	Û Ý Ý Ý ß )Ñ )÷Q÷ Q÷ Qõ Qð Ð ØÐ ØÐ ØÐ ØÐ ØÐ ØÐ Ø€Ø#Ð Ø!Ð Ø€Ø$Ð ØÐ ØÐ Ø #Ð Ø#4Ð  ØÐ Ø(Ð ð +Ð Ø Ð Ø(Ð ØÐ à—’Ð2Ó3€Ù Ò!qÓrÐ à
‰I�~Ð&Ó'¨±9Ð>NÐ=OÓ3PØ‰yò Ió Jð ‰iò ó ðÐ ð Ð*Ð+¨iÐ9KÐ-LÈÐ`rÐNsðuÐ á˜6 4ÐYÑ*XÑAWÓ*XÐYÓZ€ð 9Ð ðÐ ð,ðððð EÐEVÐDWÐWXÐYðð
ðe=€÷~ �Eñ ~áq|ó~—E‘Eñ ~áq|ó~ó ~Ð ð /¨qÕ1°!Õ4Ð ð h€Ø˜.Ð)Ð)`Ða€Ø3°NÐ3CÐCdÐe€ð,ð ð6ð ð ˜˜Ð'IÐJ€Ø#Ð$<Ð#=Ð=_Ð`Ð ØKÐ Øf€ðDð ð>€ð —L‘LÑ ZÑ=YÓ ZÓZÐ ØCÐDUÐCVÐWÐ ØiÐ ØJÐKbÐJcÐckÐlÐ ô g�jÔ fä h˜Ô hô$Ð/ô $ô s˜Ô rôQ ô Qô u˜Ô tôR˜ô RôRÐ#;ô Rô"˜_ô "ôIÐ5ô Iñ
 ˜.°ÈeÔT€Ù˜z°ÔAÐ ÙÐ'¨yÐDUÔV€ÙÐ(°
ÐFXÔY€	Ù�o¨WÀÔI€Ù˜¨yÐDXÔY€Ù�{¨/Ô:€ÙØ Ð2EÈtÐ]pôrÐ áØ Ð2FÐP^Ø ô"Ð õ
RõUõfõRõ;õxõ
\õ
`õõ$%õ4võdñ6 (¨Ó1×9Ñ9¸#¸tÓDÐ ð JØ@Ù<Ø˜<¨¸AÐ>PÐ=QÐQRÐ:SÐTÙ>ð@€ð
)Ð õ
>õOõõ`õ$Fõ?õ'õfõ
ñ �{ H¸Ô>€õtõ	5õ.õ
ð	T¸5÷ 	Tðv¸E÷ võGõWõ
=ðàHM÷ðà÷ñ.PÐ õQðØZ^÷ð@BÀ$÷ Bõ'õ?ð4CØW[÷Cõbõ=õLð:ØZ^÷:õ6õhð"_ØZ^÷"_õJ4ð
LÐei÷ LðwÐbf÷ wðIÐ]a÷ IõLð;Ðae÷ ;ð.'Ø.2ð'ØQUð'Øpt÷'õ2õwð0-BØnrð-Bà8<÷-Bð`1Ø27ð1ØFYð1Øij÷1ðkÐ`d÷ kð:/?à $ð/?à=Að/?àW[ð/?ð '+÷/?õd
>õRð:ØOS÷:ðyÈ5÷ yõtð0Oà÷0Oõf]ð$kØim÷kð@1Ø78ð1ØGJð1Øfk÷1ñ 1rH   