+
    jHàjâs  ã                   óÀ  a € R* t!0 t R t^ RIt^ RIt^ RIt^ RIHt ^ RIt^ RIH	t	 ]P                  ! ]4      tRRRRRRRRR	R
RR
RR
RRRRRRRR
RR
RR
RR/tR]! 4       R0 R+mRRR0R0 R,mR	0 R-mR0 R.mRRR0R0 R/mR0 R0mR0 R1mRRR0R0 R2mR0 R2mR0 R3mRR0/tR tRR/R ltR tR t]P(                  ! 4       tR! tR" tR# tR$ tR4R% lt/ t] ^ k / t] ^k R& tR' tR( tR) t R# )5z>Profile-owned room controls over the canonical hosted service.N)ÚPath)ÚRuntimeStoreErrorúgroups.capabilitiesúsession:readúgroups.listúgroups.stateú
groups.logúgroups.createzsession:controlúgroups.renameúgroups.disbandúgroups.sendzsession:submitúgroups.attachment.uploadúgroups.attachment.downloadúgroups.stopúgroups.retryúgroups.discardúgroups.approvezsession:approveÚinclude_disbandedÚroom_idÚ	cancel_idúprofiles.listÚinclude_sessionsc              ƒ   óŽ  a aa
aaaa"  € S P                   S P                  uoo
\        P                  SR 4      pVS
P                  9  d   \        R4      hS
P                  SP                  8w  d   \        R4      hS\        9  gB   \        V\        4      '       d,   \        V4      \        S,          R0,          ,
          '       d   \        R4      h\        SP                  4      o\        P                  ! \        SP                  P                  4      P                   4      G Rj  x€L
 pVP"                  \        P                  ! SP                   4      G Rj  x€L
 8w  d   \        R4      h^ RIHp VP                  R4      pVe"   \        V\(        4      '       g   \        R4      hV'       d   V! VS4      '       g   \        R4      hVP+                  4        UUu/ uF  w  rxVR8w  g   K  WxbK  	  uppoSR8X  d   \-        S S4      MR	oV
VV VVVV3R lp	\        P                  ! V	4      G Rj  x€L
 #  EL Làu uppi  L5i)
r   Úpermission_deniedÚprofile_mismatchÚprofileÚinvalid_paramsN)Úprofile_matches_homer   c            
      ó¦  <€ ^ RI Hp  ^ RIHp V ! S4      ;_uu_ 4        SR8X  d   \	        SSSS	S4      uuRRR4       #  \        SSSS	SP                  R7      uuRRR4       #   \         d    h T d'   p\        \        TRR4      ;'       g    R4      ThRp?i\        \        3 d   p\        R4      ThRp?ii ; i  + '       g   i     R# ; i)é    )Ú_profile_runtime_scope)ÚHostedRoomErrorr   N)Ú
host_scopeÚreasonr   )Úgateway.runr    Úgateway.hosted_roomsr!   Ú	_profilesÚ_groupÚhost_scopedr   ÚgetattrÚ
ValueErrorÚ	TypeError)
r    r!   ÚexcÚactorÚ	authorityÚ
connectionÚhomeÚmethodÚsiblingsÚsupplieds
      €€€€€€€ÚC/home/ubuntu/.hermes/hermes-agent/gateway/session_group_controls.pyÚinvokeÚ&dispatch_group_control.<locals>.invokeG   sÀ   ø€ Ý6Ý8Ù# D×)Õ)Ø˜Ô(Ü  ¨E°4¸À8ÓL÷ *Ò)ðCÜ˜i¨°¸ÈZ×McÑMcÔd÷	 *Ò)øô
 %ô ØØ"ô cÜ'¬°°X¸tÓ(D×(XÐ(XÐHXÓYÐ_bÐbûÜ¤	Ð*ô CÜ'Ð(8Ó9¸sÐBûðCú÷ *×)Ð)úsA   žB?Á A$Á$B<Á5B<Á6!BÂB<Â*B<Â+B7Â7B<Â<B?Â?C	© )r.   r-   ÚGROUP_METHODSÚgetÚcapabilitiesr   Ú
profile_idÚ_FIELDSÚ
isinstanceÚdictÚsetr   ÚasyncioÚ	to_threadÚdbÚdb_pathÚresolveÚparentÚhermes_cli.profilesr   ÚstrÚitemsÚ_roster_siblings)r/   r1   ÚparamsÚ
capabilityrC   r   r   ÚkeyÚvaluer5   r-   r.   r0   r2   r3   s   ff&       @@@@@r4   Údispatch_group_controlrN   1   sÇ  þé € Ø!×+Ñ+¨Z×-=Ñ-=Ð€IˆuÜ×"Ñ" 6¨>Ó:€JØ˜×+Ñ+Ô+ÜÐ 3Ó4Ð4Ø×Ñ˜9×/Ñ/Ô/ÜÐ 2Ó3Ð3Ø”WÔ¤J¨v´t×$<Ò$<ÄÀFÃÌwÐW]ÍÐbkÐalÕOl×@mÔ@mÜÐ 0Ó1Ð1Ü�	×$Ñ$Ó%€DÜ×%Ò%¤d¨9¯<©<×+?Ñ+?Ó&@×&HÑ&HÓI×I€GØ‡~�~œw×0Ò0°·±Ó>×>Ô>ÜÐ 2Ó3Ð3Ý8Ø�j‰j˜Ó#€GØÒ¤:¨g´s×#;Ò#;ÜÐ 0Ó1Ð1ßÑ+¨G°T×:Ò:ÜÐ 2Ó3Ð3Ø-3¯\©\¬^ÔP©^™z˜s¸sÀiÑ?O”
�’
©^ÒP€HØ9?À?Ô9RÔ 
¨HÔ5ÐXZ€H÷Có Cô ×"Ò" 6Ó*×*Ð*ò5 JÙ>ùó Qñ" +ùsU   ‰DIÄ'H8Ä(2IÅH;ÅAIÆ2IÇIÇH=Ç/H=Ç5>IÈ3IÈ4IÈ;IÈ=Ir"   Fc                ó&  a aaaaaaaaa€ ^ RI Ho S P                  P                  oSP	                  4       o\        S RR4      o\        SRR4      oSe•   \        SP                  4      P                  4       \        S4      P                  4       8w  d   \        R4      hSP                  P                  4       pVP                  R4      '       d   VP                  R4      '       d   Ro0 RmpRo\        S RR4      eA   RS9   d:   Sf   \        R	4      hVR
8X  d
   VVV3R loMS! SP                  SR,          4       VR9   d-   Sf   \        R4      h^ RIHpHp VR8X  d   TMTp	V	! SSS4      # W&9   d?   Sf   \        R4      hSP                  R4      '       g   \        R4      h\!        SVS4      # V VVVV3R lp
VV VVVV3R lpVV VVVVVV3R lpVVVVV3R lpVVVV3R lpRV
RVR
VRVRVVV3R lRVVV3R lRV/pWò,          ! 4       # )r   )Úhosted_roomsÚhosted_room_serviceNÚauthorize_roomr   ÚrunningÚstoppingr   r   r	   c                 óB   <€ S! SP                   SR ,          RV R7       R# )r   T)ÚcreateÚconnN)Úsubject)rW   r-   rJ   Úroom_authorizers   &€€€r4   ÚadmitÚ_group.<locals>.admitm   s   ø€ Ù §¡¨v°iÕ/@ÈÐTX×Yó    r   Úruntime_coordination_required)ÚuploadÚdownloadr   c                  óÌ   <a€ ^ RI Hp  V ! SSR7      w  poRSP                  RSRJRRRSR	R
RRR/R. ROR\        \        4      RSP
                  R\        V3R lV 4       4      /	# )r   )Úmember_roster©r2   Úprotocol_versionÚdriverNÚpersistent_processTÚauthority_gateway_idÚ	room_linkÚenabledFr#   Úcanonical_driver_requiredÚfeaturesÚmethodsÚmax_log_limitÚseatable_profilesc              3   ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5i©Nr7   )Ú.0ÚnameÚrefuseds   & €r4   Ú	<genexpr>Ú/_group.<locals>.capabilities.<locals>.<genexpr>ˆ   s   øé € Ð+Z¹U°TÐRYÑFY¯DªD»Uùs   ƒ�
)Úroom_identityÚmonotonic_logÚreplayable_disband)Úgateway.session_hosted_membersra   ÚPROTOCOL_VERSIONÚlistr8   ÚMAX_LOG_LIMITÚsorted)ra   Úhomesrr   r.   Ú
gateway_idr"   ÚroomsÚservices     @€€€€€r4   r:   Ú_group.<locals>.capabilities~   s|   ù€ Ý@ñ ' y¸:ÔF‰ˆˆwØ" E×$:Ñ$:¸HÀgÐUYÐFYØ$ dÐ,BÀJØ˜i¨°Ð:UÐVØÒTØœ4¤Ó.°À×ATÑATØ#¤VÔ+Z¹UÓ+ZÓ%Zð\ð 	\r\   c                  ó  <a	€ SP                  R SP                  4      SP                  R^ 4      r\        SRR4      f3   SP                  ! S3/ SB pRTR\	        V4      V 8X  d
   W,           /# R/# So	S	f   \        R4      hV
V	3R lp. TRrepVfr   SP                  ! S3/ / SCRV/CB pV F?  pV! V4      '       d&   \	        V4      V 8X  d   Tp MVP                  V4       V^,          pKA  	  \	        V4      V 8  g   Kt   RVRV/# )ÚlimitÚoffsetrQ   Nr   Únext_offsetr   c                 ó”   <€  S! SP                   V R ,          4       R#   \         d   pTP                  R8w  d   h  Rp?R# Rp?ii ; i)r   r   NFT)rX   r   r#   )Úroomr,   r-   Ú	authorizes   & €€r4   ÚvisibleÚ(_group.<locals>.listing.<locals>.visible“   sD   ø€ ðÙ˜%Ÿ-™-¨¨i­Ô9ñ
 øô	 %ô Ø—:‘:Ð!4Ô4ØÝûðús   ƒ ŸAªAÁA)r9   ÚMAX_ROOM_LIST_LIMITr)   Ú
list_roomsÚlenr   Úappend)rƒ   r„   Úresultr‰   ÚfoundÚcursorr…   Úbatchr‡   rˆ   r-   r.   rC   rJ   rY   r   s            @€€€€€€r4   ÚlistingÚ_group.<locals>.listingŠ   s   ù€ ØŸ
™
 7¨E×,EÑ,EÓFÈÏ
É
ÐS[Ð]^ÓH_ˆvÜ�9Ð3°TÓ:ÒBØ×%Ò% gÑ8°Ñ8ˆFØ˜V ]ÄcÈ&ÃkÐUZÔFZ°FµNÐeÐeÐ`dÐeÐeØ#ˆ	ØÒÜ#Ð$7Ó8Ð8ö	ð &(¨°�{ˆØÒ!Ø×$Ò$ WÑMÐ0L°6Ð0L¸8ÀVÑ0LÑMˆEÛ�Ù˜4—=’=Ü˜5“z UÔ*Ø&,˜ÙØ—L‘L Ô&Ø˜!•’ñ ô �5‹z˜EÖ!ØØ˜ ¨{Ð;Ð;r\   c                  óŒ  <€ ^ RI Hp Hp ^ RIHpHp V! SSR7      w  rEV! SP                  R4      V4        V! SP                  R4      VR7      pSe   RSP                  ! R/ SBRS
/B /#  T Uu. uFj  pRTP                  RTP                  RTP                  R\        TP                  ;'       g    / 4      /TP                  '       d   RTP                  /M/ CNKl  	  p	pRSP                  SSP                  R4      SP                  R4      T	SS
R7      /#   T  d   p\        R	R\        T4      R
7      ThRp?ii ; iu upi )r   )ÚDiscussionValidationErrorÚvalidate_roster)ra   Úrefuse_unseatablerb   Úmembers)Úlocal_profilesNr‡   rZ   r   )ÚfieldÚdetailÚ	member_idr   ÚhandleÚtargetÚdisplay_namer   rq   )r   rq   r™   rf   rZ   r7   )Úgateway.hosted_room_discussionr–   r—   rx   ra   r˜   r9   Úcreate_roomr   rG   r�   r   rž   r>   rŸ   r    )r–   r—   ra   r˜   r}   rr   r™   r,   ÚmÚ
normalizedrZ   r.   rC   r~   r"   rJ   r   r€   s             €€€€€€€€r4   rV   Ú_group.<locals>.create­   sZ  ø€ ß]ßSñ
 ' y¸:ÔF‰ˆÙ˜&Ÿ*™* YÓ/°Ô9ð	aÙ% f§j¡j°Ó&;ÈEÔRˆGØÒ"Ø × 3Ò 3Ñ J°fÑ JÀEÒ JÐKÐKð #ñ ahóiá`gÐ[\ð # A§K¡K°¸A¿I¹IÀxÐQR×QYÑQYØ¤ a§h¡h§n n°"Ó!5ðWà>?¿n¿n¸n˜>¨1¯>©>Ñ:ÐRTóWá`gð 	ð ið ˜×)Ñ)¨'¸6¿:¹:ÀiÓ;PØ—Z‘Z Ó'°ÐR\Øð *ó ð ð 	øð )ô 	aä#Ð$4¸IÌcÐRUËhÔWÐ]`Ð`ûð	aüòis*   ·4D Á1AEÂ3EÃEÄD>Ä!D9Ä9D>c                  ó„  <a€ ^ RI Ho SP                  SSP                  R4      RR7      p Sep   V P                  R4      f]   SP	                  SP                  R4      SP                  R4      ;'       g    RRR7       SP                  SP                  R4      4       SfP   \        ;QJ d!    VVV3R	 lR 4       F  '       g   K   RM	  R
M! VVV3R	 lR 4       4      '       d   \        R4      hSP                  SSP                  R4      RR7      p RSP                  SSP                  R4      SV R,          R7      /# )r   )Ú
list_tasksr   T)r   r   Údisbanded_atr   zroom-disbanded)r   Úrequire_acknowledgedc              3   óX   <"  € T F  pS! SSP                  R 4      VR7      x € K!  	  R# 5i)r   )r   ÚstatusN)r9   )rp   r«   rC   r§   rJ   s   & €€€r4   rs   Ú*_group.<locals>.disband.<locals>.<genexpr>Í   s/   øé € ð #]Ù[�6ñ $.¨g¸v¿z¹zÈ)Ó?TÐ]c×#dÑ#dÛ[ùs   ƒ'*Fr]   Ú	tombstoneÚauthority_epoch)r   Úexpected_gateway_idÚexpected_epoch)ÚqueuedrS   rT   ÚindeterminateÚdeferred)	Úgateway.hosted_room_driverr§   Ú
room_stater9   Ú	stop_roomÚrevoke_room_routesÚanyr   Údisband_room)Ústater§   rC   r~   rJ   r   r€   s    @€€€€€r4   ÚdisbandÚ_group.<locals>.disbandÄ   s*  ù€ Ý9Ø× Ñ  °&·*±*¸YÓ2GÐ[_Ð Ó`ˆØÒ 5§9¡9¨^Ó#<Ò#DØ×Ñ˜fŸj™j¨Ó3Ø(.¯
©
°;Ó(?×(SÐ(SÐCSØ37ð ô 9ð ×&Ñ& v§z¡z°)Ó'<Ô=àŠ?Ÿs›sö #]Ù[ó#]ŸsŸsšsö #]Ù[ó#]÷  ]ò  ]ä#Ð$CÓDÐDØ× Ñ  °&·*±*¸YÓ2GÐ[_Ð Ó`ˆØ˜U×/Ñ/°ÀÇÁÈIÓAVØ$.¸uÐEVÕ?Wð 0ó Yð Zð 	Zr\   c                  óš   <€ SP                   ! S3/ SB p R V /pSe/   V P                  R4      f   SP                  V R,          4      VR&   V# )r‡   r¨   r   Údriver_status)rµ   r9   r«   )r‡   r�   rC   rJ   r   r€   s     €€€€r4   rº   Ú_group.<locals>.stateÔ   sQ   ø€ Ø×Ò Ñ2¨6Ñ2ˆØ˜$�ˆØÒ 4§8¡8¨NÓ#;Ò#CØ&-§n¡n°T¸)µ_Ó&EˆF�?Ñ#Øˆr\   r   r   r   r   c                  ó*   <€ SP                   ! S 3/ SB # ro   )Úread_events©rC   rJ   r   s   €€€r4   Ú<lambda>Ú_group.<locals>.<lambda>à   s   ø€ ˜e×/Ò/°ÑB¸6ÒBr\   r
   c                  ó.   <€ R SP                   ! S 3/ SB /# )r‡   )Úrename_roomrÂ   s   €€€r4   rÃ   rÄ   á   s   ø€  &¨%×*;Ò*;¸GÑ*NÀvÑ*NÑ!Or\   r   >   r   r   r   r   r   >   r   r   )ÚgatewayrP   rB   rC   Úlocal_authority_gateway_idr)   r   rD   r   Úruntimer«   r9   rX   Ú"gateway.session_hosted_attachmentsr^   r_   Ú_execution_control)r.   r-   r1   rJ   r"   r«   Úexecution_methodsr^   r_   Úhandlerr:   r“   rV   r»   rº   ÚhandlersrZ   rC   r~   rY   r   r€   s   ff&fd           @@@@@@r4   r'   r'   X   sü  ÿù€ Ý-Ø�l‰l×"Ñ"€GØ×1Ñ1Ó3€JÜ�iÐ!6¸Ó=€GÜ˜gÐ'7¸Ó>€OØÒÜ�—‘Ó ×(Ñ(Ó*¬d°7«m×.CÑ.CÓ.EÔEÜ#Ð$6Ó7Ð7Ø—‘×'Ñ'Ó)ˆØ�z‰z˜)×$Ò$¨¯
©
°:×(>Ò(>ØˆGâjÐØ€EÜˆyÐ/°Ó6ÒBÀyÐTZÔGZØÒ"Ü#Ð$7Ó8Ð8Ø�_Ô$÷Zð Zñ ˜EŸM™M¨6°)Õ+<Ô=ØÐKÔKØŠ?Ü#Ð$CÓDÐDßGØ"Ð&@Ô@‘&ÀhˆÙ�w  vÓ.Ð.ØÔ"ØŠ?Ü#Ð$CÓDÐDØ�z‰z˜)×$Ò$Ü#Ð$4Ó5Ð5Ü! '¨6°6Ó:Ð:÷
\ñ 
\÷!<ò !<÷Fô ÷.Zñ Z÷ ð ð 	˜|Ø�wØ˜Ø˜ØÖBØÖOØ˜'ð€Hð ÖÓÐr\   c           
      ór   a aa€ VV 3R  lpVVV 3R lpVV 3R lpRVRVV 3R lRVRVRV/pVS,          ! 4       # )	c                  óÐ   <€ ^ RI Hp  SP                  SP                  R4      V ! SP                  R4      4      SP                  R4      R7      pRVRSP                  R4      RR	R
R	/# )r   )Úuser_event_idr   Úevent_idÚpayload)r   rÒ   rÓ   ÚeventÚclient_event_idÚacceptedTÚdriver_started)r%   rÑ   Úsendr9   )rÑ   rÔ   rJ   r€   s     €€r4   rØ   Ú _execution_control.<locals>.sendè   sj   ø€ Ý6Ø—‘ V§Z¡Z°	Ó%:Ù&3°F·J±J¸zÓ4JÓ&KØ%+§Z¡Z°	Ó%:ð ó <ˆð ˜Ð 1°6·:±:¸jÓ3IØ˜DÐ"2°Dð:ð 	:r\   c                  óê  <€ \        SP                  R 4      4      \        Jg=   SR ,          ^8  g/   SP                  R4      '       d   SP                  R4      '       g   \        R4      hSR8X  d   SP                  MSP
                  p V ! R
/ SB pVR,          pR Uu/ uF  q3\        W#4      bK  	  ppTP                  R Uu/ uF  q3W,          bK  	  up4       SR8X  d   RMRRR	V/# u upi u upi )Úexecution_generationr�   Útask_idr   r   ÚidentityÚ	discardedÚretriedTÚtaskr7   )r   rÜ   Ú	thread_idÚturn_id)r«   rÛ   Úcancel_generation)Útyper9   Úintr   Údiscard_room_taskÚretry_room_taskr)   Úupdate)Ú	operationrà   rÝ   r›   Úreceiptr1   rJ   r€   s        €€€r4   Úattempt_controlÚ+_execution_control.<locals>.attempt_controlð   s  ø€ Ü�—‘Ð2Ó3Ó4¼CÓ?ØÐ0Õ1°AÔ5Ø—z‘z +×.Ò.°f·j±jÀ×6KÒ6KÜ#Ð$4Ó5Ð5Ø17Ð;KÔ1K�G×-Ò-ÐQX×QhÑQhˆ	ÙÑ"˜6Ñ"ˆØ˜
Õ#ˆáAóCÙAð 8=œ' (Ó2Ò2ÙAð 	ð Cà�‰ÙOóQÙOð 05˜t�{Ò*ÙOñQô 	Rà%Ð)9Ô9‘¸yÈ$ÐPVÐX_Ð`Ð`ùò	CùòQs   ÂC+ÃC0c                  ó:  <€ \        S P                  R 4      4      \        JgY   S R ,          ^8  gK   S P                  R4      R9  g5   \        S P                  R4      \        4      '       d   S R,          '       g   \        R4      hRRRSP                  ! R/ S B /# )	rÛ   ÚchoiceÚ
request_idr   ÚapprovedTr�   >   ÚdenyÚoncer7   )rä   r9   rå   r=   rG   r   Úapprove_room_task©rJ   r€   s   €€r4   ÚapproveÚ#_execution_control.<locals>.approveþ   sƒ   ø€ Ü�—‘Ð2Ó3Ó4¼CÓ?ØÐ0Õ1°AÔ5Ø—:‘:˜hÓ'Ð/?Ô?Ü! &§*¡*¨\Ó":¼C×@Ò@ÈÈ|×H\ÔH\Ü#Ð$4Ó5Ð5Ø˜D (¨G×,EÒ,EÑ,OÈÑ,OÐPÐPr\   r   r   c                  ó~   <€ R SP                  S P                  R4      S P                  R4      ;'       g    RR7      /# )Ú	cancelledr   r   zdesktop-stop)r   )r¶   r9   rô   s   €€r4   rÃ   Ú$_execution_control.<locals>.<lambda>  s=   ø€  ¨W×->Ñ->Ø�J‰J�yÓ!¨V¯Z©Z¸Ó-D×-VÐ-VÈð .?ó .Xñ  Yr\   r   r   r   r7   )r€   r1   rJ   rØ   rë   rõ   rÎ   s   fff    r4   rË   rË   ç   sJ   ú€ ö:÷aöQð 	�tØõ Yà˜Ø˜/Ø˜'ð€Hð �FÖÓÐr\   z_(chat_id LIKE 'local-%' OR EXISTS (SELECT 1 FROM state_meta WHERE key = ? || sessions.chat_id))c           
     óê  € ^ RI Hp ^ RIHp V P                  V P
                  rT\        \        VRR4      RR4      f   . # V P                  ;'       d    VP                  RR4      RJ pV! VP                  4       Uu. uFk  qwP                  VJg   K  TV'       dL   VP                  f>   V! VP                  VP                  P                  VP                  VP                  4      MR3NKm  	  up# u upi )a·  The other local bots this process serves (``session_authorities.local_bots``, the set group
seating uses too), as ``[(bot, reader)]``, snapshotted on the owner loop, where serve and
unserve mutate the registry; an unbuilt slot is skipped. ``reader`` is the principal that row's
session fields are read as, or None for a metadata-only row: only a host-scoped socket routes
session verbs to a sibling (``AuthorityConnection._sibling_for``), and only a bot addressable
by its own name (no ``problem``) is the one a click on its row opens. It carries this socket's
subject and capabilities, which is what the routed connection would carry; none is built, so
no poll (routed or not) adds connections.)Ú
local_bots)Ú	PrincipalÚrunnerNÚsession_authoritiesr   T)Úgateway.session_authoritiesrû   Úgateway.session_contractrü   r.   r-   r)   r(   r9   rý   ÚproblemrX   r;   r:   Útransport_id)r/   rJ   rû   rü   r.   r-   ÚreadableÚbots   &&      r4   rI   rI     sà   € õ 7Ý2Ø!×+Ñ+¨Z×-=Ñ-=ˆuÜŒw�y (¨DÓ1Ð3HÈ$ÓOÒWØˆ	Ø×%Ñ%×VÐV¨&¯*©*Ð5GÈÓ*NÐRVÐ*V€Hñ " )×"2Ñ"2Ô3óWá3�·}±}ÈIÐ7Uô<ˆSß˜SŸ[™[Ò0ñ ˜EŸM™M¨3¯=©=×+CÑ+CÀU×EWÑEWÐY^×YkÑYkÔlØ6:ó<á3ñWð Wùò Ws   Á<C0ÂC0ÂAC0c                ó¸   a aa€ ^ RI Hp RSP                  9   oV! \        S P                  P
                  4      P                  SP                  S3VV V3R l4      # )a¸  A roster row's session fields, read from *authority*'s own store as *actor*: the exact
"Bot Chat" title (the status dot's session and the row's age) and the newest visible local
conversation, each only when the actor owns it or holds operator access. Reused while the
store has not moved, as the pre-unified roster did (#117257): every connection polls every 5 s.
Discovery is read-only: no legacy restore/unarchive or new SessionDB handle.)Úcached_reader_session_fieldszsession:operatorc                  óF   <€ \        SP                  S P                  S4      # ro   )Ú_read_bot_sessionsrB   rX   )r-   r.   Úoperators   €€€r4   rÃ   Ú_bot_sessions.<locals>.<lambda>:  s   ø€ Ô0BÀ9Ç<Á<ÐQV×Q^ÑQ^Ð`hÔ0ir\   )Ú tui_gateway.profile_roster_cacher  r:   r   rB   rC   rE   rX   )r.   r-   r  r	  s   ff @r4   Ú_bot_sessionsr  1  sN   ú€ õ NØ! U×%7Ñ%7Ñ7€HÙ'¬¨Y¯\©\×-AÑ-AÓ(B×(IÑ(IÈEÏMÉMÐ[cÐKdÞ(iókð kr\   c                 ó  a a€ ^ RI Hp ^ RIHp RP	                  R\        V4      ,          4      pV'       d   RMRV33w  rgS P                  RR7      ;_uu_ 4       oVV 3R	 lpR
RRRRR/p	SP                  R\         2RV34      P                  4       p
V
'       d1   V
R,          V8X  g	   V'       d   V
R,          '       g   V! V
4      V	R&   SP                  RV \         RV R2. VOVNVO54      P                  4       pV'       d;   V	R,          '       d,   VR,          V
R,          8X  d   \        V	R,          4      V	R
&   MV'       d   V! V4      V	R
&   SP                  RV R2V4      P                  4       pV'       dd   RVR,          RVR,          ;'       g    RP                  4       P                  4       RVR,          ;'       g    RRVR,          ;'       g    ^ /V	R&   RRR4       V	#   + '       g   i     X	# ; i)r   )ÚLEGACY_PREFIX)ÚINTERNAL_LISTING_SOURCESÚ,Ú?Ú zuser_id=? AND F)Úreopenc                 ó’  <€ SP                  SV R ,          4      pSP                  RV34      P                  4       ;'       g    T pSP                  RV34      P                  4       pV'       d:   RP                  \	        V^ ,          ;'       g    R4      P                  4       4      MRpR V R ,          RTRVR,          ;'       g    RRV R,          ;'       g    RR\        V4      ^P8”  d   VR	,          R
,           MTRVR,          ;'       g    ^ RVR,          ;'       g    VR,          ;'       g    ^ RVR,          ;'       g    ^ /# )Úidz!SELECT * FROM sessions WHERE id=?z™SELECT content FROM messages WHERE session_id=? AND active=1 AND role IN ('user','assistant') AND TRIM(COALESCE(content,''))!='' ORDER BY id DESC LIMIT 1Ú r  Úresolved_idÚtitleÚ
root_titleÚpreview:NéP   Nz...Ú
started_atÚlast_activeÚlast_activity_atÚmessage_count)Ú_compression_tip_onÚexecuteÚfetchoneÚjoinrG   Úsplitr�   )ÚrootÚtiprŸ   ÚmessageÚtextrW   rB   s   &    €€r4   ÚsummaryÚ#_read_bot_sessions.<locals>.summaryE  s+  ø€ Ø×(Ñ(¨¨t°D­zÓ:ˆCØ—\‘\Ð"EÈÀvÓN×WÑWÓY×aÐaÐ]aˆFØ—l‘lð+à-0¨Fó4÷ 5=±H³Jð ÷ ?F�3—8‘8œC ¨¥
× 0Ð 0¨bÓ1×7Ñ7Ó9Ô:È2ˆDØ˜$˜t�* m°S¸'À6È'Å?×CXÐCXÐVXØ  $ w¥-×"5Ð"5°2Ø´C¸³IÀ´N˜t C�y¨5Ö0ÈØ  &¨Õ"6×";Ð";¸!Ø! 6Ð*<Õ#=×#ZÐ#ZÀÈÕAU×#ZÐ#ZÐYZØ# V¨OÕ%<×%AÐ%AÀðCð Cr\   Úlast_sessionNÚworker_sessionÚcanonical_sessionz)SELECT * FROM sessions WHERE title=? AND zBot ChatÚuser_idÚarchivedzSELECT * FROM sessions WHERE z= AND archived=0 AND hidden=0 AND COALESCE(source,'') NOT IN (z=) ORDER BY COALESCE(last_activity_at,started_at) DESC LIMIT 1r  z|SELECT id, source, title, COALESCE(last_activity_at, started_at) AS last_active FROM sessions WHERE COALESCE(source,'') IN (z?) AND archived=0 AND hidden=0 ORDER BY last_active DESC LIMIT 1Úsourcer  r  )r  r7   )Úhermes_state_local_migrationr  Úhermes_state_sessionsr  r#  r�   Ú	_read_ctxr!  Ú_LOCAL_CHATr"  r>   ÚstripÚlower)rB   rX   r	  r  r  Úhidden_sourcesÚowner_filterÚowner_paramsr)  ÚfieldsÚ	canonicalÚlatestÚworkerrW   s   f&&          @r4   r  r  =  s  ù€ Ý:Ý>Ø—X‘X˜c¤CÐ(@Ó$AÕAÓB€Nß-5¡Ð<LÈwÈjÐ;YÑ€Lð 
�‰˜Uˆ×	#Ô	# tö	Cð '¨Ð.>ÀÐFYÐ[_Ð`ˆà—L‘LÐ#LÌ[ÈMÐ!ZØ",¨mÐ!<ó>ß>F¹h»jð 	ç˜) IÕ.°'Ô9¿XÈyÐYc×OdÔOdÙ*1°)Ó*<ˆFÐ&Ñ'ð —‘Ø+¨L¨>¼+¸ð G/Ø/=Ð.>ð ?JðJð FˆlÐE˜MÐEÐ,DÑEó	G÷ HPÁxÃzð	 	÷
 �fÐ0×1Ô1°f¸TµlÀiÐPTÅoÔ6UÜ%)¨&Ð1DÕ*EÓ%FˆF�>Ò"ßÙ%,¨V£_ˆF�>Ñ"ð —‘ð-Ø-;Ð,<ð =0ð0à1IóK÷ LTÉ8Ë:ð 	÷ Ø(,¨f°T­l¸HÀvÈhÕGW×G]ÐG]Ð[]×FdÑFdÓFf×FlÑFlÓFnØ(/°¸µ×1FÐ1FÀBÈÐW]Ð^kÕWl×WqÐWqÐpqð(sˆFÐ#Ñ$÷W 
$ðZ €M÷[ 
$Ö	#ðZ €MúsD   ÁAG.Â2G.ÃAG.ÄG.Ä2G.Å
6G.ÆG.Æ.G.Ç
G.ÇG.Ç.G?	c                óp  € V P                   '       g   V P                  '       d   / #  \        W4      p\        P                  T 4       T#   \         da   pT \        9   d   \
        P                  M\
        P                  p\        P                  T 4       T! RT P                  T4       / u Rp?# Rp?ii ; i)aY  A sibling row's session fields. A retiring sibling is not read: unserve marks it before it
closes the store, and this runs right before the read (a close that still lands mid-read is
refused by ``reopen=False``). Any failure leaves only that row metadata-only, as the
pre-unified roster degraded per profile, instead of failing the whole roster.zGBots roster: %s is metadata-only, its session store did not answer (%s)N)ÚretiringÚretiredr  Ú	ExceptionÚ	_DEGRADEDÚloggerÚdebugÚwarningÚaddr;   Údiscard)r.   Úreaderr:  r,   Úlogs   &&   r4   Ú_sibling_sessionsrJ  t  s’   € ð
 ××Ð˜Y×.×.Ð.Øˆ	ðÜ˜yÓ1ˆô ×Ñ�iÔ Ø€Møô ô Ø'¬9Ô4Œf�lŠl¼&¿.¹.ˆÜ�‰�iÔ ÙÐUÐW`×WkÑWkÐmpÔqØ�	ûð	ús   ¨A
 Á
B5ÁAB0Â*B5Â0B5c                ó”  aaaa€ ^ RI Hp ^ RIpVP                  RR4      o\	        S4      \
        Jd   \        R4      h^ RIHp V! S4      pV! VSVR8H  R7      p	R	TR
\        S4      RV	P                  RV	P                  RV	P                  RV	P                  ;'       g    RRV	P                  ;'       g    RRV	P                  ;'       g    ^ /p
SR,          pVP!                  4       '       d"   VP#                  VP%                  RR7      4      M/ p\'        V\(        4      '       d   TM/ pVP                  R4      p\'        V\(        4      '       dN   VP+                  4        UUu/ uF0  w  rï\	        V4      \,        J g   K  \        V4      \/        ^ V4      bK2  	  uppM/ V
R&   \'        VP                  R4      \(        4      '       d   VR,          V
R&   \0        ;QJ d    V3R lR" 4       F  '       g   K   RM	  RM! V3R lR" 4       4      V
R&   S'       d   V
P3                  \5        W4      4       V
.oSP7                  4       0oR#VVV3R llpV F<  w  ppT! V! VP8                  4      VP8                  Ve   VP:                  V3MR4       K>  	  \=        V RR4      pVe2   VP?                  4       P+                  4        F  w  ppV! VV4       K  	  ^ RI H p V! 4       pVPC                  4       '       d
   V! RV4       \E        4        F  pV! VPF                  V4       K  	  ^ RI$H%p RSR RR!V! 4       ;'       g    R/# u uppi )$z­The Bots roster: this profile's row, then every profile it can name. ``siblings`` is
``_roster_siblings``' snapshot; a sibling with a reader carries the same session fields.)Ú_profile_infoNr   Tr   )Úserved_profile_nameÚdefault)Ú
is_defaultrq   ÚpathrO  ÚmodelÚproviderÚdescriptionr  r    Úskill_countúprofile.yamlú	utf-8-sig)ÚencodingÚ_ui_meta_revisionsÚui_meta_revisionsÚui_metac              3   óf   <"  € T F&  pSR ,          RV 2,          P                  4       x € K(  	  R# 5i)Úassetszavatar.N)Úis_file)rp   Úextr0   s   & €r4   rs   Ú_profiles.<locals>.<genexpr>�  s.   øé € ÐlÑUkÈc˜T H�_°¸¸¨Õ>×GÑG×IÐIÓUkùs   ƒ.1FÚ
has_avatarc                 ó  <€ VP                  4       S9   d   R # SP                  VP                  4       4       RV R\        V4      RV R8H  RRRRRRR	V R
^ /pS'       d   Ve   VP                  \	        V!  4       \        WR,          4      p\        V\        4      '       dY   \        VP                  R	4      ;'       g    T 4      VR	&   \        VP                  R4      \        4      '       d   VR,          VR&   SP                  V4       R # )Nrq   rP  rO  rN  rQ  r  rR  rS  r    rT  rU  rZ  )
rD   rF  rG   rè   rJ  Ú_discovered_profile_metar=   r>   r9   rŽ   )Ú
configuredrŸ   ÚreachÚentryÚmetar   ÚprofilesÚseens   &&&  €€€r4   Ú
discoveredÚ_profiles.<locals>.discovered£  sç   ø€ ð �>‰>Ó˜tÔ#ÙØ�‰�—‘Ó!Ô"Ø˜ V¬S°«[¸,È
ÐV_ÑH_Ø˜"˜j¨"¨m¸RÀÐQ[Ø ð#ˆ÷  Ò 1Ø�L‰LÔ*¨EÑ2Ô3Ü'¨
¸^Õ4KÓLˆÜ�dœD×!Ò!Ü$'¨¯©°Ó(@×(NÐ(NÀJÓ$OˆE�.Ñ!Ü˜$Ÿ(™( 9Ó-¬t×4Ò4Ø#'¨	¥?��iÑ Ø�‰˜Ör\   rQ   )Ú_get_default_hermes_home)Úget_install_idrg  Úbot_mode_protocolÚ
install_id)ÚpngÚjpgÚwebpro   )&rF   rL  Úhermes_yamlr9   rä   Úboolr   rÿ   rM  rG   rO  rQ  rR  rS  r    rT  r]  Ú	safe_loadÚ	read_textr=   r>   rH   rå   Úmaxr¸   rè   r  rD   r0   r.   r)   Úprofile_homesrk  Úis_dirÚ_named_profile_dirsrq   Úhermes_cli.install_identityrl  )r.   r-   r0   rJ   r2   rL  ÚyamlrM  rq   r   ÚrowrP  rf  Ú	revisionsÚkÚvri  r  rH  r€   rc  rŸ   rk  r%  rl  r   rg  rh  s   &&f&&                    @@@r4   r&   r&   †  sÛ  û€ õ 2ÛØ—z‘zÐ"4°dÓ;ÐÜÐÓ¤TÓ)ÜÐ 0Ó1Ð1Ý?Ù˜tÓ$€DÙ˜D $°4¸9Ñ3DÔE€GØ�4˜¤ T£¨L¸'×:LÑ:LØ�G—M‘M :¨w×/?Ñ/?Ø˜'×-Ñ-×3Ð3°°^ÀW×EYÑEY×E_ÐE_Ð]_Ø˜'×-Ñ-×2Ð2°ð4€Cð �.Õ €DØCGÇ<Á<Ç>Â>ˆ4�>‰>˜$Ÿ.™.°+˜.Ó>Ô?ÐWY€DÜ˜d¤D×)Ò)‰4¨r€DØ—‘Ð-Ó.€Iä4>¸yÌ$×4OÒ4Oð ?H¿o¹oÔ>Oô  1Ñ>O±d°aÜ!% a£¬C ô !2¤ A£¬¨A¨q«	Ò 1Ñ>Oó  1ØUWð ÐÑä�$—(‘(˜9Ó%¤t×,Ò,Ø˜i�ˆˆI‰ß›ÔlÑUkÓlŸŸšÔlÑUkÓlÓl€CˆÑßØ�
‰
”= Ó2Ô3Øˆu€HØ�L‰L‹NÐ€D÷ñ ó(  ‰ˆˆVñ 	Ñ& s§x¡xÓ0°#·(±(Ø.4Ò.@�C—M‘M 6Ñ*Àdö	Lñ	  ô �iÐ!6¸Ó=€GØÒØ")×"7Ñ"7Ó"9×"?Ñ"?Ö"AÑˆJ˜Ù�z 6Ö*ñ #Bõ =Ù#Ó%€DØ‡{�{‡}‚}Ù�9˜dÔ#Ü%Ö'ˆÙ�6—;‘; Ö'ñ (õ
 ;Ø˜Ð"5°t¸\É>ÓK[×KaÐKaÐ_aÐbÐbùóm 1s   Å&MÆMc                 ó^   € V P                   V P                  V P                  V P                  3# ro   )Úst_mtime_nsÚst_ctime_nsÚst_sizeÚst_ino)Ústats   &r4   Ú	_stat_keyr†  ß  s%   € Ø×Ñ˜d×.Ñ.°·±¸d¿k¹kÐJÐJr\   c                 ó†   €  \         P                  ! V 4      pTP                  .\	        T4      O5#   \         d     R # i ; iro   )ÚosÚlstatÚOSErrorÚst_moder†  )rP  r…  s   & r4   Ú
_lstat_keyrŒ  ã  s@   € ðÜ�xŠx˜‹~ˆð �L‰LÐ+œ9 T›?Ñ+Ð+øô ô Úðús   ‚1 ±A ¿A c            
      ó¬  a€ ^ RI Hp Hp ^ RIHpHp V ! 4       p \        P                  ! V4      ;_uu_ 4       p. pV F¢  o\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      p\        P                  P                  V! \        SP                  4      4      4      pVP                  SP                  \        SP                  4       4      Wx34       K¤  	  \        \        P                  ! V4      4      \        \!        V4      4      3p	RRR4       \$        P'                  \)        T4      4      p
X	e    T
'       d   T
^ ,          T	8X  d
   T
^,          #  T! 4       pT	e   Y›3\$        \)        T4      &   T#   + '       g   i     Lr; i  \"         d    Rp	 L„i ; i  \"         d#   p\*        P-                  RYL4       . u Rp?# Rp?ii ; i)r   )Ú_get_profiles_rootÚ_iter_named_profile_dirs)Ú_PROFILE_IDENTITY_MARKERSÚprofile_tombstone_pathc              3   óŠ   <"  € T F8  p\        \        P                  P                  SP                  V4      4      x € K:  	  R # 5iro   )rŒ  rˆ  rP  r#  )rp   Úmarkerre  s   & €r4   rs   Ú&_named_profile_dirs.<locals>.<genexpr>õ  s4   øé € ð  IÙ.G Fô !+¬2¯7©7¯<©<¸¿
¹
ÀFÓ+K× LÐ LÛ.Gùs   ƒA ANz!profiles.list: cannot list %s: %s)rF   rŽ  r�  Úhermes_constantsr�  r‘  rˆ  ÚscandirÚtuplerP  Úexistsr   rŽ   rq   r†  r…  r|   rŠ  Ú_NAMED_DIRS_CACHEr9   rG   rC  rE  )rŽ  r�  r�  r‘  Úprofiles_rootÚentriesÚrowsÚmarkersr­   Ú	signatureÚcachedÚtargetsr,   re  s                @r4   ry  ry  ë  sv  ø€ ßPßRÙ&Ó(€MðÜ�ZŠZ˜×&Ô&¨'ØˆDÛ �÷  œ%ô  IÙ.Gó IŸ%™%ô  IÙ.Gó Ió I�äŸG™GŸN™NÑ+AÄ$ÀuÇzÁzÓBRÓ+SÓT�	Ø—‘˜UŸZ™Z¬°5·:±:³<Ó)@À'ÐUÖVñ !ô #¤2§7¢7¨=Ó#9Ó:¼EÄ&ÈÃ,Ó<OÐPˆI÷ 'ô ×"Ñ"¤3 }Ó#5Ó6€FØÒ§¨F°1­I¸Ô,BØ�a�yÐðÙ*Ó,ˆð
 ÒØ1:Ð0DÔœ#˜mÓ,Ñ-Ø€N÷/ '×&ûô ô ØŠ	ðûô ô ä�‰Ð:¸MÔOØ�	ûðúsM   šF ¸CF ÄF Å F& Æ F	ÆF ÆF ÆF#Æ"F#Æ&GÆ1GÇGÇGc                ó   € ^ RI p VP                  4       p\        P                  \        T4      4      pT'       d   T^ ,          T8X  d
   T^,          #  TP                  TP                  R4      4      pY63\        \        T4      &   T#   \        \        \        3 d    / u # \
         d$   p\        P                  RYT4       / u Rp?# Rp?ii ; i  \        TP                  3 d$   p\        P                  RYT4       / p Rp?L”Rp?ii ; i)z¶A sibling's parsed ``profile.yaml``, or ``{}``. One unreadable file (a legacy code page,
bad YAML, a permission error) degrades that row to basic metadata; it never fails the roster.Nz?profiles.list: skipping unreadable profile.yaml for %s (%s): %srV  )rr  Ú
read_bytesÚFileNotFoundErrorÚNotADirectoryErrorÚIsADirectoryErrorrŠ  rC  rE  Ú_PROFILE_META_CACHEr9   rG   rt  Údecoder*   Ú	YAMLError)rq   Ú	meta_pathr{  Úrawr,   rŸ  rf  s   &&     r4   rb  rb  
  sî   € ó ðØ×"Ñ"Ó$ˆô !×$Ñ$¤S¨£^Ó4€Fß�&˜•)˜sÔ"Ø�a�yÐðØ�~‰~˜cŸj™j¨Ó5Ó6ˆð ,/¨+Ôœ˜I›Ñ'Ø€Køô Ô1Ô3DÐEô ØŠ	Üô Ü�‰ÐXÐZ^ÐknÔoØ�	ûðûô ˜Ÿ™Ð'ô Ü�‰ÐXÐZ^ÐknÔoØ�ûðúsA   †B	 Á C Â	CÂ#CÂ,CÂ-CÃCÃCÃDÃ*DÄDc                óð   € V ^8„  d   Qh/ ^ \         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d,   \        \        \        \
        \        3,          3,          ;R&   # )é   r™  r¦  )Ú__conditional_annotations__r>   rG   r—  rz   ÚbytesÚobject)Úformats   "r4   Ú__annotate__r±     sX   € × DÑ D÷t 6Ò 5”4œœU¤5¬$ ;Õ/Ð/Õ0Ñ 5ñu E÷v :Ò 9”Tœ#œu¤U¬F ]Õ3Ð3Õ4Ñ 9òw Er\   >   rƒ   r„   r   >   rƒ   r   Ú	since_seqr   >   rq   r™   r   >   rq   r   rÒ   >   rÓ   r   rÒ   >   ÚkindÚmimerq   r   Ú	upload_idÚdata_base64>   r   rÒ   Úattachment_id>   r   rÜ   r�   rÛ   >   rî   r   rÜ   r�   rï   rÛ   )r7   )"r­  Ú__doc__r@   Úloggingrˆ  Úpathlibr   ÚweakrefÚhermes_state_runtimer   Ú	getLoggerÚ__name__rC  r8   r?   r<   rN   r'   rË   r4  ÚWeakSetrB  rI   r  r  rJ  r&   r™  r¦  r†  rŒ  ry  rb  r±  )r­  s   @r4   Ú<module>rÀ     sr  øðÞ DÛ Û Û 	Ý Û å 2à	×	Ò	˜8Ó	$€ð ˜>Ø�>Ø�NØ�.ØÐ&ØÐ&ØÐ'ØÐ#ØÐ 0Ø  .ØÐ$ØÐ%ØÐ'ØÐ'ð€ð" ™3›5ØÒ;Ø�YÐ 3Ð4ØÒHØÒ3ØÒ4Ø�y +Ð.ØÒ5ØÒ _Ø Ò"JØ�I˜{Ð+ØÒOØÒQØò /àÐ(Ð)ð!€ò($+ðNL¸5ô Lò^'ð^ p€ð �OŠOÓ€	òWò(	kò4ònô$Icðj 46Ð Ó 5Ø79Ð Ó 9òKò,òô>r\   