+
    „WÝjf8  ã                   óð   € R t ^ RIt^ RIt^ RIHt ]! 0 Rm4      t]0 Rm,          t]! 0 Rm4      tR t	R t
R tR tR tR tR	 tR
 tR tR tR tR tR tR]R]R]R]R]R]R]R]R]R]	R]
R]/tR R ltR# )!zMClosed worker lifecycle handlers, called only inside the receipt transaction.N)ÚRuntimeStoreErrorc                 ó(  € \        V4      \        ,
          '       g   R V9  d   \        R4      hVP                  RV34      P	                  4       pVe   VR ,          VR ,          8w  d   \        R4      h\
         F2  pVP                  V4      pVf   K  WdV,          8w  g   K)  \        R4      h	  \        R0,
           F?  pVP                  V4      f   K  \        W5,          \        4      '       d   K6  \        R4      h	  VP                  R4      pVe>   \        V\        4      '       d   \        V4      \        ,
          '       d   \        R4      h\        WV3/ VB  V'       d)   VP                  R\        P                  ! V4      V34       RV/# )ÚsourceÚinvalid_paramsz!SELECT * FROM sessions WHERE id=?Úpermission_deniedÚmodel_configz�UPDATE sessions SET model_config=json_patch(model_config,?) WHERE id=? AND json_type(model_config,'$._delegate_from') IS NOT NULLÚvalue)ÚsetÚ_CREATE_FIELDSr   ÚexecuteÚfetchoneÚ_IDENTITY_FIELDSÚgetÚ
isinstanceÚstrÚdictÚ_CONSTRUCTOR_CONFIGÚ!insert_session_row_in_transactionÚjsonÚdumps)ÚdbÚconnÚ
session_idÚpayloadÚrowÚkeyr   Úconfigs   &&&&    ÚQC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_state_worker_lifecycle.pyÚworker_creater      sX  € Ü
ˆ7ƒ|”n×$Ô$¨¸Ô(?ÜÐ 0Ó1Ð1Ø
�,‰,Ð:¸Z¸MÓ
J×
SÑ
SÓ
U€Cà
‚{�g˜hÕ'¨3¨x­=Ô8ÜÐ 3Ó4Ð4ßˆØ—‘˜CÓ ˆØÔ ¨c­(Ö!2Ü#Ð$7Ó8Ð8ñ  ô  Ð 0×0Ð0ˆØ�;‰;�sÓÔ'´
¸7½<Ì×0MÔ0MÜ#Ð$4Ó5Ð5ñ 1ð �[‰[˜Ó(€FØÒ¤:¨f´d×#;Ò#;¼sÀ6»{ÔM`×?`Ô?`ÜÐ 0Ó1Ð1Ü% b°
ÑF¸gÒFßð 	�‰ð RÜTX×T^ÒT^Ð_eÓTfÐhrÐSsô	uà�ZÐ Ð ó    c                 ó
  € \        V4      R 08w  g-   \        VR ,          \        4      '       d   VR ,          '       g   \        R4      hV P	                  VR\
        P
                  ! 4       VR ,          V3W#R ,          4       RR/# )Ú
end_reasonr   zKUPDATE sessions SET ended_at=?,end_reason=? WHERE id=? AND ended_at IS NULLr   N)r	   r   r   r   Ú_end_and_bumpÚtime©r   r   r   r   s   &&&&r   Ú
worker_endr%   *   su   € Ü
ˆ7ƒ|˜�~Ô%¬Z¸ÀÕ8MÌs×-SÒ-SÐ[bÐco×[pÔ[pÜÐ 0Ó1Ð1Ø×Ñ�TØUÜ	�Š‹�g˜lÕ+¨ZÐ8¸*ÈlÕF[ô]ð �Tˆ?Ðr   c                 óä   € ^ RI Hp V'       d   \        R4      hVP                  RV34      P	                  4       pV'       d*   V! VR,          \        VR,          4      VR,          R7      MRpR	V/# )
é    )Úclassify_session_statusr   z|SELECT role,tool_calls IS NOT NULL AS has_tool_calls,finish_reason FROM messages WHERE session_id=? ORDER BY id DESC LIMIT 1ÚroleÚhas_tool_callsÚfinish_reason)r)   r*   r+   Úemptyr   )Úhermes_state_sessionsr(   r   r   r   Úbool)r   r   r   r   r(   r   r   s   &&&&   r   Úworker_lifecycler/   3   s{   € Ý=ßÜÐ 0Ó1Ð1Ø
�,‰,ð SØU_ÐTaócßckÑckÓcmð ÷ LOñ $¨¨V­ÄTÈ#ÐN^ÕJ_ÓE`Ø25°oÕ2FõHØT[ð 
à�UÐÐr   c           	      óH  € \        V4      R R08w  g7   VR,          R	9  g)   VR ,          e)   \        VR ,          \        4      '       g   \        R4      h \	        V P                  WVR ,          VR,          R7      4      pRV/#   \         d    RRRRRTR ,          /u # i ; i)
Útitler   r   )r   r   FÚerrorzTitle unavailable or invalidÚtitle_candidate©ÚuserÚderivedÚllm)r	   r   r   r   r.   Ú!_set_session_title_in_transactionÚ
ValueError)r   r   r   r   r   s   &&&& r   Úworker_titler:   >   s»   € ÜˆG‹˜ (Ð+Ô+¨w°xÕ/@ÐHbÔ/bØ˜GÕ$Ò,´
¸7À7Õ;KÌS×0QÒ0QÜÐ 0Ó1Ð1ðnÜ�R×9Ñ9Ø˜g gÕ.°w¸xÕ7Hð :ó Jó Kˆð �UÐÐøô	 ô nð ˜ Ð)GÐIZÐ\cÐdkÕ\lÐmÒmðnús   Á+B ÂB!Â B!c                 óª   € \        V4      R 08w  g   VR ,          R9  d   \        R4      hRVP                  RVR ,          V34      P                  ^ 8„  /# )r   r   r   zCUPDATE sessions SET title_source=? WHERE id=? AND title IS NOT NULLr4   )r	   r   r   Úrowcountr$   s   &&&&r   Úworker_title_sourcer=   L   s]   € Ü
ˆ7ƒ|˜�zÔ! W¨XÕ%6Ð>XÔ%XÜÐ 0Ó1Ð1Ø�T—\‘\ØMØ	�Õ	˜JÐ'ó)ç)1©°Añ6ð 7ð 7r   c                 óÚ  a€ ^ RI Ho ^ RIHp \	        V4      R08w  g   \        VR,          \        4      '       g   \        R4      hVP                  RV34      P                  4       ^ ,          pVR,          pVP                  RW&34      P                  4       pWe8w  d   Vf   \        R4      hSP                  V4      pV'       d   VP                  ^4      MTp	VP                  RW”! V	4       R	234      P                  4       p
V
'       g   R
V	/# V3R lV
 4        Uu. uF&  q»'       g   K  \        VP                  ^4      4      NK(  	  ppR
V	 R\        ^.VO4      ^,            2/# u upi )r'   )Ú_NUMBERED_TITLE_RE)Úescape_likeÚ
base_titler   z%SELECT title FROM sessions WHERE id=?zÃSELECT 1 FROM worker_receipts r JOIN worker_executions w ON w.execution_id=r.execution_id WHERE w.session_id=? AND w.status='running' AND json_extract(r.result_json,'$.title_candidate')=? LIMIT 1r   zCSELECT title FROM sessions WHERE title=? OR title LIKE ? ESCAPE '\'z #%r   c              3   óT   <"  € T F  pSP                  VR ,          4      x € K  	  R# 5i)r1   N)Úmatch)Ú.0r   r?   s   & €r   Ú	<genexpr>Ú$worker_next_title.<locals>.<genexpr>j   s'   øé € Ð(`Ñ[_ÐTWÐ);×)AÑ)AÀ#ÀgÅ,×)OÐ)OÓ[_ùs   ƒ%(z #)Úhermes_state_titlesr?   Úhermes_state_commonr@   r	   r   r   r   r   r   rC   ÚgroupÚfetchallÚintÚmax)r   r   r   r   r@   r1   Ú	candidateÚ	attemptedrC   ÚbaseÚrowsÚmÚnumbersr?   s   &&&&         @r   Úworker_next_titlerS   T   s[  ø€ Ý6Ý/Ü
ˆ7ƒ|˜�~Ô%¬Z¸ÀÕ8MÌs×-SÒ-SÜÐ 0Ó1Ð1Ø�L‰LÐ@À:À-ÓP×YÑYÓ[Ð\]Õ^€Eð ˜Õ%€IØ—‘ð	Hð 
Ðó	!÷ "*¡£ð	 ð
 Ô˜iÒ/ÜÐ 3Ó4Ð4Ø×$Ñ$ YÓ/€Eß"ˆ5�;‰;�qŒ>¨	€DØ�<‰<Ð^Ø +¨dÓ"3Ð!4°CÐ8Ð9ó;ß;C¹8»:ð 	çØ˜ˆÐÜ(`Ñ[_Ô(`ÓfÑ(` 1ÓdeŒŒs�1—7‘7˜1“:ŽÑ(`€GÐfØ˜�v˜R¤ Q M¨ MÓ 2°QÕ 6Ð7Ð8Ð9Ð9ùò gs   Ä	E(Ä,E(c           	      ó*  a€ ^ RI p^ RIHpHp \	        S4      0 Rm8w  gA   \
        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   \        R	4      hSR,          pVe=   \        V4      \        \        39  g   VP                  V4      '       g   \        R	4      hVf   \        P                  ! 4       M
\        V4      pVP                  R
Wu! SR,          4      V! SR,          4      P                  W'34       RR/# )r'   N)Úbound_activity_descriptionÚnormalize_activity_provenanceÚtsÚdescriptionÚ
provenancec              3   ó‚   <"  € T F4  pSV,          R J;'       d    \        SV,          \        4      '       * x € K6  	  R # 5i©N©r   r   ©rD   Úkr   s   & €r   rE   Ú"worker_activity.<locals>.<genexpr>r   s:   øé € ð ;Ù9�qð ˜1•: TÐ)×MÐM´*¸WÀQ½ZÌÓ2MÔ.MÔMÛ9ùó   ƒ?š%?TFr   z�UPDATE sessions SET last_activity_at=?,last_activity_description=?,last_activity_provenance=? WHERE id=? AND (last_activity_at IS NULL OR last_activity_at<?)r   >   rW   rY   rX   )rX   rY   )ÚmathÚagent.session_activityrU   rV   r	   Úanyr   ÚtypeÚfloatrK   Úisfiniter#   r   r   )r   r   r   r   ra   rU   rV   Úwhens   &&&f    r   Úworker_activityrh   n   sé   ø€ Ûß`ÜˆG‹Ò;Ô;ß‹sô ;Ù9ó;�s�sŠsô ;Ù9ó;÷ ;ò ;äÐ 0Ó1Ð1Ø�4�=€DØÒœT $›Z´´s¨|Ô;À4Ç=Á=ÐQU×CVÒCVÜÐ 0Ó1Ð1Øš,Œ4�9Š9Œ;¬E°$«K€DØ‡L�Lð SàÐ2°7¸=Õ3IÓJÙ/°¸Õ0EÓF×LÑLÈjð`ôað �Tˆ?Ðr   c                 óŽ   € ^ RI Hp V'       d   \        R4      hVP                  RRVP                  P
                  V34       RR/# )r'   )ÚActivityProvenancer   zUUPDATE sessions SET last_activity_description=?,last_activity_provenance=? WHERE id=?Ú r   N)rb   rj   r   r   ÚUNKNOWNr   )r   r   r   r   rj   s   &&&& r   Úworker_activity_clearrm   €   sE   € Ý9ßÜÐ 0Ó1Ð1Ø‡L�LÐhØÐ(×0Ñ0×6Ñ6¸
ÐCôEà�Tˆ?Ðr   c                 ó  a€ \        S4      0 R
m8w  gA   \        ;QJ d    V3R lS 4       F  '       g   K   RM	  RM! V3R lS 4       4      '       d   \        R4      hVP                  RSR ,          SR,          SR,          V34       RR	/# )ÚproviderÚbase_urlÚbilling_modec              3   ó‚   <"  € T F4  pSV,          R J;'       d    \        SV,          \        4      '       * x € K6  	  R # 5ir[   r\   r]   s   & €r   rE   Ú'worker_billing_route.<locals>.<genexpr>‹   s6   øé € Ð_ÑW^ÐRS�7˜1•: TÐ)×MÐM´*¸WÀQ½ZÌÓ2MÔ.MÔMÓW^ùr`   TFr   zjUPDATE sessions SET billing_provider=?,billing_base_url=?,billing_mode=COALESCE(?,billing_mode) WHERE id=?r   N>   rp   ro   rq   )r	   rc   r   r   r$   s   &&&fr   Úworker_billing_routert   ‰   sz   ø€ ÜˆG‹Ò@Ô@ß‹sÔ_ÑW^Ó_�s�sŠsÔ_ÑW^Ó_×_Ò_ÜÐ 0Ó1Ð1ð 	‡L�Lð Ø '¨
Õ 3°W¸ZÕ5HÈ'ÐR`ÕJaÐcmÐnôpà�Tˆ?Ðr   c           	      ó  € ^ RI Hp \        V4      RR08w  g   \        VR,          \        4      '       g   \        R4      hVP                  RV! VR,          4      W P                  VR,          4      34      P                  pRV/# )r'   ©Ú_scrub_surrogatesÚcontentÚapi_contentr   zžUPDATE messages SET api_content=? WHERE id=(SELECT id FROM messages WHERE session_id=? AND role='user' AND active=1 ORDER BY id DESC LIMIT 1) AND content IS ?r   )	Úhermes_state_messagesrw   r	   r   r   r   r   Ú_encode_contentr<   )r   r   r   r   rw   r   s   &&&&  r   Úworker_api_contentr|   ”   s‡   € Ý7Ü
ˆ7ƒ|˜	 =Ð1Ô1¼ÀGÈMÕDZÔ\_×9`Ò9`ÜÐ 0Ó1Ð1Ø�L‰Lð	Rá	˜7 =Õ1Ó	2°J×@RÑ@RÐSZÐ[dÕSeÓ@fÐgói÷ jrÑiqð 
ð �UÐÐr   c                 ór   € V P                  R 4      p\        V4      \        Jg   V^ 8:  d   \        R4      hV# )Úrow_idr   )r   rd   rK   r   )r   r~   s   & r   Ú_row_idr   Ÿ   s3   € Ø�[‰[˜Ó"€FÜˆFƒ|œ3Ó &¨A¤+ÜÐ 0Ó1Ð1Ø€Mr   c                ó  € ^ RI Hp \        V4      0 Rm8w  g   \        VR,          \        4      '       g   \        R4      hRVP                  RV! VR,          4      \        V4      VV P                  VR,          4      34      P                  /# )zURow-addressed sidecar backfill, same guards as ``SessionDB.set_message_api_content``.rv   rx   ry   r   r   zkUPDATE messages SET api_content=? WHERE id=? AND session_id=? AND role='user' AND active=1 AND content IS ?>   r~   rx   ry   )
rz   rw   r	   r   r   r   r   r   r{   r<   )r   r   r   r   rw   s   &&&& r   Úworker_message_api_contentr�   ¦   s�   € å7Ü
ˆ7ƒ|Ò;Ô;Ä:ÈgÐVcÕNdÔfi×CjÒCjÜÐ 0Ó1Ð1Ø�T—\‘\ØuÙ	˜7 =Õ1Ó	2´G¸GÓ4DÀjØ	×	Ñ	˜G IÕ.Ó	/ð	1ó2÷ 3;±(ð<ð <r   c                ó¼   € \        V4      RR08w  d   \        R4      hRVP                  RV P                  VR,          4      \	        V4      V34      P
                  /# )zcRewrite ONE active user row of this session, same guards as ``SessionDB.set_user_message_content``.r~   rx   r   r   zVUPDATE messages SET content=? WHERE id=? AND session_id=? AND role='user' AND active=1)r	   r   r   r{   r   r<   r$   s   &&&&r   Úworker_user_contentrƒ   ±   sb   € ä
ˆ7ƒ|˜ )Ð,Ô,ÜÐ 0Ó1Ð1Ø�T—\‘\Ø`Ø	×	Ñ	˜G IÕ.Ó	/´¸Ó1AÀ:ÐNóPçPXÑPXðZð Zr   zsession.titlezsession.title_sourcezsession.next_titlezsession.activityzsession.activity_clearzsession.billing_routezsession.api_contentzsession.message_api_contentzsession.user_contentzsession.createzsession.endzsession.lifecyclec                ó€  € ^ RI Hp ^ RIHp VP	                  RV34      P                  4       f:   VP	                  RVV,           34      P                  4       '       d   \        R4      hT;'       g    RP                  4       '       g   V P                  4       pV P                  W4      pTP	                  RV,           Y#Y7Y‰Y«TV'       d   \        P                  ! V4      MRVWÍVVVVV\        P                  ! 4       34       Ve   V P                  V4       V'       d   V P                  W4       ^ R	IHp V! W4       R# )
zÈConnection-taking body of the keep-existing constructor upsert.

The ordinary constructor should delegate here too. Worker identity is
validated before entry; this helper never opens or commits a DB.
)Ú_UPSERT_KEEP_EXISTING_SQL)ÚRETIRED_PREFIXz!SELECT 1 FROM sessions WHERE id=?Nz$SELECT 1 FROM state_meta WHERE key=?Ú	not_foundrk   aƒ  INSERT INTO sessions (
           id, source, created_source, user_id, session_key, chat_id, chat_type, thread_id,
           model, model_config, system_prompt, system_prompt_hash,
           parent_session_id, cwd, profile_name, transport_profile, git_repo_root,
           origin_json, display_name, started_at
        )
           VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?)
           ON CONFLICT(id) DO UPDATE SET
               source = CASE
                   WHEN sessions.source = 'unknown'
                   THEN COALESCE(excluded.source, 'unknown')
                   ELSE sessions.source
               END,
               model = COALESCE(sessions.model, excluded.model),
               model_config = CASE
                   WHEN excluded.model_config IS NOT NULL
                        AND json_type(
                            sessions.model_config, '$._reset_from'
                        ) IS NOT NULL
                        AND json_remove(
                            sessions.model_config, '$._reset_from'
                        ) = '{}'
                   THEN json_set(
                       excluded.model_config,
                       '$._reset_from',
                       json_extract(
                           sessions.model_config, '$._reset_from'
                       )
                   )
                   ELSE COALESCE(
                       sessions.model_config, excluded.model_config
                   )
               END,
               system_prompt_hash = COALESCE(
                   sessions.system_prompt_hash,
                   excluded.system_prompt_hash
               ),
               system_prompt = CASE
                   WHEN sessions.system_prompt_hash IS NULL
                        AND excluded.system_prompt_hash IS NOT NULL
                   THEN NULL
                   ELSE sessions.system_prompt
               END,
)Ústamp_compression_ancestors)r-   r…   Ú hermes_state_mutation_retirementr†   r   r   r   ÚstripÚ_own_profile_nameÚ_store_system_promptr   r   r#   Ú#_delete_unreferenced_system_promptsÚ _inherit_parent_session_metadataÚhermes_state_compressionrˆ   )Úselfr   r   r   Úmodelr   Úsystem_promptÚuser_idÚsession_keyÚchat_idÚ	chat_typeÚ	thread_idÚparent_session_idÚcwdÚprofile_nameÚgit_repo_rootÚorigin_jsonÚdisplay_nameÚtransport_profiler…   r†   Úsystem_prompt_hashrˆ   s   &&&&&&&&&&&&&&&&&&&    r   r   r   Ê   s  € õ @Ý?ð 	�‰Ð8¸:¸-ÓH×QÑQÓSÒ[Ø—‘ÐCÀnÐWaÕFaÐEcÓd×mÑm×oÒoÜ Ó,Ð,Ø×Ð˜B×%Ñ%×'Ò'Ø×-Ñ-Ó/ˆØ×2Ñ2°4ÓGÐØ‡L�Lð+	ðV  õW+	 ðZ  °ÀyÐ]bß(4ŒD�JŠJ�|Ô$¸$Ð@RØ LÐ2CÀ]ÐT_Øœ$Ÿ)š)›+ð		
ô[3ðh Ò%Ø×0Ñ0°Ô6ßØ×-Ñ-¨dÔ?åDÙ Ö1r   >   r™   r•   r“   r–   r—   rœ   r”   r�   rš   r›   r˜   >   r‘   r   r   r’   >   Ú	yolo_modeÚ
max_tokensÚmax_iterationsÚreasoning_config)NNNNNNNNNNNNNNN)Ú__doc__r   r#   Úhermes_state_runtimer   Ú	frozensetr   r
   r   r   r%   r/   r:   r=   rS   rh   rm   rt   r|   r   r�   rƒ   ÚWORKER_LIFECYCLE_HANDLERSr   © r   r   Ú<module>r©      sÒ   ðÙ SÛ Û å 2ñ ò ó Ð ð "Ò$XÕX€ÙÒ aÓbÐ ò!ò4òòò7ò:ò4ò$òòòò<òZð �\ØÐ/ØÐ+Ø˜ØÐ3ØÐ1ØÐ-Ø!Ð#=ØÐ/Ø�mØ�:ØÐ)ðÐ ö P2r   