+
    iHàj3  ã                   ój   € R t ^ RIt^ RIt^ RIHt ^ RIHt ]P                  ! R4      t ! R R4      t	R# )a<  User-facing status / warning / notice plumbing for ``AIAgent``.

Safe printing, quiet-mode gating, deduped context-overflow warnings, and the buffered retry
chatter that is shown only when every retry/fallback is exhausted.
Extracted from ``run_agent.py``; every method resolves through ``AIAgent``'s MRO unchanged.
N)Út)ÚActivityProvenanceÚ	run_agentc                   ó  a € ] tR t^t o RtRR/V 3R lR lltRRRR/V 3R lR lltV 3R	 lR
 ltV 3R lR ltV 3R lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR  ltV 3R! lR" ltV 3R# lR$ ltV 3R% lR& ltV 3R' lR( ltV 3R) lR* ltV 3R+ lR, ltV 3R- lR. ltV 3R/ lR0 ltV 3R1 lR2 ltV 3R3 lR4 ltV 3R5 lR6 ltV 3R7 lR8 ltR9tV t R:# );ÚStatusOutputMixinzRStatus/warning/notice emission and retry-chatter buffering (see module docstring).Ú
diagnosticFc                ó    <€ V ^8„  d   QhRS[ /# )é   r   ©Úbool)ÚformatÚ__classdict__s   "€Ú8/home/ubuntu/.hermes/hermes-agent/agent/status_output.pyÚ__annotate__ÚStatusOutputMixin.__annotate__   s   ø€ ÷ 
ñ 
©Tñ 
ó    c               óâ   € \        V RR4      '       d   R# V'       d   V P                  4       '       g   R#  V P                  ;'       g    \        ! V/ VB  R#   \        \
        3 d     R# i ; i)zªPrint that swallows broken pipes / closed stdout (headless stdout can vanish mid-session);
routes through ``self._print_fn`` so the CLI can inject an ANSI-aware renderer.Ú_mute_notification_replyFN)ÚgetattrÚ_warning_presentation_enabledÚ	_print_fnÚprintÚOSErrorÚ
ValueError)Úselfr   ÚargsÚkwargss   &$*,r   Ú_safe_printÚStatusOutputMixin._safe_print   sc   € ô �4Ð3°U×;Ò;Ùß˜d×@Ñ@×BÒBÙð	Ø�^‰^×$Ð$œuÐ$ tÐ6¨vÔ6øÜœÐ$ô 	Úð	ús   ·A Á
A ÁA.Á-A.Úforcec                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r	   r   r   r
   )r   r   s   "€r   r   r       s   ø€ ÷ .ñ .¡Dð .¹dñ .r   c               ó"  € \        V RR4      '       d   R# V'       d   V P                  4       '       g   R# V'       g<   \        V RR4      '       g?   V P                  4       '       d   V P                  '       d   V P                  ! V/ VB  R# R# R# )uÈ   Verbose print â€” suppressed while tokens are streaming (allowed during tool execution) and after
the main response; ``force=True`` bypasses both. ``suppress_status_output`` (``hermes chat -q``) wins.Úsuppress_status_outputFNÚ_mute_post_response)r   r   Ú_has_stream_consumersÚ_executing_toolsr   )r   r   r   r   r   s   &$$*,r   Ú_vprintÚStatusOutputMixin._vprint    s€   € ô �4Ð1°5×9Ò9Ùß˜d×@Ñ@×BÒBÙßœ Ð'<¸e×DÒDÈ×IcÑIc×IeÒIeÐnr÷  oD÷  oDð  oDØ×Ò˜dÐ- fÔ-ñ oDÑDr   c                ó    <€ V ^8„  d   QhRS[ /# ©r	   Úreturnr
   )r   r   s   "€r   r   r   *   s   ø€ ÷ ñ ©Tñ r   c                ó¬   € V P                   e   R#  \        \        P                  P	                  4       4      #   \
        \        \        3 d     R# i ; i)z¡True when quiet-mode spinner output has a safe sink (``_print_fn`` or a real TTY); a raw spinner
on a non-TTY stdout can corrupt protocol streams (ACP JSON-RPC).TF)r   r   ÚsysÚstdoutÚisattyÚAttributeErrorr   r   ©r   s   &r   Ú_should_start_quiet_spinnerÚ-StatusOutputMixin._should_start_quiet_spinner*   sG   € ð �>‰>Ò%Ùð	ÜœŸ
™
×)Ñ)Ó+Ó,Ð,øÜ¤
¬GÐ4ô 	Úð	ús   ’&9 ¹AÁAc                ó    <€ V ^8„  d   QhRS[ /# r)   r
   )r   r   s   "€r   r   r   4   s   ø€ ÷ nñ n±$ñ nr   c                ó¦   € \        V RR4      '       d   R# V P                  ;'       d*    V P                  '       * ;'       d    \        V RR4      R8H  # )aþ  True when quiet-mode tool summaries should print directly (CLI, no callback owns rendering);
``suppress_status_output`` always wins so ``[tool]``/``[done]`` never land in captured stdout.

``suppress_status_output`` (the strict machine-readable mode used by ``hermes chat -Q``) always
wins: those flows neutralize the rendering callbacks, and without this gate the "no callback owns
rendering" fallback would print ``[tool]``/``[done]`` spinner lines into the captured stdout it
exists to keep clean (#93220).
r"   FÚplatformÚ Úcli)r   Ú
quiet_modeÚtool_progress_callbackr0   s   &r   Ú _should_emit_quiet_tool_messagesÚ2StatusOutputMixin._should_emit_quiet_tool_messages4   sK   € ô �4Ð1°5×9Ò9ÙØ�‰×mÐm t×'BÑ'BÔ#B×mÐmÄwÈtÐU_ÐacÓGdÐhmÑGmÐmr   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r	   ÚnameÚoriginr*   N©Ústr)r   r   s   "€r   r   r   A   s'   ø€ ÷ Lñ L¡3ð L±sð L¸tñ Lr   c               ó”   € \        WR4      pV'       d
    V! V!   R# R#   \         d    \        P                  RYRR7        R# i ; i)uh   Invoke ``self.<name>(*args)`` if set, swallowing errors â€” a driver callback must never break the loop.Nz%s error in %sT)Úexc_info)r   Ú	ExceptionÚloggerÚdebug)r   r=   r>   r   Úcbs   &&$* r   Ú_call_callbackÚ StatusOutputMixin._call_callbackA   sI   € ä�T Ó&ˆßðLÙ�D”	ñ øô ô LÜ—‘Ð-¨tÀd�×KðLús   –   #AÁAc                ó0   <€ V ^8„  d   QhRS[ RS[ RS[ RR/# )r	   ÚkindÚmessager>   r*   Nr?   )r   r   s   "€r   r   r   J   s/   ø€ ÷ Mñ M¡cð M±Cð MÁCð MÈDñ Mr   c               óè   € ^ RI Hp  V! W4      '       d   V P                  4       '       d"   V P                  V P                   V 2RR7       T P                  RYTR7       R#   \
         d     L#i ; i)zkPrint to the CLI (``_vprint(force=True)``) and forward to ``status_callback(kind, message)``. Never raises.)Úis_warning_statusT©r   Ústatus_callback©r>   N)Úgateway.warning_notificationsrM   r   r&   Ú
log_prefixrC   rG   )r   rJ   rK   r>   rM   s   &&&$ r   Ú_emit_status_kindÚ#StatusOutputMixin._emit_status_kindJ   sm   € åCð	Ù$ T×3Ò3°t×7YÑ7Y×7[Ò7[Ø—‘ §¡Ð0°°	Ð:À$�ÔGð 	×ÑÐ-¨tÀVÐÖLøô ô 	Ùð	ús   ˆ#A# ¬!A# Á#A1Á0A1c                ó    <€ V ^8„  d   QhRS[ /# r)   r
   )r   r   s   "€r   r   r   T   s   ø€ ÷ 	ñ 	©tñ 	r   c                óˆ   € ^ RI Hp  V! \        V R\        V RR4      4      \        V RR4      4      #   \         d     R# i ; i)é    )Úwarning_notifications_enabledÚ_notification_platformr5   r7   Ú_notification_configNT)rQ   rX   r   rC   )r   rX   s   & r   r   Ú/StatusOutputMixin._warning_presentation_enabledT   sO   € ÝOð	Ù0Ü˜Ð6¼ÀÀjÐRWÓ8XÓYÜ˜Ð4°dÓ;óð øô ô 	âð	ús   ˆ)2 ²AÁ Ac                ó$   <€ V ^8„  d   QhRS[ RR/# ©r	   rK   r*   Nr?   )r   r   s   "€r   r   r   _   s   ø€ ÷ 3ñ 3©sð 3°tñ 3r   c                ó@   € ^ RI Hp V P                  V! V4      4       R# )zGA diagnostic on the lifecycle rail, without changing legacy formatting.©ÚDiagnosticTextN)rQ   r`   Ú_emit_status©r   rK   r`   s   && r   Ú_emit_diagnostic_statusÚ)StatusOutputMixin._emit_diagnostic_status_   s   € å@Ø×Ñ™.¨Ó1Ö2r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   d   s   ø€ ÷ Lñ L¡Cð L¨Dñ Lr   c                ó.   € V P                  RVRR7       R# )zDEmit a lifecycle status message (CLI + gateway ``status_callback``).Ú	lifecyclera   rP   N©rS   ©r   rK   s   &&r   ra   ÚStatusOutputMixin._emit_statusd   s   € à×Ñ˜{¨G¸NÐÖKr   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   h   s   ø€ ÷ Hñ H¡Sð H¨Tñ Hr   c                ó.   € V P                  RVRR7       R# )zdEmit a user-visible warning for degraded side paths where the turn continues but the user must know.ÚwarnÚ_emit_warningrP   Nrh   ri   s   &&r   rn   ÚStatusOutputMixin._emit_warningh   s   € à×Ñ˜v w°ÐÖGr   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   l   s   ø€ ÷ eñ e©Sð e°Tñ er   c                ó¢  € VP                  4       p\        V RR4      ;'       g    RR8X  d   V P                  V4       R# ^ RIp^ RIHp RVP                  VP                  4       4      R 2pVP                  R4      '       d   RMR	pV! WR
WDR7      p\        V RR4      '       d   V P                  V4       R# . \        V RR4      OVNV n
        R# )a’  A warning raised during ``__init__`` that the user must see (e.g. a memory provider that
could not be recovered). The CLI prints it. Other drivers get a sticky warn ``AgentNotice``:
Desktop renders notices but no warn-kind ``status.update``, and the messaging gateway wires
its callbacks per turn, after init, so a notice raised before then waits for
:meth:`_replay_startup_warnings` on the first turn.r5   Nr7   )ÚAgentNoticezstartup-warning.Ú08xu   âœ“Úsuccessrm   Ústicky)ÚtextÚlevelrJ   ÚkeyÚidÚnotice_callbackÚ_pending_startup_notices© )Ústripr   rn   ÚzlibÚagent.credits_trackerrr   Úcrc32ÚencodeÚ
startswithÚ_emit_noticer{   )r   rK   r~   rr   rx   rw   Únotices   &&     r   Ú_emit_startup_warningÚ'StatusOutputMixin._emit_startup_warningl   s¿   € ð —-‘-“/ˆÜ�D˜* dÓ+×4Ð4¨u¸Ô>Ø×Ñ˜wÔ'ÙÛå5à  §¡¨G¯N©NÓ,<Ó!=¸cÐ BÐCˆØ$×/Ñ/°×6Ò6‘	¸FˆÙ '¸XÈ3ÔWˆÜ�4Ð*¨D×1Ò1Ø×Ñ˜fÖ%à,d¬g°dÐ<VÐXZÓ.[Ð,dÐ]cÐ,dˆDÖ)r   c                ó   <€ V ^8„  d   QhRR/# ©r	   r*   Nr|   )r   r   s   "€r   r   r   ‚   s   ø€ ÷ *ñ *¨$ñ *r   c                ó    € \        V R R4      pV'       d9   \        V RR4      '       d$   . V n        V F  pV P                  V4       K  	  R# R# R# )r{   Nrz   )r   r{   rƒ   )r   Úpendingr„   s   &  r   Ú_replay_startup_warningsÚ*StatusOutputMixin._replay_startup_warnings‚   sJ   € Ü˜$Ð :¸DÓAˆß”w˜tÐ%6¸×=Ò=Ø,.ˆDÔ)Û!�Ø×!Ñ! &Ö)ó "ñ >‰7r   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r	   ÚreasonÚpreflight_tokensÚthreshold_tokensr*   N)r@   Úint)r   r   s   "€r   r   r   ‰   s+   ø€ ÷ ñ ±Sð ÉCð Ñcfð Ðkoñ r   c                ó0  € T;'       g    RP                  R^4      ^ ,          pRV3p\        V RR4      V8X  d   R# YPn        ^ RIHp VR9   d&   V P                  RV R2\        P                  R	7       V P                  VP                  W#VR
7      4       R# )uÎ   Warn (deduped on the block *kind* â€” ``cooldown`` / ``ineffective`` â€” not the countdown string;
cleared by ``_clear_context_overflow_warn``) when context is over the threshold but compression is blocked.ÚunknownÚ:Úctx_overflow_blockedÚ_last_ctx_overflow_warnN)Ú)CONTEXT_OVERFLOW_BLOCKED_WARNING_TEMPLATEzcompression blocked (Ú))Ú
provenance)ÚtokensÚ	thresholdrŽ   )ÚcooldownÚineffective)
Úsplitr   r–   Úagent.conversation_compressionr—   Ú_touch_activityr   ÚAGENT_COMPRESSION_COOLDOWNrn   r   )r   rŽ   r�   r�   Ú
_warn_kindÚ	_warn_keyr—   s   &&&&   r   Ú_warn_context_overflow_blockedÚ0StatusOutputMixin._warn_context_overflow_blocked‰   s¡   € ð ×)Ð) 	×0Ñ0°°aÓ8¸Õ;ˆ
Ø+¨ZÐ8ˆ	Ü�4Ð2°DÓ9¸YÔFÙØ'0Ô$Ý\ð Ð4Ô4Ø× Ñ Ð#8¸¸ÀÐ!BÔOa×O|ÑO|Ð Ô}Ø×ÑÐD×KÑKØ#Èð Ló 
ö 	r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r	   r�   Úcontext_lengthr*   N)r‘   )r   r   s   "€r   r   r   š   s)   ø€ ÷ hñ hÁCð hÑY\ð hÐaeñ hr   c                ó„   € RV3p\        V RR4      V8w  d*   W0n        V P                  \        RVR VR R7      4       R# R# )a`  Deduped warning when uncompressed context exceeds the model limit; points the user at /compact.

When compression is explicitly disabled (compression.enabled: false), long sessions can grow past
the model context window with no compression to shrink them (#89297). Surface an actionable warning
so the user knows to run /compact or enable compression.
Úuncompressed_ctx_overflowr–   Nz,display.notice.uncompressed_context_overflowÚ,)rš   r§   )r   r–   rn   r   )r   r�   r§   r£   s   &&& r   Ú#_warn_uncompressed_context_overflowÚ5StatusOutputMixin._warn_uncompressed_context_overflowš   sW   € ð 1°.ÐAˆ	Ü�4Ð2°DÓ9¸YÔFØ+4Ô(Ø×ÑœqÐ!OØ+;¸AÐ*>ÐSaÐbcÐRdô gö hñ Gr   c                ó   <€ V ^8„  d   QhRR/# rˆ   r|   )r   r   s   "€r   r   r   §   s   ø€ ÷ ,ñ ,¨dñ ,r   c                ó   € RV n         R# )zTReset the blocked-overflow warning dedup so it can re-fire on the next blocked turn.N)r–   r0   s   &r   Ú_clear_context_overflow_warnÚ.StatusOutputMixin._clear_context_overflow_warn§   s
   € à'+ˆÖ$r   c                ó   <€ V ^8„  d   QhRR/# rˆ   r|   )r   r   s   "€r   r   r   «   s   ø€ ÷ Nñ N dñ Nr   c                ó.   € V P                  RVRR7       R# )zCFire a structured ``AgentNotice`` to the active driver (TUI / CLI).rz   rƒ   rP   N©rG   )r   r„   s   &&r   rƒ   ÚStatusOutputMixin._emit_notice«   s   € à×ÑÐ-¨v¸nÐÖMr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r	   rx   r*   Nr?   )r   r   s   "€r   r   r   ¯   s   ø€ ÷ Wñ W¡cð W¨dñ Wr   c                ó.   € V P                  RVRR7       R# )zEClear a previously-fired sticky notice by ``key`` (e.g. on recovery).Únotice_clear_callbackÚ_emit_notice_clearrP   Nr³   )r   rx   s   &&r   r¸   Ú$StatusOutputMixin._emit_notice_clear¯   s   € à×ÑÐ3°SÐAUÐÖVr   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r	   rv   r*   Nr?   )r   r   s   "€r   r   r   ³   s   ø€ ÷ Sñ S¡cð S¨dñ Sr   c                óP   € V P                  V4       V P                  RVRR7       R# )z‰Rewrite the live status line (CLI spinner, TUI ``thinking.delta``, gateway activity)
so long provider waits are not an anonymous spinner.Úthinking_callbackÚ_emit_wait_noticerP   N)r    rG   )r   rv   s   &&r   r¾   Ú#StatusOutputMixin._emit_wait_notice³   s)   € ð 	×Ñ˜TÔ"Ø×ÑÐ/°Ð>QÐÖRr   c                ó$   <€ V ^8„  d   QhRS[ RR/# r»   r?   )r   r   s   "€r   r   r   ¹   s   ø€ ÷ 5ñ 5©#ð 5°$ñ 5r   c                ó@   € ^ RI Hp V P                  V! V4      4       R# ©rW   r_   N)rQ   r`   r¾   )r   rv   r`   s   && r   Ú_emit_diagnostic_waitÚ'StatusOutputMixin._emit_diagnostic_wait¹   s   € Ý@Ø×Ñ™~¨dÓ3Ö4r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r	   rJ   rK   r*   Nr?   )r   r   s   "€r   r   r   À   s"   ø€ ÷ 	$ñ 	$©#ð 	$¹ð 	$Àñ 	$r   c                ó\   € \        V RR4      pVf	   . ;q0n        VP                  W34       R# )zßBuffer a retry/fallback line as ``(kind, text)`` until we know whether the turn recovered.

``kind`` is ``"status"`` (replays via ``_emit_status``), ``"vprint"`` (``_vprint(force=True)``) or
``"warn"`` (``_emit_warning``).
Ú_retry_status_bufferN)r   rÇ   Úappend)r   rJ   rK   Úbufs   &&& r   Ú_buffer_retry_messageÚ'StatusOutputMixin._buffer_retry_messageÀ   s1   € ô �dÐ2°DÓ9ˆØŠ;Ø.0Ð0ˆCÔ+Ø�
‰
�D�?Ö#r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   Ë   ó   ø€ ÷ 6ñ 6¡cð 6¨dñ 6r   c                ó*   € V P                  R V4       R# )ÚstatusN©rÊ   ri   s   &&r   Ú_buffer_statusÚ StatusOutputMixin._buffer_statusË   ó   € Ø×"Ñ" 8¨WÖ5r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   Î   s   ø€ ÷ 5ñ 5±ð 5¸ñ 5r   c                ó@   € ^ RI Hp V P                  V! V4      4       R# rÂ   )rQ   r`   rÑ   rb   s   && r   Ú_buffer_diagnostic_statusÚ+StatusOutputMixin._buffer_diagnostic_statusÎ   s   € Ý@Ø×Ñ™N¨7Ó3Ö4r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r?   )r   r   s   "€r   r   r   Ò   rÍ   r   c                ó*   € V P                  R V4       R# )ÚvprintNrÐ   ri   s   &&r   Ú_buffer_vprintÚ StatusOutputMixin._buffer_vprintÒ   rÓ   r   c                ó   <€ V ^8„  d   QhRR/# rˆ   r|   )r   r   s   "€r   r   r   Õ   s   ø€ ÷ ñ  dñ r   c                óT   € \        V RR4      pV'       d   VP                  4        R# R# )u=   Drop buffered retry messages â€” call on successful recovery.rÇ   N)r   Úclear)r   rÉ   s   & r   Ú_clear_status_bufferÚ&StatusOutputMixin._clear_status_bufferÕ   s"   € ä�dÐ2°DÓ9ˆßØ�I‰IŽKñ r   c                ó   <€ V ^8„  d   QhRR/# rˆ   r|   )r   r   s   "€r   r   r   Û   s   ø€ ÷ ñ ¨tñ r   c                óÎ   € \        V RR4      pV'       g   R# RV n        \        V\        4      '       d   TMV. F  p V P	                  V4       K  	  R#   \
         d     K)  i ; i)a+  Surface the one-shot fallback-switch notice on successful recovery: a provider switch is durable
state operators must see, unlike the retry chatter ``_clear_status_buffer`` drops. Emitted once, then
cleared; on terminal failure the buffered switch line is flushed instead (``_flush_status_buffer``).Ú_pending_fallback_noticeN)r   rä   Ú
isinstanceÚlistrc   rC   )r   r„   Úitems   &  r   Ú_emit_pending_fallback_noticeÚ/StatusOutputMixin._emit_pending_fallback_noticeÛ   sf   € ô ˜Ð9¸4Ó@ˆßÙà(,ˆÔ%Ü(¨´×6Ò6‘F¸V¸HÒDˆDðØ×,Ñ,¨TÖ2ó Eøô ô âðús   ¾AÁA$Á#A$c                ó   <€ V ^8„  d   QhRR/# rˆ   r|   )r   r   s   "€r   r   r   ë   s   ø€ ÷ ñ  dñ r   c                ó†  € RV n         \        V RR4      pV'       g   R# \        V4      pVP                  4        RV P                  RV P
                  /pV FU  w  rE WC9   d   W4,          ! V4       K  V P                  4       '       d$   V P                  V P                   V 2RR7       KU  KW  	  R#   \         d     Ki  i ; i)uZ   Emit buffered retry messages â€” call on terminal failure so the user sees what was tried.NrÇ   rÏ   rm   TrN   )
rä   r   ræ   rß   ra   rn   r   r&   rR   rC   )r   rÉ   ÚmessagesÚreplayrJ   Úmsgs   &     r   Ú_flush_status_bufferÚ&StatusOutputMixin._flush_status_bufferë   s³   € ð )-ˆÔ%Ü�dÐ2°DÓ9ˆßÙä˜“9ˆØ�	‰	ŒØ˜D×-Ñ-¨v°t×7IÑ7IÐJˆÛ!‰IˆDðØ”>Ø–L Ö%à×9Ñ9×;Ò;ØŸ™¨¯©Ð'8¸¸Ð%>Àd˜ÖKñ <ó "øô ô Úðús   ÁB1Á2B1Â!B1Â1C Â?C )r–   rä   r{   rÇ   N)!Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r&   r1   r:   rG   rS   r   rc   ra   rn   r…   r‹   r¤   r«   r¯   rƒ   r¸   r¾   rÃ   rÊ   rÑ   rÖ   rÛ   rà   rè   rï   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      s5  ø‡ € Ù\ð
°E÷ 
ò 
ð.¨5ð .ÀU÷ .ò .÷ð ÷nð n÷Lð L÷Mð M÷	ð 	÷3ð 3÷
Lð L÷Hð H÷eð e÷,*ð *÷ð ÷"hð h÷,ð ,÷Nð N÷Wð W÷Sð S÷5ð 5÷	$ð 	$÷6ð 6÷5ð 5÷6ð 6÷ð ÷ð ÷ ö r   r   )
rõ   Úloggingr,   Ú
agent.i18nr   Úagent.session_activityr   Ú	getLoggerrD   r   r|   r   r   Ú<module>rü      s6   ðñó Û 
å Ý 5ð 
×	Ò	˜;Ó	'€÷mó mr   