+
    jHàjgÂ  ã                   ó.  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
Ht ^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHtHtH t H!t!H"t" ^ RI#H$t$H%t%H&t'H(t(H)t) ^ RI*H+t+ ^ RI,H-t-H.t.H/t/ ^ RI0H1t1H2t2H3t3 ]! 4       t4]! 4       t5]! 4       t6]! RR4      t7]! RR4      t8]! RR4      t9]! RR4      t:Rt;Rwt<R R lt=Rxt>Ryt?Rzt@R R ltARtBR R ltCR R ltDR  R! ltER" R# ltFR$ R% ltG]4P‘                  R&4      ]! ^^ ^dR'7      ]! ^ ^ R(7      ^ R)R*RRRRR+R3R, R- ll4       tIR. R/ ltJ]5P‘                  R04      R{R1 R2 ll4       tK]6P™                  R34      R4 R5 l4       tM]6P™                  R64      R7 R8 l4       tN]6P‘                  R94      R|R: R; ll4       tO]6P¡                  R<4      R|R= R> ll4       tQ]6P‘                  R?4      R|R@ RA ll4       tR]6P‘                  RB4      R|RC RD ll4       tS]6P‘                  RE4      R|RF RG ll4       tT]6P‘                  RH4      R|RI RJ ll4       tURK RL ltVRM RN ltWRO tXRP RQ ltYRR RS ltZRTRRURV/RW RX llt[]6P‘                  RY4      R]! R^ R(7      ]! ^ ^ R(7      ]! R4      ]! R+4      ]! RV4      3RZ R[ ll4       t\R\ R] lt]]6P‘                  R^4      R]! R_^R_R'7      ]! ^ ^ R(7      3R` Ra ll4       t^]6P‘                  Rb4      ]! Rc^R(7      R]! ^x^^xR'7      3Rd Re ll4       t_]6P¡                  RB4      R}Rf Rg ll4       t`Rh Ri lta]6P™                  Rj4      Rk Rl l4       tb]6PÇ                  RB4      Rm Rn l4       tdRo Rp lte]6P‘                  Rq4      R|Rr Rs ll4       tf]6P™                  Rt4      Ru Rv l4       tgR# )~aT  Session dashboard routes.

Three routers because global route order matters: ``list_router`` (GET
/api/sessions) mounts before the profiles ``sessions_router``, ``search_router``
right after it, ``manage_router`` (mutation/detail) much later.  web_server-owned
helpers are reached via the late-binding seam so monkeypatching keeps working.
N©ÚPath)ÚCallableÚListÚOptional)Ú	APIRouterÚHTTPExceptionÚQueryÚRequest)Újsonable_encoder)ÚStreamingResponse)Úsubagent_listing_scope)Úlate)Ú_strip_session_list_rows©Ú_session_latest_descendant)ÚBulkDeleteSessionsÚSessionImportÚSessionOwnerBackfillÚSessionPruneÚSessionRename)ÚCORRUPT_STORE_DETAILÚcorrupt_store_as_statusÚlogÚdestructive_profileÚhttp_failure)Úis_malformed_db_error)ÚSessionActiveWriteGuardErrorÚStateDbReplacedErrorÚis_transient_sqlite_error)ÚSTORAGE_CORRUPTÚnote_storage_errorÚstorage_stateÚ_cron_default_profilezhermes_cli.web_server_cronÚ_cron_profile_homeÚ_open_session_db_for_profilezhermes_cli.web_server_sessionsÚ_session_db_path_for_profilezSession not foundc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚrequestÚreturn)r
   Úbytes)Úformats   "ÚD/home/ubuntu/.hermes/hermes-agent/hermes_cli/web_routers/sessions.pyÚ__annotate__r.   8   s   € ÷ ñ ¬Wð ¼ñ ó    c              ƒ   óö   "  € \        4       pV P                  4         R j  x€L
  p\        V4      \        V4      ,           \        8”  d   \	        RRR7      hVP                  V4       KN   LIDJ\        T4      # 5i)Ni�  z#Session import payload is too large©Ústatus_codeÚdetail)Ú	bytearrayÚstreamÚlenÚ_SESSION_IMPORT_MAX_BYTESr   Úextendr+   )r)   ÚbodyÚchunks   &  r-   Ú_read_session_import_bodyr;   8   sf   é € Ü‹;€DØ—~‘~Ô'÷ ð ˆeÜˆt‹9”s˜5“zÕ!Ô$=Ô=Ü¨CÐ8]Ô^Ð^Ø�‰�EÖñÐ'ô �‹;Ðùs&   ‚A9�A-¡A+¢A-¥AA9Á+A-Á-A9c                ó$   € V ^8„  d   QhR\         /# ©r(   r9   ©r   )r,   s   "r-   r.   r.   M   s   € ÷ ,ñ ,œ,ñ ,r/   c                óf  a € ^ RI Hp S P                  RJ;'       g    S P                  RJpS P                  e'   S P                  ^8  d   V'       g   \        RRR7      h\        ;QJ d.    V 3R l\        \        ,            4       F  '       g   K   RM#	  RM! V 3R l\        \        ,            4       4      pS P                  pV'       g   V'       d   R	S P                  9  d   RpS P                  '       d   \        S P                  4      ^,          MV! 4       p\        S P                  S P                  R
7      p R	TRS P                  RS P                  RS P                  '       d   RMR/\         Uu/ uF  qw\        S V4      ;'       g    RbK  	  upC\         Uu/ uF  qw\        S V4      bK  	  upCpVP                   ! R/ VB p	S P                  '       dÝ   VP"                  ! R/ VBRR/B p
RRR^ R\%        V
4      RT	RV
'       d   V
^ ,          R,          MRRV
'       d   V
R,          R,          MRRV
'       d   \'        R V
 4       4      MRRV
'       d   \)        R V
 4       4      MRRV
 UUu. uF(  p\*         Uu/ uF  qÌVP-                  V4      bK  	  upNK*  	  upp/	VP/                  4        # VR,          pVP0                  ! RRVP3                  4       '       d   TMRRR/VB pRRRVRV	/VP/                  4        # u upi u upi u upi u uppi   TP/                  4        i ; i)zIDelete ended sessions matching filters (mirrors `hermes sessions prune`).©Úget_hermes_homeNé�  zolder_than_days must be >= 1r1   c              3   ó@   <"  € T F  p\        SV4      R Jx € K  	  R # 5i©N)Úgetattr)Ú.0Úfr9   s   & €r-   Ú	<genexpr>Ú"_prune_sessions.<locals>.<genexpr>V   s"   øé € ð WÙ.U¨Œ��aÓ Õ$Ó.Uùs   ƒTFÚolder_than_days©Ú	read_onlyÚstarted_beforeÚstarted_afterÚarchivedÚwhole_lineagesÚokÚremovedÚmatchedÚskipped_openÚoldest_last_activeÚlast_activeÚnewest_last_activeÚoldest_started_atc              3   ó2   "  € T F  qR ,          x € K  	  R# 5i©Ú
started_atN© ©rF   Úrs   & r-   rH   rI   p   ó   é € Ð(GÁ$¸Q¨<¯ªÃ$ùó   ‚Únewest_started_atc              3   ó2   "  € T F  qR ,          x € K  	  R# 5irZ   r\   r]   s   & r-   rH   rI   q   r_   r`   ÚsessionsÚsessions_dirÚexclude_active_write_guardsr\   éÿÿÿÿ)Úhermes_cli.configrA   rM   rN   rJ   r   ÚanyÚ_PRUNE_STR_FILTERSÚ_PRUNE_NUM_FILTERSÚmodel_fields_setÚprofiler$   r%   Údry_runÚinclude_archivedrE   Úcount_open_prune_matchesÚlist_prune_candidatesr6   ÚminÚmaxÚ_PRUNE_ROW_KEYSÚgetÚcloseÚprune_sessionsÚexists)r9   rA   Ú
has_windowÚattr_filters_setÚeffective_older_thanÚprofile_homeÚdbrG   ÚfiltersrT   Úrowsr^   Úkrd   rR   s   f              r-   Ú_prune_sessionsr€   M   sÕ  ø€ å1Ø×$Ñ$¨DÐ0×RÐR°D×4FÑ4FÈdÐ4R€JØ×ÑÒ'¨D×,@Ñ,@À1Ô,DÏZÜ¨Ð4RÔSÐS÷ “sô WÜ.@ÔCUÖ.UóW—s—s’sô WÜ.@ÔCUÖ.UóWó WÐà×/Ñ/Ðß×&Ð+<ÀD×DYÑDYÔ+YØ#ÐØ:>¿,¿,¸,Ô% d§l¡lÓ3°AÖ6ÉOÓL]€LÜ	% d§l¡l¸d¿l¹lÔ	K€BðàÐ3Ð5EÀt×GZÑGZØ˜T×/Ñ/Ø × 5× 5Ð 5™¸5ðAõ 7IÓIÑ6H°”7˜4 Ó#×+Ð+ tÒ+Ñ6HÑIð	Aõ
 -?Ó?Ñ,> q”'˜$ Ó"Ò"Ñ,>Ñ?ðAˆð ×2Ò2Ñ=°WÑ=ˆØ�<�<ˆ<à×+Ò+ÑK¨gÑKÀdÒKˆDà�dØ˜1Øœ3˜t›9Ø à$Ç d¨1¥g¨mÖ&<È$Ø$Ç d¨2¥h¨}Ö&=È4Ø#Ï4¤SÑ(GÁ$Ó(GÔ%GÐUYØ#Ï4¤SÑ(GÁ$Ó(GÔ%GÐUYØÉTÔRÉTÈµ?ÓC±?¨a §¡ q£šk±?ÔCÉTÒRð
Tð" 	�‰�
ð $ jÕ0ˆØ×#Ò#ñ 9Ø)5×)<Ñ)<×)>Ò)>™ÀDð9à(,ð9à07ñ9ˆð �d˜I w°ÀÐMà
�‰�
ùò/ JùÚ?ùò DùÓRøð 	�‰�
úsy   Ä>9L Å7L	ÆL	ÆL Æ!LÆ6'L ÇA	L È(L ÉL ÉL É7L(ÊL.ÊL(Ê%L Ê:,L Ë'L Ì	
L ÌL(ÌL ÌL0é,  c                ó\   € V ^8„  d   QhR\         \        ,          R\        \        ,          /# )r(   Úvaluer*   )r   ÚstrÚlist)r,   s   "r-   r.   r.      s&   € ÷ Fñ F”œ•ð F¤$¤s¥)ñ Fr/   c                ó¬   € T ;'       g    RP                  R4       Uu. uF*  qP                  4       '       g   K  VP                  4       NK,  	  up# u upi )zCSplit a comma-separated query param into stripped, non-empty items.Ú Ú,)ÚsplitÚstrip)rƒ   Úss   & r-   Ú_csvrŒ      s;   € à %§ ¨×2Ñ2°3Ô7ÓEÑ7˜!¿7¹7¿9ŒIˆA�G‰GŽIÑ7ÑEÐEùÒEs
   žAºAc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r(   ÚrowÚnowr*   )ÚdictÚfloatÚbool)r,   s   "r-   r.   r.   „   s&   € ÷ Yñ Y”Dð Yœuð Y¬ñ Yr/   c                 ó–   € V P                  R 4      RJ ;'       d0    WP                  RV P                  R^ 4      4      ,
          \        8  # )Úended_atNrV   r[   )rt   Ú_ACTIVE_WINDOW_S)rŽ   r�   s   &&r-   Ú
_is_activer–   „   sG   € à�‰�
Ó˜tÐ#÷ 	Xð 	XØ—7‘7˜=¨#¯'©'°,ÀÓ*BÓCÕCÔGWÑWðYr/   c                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r(   rl   ÚfnrL   )r   r„   r   r’   )r,   s   "r-   r.   r.   Š   s%   € ÷ 3ñ 3”hœs•mð 3¬ð 3Äñ 3r/   c               óT   a aa€ VV V3R lpS'       d   V! 4       # ^ RI Hp V! S V4      # )z<Open the profile's session DB, run ``fn(db)``, always close.c                  óz   <€ \        SSR 7      p  S! V 4      V P                  4        #   T P                  4        i ; i)rK   )r%   ru   )r|   r˜   rl   rL   s    €€€r-   ÚrunÚ_with_db.<locals>.runŒ   s.   ø€ Ü)¨'¸YÔGˆð	Ù�b“6à�H‰H�JøˆB�H‰H�Jús   �( ¨:©Ú_with_session_maintenance)Úhermes_cli.web_server_sessionsrž   )rl   r˜   rL   r›   rž   s   ffd  r-   Ú_with_dbr    Š   s$   ú€ ÷÷ Ù‹uˆÝHÙ$ W¨cÓ2Ð2r/   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r(   rl   r*   ©r   r„   )r,   s   "r-   r.   r.   ˜   s"   € ÷ Rñ Rœh¤s�mð R´ñ Rr/   c                óJ   € V '       d   \        V 4      ^ ,          # \        4       # )uŽ   The profile name rows are stamped with: the requested one, else the
serving process's own â€” so default-profile rows never circulate unowned.)r$   r#   ©rl   s   &r-   Ú_serving_profiler¥   ˜   s    € ÷ .5Ô˜gÓ& qÕ)ÐQÔ:OÓ:QÐQr/   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r(   Ú
session_idr*   ©r„   r   )r,   s   "r-   r.   r.   ž   s   € ÷ ñ ¬ð ´¼µñ r/   c                óJ  €  V P                  V4      #   \        P                   d=   p\        T4      '       g   h \        P
                  ! RY4       \        RRR7      ThRp?i\         d6    \        T P                  4      ;_uu_ 4        h   + '       g   i      R# ; ii ; i)zŽResolve *session_id*; a corrupt store (prefix scan raises "malformed") is
reported as 503 with the actual problem instead of a misleading 404.z2state.db is corrupt while resolving session %s: %sé÷  u�   Session store is corrupt (database disk image is malformed). Sessions cannot be read until it is repaired â€” run `hermes doctor` for diagnosis.r1   N)
Úresolve_session_idÚsqlite3ÚDatabaseErrorr   Ú_logÚerrorr   r   r   Údb_path)r|   r¨   Úexcs   && r-   Ú_resolve_session_idr³   ž   s�   € ðØ×$Ñ$ ZÓ0Ð0øÜ× Ñ ô 
Ü$ S×)Ò)ØÜ�
Š
ÐGÈÔYÜØð1ô
ð ð	ûô  ô ä$ R§Z¡Z×0Õ0Ø÷ 1×0Ñ0úðús2   ‚ “B"¨7AÁB"Á,B"Â
BÂBÂB"ÂB"z/api/sessions)ÚgeÚle)r´   ÚexcludeÚcreatedFc                óê   € V ^8„  d   QhR\         R\         R\         R\        R\        R\        R,          R\        R,          R	\        R,          R
\        R,          R\        R\        \        ,          /# )r(   ÚlimitÚoffsetÚmin_messagesrO   ÚorderÚsourceNÚsourcesÚexclude_sourcesÚ
cwd_prefixÚfullrl   )Úintr„   r’   r   )r,   s   "r-   r.   r.   ·   sž   € ÷ ZMñ ZMÜðZMÜ25ðZMÜVYðZMäðZMä&)ðZMä?BÀT½zðZMä[^ÐaeÕ[eðZMô ˜4•ZðZMô 58¸$µJðZMô NRðZMô ”c�]ñ	ZMr/   c                óR  € VR"9  d   \        RRR7      hVR#9  d   \        RRR7      hV
'       d   \        V
4      ^ ,          MRp \        V
R	R
7      p \        ^ V4      pVR8H  pVR8H  p\	        V4      p\        \        VP                  4      P                  T;'       g    RT;'       g    R\	        V4      ;'       g    RR7      w  pp\        T;'       g    RT;'       g    RT;'       g    RT;'       g    RWßVVR7      pVP                  ! R$RV RVRVR8H  RV	'       * RR	/VB pVP                  ! R$RR	/VB p\        P                  ! 4       pT;'       g    \        4       pV FY  p\        VV4      VR&   VVR&   VR8H  VR&   \        VP!                  R4      4      VR&   \        VP!                  R4      4      VR&   K[  	  V	'       g   \#        V4       \%        VP                  4      \&        8X  d	   V\&        /M/ pRVRVRV RVRV/VP)                  4        #   TP)                  4        i ; i  \          d    h \*        P,                   dO   p\.        P0                  ! R4       \3        T4      p\        T'       d   RMRT'       d	   RR7      ThR R7      ThRp?i\*        P4                   d‹   p\7        T
4      p\9        TT4      '       g6   \;        T4      '       g%   \.        P0                  ! R4       \        RR R7      Th\.        P<                  ! R!TT4       \        R\        \>        4      R7      ThRp?i\@         d5    \C        \7        T
4      4      ;_uu_ 4        h   + '       g   i      R# ; i\D         d%    \.        P0                  ! R4       \        RR R7      hi ; i)%zîList sessions.

``order=recent`` sorts by latest activity across the compression chain, so
a long-running chat stays on page one after it auto-compresses onto a fresh
id.  Rows omit ``system_prompt`` / ``model_config`` unless ``full=1``.
ÚonlyÚincluderB   z/archived must be one of: exclude, only, includer1   Úrecentz%order must be one of: created, recentNTrK   )r½   r¾   r¿   )r½   r¾   r¿   rÀ   Úmin_message_countrn   Úarchived_onlyÚinclude_subagentsr¹   rº   Úorder_by_last_activeÚcompact_rowsÚinclude_pinnedÚexclude_childrenÚ	is_activerl   ÚdefaultÚis_default_profilerO   Úpinnedrc   ÚtotalÚstoragezGET /api/sessions failedr«   éô  zJSession store is busy (disk I/O or lock). Retry; the list was not cleared.úInternal server errorz0GET /api/sessions: state.db at %s is corrupt: %s)r¶   rÄ   rÅ   )r·   rÆ   r\   )#r   r$   r%   rr   rŒ   r   r   r±   Úparentr�   Úlist_sessions_richÚsession_countÚtimer#   r–   r’   rt   r   r"   r    ru   r­   ÚOperationalErrorr¯   Ú	exceptionr   r®   r&   r!   r   r°   r   r   r   Ú	Exception)r¹   rº   r»   rO   r¼   r½   r¾   r¿   rÀ   rÁ   rl   Úprofile_namer|   rÇ   rÈ   rn   Úsource_listrÉ   Úexclude_listÚscoperc   rÒ   r�   Úrow_profiler‹   rÓ   r²   Ú	transientr±   s   &&&&&&&&&&&                  r-   Úget_sessionsrã   ¶   s•  € ð Ð5Ô5ÜØÐ$UôWð 	WàÐ)Ô)Ü¨Ð4[Ô\Ð\ß5<Ô% gÓ.¨qÖ1À$€LðIMÜ)¨'¸TÔBˆð*	Ü # A |Ó 4ÐØ$¨Ñ.ˆMØ'¨9Ñ4Ðô ˜w›-ˆKÜ.DÜ�R—Z‘ZÓ ×'Ñ'°·°¸$È×H[ÐH[ÐW[Ü $ _Ó 5× =Ð =¸ô/?Ñ+Ð˜|ô Ø—~�~ ¨{×/BÐ/B¸dØ ,× 4Ð 4°À*×BTÐBTÐPTØ"3Ø+Ð?Pô	RˆEð
 ×,Ò,ñ Øðàðð &+¨hÑ%6ðð "&œXðð  $ðð ñˆHð ×$Ò$ÑD°dÐD¸eÑDˆEÜ—)’)“+ˆCØ&×AÐAÔ*?Ó*AˆKÛ�Ü!+¨A¨sÓ!3��+‘Ø*��)‘Ø*5¸Ñ*B�Ð&Ñ'ä $ Q§U¡U¨:Ó%6Ó 7��*‘Ü" 1§5¡5¨£?Ó3��(“ñ ÷ Ü(¨Ô2ô 9FÀbÇjÁjÓ8QÔUdÔ8d�{¤OÑ4ÐjlˆGØ ¨'°5¸'À5È(ÐTZØ˜wð(ð �H‰H�JøˆB�H‰H�JûÜô ØÜ×#Ñ#ô Ü�ŠÐ1Ô2ô .¨cÓ2ˆ	Üß(™¨c÷ ð ]ô
ð ð	ð
 -ô
ð ð	ûô × Ñ ô Yä.¨wÓ7ˆÜ" 7¨C×0Ò0Ô4IÈ#×4NÒ4NÜ�NŠNÐ5Ô6Ü¨CÐ8OÔPÐVYÐYÜ�
Š
ÐEÀwÐPSÔTÜ¨´DÔ9MÓ4NÔOÐUXÐXûÜô ä$Ô%AÀ'Ó%J×KÕKØ÷ L×KÑKúäô MÜ�ŠÐ1Ô2Ü¨Ð4KÔLÐLðMús¦   ÁH1 ÁAH Â,H Ã H Ã
H Ã$
H Ã/
H Ã:A H ÅA1H Ç>H ÈH1 ÈH.È.H1 È1N&ÉN&É8JÊ
JÊN&Ê1N&Ê2BL7Ì7N&ÍN&Í!M#Í#M5Í.N&Í5N&Î%N&c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r(   ÚchildrÖ   r*   )r�   r’   )r,   s   "r-   r.   r.     s!   € ÷ +ñ +¤ð +¬dð +´tñ +r/   c                 ó¶   € VP                  R 4      pV P                  R4      pVP                  R4      R8H  ;'       d    VRJ;'       d    VRJ;'       d    W28¬  # )r”   r[   Ú
end_reasonÚcompressionN©rt   )rå   rÖ   Úparent_ended_atr[   s   &&  r-   Ú_is_compression_edgerë     sj   € Ø—j‘j Ó,€OØ—‘˜<Ó(€Jà�
‰
�<Ó  MÑ1÷ 	*ð 	*Ø 4Ð'÷	*ð 	*à˜dÐ"÷	*ð 	*ð Ñ)ð	+r/   z/api/sessions/searchc                ó    € V ^8„  d   QhR\         R\        R\        \         ,          R\         R,          R\         R,          R\         R,          /# )r(   Úqr¹   rl   r½   Nr¾   r¿   ©r„   rÂ   r   )r,   s   "r-   r.   r.     s\   € ÷ pSñ pSÜ
ðpSÜðpSÜ+3´C­=ðpSÜILÈtÍðpSä�4�ZðpSä14°tµñpSr/   c           	   ƒ  óD  a aaaaaa"  € S '       d   S P                  4       '       g   R. /# \        RRRR7      ;_uu_ 4        \        S4      oVVVV VVV3R lp\        P                  ! \
        SVRR7      G R	j  x€L
 uuR	R	R	4       #  L  + '       g   i     R	# ; i5i)
uU  Search sessions by ID (first) plus FTS5 message content.

Results are deduped by compression lineage, not raw ``session_id``:
auto-compression rotates a chat onto a fresh id and leaves the old segment
in the FTS index.  Branches also use ``parent_session_id`` but are real
alternate conversations â€” they are NOT collapsed into the parent.
ÚresultszGET /api/sessions/search failedrÔ   zSearch failed©r3   c                 óš  <a aaaaaaaa€ \        ^\        \        S;'       g    ^4      ^d4      4      oS;'       g    Rp\        S4      pV'       d   V.MT;'       g    Rp\        S4      p\        P                  ! 4       oV 3R lo/ oR VV3R llo/ oR V V3R llo/ oR VV VVVVVV3R llpR	 R
 lpS P                  SSRTT;'       g    RT;'       g    RR7       Fk  pVP                  R4      pVP                  R4      ;'       g    RP                  4       p	T	;'       g    RV 2p
V! W†! WzRVP                  R4      4      4       Km  	  RP                  R \        P                  ! RSP                  4       4       4       4      pS P                  Y³T;'       g    R\        S^,          ^24      RR7      pV F[  p\        S4      S8¼  d    MJV! VR,          V! WÝP                  RR4      VP                  R4      VP                  R4      4      4       K]  	  \        S4      S8  dÔ    S P                  SP                  4       RRY;'       g    RT;'       g    RSR7      pV F“  p\        S4      S8¼  d    M‚VP                  R4      pV'       g   K0  VP                  R4      ;'       g    RP                  4       p	T! Y†! Yy;'       g    RSP                  4        2RVP                  R4      4      4       K•  	  R\#        SP%                  4       4      /#   \         d$    \        P                   ! RSR,          4       . p Lái ; i) é   Nc                 óL   <€  SP                  V 4      #   \         d     R # i ; irD   )Úget_sessionrÜ   )Úsidr|   s   &€r-   rõ   Ú5search_sessions.<locals>._search.<locals>.get_session6  s)   ø€ ð ØŸ>™>¨#Ó.Ð.øÜ ô  Úð ús   ƒ ”#¢#c                ó0   € V ^8„  d   QhR\         R\         /# r§   ©r„   )r,   s   "r-   r.   Ú6search_sessions.<locals>._search.<locals>.__annotate__@  s   € ÷ ñ ¬Sð ´Sñ r/   c                 óR  <€ . Y r2pV'       dŒ   W!9  d†   VS	9   d   S	V,          pMtVP                  V4       S! V4      p\        V\        4      '       d   VP                  R 4      MRpV'       d	   S! V4      MRpV'       d   \	        WF4      '       g   TpMTpK“  V F  pVS	V&   K
  	  V# )Úparent_session_idN)ÚappendÚ
isinstancer�   rt   rë   )
r¨   ÚchainÚcurÚrootr‹   rÖ   Úparent_sessionÚnoderõ   Ú
root_caches
   &       €€r-   Úcompression_rootÚ:search_sessions.<locals>._search.<locals>.compression_root@  sž   ø€ Ø#% z˜D�ß˜cÔ.Ø˜jÔ(Ø)¨#�˜ØØ—L‘L Ô%Ù# CÓ(�AÜ;EÀaÌ×;NÒ;N˜QŸU™UÐ#6Ô7ÐTX�Fß<B¡[°Ô%8È�Nß)Ô1EÀa×1XÒ1XØ"˜ØØ ’CÛ!�DØ'+�J˜tÓ$ñ "à�r/   c                ó0   € V ^8„  d   QhR\         R\         /# r§   rù   )r,   s   "r-   r.   rú   T  s   € ÷ -ñ -¬ð -´ñ -r/   c                 ó°   <€ V S9  d)    SP                  V 4      ;'       g    T SV &   SV ,          # SV ,          #   \         d    T ST &    ST ,          # i ; irD   )Úget_compression_tiprÜ   )r¨   r|   Ú	tip_caches   &€€r-   Úlineage_tipÚ5search_sessions.<locals>._search.<locals>.lineage_tipT  sm   ø€ ð  YÔ.ð;Ø02×0FÑ0FÀzÓ0R×0`Ð0`ÐV`˜	 *Ñ-ð ! Õ,Ð,�y Õ,Ð,øô %ô ;Ø0:˜	 *Ò-Ø  Õ,Ð,ð;ús   Š: ¢: ºAÁAc                ó4   € V ^8„  d   QhR\         R\        RR/# )r(   Úraw_sidÚpayloadr*   N)r„   r�   )r,   s   "r-   r.   rú   e  s!   € ÷ &%ñ &%¬Cð &%¼$ð &%À4ñ &%r/   c           	      ób  <€ V '       g   R # S! V 4      pVS9   g   \        S4      S8¼  d   R # \        V4      pS! V 4      pW1R&   W!R&   SVR&   SR8H  VR&    SP                  V4      pV'       Ed£   VP	                  R4      ;'       g    VP	                  R4      pTP                  / RVP	                  R4      ;'       g    TbR	VP	                  R	4      bR
VP	                  R
4      bRVP	                  R4      bRVP	                  R4      bRVP	                  R4      bRVbRVP	                  R4      R J ;'       d    S	T;'       g    ^ ,
          R8  bRVP	                  R4      ;'       g    ^ bRVP	                  R4      ;'       g    ^ bRVP	                  R4      ;'       g    ^ bRVP	                  R4      ;'       g    ^ bRVP	                  R4      bRVP	                  R4      bR\        S
4      bR\        VP	                  R4      4      b4       MW1R&   VSV&   R #   \         d    R p ELÆi ; i)Nr¨   Úlineage_rootrl   rÏ   rÐ   rV   r[   Úidr½   ÚmodelÚtitler”   rÎ   r�   Úmessage_countÚtool_call_countÚinput_tokensÚoutput_tokensÚpreviewrü   rO   )r6   r�   Úget_session_rich_rowrÜ   rt   Úupdater¥   r’   )r  r  r  rö   rŽ   rV   r  r|   r  r�   rl   rá   Ú
safe_limitÚseens   &&    €€€€€€€€r-   Úadd_lineage_resultÚ<search_sessions.<locals>._search.<locals>.add_lineage_resulte  sj  ø€ ßÙÙ'¨Ó0�Ø˜4”<¤3 t£9°
Ô#:ÙÜ˜w›-�Ù! 'Ó*�Ø(+˜Ñ%Ø*.˜Ñ'Ø%0�˜	Ñ"Ø0;¸yÑ0H�Ð,Ñ-ðØ×1Ñ1°#Ó6�C÷ �3Ø"%§'¡'¨-Ó"8×"QÐ"Q¸C¿G¹GÀLÓ<Q�KØ—N‘Nð $?Ø˜cŸg™g d›m×2Ð2¨sð$?à  #§'¡'¨(Ó"3ð$?ð   §¡¨Ó!1ð$?ð   §¡¨Ó!1ð	$?ð
 % c§g¡g¨lÓ&;ð$?ð # C§G¡G¨JÓ$7ð$?ð & {ð$?ð $ØŸG™G JÓ/°4Ð7×\Ð\¸SÀK×DTÐDTÐSTÕ=UÐY\Ñ<\ð$?ð (¨¯©°Ó)A×)FÐ)FÀQð$?ð *¨3¯7©7Ð3DÓ+E×+JÐ+JÈð$?ð '¨¯©°Ó(?×(DÐ(DÀ1ð$?ð (¨¯©°Ó)A×)FÐ)FÀQð$?ð " 3§7¡7¨9Ó#5ð$?ð ,¨S¯W©WÐ5HÓ-Ið$?ð  "Ô#3°GÓ#<ð!$?ð" #¤D¨¯©°Ó)<Ó$=ð#$?õ @ð& %(˜D‘MØ$��T“
øô1 !ô Ø“Cðús   ÁH ÈH.È-H.c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r(   rŽ   Úsnippetr*   )r�   r„   )r,   s   "r-   r.   rú   �  s!   € ÷ ;ñ ;¤ð ;´ð ;Ìtñ ;r/   c                 óx   € R VRVRV P                  R4      RV P                  R4      RVRV P                  R4      /# )r!  Úroler½   r  Úsession_startedrV   ré   )rŽ   r!  r#  r$  s   &&&&r-   Úhit_payloadÚ5search_sessions.<locals>._search.<locals>.hit_payload�  sE   € ð
 ˜w¨°°hÀÇÁÈÓ@QØ˜SŸW™W WÓ-Ð/@À/Ø! 3§7¡7¨=Ó#9ð;ð ;r/   T)r¹   rn   r½   r¾   r¿   r  r  r‡   zSession ID: r[   Ú c              3   ó”   "  € T F>  pVP                  R 4      '       g   VP                  R4      '       d   TMVR,           x € K@  	  R# 5i)Ú"Ú*N)Ú
startswithÚendswith)rF   Útoks   & r-   rH   Ú3search_sessions.<locals>._search.<locals>.<genexpr>¡  s=   é € ð $Bá@�Cð —~‘~ c×*Ò*¨c¯l©l¸3×.?Ò.?‘ÀSÈ3ÅYÔNÛ@ùs   ‚AžAµAz"[^"]*"|\S+r¨   r#  r!  r$  )ÚqueryÚsource_filterr¿   r¹   Úfields)Úsearch_queryrn   rÊ   r½   r¾   r¿   r¹   z%Title-match supplement skipped for %r:NéÈ   NzSession title matched: rð   )r¨   r#  r!  r½   r  r$  )rr   rq   rÂ   rŒ   rÙ   Úsearch_sessions_by_idrt   rŠ   ÚjoinÚreÚfindallÚsearch_messagesr6   r×   rÜ   r¯   Údebugr…   Úvalues)r|   r0  rÞ   Úinclude_sourcesrß   r  r%  rŽ   rö   r  r!  Úprefix_queryÚmatchesÚmÚ
title_rowsr  rõ   r  r�   r  r  r  r
  r¿   r¹   rl   rí   rá   r½   r¾   s   f              @@@@@@@@€€€€€€€r-   Ú_searchÚ search_sessions.<locals>._search.  s  ÿù€ Ü˜Q¤¤C¨¯¨°Ó$4°cÓ :Ó;ˆJØ"ŸN˜N dˆMÜ˜w›-ˆKß1>˜}™oÀ[×EXÐEXÐTXˆOÜ Ó0ˆLÜ—)’)“+ˆCõ ð  "ˆJ÷ñ ð$ !ˆI÷-ñ -ð ˆD÷&%÷ &%õP;ð ×/Ñ/Ø˜°dÀ=Ø#×+Ð+ t¸\×=QÐ=QÈTð 0ö S�ð —g‘g˜d“m�ØŸ7™7 9Ó-×3Ð3°×:Ñ:Ó<�Ø!×9Ð9 |°C°5Ð%9�Ù" 3¨°CÀ$ÈÏÉÐP\ÓH]Ó(^Ö_ñSð Ÿ8™8ñ $BäŸ:š: n°a·g±g³iÔ@ó$Bó BˆLð
 ×(Ñ(Ø"Ø ,× 4Ð 4°¼CÀ
ÈQÅÐPRÓ<SØ^ð )ó `ˆGó �Ü�t“9 
Ô*ÙÙ"Ø�l•OÙ §5¡5¨°BÓ#7¸¿¹¸v»ÈÏÉÐN_ÓH`Óaöcñ ô �4‹y˜:Ô%ð$Ø!#×!6Ñ!6Ø%&§W¡W£YÀÐ\`Ø,×6IÐ6IÀTØ(4×(<Ð(<¸ÀJð "7ó "P�Jó &�CÜ˜4“y JÔ.ÙØŸ'™' $›-�CßÙ Ø"Ÿw™w yÓ1×7Ð7°R×>Ñ>Ó@�GÙ&Ø˜[¨×.^Ð.^Ð;RÐST×SZÑSZÓS\ÐR]Ð9^Ø)-¨s¯w©w°|Ó/DóFöGñ &ð œt D§K¡K£MÓ2Ð3Ð3øô !ô $Ü—J’JÐFÈÈ%ÍÔQØ!#’Jð$ús   È/$L É
L É	L Ì+M
Í	M
TrK   N)rŠ   r   r¥   ÚasyncioÚ	to_threadr    )rí   r¹   rl   r½   r¾   r¿   r@  rá   s   ffffff @r-   Úsearch_sessionsrD    s}   þé € ÷ �A—G‘G—I’IØ˜2ˆÐÜ	Ð7¸À_×	UÖ	UÜ& wÓ/ˆ÷^	4ó ^	4ôB ×&Ò&¤x°¸'ÈTÔR×R÷I 
VÒ	UñH S÷I 
V×	UÐ	Uüs4   ‰B ¨B Á9BÁ;B
Á<BÁ?B Â
BÂB	Â	B z/api/sessions/bulk-deletec                ó$   € V ^8„  d   QhR\         /# r=   )r   )r,   s   "r-   r.   r.   Ó  s   € ÷ Gñ GÔ.@ñ Gr/   c              ƒ  óö   a a"  € \        S P                  4      R8”  d   \        RRR7      h\        S P                  R4      p. o\
        P                  ! \        VV V3R lRR7      G R	j  x€L
 pR
RRVRS/#  L5i)a~  Delete every session in ``body.ids`` in one transaction (POST: many
clients refuse a DELETE body).

Per :meth:`SessionDB.delete_sessions`: unknown ids are skipped (``deleted``
reports what really happened), children are orphaned, active/archived rows
ARE deleted (hand-picked), on-disk cleanup is left to the next prune.

Compression chains are deleted whole: the sessions list shows one row per
logical conversation carrying the chain *tip's* id, so deleting only that
row would leave the root to resurface as the previous chain link on the
next reload (#57543). ``deleted`` still counts the selected rows, not the
expanded chain links.
rÔ   rB   z$ids must contain at most 500 entriesr1   zPOST /api/sessions/bulk-deletec                 óB   <€ V P                  SP                  R SR R7      # )T)re   Úskipped_idsÚinclude_compression_chain)Údelete_sessionsÚids)r|   r9   Úskippeds   &€€r-   Ú<lambda>Ú/bulk_delete_sessions_endpoint.<locals>.<lambda>æ  s&   ø€ ÀB×DVÑDVØ�‰¨dÀØ"&ð EWô E(r/   FrK   NrQ   TÚdeletedÚskipped_active)r6   rK  r   r   rl   rB  rC  r    )r9   rl   rO  rL  s   f  @r-   Úbulk_delete_sessions_endpointrQ  Ò  sx   ùé € ô  ˆ4�8‰8ƒ}�sÔÜ¨Ð4ZÔ[Ð[Ü! $§,¡,Ð0PÓQ€GØ€GÜ×%Ò%¤h°õ :(à38ô:÷ :€Gð �$˜	 7Ð,<¸gÐFÐFñ:ùs   „A&A9Á*A7Á+A9z/api/sessions/importc                ó$   € V ^8„  d   QhR\         /# )r(   r)   )r
   )r,   s   "r-   r.   r.   í  s   € ÷ Añ A¬Gñ Ar/   c           
   ƒ  ó¸  "  €  \        V 4      G Rj  x€L
 p\        P                  ! V4      p^ RIHp TP                  '       d$   TP                  ^ ,          P                  RR4      MRpT! YP                  TTP                  TP                  RR	TP                  /R
7      G Rj  x€L
 #  L—  \         d    h \         d   p\        RRR7      ThRp?ii ; i L25i)u   Import sessions exported from the dashboard or CLI (session rows only â€”
``/api/ops/import`` restores a whole backup archive).NrB   zInvalid session import payloadr1   ©Ú_mutate_session_requestr  r‡   Úimportrc   )Ú
request_idÚexpected_revisionÚ	operationr  )r;   r   Úmodel_validate_jsonr   Ú
ValueErrorrŸ   rU  rc   rt   rl   rW  rX  )r)   Úraw_bodyr9   r²   rU  Úanchors   &     r-   Úimport_sessions_endpointr^  ì  sÆ   é € ð_Ü2°7Ó;×;ˆÜ×0Ò0°Ó:ˆõ GØ/3¯}¯}¨}ˆT�]‰]˜1Õ×!Ñ! $¨Ô+À"€FÙ(¨·,±,ÀØ—?‘?°d×6LÑ6LØ Z°·±Ð$?ôA÷ Að Añ <øäô ØÜô _Ü¨Ð4TÔUÐ[^Ð^ûð_úñ
AùsP   ‚C„B, ’B*“B, ­CÁA CÂ%CÂ&CÂ*B, Â,CÃCÃCÃCÃCz/api/sessions/empty/countc                ó:   € V ^8„  d   QhR\         \        ,          /# ©r(   rl   r¢   )r,   s   "r-   r.   r.      s   € ÷ ñ ´¼#µñ r/   c              ƒ  ód   "  € \         P                  ! \        V R RR7      G Rj  x€L
 pRV/#  L5i)zMCount of empty, ended, non-archived sessions (the "Delete empty (N)" button).c                 ó"   € V P                  4       # rD   )Úcount_empty_sessions)r|   s   &r-   rM  Ú/count_empty_sessions_endpoint.<locals>.<lambda>  s   €  b×&=Ñ&=Ô&?r/   TrK   NÚcount©rB  rC  r    )rl   re  s   & r-   Úcount_empty_sessions_endpointrg  ÿ  s9   é € ô ×#Ò#Ü�'Ñ?È4ôQ÷ Q€Eà�UÐÐñQùs   ‚#0¥.¦	0z/api/sessions/emptyc                ó:   € V ^8„  d   QhR\         \        ,          /# r`  r¢   )r,   s   "r-   r.   r.     s   € ÷ ,ñ ,´(¼3µ-ñ ,r/   c              ƒ  óˆ   a "  € \        S R4      o \        P                  ! \        S V 3R lRR7      G Rj  x€L
 pRRRV/#  L
5i)	u  Delete every empty, ended, non-archived session in one transaction.

"Empty" means NO ``messages`` rows at all â€” a rewound/compacted chat reads
``message_count == 0`` while its soft-archived rows are the only transcript
copy (see :meth:`SessionDB.delete_empty_sessions`).

* Active sessions are skipped (``ended_at IS NULL``) so a live agent isn't yanked mid-handshake. *
Archived sessions are skipped â€” the user explicitly chose to keep those rows. * Children of deleted
parents are orphaned, not cascade-deleted. See #95868.
zDELETE /api/sessions/emptyc                 ó:   <€ V P                  \        S4      R 7      # ))rd   )Údelete_empty_sessionsÚ_session_files_dir)r|   rl   s   &€r-   rM  Ú0delete_empty_sessions_endpoint.<locals>.<lambda>  s   ø€ �2×+Ñ+Ô9KÈGÓ9TÐ+ÔUr/   FrK   NrQ   TrO  )r   rB  rC  r    )rl   rO  s   f r-   Údelete_empty_sessions_endpointrn    sN   øé € ô " 'Ð+GÓH€GÜ×%Ò%Ü�'ÜUÐafôh÷ h€Gð �$˜	 7Ð+Ð+ñhùs   ƒ2AµA ¶Az/api/sessions/statsc                ó:   € V ^8„  d   QhR\         \        ,          /# r`  r¢   )r,   s   "r-   r.   r.     s   € ÷ Nñ N¤X¬c¥]ñ Nr/   c              ƒ  ó^   "  € R p\         P                  ! \        WRR7      G Rj  x€L
 #  L5i)z;Session-store statistics (mirrors `hermes sessions stats`).c           
      óò   € R V P                  RRR7      RV P                  RRR7      RV P                  RRR7      RV P                  4       R/ /p V P                  RRR7      VR&   V#   \         d     T# i ; i)	rÒ   T)rn   rÍ   Úactive_storeFrO   )rÈ   rÍ   ÚmessagesÚ	by_source)rØ   r  Úsession_count_by_sourcerÜ   )r|   Úouts   & r-   Ú_statsÚ!get_session_stats.<locals>._stats  s£   € ð
 �R×%Ñ%°tÈdÐ%ÓSØ˜B×,Ñ,¸eÐVZÐ,Ó[Ø˜×(Ñ(°tÈdÐ(ÓSÐU_Ðac×aqÑaqÓasØ˜ðˆð	Ø!×9Ñ9Ø!%¸ð  :ó  >ˆC�Ñð ˆ
øô ô 	ØØˆ
ð	ús   ÁA' Á'A6Á5A6TrK   Nrf  )rl   rw  s   & r-   Úget_session_statsry    s'   é € òô  ×"Ò"¤8¨WÈÔM×MÐMÑMùs   ‚$-¦+§-z/api/sessions/{session_id}c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r(   r¨   rl   r©   )r,   s   "r-   r.   r.   1  s"   € ÷ Oñ O¬ð O´xÄµ}ñ Or/   c              ƒ   ól   a a"  € VV 3R  lp\         P                  ! \        SVRR7      G Rj  x€L
 #  L5i)c                 óp  <€ \        V S4      pV'       d   V P                  V4      MR pV'       g   \        R\        R7      h\	        S4      VR&   VR,          R8H  VR&   ^ RIHp VP                  R4      R8X  d+   TP                  V P                  V4      ;'       g    / 4       V! VS4      pVe   WBR	&   V# )
Né”  r1   rl   rÏ   rÐ   )Úcron_run_scheduler_ownedr½   ÚcronÚscheduler_owned)
r³   rõ   r   Ú
_NOT_FOUNDr¥   Úhermes_cli.web_routers.cronr  rt   r  Úcron_run_identity)r|   rö   Úsessionr  Úownedrl   r¨   s   &    €€r-   Ú_detailÚ#get_session_detail.<locals>._detail2  s­   ø€ Ü! " jÓ1ˆß),�"—.‘. Ô%°$ˆßÜ¨C¼
ÔCÐCô .¨gÓ6ˆ�	ÑØ(/°	Õ(:¸iÑ(GˆÐ$Ñ%õ 	Ià�;‰;�xÓ  FÔ*Ø�N‰N˜2×/Ñ/°Ó4×:Ð:¸Ô;Ù(¨°'Ó:ˆØÒØ).Ð%Ñ&Øˆr/   TrK   Nrf  )r¨   rl   r‡  s   ff r-   Úget_session_detailr‰  0  s*   ùé € öô* ×"Ò"¤8¨W°gÈÔN×NÐNÑNùs   „)4­2®4z,/api/sessions/{session_id}/mutation-snapshotc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r(   r¨   r)   rl   )r„   r
   r   )r,   s   "r-   r.   r.   K  s-   € ÷ Nñ N´Cð NÄ'ð NÔT\Ô]`ÕTañ Nr/   c           	   ƒ   ó"  a "  € ^ RI Hp V! W4      w  rEVf,   \        P                  ! \        VV 3R lRR7      G Rj  x€L
 pMVP
                  P                  S 4      pRS RVRJRV'       d
   VR,          M^ R	V'       d   VR	,          /# R/#  LO5i)
é    )Ú_session_mutation_contextNc                 ó&   <€ V P                  S4      # rD   ©rõ   ©r|   r¨   s   &€r-   rM  Ú/get_session_mutation_snapshot.<locals>.<lambda>O  s   ø€ ÀBÇNÁNÐS]ÔD^r/   TrK   r¨   rw   Úruntime_revisionÚruntime_generation)rŸ   r�  rB  rC  r    r|   rõ   )r¨   r)   rl   r�  Ú	authorityÚ_actorrŽ   s   f&&    r-   Úget_session_mutation_snapshotr–  J  s—   øé € åHÙ1°'ÓCÑ€IØÒÜ×%Ò%¤h°Ô9^ÐjnÔo×o‰à�l‰l×&Ñ& zÓ2ˆð ˜* h°¸4°Ø¿3 Ð$6Ö 7ÀAØ ¿s #Ð&:Õ";ðNð NàHLðNð Nñ pùs   ƒ:B½B¾.BÁ-BÂ Bz,/api/sessions/{session_id}/latest-descendantc                óF   € V ^8„  d   QhR\         R\        \         ,          /# r{  r©   )r,   s   "r-   r.   r.   Z  s   € ÷ 5ñ 5´Cð 5Ä(Ì3Å-ñ 5r/   c              ƒ   ó  a "  € \         P                  ! \        VV 3R  lRR7      G Rj  x€L
 w  r#V'       g   \        R\        R7      hRV'       d
   V^ ,          MS RTRTR	\        T;'       d    W#^ ,          8g  4      /#  LV5i)
c                 ó   <€ \        SV 4      # rD   r   r�  s   &€r-   rM  Ú/get_session_latest_descendant.<locals>.<lambda>\  s   ø€ Ô&@ÀÈRÔ&Pr/   TrK   Nr~  r1   Úrequested_session_idr¨   ÚpathÚchanged)rB  rC  r    r   r‚  r’   )r¨   rl   Úlatestrœ  s   f&  r-   Úget_session_latest_descendantrŸ  Y  sz   øé € ä ×*Ò*Ü�'ÔPÐ\`ôb÷ b�L€FçÜ¨´JÔ?Ð?à¯4  Q¦°ZÀÈvÐW]Ð_cØ”4˜×2Ð2 °­7Ñ!2Ó3ð5ð 5ñ	bùs   ƒ&B©B ª'BÁBÁ/Bc                ó0   € V ^8„  d   QhR\         R\         /# ©r(   Úmessager*   ©r�   )r,   s   "r-   r.   r.   d  s   € ÷ ñ ¤dð ¬tñ r/   c                 óì  € ^ RI Hp ^ RIHp / pV P	                  R4      ;'       g    R
 EF'  p\        V\        4      '       g   K  \        VP	                  R4      \        4      '       d   VP	                  R4      M/ p\        VP	                  R4      ;'       g    R4      \        VP	                  R4      ;'       g    R4      rvV'       d   Wr9  d   K«   \        P                  ! VP	                  R4      ;'       g    R	4      pT! T\        V\        4      '       d   TM/ 4       U	u. uF  q™P                  4       NK  	  p
p	V
'       g   EK#  W£V&   EK*  	  V#   \        \        3 d    / p Lhi ; iu up	i )rŒ  )Útool_labels_for_call)ÚBRIDGE_TOOL_NAMESÚ
tool_callsÚfunctionr  r‡   ÚnameÚ	argumentsz{}r\   )Úagent.displayr¥  Útools.tool_labelsr¦  rt   rþ   r�   r„   ÚjsonÚloadsÚ	TypeErrorr[  Ú
as_payload)r¢  r¥  r¦  rv  Úcallr˜   Úcall_idr©  ÚargsÚlabelÚlabelss   &          r-   Ú_stored_tool_call_labelsr¶  d  s*  € Ý2Ý3à
€CØ—‘˜LÓ)×/Ð/¨RÓ/ˆÜ˜$¤×%Ò%ÙÜ%/°·±¸Ó0DÄd×%KÒ%KˆT�X‰X�jÔ!ÐQSˆÜ˜DŸH™H T›N×0Ð0¨bÓ1´3°r·v±v¸f³~×7KÐ7KÈÓ3L�ß˜$Ô7Ùð	Ü—:’:˜bŸf™f [Ó1×9Ð9°TÓ:ˆDñ 3GÀtÔU_Ð`dÔfj×UkÒUkÉTÐqsÔ2tÓuÑ2t¨×"Ñ"Ö$Ñ2tˆÐußŠ6Ø!�ŒLñ 0ð €Jøô œ:Ð&ô 	ØŠDð	üâus   Ã'EÃ>EÄ(E1ÅE.Å-E.c                ó0   € V ^8„  d   QhR\         R\         /# r¡  r£  )r,   s   "r-   r.   r.   z  s   € ÷ Jñ J¤Dð J¬Tñ Jr/   c                 ó<   € \        V 4      pV'       d	   / V CR V/C# T # )Útool_call_labels)r¶  )r¢  rµ  s   & r-   Ú_with_tool_call_labelsrº  z  s'   € Ü% gÓ.€Fß6<Ð2ˆgÐ2Ð)¨6Ñ2ÐIÀ'ÐIr/   c                 óP   € V '       d   \        V 4      ^,          # ^ RIHp V! 4       # )ró   r@   )r$   rg   rA   )rl   rA   s   & r-   Ú_history_profile_homer¼    s#   € ßÜ! 'Ó*¨1Õ-Ð-õ 2áÓÐr/   c                ó$   € V ^8„  d   QhR\         /# ©r(   r*   r   )r,   s   "r-   r.   r.   ‰  s   € ÷ 7ñ 7¤4ñ 7r/   c                ó&   € \        V 4      R,          # )aH  Transcript dir of the profile whose store a delete targets: ``SessionDB.delete_session`` only
unlinks the session's on-disk artifacts when handed this, and a row-only delete leaves the
(secret-bearing) ``session_<id>.json`` snapshots and ``request_dump_<id>_*.json`` readable after
the user removed the session (#55088, #60207).rc   )r¼  r¤   s   &r-   rl  rl  ‰  s   € ô
 ! Ó)¨JÕ6Ð6r/   c                ó$   € V ^8„  d   QhR\         /# r¾  )r’   )r,   s   "r-   r.   r.   ‘  s   € ÷ Pñ P¬Dñ Pr/   c                ó  € \        V \        4      '       d.   V P                  R4      R8w  g   V P                  R4      '       d   R# V P                  R4      p\        V\        4      ;'       d     VP	                  4       P                  R4      # )u„  A ``[System: â€¦]`` role=user row persisted without a ``display_kind``.

``[System:`` is a reserved gateway-notice namespace â€” it must never render as a user
bubble (the gateway's own history projection drops these rows outright) â€” but recovery
scaffolding written before typing existed carries no kind. Rows WITH a kind
(``model_switch``, â€¦) are timeline entries and keep flowing.
r#  ÚuserÚdisplay_kindFÚcontentz[System:)rþ   r�   rt   r„   Úlstripr+  )r¢  rÄ  s   & r-   Ú_is_untyped_scaffold_noticerÆ  ‘  sh   € ô �gœt×$Ò$¨¯©°FÓ(;¸vÔ(EÈÏÉÐUc×IdÒIdÙØ�k‰k˜)Ó$€GÜ�gœsÓ#×OÐO¨¯©Ó(8×(CÑ(CÀJÓ(OÐOr/   ÚhomeÚinline_imagesTc                ó<   € V ^8„  d   QhR\         R\        R\         /# )r(   rs  rÈ  r*   )r…   r’   )r,   s   "r-   r.   r.   Ÿ  s,   € ÷ AEñ AE¤4ð AEÄdð AEÔVZñ AEr/   c               ó   a€ ^ RI Hp ^ RIHp ^ RIHp ^ RIHp ^ RIH	p ^ RI
Hp Rp	V'       g   ^ RIHo R	 V3R
 llp	. p
V  EF  p\        V4      pV	e	   V	! V4      pVP                  R4      '       * ;'       d(    V! VP                  R4      VP                  R4      4      pV'       d	   / VCRV/Cp\!        V4      '       d)   VP#                  4       pRVR&   V
P%                  V4       K©  VP                  R4      R8X  d/   VP                  R4      V8X  d   V! V4      ;p'       d	   / VCRV/CpV! V4      '       g   V
P%                  V4       EK  V! V4      pVP#                  4       pVf   VP                  R4      '       g   RVR&   M&VP                  R4      VR&   VP'                  RR4       V
P%                  V4       EK‚  	  V! W¡R7      # )uÊ  Replace compaction summaries with their display-only projection and hide untyped
gateway-scaffold notices.

Recovery scaffolding (e.g. the stream-timeout nudge appended when a tool call's stream
is cut) persists as a ``[System: â€¦]`` ``role=user`` row with no ``display_kind``. This
projection feeds the Desktop's transcript prefetch, which addresses VISIBLE user rows by
durable row id â€” and the gateway truncation resolver refuses scaffold rows fail-closed,
so a shipped scaffold row can never resolve as a rewind/regenerate target and dead-ends
every retry (``refusing truncation without fallback``). Hide them the same way the
Desktop collapses other display-only rows; typed notices stay for the timeline.
)Ú&project_compaction_message_for_display)Úis_compaction_summary_message)Ú _extract_steer_text_from_message)Úproject_history_commentary)ÚSTEER_DISPLAY_KIND)Ú untyped_failed_turn_display_kindN)Ú_coerce_message_textc                ó0   € V ^8„  d   QhR\         R\         /# r¡  r£  )r,   s   "r-   r.   Ú*_project_for_display.<locals>.__annotate__¹  s   € ÷ 	ñ 	œDð 	¤Tñ 	r/   c                 ó\   <€ V P                  R 4      e   / V CR S! V R ,          RR7      /C# V # )rÄ  F)Ú
image_urlsré   )r¢  rÑ  s   &€r-   ÚcoerceÚ$_project_for_display.<locals>.coerce¹  s7   ø€ Ø�{‰{˜9Ó%Ò1Øi˜'Ði 9Ñ.BÀ7È9ÕCUÐbgÔ.hÑiÐiØˆNr/   rÃ  r#  rÄ  ÚhiddenrÂ  Údisplay_content©rÇ  )Úagent.compaction_displayrË  Úagent.context_compressorrÌ  Úagent.conversation_compressionrÍ  Úagent.history_commentaryrÎ  Úagent.prompt_builderrÏ  Úagent.turn_failure_copyrÐ  Útui_gateway.session_historyrÑ  rº  rt   rÆ  Úcopyrý   Úpop)rs  rÇ  rÈ  rË  rÌ  rÍ  rÎ  rÏ  rÐ  rÖ  Úprojected_messagesr¢  Úfailed_turnÚ	projectedÚ
steer_textÚdisplay_viewrÑ  s   &$$             @r-   Ú_project_for_displayré  Ÿ  s²  ø€ õ PÝFÝOÝCÝ7ÝHð
 €FßÝD÷	ð 	ð
 ÐÜˆÜ(¨Ó1ˆØÒÙ˜W“oˆGà!Ÿ+™+ nÓ5Ô5÷ 9ð 9Ñ:ZØ�K‰K˜Ó §¡¨YÓ!7ó;9ˆçØ>˜Ð> .°+Ñ>ˆGÜ& w×/Ò/ØŸ™›ˆIØ(0ˆI�nÑ%Ø×%Ñ% iÔ0Ùà�;‰;�vÓ &Ô(¨W¯[©[¸Ó-HÐL^Ô-^Ù>¸wÓGÐG�
ÖGØ@˜Ð@Ð"3°ZÑ@ˆGÙ,¨W×5Ò5Ø×%Ñ% gÔ.ÚÙ=¸gÓFˆØ—L‘L“Nˆ	ØÒØ—=‘= ×0Ò0Ø,4�	˜.Ñ)øð
 ,8×+;Ñ+;¸IÓ+FˆIÐ'Ñ(Ø�M‰M˜.¨$Ô/Ø×!Ñ! )×,ñA ñB &Ð&8ÔDÐDr/   z#/api/sessions/{session_id}/messagesc                ó®   € V ^8„  d   QhR\         R\        \         ,          R\        \        ,          R\        R\        \         ,          R\        R\        /# )r(   r¨   rl   r¹   rº   r¼   Úinclude_compactedrÈ  )r„   r   rÂ   r’   )r,   s   "r-   r.   r.   ä  sU   € ÷ +2ñ +2Üð+2Ü&¤s�mð+2Ü;CÄC½=ð+2äð+2ä)1´#­ð+2ô ð+2ô <@ñ+2r/   c              ƒ   óœ  a aaaa"  € SR9  d   \        RRR7      hVVVVV 3R lp\        P                  ! \        WRR7      G R j  x€L
 pVf   \        R	\        R7      hVw  ršp\        P                  ! \
        V\        V4      VR
7      G R j  x€L
 pRT	R\        V4      RTRRT
RSRS;'       g	    Sf   RMRR\        V4      //#  L� L:5i)NÚoldestrž  rB   z$order must be one of: oldest, latestr1   c                 óì   <€ \        V S	4      pV'       g   R # V P                  V4      pSR J pSR8H  ;'       g    SR J ;'       d    TpV'       d   RM\        SR4      pWV P                  WSVSRR7      3# )Nrž  rÔ   T)r¹   rº   rž  rë  Úinclude_ancestors)r³   Úresolve_resume_session_idrq   Úget_messages)
r|   rö   Údefault_pageÚlatest_pageÚ_limitrë  r¹   rº   r¼   r¨   s
   &    €€€€€r-   Ú_readÚ#get_session_messages.<locals>._readë  s‹   ø€ Ü! " jÓ1ˆßÙØ×*Ñ*¨3Ó/ˆð  �}ˆØ˜xÑ'×KÐK¨E°T¨M×,JÐ,J¸lˆß$‘¬#¨e°S«/ˆð ˜BŸO™OØ f°[Ø/À4ð ,ó Ið Ið 	Ir/   TrK   r~  )rÇ  rÈ  r¨   rl   rs  Ú
paginationr¹   rº   r¼   Úreturned)Nrí  rž  )	r   rB  rC  r    r‚  ré  r¼  r¥   r6   )r¨   rl   r¹   rº   r¼   rë  rÈ  rõ  Úresultrö   rô  rs  rä  s   f&ffff&      r-   Úget_session_messagesrú  ã  sä   üé € ð
 Ð.Ô.Ü¨Ð4ZÔ[Ð[÷Iñ Iô( ×$Ò$¤X¨wÈÔN×N€FØ‚~Ü¨´JÔ?Ð?Ø"Ñ€C�Ü&×0Ò0Ü˜hÔ-BÀ7Ó-KØ#ô %÷ %Ðð 	�cð 	Ô# GÓ,ØÐ&ØØ�V˜X vØ�U×GÐG¨5ª=™x¸hØœÐ.Ó/ð1ð	2ð 	2ñ Oñ%ùs*   ‡?CÁCÁACÂC
Â!CÂ2CÃ
Cc                ó<   € V ^8„  d   QhR\         R\         R\         /# )r(   r¨   Úownerr*   rù   )r,   s   "r-   r.   r.     s!   € ÷ ñ ¬ð ´Sð ¼Sñ r/   c                 ó¶   a a€ V V3R  lpV! V4      '       g   \        R\        R7      hS P                  V4      pV! V4      '       g   \        R\        R7      hV# )c                 ó^   <€ SP                  R V 34      pVRJ;'       d    VR,          RS39   # )z.SELECT profile_name FROM sessions WHERE id = ?NrÝ   )Ú	_read_one)rö   rŽ   r|   rü  s   & €€r-   r†  Ú#_timeline_session_id.<locals>.owned  s6   ø€ Ø�l‰lÐKÈcÈVÓTˆØ˜$ˆ×GÐG 3 ~Õ#6¸4À¸-Ñ#GÐGr/   r~  r1   )r   r‚  rð  )r|   r¨   rü  r†  rö   s   f&f  r-   Ú_timeline_session_idr    sN   ù€ öHñ �×ÒÜ¨´JÔ?Ð?Ø
×
&Ñ
& zÓ
2€CÙ��:Š:Ü¨´JÔ?Ð?Ø€Jr/   z#/api/sessions/{session_id}/timelinerÔ   c                ó^   € V ^8„  d   QhR\         R\        \         ,          R\        R\        /# )r(   r¨   rl   r¹   Úafter_row_id)r„   r   rÂ   )r,   s   "r-   r.   r.   "  s6   € ÷ Mñ MÜðMÜ&¤s�mðMäðMä9<ñMr/   c              ƒ  ó˜   a aaaa"  € ^ RI Ho \        V4      oVVVVV 3R lp\        P                  ! \
        WRR7      G Rj  x€L
 #  L5i)zëPrompt metadata only, including compacted display history (never rewind rows).

``next_cursor`` is a stable logical first-row id; pass it as ``after_row_id``.
Entry ``row_id`` addresses the current representative for /messages/around.
)Úget_session_timelinec                 ó@   <€ \        V SS4      pR VRS/S! WSSR7      C# )r¨   rl   )r¹   r  )r  )r|   rö   r  r¹   rü  Úread_timeliner¨   s   & €€€€€r-   rõ  Ú#get_session_timeline.<locals>._read/  s8   ø€ Ü" 2 z°5Ó9ˆØ˜c 9¨eð RÙ ¨uÀ<ÔPðRð 	Rr/   TrK   N)Úhermes_state_timeliner  r¥   rB  rC  r    )r¨   rl   r¹   r  rõ  rü  r  s   f&ff @@r-   r  r  !  s?   üé € õ Lä˜WÓ%€E÷Rñ Rô
 ×"Ò"¤8¨WÀtÔL×LÐLÑLùs   ‡<A
ÁAÁA
z*/api/sessions/{session_id}/messages/around.c                ó^   € V ^8„  d   QhR\         R\        R\        \         ,          R\        /# )r(   r¨   Úrow_idrl   r¹   rî   )r,   s   "r-   r.   r.   8  s0   € ÷ ñ ÜðÜ ðÜ>FÄs½mðäñr/   c              ƒ  ó  a aaaa"  € ^ RI Ho \        V4      oVVVVV 3R lp\        P                  ! \
        W$RR7      G Rj  x€L
 p\        P                  ! \        VR,          \        V4      R7      G Rj  x€L
 VR&   V#  L> L5i)zLBounded display page starting at a timeline prompt; no intervening payloads.)Úget_session_messages_aroundc                 óf   <€ \        V SS4      pS! WSSR 7      pVf   \        RRR7      hRVRS/VC# ))r¹   r~  zPrompt not foundr1   r¨   rl   )r  r   )r|   rö   Úpager¹   rü  Úread_aroundr  r¨   s   &  €€€€€r-   rõ  Ú*get_session_messages_around.<locals>._readA  sF   ø€ Ü" 2 z°5Ó9ˆÙ˜2 F°%Ô8ˆØŠ<Ü¨CÐ8JÔKÐKØ˜c 9¨eÐ<°tÐ<Ð<r/   TrK   Nrs  rÚ  )r	  r  r¥   rB  rC  r    ré  r¼  )r¨   r  rl   r¹   rõ  rù  rü  r  s   ff&f  @@r-   r  r  7  sx   üé € õ Qä˜WÓ%€E÷=ñ =ô ×$Ò$¤X¨wÈÔN×N€FÜ&×0Ò0Ü˜f ZÕ0Ô7LÈWÓ7Uô W÷ W€Fˆ:Ñà€Mñ OñWùs#   ‡<BÁBÁ4BÁ8BÁ9
BÂBc                ó¸   € V ^8„  d   QhR\         R\        R\        \         ,          R\        \         ,          R\        \        ,          R\        \        ,          /# )r(   r¨   r)   rl   rW  rX  Úexpected_generation)r„   r
   r   rÂ   )r,   s   "r-   r.   r.   O  sL   € ÷ ñ ¬cð ¼Gð ÌhÔWZÍmð Ü.6´s­mðÜW_Ô`cÕWdðä7?Äµ}ñr/   c              ƒ   ó  a "  € ^ RI Hp ^ RIHp  V! WS W4VR/ R7      G Rj  x€L
 p\        T4      p
TP                  R4      ;'       g    R F6  p\        P                  ! TP                  T
\        T4      4      G Rj  x€L
  K8  	  T#  Lf  \         de   p	T	P
                  R8X  dN   T	P                  R8X  d=   \        P                  ! \        TT 3R lR	R
7      G Rj  x€L 
 '       d   RR	RR	/u Rp	?	# h Rp	?	ii ; i L~5i)rŒ  rT  )Ú	SessionDBÚdelete©rW  rX  r  rY  r  Nr~  Ú	not_foundc                 ó*   <€ V P                  S4      R J # rD   r�  r�  s   &€r-   rM  Ú)delete_session_endpoint.<locals>.<lambda>b  s   ø€ ¨b¯n©n¸ZÓ.HÈDÑ.Pr/   TrK   rQ   Úalready_absentÚdeleted_idsr\   )rŸ   rU  Úhermes_stater  r   r2   r3   rB  rC  r    rl  rt   Ú_remove_session_filesr„   )r¨   r)   rl   rW  rX  r  rU  r  rù  r²   rd   rö   s   f&&&&&      r-   Údelete_session_endpointr  N  sø   øé € õ GÝ&ðÙ.¨wÀØ!Ø 3¸xÐQSôU÷ Uˆô& & gÓ.€LØ�z‰z˜-Ó(×.Ð.¨BÒ.ˆÜ×Ò 	× ?Ñ ?ÀÌsÐSVËxÓX×XÒXñ /à€Mñ-Uøô ô ð �?‰?˜cÔ! c§j¡j°KÔ&?Ì'×J[ÒJ[Ü˜'Ô#PÐ\`ôKb÷ Eb÷ Ebà˜$Ð 0°$Ð7Õ7Øûðúñ$ 	Yùsn   ƒC?‘B ¢B	£B §"C?Á
4C?Á>C=Á?
C?Â	B ÂC:ÂAC5ÃC Ã
C5Ã)C5Ã.C:Ã/C?Ã4C5Ã5C:Ã:C?c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r(   r)   rl   )r
   r   r„   )r,   s   "r-   r.   r.   n  s   € ÷ 	*ñ 	*œ7ð 	*¬X´c­]ñ 	*r/   c                ó  € \        V P                  P                  RR4      pVf   R# ^ RIHp ^ RIHp V'       d   \        \        V4      ^,          4      M\        V! 4       4      P                  pV! W%4      p\        VRR4      # )zVThe live owner's own store for *profile* when a composed gateway serves it, else None.Úgateway_runnerN)Úauthority_for_home)Ú_default_db_pathr|   )
rE   ÚappÚstateÚgateway.session_authoritiesr#  r  r$  r   r$   rÖ   )r)   rl   Úrunnerr#  r$  rÇ  r”  s   &&     r-   Ú_owner_db_forr)  n  sj   € ä�W—[‘[×&Ñ&Ð(8¸$Ó?€FØ‚~ÙÝ>Ý-ß3:Œ4Ô" 7Ó+¨AÕ.Ô/ÄÑEUÓEWÓ@X×@_Ñ@_€DÙ" 6Ó0€IÜ�9˜d DÓ)Ð)r/   z/api/sessions/owner-backfillc                ó0   € V ^8„  d   QhR\         R\        /# )r(   r9   r)   )r   r
   )r,   s   "r-   r.   r.   {  s   € ÷  >ñ  >Ô0Dð  >Ìwñ  >r/   c           	   ƒ  óà  a"  € \        V P                  4      o\        RRRR7      ;_uu_ 4        \        WP                  4      pVe+   \        P
                  ! VP                  S4      G Rj  x€L
 pM4\        P
                  ! \        V P                  V3R lRR7      G Rj  x€L
 pRRR4       X'       d   \        P                  ! R	VS4       R
RRVRS/#  Li L6  + '       g   i     L<; i5i)u"  Stamp legacy ``profile_name = NULL`` rows with the serving-profile identity.

A multi-connection Desktop fails closed on unowned rows.  Each ``state.db``
belongs to exactly one profile, so this is a single-match, idempotent
backfill (non-NULL owners are never overwritten).

That was fine while one backend served everything, but a Desktop with registry topology (â‰¥2 registered
connections) fails closed on unowned rows by design â€” leaving every pre-campaign session unresumable
with no migration path. Each profile's ``state.db`` belongs to exactly one profile, so stamping that
store's own name is a single-match backfill, never a guess; the value written is the SAME
serving-profile identity the list endpoints already stamp onto outgoing rows (``row_profile`` in
``get_sessions``). See #95407.
z(POST /api/sessions/owner-backfill failedrÔ   rÕ   rñ   Nc                 ó&   <€ V P                  S4      # rD   )Úbackfill_null_session_profiles)r|   Ústamps   &€r-   rM  Ú1backfill_session_owner_profiles.<locals>.<lambda>”  s   ø€ °2×3TÑ3TÐUZÔ3[r/   FrK   zMowner-backfill: stamped %d legacy NULL-profile session row(s) with profile %rrQ   TÚstampedrl   )
r¥   rl   r   r)  rB  rC  r-  r    r¯   Úinfo)r9   r)   Úowner_dbr0  r.  s   &&  @r-   Úbackfill_session_owner_profilesr3  z  sÎ   øé € ô ˜TŸ\™\Ó*€Eä	Ø2°CÐ@W÷
Yö 
Yä  ¯,©,Ó7ˆØÒô $×-Ò-¨h×.UÑ.UÐW\Ó]×]‰Gä#×-Ò-Ü˜$Ÿ,™,Ô([Øô!÷ !ˆG÷
Y÷ Ü�	Š	Ø[Ø�Uô	ð �$˜	 7¨I°uÐ=Ð=ñ ^ñ!÷
Y÷ 
YüsF   ƒ,C.¯>CÁ-CÁ.4CÂ"CÂ#CÂ'C.Â7 C.ÃCÃCÃC+	Ã&C.c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r(   r¨   r9   r)   )r„   r   r
   )r,   s   "r-   r.   r.   Ÿ  s'   € ÷ \ñ \¬cð \¼ð \ÔQXñ \r/   c              ƒ  óö   "  € ^ RI Hp R Uu/ uF  p\        W4      f   K  V\        W4      bK   	  ppV! W!P                  V VP                  VP
                  VP                  RVR7      G Rj  x€L
 # u upi  L	5i)zETitle and sidebar flags share one authoritative revision and receipt.rT  NÚsidebarr  )r  rO   rØ  rÑ   Úunread)rŸ   rU  rE   rl   rW  rX  r  )r¨   r9   r)   rU  Úkeyr  s   &&&   r-   Úrename_session_endpointr9  ž  s�   é € õ GÙ2eó 2Ñ2e¨3Ü˜$Ó$ô 'ˆs”G˜DÓ&Ò&Ñ2e€Gð 2á(¨·,±,À
Ø—?‘?°d×6LÑ6LØ ×4Ñ4À	ÐSZô\÷ \ð \ùò2ñ\ùs    ‚A9�A2¡A2±<A9Á-A7Á.
A9c                ó$   € V ^8„  d   QhR\         /# r¾  rù   )r,   s   "r-   r.   r.   ©  s   € ÷ Xñ Xœ#ñ Xr/   c                 óF   € \         P                  ! \        V 4      R RR7      # )F)Úensure_asciiÚ
separators)rˆ   Ú:)r­  Údumpsr   )Úobjs   &r-   Ú_compact_jsonrA  ©  s   € Ü�:Š:Ô& sÓ+¸%ÈJÔWÐWr/   z!/api/sessions/{session_id}/exportc                óF   € V ^8„  d   QhR\         R\        \         ,          /# r{  r©   )r,   s   "r-   r.   r.   ®  s"   € ÷  Nñ  N¬cð  N¼HÄS½Mñ  Nr/   c              ƒ  óì   a aaa"  € V 3R lp\         P                  ! \        SVRR7      G Rj  x€L
 pVe   V^,          f   \        R\        R7      hVw  ooVVV3R lp\        V! 4       RR	7      #  LC5i)
z6Stream a single session (metadata + messages) as JSON.c                 óT   <€ \        V S4      pV'       d   WP                  V4      3# R # rD   )r³   rõ   )r|   rö   r¨   s   & €r-   Ú_prepare_exportÚ0export_session_endpoint.<locals>._prepare_export°  s(   ø€ Ü! " jÓ1ˆß-0�—^‘^ CÓ(Ð)Ð:°dÐ:r/   TrK   Nr~  r1   c               3   ó’  <"  € \        SR R7      p  \        S4      RR R,           x € ^ R r! V P                  SRVR R7      pV F#  pV'       d   RMR\        V4      ,           x € RpK%  	  \        V4      R8X  d   VR,          P	                  R	4      MRpVe   Ko   R
x € T P                  4        R#   T P                  4        i ; i5i)TrK   Nz,"messages":[rÔ   )r¹   Úafter_idÚinclude_inactiver‡   rˆ   Fr  z]}rf   )r%   rA  rñ  r6   rt   ru   )r|   Úlast_idÚfirstrs  r¢  rl   r…  rö   s        €€€r-   Ú_stream_exportÚ/export_session_endpoint.<locals>._stream_exportº  s¶   øé € Ü)¨'¸TÔBˆð	Ü Ó(¨¨"Ð-°Õ?Ò?ð  �UØØŸ?™?¨3°cÀGÐ^b˜?Óc�Û'�Gß!&™2¨C´=ÀÓ3IÕIÒIØ!’Eñ  (ô 58¸³MÀSÔ4H˜( 2�,×*Ñ*¨4Ô0Èd�Ø”?ØØŠJà�H‰HŽJøˆB�H‰H�Jüs#   ƒC’BB2 ÂB2 Â CÂ2CÃCzapplication/json)Ú
media_type)rB  rC  r    r   r‚  r   )r¨   rl   rE  ÚpreparedrL  r…  rö   s   ff   @@r-   Úexport_session_endpointrP  ­  sj   ûé € õ;ô ×&Ò&¤x°¸/ÐUYÔZ×Z€HØÒ˜8 A�;Ò.Ü¨´JÔ?Ð?à�L€Cˆ÷ô( ™^Ó-Ð:LÔMÐMñ5 [ùs   †(A4®A2¯AA4z/api/sessions/prunec                ó$   € V ^8„  d   QhR\         /# r=   r>   )r,   s   "r-   r.   r.   Ò  s   € ÷ 	cñ 	c¬ñ 	cr/   c              ƒ  ó4  "  € V P                   '       d$   \        P                  ! \        V 4      G Rj  x€L
 # T P	                  R\        V P                  R4      /R7      p ^ RIHp \        P                  ! WP                  \        V 4      G Rj  x€L
 #  L` L5i)zGDelete ended sessions matching filters without blocking the event loop.Nrl   zPOST /api/sessions/prune)r  r�   )	rm   rB  rC  r€   Ú
model_copyr   rl   rŸ   rž   )r9   rž   s   & r-   Úprune_sessions_endpointrT  Ñ  s}   é € ð ‡|‡|€|Ü×&Ò&¤¸Ó=×=Ð=ð �?‰?ØÔ& t§|¡|Ð5OÓPð#Rˆ?ó S€DåHÜ×"Ò"Ð#<¿l¹lÌOÐ]aÓb×bÐbñ >ñ cùs"   ‚1B³B´ABÂBÂBÂBi  �)
r½   Ú
title_likerç   rÀ   Ú
model_likeÚproviderÚuser_idÚchat_idÚ	chat_typeÚbranch_like)r»   Úmax_messagesÚ
min_tokensÚ
max_tokensÚmin_costÚmax_costÚmin_tool_callsÚmax_tool_calls)r  r½   r  r  r[   rV   r  )r‡   é   NNNNrD   )NNNN)hÚ__doc__rB  r­  r6  r­   rÙ   Úpathlibr   Útypingr   r   r   Úfastapir   r   r	   r
   Úfastapi.encodersr   Úfastapi.responsesr   Úhermes_cli.session_listingr   Úhermes_cli.web_depsr   Úhermes_cli.web_server_gatewayr   rŸ   r   Úhermes_cli.web_modelsr   r   r   r   r   Úhermes_cli.web_routers._commonr   r   r   r¯   r   r   r  r   Úhermes_state_errorsr   r   r   Úhermes_state_healthr    r!   r"   Úlist_routerÚsearch_routerÚmanage_routerr#   r$   r%   r&   r‚  r7   r;   ri   rj   rs   r€   r•   rŒ   r–   r    r¥   r³   rt   rã   rë   rD  ÚpostrQ  r^  rg  r  rn  ry  r‰  r–  rŸ  r¶  rº  r¼  rl  rÆ  ré  rú  r  r  r  r  r)  r3  Úpatchr9  rA  rP  rT  r\   r/   r-   Ú<module>rv     s6  ðñó Û Û 	Û Û Ý ß +Ñ +ç <Ó <Ý -Ý /å =Ý $Ý BÝ E÷Zõ Z÷õ õ /ß mÑ mß RÑ Rá‹k€Ù“€Ù“€áÐ4Ð6RÓSÐ ÙÐ.Ð0LÓMÐ Ù#Ð$BÐDdÓeÐ Ù#Ð$BÐDdÓeÐ à €
ð -Ð õð6Ð ð(Ð ð
 c€õ,ð^ Ð õFõ
Yõ3õRõð0 ‡��Ó!á�r˜a CÔ(¹¸aÀA¼Ð\]Ø¨IÈDÐhlØ"&ÀÐTYØ!ö	ZMó "ðZMõz+ð ×ÑÐ)Ó*öpSó +ðpSðf ×ÑÐ/Ó0ôGó 1ðGð2 ×ÑÐ*Ó+ôAó ,ðAð$ ×ÑÐ.Ó/öó 0ðð ×ÑÐ+Ó,ö,ó -ð,ð$ ×ÑÐ(Ó)öNó *ðNð* ×ÑÐ/Ó0öOó 1ðOð2 ×ÑÐAÓBöNó CðNð ×ÑÐAÓBö5ó Cð5õõ,Jò
õ7õPðAE°ð AEÈT÷ AEðH ×ÑÐ8Ó9à.2É5ÐQUÐZ[ÔK\Ù˜˜a”.¹¸t»Ù# E›lÁ%ÈÃ+ö+2ó :ð+2õ\ð ×ÑÐ8Ó9à.2Ù�s˜q SÔ)¹uÀQÈ1¼~öMó :ðMð* ×ÑÐ?Ó@á#(¨°Ô#3ÈdÙ�s˜q SÔ)öó Aðð, ×ÑÐ2Ó3öó 4ðõ>	*ð ×ÑÐ2Ó3ô >ó 4ð >ðF ×ÑÐ1Ó2ô\ó 3ð\õXð ×ÑÐ6Ó7ö Nó 8ð NðF ×ÑÐ)Ó*ô	có +ò	cr/   