+
    jHàjò`  ã                  ó°  € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
HtHt ^ RIHt ^ RIHt ^ RIHtHtHt ^@t^t^t]]^,           ,          t]! 0 Rm4      tRt]P8                  tR	tR
RP?                  R ]PA                  R4       4       4       R2t!]! RR7       ! R R4      4       t"]PF                  t$R R lt%R R lt&R R lt' ! R R4      t(R# )a.  Durable bounded policy projection for hosted Group Chat preparation.

The append-only room log remains the user-visible source of truth. This module materializes only the state
needed to choose and reconstruct the next active discussion, so a busy room does not replay its complete
history every poll.
)ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚCallableÚMapping)Úhosted_rooms)Úvalidate_task_input)ÚDbPathÚcompact_jsonÚfenced_updatezODELETE FROM hosted_room_policy_events WHERE room_id=? AND discussion_event_id=?a  WITH transcript_events(seq) AS (
        SELECT seq FROM hosted_room_policy_transcript WHERE room_id=? AND thread_id=?
        UNION ALL
        SELECT settled_seq FROM hosted_room_policy_transcript
         WHERE room_id=? AND thread_id=? AND settled_seq IS NOT NULL)
    SELECT z, c              #  ó4   "  € T F  pR V,           x € K  	  R# 5i)zevents.N© )Ú.0Úcolumns   & ÚJ/home/ubuntu/.hermes/hermes-agent/gateway/hosted_room_policy_checkpoint.pyÚ	<genexpr>r   D   s   é € ÐWÑ7V¨V�i &×(Ò(Ó7Vùs   ‚zš
    FROM transcript_events
    JOIN hosted_room_events AS events ON events.room_id=? AND events.seq=transcript_events.seq
    ORDER BY events.seq LIMIT ?T)Úfrozenc                  óD   € ] tR t^Jt$ RtR]R&   R]R&   R]R&   R]R&   R	tR
# )ÚPolicySnapshotz;Bounded active policy input at one durable room-log cursor.ÚintÚthrough_seqÚstopped_through_seqztuple[dict[str, Any], ...]ÚeventszMapping[tuple[str, str], int]Ú
watermarksr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r   ó    r   r   r   J   s   ‡ áEØÓØÓØ&Ó&Ø-×-r"   r   c               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚmappingúMapping[str, Any]ÚkeyÚstrÚreturnr   )Úformats   "r   Ú__annotate__r+   V   s"   € ÷ 'ñ 'Ð$ð '¨3ð '°3ñ 'r"   c                óJ   € \        V P                  V4      ;'       g    R 4      # )Ú )r(   Úget)r%   r'   s   &&r   Ú_textr/   V   s   € Üˆw�{‰{˜3Ó×%Ð% 2Ó&Ð&r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   Úconnúsqlite3.ConnectionÚroom_idr(   r)   ÚNoner   )r*   s   "r   r+   r+   Z   s'   € ÷ Fñ FÐ*ð F°Sð F¸Tñ Fr"   c                óx   € V P                  R V34      P                  4       f   \        P                  ! R4      hR# )z*SELECT 1 FROM hosted_rooms WHERE room_id=?Núhosted room not found)ÚexecuteÚfetchoner   ÚRoomNotFoundError)r1   r3   s   &&r   Ú_require_roomr:   Z   s7   € Ø‡|�|Ð@À7À*ÓM×VÑVÓXÒ`Ü×,Ò,Ð-DÓEÐEñ ar"   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r$   r1   r2   r3   r(   Údiscussion_event_idÚmessage_event_idr   r)   zdict[str, Any] | Noner   )r*   s   "r   r+   r+   _   s4   € ÷ ñ Ø
ðØ'*ðØADðØX[ðØ`uñr"   c                óÊ   € V P                  R\         R2W34      P                  4       pVf   R# \        V4      pVR,          R8w  g   \	        VR,          R4      V8w  d   R# V# )zJRead the committed message even after its active discussion was compacted.úSELECT z7 FROM hosted_room_events WHERE room_id=? AND event_id=?NÚkindúmessage.memberÚpayloadr<   )r7   Ú_ROOM_EVENT_COLUMNSr8   Ú_event_from_room_rowr/   )r1   r3   r<   r=   ÚrowÚevents   &&&&  r   Ú_settled_messagerG   _   so   € ð �,‰,Ø
Ô%Ð&Ð&]Ð^Ø	Ð#ó%ç%-¡X£Zð ð ‚{ÙÜ  Ó%€EØˆV…}Ð(Ô(¬E°%¸	Õ2BÐDYÓ,ZÐ^qÔ,qÙØ€Lr"   c                  ó\  € ] tR t^mt$ RtR R ltR R ltR t]R R l4       t	]R	R
/R R ll4       t
R R ltR R ltR R ltR R ltR R ltR]R]/]P#                  ]]4      CR]R]/CtR]R&   R R ltR R  ltR! R" ltR# R$ ltR% R& ltR'R
R(R
/R) R* lltR+ R, ltR- R. ltR/tR
# )0ÚHostedRoomPolicyCheckpointzCIncrementally index room policy without compacting visible history.c               ó    € V ^8„  d   QhRRRR/# )r$   Údb_pathr
   r)   r4   r   )r*   s   "r   r+   Ú'HostedRoomPolicyCheckpoint.__annotate__o   s   € ÷ "ñ " ð "¨4ñ "r"   c                	óÌ   € \        V4      V n        V P                  4       ;_uu_ 4       p\         F  pVP	                  V4       K  	  R R R 4       R #   + '       g   i     R # ; i)N)r   rK   Ú_transactionÚ_SCHEMA_DDLr7   )ÚselfrK   r1   Úddls   &&  r   Ú__init__Ú#HostedRoomPolicyCheckpoint.__init__o   sC   € Ü˜G“}ˆŒØ×Ñ× Ô  Dß"�Ø—‘˜SÖ!ñ #÷ !× × Ò ús   ©AÁA#	c               ó   € V ^8„  d   QhRR/# )r$   r)   r2   r   )r*   s   "r   r+   rL   u   s   € ÷ rñ rÐ,ñ rr"   c                	ó8   € ^ RI Hp V! V P                  RRR7      # )é    )Úopen_dbz(shared-state.db (room policy checkpoint)i'  )Údb_labelÚbusy_timeout_ms)Úhermes_cli.sqlite_utilrW   rK   )rP   rW   s   & r   Ú_connectÚ#HostedRoomPolicyCheckpoint._connectu   s   € å2á�t—|‘|Ð.XÐjpÔqÐqr"   c                	ó:   € ^ RI Hp V! V P                  4       4      # )rV   )Útransaction)rZ   r^   r[   )rP   r^   s   & r   rN   Ú'HostedRoomPolicyCheckpoint._transaction{   s   € Ý6á˜4Ÿ=™=›?Ó+Ð+r"   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r$   r1   r2   rF   r&   Ú	thread_idr(   r<   r)   r4   r   )r*   s   "r   r+   rL   �   s;   € ÷ nñ nØ ðnØ,=ðnØJMðnØdgðnØlpñnr"   c               	ó„   € V P                  R VR,          W#\        VR,          4      \        \        V4      4      34       R# )z¤INSERT OR IGNORE INTO hosted_room_policy_events(
                   room_id, thread_id, discussion_event_id, seq, event_json
               ) VALUES (?, ?, ?, ?, ?)r3   ÚseqN)r7   r   r   Údict)r1   rF   ra   r<   s   &$$$r   Ú_store_active_eventÚ.HostedRoomPolicyCheckpoint._store_active_event€   s?   € ð 	�‰ð +ð �9Õ˜y¼sÀ5ÈÅ<Ó?PÔR^Ô_cÐdiÓ_jÓRkÐlö	nr"   Úsettled_seqNc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r$   r1   r2   rF   r&   ra   r(   rg   z
int | Noner)   r4   r   )r*   s   "r   r+   rL   ‰   s;   € ÷ Gñ GØ ðGØ,=ðGØJMðGØ\fðGØrvñGr"   c          
     	óp  € V P                  R VR,          V\        VR,          4      \        VR,          4      V34       VR,          R9   dj   V P                  RVR,          V\        ^,
          34      P	                  4       pVe/   V P                  RVR,          V\        VR,          4      34       R# R# R# )a;  INSERT INTO hosted_room_policy_transcript(
                   room_id, thread_id, seq, kind, settled_seq
               ) VALUES (?, ?, ?, ?, ?)
               ON CONFLICT(room_id, thread_id, seq) DO UPDATE SET
                   settled_seq=COALESCE(excluded.settled_seq, hosted_room_policy_transcript.settled_seq)r3   rc   r@   zÅSELECT seq FROM hosted_room_policy_transcript
                   WHERE room_id=? AND thread_id=? AND kind IN ('message.user', 'message.member')
                   ORDER BY seq DESC LIMIT 1 OFFSET ?NzSDELETE FROM hosted_room_policy_transcript WHERE room_id=? AND thread_id=? AND seq<?>   úmessage.userrA   )r7   r   r(   ÚMAX_THREAD_TRANSCRIPT_EVENTSr8   )r1   rF   ra   rg   Úcutoffs   &$$$ r   Ú_store_transcript_eventÚ2HostedRoomPolicyCheckpoint._store_transcript_eventˆ   sÃ   € ð 	�‰ð lð
 �9Õ˜y¬#¨e°E­lÓ*;¼SÀÀvÅÓ=OÐQ\Ð]ô	_ð ��=Ð>Ô>Ø—\‘\ð #9ð �yÕ! 9Ô.JÈQÕ.NÐOóQ÷ RZÑQYÓQ[ð ð Ò!Ø—‘ØiØ˜9Õ% y´#°f¸UµmÓ2DÐEöGñ "ñ ?r"   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r$   r1   r2   r3   r(   ra   r<   Úbound_errorr)   úlist[dict[str, Any]]r   )r*   s   "r   r+   rL   ›   sD   € ÷ Eñ EØ&ðEØ47ðEØDGðEØ^aðEØpsðEà	ñEr"   c          
     ó
  € VP                  RW$\        ^,           34      P                  4       p\        V4      \        8”  d   \	        V4      hVP                  \
        W#W#V\        ^,           34      P                  4       p\        V4      \        8”  d   \	        R4      h. \        \        V4      OR V 4       O Uu/ uF  p\        VR,          4      VbK  	  p	p\        V	4       U
u. uF  q©V
,          NK  	  up
# u upi u up
i )zGMerge the thread transcript with the active projection, ordered by seq.z~SELECT event_json FROM hosted_room_policy_events
               WHERE room_id=? AND discussion_event_id=? ORDER BY seq LIMIT ?z+thread policy transcript exceeded its boundc              3  ó\   "  € T F"  p\         P                  ! VR ,          4      x € K$  	  R# 5i)Ú
event_jsonN)ÚjsonÚloads)r   rE   s   & r   r   Ú@HostedRoomPolicyCheckpoint._discussion_events.<locals>.<genexpr>ª   s$   é € Ð=sÑgrÐ`c¼d¿jºjÈÈ\ÕIZ×>[Ð>[Ógrùs   ‚*,rc   )r7   ÚMAX_ACTIVE_POLICY_EVENTSÚfetchallÚlenÚRuntimeErrorÚ_TRANSCRIPT_EVENTS_SQLÚMAX_TRANSCRIPT_POLICY_EVENTSÚmaprD   r   Úsorted)rP   r1   r3   ra   r<   rp   Úactive_rowsÚrowsrF   Úevents_by_seqrc   s   &&$$$$     r   Ú_discussion_eventsÚ-HostedRoomPolicyCheckpoint._discussion_events›   s  € ð —l‘lð $QàÔ+CÀaÕ+GÐHóJçJRÉ(Ë*ð 	ô ˆ{ÓÔ6Ô6Ü˜{Ó+Ð+Ø�|‰|Ô2Ø$°ÀWÔNjÐmnÕNnÐoóqßqyÑqyÓq{ð 	äˆt‹9Ô3Ô3ÜÐLÓMÐMð uœ3Ô3°TÓ:ÐtÑ=sÑgrÓ=sÑtóvát�ô ��e•Ó˜uÒ$Ùtð 	ð vô /5°]Ô.CÓDÑ.C s˜c×"Ð"Ñ.CÑDÐDùòvùò Es   Â<C;Ã'D c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r$   r1   r2   rF   r&   rB   r)   r4   r   )r*   s   "r   r+   rL   ¯   s2   € ÷ Mñ MØ&ðMØ/@ðMØK\ðMØaeñMr"   c           
     	ó  € \        VR ,          4      p\        VR4      \        VR4      reV'       d	   V'       g   R# VP                  RWEV\        VR,          4      34       V P	                  WWVR7       V P                  WVR7       R# )r3   ra   Úevent_idNaq  INSERT INTO hosted_room_policy_threads(
                   room_id, thread_id, discussion_event_id, latest_user_seq, completed
               ) VALUES (?, ?, ?, ?, 0)
               ON CONFLICT(room_id, thread_id) DO UPDATE SET
                   discussion_event_id=excluded.discussion_event_id,
                   latest_user_seq=excluded.latest_user_seq, completed=0rc   ©rF   ra   r<   ©rF   ra   )r(   r/   r7   r   re   rm   )rP   r1   rF   rB   r3   ra   rˆ   s   &&&&   r   Ú_apply_user_messageÚ.HostedRoomPolicyCheckpoint._apply_user_message¯   s}   € ä�e˜IÕ&Ó'ˆÜ# G¨[Ó9¼5ÀÈ
Ó;S�8ß§ÙØ�‰ð Lð  ¬3¨u°U­|Ó+<Ð=ô	?ð 	× Ñ  ¸iÐ ÔfØ×$Ñ$ TÀ)Ð$ÖLr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# r†   r   )r*   s   "r   r+   rL   ¿   s2   € ÷ $Cñ $CØ&ð$CØ/@ð$CØK\ð$CØaeñ$Cr"   c                ób  € \        VR,          4      \        VR,          4      \        VR4      rep\        VR4      \        VR4      r‡VP                  RWH34      P	                  4       e   V P                  WWxR7       V\        9  d   R# \        VR	4      p	VR
8X  d%   \        VP                  R4      ;'       g    ^ 4      M^ p
V	'       d   VP                  RWIWjV34       \        VR4      p\        VP                  R4      ;'       g    ^ 4      pVR8X  d_   VP                  R4      '       dH   \        WWƒR,          4      pVe0   \        V\        VR,          4      4      pV P                  WWuR7       MV P                  WVR7       V'       d    V^ 8”  d   VP                  RWGW¼34       R# R# R# )zGIndex member messages and terminal turn outcomes of a known discussion.r3   rc   r@   ra   r<   zYSELECT 1 FROM hosted_room_policy_events WHERE room_id=? AND discussion_event_id=? LIMIT 1Nr‰   Útask_idúturn.deferredÚexecution_generationz«INSERT OR IGNORE INTO hosted_room_policy_publications(
                       room_id, task_id, kind, execution_generation, seq
                   ) VALUES (?, ?, ?, ?, ?)Ú	member_idÚseen_through_seqúturn.settledr=   )rF   ra   rg   rŠ   a]  INSERT INTO hosted_room_policy_watermarks(
                       room_id, thread_id, member_id, seen_through_seq
                   ) VALUES (?, ?, ?, ?)
                   ON CONFLICT(room_id, thread_id, member_id) DO UPDATE SET
                       seen_through_seq=MAX(hosted_room_policy_watermarks.seen_through_seq, excluded.seen_through_seq))r(   r   r/   r7   r8   re   Ú_TERMINAL_KINDSr.   rG   Úmaxrm   )rP   r1   rF   rB   r3   rc   r@   ra   r<   r�   r‘   r’   r“   Ú	committeds   &&&&          r   Ú_apply_discussion_eventÚ2HostedRoomPolicyCheckpoint._apply_discussion_event¿   s¥  € ô !  yÕ!1Ó2´C¸¸e½Ó4EÄuÈUÐTZÓG[�dˆÜ).¨w¸Ó)DÄeÈGÐUjÓFkÐ&Ø�<‰<ØgØÐ*ó,ç,4©H«JòCð ×$Ñ$ TÀ)Ð$Ôuð ”Ô&ÙÜ˜ Ó+ˆØPTÐXgÔPgœs 7§;¡;Ð/EÓ#F×#KÐ#KÈ!ÔLÐmnÐßØ�L‰Lð /ð  4¸sÐCôEô ˜' ;Ó/ˆ	Ü˜wŸ{™{Ð+=Ó>×CÐCÀ!ÓDÐØ�>Ô! g§k¡kÐ2D×&EÒ&EÜ(¨Ð8KÐUgÕMhÓiˆIØÒ$Ü#&Ð'7¼¸YÀuÕ=MÓ9NÓ#OÐ Ø×,Ñ,¨TÈiÐ,Ôiøð ×(Ñ(¨ÀiÐ(ÔPßÐ)¨AÔ-Ø�L‰Lð zð
  YÐAöCñ .‰9r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# r†   r   )r*   s   "r   r+   rL   å   s2   € ÷ uñ uØ&ðuØ/@ðuØK\ðuØaeñur"   c                	óª   € \        VR ,          4      \        VR4      rTVP                  \        V\        VR4      34       VP                  RWE34       R# )r3   ra   r<   zFDELETE FROM hosted_room_policy_threads WHERE room_id=? AND thread_id=?N)r(   r/   r7   Ú_DELETE_ACTIVE_EVENTS_SQL)rP   r1   rF   rB   r3   ra   s   &&&&  r   Ú_apply_room_activityÚ/HostedRoomPolicyCheckpoint._apply_room_activityå   sI   € ä   yÕ!1Ó2´E¸'À;Ó4O�Ø�‰Ô.°¼%ÀÐI^Ó:_Ð0`ÔaØ�‰Ð]Ð`gÐ_sÖtr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# r†   r   )r*   s   "r   r+   rL   ë   s,   € ÷ 8ñ 8Ø&ð8Ø/@ð8ØK\ð8Øaeñ8r"   c                	ón   € VP                  R \        VR,          4      \        VR,          4      34       R# )ztUPDATE hosted_room_policy_cursors
               SET stopped_through_seq=MAX(stopped_through_seq, ?) WHERE room_id=?rc   r3   N)r7   r   r(   )rP   r1   rF   rB   s   &&&&r   Ú_apply_stop_requestedÚ0HostedRoomPolicyCheckpoint._apply_stop_requestedë   s/   € à�‰ð Vä��u•Ó¤ E¨)Õ$4Ó 5Ð6ö	8r"   rj   rA   zroom.activityzroom.stop_requestedzdict[str, Callable[..., None]]Ú_APPLY_BY_KINDc               ó$   € V ^8„  d   QhRRRRRR/# )r$   r1   r2   rF   r&   r)   r4   r   )r*   s   "r   r+   rL   ö   s)   € ÷ Xñ XÐ!3ð XÐ<Mð XÐRVñ Xr"   c           	     	óÂ   € V P                   P                  \        VR 4      4      pVe6   VP                  R4      pT! YT\        V\        4      '       d   TM/ 4       R# R# )r@   NrB   )r£   r.   r/   Ú
isinstancer   )rP   r1   rF   ÚhandlerrB   s   &&&  r   Ú_apply_eventÚ'HostedRoomPolicyCheckpoint._apply_eventö   sS   € Ø×%Ñ%×)Ñ)¬%°°vÓ*>Ó?ˆØÒØ—i‘i 	Ó*ˆGÙ�D ´*¸WÄg×2NÒ2N¡wÐTVÖWñ r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r1   r2   r3   r(   r)   r   r   )r*   s   "r   r+   rL   ü   s#   € ÷ ñ Ð2Dð Èsð ÐWZñ r"   c                ó¾  € \        W4       VP                  RV34       \        VP                  RV34      P                  4       R,          4      pVP                  RV34      P                  4       pVe   \        VR,          4      \        8  dN   R
 F  pVP                  RV R2V34       K  	  VP                  RV34       ^ pVP                  R	V\        34       V# )zFCreate the cursor and migrate derived policy caches by bounded replay.zŸINSERT OR IGNORE INTO hosted_room_policy_cursors(
                   room_id, through_seq, stopped_through_seq, updated_at
               ) VALUES (?, 0, 0, 0)úBSELECT through_seq FROM hosted_room_policy_cursors WHERE room_id=?r   zNSELECT schema_version FROM hosted_room_policy_transcript_state WHERE room_id=?Úschema_versionzDELETE FROM z WHERE room_id=?zZUPDATE hosted_room_policy_cursors SET through_seq=0, stopped_through_seq=0 WHERE room_id=?zÆINSERT INTO hosted_room_policy_transcript_state(room_id, schema_version)
                   VALUES (?, ?)
                   ON CONFLICT(room_id) DO UPDATE SET schema_version=excluded.schema_version)Úhosted_room_policy_eventsÚhosted_room_policy_threadsÚhosted_room_policy_watermarksÚhosted_room_policy_transcript)r:   r7   r   r8   Ú_TRANSCRIPT_SCHEMA_VERSION)rP   r1   r3   ÚcursorÚtranscript_stateÚtables   &&&   r   Ú_ensure_cursor_and_transcriptÚ8HostedRoomPolicyCheckpoint._ensure_cursor_and_transcriptü   s÷   € ä�dÔ$Ø�‰ð (à*1¨ô	5ô Ø�L‰LÐ]Ð`gÐ_iÓj×sÑsÓuØõó ˆð  Ÿ<™<Ø\Ð_fÐ^hójßjrÑjrÓjtð 	àÒ#¤sÐ+;Ð<LÕ+MÓ'NÔQkÔ'kó\�à—‘˜|¨E¨7Ð2BÐCÀgÀZÖPñ\ð �L‰LÐuØ!˜ô%àˆFØ�L‰Lð `ð Ô4Ð5ô7ð ˆr"   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r3   r(   Ú
latest_seqr   r)   r   )r*   s   "r   r+   rL     s!   € ÷ %ñ %˜sð %°ð %¸ñ %r"   c               ó|  € V P                  4       ;_uu_ 4       pVP                  R4       V P                  W14      pRRR4       XV8”  d€   V P                  4       ;_uu_ 4       pVP                  RV34      P	                  4       pVf   \
        P                  ! R4      hV\        VR,          4      8¼  d   \        R4      h RRR4       WB8  Ed¬   \
        P                  ! V P                  W\
        P                  R7      pVP                  R. 4       Uu. uF  p\        V\        4      '       g   K  VNK  	  pp\        VP                  R	4      ;'       g    T4      p	V'       d   W”8:  d   \        R
4      hV P                  4       ;_uu_ 4       pVP                  R4       \        W14       VP                  RV34      P	                  4       p
V
f   \        R4      h\        V
R,          4      V8w  d   \        V
R,          4      p RRR4       EKH  V F  pV P!                  W74       K  	  \#        TRT	\%        VR,          P                  R4      ;'       g    ^ 4      V3\        R4      4       RRR4       T	pEK²  V#   + '       g   i     ELK; i  + '       g   i     ELÙ; iu upi   + '       g   i     LD; i)z=Materialize each unseen event exactly once by durable cursor.zBEGIN IMMEDIATENz1SELECT next_seq FROM hosted_rooms WHERE room_id=?r6   Únext_seqz.room policy cursor is ahead of the durable log)r3   Ú	since_seqÚlimitr   r³   z)hosted room policy cursor did not advancer¬   z,room policy cursor disappeared during replayr   zQUPDATE hosted_room_policy_cursors SET through_seq=?, updated_at=? WHERE room_id=?Ú
created_atéÿÿÿÿ)rN   r7   r¶   r[   r8   r   r9   r   r{   Úread_eventsrK   ÚMAX_LOG_LIMITr.   r¦   r   r:   r¨   r   Úfloat)rP   r3   r¹   r1   r³   ÚroomÚpagerF   r�   Únext_cursorÚcurrents   &$$        r   ÚsyncÚHostedRoomPolicyCheckpoint.sync  s>  € à×Ñ× Ô  DØ�L‰LÐ*Ô+Ø×7Ñ7¸ÓFˆF÷ !ð �JÔØ—‘—” DØ—|‘|Ð$WÐZaÐYcÓd×mÑmÓo�Ø’<Ü&×8Ò8Ð9PÓQÐQØœS  jÕ!1Ó2Ô2Ü&Ð'WÓXÐXð 3÷	 !ð Õ!Ü×+Ò+Ø—‘ gÄ|×GaÑGaôcˆDà'+§x¡x°¸"Ô'=Ó\Ñ'=˜eÄÈEÔSZ×A[—E�EÑ'=ˆDÐ\Ü˜dŸh™h xÓ0×:Ð:°FÓ;ˆKß˜;Ô0Ü"Ð#NÓOÐOØ×"Ñ"×$Ô$¨Ø—‘Ð.Ô/Ü˜dÔ,ØŸ,™,Ð'kØ(/ zó3ß3;±8³:ð à’?Ü&Ð'UÓVÐVÜ�w˜}Õ-Ó.°&Ô8ä  ¨Õ!7Ó8�FØ÷ %Ò$ó "�EØ×%Ñ% dÖ2ñ "äØÐmØ ¤%¨¨R­¯©°\Ó(B×(GÐ(GÀaÓ"HÈ'ÐRÜ Ð!OÓPôR÷ %ð" !‹FØˆ÷G !× Ð ú÷ !—�üò ]÷ %×$ús8   ™#I>Á#AJÄJ&Ä3J&ÆA7J+ÈAJ+É>J	ÊJ#	Ê+J;	c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r3   r(   r¹   r   r)   r   r   )r*   s   "r   r+   rL   <  s&   € ÷ uñ u 3ð u°Cð u¸Nñ ur"   c               ó  € V P                  WR7       V P                  4       ;_uu_ 4       pVP                  RV34      P                  4       pVf   \        P
                  ! R4      h\        VR,          4      p\        VR,          4      pVP                  RW34      P                  4       pVf   \        WVR/ R7      uuRRR4       # \        VR	,          4      pV P                  W1V\        VR
,          4      RR7      p	VP                  RW34      P                  4       p
RRR4       \        XX\        X	4      X
 Uu/ uF(  pX\        VR,          4      3\        VR,          4      bK*  	  upR7      #   + '       g   i     L[; iu upi )z?Return only the oldest active discussion and its watermark set.)r3   r¹   zWSELECT through_seq, stopped_through_seq FROM hosted_room_policy_cursors WHERE room_id=?Nz hosted room checkpoint not foundr   r   zÍSELECT thread_id, discussion_event_id FROM hosted_room_policy_threads
                   WHERE room_id=? AND completed=0 AND latest_user_seq>?
                   ORDER BY latest_user_seq, thread_id LIMIT 1)r   r   r   r   ra   r<   z0active room policy projection exceeded its bound©r3   ra   r<   rp   zxSELECT member_id, seen_through_seq FROM hosted_room_policy_watermarks
                   WHERE room_id=? AND thread_id=?r’   r“   r   )rÇ   rN   r7   r8   r   r9   r   r   r(   rƒ   ry   Útuple)rP   r3   r¹   r1   r³   r   r   Úthreadra   r   Úwatermark_rowsrE   s   &$$         r   ÚsnapshotÚ#HostedRoomPolicyCheckpoint.snapshot<  s“  € à�	‰	˜'ˆ	Ô9Ø×Ñ× Ô  DØ—\‘\ØiÐlsÐkuówßwÑwó  xBð àŠ~Ü"×4Ò4Ð5WÓXÐXÜ˜f ]Õ3Ó4ˆKÜ"% fÐ-BÕ&CÓ"DÐØ—\‘\ð #BàDKÐCaócçckÑckÓcmð ð Š~Ü%Ø +Ð]_Ðlnôp÷ !Ò ô ˜F ;Õ/Ó0ˆIØ×,Ñ,Ø°ÔPSÐTZÐ[pÕTqÓPrØNð -ó PˆFð "Ÿ\™\ð +6Ø8?Ð7KóMßMUÉXËZð ÷# !ô& Ø#Ð9LÔUZÐ[aÓUbÙdrÓsÑdrÐ]`˜¤C¨¨KÕ(8Ó$9Ð:¼CÀÐDVÕ@WÓ<XÒXÑdrÑsôuð 	u÷' !× üò* ts   «BE3ÃAE3Ä=.FÅ3F	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r$   r3   r(   r�   Ústatusr‘   r   r)   Úboolr   )r*   s   "r   r+   rL   V  s8   € ÷ Dñ D¨Sð D¸3ð DÈð DÐcfð DÐkoñ Dr"   c               óâ   € VR8X  d   RWRV 2V33MRW33w  rVV P                  4       ;_uu_ 4       pVP                  WV4      P                  4       RJuuRRR4       #   + '       g   i     R# ; i)zCReturn whether one exact driver outcome is already in the room log.Údeferredz†SELECT 1 FROM hosted_room_policy_publications
                     WHERE room_id=? AND task_id=? AND kind=? AND execution_generation=?zturn.zžSELECT 1 FROM hosted_room_policy_publications
                     WHERE room_id=? AND task_id=? AND kind IN ('turn.settled', 'turn.failed', 'turn.cancelled')N)rN   r7   r8   )rP   r3   r�   rÒ   r‘   ÚsqlÚparamsr1   s   &$$$$   r   Úpublication_existsÚ-HostedRoomPolicyCheckpoint.publication_existsV  s~   € ð ˜Ô#ð\à %¨ xÐ 0Ð2FÐGñIðtàÐð!ñ 	ˆð ×Ñ× Ô  DØ—<‘< Ó,×5Ñ5Ó7¸tÐC÷ !× × Ó ús   ±!AÁA.	Úinput_contextr�   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r$   r3   r(   Úsource_event_seqr   rÚ   zMapping[str, Any] | Noner�   ú
str | Noner)   rq   r   )r*   s   "r   r+   rL   c  s2   € ÷ *;ñ *;¨#ð *;Àð *;Ø'?ð*;à!+ð*;à7Kñ*;r"   c               óP  € V P                  4       ;_uu_ 4       pV P                  WQVR7      pVEey   \        V4      p\        V0VR,          m4      pRP	                  R V 4       4      p	VP                  RV	 R2V.VO54      P                  4       p
\        V
4      \        V4      8w  d   \        R4      hV
 Uu/ uF  p\        VR	,          4      \        V4      bK!  	  ppWÂ,          p\        VR
,          R4      pVR,          R8w  g	   V'       g   \        R4      hVP                  RW34      P                  4       pVe   \        V4      V\        VR	,          4      &   V F  pVV\        VR	,          4      &   K  	  \        V4       Uu. uF  pVV,          NK  	  upuuRRR4       # VP                  R\         R2W34      P                  4       pVe   VR,          R8w  d   VuuRRR4       # \        V4      pV P                  WQ\        VR
,          R4      \        VR,          4      RR7      p. VOVO Uu/ uF  pVR	,          VbK  	  ppVVV&   \        V4       Uu. uF  pVV,          NK  	  upuuRRR4       # u upi u upi u upi u upi   + '       g   i     R# ; i)zCLoad one bounded discussion projection for terminal reconstruction.)r3   r�   NÚ
event_seqsÚ,c              3  ó&   "  € T F  pR x € K	  	  R# 5i)Ú?Nr   )r   Ú_s   & r   r   Ú=HostedRoomPolicyCheckpoint.events_for_task.<locals>.<genexpr>l  s   é € Ð':±T°­³Tùs   ‚z=SELECT * FROM hosted_room_events WHERE room_id=? AND seq IN (z) ORDER BY seqz$admitted task input event is missingrc   rB   ra   r@   rj   z-admitted task source is not a user discussionzºSELECT * FROM hosted_room_events
                    WHERE room_id=? AND kind='message.user' AND json_extract(payload_json, '$.thread_id')=?
                    ORDER BY seq DESC LIMIT 1r?   z2 FROM hosted_room_events WHERE room_id=? AND seq=?rˆ   z)task policy projection exceeded its boundrË   )rN   Ú_published_task_eventsr	   r   Újoinr7   ry   rz   r{   r   rD   r/   r8   rC   rƒ   r(   )rP   r3   rÜ   rÚ   r�   r1   Ú	publishedÚcontextÚseqsÚplaceholdersr�   rE   r   Úsource_eventra   ÚlatestrF   rc   ÚsourceÚby_seqs   &$$$$               r   Úevents_for_taskÚ*HostedRoomPolicyCheckpoint.events_for_taskc  s¦  € ð ×Ñ× Ô  DØ×3Ñ3°DÐSZÐ3Ó[ˆIØÓ(Ü-¨mÓ<�ÜÐ/ÐH°'¸,Õ2GÐHÓI�Ø"Ÿx™xÑ':±TÓ':Ó:�Ø—|‘|Ð&cÐdpÐcqÐqð  %AØ%,Ð$4¨tÑ$4ó6ß6>±h³jð ä�t“9¤ D£	Ô)Ü&Ð'MÓNÐNÙPTÓUÑPTÈœ#˜c %�j›/Ô+?ÀÓ+DÒDÑPT�ÐUØ%Õ7�Ü! ,¨yÕ"9¸;ÓG�	Ø Õ'¨>Ô9ÇÜ&Ð'VÓWÐWàŸ™ð '1à3:Ð2FóHçHPÉË
ð ð Ò%Ü1EÀfÓ1M�Fœ3˜v e�}Ó-Ñ.Û&�EØ05�Fœ3˜u U�|Ó,Ó-ñ 'ä/5°f¬~Ó>©~¨˜˜sŸ˜©~Ñ>÷/ !Ò ð0 —,‘,ØÔ-Ð.Ð.`ÐaØÐ+ó-ç-5©X«Zð ð Š{˜c &�k¨^Ô;Ø ÷9 !Ò ô: *¨#Ó.ˆFØ×,Ñ,Ø´°v¸iÕ7HÈ+Ó1VÜ$'¨¨zÕ(:Ó$;ØGð -ó IˆFð 8M¸Ð7LÀ)Ñ7LÓMÑ7L¨e�e˜E•l EÒ)Ñ7LˆFÐMØ'-ˆFÐ#Ñ$Ü+1°&¬>Ó:©> C�F˜3—K�K©>Ñ:÷M !Ò ùò Vùò ?ùò Nùâ:÷M !× Ð úsV   ™B!JÂ:%J Ã2JÄA9JÆJÆJÆ*<JÇ1A	JÈ:J
ÉJÉ!JÉ3JÊ JÊJ%	c               ó    € V ^8„  d   QhRRRR/# )r$   r3   r(   r)   r4   r   )r*   s   "r   r+   rL   �  s   € ÷ oñ o¨Cð o°Dñ or"   c               ó6  € V P                  4       ;_uu_ 4       pVP                  RV34      P                  4        F+  pVP                  \        V\	        VR,          4      34       K-  	  VP                  RV34       RRR4       R#   + '       g   i     R# ; i)z;Drop any completed projections left by an interrupted sync.zZSELECT discussion_event_id FROM hosted_room_policy_threads WHERE room_id=? AND completed=1r<   zFDELETE FROM hosted_room_policy_threads WHERE room_id=? AND completed=1N)rN   r7   ry   rœ   r(   )rP   r3   r1   rE   s   &$  r   Úcompact_completedÚ,HostedRoomPolicyCheckpoint.compact_completed�  s€   € à×Ñ× Ô  DØ—|‘|ØlÐovÐnxóç‰h‹jò�ð —‘Ô6¸Ä#ÀcÐJ_ÕF`ÓBaÐ8bÖcñð �L‰LÐaÐdkÐcmÔn÷ !× × Ò ús   ™A$BÂB	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r$   r1   r2   r3   r(   r�   rÝ   r)   rq   r   )r*   s   "r   r+   rL   ™  s2   € ÷ ñ à ðð ð	ð
 ðð 
ñr"   c               	ód  a€ S'       g   . # SP                  R 4      pVP                  RVRV 2RV 234      P                  4       pV Uu. uF  p\        V4      NK  	  pp\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   \        R4      hV# u upi )zdtask:zcSELECT * FROM hosted_room_events
               WHERE room_id=? AND event_id IN (?, ?) ORDER BY seqz	dmessage:z
dterminal:c              3  óX   <"  € T F  qR ,          P                  R4      S8g  x € K!  	  R# 5i)rB   r�   N)r.   )r   rF   r�   s   & €r   r   ÚDHostedRoomPolicyCheckpoint._published_task_events.<locals>.<genexpr>©  s$   øé € ÐNÁv¸e�YÕ×#Ñ# IÓ.°'Ö9Ãvùs   ƒ'*TFz'published task receipt identity changed)Úremoveprefixr7   ry   rD   Úanyr{   )rP   r1   r3   r�   Údigestr�   rE   r   s   &&$d    r   rå   Ú1HostedRoomPolicyCheckpoint._published_task_events™  s¨   ø€ ÷ ØˆIØ×%Ñ% hÓ/ˆØ�|‰|ðFà˜	 & Ð*¨j¸¸Ð,AÐBó
÷ ‰(‹*ð	 	ñ
 8<Ó<±t°Ô& sÖ+±tˆÐ<ß‹3ÔNÁvÓN�3�3Š3ÔNÁvÓN×NÒNÜÐHÓIÐIØˆùò =s   Á
B-)rK   )r   r   r   r   r   rR   r[   rN   Ústaticmethodre   rm   rƒ   r‹   r˜   r�   r¡   rd   Úfromkeysr•   r£   r    r¨   r¶   rÇ   rÏ   rØ   rï   ró   rå   r!   r   r"   r   rI   rI   m   sí   ‡ ÙMõ"õrò,ð
 ônó ðnð ðGØimöGó ðGõ$Eõ(Mõ $CõLuõ8ð 	Ð+Ð-=Ð?Vð66à
�-‰-˜Ð)@Ó
Að66àCRÐThØÐ4ñ66€NÐ2ó 6õ
Xõõ2%õNuõ4Dð*;ØBFð*;à.2÷*;õXo÷ñ r"   rI   >   úturn.failedr”   r�   úturn.cancelled)
zÝCREATE TABLE IF NOT EXISTS hosted_room_policy_cursors (
        room_id TEXT PRIMARY KEY, through_seq INTEGER NOT NULL DEFAULT 0,
        stopped_through_seq INTEGER NOT NULL DEFAULT 0, updated_at REAL NOT NULL DEFAULT 0)a  CREATE TABLE IF NOT EXISTS hosted_room_policy_threads (
        room_id TEXT NOT NULL, thread_id TEXT NOT NULL, discussion_event_id TEXT NOT NULL,
        latest_user_seq INTEGER NOT NULL, completed INTEGER NOT NULL DEFAULT 0,
        PRIMARY KEY(room_id, thread_id))z�CREATE INDEX IF NOT EXISTS idx_hosted_room_policy_pending
        ON hosted_room_policy_threads(room_id, completed, latest_user_seq, thread_id)zäCREATE TABLE IF NOT EXISTS hosted_room_policy_events (
        room_id TEXT NOT NULL, thread_id TEXT NOT NULL, discussion_event_id TEXT NOT NULL,
        seq INTEGER NOT NULL, event_json TEXT NOT NULL, PRIMARY KEY(room_id, seq))z‡CREATE INDEX IF NOT EXISTS idx_hosted_room_policy_events_active
        ON hosted_room_policy_events(room_id, discussion_event_id, seq)zâCREATE TABLE IF NOT EXISTS hosted_room_policy_watermarks (
        room_id TEXT NOT NULL, thread_id TEXT NOT NULL, member_id TEXT NOT NULL,
        seen_through_seq INTEGER NOT NULL, PRIMARY KEY(room_id, thread_id, member_id))a  CREATE TABLE IF NOT EXISTS hosted_room_policy_publications (
        room_id TEXT NOT NULL, task_id TEXT NOT NULL, kind TEXT NOT NULL,
        execution_generation INTEGER NOT NULL DEFAULT 0, seq INTEGER NOT NULL,
        PRIMARY KEY(room_id, task_id, kind, execution_generation))zßCREATE TABLE IF NOT EXISTS hosted_room_policy_transcript (
        room_id TEXT NOT NULL, thread_id TEXT NOT NULL, seq INTEGER NOT NULL,
        kind TEXT NOT NULL, settled_seq INTEGER, PRIMARY KEY(room_id, thread_id, seq))zƒCREATE TABLE IF NOT EXISTS hosted_room_policy_transcript_state (
        room_id TEXT PRIMARY KEY, schema_version INTEGER NOT NULL)z­CREATE INDEX IF NOT EXISTS idx_hosted_room_user_thread
       ON hosted_room_events(room_id, json_extract(payload_json, '$.thread_id'), seq)
       WHERE kind='message.user'))r   Ú
__future__r   ru   Úsqlite3Údataclassesr   Úpathlibr   Útypingr   r   r   Úgatewayr   Úgateway.hosted_room_task_inputr	   Úgateway.hosted_rooms_commonr
   r   r   rx   rk   r²   r}   Ú	frozensetr•   rO   Ú_EVENT_COLUMNSrC   rœ   ræ   Úsplitr|   r   Ú_event_from_rowrD   r/   r:   rG   rI   r   r"   r   Ú<module>r     sù   ðñõ #ã Û Ý !Ý ß )Ñ )å  Ý >ß KÑ Kð Ð Ø!Ð ØÐ Ø;Ð?WÐZ[Õ?[Õ\Ð ÙÒ^Ó_€ð €ðD #×1Ñ1Ð ØnÐ ðð
 �I‰IÑWÐ7J×7PÑ7PÐQUÔ7VÓWÓWÐXð Y ð#Ð ñ �$Ô÷.ð .ó ð.ð $×3Ñ3Ð õ'õFõ
÷~ó ~r"   