§
    øžyjv3 ã                  ó|  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0  ej1        d¦  «        Z2dZ3dd„Z4dd„Z5dd„Z6 G d„ d¦  «        Z7dS )uø  Gateway slash-command handlers for GatewayRunner.

Extracted from ``gateway/run.py`` (god-file decomposition Phase 3b). These are
the in-session slash commands (/model, /reset, /usage, /compress, ...) the
gateway dispatches from ``_handle_message``. There are 42 of them (~3,200 LOC);
lifting them into a mixin that ``GatewayRunner`` inherits keeps every
``self._handle_*_command`` dispatch + test reference working via the MRO, while
removing the bulk from run.py.

Module-level run.py helpers a handler needs (``_hermes_home``,
``_load_gateway_config``, ``_resolve_gateway_model``, etc.) are imported lazily
inside the handler body â€” a deferred ``from gateway.run import ...`` resolves at
call time (run.py fully loaded by then), avoiding an import cycle.
é    )ÚannotationsN©Údatetime)ÚPath)ÚAnyÚOptionalÚUnion)Úfetch_account_usageÚrender_account_usage_lines)Út)Úextract_api_content_sidecar)ÚHomeChannelÚPlatformÚPlatformConfigÚpersist_home_channel)ÚEphemeralReplyÚMessageEventÚMessageType)ÚAsyncSessionStoreÚSessionSourceÚbuild_session_keyÚis_shared_multi_user_session)Úatomic_config_writeÚcfg_getÚ clear_model_endpoint_credentials)Úatomic_json_writeÚbase_url_host_matchesÚis_truthy_valuezgateway.rung      >@Úvaluer   ÚreturnÚstrc                ó€   — t          | t          ¦  «        r(|                      ¦   «         r|                      ¦   «         ndS )z;Strip and return a non-empty string value, or empty string.Ú ©Ú
isinstancer!   Ústrip©r   s    ú</home/ragecks/.hermes/hermes-agent/gateway/slash_commands.pyÚ
_clean_strr)   ;   s0   € å& u­cÑ2Ô2ÐL°u·{²{±}´}ÐLˆ5�;Š;‰=Œ=ˆ=È"ÐLó    Úintc                óR   — 	 t          | ¦  «        S # t          t          f$ r Y dS w xY w)zSafely coerce to int.r   ©r+   Ú	TypeErrorÚ
ValueErrorr'   s    r(   Ú
_int_valuer0   @   s:   € ðÝ�5‰zŒzÐøÝ•zÐ"ð ð ð Øˆqˆqðøøøó   ‚ ‘&¥&úOptional[str]c                 ód   — ddl m}   | ¦   «         }|sdS |\  }}t          dd|› d|› d�¬¦  «        S )	uŒ  Refuse a model switch when the gateway is running stale code.

    A long-lived gateway holds its modules in memory from boot. If the checkout
    changed underneath it (e.g. a manual ``git pull``), switching models can hit
    a first-time lazy import on a new code path and crash on a stale cached
    dependency â€” the cryptic ``cannot import name 'env_float' from 'utils'``.
    Detect the drift and tell the user to restart instead.

    Intentionally scoped to model switching â€” the known, highest-risk trigger.
    Any first-time lazy import on a stale process is technically exposed; we
    don't guard every import site, only this one.
    r   )Údetect_code_skewNúgateway.model.error_prefixz"This gateway is running code from z! but the checkout on disk is now uw   . Switching models would risk a stale-module crash â€” restart the gateway to load the new code: hermes gateway restart©Úerror)Úgateway.code_skewr4   r   )r4   ÚskewÚboot_revÚdisk_revs       r(   Ú_model_switch_skew_guardr<   H   s~   € ð 3Ð2Ð2Ð2Ð2Ð2àÐÑÔ€DØð ØˆtØÑ€HˆhÝØ$ðZ°ð Zð ZØ#ðZð Zð Zðñ ô ð r*   c                  ó~  — e Zd ZU dZded<   drd„Zdsd
„Zdtd„Zdtd„Zdtd„Z	dtd„Z
edud„¦   «         Zdtd„Zdvd„Zedwd„¦   «         Zdwd„Zdxd„Z	 dydzd „Zd{d$„Zdtd%„Zdsd&„Zdtd'„Zdsd(„Zdtd)„Zdtd*„Zdtd+„Zd|d-„Zdtd.„Zdtd/„Zdtd0„Zd}d2„Zd}d3„Z d}d4„Z!d}d5„Z"dtd6„Z#dtd7„Z$dtd8„Z%dtd9„Z&dtd:„Z'd~d=„Z(e	 	 dd€dD„¦   «         Z)dtdE„Z*d�dG„Z+	 dyd‚dK„Z,dƒdN„Z-d„dQ„Z.d|dR„Z/dtdS„Z0dtdT„Z1d|dU„Z2dtdV„Z3dsdW„Z4dtdX„Z5dtdY„Z6dtdZ„Z7dtd[„Z8d…d†d^„Z9dtd_„Z:dtd`„Z;dtda„Z<dtdb„Z=dtdc„Z>d‡df„Z?dˆdg„Z@dtdh„ZAdtdi„ZBd|dj„ZCdtdk„ZDdtdl„ZEd|dm„ZFdtdn„ZGdtdo„ZHdtdp„ZIdqS )‰ÚGatewaySlashCommandsMixinz4In-session slash-command handlers for GatewayRunner.r   Úasync_session_storer    r!   c                ó†   — t          | dd¦  «        r| j                             |¦  «        nd}|�t          |dd¦  «        ndS )aÕ  Return the prefix users can always type to reach Hermes commands.

        Reads the adapter's ``typed_command_prefix`` capability flag
        (default "/"). Slack and Matrix return "!" because typed "/"
        commands are blocked in Slack threads / reserved by Matrix clients;
        their adapters rewrite "!command" to "/command" on receive.
        Instruction text built for those platforms must show the prefix
        that actually works when typed.
        ÚadaptersNÚtyped_command_prefixú/)ÚgetattrrA   Úget)ÚselfÚplatformÚadapters      r(   Ú_typed_command_prefix_forz3GatewaySlashCommandsMixin._typed_command_prefix_forj   sN   € õ 29¸¸zÈ4Ñ1PÔ1PÐZ�$”-×#Ò# HÑ-Ô-Ð-ÐVZˆØ@GÐ@S�w�wÐ 6¸Ñ<Ô<Ð<ÐY\Ð\r*   Úeventr   úUnion[str, EphemeralReply]c           
   ƒ  óð  K  — |j         }|                      |¦  «        }|                      |d¬¦  «         |                      |¦  «         | j        j                             |¦  «        }t          | dd¦  «        }|�ù|5  | j                             |¦  «        }t          |t          ¦  «        r|d         n|r|nd}ddd¦  «         n# 1 swxY w Y   |� 	 t          j        |                      | j        |¦  «        t          ¬¦  «        ƒ d{V —† nd# t          j        $ r$ t"                               d|t          ¦  «         Y n2t&          $ r&}t"                               d||¦  «         Y d}~nd}~ww xY w|                      |¦  «         |                      |d¬¦  «         	 dd	lm}	  |	|t1          t          |d
d¦  «        pd¦  «        d¬¦  «         n# t&          $ r Y nw xY w	 ddlm}
  |
¦   «          n# t&          $ r Y nw xY w	 ddlm}  |¦   «          n# t&          $ r Y nw xY w| j                             |¦  «        ƒ d{V —†}|r|j        nd}	 ddl m!}  |||j"        r|j"        j#        ndd||r|j        nd¬¦  «         n# t&          $ r Y nw xY w| j$         %                    d|j"        r|j"        j#        nd|j&        |dœ¦  «        ƒ d{V —† | j$         %                    d|j"        r|j"        j#        nd|j&        |dœ¦  «        ƒ d{V —† 	 t          j'        | j(        |¦  «        ƒ d{V —†}n# t&          $ r d}Y nw xY w|r0t          j'        | j)        |¦  «        ƒ d{V —†ptU          d¦  «        }nQ| j         +                    |d¬¦  «        ƒ d{V —†}t          j'        | j)        |¦  «        ƒ d{V —†ptU          d¦  «        }| ,                    ¦   «          -                    ¦   «         }d}|ré| j.        râ|ràddl/m0} 	 | 1                    |¦  «        }n7# td          $ r*}d}tU          dt1          |¦  «        ¬¦  «        }Y d}~nd}~ww xY w|ry	 | j.         3                    |j        |¦  «        ƒ d{V —† tU          d|¬¦  «        }nQ# td          $ r(}tU          dt1          |¦  «        ¬¦  «        }Y d}~n$d}~wt&          $ r Y nw xY w|stU          d¦  «        }||z   }t          j'        | j4        |¦  «        ƒ d{V —†rQ|�O	 t          j'        | j5        ||¦  «        ƒ d{V —† n,# t&          $ r t"           6                    d d¬!¦  «         Y nw xY w	 dd"l m7} |r|j        nd} |d#||j"        r|j"        j#        ndd||¬¦  «         n# t&          $ r Y nw xY w	 dd$l8m9} tU          d% |¦   «         ¬&¦  «        }n# t&          $ r d}Y nw xY w|rtu          |› d'|› |› �¦  «        S tu          |› |› �¦  «        S )(zHandle /new or /reset command.Úsession_reset©ÚreasonÚ_agent_cache_lockNr   )Útimeoutz–Agent resource cleanup for session %s exceeded %ss during /new reset; proceeding with reset (the worker thread is left to finish on its own). (#35994)zKAgent resource cleanup for session %s failed during /new reset: %s (#35994))Úinterrupt_for_sessionÚ
session_idr#   )Úsession_keyÚparent_session_idrO   )Úclear_env_passthrough)Úclear_credential_files)Úfinalize_sessionÚnew_session)rS   rG   rO   Úold_session_idÚnew_session_idzsession:end)rG   Úuser_idrT   zsession:resetzgateway.reset.header_defaultT)Ú	force_newzgateway.reset.header_new©Ú	SessionDBzgateway.reset.title_rejectedr6   zgateway.reset.header_titled©Útitlez"gateway.reset.title_error_untitledz"gateway.reset.title_empty_untitledz*Failed to rebind Telegram topic after /new©Úexc_info)Úinvoke_hookÚon_session_reset)Úget_random_tipzgateway.reset.tip)Útipú

);ÚsourceÚ_session_key_for_sourceÚ"_invalidate_session_run_generationÚ_release_running_agent_stateÚsession_storeÚ_entriesrE   rD   Ú_agent_cacher%   ÚtupleÚasyncioÚwait_forÚ_run_in_executor_with_contextÚ_cleanup_agent_resourcesÚ_RESET_CLEANUP_TIMEOUT_SÚTimeoutErrorÚloggerÚwarningÚ	ExceptionÚ_evict_cached_agentÚ_clear_conversation_scopeÚtools.async_delegationrR   r!   Útools.env_passthroughrV   Útools.credential_filesrW   r?   Úreset_sessionrS   Úhermes_cli.lifecyclerX   rG   r   ÚhooksÚemitr\   Ú	to_threadÚ_reset_notice_session_infoÚ_telegram_topic_new_headerr   Úget_or_create_sessionÚget_command_argsr&   Ú_session_dbÚhermes_stater_   Úsanitize_titler/   Úset_session_titleÚ_is_telegram_topic_laneÚ_record_telegram_topic_bindingÚdebugrd   Úhermes_cli.tipsrf   r   )rF   rJ   ri   rT   Ú	old_entryÚ_cache_lockÚ_cachedÚ
_old_agentÚcleanup_excrR   rV   rW   Ú	new_entryÚ_old_sidrX   Úsession_infoÚheaderÚ
_title_argÚ_title_noter_   Ú	sanitizedÚeÚ_invoke_hookÚ_new_sidrf   Ú	_tip_lines                             r(   Ú_handle_reset_commandz/GatewaySlashCommandsMixin._handle_reset_commandw   s`	  è è € à”ˆð ×2Ò2°6Ñ:Ô:ˆØ×/Ò/°ÀOÐ/ÑTÔTÐTð 	×)Ò)¨+Ñ6Ô6Ð6ð Ô&Ô/×3Ò3°KÑ@Ô@ˆ	õ ˜dÐ$7¸Ñ>Ô>ˆØÐ"Øð hð hØÔ+×/Ò/°Ñ<Ô<�Ý+5°g½uÑ+EÔ+EÐg˜W QœZ˜ZÐV]ÐKgÈ7È7Ðcg�
ðhð hð hñ hô hð hð hð hð hð hð høøøð hð hð hð hð Ð%ðÝ!Ô*Ø×:Ò:Ø Ô9¸:ñô õ !9ð	ñ ô ð ð ð ð ð ð ð ð øõ Ô+ð 	ð 	ð 	õ —N’Nð:ð $Õ%=ñ	ô ð ð ð õ !ð ð ð Ý—N’Nð-à# [ñô ð ð ð ð ð ð øøøøðøøøð 	× Ò  Ñ-Ô-Ð-ð 	×&Ò& {¸?Ð&ÑKÔKÐKð		ØDÐDÐDÐDÐDÐDà!Ð!Ø'Ý"%¥g¨i¸ÀrÑ&JÔ&JÐ&PÈbÑ"QÔ"QØ&ðñ ô ð ð øõ
 ð 	ð 	ð 	ØˆDð	øøøð	ØCÐCÐCÐCÐCÐCØ!Ð!Ñ#Ô#Ð#Ð#øÝð 	ð 	ð 	ØˆDð	øøøð	ØEÐEÐEÐEÐEÐEØ"Ð"Ñ$Ô$Ð$Ð$øÝð 	ð 	ð 	ØˆDð	øøøð Ô2×@Ò@ÀÑMÔMÐMÐMÐMÐMÐMÐMˆ	ð
 ,5Ð>�9Ô'Ð'¸$ˆð
	Ø=Ð=Ð=Ð=Ð=Ð=ØÐØ#Ø28´/ÐI˜œÔ.Ð.ÀrØ$Ø'Ø7@ÐJ˜yÔ3Ð3Àdðñ ô ð ð øõ ð 	ð 	ð 	ØˆDð	øøøð Œj�oŠo˜mØ17´ÐH˜œÔ-Ð-ÀbØ”~Ø&ð.
ð .
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Œj�oŠo˜oØ17´ÐH˜œÔ-Ð-ÀbØ”~Ø&ð0
ð 0
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð	Ý!(Ô!2ØÔ/°ñ"ô "ð ð ð ð ð ð ˆLˆLøõ ð 	ð 	ð 	ØˆLˆLˆLð	øøøð ð 	wÝ"Ô,¨TÔ-LÈfÑUÔUÐUÐUÐUÐUÐUÐUÐzÕYZÐ[yÑYzÔYzˆFˆFð #Ô6×LÒLÈVÐ_cÐLÑdÔdÐdÐdÐdÐdÐdÐdˆIÝ"Ô,¨TÔ-LÈfÑUÔUÐUÐUÐUÐUÐUÐUÐvÕYZÐ[uÑYvÔYvˆFð ×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ˆ
ØˆØð 	F˜$Ô*ð 	F¨yð 	FØ.Ð.Ð.Ð.Ð.Ð.ðNØ%×4Ò4°ZÑ@Ô@�	�	øÝð Nð Nð NØ �	ÝÐ >ÅcÈ!ÁfÄfÐMÑMÔM������øøøøðNøøøð ð 
FðØÔ*×<Ò<¸YÔ=QÐS\Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]ÝÐ<ÀIÐNÑNÔN�F�FøÝ!ð Xð Xð XÝ"#Ð$HÕPSÐTUÑPVÔPVÐ"WÑ"WÔ"W�K�K�K�K�K�KøøøøÝ ð ð ð Ø�Dðøøøà ð FåÐ DÑEÔE�Ø˜+Ñ%ˆõ Ô" 4Ô#?ÀÑHÔHÐHÐHÐHÐHÐHÐHð 	ZÈYÐMbðZÝÔ'¨Ô(KÈVÐU^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_øÝð Zð Zð ZÝ—’ÐIÐTX�ÑYÔYÐYÐYÐYðZøøøð	ØHÐHÐHÐHÐHÐHØ/8ÐB�yÔ+Ð+¸dˆHØˆLØ"Ø#Ø28´/ÐI˜œÔ.Ð.ÀrØ$Ø'Ø'ðñ ô ð ð øõ ð 	ð 	ð 	ØˆDð	øøøð	Ø6Ð6Ð6Ð6Ð6Ð6ÝÐ-°>°>Ñ3CÔ3CÐDÑDÔDˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøð ð 	LÝ! VÐ"JÐ"J°Ð"J¸yÐ"JÐ"JÑKÔKÐKÝ Ð4¨Ð4Ð4Ñ5Ô5Ð5sö   Á?>C	Ã	CÃCÃ:D Ä0E3Å	E3ÅE.Å.E3Æ#2G Ç
G#Ç"G#Ç'G8 Ç8
HÈHÈ	H È
H'È&H'É2J	 Ê	
JÊJÌ L5 Ì5MÍMÐP Ð
QÐ$ Q	Ñ	QÑ7R Ò
S	ÒR9Ò9S	ÓS	Ô!T' Ô'&UÕUÕ5V
 Ö

VÖVÖV; Ö;W
×	W
c           	   ƒ  óp  K  — ddl m} ddlm}m} t          t          | dd¦  «        dd¦  «        }t          |dd¦  «        }d	}d	}|r‰t          |d
d	¦  «        pd	                     ¦   «         }	 ddlm}	 |  	                    |¦  «        }
 |	|
¦  «        5   |¦   «         }ddd¦  «         n# 1 swxY w Y   n# t          $ r  |¦   «         }Y nw xY w |d
 |d||dœ¬¦  «        ¦  «        }t          d|j        d
         ¬¦  «        t          d|j        d         ¬¦  «        g}d                     |¦  «        S )u”  Handle /profile â€” show the profile serving this source and its home.

        On a multiplexed gateway the process-level active profile is always
        the multiplexer's own (usually ``default``), so reporting it would
        answer "default" in every chat regardless of which profile actually
        serves the room/channel (``source.profile`` â€” stamped by the
        ``/p/<profile>/`` URL prefix, a per-credential adapter, or a roomâ†’
        profile map). When ``multiplex_profiles`` is on, report the stamped
        profile and, like the scoped /reset banner (#59003), resolve the
        displayed home under that profile's runtime scope. When multiplexing
        is off (the default) the stamp is ignored â€” mirroring the gating in
        ``_run_agent`` and ``_reset_notice_session_info`` â€” and the command
        reports the active profile and default home, byte-identical to before.
        r   )Údisplay_hermes_home©ÚCommandContextÚexecute_commandÚconfigNÚmultiplex_profilesFri   r#   Úprofile©Ú_profile_runtime_scopeÚgateway)Úprofile_nameÚhome_display)ÚsurfaceÚoptionszgateway.profile.header)r¨   zgateway.profile.homeÚhome)r°   Ú
)Úhermes_constantsr¢   Úhermes_cli.slash_execr¤   r¥   rD   r&   Úgateway.runrª   Ú _resolve_profile_home_for_sourcery   r   ÚdataÚjoin)rF   rJ   r¢   r¤   r¥   Úmultiplexedri   r¬   Údisplayrª   Úprofile_homeÚreplyÚliness                r(   Ú_handle_profile_commandz1GatewaySlashCommandsMixin._handle_profile_commandH  sí  è è € ð 	9Ð8Ð8Ð8Ð8Ð8ØIÐIÐIÐIÐIÐIÐIÐIåÝ�D˜( DÑ)Ô)Ð+?Àñ
ô 
ˆõ ˜ ¨$Ñ/Ô/ˆàˆØˆØð 		0Ý# F¨I°rÑ:Ô:Ð@¸b×GÒGÑIÔIˆLð0Ø>Ð>Ð>Ð>Ð>Ð>à#×DÒDÀVÑLÔL�Ø+Ð+¨LÑ9Ô9ð 4ð 4Ø1Ð1Ñ3Ô3�Gð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4øøåð 0ð 0ð 0Ø-Ð-Ñ/Ô/���ð0øøøð
  �ØØˆNØ!Ø)5ÀwÐOÐOðñ ô ñ
ô 
ˆõ Ð&°´
¸9Ô0EÐFÑFÔFÝÐ$¨5¬:°fÔ+=Ð>Ñ>Ô>ð
ˆð
 �yŠy˜ÑÔÐs6   Á.&B7 ÂB+ÂB7 Â+B/Â/B7 Â2B/Â3B7 Â7CÃCc              ƒ  ó^  K  — ddl m} |j        } || j        |¦  «        }|r|j        r|j        j        nd}|r|j        ndpd}|                     ¦   «         dv rdnd}|r|j        nd	pd}|j	        sd
|› d|› d|› d�S | 
                    |¦  «        rd
|› d|› d|› d�S ddg}	t          |j        ¦  «        }
t          ¦   «         }g }|	|
z   D ]0}||vr*|                     |¦  «         |                     |¦  «         Œ1|rd                     d„ |D ¦   «         ¦  «        nd}d
|› d|› d|› d|› �S )uD  Handle /whoami â€” show the user's slash command access on this scope.

        Always works (it's in the always-allowed floor of slash_access).
        Reports: platform, scope (DM vs group), the user's tier
        (admin / user / unrestricted), and the slash commands they can
        actually run on this scope.
        r   ©Úpolicy_for_sourceú?r#   Údm>   r#   rÂ   ÚdirectÚprivateÚDMzgroup/channelNu   **You** â€” ú (z)
User ID: `z\`
Tier: unrestricted (no admin list configured for this scope)
Slash commands: all availablez/`
Tier: **admin**
Slash commands: all availableÚhelpÚwhoamiú, c              3  ó    K  — | ]	}d |› �V — Œ
dS )rC   N© )Ú.0Úcs     r(   ú	<genexpr>zCGatewaySlashCommandsMixin._handle_whoami_command.<locals>.<genexpr>¨  s(   è è € Ð ;Ð ;¨Q  Q  Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;r*   z(none)z)`
Tier: user
Slash commands you can run: )Úgateway.slash_accessrÀ   ri   r¦   rG   r   Ú	chat_typeÚlowerr\   ÚenabledÚis_adminÚsortedÚuser_allowed_commandsÚsetÚaddÚappendr·   )rF   rJ   Ú_policy_for_sourceri   ÚpolicyrG   rÐ   Úscoper\   ÚfloorÚ
configuredÚseenÚrunnablerÍ   Úrunnable_strs                  r(   Ú_handle_whoami_commandz0GatewaySlashCommandsMixin._handle_whoami_command}  sõ  è è € ð 	QÐPÐPÐPÐPÐPà”ˆØ#Ð# D¤K°Ñ8Ô8ˆØ,2ÐO°v´ÐO�6”?Ô(Ð(ÈCˆØ)/Ð7�VÔ%Ð%°RÐ@¸Dˆ	Ø!ŸšÑ)Ô)Ð-LÐLÐL��ÐRaˆØ%+Ð5�6”>�>°Ð=¸#ˆàŒ~ð 	ð1˜xð 1ð 1¨5ð 1ð 1Ø$ð1ð 1ð 1ðð �?Š?˜7Ñ#Ô#ð 	ð1˜xð 1ð 1¨5ð 1ð 1Ø$ð1ð 1ð 1ðð ˜Ð"ˆÝ˜FÔ8Ñ9Ô9ˆ
å™œˆØ ˆØ˜Ñ#ð 	#ð 	#ˆAØ˜ˆ}ˆ}Ø—’˜‘”�Ø—’ Ñ"Ô"Ð"øØ?GÐU�t—y’yÐ ;Ð ;°(Ð ;Ñ ;Ô ;Ñ;Ô;Ð;ÈXˆð:˜8ð :ð : uð :ð :Ø ð:ð :ð ,8ð:ð :ð	
r*   c           	   ƒ  óŽ  ‡ ‡‡‡‡‡‡‡‡K  — ddl }ddl}ddl}ddlm} |j        pd                     ¦   «         }|                     d¦  «        r|                     d¦  «        }|                     d¦  «        r)|t          d¦  «        d…                              ¦   «         }|r |j
        |¦  «        ng }dŠd}d}	|	t          |¦  «        k     rp||	         }
|
dk    r(|	dz   t          |¦  «        k    rnK||	dz            Š|	d	z  }	ŒI|
                     d
¦  «        r"|
 
                    dd¦  «        d         Š|	dz  }	Œ€|
}	 |dk    }	  |j        ||¦  «        ƒ d{V —†}n(# t          $ r}t          d|¬¦  «        cY d}~S d}~ww xY w|�rþ|�rû |j        d|¦  «        }|�rç|                     d¦  «        Š	 |j        }t#          |dd¦  «        }t%          |d¦  «        r|j        nt)          |pd¦  «                             ¦   «         Št)          t#          |dd¦  «        pd¦  «        Št)          t#          |dd¦  «        pd¦  «        pdŠt)          t#          |dd¦  «        pd¦  «        Št)          t#          |dd¦  «        pd¦  «        pdŠ‰                      |‰                      |¦  «        ¦  «        pdŠt1          ‰t2          ¦  «        r8t)          t#          |dd¦  «        pd¦  «        Š‰r‰                     d‰¦  «         ‰rN‰rLˆˆˆˆˆˆ ˆˆˆf	d„} |j        |¦  «        ƒ d{V —† |                     ¦   «         dz   t          d‰¬¦  «        z   }n2# t          $ r%}t8                               d|¦  «         Y d}~nd}~ww xY wt          |¦  «        dk    r|dd…         dz   t          d¦  «        z   }|pt          d¦  «        S )u¯  Handle /kanban â€” delegate to the shared kanban CLI.

        Run the potentially-blocking DB work in a thread pool so the
        gateway event loop stays responsive.  Read operations (list,
        show, context, tail) are permitted while an agent is running;
        mutations are allowed too because the board is profile-agnostic
        and does not touch the running agent's state.

        For ``/kanban create`` invocations we also auto-subscribe the
        originating gateway source (platform + chat + thread) to the new
        task's terminal events, so the user hears back when the worker
        completes / blocks / auto-blocks / crashes without having to poll.
        r   N)Ú	run_slashr#   rC   Úkanbanz--boardé   é   z--board=Ú=Úcreatezgateway.kanban.error_prefixr6   zCreated\s+(t_[0-9a-f]+)\brG   r   Úchat_idrÐ   Ú	thread_idr\   c                 ó"  •	— ddl m}  |                      ‰¬¦  «        }	 |                      |‰‰‰‰‰	pd ‰
t	          ‰dd ¦  «        p‰                     ¦   «         ‰¬¦	  «	         |                     ¦   «          d S # |                     ¦   «          w xY w)Nr   )Ú	kanban_db)ÚboardÚ_kanban_notifier_profile)Útask_idrG   ré   rÐ   rê   r\   Únotifier_profileÚdelivery_metadata)Ú
hermes_clirì   ÚconnectÚadd_notify_subrD   Ú_active_profile_nameÚclose)Ú_kbÚconnré   rÐ   rñ   Úplatform_strÚrequested_boardrF   rï   rê   r\   s     €€€€€€€€€r(   Ú_subz>GatewaySlashCommandsMixin._handle_kanban_command.<locals>._subþ  sÀ   ø€ ØCÐCÐCÐCÐCÐCØ#&§;¢;°_ ;Ñ#EÔ#E˜Dð-Ø #× 2Ò 2Ø$(°'Ø-9À7Ø.7Ø.7Ð.?¸4Ø,3Ý5<¸TÐC]Ð_cÑ5dÔ5dð  6DÐhl÷  iBò  iBñ  iDô  iDØ6Gð !3ñ !"ô !"ð !"ð !%§
¢
¡¤   ø §
¢
¡¤  øøøs   ŸAA8 Á8Br±   z gateway.kanban.subscribed_suffix)rï   z'kanban create auto-subscribe failed: %siØ  zgateway.kanban.truncated_suffixzgateway.kanban.no_output)rq   ÚreÚshlexÚhermes_cli.kanbanrã   Útextr&   Ú
startswithÚlstripÚlenÚsplitrƒ   ry   r   ÚsearchÚgroupri   rD   Úhasattrr   r!   rÑ   Ú_thread_metadata_for_sourceÚ_reply_anchor_for_eventr%   ÚdictÚ
setdefaultÚrstriprw   rx   )rF   rJ   rq   rü   rý   rã   rÿ   ÚtokensÚactionÚiÚtokÚ	is_createÚoutputÚexcÚmri   rG   rû   ré   rÐ   rñ   rù   rú   rï   rê   r\   s   `                 @@@@@@@@r(   Ú_handle_kanban_commandz0GatewaySlashCommandsMixin._handle_kanban_command°  s·  øøøøøøøøøè è € ð 	ˆˆˆØˆ	ˆ	ˆ	ØˆˆˆØ/Ð/Ð/Ð/Ð/Ð/à”
Ð ˜b×'Ò'Ñ)Ô)ˆà�?Š?˜3ÑÔð 	$Ø—;’;˜sÑ#Ô#ˆDØ�?Š?˜8Ñ$Ô$ð 	1Ø�˜H™œ˜˜Ô'×.Ò.Ñ0Ô0ˆDà&*Ð2��”˜TÑ"Ô"Ð"°ˆØˆØˆØˆØ•#�f‘+”+ŠoˆoØ˜”)ˆCØ�iÒÐØ�q‘5�C ™KœKÒ'Ð'ØØ"(¨¨Q©¤-�Ø�Q‘�ØØ�~Š~˜jÑ)Ô)ð Ø"%§)¢)¨C°Ñ"3Ô"3°AÔ"6�Ø�Q‘�ØØˆFØà˜hÒ&ˆ	ð	?Ø,˜7Ô,¨Y¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆFˆFøÝð 	?ð 	?ð 	?ÝÐ2¸#Ð>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð	?øøøð ñ ,	S˜ñ ,	SØ�”	Ð6¸Ñ?Ô?ˆAØñ *SØŸ'š' !™*œ*�ð(SØ"œ\�FÝ& v¨z¸4Ñ@Ô@�Hå*1°(¸GÑ*DÔ*DÐ]˜œ˜Í#ÈhÈnÐZ\ÑJ]ÔJ]ß’e‘g”gð !õ "¥'¨&°)¸RÑ"@Ô"@Ð"FÀBÑGÔG�GÝ #¥G¨F°KÀÑ$DÔ$DÐ$JÈÑ KÔ KÐ SÈt�IÝ #¥G¨F°KÀÑ$DÔ$DÐ$JÈÑ KÔ K�IÝ!¥'¨&°)¸RÑ"@Ô"@Ð"FÀBÑGÔGÐOÈ4�GØ(,×(HÒ(HØ × <Ò <¸UÑ CÔ Cñ)ô )ð )àð &õ "Ð"3µTÑ:Ô:ð QÝ$'­°¸ÀRÑ(HÔ(HÐ(NÈBÑ$OÔ$O˜	Ø$ð QØ-×8Ò8¸ÀiÑPÔPÐPØ#ð ¨ð ð-ð -ð -ð -ð -ð -ð -ð -ð -ð -ð -ð -ð -ð 0˜gÔ/°Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5à"ŸMšM™OœOØ"ñ#åÐ BÈGÐTÑTÔTñUð øøõ
 !ð Sð Sð SÝ—N’NÐ#LÈcÑRÔRÐRÐRÐRÐRÐRÐRøøøøðSøøøõ
 ˆv‰;Œ;˜ÒÐØ˜E˜T˜E”] TÑ)­AÐ.OÑ,PÔ,PÑPˆFØÐ6�Ð5Ñ6Ô6Ð6s7   ÅE Å
FÅ'E=Å7FÅ=FÆ5FM Í
NÍM>Í>Nc              ƒ  óŠ  K  — ddl m}m}m} |j        }| j                             |¦  «        ƒ d{V —†}d„ | j                             ¦   «         D ¦   «         }|j	        }| j
                             |¦  «        }	|	duo|	|u}
|r| j                             |j        ¦  «        nd}|                      ||¬¦  «        }dKd
„}dLd„}d}i }d}| j        �r#	 | j                             |j        ¦  «        ƒ d{V —†}n# t"          $ r d}Y nw xY w	 | j                             |j        ¦  «        ƒ d{V —†}t'          |t(          ¦  «        rœ|} ||                     d¦  «        ¦  «         ||                     d¦  «        ¦  «        z    ||                     d¦  «        ¦  «        z    ||                     d¦  «        ¦  «        z    ||                     d¦  «        ¦  «        z   }n# t"          $ r d}Y nw xY w|
r|	nd}|€st+          | dd¦  «        }t+          | dd¦  «        }|�O|�M	 |5  |                     |¦  «        }ddd¦  «         n# 1 swxY w Y   |r|d         }n# t"          $ r d}Y nw xY wd}d}d}d}d}|�™||ur• |t+          |dd¦  «        ¦  «        } |t+          |dd¦  «        ¦  «        } |t+          |dd¦  «        ¦  «        }t+          |dd¦  «        }|�4 |t+          |dd¦  «        ¦  «        } |t+          |dd¦  «        ¦  «        }|p ||                     d¦  «        ¦  «        }|p ||                     d¦  «        ¦  «        }|p ||                     d¦  «        ¦  «        }|p |t+          |dd¦  «        ¦  «        }i }|r|r|s	  |¦   «         }n# t"          $ r i }Y nw xY w|s ||¦  «        }|s`t'          |t(          ¦  «        r|                     di ¦  «        ni }t'          |t(          ¦  «        r ||                     d¦  «        ¦  «        }|svt'          |t(          ¦  «        r|                     di ¦  «        ni }t'          |t(          ¦  «        r|                     d¦  «        nd}t'          |t,          ¦  «        r|dk    r|}d} |r&|rt/          d||¬¦  «        } nt/          d|¬ ¦  «        } d}!|r@|r#t1          d!t3          ||z  d!z  ¦  «        ¦  «        nd}"t/          d"|d#›|d#›|"› ¬$¦  «        }!n|rt/          d%|d#›¬&¦  «        }!t/          d'¦  «        dt/          d(|j        ¬)¦  «        g}#|r$|#                     t/          d*|¬+¦  «        ¦  «         |#                     t/          d,|j                             d-¦  «        ¬.¦  «        t/          d/|j                             d-¦  «        ¬.¦  «        g¦  «         | r|#                     | ¦  «         |!r|#                     |!¦  «         |#                     t/          d0|d#›¬1¦  «        t/          d2|
rt/          d3¦  «        nt/          d4¦  «        ¬5¦  «        g¦  «         |r$|#                     t/          d6|¬7¦  «        ¦  «         |j        t>          j         k    ré| j                             t>          j         ¦  «        }t+          |d8tC          j"        d9d:¦  «        ¦  «        }$|j#        pd;}%|#                     dt/          d<¦  «        t/          d=|j$        p|j%        ¬>¦  «        t/          d?|j%        ¬@¦  «        t/          dA|%¬B¦  «        t/          dC|$¬D¦  «        t/          dE|  &                    |¦  «        ¬F¦  «        g¦  «         |#                     dt/          dGdH '                    |¦  «        ¬I¦  «        g¦  «         dJ '                    |#¦  «        S )MzHandle /status command.r   )Ú_AGENT_PENDING_SENTINELÚ_load_gateway_configÚ_resolve_gateway_modelNc                ó   — g | ]	}|j         ‘Œ
S rË   r'   ©rÌ   Úps     r(   ú
<listcomp>zDGatewaySlashCommandsMixin._handle_status_command.<locals>.<listcomp>#  s   € ÐEÐEÐE¨1˜qœwÐEÐEÐEr*   )rH   r   r   r    r!   c                ó€   — t          | t          ¦  «        r(|                      ¦   «         r|                      ¦   «         ndS )Nr#   r$   r'   s    r(   r)   zDGatewaySlashCommandsMixin._handle_status_command.<locals>._clean_str0  s1   € Ý$.¨uµcÑ$:Ô$:ÐT¸u¿{º{¹}¼}ÐT�5—;’;‘=”=�=ÐRTÐTr*   r+   c                óR   — 	 t          | ¦  «        S # t          t          f$ r Y dS w xY w)Nr   r-   r'   s    r(   r0   zDGatewaySlashCommandsMixin._handle_status_command.<locals>._int_value3  s:   € ðÝ˜5‘z”zÐ!øÝ�zÐ*ð ð ð Ø�q�qðøøør1   Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensrP   ro   r#   ÚmodelÚproviderÚbase_urlÚcontext_compressorÚlast_prompt_tokensÚcontext_lengthÚbilling_providerÚbilling_base_urlzgateway.status.model_provider©r$  r%  zgateway.status.model©r$  éd   zgateway.status.contextÚ,©ÚusedÚtotalÚpctzgateway.status.context_used)r1  zgateway.status.headerzgateway.status.session_id©rS   zgateway.status.titler`   zgateway.status.createdz%Y-%m-%d %H:%M)Ú	timestampzgateway.status.last_activityzgateway.status.tokens©r  zgateway.status.agent_runningzgateway.status.state_yeszgateway.status.state_no©Ústatezgateway.status.queued©ÚcountÚ_matrix_session_scopeÚMATRIX_SESSION_SCOPEÚautoÚnonez"gateway.status.matrix_scope_headerz gateway.status.matrix_scope_room)Úroomz#gateway.status.matrix_scope_room_id)Úroom_idz"gateway.status.matrix_scope_thread)rê   z gateway.status.matrix_scope_mode)rÛ   zgateway.status.matrix_scope_key©rT   zgateway.status.platformsrÉ   )Ú	platformsr±   ©r   r   r    r!   ©r   r   r    r+   )(r´   r  r  r  ri   r?   r†   rA   ÚkeysrT   Ú_running_agentsrE   rG   Ú_queue_depthrˆ   Úget_session_titlerS   ry   Úget_sessionr%   r	  rD   r+   r   ÚminÚroundrØ   ÚextendÚ
created_atÚstrftimeÚ
updated_atr   ÚMATRIXÚosÚgetenvrê   Ú	chat_nameré   Ú_redact_matrix_session_keyr·   )&rF   rJ   r  r  r  ri   Úsession_entryÚconnected_platformsrT   ÚagentÚ
is_runningrH   Úqueue_depthr)   r0   ra   Úsession_rowÚdb_total_tokensÚrowÚstatus_agentÚ
cache_lockÚcacheÚcachedÚ
model_nameÚprovider_namer&  Úcontext_usedÚcontext_totalÚctxÚuser_configÚ	model_cfgÚconfigured_contextÚ
model_lineÚcontext_liner3  r¼   rÛ   Úthreads&                                         r(   Ú_handle_status_commandz0GatewaySlashCommandsMixin._handle_status_command  s¾	  è è € àeÐeÐeÐeÐeÐeÐeÐeÐeÐeà”ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆàEÐE°´×0BÒ0BÑ0DÔ0DÐEÑEÔEÐð
 $Ô/ˆØÔ$×(Ò(¨Ñ5Ô5ˆØ $Ð&ÐO¨5Ð8OÐ+Oˆ
ð 9?ÐH�$”-×#Ò# F¤OÑ4Ô4Ð4ÀDˆØ×'Ò'¨¸WÐ'ÑEÔEˆð	Uð 	Uð 	Uð 	Uð	ð 	ð 	ð 	ð ˆØ&(ˆð ˆØÔñ 	$ðØ"Ô.×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZ��øÝð ð ð Ø���ðøøøð$Ø Ô,×8Ò8¸Ô9QÑRÔRÐRÐRÐRÐRÐRÐR�Ý˜c¥4Ñ(Ô(ð Ø"%�Kà"˜
 3§7¢7¨>Ñ#:Ô#:Ñ;Ô;Ø$˜* S§W¢W¨_Ñ%=Ô%=Ñ>Ô>ñ?à$˜* S§W¢WÐ-@Ñ%AÔ%AÑBÔBñCð %˜* S§W¢WÐ-AÑ%BÔ%BÑCÔCñDð %˜* S§W¢WÐ-?Ñ%@Ô%@ÑAÔAñ	Bð $øøõ ð $ð $ð $Ø"#���ð$øøøð !+Ð4�u�u°ˆØÐÝ  Ð':¸DÑAÔAˆJÝ˜D .°$Ñ7Ô7ˆEØÐ%¨%Ð*;ð(Ø#ð 8ð 8Ø!&§¢¨;Ñ!7Ô!7˜ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8àð 1Ø'-¨a¤y˜øøÝ ð (ð (ð (Ø#'�L�L�Lð(øøøð ˆ
ØˆØˆØˆØˆØÐ#¨Ð<SÐ(SÐ(SØ#˜¥G¨L¸'À2Ñ$FÔ$FÑGÔGˆJØ&˜J¥w¨|¸ZÈÑ'LÔ'LÑMÔMˆMØ!�z¥'¨,¸
ÀBÑ"GÔ"GÑHÔHˆHÝ˜,Ð(<¸dÑCÔCˆCØˆØ)˜z­'°#Ð7KÈQÑ*OÔ*OÑPÔP�Ø * 
­7°3Ð8HÈ!Ñ+LÔ+LÑ MÔ M�àÐG : :¨k¯oªo¸gÑ.FÔ.FÑ#GÔ#Gˆ
Ø%ÐX¨¨°K·O²OÐDVÑ4WÔ4WÑ)XÔ)XˆØÐN˜z˜z¨+¯/ª/Ð:LÑ*MÔ*MÑNÔNˆØ#Ðb z zµ'¸-ÐI]Ð_`Ñ2aÔ2aÑ'bÔ'bˆà&(ˆØð 	! ð 	!°mð 	!ð!Ø2Ð2Ñ4Ô4��øÝð !ð !ð !Ø ���ð!øøøàð 	=Ø/Ð/°Ñ<Ô<ˆJØð 	FÝ8BÀ;ÕPTÑ8UÔ8UÐ]˜Ÿš¨°Ñ4Ô4Ð4Ð[]ˆIÝ˜)¥TÑ*Ô*ð FØ * 
¨9¯=ª=¸Ñ+DÔ+DÑ EÔ E�Øð 	3Ý8BÀ;ÕPTÑ8UÔ8UÐ]˜Ÿš¨°Ñ4Ô4Ð4Ð[]ˆIÝDNÈyÕZ^ÑD_ÔD_Ð!i §¢Ð/?Ñ!@Ô!@Ð!@ÐeiÐÝÐ,­cÑ2Ô2ð 3Ð7IÈAÒ7MÐ7MØ 2�àˆ
Øð 	IØð IÝÐ>ÀjÐ[hÐiÑiÔi�
�
åÐ5¸ZÐHÑHÔH�
àˆØð 		VØKXÐ_•#�c�5 ,°Ñ">À#Ñ!EÑFÔFÑGÔGÐGÐ^_ˆCÝØ(Ø$Ð(Ð(Ø&Ð*Ð*Ø�Hð	ñ ô ˆLˆLð ð 	VÝÐ:ÀLÐATÐATÐUÑUÔUˆLõ Ð%Ñ&Ô&ØÝÐ)°mÔ6NÐOÑOÔOð
ˆð
 ð 	AØ�LŠL�Ð1¸Ð?Ñ?Ô?Ñ@Ô@Ð@Ø�ŠÝÐ&°-Ô2J×2SÒ2SÐTdÑ2eÔ2eÐfÑfÔfÝÐ,¸Ô8P×8YÒ8YÐZjÑ8kÔ8kÐlÑlÔlð
ñ 	ô 	ð 	ð ð 	%Ø�LŠL˜Ñ$Ô$Ð$Øð 	'Ø�LŠL˜Ñ&Ô&Ð&Ø�ŠÝÐ%°Ð.DÐ.DÐEÑEÔEÝÐ,ÐU_ð  5BµAÐ6PÑ4QÔ4QÐ4QÕefð  hAñ  fBô  fBð  Cñ  Cô  Cð
ñ 	ô 	ð 	ð ð 	HØ�LŠL�Ð2¸+ÐFÑFÔFÑGÔGÐGØŒ?�hœoÒ-Ð-Ø”m×'Ò'­¬Ñ8Ô8ˆGÝ˜GÐ%<½b¼iÐH^Ð`fÑ>gÔ>gÑhÔhˆEØÔ%Ð/¨ˆFØ�LŠLØÝÐ6Ñ7Ô7ÝÐ4¸6Ô;KÐ;]ÈvÌ~Ð^Ñ^Ô^ÝÐ7ÀÄÐPÑPÔPÝÐ6À&ÐIÑIÔIÝÐ4¸EÐBÑBÔBÝØ5Ø $× ?Ò ?ÀÑ LÔ Lðñ ô ðñ ô ð ð 	�ŠØÝÐ(°D·I²IÐ>QÑ4RÔ4RÐSÑSÔSð
ñ 	ô 	ð 	ð
 �yŠy˜ÑÔÐsm   Ã%C7 Ã7DÄDÄ
CG! Ç!G0Ç/G0È"I È$IÈ:I ÉI
É
I ÉI
ÉI ÉI+É*I+Î
N# Î#N2Î1N2rT   c                ó°   — t          | pd¦  «        }t          j        |                     d¦  «        ¦  «                             ¦   «         dd…         }d|› �S )zFReturn a stable Matrix session-key fingerprint for shared room status.r#   úutf-8Né   zsha256:)r!   ÚhashlibÚsha256ÚencodeÚ	hexdigest)rT   rÿ   Údigests      r(   rT  z4GatewaySlashCommandsMixin._redact_matrix_session_keyË  sT   € õ �;Ð$ "Ñ%Ô%ˆÝ” §¢¨GÑ 4Ô 4Ñ5Ô5×?Ò?ÑAÔAÀ#À2À#ÔFˆØ!˜Ð!Ð!Ð!r*   c              ƒ  óˆ  K  — ddl m} |j        }|                      |¦  «        }| j                             |¦  «        ƒ d{V —†}|                     ¦   «                              ¦   «                              ¦   «         dv }| j	         
                    |¦  «        }|r||u rst          | dd¦  «        }t          | dd¦  «        }	|�O|	�M	 |5  |	 
                    |¦  «        }
ddd¦  «         n# 1 swxY w Y   |
r|
d         }n# t          $ r d}Y nw xY wt          |¦  «        o||u}|rt          |dd¦  «        nd}d}d}|�&t          |dd¦  «        pd}t          |d	d¦  «        pd}|rt          t          |d
d¦  «        ¦  «        nd}|st          t          |dd¦  «        ¦  «        }|sz| j        rs	 | j                             |j        ¦  «        ƒ d{V —†pi }t'          |t(          ¦  «        r#t          | 
                    d
d¦  «        ¦  «        }n# t          $ r d}Y nw xY w|sD|rB	 ddlm} t          t/          j        ||¦  «        ƒ d{V —†¦  «        }n# t          $ r d}Y nw xY w|dk    �r®|dk    �r§t3          d||z  dz  ¦  «        }t5          d||z
  ¦  «        }d}t7          t9          |dz  |z  ¦  «        ¦  «        }dt5          d|¦  «        z  dt5          d||z
  ¦  «        z  z   }t;          d¦  «        dt;          d|pd¬¦  «        t;          d|d›¬¦  «        t;          d|d›|d›|d›¬¦  «        t;          d|¬¦  «        t;          d|d›¬¦  «        g}|��"t          |d d¦  «        pd}t          |d!d¦  «        pddz  }|                     d¦  «         |dk    r_||k    r*|                     t;          d"|d›|d›¬#¦  «        ¦  «         n/|                     t;          d$|d›|d›||z
  d›¬%¦  «        ¦  «         t          |d&d¦  «        pd}|                     t;          d'|¬(¦  «        ¦  «         |r9t          |d)d¦  «        }|�&|                     t;          d*|d›¬+¦  «        ¦  «         t          |d,d¦  «        pd}t          |d-d¦  «        pd}t          |d.d¦  «        pd}t          |d/d¦  «        pd}t          |d0d¦  «        pd} |                     d¦  «         |                     t;          d1|¬2¦  «        ¦  «         |                     t;          d3|d›|d›|d›¬4¦  «        ¦  «         |                     t;          d5| d›¬¦  «        ¦  «         |                     t;          d6¦  «        ¦  «         n7|                     d¦  «         |                     t;          d7¦  «        ¦  «         |rNt/          j        | j        |||¦  «        ƒ d{V —†}!|!r*|                     d¦  «         |                      |!¦  «         d8 !                    |¦  «        S | j         "                    |j        ¦  «        ƒ d{V —†}"|"rodd9lm#}# d:„ |"D ¦   «         }$ |#|$¦  «        }%d8 !                    t;          d¦  «        dt;          d;|%d›tI          |$¦  «        ¬<¦  «        t;          d7¦  «        g¦  «        S t;          d=¦  «        S )>uå  Handle /context â€” the dedicated context-window view.

        /status shows a one-line ``used / total`` summary; this command is the
        deep view: a usage gauge, auto-compression threshold and headroom,
        compression count and last savings, and cumulative throughput â€” the last
        clearly labelled as throughput, NOT context size.

        Resolves from the running agent (mid-turn), then the cached agent
        (between turns), then the SessionStore/SessionDB metadata for a gauge
        even when no agent is resident. Falls back to a transcript estimate only
        as a last resort.

        ``/context all`` appends the expanded per-skill / per-toolset cost
        listings (requires a resident agent).
        r   ©r  N>   ÚallÚfullÚdetailsrP   ro   r'  r(  r)  r$  r#   )Úget_model_context_lengthg      Y@r.  é   u   â–ˆu   â–‘zgateway.context.headerzgateway.context.modelrÁ   r-  zgateway.context.windowr/  )r2  zgateway.context.in_useú.0fr0  zgateway.context.bar)Úbarzgateway.context.headroom)ÚheadroomÚthreshold_tokensÚthreshold_percentzgateway.context.over_threshold)Ú	thresholdÚthreshold_pctzgateway.context.threshold)r�  r‚  Úto_goÚcompression_countzgateway.context.compressionsr9  Ú_last_compression_savings_pctzgateway.context.last_savings)ÚsavingsÚsession_api_callsÚsession_input_tokensÚsession_output_tokensÚsession_reasoning_tokensÚsession_total_tokenszgateway.context.totals_header)Úcallszgateway.context.totals_line)Úinputr  Ú	reasoningzgateway.context.total_billedzgateway.context.throughput_notez"gateway.context.detail_after_firstr±   ©Úestimate_messages_tokens_roughc                ój   — g | ]0}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|‘Œ1S ©Úrole>   ÚuserÚ	assistantÚcontent©rE   ©rÌ   r  s     r(   r  zEGatewaySlashCommandsMixin._handle_context_command.<locals>.<listcomp>|  sI   € ð ð ð àØ—5’5˜‘=”=Ð$9Ð9Ð9¸a¿eºeÀIÑ>NÔ>NÐ9ð à9Ð9Ð9r*   zgateway.context.estimated)r:  Úmessageszgateway.context.no_data)%r´   r  ri   rj   r?   r†   r‡   r&   rÑ   rF  rE   rD   ry   Úboolr)   r0   rˆ   rI  rS   r%   r	  Úagent.model_metadatarz  rq   rƒ   rJ  Úmaxr+   rK  r   rØ   Ú_context_breakdown_blockrL  r·   Úload_transcriptr�  r  )&rF   rJ   r  ri   rT   rU  ÚexpandedrW  r^  r_  r`  Ú	has_agentre  r1  r)  ra  r\  rz  r3  r~  Ú	BAR_WIDTHÚfilledr}  r¼   r�  r‚  Úcompressionsr†  Ú	api_callsr  r   r#  Útotal_tokensÚ	breakdownÚhistoryr�  ÚmsgsÚapproxs&                                         r(   Ú_handle_context_commandz1GatewaySlashCommandsMixin._handle_context_commandÒ  sÓ  è è € ð  	8Ð7Ð7Ð7Ð7Ð7à”ˆØ×2Ò2°6Ñ:Ô:ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;Ð?YÐYˆð Ô$×(Ò(¨Ñ5Ô5ˆØð 
	!˜Ð!8Ð8Ð8Ý  Ð':¸DÑAÔAˆJÝ˜D .°$Ñ7Ô7ˆEØÐ%¨%Ð*;ð!Ø#ð 8ð 8Ø!&§¢¨;Ñ!7Ô!7˜ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8àð *Ø & q¤	˜øøÝ ð !ð !ð !Ø �E�E�Eð!øøøå˜‘K”KÐH EÐ1HÐ$Hˆ	à<EÐO�g�eÐ1°4Ñ8Ô8Ð8È4ˆð ˆØˆØˆ?Ý˜3Ð 4°aÑ8Ô8Ð=¸AˆDÝ$ SÐ*:¸AÑ>Ô>ÐCÀ!ˆNà@IÐQ•Z¥¨¨w¸Ñ ;Ô ;Ñ<Ô<Ð<Èrˆ
àð 	OÝ�g mÐ5IÈ1ÑMÔMÑNÔNˆDàð 	 ˜dÔ.ð 	 ð Ø Ô,×8Ò8¸Ô9QÑRÔRÐRÐRÐRÐRÐRÐRÐXÐVX�Ý˜c¥4Ñ(Ô(ð BÝ!+¨C¯GªG°G¸RÑ,@Ô,@Ñ!AÔ!A�JøøÝð  ð  ð  Ø�
�
�
ð øøøð ð 	# *ð 	#ð#ØIÐIÐIÐIÐIÐIå!+Ý!Ô+Ð,DÀjÑQÔQÐQÐQÐQÐQÐQÐQñ"ô "��øõ ð #ð #ð #Ø!"���ð#øøøð �!Š8‰8˜¨Ò*Ñ*Ý�e˜T NÑ2°SÑ8Ñ9Ô9ˆCÝ˜1˜n¨tÑ3Ñ4Ô4ˆHØˆIÝ�˜s S™y¨9Ñ4Ñ5Ô5Ñ6Ô6ˆFØ�#˜a ™.œ.Ñ(¨5µ3°q¸)ÀfÑ:LÑ3MÔ3MÑ+MÑMˆCõ Ð*Ñ+Ô+ØÝÐ)°Ð1B¸sÐCÑCÔCÝÐ*°^Ð2GÐ2GÐHÑHÔHÝØ,Ø ˜˜Ø+Ð/Ð/Ø˜˜ð	ñ ô õ Ð'¨SÐ1Ñ1Ô1ÝÐ,¸(°°ÐGÑGÔGðˆEð  ‰Ý# CÐ);¸QÑ?Ô?ÐDÀ1�	Ý!(¨Ð.AÀ1Ñ!EÔ!EÐ!JÈÈcÑ Q�Ø—’˜RÑ Ô Ð Ø˜q’=�=Ø˜yÒ(Ð(ØŸšÝØ @Ø-6Ð*:Ð*:Ø1>Ð.DÐ.Dðñ ô ñô ð ð ð ŸšÝØ ;Ø-6Ð*:Ð*:Ø1>Ð.DÐ.DØ)2°TÑ)9Ð&=Ð&=ð	ñ ô ñô ð õ  ' sÐ,?ÀÑCÔCÐHÀq�Ø—’�QÐ=À\ÐRÑRÔRÑSÔSÐSØð Ý% cÐ+JÈDÑQÔQ�GØÐ*ØŸšÝÐ<ÈÐFVÐFVÐWÑWÔWñô ð õ $ EÐ+>ÀÑBÔBÐGÀa�	Ý& uÐ.DÀaÑHÔHÐMÈA�Ý '¨Ð/FÈÑ JÔ JÐ OÈa�Ý#*¨5Ð2LÈaÑ#PÔ#PÐ#UÐTUÐ Ý& uÐ.DÀaÑHÔHÐMÈA�Ø—’˜RÑ Ô Ð Ø—’ÝÐ5¸YÐGÑGÔGñô ð ð —’ÝØ5Ø!-Ð1Ð1Ø"/Ð3Ð3Ø%5Ð"9Ð"9ð	ñ ô ñô ð ð —’�QÐ=ÈÐEXÐEXÐYÑYÔYÑZÔZÐZØ—’�QÐ@ÑAÔAÑBÔBÐBÐBà—’˜RÑ Ô Ð Ø—’�QÐCÑDÔDÑEÔEÐEð ð ,Ý")Ô"3ØÔ1°5¸&À(ñ#ô #ð ð ð ð ð ð �	ð ð ,Ø—L’L Ñ$Ô$Ð$Ø—L’L Ñ+Ô+Ð+à—9’9˜UÑ#Ô#Ð#ð Ô0×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZˆØð 	ØKÐKÐKÐKÐKÐKðð à ðñ ô ˆDð
 4Ð3°DÑ9Ô9ˆFØ—9’9åÐ.Ñ/Ô/ØÝØ3Ø!'˜m˜mÝ!$ T¡¤ðñ ô õ
 Ð:Ñ;Ô;ð	ñô ð õ Ð*Ñ+Ô+Ð+s[   ÃD  ÃC*ÃD  Ã*C.Ã.D  Ã1C.Ã2D  Ä DÄDÆ2AH ÈH!È H!È).I ÉI'É&I'rS   úOptional[SessionSource]c                ód  — t          t          | j        ¦  «        dd¦  «        }t          |¦  «        r& || j        |¦  «        }|�t          |dd¦  «        ndS t          | j        di ¦  «        pi }|                     ¦   «         D ]*}t          |dd¦  «        |k    rt          |dd¦  «        c S Œ+dS )z2Best-effort origin lookup for gateway session IDs.Úlookup_by_session_idNÚoriginrn   rS   )rD   Útyperm   ÚcallableÚvalues)rF   rS   ÚlookupÚentryÚentriess        r(   Ú_gateway_session_origin_for_idz8GatewaySlashCommandsMixin._gateway_session_origin_for_id�  sÎ   € å�˜dÔ0Ñ1Ô1Ð3IÈ4ÑPÔPˆÝ�FÑÔð 	QØ�F˜4Ô-¨zÑ:Ô:ˆEØ5:Ð5F•7˜5 (¨DÑ1Ô1Ð1ÈDÐPõ ˜$Ô,¨j¸"Ñ=Ô=ÐCÀˆØ—^’^Ñ%Ô%ð 	6ð 	6ˆEÝ�u˜l¨DÑ1Ô1°ZÒ?Ð?Ý˜u h°Ñ5Ô5Ð5Ð5Ð5ð @àˆtr*   Úcurrentr   r®  rš  c                ó  — |d uo{|j         t          j        k    of| j         t          j        k    oQ|j        | j        k    oAt	          t          | dd¦  «        pd¦  «        t	          t          |dd¦  «        pd¦  «        k    S )Nrê   r#   )rG   r   rP  ré   r!   rD   )r¶  r®  s     r(   Ú_same_matrix_roomz+GatewaySlashCommandsMixin._same_matrix_roomŸ  s‹   € ð ˜$Ðð ;Ø”¥8¤?Ò2ð;àÔ ¥H¤OÒ3ð;ð ” '¤/Ò1ð;õ •G˜G [°"Ñ5Ô5Ð;¸Ñ<Ô<Ý•7˜6 ;°Ñ3Ô3Ð9°rÑ:Ô:ò;ð	
r*   c           	     óÞ  — |�|€dS |j         |j         k    rdS |j        |j        k    rdS t          t          |dd¦  «        pd¦  «        t          t          |dd¦  «        pd¦  «        k    rdS t          |dd¦  «        pd                     ¦   «         }|dv rqt          t          |dd¦  «        pd¦  «        rdS t          |j        p|j        pd¦  «        }t          |j        p|j        pd¦  «        }t          |¦  «        o||k    S t          |t          | j	        d	d¦  «        t          | j	        d
d¦  «        ¬¦  «        }|rdS |j        p|j        }|j        p|j        }|r|r||k    S dS )uÔ  Platform-agnostic counterpart to ``_same_matrix_room``.

        True when *origin* shares *current*'s platform and chat, and the same
        participant whenever the session key for this source is per-user. Group
        and thread sessions that ``build_session_key`` isolates per participant
        (the default ``group_sessions_per_user=True``) must also be scoped by
        participant here â€” otherwise a co-member could resume another member's
        live per-user group session (IDOR). Only an explicitly shared
        group/thread (``group_sessions_per_user=False`` /
        ``thread_sessions_per_user``) lets co-members share, mirroring the key
        contract via ``is_shared_multi_user_session``.
        NFrê   r#   rÐ   >   r#   rÂ   rÃ   rÄ   ré   TÚgroup_sessions_per_userÚthread_sessions_per_user©rº  r»  )
rG   ré   r!   rD   rÑ   Úuser_id_altr\   rš  r   r¦   )rF   r¶  r®  rÐ   Úcur_pidÚorg_pidÚshareds          r(   Ú_same_origin_chatz+GatewaySlashCommandsMixin._same_origin_chat±  s½  € ð ˆ>˜W˜_Ø�5ØŒ?˜gÔ.Ò.Ð.Ø�5ØŒ>˜Wœ_Ò,Ð,Ø�5õ �w�w ¨RÑ0Ô0Ð6°BÑ7Ô7½3Ý�F˜K¨Ñ,Ô,Ð2°ñ<
ô <
ò 
ð 
ð �5Ý˜W k°2Ñ6Ô6Ð<¸"×CÒCÑEÔEˆ	àÐ7Ð7Ð7õ •7˜7 I¨rÑ2Ô2Ð8°bÑ9Ô9ð Ø�tÝ˜'Ô-ÐF°´ÐFÀBÑGÔGˆGÝ˜&Ô,ÐD°´ÐDÀ"ÑEÔEˆGÝ˜‘=”=Ð7 W°Ò%7Ð7õ .ØÝ$+¨D¬KÐ9RÐTXÑ$YÔ$YÝ%,¨T¬[Ð:TÐV[Ñ%\Ô%\ð
ñ 
ô 
ˆð
 ð 	Ø�4ð Ô%Ð8¨¬ˆØÔ$Ð6¨¬ˆØð 	&�wð 	&Ø˜gÒ%Ð%ð ˆur*   ri   c                óÌ   — 	 ddl m}  || j        |¦  «        }t          |dd¦  «        }t	          |j        o|o|                     |¦  «        ¦  «        S # t          $ r Y dS w xY w)a+  Whether *source* is an EXPLICITLY-configured admin allowed to make a
        cross-origin /resume or /sessions listing.

        Deliberately stricter than ``SlashAccessPolicy.is_admin()``: that returns
        True for every allowed caller when slash gating is DISABLED (so commands
        stay runnable by default), but cross-ORIGIN DATA ACCESS must require a
        real, configured admin. Otherwise the default (no admin list) config
        would treat every gateway caller as cross-origin-capable and re-open the
        enumeration IDOR.
        r   r¿   r\   NF)rÏ   rÀ   r¦   rD   rš  rÒ   rÓ   ry   )rF   ri   rÀ   rÚ   Úuids        r(   Ú_resume_caller_is_adminz1GatewaySlashCommandsMixin._resume_caller_is_adminó  s†   € ð	Ø>Ð>Ð>Ð>Ð>Ð>Ø&Ð& t¤{°FÑ;Ô;ˆFÝ˜& )¨TÑ2Ô2ˆCÝ˜œÐG¨3ÐG°6·?²?À3Ñ3GÔ3GÑHÔHÐHøÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚AA Á
A#Á"A#FÚ	target_idÚallow_overridec           	   ƒ  ó@  K  — |r|                       |¦  «        rdS 	 |                      |¦  «        }n# t          $ r d}Y nw xY wt          |t          ¦  «        r|                      ||¦  «        S 	 | j                             |¦  «        ƒ d{V —†pi }n# t          $ r Y dS w xY w|j        r|j        j	        nd}| 
                    d¦  «        }|r$|r"t          |¦  «        t          |¦  «        k    rdS t          t          |dd¦  «        pd¦  «        }t          | 
                    d¦  «        pd¦  «        }	t          t          |dd¦  «        pd¦  «        }
t          | 
                    d¦  «        pd¦  «        }t          t          |dd¦  «        pd¦  «        }t          | 
                    d¦  «        pd¦  «        }t          |d	d¦  «        pd                     ¦   «         }|d
v }t          t          t          |dd¦  «        pd¦  «        ¦  «        }|�rt          |¦  «        o4t          |¦  «        o%t          |¦  «        t          |¦  «        k    o||k    }|sdS |r=|r t          |¦  «        rt          |
¦  «        sdS t          |	¦  «        o|	|k    o||
k    S t          |¦  «        rt          |
¦  «        r||
k    sdS t          |t          | j        dd¦  «        t          | j        dd¦  «        ¬¦  «        }|rdS |rdS t          |	¦  «        o|	|k    S dS )ab  Whether *source* may resume the persisted session *target_id*.

        Generalizes the Matrix-only room guard to every adapter so a caller
        cannot bind their gateway session to another user's/room's persisted
        session id (IDOR). Uses the live origin when the target is active;
        otherwise falls back to the DB row's source + user_id (the sessions
        table has no chat_id). An identity-bearing caller is allowed only when
        the row PROVES the same owner; a row that lacks enough ownership data
        fails closed. An explicit admin ``--all`` override bypasses scoping.
        TNFri   r\   r#   ré   rê   rÐ   >   r#   rÂ   rÃ   rÄ   r½  rº  r»  r¼  )rÄ  rµ  ry   r%   r   rÁ  rˆ   rI  rG   r   rE   r!   rD   rÑ   rš  r   r¦   )rF   ri   rÅ  rÆ  r®  r\  Ú
caller_srcÚrow_srcÚ
caller_uidÚrow_uidÚcaller_chatÚrow_chatÚcaller_threadÚ
row_threadrÐ   Úcaller_is_dmÚcaller_keys_on_altÚ	origin_okrÀ  s                      r(   Ú_resume_target_allowedz0GatewaySlashCommandsMixin._resume_target_allowed  s¢  è è € ð ð 	˜d×:Ò:¸6ÑBÔBð 	Ø�4ð	Ø×8Ò8¸ÑCÔCˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøå�f�mÑ,Ô,ð 	:Ø×)Ò)¨&°&Ñ9Ô9Ð9ð	ØÔ(×4Ò4°YÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ÐEÀ2ˆCˆCøÝð 	ð 	ð 	Ø�5�5ð	øøøà.4¬oÐG�V”_Ô*Ð*À4ˆ
Ø—'’'˜(Ñ#Ô#ˆØð 	�zð 	¥c¨'¡l¤lµc¸*±o´oÒ&EÐ&EØ�5Ý� ¨°BÑ7Ô7Ð=¸2Ñ>Ô>ˆ
Ý�c—g’g˜iÑ(Ô(Ð.¨BÑ/Ô/ˆõ �' &¨)°RÑ8Ô8Ð>¸BÑ?Ô?ˆÝ�s—w’w˜yÑ)Ô)Ð/¨RÑ0Ô0ˆÝ�G F¨K¸Ñ<Ô<ÐBÀÑCÔCˆÝ˜Ÿš Ñ-Ô-Ð3°Ñ4Ô4ˆ
Ý˜V [°"Ñ5Ô5Ð;¸×BÒBÑDÔDˆ	Ø Ð$CÐCˆõ "¥#¥g¨f°mÀRÑ&HÔ&HÐ&NÈBÑ"OÔ"OÑPÔPÐØñ F	;õ& �W‘”ð 0¥$ zÑ"2Ô"2ð 0Ý˜‘L”L¥C¨
¡O¤OÒ3ð0à -Ò/ð ð
 ð Ø�uØð ð &ð !­t°H©~¬~ð !Å$À{ÑBSÔBSð !Ø ˜5å˜‘M”Mð 0 g°Ò&;ð 0Ø  KÒ/ðõ ˜‘N”Nð ¥t¨KÑ'8Ô'8ð ¸XÈÒ=TÐ=TØ�uõ 2ØÝ(/°´Ð=VÐX\Ñ(]Ô(]Ý)0°´Ð>XÐZ_Ñ)`Ô)`ðñ ô ˆFð
 ð Ø�tð
 "ð Ø�uÝ˜‘=”=Ð: W°
Ò%:Ð:ð ˆus!   �3 ³AÁAÁ1"B Â
B"Â!B"r\  r	  Ú	allow_allc              ƒ  ój  K  — t          |                     d¦  «        pd¦  «        }|j        t          j        k    rB|r|                      |¦  «        rdS |                      ||                      |¦  «        ¦  «        S |r|                      |¦  «        rdS |                      ||d¬¦  «        ƒ d{V —†S )aZ  Whether a titled-session listing *row* belongs to the caller's origin.

        Prevents cross-origin enumeration of session ids/previews via the
        numbered /resume list. Preserves the existing Matrix room-scoping
        semantics; scopes every other platform to the caller's own sessions
        unless an admin passes ``--all``.
        Úidr#   TF©rÆ  N)	r!   rE   rG   r   rP  rÄ  r¸  rµ  rÓ  )rF   ri   r\  rÔ  Úsids        r(   Ú_resume_row_visiblez-GatewaySlashCommandsMixin._resume_row_visible•  sË   è è € õ �#—'’'˜$‘-”-Ð% 2Ñ&Ô&ˆØŒ?�hœoÒ-Ð-ð ð ˜T×9Ò9¸&ÑAÔAð Ø�tØ×)Ò)¨&°$×2UÒ2UÐVYÑ2ZÔ2ZÑ[Ô[Ð[Øð 	˜×5Ò5°fÑ=Ô=ð 	Ø�4Ø×0Ò0°¸ÈUÐ0ÑSÔSÐSÐSÐSÐSÐSÐSÐSr*   c              ƒ  ór  K  — ddl m} ddlm}m} t          j        ¦   «         }|                      |j        ¦  «        }t          | di ¦  «        pi }t          | di ¦  «        pi }g }	| 	                    ¦   «         D ]É\  }
}t          |                     |
|¦  «        ¦  «        }t          dt          ||z
  ¦  «        ¦  «        }||u }|	                     |
||rt          d¦  «        nt          d¦  «        |rdnt!          t          |d	d¦  «        pd¦  «        |rdnt!          t          |d
d¦  «        pd¦  «        dœ¦  «         ŒÊ|	                     d„ d¬¦  «         g }	 d„ |                     ¦   «         D ¦   «         }n# t&          $ r g }Y nw xY wd„ t          | dt)          ¦   «         ¦  «        pt)          ¦   «         D ¦   «         }t          d¦  «        dt          dt+          |	¦  «        ¬¦  «        g}|	rït-          |	dd…         d¦  «        D ]�\  }}|d         |k    rt          d¦  «        nd}|d	         rd|d	         › d�nd}|d
         rd|d
         › d�nd}|                     |› d|d         › d|d         › d ||d          ¦  «        › |› |› |› �
¦  «         Œ�t+          |	¦  «        dk    r4|                     t          d!t+          |	¦  «        dz
  ¬¦  «        ¦  «         |                     dt          d"t+          |¦  «        ¬¦  «        g¦  «         |�r|dd…         D ]Ç}d#                     t!          |                     d$d¦  «        ¦  «                             ¦   «         ¦  «        }t+          |¦  «        d%k    r|dd&…         d'z   }|                     d(|                     d	d)¦  «        › d |t          |                     d*d¦  «        ¦  «        ¦  «        › d|› d�¦  «         ŒÈt+          |¦  «        dk    r4|                     t          d!t+          |¦  «        dz
  ¬¦  «        ¦  «         |                     dt          d+t+          |¦  «        ¬¦  «        g¦  «         g }	 dd,lm} d-„  |¦   «         D ¦   «         }n# t&          $ r g }Y nw xY w|�rL|                     dt          d.t+          |¦  «        ¬¦  «        g¦  «         |dd…         D �]Æ}d#                     t!          |                     d/¦  «        pd¦  «                             ¦   «         ¦  «        }t+          |¦  «        d0k    r|dd1…         d'z   }|                     d2d)¦  «        }d(|                     d3d)¦  «        › d|› �}|d4k    r"|                     d5¦  «        }|�
|d6|d7›d8�z  }n*|                     d9d¦  «        d:k    r|d;|d9         d7›d8�z  }|r|d|› �z  }|                     |¦  «         t-          |                     d<¦  «        pg ¦  «        D ]’\  }} t9          | t:          ¦  «        sŒ|                      d=¦  «        }!|!rd|!› d�nd>}"d?|dz   › d@|                      dAd)¦  «        › dB|"› �}#|                      dC¦  «        }$|$�
|#dD|$d7›dE�z  }#|                     |#¦  «         Œ“�ŒÈt+          |¦  «        dk    r4|                     t          d!t+          |¦  «        dz
  ¬¦  «        ¦  «         |	s=|s;|s9|s7|                     d¦  «         |                     t          dF¦  «        ¦  «         dG                     |¦  «        S )Hz>Handle /agents command - list active agents and running tasks.r   rv  )Úformat_uptime_shortÚprocess_registryrF  Ú_running_agents_tszgateway.agents.state_startingzgateway.agents.state_runningr#   rS   r$  )rT   Úelapsedr8  rS   r$  c                ó   — | d         S )NrÞ  rË   )r\  s    r(   ú<lambda>zBGatewaySlashCommandsMixin._handle_agents_command.<locals>.<lambda>Ç  s
   € ¨¨I¬€ r*   T)ÚkeyÚreversec                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚstatusÚrunningr—  r  s     r(   r  zDGatewaySlashCommandsMixin._handle_agents_command.<locals>.<listcomp>Ë  s7   € ð !ð !ð !ØØ—5’5˜‘?”? iÒ/Ð/ð Ø/Ð/Ð/r*   c                óP   — g | ]#}t          |d ¦  «        ¯ |j        ¦   «         °!|‘Œ$S )Údone)r  rç  )rÌ   r   s     r(   r  zDGatewaySlashCommandsMixin._handle_agents_command.<locals>.<listcomp>Ò  sH   € ð 
ð 
ð 
ØÝ�q˜&Ñ!Ô!ð
à*0¨!¬&©(¬(ð
Øð
ð 
ð 
r*   Ú_background_taskszgateway.agents.headerzgateway.agents.active_agentsr9  Nro  rå   rT   zgateway.agents.this_chatu    Â· `ú`z. `u   ` Â· r8  u    Â· rÞ  zgateway.agents.morez gateway.agents.running_processesÚ ÚcommandéZ   éW   ú...z- `rÁ   Úuptime_secondszgateway.agents.async_jobs)Úlist_async_delegationsc                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )rä  )rå  ÚstallingÚ
finalizingr—  )rÌ   Úds     r(   r  zDGatewaySlashCommandsMixin._handle_agents_command.<locals>.<listcomp>  s8   € ð ð ð ØØ—5’5˜‘?”?Ð&KÐKÐKð ØKÐKÐKr*   z%gateway.agents.background_delegationsÚgoaléF   éC   rä  Údelegation_idrò  Ústalled_after_quiet_secondsu    Â· no progress r|  ÚsÚseconds_since_progressé<   u
    Â· quiet Úchildren_activityÚcurrent_toolzbetween turnsz
  - child ú: r¤  u    api calls Â· Úseconds_since_activityu    Â· active zs agozgateway.agents.noner±   )r´   r  Útools.process_registryrÛ  rÜ  Útimerj   ri   rD   ÚitemsÚfloatrE   rœ  r+   rØ   r   r!   ÚsortÚlist_sessionsry   rÖ   r  Ú	enumeraterL  r·   r  r|   rð  r%   r	  )%rF   rJ   r  rÛ  rÜ  ÚnowÚcurrent_session_keyÚrunning_agentsÚrunning_startedÚ
agent_rowsrT   rW  ÚstartedrÞ  Ú
is_pendingÚrunning_processesÚbackground_tasksr¼   Úidxr\  r¶  rØ  r$  ÚprocÚcmdÚdelegationsrð  rô  rõ  rä  Úquietr  ÚchildÚtoolÚdoingÚpartÚidles%                                        r(   Ú_handle_agents_commandz0GatewaySlashCommandsMixin._handle_agents_command­  s	  è è € à7Ð7Ð7Ð7Ð7Ð7ØPÐPÐPÐPÐPÐPÐPÐPåŒi‰kŒkˆØ"×:Ò:¸5¼<ÑHÔHÐå& tÐ->ÀÑCÔCÐIÀrˆÝ '¨Ð.BÀBÑ GÔ GÐ MÈ2ˆà!#ˆ
Ø"0×"6Ò"6Ñ"8Ô"8ð 	ð 	ÑˆK˜Ý˜O×/Ò/°¸SÑAÔAÑBÔBˆGÝ˜!�S  w¡Ñ/Ô/Ñ0Ô0ˆGØÐ"9Ð9ˆJØ×Òà#.Ø&ØCMÐt�QÐ>Ñ?Ô?Ð?ÕSTÐUsÑStÔStØ(2Ð"c " "½½GÀEÈ<ÐY[Ñ<\Ô<\Ð<bÐ`bÑ8cÔ8cØ#-ÐY˜R˜Rµ3µw¸uÀgÈrÑ7RÔ7RÐ7XÐVXÑ3YÔ3Yðð ñô ð ð ð 	�ŠÐ6Ð6ÀˆÑEÔEÐEà(*Ðð	#ð!ð !Ø+×9Ò9Ñ;Ô;ð!ñ !ô !ÐÐøõ ð 	#ð 	#ð 	#Ø "ÐÐÐð	#øøøð
ð 
Ý Ð&9½3¹5¼5ÑAÔAÐJÅSÁUÄUð
ñ 
ô 
Ðõ Ð%Ñ&Ô&ØÝÐ,µC¸
±O´OÐDÑDÔDð
ˆð ð 
	SÝ% j°°"°¤o°qÑ9Ô9ð ð ‘��SØ;>¸}Ô;MÐQdÒ;dÐ;d�!Ð6Ñ7Ô7Ð7Ðjl�Ø69¸,Ô6GÐOÐ2˜c ,Ô/Ð2Ð2Ð2Ð2ÈR�Ø36°w´<ÐGÐ/  G¤Ð/Ð/Ð/Ð/ÀR�Ø—’Øð Rð R˜s =Ô1ð Rð R¸¸G¼ð Rð RØ*Ð*¨3¨y¬>Ñ:Ô:ðRØ<?ðRØAFðRØHOðRð Rñô ð ð õ �:‰Œ Ò#Ð#Ø—’�QÐ4½CÀ
¹O¼OÈbÑ<PÐQÑQÔQÑRÔRÐRà�ŠàÝÐ4½CÐ@QÑ<RÔ<RÐSÑSÔSðñ	
ô 	
ð 	
ð ñ 
	ZØ)¨#¨2¨#Ô.ð ð �Ø—h’h�s 4§8¢8¨I°rÑ#:Ô#:Ñ;Ô;×AÒAÑCÔCÑDÔD�Ý�s‘8”8˜b’=�=Ø˜c˜r˜cœ( UÑ*�CØ—’ð\˜$Ÿ(š( <°Ñ5Ô5ð \ð \Ø*Ð*­3¨t¯xªxÐ8HÈ!Ñ/LÔ/LÑ+MÔ+MÑNÔNð\ð \ØUXð\ð \ð \ñô ð ð õ Ð$Ñ%Ô%¨Ò*Ð*Ø—’�QÐ4½CÐ@QÑ<RÔ<RÐUWÑ<WÐXÑXÔXÑYÔYÐYà�ŠàÝÐ-µSÐ9IÑ5JÔ5JÐKÑKÔKðñ	
ô 	
ð 	
ð #%ˆð	ØEÐEÐEÐEÐEÐEðð Ø1Ð1Ñ3Ô3ðñ ô ˆKˆKøõ ð 	ð 	ð 	ØˆKˆKˆKð	øøøàñ )	Ø�LŠLàÝØ?Ý! +Ñ.Ô.ðñ ô ðñô ð ð !  " Ô%ð 'ñ '�Ø—x’x¥ A§E¢E¨&¡M¤MÐ$7°RÑ 8Ô 8× >Ò >Ñ @Ô @ÑAÔA�Ý�t‘9”9˜r’>�>Ø   œ9 uÑ,�DØŸš˜x¨Ñ-Ô-�ØF˜AŸEšE /°3Ñ7Ô7ÐFÐF¸fÐFÐF�Ø˜ZÒ'Ð'ØŸEšEÐ"?Ñ@Ô@�EØÐ(ØÐ>°%Ð>Ð>Ð>Ð>Ñ>˜øØ—U’UÐ3°QÑ7Ô7¸2Ò=Ð=ØÐJ¨Ð*BÔ(CÐJÐJÐJÐJÑJ�CØð )Ø˜= $˜=˜=Ñ(�CØ—’˜SÑ!Ô!Ð!Ý )¨!¯%ª%Ð0CÑ*DÔ*DÐ*JÈÑ KÔ Kð 'ð '‘H�A�uÝ% e­TÑ2Ô2ð !Ø Ø Ÿ9š9 ^Ñ4Ô4�DØ+/ÐD˜K ˜K˜K˜K˜K°_�EðN Q¨¡Uð Nð NØ Ÿ9š9 [°#Ñ6Ô6ðNð NØFKðNð Nð ð !Ÿ9š9Ð%=Ñ>Ô>�DØÐ'ØÐ =¨dÐ =Ð =Ð =Ð =Ñ=˜Ø—L’L Ñ&Ô&Ð&Ð&ñ'õ �;ÑÔ "Ò$Ð$Ø—’ÝÐ+µ3°{Ñ3CÔ3CÀbÑ3HÐIÑIÔIñô ð ð
 ð	3à%ð	3ð %ð	3ð  ð		3ð �LŠL˜ÑÔÐØ�LŠL�Ð0Ñ1Ô1Ñ2Ô2Ð2à�yŠy˜ÑÔÐs$   ÅE> Å>FÆFÑ)R ÒRÒRc           	   ƒ  ó¨  K  — ddl m}m} |j        }| j                             |¦  «        ƒ d{V —†}|j        }| j                             |¦  «        }||u rV|  	                    |||d¬¦  «        ƒ d{V —† t                               d|¦  «         t          t          d¦  «        ¦  «        S |r;|  	                    |||d¬¦  «        ƒ d{V —† t          t          d	¦  «        ¦  «        S |                      ||¦  «        }|r’|                      |¦  «        r}|D ]!}	|  	                    |	||d
¬¦  «        ƒ d{V —† Œ"t                               d|t!          |¦  «        d                     |¦  «        ¦  «         t          t          d	¦  «        ¦  «        S t%          | di ¦  «                             |j        ¦  «        }
|
r†t)          |
d¦  «        rv	 |
                     |j        |                      ||                      |¦  «        ¦  «        ¦  «        ƒ d{V —† n,# t2          $ r t                               dd¬¦  «         Y nw xY wt          d¦  «        S )að  Handle /stop command - interrupt a running agent.

        When an agent is truly hung (blocked thread that never checks
        _interrupt_requested), the early intercept in _handle_message()
        handles /stop before this method is reached.  This handler fires
        only through normal command dispatch (no running agent) or as a
        fallback.  Force-clean the session lock in all cases for safety.

        The session is preserved so the user can continue the conversation.
        r   )r  Ú_INTERRUPT_REASON_STOPNÚstop_command_pending)Úinterrupt_reasonÚinvalidation_reasonu2   STOP (pending) for session %s â€” sentinel clearedzgateway.stop.stopped_pendingÚstop_command_handlerzgateway.stop.stoppedÚstop_command_thread_siblinguC   STOP (thread sibling) by %s â€” interrupted %d run(s) in thread: %srÉ   rA   Ú_stop_typing_with_metadataz4Failed to clear typing on /stop with no active agentTrb   zgateway.stop.no_active)r´   r  r  ri   r?   r†   rT   rF  rE   Ú_interrupt_and_clear_sessionrw   Úinfor   r   Ú_sibling_thread_run_keysÚ_is_user_authorizedr  r·   rD   rG   r  r#  ré   r  r  ry   rŽ   )rF   rJ   r  r  ri   rU  rT   rW  Úsibling_keysÚsibling_keyrH   s              r(   Ú_handle_stop_commandz.GatewaySlashCommandsMixin._handle_stop_commandD  s:  è è € ð 	PÐOÐOÐOÐOÐOÐOÐOØ”ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØ#Ô/ˆàÔ$×(Ò(¨Ñ5Ô5ˆØÐ+Ð+Ð+à×3Ò3ØØØ!7Ø$:ð	 4ñ ô ð ð ð ð ð ð ð õ �KŠKÐLÈkÑZÔZÐZÝ!¥!Ð$BÑ"CÔ"CÑDÔDÐDØð 		=ð ×3Ò3ØØØ!7Ø$:ð	 4ñ ô ð ð ð ð ð ð ð õ "¥!Ð$:Ñ";Ô";Ñ<Ô<Ð<ð ×4Ò4°V¸[ÑIÔIˆØð 	=˜D×4Ò4°VÑ<Ô<ð 	=Ø+ð ð �Ø×7Ò7ØØØ%;Ø(Eð	 8ñ ô ð ð ð ð ð ð ð ð õ �KŠKØUØÝ�LÑ!Ô!Ø—	’	˜,Ñ'Ô'ñ	ô ð õ "¥!Ð$:Ñ";Ô";Ñ<Ô<Ð<õ ˜$ 
¨BÑ/Ô/×3Ò3°F´OÑDÔDˆØð 	•w˜wÐ(DÑEÔEð 	ðØ×8Ò8Ø”NØ×4Ò4Ø × <Ò <¸UÑ CÔ Cñô ñô ð ð ð ð ð ð ð ð øõ ð ð ð Ý—’ØJØ!ð ñ ô ð ð ð ðøøøõ Ð)Ñ*Ô*Ð*s   ÇAH È&IÉIc           
   ƒ  óR  K  — t          |dd¦  «        pd                     ¦   «         }|                     d¬¦  «        }|rJ|d                              ¦   «                              d¦  «                             d¦  «        r
|dd	…         }|r|d         nd
                     ¦   «         }t          |¦  «        dk    r|d                              ¦   «         nd}d/d„}|d
k    �r]dg}t          d„ | j         	                    ¦   «         D ¦   «         ¦  «        }|r,| 
                    dd                     |¦  «        z   ¦  «         n| 
                    d¦  «         t          | di ¦  «        pi }	|	r¨|	                     ¦   «         D ]’\  }
}|                     d¦  «        rA|                     d¦  «        pd}| 
                    d|
j        › d|› d|
j        › d�¦  «         Œ[|                     dd¦  «        }| 
                    d|
j        › d|› d�¦  «         Œ“n| 
                    d¦  «         d                     |¦  «        S |dv rã|sd |› d!�S  ||¦  «        }|€d"|› �S t          | di ¦  «        pi }	|d#k    r]||	vr
|j        › d$�S |	|                              d¦  «        r
|j        › d%�S |                      |d&¬'¦  «         d(|j        › d)|j        › d*�S ||	vr
|j        › d+�S |	|                              d¦  «        s
|j        › d,�S |                      |¦  «         d(|j        › d-�S 	 d.S )0u–  Handle ``/platform list|pause|resume [name]`` â€” surface and
        manually control failed/paused gateway adapters.

        Examples:
            ``/platform list``           â€” show connected + failed/paused platforms
            ``/platform pause whatsapp`` â€” stop the reconnect watcher hammering whatsapp
            ``/platform resume whatsapp`` â€” re-queue a paused platform for retry
        r–  r#   ræ   )Úmaxsplitr   rC   rG   rå   NÚlistÚnamer!   c                ó’   — | sd S t           j                             ¦   «         D ]#}|j                             ¦   «         | k    r|c S Œ$d S ©N)r   Ú__members__r±  r   rÑ   )r.  r  s     r(   Ú_resolve_platformzMGatewaySlashCommandsMixin._handle_platform_command.<locals>._resolve_platform©  sU   € Øð Ø�tÝÔ)×0Ò0Ñ2Ô2ð ð �Ø”7—=’=‘?”? dÒ*Ð*Ø�H�H�Hð +à�4r*   z**Gateway platforms**c              3  ó$   K  — | ]}|j         V — Œd S r0  r'   r  s     r(   rÎ   zEGatewaySlashCommandsMixin._handle_platform_command.<locals>.<genexpr>³  s$   è è € ÐEÐE¨1˜qœwÐEÐEÐEÐEÐEÐEr*   zConnected: rÉ   zConnected: (none)Ú_failed_platformsÚpausedÚpause_reasonu     Â· u    â€” PAUSED (z!). Resume with `/platform resume z`.Úattemptsu    â€” retrying (attempt ú)zFailed/paused: (none)r±   >   ÚpauseÚresumezUsage: /platform z <name>zUnknown platform: r9  zB is not in the retry queue (it's either connected or not enabled).z is already paused.zpaused via /platform pauserN   u   âœ“ z' paused. Resume with `/platform resume z'` or `hermes gateway restart` to reset.u1    is not in the retry queue â€” nothing to resume.u*    is already retrying â€” no resume needed.u+    resumed â€” retrying on next watcher tick.uÌ   Usage: /platform <list|pause|resume> [name]
  /platform list â€” show platform status
  /platform pause <name> â€” stop retrying a failing platform
  /platform resume <name> â€” re-queue a paused platform)r.  r!   )rD   r&   r  rÑ   r  r   r  rÔ   rA   rE  rØ   r·   r  rE   r   Ú_pause_failed_platformÚ_resume_paused_platform)rF   rJ   rÿ   Úpartsr  Útargetr2  r¼   Ú	connectedÚfailedr  r%  rO   r7  rG   s                  r(   Ú_handle_platform_commandz2GatewaySlashCommandsMixin._handle_platform_command—  s%  è è € õ ˜˜y¨"Ñ-Ô-Ð3°×:Ò:Ñ<Ô<ˆà—
’
 A�
Ñ&Ô&ˆØð 	�U˜1”X—^’^Ñ%Ô%×,Ò,¨SÑ1Ô1×<Ò<¸ZÑHÔHð 	Ø˜!˜"˜"”IˆEØ#Ð/�%˜”(�(¨×6Ò6Ñ8Ô8ˆÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸ˆð	ð 	ð 	ð 	ð �VÒÑØ,Ð-ˆEÝÐEÐE°´×0BÒ0BÑ0DÔ0DÐEÑEÔEÑEÔEˆIØð 2Ø—’˜]¨T¯YªY°yÑ-AÔ-AÑAÑBÔBÐBÐBà—’Ð0Ñ1Ô1Ð1Ý˜TÐ#6¸Ñ;Ô;ÐA¸rˆFØð 6Ø%Ÿ|š|™~œ~ð ð ‘G�A�tØ—x’x Ñ)Ô)ð 
Ø!%§¢¨.Ñ!9Ô!9Ð!E¸X˜ØŸšðI A¤Gð Ið I¸&ð Ið IØ=>¼WðIð Ið Iñô ð ð ð
 $(§8¢8¨J¸Ñ#:Ô#:˜ØŸšØO A¤GÐOÐOÀHÐOÐOÐOñô ð ð ðð —’Ð4Ñ5Ô5Ð5Ø—9’9˜UÑ#Ô#Ð#àÐ(Ð(Ð(Øð ;Ø:¨6Ð:Ð:Ð:Ð:Ø(Ð(¨Ñ0Ô0ˆHØÐØ4¨FÐ4Ð4Ð4Ý˜TÐ#6¸Ñ;Ô;ÐA¸rˆFØ˜Ò Ð Ø 6Ð)Ð)à#œ>ð Cð Cð Cðð ˜(Ô#×'Ò'¨Ñ1Ô1ð BØ&œnÐAÐAÐAÐAØ×+Ò+¨HÐ=YÐ+ÑZÔZÐZð:˜8œ>ð :ð :Ø5=´^ð:ð :ð :ðð ˜vÐ%Ð%à”~ð *ð *ð *ðð ˜(Ô#×'Ò'¨Ñ1Ô1ð à”~ð )ð )ð )ðð ×(Ò(¨Ñ2Ô2Ð2ØU˜(œ.ÐUÐUÐUÐUðGð	
ð 	
r*   c              ƒ  óh  K  — ddl m} |                      |¦  «        rGt                               d|j        r|j        j        r|j        j        j        nd|j        ¦  «         dS | j	        s| j
        rC|                      ¦   «         }|rt          d|¬¦  «        S t          t          d¦  «        ¦  «        S 	 |j        j        r|j        j        j        nd	|j        j        |j        j        d
œ}|j        j        du r;d|d<   |j        j        r|j        j        |d<   |j        j        r|j        j        |d<   |j        j        r|j        j        |d<   |j        r
|j        |d<   |j        �c	 t+          j        |j        |j        �t/          |j        ¦  «        n|j        j        ¬¦  «        | _        n# t2          $ r |j        | _        Y nw xY wt5          |dz  |d	¬¦  «         n2# t2          $ r%}t                               d|¦  «         Y d	}~nd	}~ww xY w	 |j        j        r|j        j        j        nd	t9          j        ¦   «         dœ}|j        �
|j        |d<   t5          |dz  |d	¬¦  «         n2# t2          $ r%}t                               d|¦  «         Y d	}~nd	}~ww xY w|                      ¦   «         }ddlm}m}	  |	¦   «         }
 |¦   «         }|
s|r|                       dd¬¦  «         n|                       dd¬¦  «         |rt          d|¬¦  «        S t          t          d¦  «        ¦  «        S )zFHandle /restart command - drain active work, then restart the gateway.r   ©Ú_hermes_homeuo   Ignoring redelivered /restart (platform=%s, update_id=%s) â€” already processed by a previous gateway instance.rÁ   r#   zgateway.drainingr9  zgateway.restart.in_progressN)rG   ré   rÐ   TÚdelivered_via_upstream_relayr\   Úscope_idrê   Ú
message_id)rG  z.restart_notify.json)Úindentz'Failed to write restart notify file: %s)rG   Úrequested_atÚ	update_idz.restart_last_processed.jsonz(Failed to write restart dedup marker: %s)Úis_container_restart_contextÚis_gateway_supervisor_processF)ÚdetachedÚvia_servicezgateway.restart.restarting)!r´   rD  Ú_is_stale_restart_redeliveryrw   r%  ri   rG   r   Úplatform_update_idÚ_restart_requestedÚ	_drainingÚ_running_agent_countr   r   ré   rÐ   rE  r\   rF  rê   rG  ÚdataclassesÚreplacer!   Ú_restart_command_sourcery   r   rŽ   r  Úgateway.restartrK  rL  Úrequest_restart)rF   rJ   rD  r:  Únotify_datarœ   Ú
dedup_dataÚactive_agentsrK  rL  Ú_under_serviceÚ_in_containers               r(   Ú_handle_restart_commandz1GatewaySlashCommandsMixin._handle_restart_commandô  s+  è è € à,Ð,Ð,Ð,Ð,Ð,ð ×,Ò,¨UÑ3Ô3ð 	Ý�KŠKðDà/4¬|Ð^ÀÄÔ@UÐ^�”Ô%Ô+Ð+Ð[^ØÔ(ñ	ô ð ð �2àÔ"ð 	D d¤nð 	DØ×-Ò-Ñ/Ô/ˆEØð :ÝÐ+°5Ð9Ñ9Ô9Ð9Ý!¥!Ð$AÑ"BÔ"BÑCÔCÐCð 	Gà;@¼<Ô;PÐZ˜EœLÔ1Ô7Ð7ÐVZØ œ<Ô/Ø"œ\Ô3ðð ˆKð
 Œ|Ô8¸DÐ@Ð@Ø>B�Ð:Ñ;Ø”<Ô'ð BØ-2¬\Ô-A�K 	Ñ*Ø”<Ô(ð DØ.3¬lÔ.C�K 
Ñ+ØŒ|Ô%ð BØ+0¬<Ô+A�˜KÑ(ØÔð =Ø,1Ô,<�˜LÑ)ØŒ|Ð'ð@Ý3>Ô3FØœà Ô+Ð7õ $' uÔ'7Ñ#8Ô#8Ð#8à"œ\Ô4ð	4ñ 4ô 4�DÔ0Ð0øõ !ð @ð @ð @Ø38´<�DÔ0Ð0Ð0ð@øøøåØÐ5Ñ5ØØðñ ô ð ð øõ
 ð 	Gð 	Gð 	GÝ�LŠLÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøð	Gøøøð	Hà;@¼<Ô;PÐZ˜EœLÔ1Ô7Ð7ÐVZÝ $¤	¡¤ðð ˆJð Ô'Ð3Ø*/Ô*B�
˜;Ñ'ÝØÐ=Ñ=ØØðñ ô ð ð øõ
 ð 	Hð 	Hð 	HÝ�LŠLÐCÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøð	Høøøð ×1Ò1Ñ3Ô3ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 7Ð6Ñ8Ô8ˆØ4Ð4Ñ6Ô6ˆØð 	C˜]ð 	CØ× Ò ¨%¸TÐ ÑBÔBÐBÐBà× Ò ¨$¸EÐ ÑBÔBÐBØð 	>ÝÐ'¨}Ð=Ñ=Ô=Ð=Ý�aÐ <Ñ=Ô=Ñ>Ô>Ð>sW   Â7B3G# Å+AF1 Æ0G# Æ1G
ÇG# Ç	G
Ç
G# Ç#
HÇ-HÈHÈAI0 É0
JÉ:JÊJc              ƒ  óL   K  — ddl m}m}  |d |d¬¦  «        ¦  «        j        S )u:   Handle /version â€” show the running Hermes Agent version.r   r£   Úversionr«   ©r®   )r³   r¤   r¥   rÿ   )rF   rJ   r¤   r¥   s       r(   Ú_handle_version_commandz1GatewaySlashCommandsMixin._handle_version_commandb  s@   è è € àIÐIÐIÐIÐIÐIÐIÐIàˆ˜y¨.¨.ÀÐ*KÑ*KÔ*KÑLÔLÔQÐQr*   c           
   ƒ  ó¬   K  — ddl m} ddlm}m}  |d |d¬¦  «        ¦  «        } ||j        t          t          |dd¦  «        d	d¦  «        ¦  «        S )
z/Handle /help command - list available commands.r   ©Ú_telegramize_command_mentionsr£   rÇ   r«   ra  ri   NrG   )r´   re  r³   r¤   r¥   rÿ   rD   )rF   rJ   re  r¤   r¥   r»   s         r(   Ú_handle_help_commandz.GatewaySlashCommandsMixin._handle_help_commandh  sƒ   è è € à=Ð=Ð=Ð=Ð=Ð=ØIÐIÐIÐIÐIÐIÐIÐIà� ¨¨¸yÐ(IÑ(IÔ(IÑJÔJˆØ,Ð,ØŒJÝ•G˜E 8¨TÑ2Ô2°JÀÑEÔEñ
ô 
ð 	
r*   c           
   ƒ  ó  K  — ddl m} ddlm}m} ddlm} |j        j        |j	        k    rdnd} |d |d| 
                    ¦   «         d	|i¬
¦  «        ¦  «        } ||j        t          t          |dd ¦  «        dd ¦  «        ¦  «        S )Nr   rd  r£   )r   é   é   Úcommandsr«   Ú	page_size)r®   Úargsr¯   ri   rG   )r´   re  r³   r¤   r¥   Úgateway.configr   ri   rG   ÚTELEGRAMr‡   rÿ   rD   )rF   rJ   re  r¤   r¥   r   rk  r»   s           r(   Ú_handle_commands_commandz2GatewaySlashCommandsMixin._handle_commands_commands  sØ   è è € Ø=Ð=Ð=Ð=Ð=Ð=ØIÐIÐIÐIÐIÐIÐIÐIØ+Ð+Ð+Ð+Ð+Ð+ð  œ,Ô/°8Ô3DÒDÐD�B�BÈ"ˆ	Ø�ØØˆNØ!Ø×+Ò+Ñ-Ô-Ø$ iÐ0ðñ ô ñ
ô 
ˆð -Ð,ØŒJÝ•G˜E 8¨TÑ2Ô2°JÀÑEÔEñ
ô 
ð 	
r*   r2   c              ƒ  ó4  ‡ ‡‡*‡+‡,‡-‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7‡8‡9‡:‡;‡<‡=‡>‡?‡@K  — ddl m}mŠ/ ddlmŠ4m}m}m}m} ddl	m
} ‰                     ¦   «                              ¦   «         }‰j        Š?d}	t          t          ‰ dd¦  «        dd¦  «        r t          ‰ d	¦  «        ‰?¦  «        }	 ||¦  «        }
|
j        }|
j        }|
j        }|
j        }|
j        }|
j        Š:|
j        rd
|
                     ¦   «         d         › �S  |||‰:|¬¦  «        Š;|r"	 ddlm}  |¦   «          n# t2          $ r Y nw xY wdŠ8d}dŠ7dŠ6dŠ@dŠ9g }|	p|dz  Š5	  ‰/¦   «         }|rú|                     di ¦  «        }t7          |t8          ¦  «        rB|                     dd¦  «        Š8|                     d|¦  «        }|                     dd¦  «        Š7|                     d¦  «        Š@	 ddlm}  ||¦  «        Š9n%# t2          $ r |                     d¦  «        Š9Y nw xY w|                     di ¦  «                             d¦  «        }t7          |t>          ¦  «        r|}n# t2          $ r Y nw xY wtA          j!        ‰ j"        ‰?¦  «        ƒ d{V —†Š?‰  #                    ‰?¦  «        Š>‰ j$                             ‰>i ¦  «        }‰:r‰  %                    ‰>¦  «        ndŠ<|rX|                     d‰8¦  «        Š8|                     d|¦  «        }|                     d‰7¦  «        Š7|                     d‰6¦  «        Š6|�s÷|�sô t          ‰ d¦  «        ‰?¦  «        }|duot          tM          |¦  «        dd¦  «        du}|r»	 tA          j!        ||‰7‰8‰@‰9dd|¬¦	  «	        ƒ d{V —†}n# t2          $ r g }Y nw xY w|r‚‰ Š2‰>Š3‰8Š,|Š-‰7Š+‰6Š*|	Š1dRˆ*ˆ+ˆ,ˆ-ˆ/ˆ2ˆ3ˆ4ˆ5ˆ6ˆ7ˆ9ˆˆ;ˆ@fd$„Š0dRˆ0ˆ1fd%„}‰  '                    ‰?‰  (                    ‰¦  «        ¦  «        }| )                    ‰?j*        |‰8|‰>||¬&¦  «        ƒ d{V —†Š=‰=j+        rdS  ||¦  «        }tY          d'‰8pd(|¬)¦  «        dg}	 tA          j!        ||‰7‰8‰@‰9d*|¬+¦  «        ƒ d{V —†}|D �]&}|d,         rtY          d-¦  «        nd} | -                    d.|d/         › d0|d1         › d2| › d3�¦  «         |d4         rŽd5 .                    d6„ |d4         D ¦   «         ¦  «        }!|d7         t_          |d4         ¦  «        k    r-tY          d8|d7         t_          |d4         ¦  «        z
  ¬9¦  «        nd}"| -                    d:|!› |"› �¦  «         n4|                     d;¦  «        r| -                    d<|d;         › d2�¦  «         | -                    d¦  «         �Œ(n# t2          $ r Y nw xY w| -                    tY          d=¦  «        ¦  «         | -                    tY          d>¦  «        ¦  «         | -                    tY          d?¦  «        ¦  «         d@ .                    |¦  «        S ta          ¦   «         }#|#r|#S tA          j!        ‰4||‰8‰7‰6‰;|‰@‰9¬A¦
  «
        ƒ d{V —†Š=‰=j+        stY          dB‰=j1        ¬C¦  «        S 	 ddDl2m3}$ tA          j!        |$‰=‰ ‰>‰?‰9‰/¬E¦  «        ƒ d{V —† n2# t2          $ r%}%th           5                    dF|%¦  «         Y d}%~%nd}%~%ww xY wdSˆ/ˆ5ˆ6ˆ7ˆ8ˆ9ˆ:ˆ;ˆ<ˆ=ˆ ˆ>ˆ?fdG„Š.d}&	 ddHl6m7}' tA          j!        |'‰=j8        ‰=j9        ‰=j:        p‰7pd‰=j;        p‰6pd‰=j<        ¬I¦  «        ƒ d{V —†}&n# t2          $ r d}&Y nw xY w|&�UdTˆ.ˆ8fdK„}(‰  =                    ‰j        j>        ¦  «        })‰  ?                    ‰ddLdM|&j@        › dN|)› dO|)› dP�|(¬Q¦  «        ƒ d{V —†S  ‰.¦   «         ƒ d{V —†S )Uu›  Handle /model command â€” switch model.

        Supports:
          /model                              â€” interactive picker (Telegram/Discord) or text list
          /model <name>                       â€” switch model (this session only)
          /model <name> --once                â€” switch for the next turn only
          /model <name> --session             â€” switch for this session only (explicit)
          /model <name> --global              â€” switch and persist to config.yaml
          /model <name> --provider <provider> â€” switch provider + model
          /model --provider <provider>        â€” switch to provider, auto-detect model
        r   )rD  r  )Úswitch_modelÚparse_model_switch_argsÚresolve_persist_behaviorÚlist_authenticated_providersÚlist_picker_providers)Ú	get_labelNr¦   r§   Frµ   õ   â�Œ )Úis_onceÚexplicit_provider)Úclear_provider_models_cacher#   Ú
openrouterúconfig.yamlr$  Údefaultr%  r&  Ú	providers)Úget_compatible_custom_providersÚcustom_providersÚmodel_catalogÚexcluded_providersÚapi_keyÚ_adapter_for_sourceÚsend_model_pickeré2   T)Úcurrent_providerÚcurrent_base_urlÚcurrent_modelÚuser_providersr€  Ú
max_modelsÚinclude_moar‚  Ú_chat_idr!   Úmodel_idÚprovider_slugr    c              “  óä  •K  — t          ¦   «         }|r|S t          j        ‰'|‰#‰"‰!‰ ‰-|‰.‰+¬¦
  «
        ƒ d{V —†}|j        st	          d|j        ¬¦  «        S 	 ddlm} t          j        ||‰%‰&‰,j        ‰+‰$¬¦  «        ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wd}t          ‰%d	d¦  «        }t          ‰%d
d¦  «        }	|r1|	�/|5  |	                     ‰&¦  «        }ddd¦  «         n# 1 swxY w Y   |r•|d         ��	 |d                              |j        |j        |j        |j        |j        ¬¦  «         nR# t          $ rE}t                               d|¦  «         t	          dd|j        › d|› d‰"› d�¬¦  «        cY d}~S d}~ww xY wt          ‰%dd¦  «        }
|
�	 ‰%j                             ‰,j        ¦  «        ƒ d{V —†}|
                     |j        |j        ¦  «        ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wddlm}  |‰"¦  «        } ||j        ¦  «        }t7          ‰%d¦  «        si ‰%_        d|› d|› d|j        p|j        › d�‰%j        ‰&<   |j        |j        |j        |j        |j        dœ‰%j        ‰&<   	 ‰%j                             ‰&‰%j        ‰&         ¦  «        ƒ d{V —† n,# t          $ r t                               dd¬¦  «         Y nw xY w‰%                      ‰&¦  «         ‰-�r>	 ddl!m"}  |‰(¦  «        }|                     d¦  «        }tG          |tH          ¦  «        r|}nLtG          |tJ          ¦  «        r0| &                    ¦   «         rd| &                    ¦   «         i}||d<   ni }||d<   	 dd l'm(}  ||                     d¦  «        p|                     d¦  «        |j        |                     d!¦  «        |j        |                     d"¦  «        |j        ¦  «        ƒ d{V —†r| )                    d#d¦  «         n&# t          $ r | )                    d#d¦  «         Y nw xY w|j        |d<   |j        |d"<   tK          |j        pd$¦  «         &                    ¦   «          *                    ¦   «         d%k    }|j        r|j        |d!<   n|r| )                    d!d¦  «         |r)|j        r|j        |d&<   n(| )                    d&d¦  «         ntW          |d¬'¦  «         dd(l!m,}  ||¦  «         n2# t          $ r%}t                               d)|¦  «         Y d}~nd}~ww xY w|j        p|j        }t	          d* ||j        ¦  «        ¬+¦  «        g}| -                    t	          d,|¬-¦  «        ¦  «         |j.        }dd.lm/} d}i }	  ‰$¦   «         }|                     di ¦  «        }tG          |tH          ¦  «        r&|                     d#¦  «        }|�ta          |¦  «        }n# t          $ r Y nw xY wtG          |tH          ¦  «        si } ||j        |j        |j        p‰*pd$|j        p‰)pd$|‰+||                     d¦  «        p|                     d¦  «        |                     d"¦  «        |                     d!¦  «        ¬/¦
  «
        ƒ d{V —†}|r&| -                    t	          d0|d1›¬2¦  «        ¦  «         |rh|j1        r+| -                    t	          d3|j1        d1›¬2¦  «        ¦  «         | -                    t	          d4| 2                    ¦   «         ¬5¦  «        ¦  «         |j3        r)| -                    t	          d6|j3        ¬7¦  «        ¦  «         ‰-r#| -                    t	          d8¦  «        ¦  «         n"| -                    t	          d9¦  «        ¦  «         d: 4                    |¦  «        S );z6Perform the model switch and return confirmation text.©	Ú	raw_inputr‡  r‰  rˆ  Úcurrent_api_keyÚ	is_globalry  rŠ  r€  Nr5   r6   r   ©Ú(enrich_model_switch_warnings_for_gateway©rT   ri   r€  Úload_gateway_configú/preflight-compression switch warning failed: %srP   ro   ©Ú	new_modelÚnew_providerrƒ  r&  Úapi_modez/Picker model switch failed for cached agent: %súModel switch to ú	 failed (ú); staying on ú.rˆ   ú(Failed to persist model switch to DB: %s©Úformat_model_for_displayÚ_pending_model_notesú$[Note: model was just switched from ú to ú via z/. Adjust your self-identification accordingly.]©r$  r%  rƒ  r&  r�  ú(Failed to persist session model overrideTrb   ©Úread_user_config_rawr$  r}  ©Úshould_clear_context_pin_asyncr&  r%  r)  r#   Úcustomr�  ©Úclear_base_url©Úsave_configú"Failed to persist model switch: %súgateway.model.switchedr-  úgateway.model.provider_label©r%  ©Ú$resolve_display_context_length_async©r&  rƒ  Ú
model_infor€  Úconfig_context_lengthÚconfigured_modelÚconfigured_providerÚconfigured_base_urlúgateway.model.context_labelr/  r6  úgateway.model.max_output_labelú gateway.model.capabilities_label©Úcapabilitiesúgateway.model.warning_prefix©rx   úgateway.model.saved_globalúgateway.model.session_only_hintr±   )5r<   rq   rƒ   Úsuccessr   Úerror_messageÚhermes_cli.context_switch_guardr–  ri   ry   rw   rŽ   rD   rE   rq  r›  Útarget_providerrƒ  r&  r�  rx   r?   r†   Úupdate_session_modelrS   Úhermes_cli.model_switchr¤  r  r¥  Úprovider_labelÚ_session_model_overridesÚset_model_overriderz   Úhermes_cli.configr¬  r%   r	  r!   r&   Úhermes_cli.route_identityr®  ÚpoprÑ   r   r³  rØ   r»  r¹  r+   Ú
max_outputÚformat_capabilitiesÚwarning_messager·   )/r�  rŽ  r�  Ú
skew_errorÚresultr–  r  Úcached_entryr‘   Ú_cacheÚ_sess_dbÚ_sess_entryr¤  Ú_display_curÚ_display_newr¬  Ú_persist_cfgÚ
_raw_modelÚ_persist_model_cfgr®  Ú_is_custom_targetr³  rœ   Úplabelr¼   Úmir¹  Ú_sw_config_ctxÚ_sw_model_cfgÚ_sw_cfgÚ_sw_rawre  Ú_cur_api_keyÚ_cur_base_urlÚ
_cur_modelÚ_cur_providerr  Ú_selfÚ_session_keyÚ_switch_modelÚconfig_pathr“  rˆ  Úcustom_provsrJ   Úpersist_globalÚ
user_provss/                                   €€€€€€€€€€€€€€€r(   Ú_on_model_selected_scopedzRGatewaySlashCommandsMixin._handle_model_command.<locals>._on_model_selected_scoped  s†  øè è € õ &>Ñ%?Ô%?˜
Ø%ð .Ø#-Ð-õ
 (/Ô'8Ø)Ø&.Ø-:Ø*4Ø-:Ø,8Ø&4Ø.;Ø+5Ø-9ð(ñ (ô (ð "ð "ð "ð "ð "ð "˜ð  &œ~ð _Ý#$Ð%AÈÔI]Ð#^Ñ#^Ô#^Ð^ðaðð ð ð ð ð õ #*Ô"3Ø HØ &Ø %Ø,8Ø',¤|Ø1=Ø4Hð#ñ #ô #ð ð ð ð ð ð ð ð øõ  )ð að að aÝ"ŸLšLÐ)ZÐ\_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`øøøøðaøøøð (,˜Ý&-¨eÐ5HÈ$Ñ&OÔ&O˜Ý!(¨°ÀÑ!EÔ!E˜Ø&ð H¨6Ð+=Ø!,ð Hð HØ/5¯zªz¸,Ñ/GÔ/G ðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hà'ð "¨L¸¬OÐ,Gð"Ø ,¨Q¤× <Ò <Ø.4Ô.>Ø17Ô1GØ,2¬NØ-3¬_Ø-3¬_ð !=ñ !"ô !"ð !"ð !"øõ $-ð "ð "ð "õ !'§¢Ø$UÐWZñ!"ô !"ð !"õ ()Ø$@ð)D¸6Ô;Kð )Dð )DÐVYð )Dð )DØ6@ð)Dð )Dð )Dð("ñ ("ô ("ð !"ð !"ð !"ð !"ð !"ð !"øøøøð"øøøõ. $+¨5°-ÀÑ#FÔ#F˜Ø#Ð/ð
"Ø49Ô4M×4cÒ4cØ$)¤Lñ5"ô 5"ð /"ð /"ð /"ð /"ð /"ð /" ð '/×&CÒ&CØ$/Ô$:¸FÔ<Lñ'"ô '"ð !"ð !"ð !"ð !"ð !"ð !"ð !"ð !"øõ $-ð "ð "ð "Ý &§¢Ø$NÐPSñ!"ô !"ð !"ð !"ð !"ð !"ð !"ð !"øøøøð"øøøð UÐTÐTÐTÐTÐTØ'?Ð'?À
Ñ'KÔ'K˜Ø'?Ð'?ÀÔ@PÑ'QÔ'Q˜Ý& uÐ.DÑEÔEð <Ø9;˜EÔ6ðMÀ<ð Mð MÐUað Mð MØ#)Ô#8Ð#R¸FÔ<RðMð Mð Mð Ô2°<Ñ@ð &,Ô%5Ø(.Ô(>Ø'-¤~Ø(.¬Ø(.¬ðHð H˜Ô6°|ÑDð	Ø"'Ô";×"NÒ"NØ ,Ø %Ô >¸|Ô Lñ#ô #ð ð ð ð ð ð ð ð øõ  )ð ð ð Ý"ŸLšLØ JØ)-ð )ñ ô ð ð ð ðøøøð ×1Ò1°,Ñ?Ô?Ð?ð
 *ñ 6Xð5Xð !SÐ RÐ RÐ RÐ RÐ RØ/CÐ/CÀKÑ/PÔ/P Ø-9×-=Ò-=¸gÑ-FÔ-F 
Ý#-¨j½$Ñ#?Ô#?ð !OØ9CÐ$6Ð$6Ý%/°
½CÑ%@Ô%@ð !OÀZ×EUÒEUÑEWÔEWð !OØ:CÀZ×EUÒEUÑEWÔEWÐ9XÐ$6Ø<N L°Ñ$9Ð$9à9;Ð$6Ø<N L°Ñ$9ð!SØ$hÐ$hÐ$hÐ$hÐ$hÐ$hà-KÐ-KØ(:×(>Ò(>¸yÑ(IÔ(Ið )KØ+=×+AÒ+AÀ'Ñ+JÔ+JØ(.Ô(8Ø(:×(>Ò(>¸zÑ(JÔ(JØ(.¬Ø(:×(>Ò(>¸zÑ(JÔ(JØ(.Ô(>ñ.&ô .&ð (&ð (&ð (&ð (&ð (&ð (&ð 	%Wð );×(>Ò(>Ð?OÐQUÑ(VÔ(VÐ(VøøÝ'0ð !Sð !Sð !SØ$6×$:Ò$:Ð;KÈTÑ$RÔ$RÐ$RÐ$RÐ$Rð!Søøøà@FÔ@PÐ 2°9Ñ =ØAGÔAWÐ 2°:Ñ >õ 58¸Ô8NÐ8TÐRTÑ4UÔ4U×4[Ò4[Ñ4]Ô4]×4cÒ4cÑ4eÔ4eÐiqÒ4qÐ 1Ø#)¤?ð !MØEKÄ_Ð$6°zÑ$BÐ$BØ%6ð !MØ$6×$:Ò$:¸:ÀtÑ$LÔ$LÐ$LØ#4ð !nØ'-¤ð %QØIOÌÐ(:¸:Ñ(FÐ(Fà(:×(>Ò(>¸zÈ4Ñ(PÔ(PÐ(PÐ(På$DÐEWÐhlÐ$mÑ$mÔ$mÐ$mØ IÐ IÐ IÐ IÐ IÐ IØ + ¨LÑ 9Ô 9Ð 9Ð 9øÝ#,ð Xð Xð XÝ &§¢Ð/SÐUVÑ WÔ WÐ WÐ WÐ WÐ WÐ WÐ WøøøøðXøøøð "(Ô!6Ð!P¸&Ô:P˜Ý!"Ð#;ÐC[ÐC[Ð\bÔ\lÑCmÔCmÐ!nÑ!nÔ!nÐ o˜ØŸš¥QÐ'EÐPVÐ%WÑ%WÔ%WÑXÔXÐXØ#Ô.˜Ø`Ð`Ð`Ð`Ð`Ð`Ø)-˜Ø(*˜ð!Ø&:Ð&:Ñ&<Ô&<˜GØ,3¯KªK¸ÀÑ,DÔ,D˜MÝ)¨-½Ñ>Ô>ð BØ*7×*;Ò*;Ð<LÑ*MÔ*M Ø#*Ð#6Ý58¸±\´\ NøøÝ(ð !ð !ð !Ø ˜Dð!øøøå)¨-½Ñ>Ô>ð /Ø,.˜MØ$HÐ$HØ"Ô,Ø"Ô2Ø%+¤_Ð%NÐ8HÐ%NÈBØ$*¤NÐ$K°oÐ$KÈØ')Ø-9Ø2@à -× 1Ò 1°)Ñ <Ô <ð !>Ø#0×#4Ò#4°WÑ#=Ô#=à0=×0AÒ0AÀ*Ñ0MÔ0MØ0=×0AÒ0AÀ*Ñ0MÔ0Mð%ñ %ô %ð ð ð ð ð ð ˜ð ð ^Ø!ŸLšL­Ð+HÐTWÐQ[ÐQ[Ð)\Ñ)\Ô)\Ñ]Ô]Ð]Øð wØ!œ}ð oØ %§¢­QÐ/OÐ[]Ô[hÐXlÐXlÐ-mÑ-mÔ-mÑ nÔ nÐ nØ!ŸLšL­Ð+MÐ\^×\rÒ\rÑ\tÔ\tÐ)uÑ)uÔ)uÑvÔvÐvØ!Ô1ð lØ!ŸLšL­Ð+IÐSYÔSiÐ)jÑ)jÔ)jÑkÔkÐkØ)ð OØ!ŸLšL­Ð+GÑ)HÔ)HÑIÔIÐIÐIà!ŸLšL­Ð+LÑ)MÔ)MÑNÔNÐNØ#Ÿyšy¨Ñ/Ô/Ð/sÅ   Á,B Â
B4ÂB/Â/B4Ã!DÄDÄ
DÄ9E Å
F"Å:FÆF"ÆF"Æ9AH È
H4ÈH/È/H4Ê9,K& Ë&&LÌLÌ+B
T6 Î6BQ ÑT6 Ñ Q)Ñ&T6 Ñ(Q)Ñ)CT6 Ô6
U%Õ U Õ U%×AX( Ø(
X5Ø4X5c              “  ó®   •K  — ‰€ ‰| ||¦  «        ƒ d {V —†S ddl m}  |‰¦  «        5   ‰| ||¦  «        ƒ d {V —†cd d d ¦  «         S # 1 swxY w Y   d S )Nr   r©   )r´   rª   )r�  rŽ  r�  rª   rõ  Ú_picker_profile_homes       €€r(   Ú_on_model_selectedzKGatewaySlashCommandsMixin._handle_model_command.<locals>._on_model_selected  s	  øè è € ð 0Ð7Ø)BÐ)BØ (¨(°Mñ*ô *ð $ð $ð $ð $ð $ð $ð ð GÐFÐFÐFÐFÐFà3Ð3Ð4HÑIÔIð ð Ø)BÐ)BØ (¨(°Mñ*ô *ð $ð $ð $ð $ð $ð $ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ªA
Á
AÁA)ré   r~  r‰  r‡  rT   Úon_model_selectedÚmetadatazgateway.model.current_labelÚunknownr,  é   )r‡  rˆ  r‰  rŠ  r€  r‹  r‚  Ú
is_currentzgateway.model.current_tagz**r.  z** `--provider Úslugré  ú:ÚmodelsrÉ   c              3  ó"   K  — | ]
}d |› d �V — ŒdS ©ré  NrË   r˜  s     r(   rÎ   zBGatewaySlashCommandsMixin._handle_model_command.<locals>.<genexpr>=  s*   è è € Ð.MÐ.M¸A¨x°1¨x¨x¨xÐ.MÐ.MÐ.MÐ.MÐ.MÐ.Mr*   Útotal_modelsz gateway.model.more_models_suffixr9  z  Úapi_urlz  `z gateway.model.usage_switch_modelz#gateway.model.usage_switch_providerzgateway.model.usage_persistr±   r‘  r5   r6   r•  r—  r™  c               “  óH  •K  — d} t          ‰#dd¦  «        }t          ‰#dd¦  «        }|r1|�/|5  |                     ‰$¦  «        } ddd¦  «         n# 1 swxY w Y   | r•| d         ��	 | d                              ‰"j        ‰"j        ‰"j        ‰"j        ‰"j        ¬¦  «         nR# t          $ rE}t           
                    d|¦  «         t          dd‰"j        › d	|› d
‰› d�¬¦  «        cY d}~S d}~ww xY wt          ‰#dd¦  «        }|�’	 ‰#j                             ‰%¦  «        ƒ d{V —†}t          |dd¦  «        rd|_        |                     |j        ‰"j        ¦  «        ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wddlm} t)          ‰#d¦  «        si ‰#_        d |‰¦  «        › d |‰"j        ¦  «        › d‰"j        p‰"j        › d‰rdnd› d�	‰#j        ‰$<   ‰"j        ‰"j        ‰"j        ‰"j        ‰"j        dœ‰#j        ‰$<   ‰r't)          ‰#d¦  «        si ‰#_        ‰!pdddœ‰#j        ‰$<   n+t)          ‰#d¦  «        r‰#j                             ‰$d¦  «         ‰sZ	 ‰#j                             ‰$‰#j        ‰$         ¦  «        ƒ d{V —† n,# t          $ r t                               dd¬¦  «         Y nw xY w‰#                     ‰$¦  «         ‰ �r>	 dd lm}  |‰¦  «        }|                     d!¦  «        }	t=          |	t>          ¦  «        r|	}
nLt=          |	t@          ¦  «        r0|	 !                    ¦   «         rd"|	 !                    ¦   «         i}
|
|d!<   ni }
|
|d!<   	 dd#l"m#}  ||
                     d"¦  «        p|
                     d!¦  «        ‰"j        |
                     d$¦  «        ‰"j        |
                     d%¦  «        ‰"j        ¦  «        ƒ d{V —†r|
                     d&d¦  «         n&# t          $ r |
                     d&d¦  «         Y nw xY w‰"j        |
d"<   ‰"j        |
d%<   tA          ‰"j        pd¦  «         !                    ¦   «          $                    ¦   «         d'k    }‰"j        r‰"j        |
d$<   n|r|
                     d$d¦  «         |r)‰"j        r‰"j        |
d(<   n(|
                     d(d¦  «         ntK          |
d¬)¦  «         dd*lm&}  ||¦  «         n2# t          $ r%}t           
                    d+|¦  «         Y d}~nd}~ww xY w‰"j        p‰"j        }t          d, |‰"j        ¦  «        ¬-¦  «        g}| '                    t          d.|¬/¦  «        ¦  «         ‰"j(        }dd0lm)} d}i }	  ‰¦   «         }|                     d!i ¦  «        }t=          |t>          ¦  «        r&|                     d&¦  «        }|�tU          |¦  «        }n# t          $ r Y nw xY wt=          |t>          ¦  «        si } |‰"j        ‰"j        ‰"j        p‰pd‰"j        p‰pd|‰||                     d"¦  «        p|                     d!¦  «        |                     d%¦  «        |                     d$¦  «        ¬1¦
  «
        ƒ d{V —†}|r&| '                    t          d2|d3›¬4¦  «        ¦  «         |rh|j+        r+| '                    t          d5|j+        d3›¬4¦  «        ¦  «         | '                    t          d6| ,                    ¦   «         ¬7¦  «        ¦  «         t[          ‰"j        pdd8¦  «        rd9‰"j         $                    ¦   «         v p
‰"j        d:k    }|r"| '                    t          d;¦  «        ¦  «         ‰"j.        r)| '                    t          d<‰"j.        ¬=¦  «        ¦  «         ‰ r#| '                    t          d>¦  «        ¦  «         n:‰r| '                    d?¦  «         n"| '                    t          d@¦  «        ¦  «         dA /                    |¦  «        S )BzGApply the resolved switch (agent, session, config) and build the reply.NrP   ro   r   rš  z1In-place model switch failed for cached agent: %sr5   rž  rŸ  r   r¡  r6   rˆ   Úwas_auto_resetFr¢  r£  r¥  r¦  r§  r¨  z. z-This override applies to the next turn only. r#   z-Adjust your self-identification accordingly.]r©  Ú _pending_one_turn_model_restores)Úhad_overrideÚoverriderª  Trb   r«  r$  r}  r­  r&  r%  r)  r¯  r�  r°  r²  r´  rµ  r-  r¶  r·  r¸  rº  rÀ  r/  r6  rÁ  rÂ  rÃ  zopenrouter.aiÚclaudeÚanthropic_messagesz$gateway.model.prompt_caching_enabledrÅ  rÆ  rÇ  u4       (next turn only â€” restores after one response)rÈ  r±   )0rD   rE   rq  r›  rÌ  rƒ  r&  r�  ry   rw   rx   r   r?   r†   r  rÍ  rS   rŽ   rÎ  r¤  r  r¥  rÏ  rÐ  r  rÔ  rÑ  rz   rÒ  r¬  r%   r	  r!   r&   rÓ  r®  rÑ   r   r³  rØ   r»  r¹  r+   rÕ  rÖ  r   r×  r·   )&rÚ  r‘   rÛ  r  rÜ  rÝ  r¤  r¬  ÚcfgÚ	raw_modelrg  r®  rã  r³  rœ   rÏ  r¼   rå  r¹  Ú_sw2_config_ctxÚ_sw2_model_cfgÚ_sw2_cfgÚ_sw2_rawre  Úcache_enabledr  rñ  r“  rˆ  r‰  rò  Úone_turnró  Úrestore_snapshotrÙ  rF   rT   ri   s&                            €€€€€€€€€€€€€r(   Ú_finish_switchzGGatewaySlashCommandsMixin._handle_model_command.<locals>._finish_switchw  s
  øè è € ð  ˆLÝ! $Ð(;¸TÑBÔBˆKÝ˜T >°4Ñ8Ô8ˆFØð ;˜vÐ1Ø ð ;ð ;Ø#)§:¢:¨kÑ#:Ô#:�Lð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð ð  ¨Q¤Ð ;ðØ  ”O×0Ò0Ø"(Ô"2Ø%+Ô%;Ø &¤Ø!'¤Ø!'¤ð 1ñ ô ð ð øõ !ð ð ð õ —N’NÐ#VÐX[Ñ\Ô\Ð\ÝØ4ð;¨vÔ/?ð ;ð ;È#ð ;ð ;Ø*7ð;ð ;ð ;ðñ ô ð ð ð ð ð ð øøøøðøøøõ$ ˜t ]°DÑ9Ô9ˆHØÐ#ðØ(,Ô(@×(VÒ(VÐW]Ñ(^Ô(^Ð"^Ð"^Ð"^Ð"^Ð"^Ð"^�Kõ ˜{Ð,<¸eÑDÔDð ;Ø5:˜Ô2Ø"×7Ò7Ø#Ô.°Ô0@ñô ð ð ð ð ð ð ð ð øõ !ð ð ð Ý—L’LØBÀCñô ð ð ð ð ð ð øøøøðøøøð IÐHÐHÐHÐHÐHÝ˜4Ð!7Ñ8Ô8ð /Ø,.�Ô)ðAÐ7OÐ7OÐP]Ñ7^Ô7^ð Að AÐd|Ðd|ð  ~Dô  ~Nñ  eOô  eOð Að AØÔ,ÐF°Ô0FðAð AàFNÐVÐBÐBÐTVðAð Að Að Ô% kÑ2ð  Ô)Ø"Ô2Ø!œ>Ø"œOØ"œOð:ð :ˆDÔ)¨+Ñ6ð ð MÝ˜tÐ%GÑHÔHð ?Ø<>�DÔ9à$ÐQ¸ÈDÐ(QÐ(Qð Ô5°kÑBÐBõ ˜ÐAÑBÔBð MØÔ5×9Ò9¸+ÀtÑLÔLÐLð ð 	ðØÔ2×EÒEØ#ØÔ5°kÔBñô ð ð ð ð ð ð ð ð øõ !ð ð ð Ý—L’LØBÈTð !ñ ô ð ð ð ðøøøð ×$Ò$ [Ñ1Ô1Ð1ð ñ 6Lð5Lð GÐFÐFÐFÐFÐFØ.Ð.¨{Ñ;Ô;�Cð !$§¢¨Ñ 0Ô 0�IÝ! )­TÑ2Ô2ð 1Ø$-˜	˜	Ý# I­sÑ3Ô3ð 1¸	¿ºÑ8IÔ8Ið 1Ø%.°	·²Ñ0AÔ0AÐ$B˜	Ø'0˜˜G™˜à$&˜	Ø'0˜˜G™ð>Ø\Ð\Ð\Ð\Ð\Ð\à!?Ð!?Ø%ŸMšM¨)Ñ4Ô4ÐN¸	¿ºÀgÑ8NÔ8NØ"Ô,Ø%ŸMšM¨*Ñ5Ô5Ø"œOØ%ŸMšM¨*Ñ5Ô5Ø"Ô2ñ"ô "ð ð ð ð ð ð ð Bð &ŸMšMÐ*:¸DÑAÔAÐAøøÝ$ð >ð >ð >Ø!ŸšÐ&6¸Ñ=Ô=Ð=Ð=Ð=ð>øøøà+1Ô+;�I˜iÑ(Ø,2Ô,B�I˜jÑ)õ ),¨FÔ,BÐ,HÀbÑ(IÔ(I×(OÒ(OÑ(QÔ(Q×(WÒ(WÑ(YÔ(YÐ]eÒ(eÐ%Ø”ð 8Ø06´˜	 *Ñ-Ð-Ø*ð 8Ø!Ÿš j°$Ñ7Ô7Ð7Ø(ð YØ!œ?ð <Ø4:´O˜I jÑ1Ð1à%ŸMšM¨*°dÑ;Ô;Ð;Ð;å8¸ÐSWÐXÑXÔXÐXØ=Ð=Ð=Ð=Ð=Ð=Ø�K Ñ$Ô$Ð$Ð$øÝ ð Lð Lð LÝ—N’NÐ#GÈÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøð $Ô2ÐL°fÔ6LˆNÝÐ/Ð7OÐ7OÐPVÔP`Ñ7aÔ7aÐbÑbÔbÐcˆEØ�LŠL�Ð9ÀNÐSÑSÔSÑTÔTÐTð Ô"ˆBØTÐTÐTÐTÐTÐTØ"ˆOØˆNðØ/Ð/Ñ1Ô1�Ø!)§¢¨g°rÑ!:Ô!:�Ý˜n­dÑ3Ô3ð 8Ø-×1Ò1Ð2BÑCÔC�HØÐ+Ý*-¨h©-¬-˜øøÝð ð ð Ø�ðøøøå˜n­dÑ3Ô3ð $Ø!#�Ø<Ð<ØÔ ØÔ&ØœÐBÐ,<ÐBÀØœÐ?¨/Ð?¸RØØ!-Ø&5à"×&Ò& yÑ1Ô1ð 3Ø%×)Ò)¨'Ñ2Ô2à$2×$6Ò$6°zÑ$BÔ$BØ$2×$6Ò$6°zÑ$BÔ$Bðñ ô ð ð ð ð ð ð ˆCð ð RØ—’�QÐ<ÈÀZÀZÐPÑPÔPÑQÔQÐQØð kØ”=ð cØ—L’L¥Ð#CÈrÌ}ÐL`ÐL`Ð!aÑ!aÔ!aÑbÔbÐbØ—’�QÐAÐPR×PfÒPfÑPhÔPhÐiÑiÔiÑjÔjÐjõ ' v¤Ð'<¸"¸oÑNÔNÐwÐS[Ð_eÔ_o×_uÒ_uÑ_wÔ_wÐSwð ;Ø”?Ð&:Ò:ð ð ð HØ—’�QÐEÑFÔFÑGÔGÐGàÔ%ð `Ø—’�QÐ=ÀvÔG]Ð^Ñ^Ô^Ñ_Ô_Ð_àð CØ—’�QÐ;Ñ<Ô<Ñ=Ô=Ð=Ð=Øð CØ—’ÐSÑTÔTÐTÐTà—’�QÐ@ÑAÔAÑBÔBÐBà—9’9˜UÑ#Ô#Ð#s¬   ®AÁAÁAÁ&9B  Â 
C/Â*:C*Ã$C/Ã*C/ÄAE% Å%
FÅ/FÆFÉ2,J Ê&KËKË$B
S/ Í/BO? Ï>S/ Ï? P"ÐS/ Ð!P"Ð"CS/ Ó/
TÓ9TÔTÖAW! ×!
W.×-W.)Úexpensive_model_warning)r%  r&  rƒ  r»  Úchoicec              “  óD   •K  — | dk    rd‰pd› d�S  ‰¦   «         ƒ d {V —†S )NÚcancelu6   ðŸŸ¡ Model switch cancelled. Current model unchanged (rû  z).rË   )r  r  r‰  s    €€r(   Ú_on_cost_confirmzIGatewaySlashCommandsMixin._handle_model_command.<locals>._on_cost_confirmu	  sU   øè è € Ø˜XÒ%Ð%ð;Ø)Ð6¨Yð;ð ;ð ;ðð ,˜^Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r*   zExpensive Model Warningu$   âš ï¸� **Expensive Model Warning**

z

_Text fallback: reply `zapprove` to switch or `z#cancel` to keep the current model._©rJ   rë  ra   ÚmessageÚhandler)r�  r!   rŽ  r!   r�  r!   r    r!   ©r    r!   )r  r!   r    r!   )Ar´   rD  r  rÎ  rq  rr  rs  rt  ru  Úhermes_cli.providersrv  r‡   r&   ri   rD   r>  ry  r”  Úforce_refreshÚ
is_sessionrx  ÚerrorsÚerror_messagesÚhermes_cli.modelsrz  ry   rE   r%   r	  rÒ  r  r-  rq   rƒ   Ú!_normalize_source_for_session_keyrj   rÐ  Ú _snapshot_session_model_overrider¯  r  r  r…  ré   rÉ  r   rØ   r·   r  r<   rÊ  rË  r–  rw   rŽ   Úhermes_cli.model_cost_guardr  r›  rÌ  r&  rƒ  r»  rI   rG   Ú_request_slash_confirmr  )ArF   rJ   rD  rr  rs  rt  ru  rv  Úraw_argsÚ_command_profile_homeÚrequestÚmodel_inputry  Úis_global_flagr   r!  rz  r‡  Úexcluded_provsr  rg  r  Ú_exclr	  rH   Ú
has_pickerr~  rø  rú  rÏ  r¼   r  ÚtagÚ
model_strsÚextrarØ  r–  r  Ú_cost_warningr  r  Ú_prê  rë  rì  rí  r  r  rõ  r÷  rî  rï  rð  rñ  r“  rˆ  r‰  rò  r  ró  r  rÙ  rT   ri   rô  sA   ``                                        @@@@@@@@@@@@@@@@@@@@@@@r(   Ú_handle_model_commandz/GatewaySlashCommandsMixin._handle_model_command‡  sN  øøøøøøøøøøøøøøøøøøøøøøøøøè è € ð 	CÐBÐBÐBÐBÐBÐBÐBð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	3Ð2Ð2Ð2Ð2Ð2à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ”ˆØ $ÐÝ•7˜4 ¨4Ñ0Ô0Ð2FÈÑNÔNð 	ð%¥GØÐ8ñ%ô %àñ%ô %Ð!ð *Ð)¨(Ñ3Ô3ˆØ”nˆØ#Ô5ÐØ Ô*ˆØÔ-ˆØÔ'ˆ
Ø”?ˆØŒ>ð 	8à7˜'×0Ò0Ñ2Ô2°1Ô5Ð7Ð7Ð7Ø1Ð1ØØØØ/ð	
ñ 
ô 
ˆð ð 	ðØIÐIÐIÐIÐIÐIØ+Ð+Ñ-Ô-Ð-Ð-øÝð ð ð Ø�ðøøøð ˆØ'ÐØÐØˆØˆ
ØˆØˆØ,Ð<°ÀÑMˆð	Ø&Ð&Ñ(Ô(ˆCØð +ØŸGšG G¨RÑ0Ô0�	Ý˜i­Ñ.Ô.ð EØ$-§M¢M°)¸RÑ$@Ô$@�MØ'0§}¢}°ZÐAQÑ'RÔ'RÐ$Ø'0§}¢}°ZÀÑ'DÔ'DÐ$Ø ŸWšW [Ñ1Ô1�
ð?ØQÐQÐQÐQÐQÐQØ#BÐ#BÀ3Ñ#GÔ#G�L�LøÝ ð ?ð ?ð ?Ø#&§7¢7Ð+=Ñ#>Ô#>�L�L�Lð?øøøàŸš °Ñ4Ô4×8Ò8Ð9MÑNÔN�Ý˜e¥TÑ*Ô*ð +Ø%*�NøøÝð 	ð 	ð 	ØˆDð	øøøõ Ô(¨Ô)OÐQWÑXÔXÐXÐXÐXÐXÐXÐXˆØ×2Ò2°6Ñ:Ô:ˆØÔ0×4Ò4°[À"ÑEÔEˆàBJÐTˆD×1Ò1°+Ñ>Ô>Ð>ÐPTð 	ð ð 	GØ$ŸLšL¨°-Ñ@Ô@ˆMØ'Ÿ|š|¨JÐ8HÑIÔIÐØ'Ÿ|š|¨JÐ8HÑIÔIÐØ&Ÿlšl¨9°oÑFÔFˆOð ñ [	$Ð#4ñ [	$à:•g˜dÐ$9Ñ:Ô:¸6ÑBÔBˆGà˜tÐ#ð RÝ�D ™MœMÐ+>ÀÑEÔEÈTÐQð ð
 ð p$ð#õ '.Ô&7Ø-Ø)9Ø)9Ø&3Ø'1Ø)5Ø#%Ø$(Ø+9ð
'ñ 
'ô 
'ð 
!ð 
!ð 
!ð 
!ð 
!ð 
!�I�Iøõ !ð #ð #ð #Ø "�I�I�Ið#øøøð ð ]$ð !�EØ#.�LØ!.�JØ$4�MØ$4�MØ#2�LØ+@Ð(ðw0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ð w0ðrð ð ð ð ð ð ð  $×?Ò?ÀÈ×HdÒHdÐejÑHkÔHkÑlÔl�HØ#*×#<Ò#<Ø &¤Ø"+Ø&3Ø)9Ø$/Ø*<Ø!)ð $=ñ $ô $ð ð ð ð ð ð �Fð ”~ð $Ø#˜tð '˜YÐ'7Ñ8Ô8ˆNÝÐ4¸MÐ<VÈYÐaoÐpÑpÔpÐrtÐuˆEðõ #*Ô"3Ø0Ø%5Ø%5Ø"/Ø#-Ø%1Ø Ø'5ð	#ñ 	#ô 	#ð 	ð 	ð 	ð 	ð 	ð 	�	ð #ð 	%ñ 	%�AØ<=¸l¼OÐS�!Ð7Ñ8Ô8Ð8ÐQS�CØ—L’LÐ!R a¨¤iÐ!RÐ!RÀÀ&Ä	Ð!RÐ!RÈCÐ!RÐ!RÐ!RÑSÔSÐSØ˜”{ð <Ø%)§Y¢YÐ.MÐ.MÀÀ8ÄÐ.MÑ.MÔ.MÑ%MÔ%M˜
Øuvð  xFô  vGõ  JMð  NOð  PXô  NYñ  JZô  JZò  vZð  vZ¥Ð"DÈAÈnÔL]Õ`cÐdeÐfnÔdoÑ`pÔ`pÑLpÐ qÑ qÔ qÐ qð  `b˜ØŸšÐ%=¨*Ð%=°eÐ%=Ð%=Ñ>Ô>Ð>Ð>ØŸš˜yÑ)Ô)ð <ØŸšÐ%:¨1¨Y¬<Ð%:Ð%:Ð%:Ñ;Ô;Ð;Ø—L’L Ñ$Ô$Ð$Ñ$ð	%øõ ð ð ð Ø�ðøøøð �LŠL�Ð=Ñ>Ô>Ñ?Ô?Ð?Ø�LŠL�Ð@ÑAÔAÑBÔBÐBØ�LŠL�Ð8Ñ9Ô9Ñ:Ô:Ð:Ø—9’9˜UÑ#Ô#Ð#õ .Ñ/Ô/ˆ
Øð 	ØÐõ
 Ô(ØØ!Ø-Ø'Ø-Ø+Ø$Ø/Ø%Ø)ð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð Œ~ð 	OÝÐ1¸Ô9MÐNÑNÔNÐNð	Qðð ð ð ð ð õ Ô#Ø8ØØØ'ØØ!-Ø$8ðñ ô ð ð ð ð ð ð ð ð øõ ð 	Qð 	Qð 	QÝ�LŠLÐJÈCÑPÔPÐPÐPÐPÐPÐPÐPøøøøð	Qøøøðg	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð g	$ð^ ˆð	!ØKÐKÐKÐKÐKÐKå")Ô"3Ø'ØÔ ØÔ/ØœÐBÐ,<ÐBÀØœÐ?¨/Ð?¸RØ!Ô,ð#ñ #ô #ð ð ð ð ð ð ˆMˆMøõ ð 	!ð 	!ð 	!Ø ˆMˆMˆMð	!øøøàÐ$ð	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð ×/Ò/°´Ô0EÑFÔFˆBØ×4Ò4ØØØ/ð*¸]Ô=Rð *ð *Ø.0ð*ð *ØIKð*ð *ð *ð )ð 5ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð $�^Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%sš   ÄD Ä
D)Ä(D)ÅBI	 ÇG# Ç"I	 Ç#HÈI	 ÈHÈAI	 É	
IÉIÍ"#N ÎNÎNÐ>EV Ö
VÖVÙ*'Z Ú
[ÚZ<Ú<[ÛA\! Ü!\0Ü/\0c              ƒ  ój  K  — ddl m} |r&|                     ¦   «                              ¦   «         nd}|                     |¦  «        \  }}|rdd                     |¦  «        z   S 	 ddlm}m} n# t          $ r}d|› �cY d}~S d}~ww xY w |¦   «         }	| 
                    |	||�|nd¬	¦  «        }
|
j        rf|�d|
j        r]	 |                      |j        ¦  «        }|                      |¦  «         n,# t          $ r t                                d
d¬¦  «         Y nw xY w|
j        rdnd}|› d|
j        › �S )u9  Handle /codex-runtime command in the gateway.

        Same surface as the CLI handler in cli.py:
            /codex-runtime                  â€” show current state
            /codex-runtime auto             â€” Hermes default runtime
            /codex-runtime codex_app_server â€” codex subprocess runtime
            /codex-runtime on / off         â€” synonyms

        On change, the cached agent for this session is evicted so the next
        message creates a fresh AIAgent with the new api_mode wired in
        (avoids prompt-cache invalidation mid-session).r   )Úcodex_runtime_switchr#   rw  u   
â�Œ )Úload_configr³  u   â�Œ Could not load config: N)Úpersist_callbackz7could not evict cached agent after codex-runtime changeTrb   u   âœ“u   âœ—rê  )rò   r8  r‡   r&   Ú
parse_argsr·   rÒ  r9  r³  ry   ÚapplyrÉ  Úrequires_new_sessionrj   ri   rz   rw   rŽ   r  )rF   rJ   Úcrsr)  Ú	new_valuer"  r9  r³  r  r  rÙ  rT   Úprefixs                r(   Ú_handle_codex_runtime_commandz7GatewaySlashCommandsMixin._handle_codex_runtime_command�	  s¿  è è € ð 	;Ð:Ð:Ð:Ð:Ð:à7<ÐD�5×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3Ð3À"ˆØŸNšN¨8Ñ4Ô4Ñˆ	�6Øð 	2Ø˜HŸMšM¨&Ñ1Ô1Ñ1Ð1ð	7ØBÐBÐBÐBÐBÐBÐBÐBÐBøÝð 	7ð 	7ð 	7Ø6°Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð	7øøøàˆk‰mŒmˆà—’ØØØ-6Ð-B˜k˜kÈð ñ 
ô 
ˆð Œ>ð 	,˜iÐ3¸Ô8SÐ3ð,Ø"×:Ò:¸5¼<ÑHÔH�Ø×(Ò(¨Ñ5Ô5Ð5Ð5øÝð ,ð ,ð ,Ý—’ÐVØ&*ð ñ ,ô ,ð ,ð ,ð ,ð,øøøð !œ.Ð3��¨eˆØÐ+Ð+˜6œ>Ð+Ð+Ð+s0   Á&A/ Á/
BÁ9BÁ=BÂBÃ/C2 Ã2&DÄDc           
   ƒ  ó  K  — ddl m} ddlm}m}m}m}m}m} | 	                    ¦   «          
                    ¦   «         }		  |¦   «         }
n# t          $ r i }
Y nw xY w ||
¦  «        }|	sÊ ||
¦  «        }t          d¦  «        g}|                     t          d¦  «        ¦  «         |                     ¦   «         D ]A\  }}||k    rdnd}|                     t          d|› |› � ||¦  «        ¬	¦  «        ¦  «         ŒB|                     t          d
¦  «        ¦  «         d                     |¦  «        S 	  ||	|
¦  «        \  }}nV# t           $ rI dd                     d„ |D ¦   «         ¦  «        z   }t          d|	                     ¦   «         |¬¦  «        cY S w xY w ||¦  «        st          dd¬¦  «        S |s0 |t%          |
ddd¬¦  «        ¦  «        | _        t          d¦  «        S || _        t          d|¬¦  «        S )uÍ   Handle /personality command - list or set a personality.

        All resolution/persistence goes through hermes_cli.personality â€”
        the single owner of personality state on every surface.
        r   )r  )Úactive_personality_nameÚavailable_personalitiesÚdescribe_personalityÚpersist_personalityÚprompt_textÚresolve_personalityzgateway.personality.headerzgateway.personality.none_optionu    âœ“r#   zgateway.personality.item)r.  Úpreviewzgateway.personality.usager±   z`none`, rÉ   c              3  ó"   K  — | ]
}d |› d �V — ŒdS r  rË   )rÌ   Úns     r(   rÎ   zHGatewaySlashCommandsMixin._handle_personality_command.<locals>.<genexpr>ç	  s*   è è € Ð.OÐ.O¸A¨x°1¨x¨x¨xÐ.OÐ.OÐ.OÐ.OÐ.OÐ.Or*   zgateway.personality.unknown)r.  Ú	availablezgateway.personality.save_failedzconfig write failedr6   rW  Úsystem_prompt©r}  zgateway.personality.clearedzgateway.personality.set_to©r.  )r´   r  Úhermes_cli.personalityrC  rD  rE  rF  rG  rH  r‡   r&   ry   r   rØ   r  r·   r/   rÑ   r   Ú_ephemeral_system_prompt)rF   rJ   r  rC  rD  rE  rF  rG  rH  rl  r¦   Úpersonalitiesr¶  r¼   r.  ÚpromptÚmarkerÚ
new_promptrL  s                      r(   Ú_handle_personality_commandz5GatewaySlashCommandsMixin._handle_personality_command¼	  sÓ  è è € ð 	5Ð4Ð4Ð4Ð4Ð4ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆð	Ø)Ð)Ñ+Ô+ˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøà/Ð/°Ñ7Ô7ˆàð 	$Ø-Ð-¨fÑ5Ô5ˆGÝÐ3Ñ4Ô4Ð5ˆEØ�LŠL�Ð<Ñ=Ô=Ñ>Ô>Ð>Ø -× 3Ò 3Ñ 5Ô 5ð ð ‘��fØ#'¨7¢? ?˜˜¸�Ø—’ÝØ2Ø $Ð. fÐ.Ð.Ø 4Ð 4°VÑ <Ô <ðñ ô ñô ð ð ð �LŠL�Ð6Ñ7Ô7Ñ8Ô8Ð8Ø—9’9˜UÑ#Ô#Ð#ð	\Ø2Ð2°4¸Ñ@Ô@ÑˆD�*�*øÝð 	\ð 	\ð 	\Ø" T§Y¢YÐ.OÐ.OÀÐ.OÑ.OÔ.OÑ%OÔ%OÑOˆIÝÐ2¸¿º¹¼ÐQZÐ[Ñ[Ô[Ð[Ð[Ð[ð	\øøøð #Ð" 4Ñ(Ô(ð 	UÝÐ6Ð>SÐTÑTÔTÐTàð 	4Ø,7¨KÝ˜ ¨À"ÐEÑEÔEñ-ô -ˆDÔ)õ Ð2Ñ3Ô3Ð3ð )3ˆÔ%ÝÐ-°DÐ9Ñ9Ô9Ð9s%   Á 
A ÁAÁAÄ5E ÅAFÆFc              ƒ  ón  K  — |j         }| j                             |¦  «        ƒ d{V —†}| j                             |j        ¦  «        ƒ d{V —†}d}d}ddlm} t          t          |¦  «        dz
  dd¦  «        D ]/}||         }	 ||	¦  «        r|	 	                    dd¦  «        }|} nŒ0|st          d¦  «        S |d|…         }
| j                             |j        |
d	¬
¦  «        ƒ d{V —† d|_        t          |t          j        ||j        |j        ¬¦  «        }|                      |¦  «        ƒ d{V —†S )z6Handle /retry command - re-send the last user message.Nr   )Úis_user_originated_turnrå   éÿÿÿÿr–  r#   zgateway.retry.no_previousT)Úactive_only)rÿ   Úmessage_typeri   Úraw_messageÚchannel_prompt)ri   r?   r†   rž  rS   Úagent.context_compressorrX  Úranger  rE   r   Úrewrite_transcriptr(  r   r   ÚTEXTr\  r]  Ú_handle_message)rF   rJ   ri   rU  r§  Úlast_user_msgÚlast_user_idxrX  r  ÚmsgÚ	truncatedÚretry_events               r(   Ú_handle_retry_commandz/GatewaySlashCommandsMixin._handle_retry_commandù	  s¶  è è € à”ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ0×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZˆð ˆØˆð
 	EÐDÐDÐDÐDÐDå•s˜7‘|”| aÑ'¨¨RÑ0Ô0ð 	ð 	ˆAØ˜!”*ˆCØ&Ð& sÑ+Ô+ð Ø #§¢¨	°2Ñ 6Ô 6�Ø !�Ø�ðð
 ð 	2ÝÐ0Ñ1Ô1Ð1ð ˜N˜]˜NÔ+ˆ	ØÔ&×9Ò9ØÔ$ i¸Tð :ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ,-ˆÔ(õ #ØÝ$Ô)ØØÔ)Ø Ô/ð
ñ 
ô 
ˆð ×)Ò)¨+Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6r*   ú'MessageEvent'c              ƒ  ó¢  K  — |                      ¦   «         pd                     ¦   «         }|                     ¦   «         }|                      |¦  «        ƒ d{V —†\  }}|€t	          d¦  «        S |r|dk    r|                     ¦   «         S |dk    r+|                     ¦   «         › d|                     ¦   «         › �S |dk    rÛ|                     d¬	¦  «        }|€t	          d
¦  «        S 	 |j        r$| j	         
                    |j        j        ¦  «        nd}|j        r|                      |j        ¦  «        nd}|r|r|                      ||¦  «         n2# t          $ r%}	t                               d|	¦  «         Y d}	~	nd}	~	ww xY wt	          d|j        ¬¦  «        S |dk    r;|                     ¦   «         }|€t	          d¦  «        S t	          d|j        ¬¦  «        S |dv ræ|                     ¦   «         }
|                     ¦   «          	 |j        r$| j	         
                    |j        j        ¦  «        nd}|j        r|                      |j        ¦  «        nd}|r|r|                      ||¦  «         n2# t          $ r%}	t                               d|	¦  «         Y d}	~	nd}	~	ww xY w|
rt	          d¦  «        nt	          d¦  «        S |dk    s|                     d¦  «        rè|t-          d¦  «        d…                              ¦   «         }|sdS |                     dd¦  «        }	 t1          |d         ¦  «        }n# t2          $ r Y dS w xY wt-          |¦  «        dk    r|d                              ¦   «         nd}	 |                     ||¬	¦  «         n## t6          t2          f$ r}	d|	› �cY d}	~	S d}	~	ww xY w|rd|› d�nd}d|› |› d�S |d k    r|                     ¦   «         rd!S d"S |d#k    s|                     d$¦  «        �rá|t-          d#¦  «        d…                              ¦   «         }|                     ¦   «         }|r|d%k    r|                     ¦   «         S |                     d&¦  «        r~|t-          d'¦  «        d…                              ¦   «         }	 |                     |¦  «        }n## t6          t2          f$ r}	d(|	› �cY d}	~	S d}	~	ww xY wd)|j        › d|j         › d*|j!        › d+�S |                     d,¦  «        s|                     d-¦  «        r€|                     dd¦  «        d                              ¦   «         }	 | "                    t1          |¦  «        ¦  «        }n)# t6          t2          tF          f$ r}	d.|	› �cY d}	~	S d}	~	ww xY wd/|› �S |d0k    rC	 | $                    ¦   «         }n# t6          $ r}	d1|	› �cY d}	~	S d}	~	ww xY wd2|› d3|dk    rd4nd› d5�S d6S d}|                     d7¦  «        rœ|t-          d7¦  «        d…                              ¦   «         }|sd8S 	 ddl%}dd9l&m'}  |j(        ¦   «          )                    d||¦  «        ƒ d{V —†}n4# t          $ r'}	t                               d:|	¦  «         d}Y d}	~	nd}	~	ww xY w|}|}n0dd;l&m*}  ||¦  «        \  }}|p|}| +                    ¦   «         s|nd}	 | ,                    ||¬<¦  «        }n5# t2          $ r(}	t	          d=t[          |	¦  «        ¬>¦  «        cY d}	~	S d}	~	ww xY w|j        r$| j	         
                    |j        j        ¦  «        nd}|j        r|                      |j        ¦  «        nd}|r|r}	 t]          |j        t^          j0        |j        |j1        |j2        ¬?¦  «        }|  3                    |||¦  «         n2# t          $ r%}	t                               d@|	¦  «         Y d}	~	nd}	~	ww xY wt	          dA|j4        |j        ¬B¦  «        } | 5                    ¦   «         r| › dC|j6         7                    ¦   «         › �S |                     d7¦  «        r| › dD�S | S )EuŒ  Handle /goal for gateway platforms.

        Subcommands: ``/goal`` / ``/goal status`` / ``/goal pause`` /
        ``/goal resume`` / ``/goal clear``. Any other text becomes the
        new goal.

        Setting a new goal queues the goal text as the next turn so the
        agent starts working on it immediately â€” the post-turn
        continuation hook then takes over from there.
        r#   Núgateway.goal.unavailablerä  Úshowr±   r9  zuser-pausedrN   zgateway.goal.no_goal_setz3goal pause: pending continuation cleanup failed: %szgateway.goal.paused)rõ  r:  zgateway.goal.no_resumezgateway.goal.resumed>   rç  ÚstopÚclearz3goal clear: pending continuation cleanup failed: %szgateway.goal_clearedzgateway.no_active_goalÚwaitzwait z Usage: /goal wait <pid> [reason]rå   r   z0/goal wait: <pid> must be an integer process id.z/goal wait: rÆ   r8  u   â�³ Goal parked on pid z. Loop pauses until it exits.Úunwaitu/   â–¶ Wait barrier cleared â€” goal loop resumes.zNo wait barrier set.Úgatezgate r-  zadd r×   z/goal gate add: u   âš¿ Gate added: $ z
 retries, z6s timeout). It must pass before the goal can complete.zremove zrm z/goal gate remove: u   âœ“ Gate removed: $ rn  z/goal gate clear: õ   âœ“ Cleared z gaterú  r¡  z=Usage: /goal gate [list | add <command> | remove <N> | clear]Údraftz0Usage: /goal draft <objective in plain language>)Údraft_contractzgoal draft failed: %s)Úparse_contract)Úcontractzgateway.goal.invalidr6   )rÿ   r[  ri   rG  r]  zgoal kickoff enqueue failed: %szgateway.goal.set)Úbudgetrõ  z
Completion contract:
u=   
(Couldn't draft a contract â€” running as a free-form goal.))8r‡   r&   rÑ   Ú_get_goal_manager_for_eventr   Ústatus_lineÚrender_contractr9  ri   rA   rE   rG   rj   Ú!_clear_goal_pending_continuationsry   rw   rŽ   rõ  r:  Úhas_goalrn  r   r  r  r+   r/   Úwait_onÚRuntimeErrorÚstop_waitingÚrender_gatesÚadd_gaterë  Úmax_retriesÚtimeout_secondsÚremove_gateÚ
IndexErrorÚclear_gatesrq   Úhermes_cli.goalsrt  Úget_running_loopÚrun_in_executorru  Úis_emptyrÖ   r!   r   r   ra  rG  r]  Ú_enqueue_fifoÚ	max_turnsÚhas_contractrv  Úrender_block)!rF   rJ   rl  rÑ   ÚmgrrU  r8  rH   Ú
_quick_keyr  ÚhadÚwait_argÚwtokensÚpidrO   ÚrtxtÚgate_argÚ
gate_lowerrë  rq  Úidx_textÚremovedÚprevÚdraft_contract_objÚ	objectiverq   rt  rv  ru  ÚheadlineÚparsedÚkickoff_eventÚbases!                                    r(   Ú_handle_goal_commandz.GatewaySlashCommandsMixin._handle_goal_command/
  sZ
  è è € ð ×&Ò&Ñ(Ô(Ð.¨B×5Ò5Ñ7Ô7ˆØ—
’
‘”ˆà#'×#CÒ#CÀEÑ#JÔ#JÐJÐJÐJÐJÐJÐJÑˆˆ]Øˆ;ÝÐ/Ñ0Ô0Ð0àð 	%�u Ò(Ð(Ø—?’?Ñ$Ô$Ð$ð �FŠ?ˆ?Ø—o’oÑ'Ô'ÐBÐB¨3×+>Ò+>Ñ+@Ô+@ÐBÐBÐBà�GÒÐØ—I’I ]�IÑ3Ô3ˆEØˆ}ÝÐ3Ñ4Ô4Ð4ðYØFKÄlÐ\˜$œ-×+Ò+¨E¬LÔ,AÑBÔBÐBÐX\�ØKPÌ<Ða˜T×9Ò9¸%¼,ÑGÔGÐGÐ]a�
Øð P˜zð PØ×:Ò:¸:ÀwÑOÔOÐOøøÝð Yð Yð YÝ—’ÐRÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøåÐ*°´Ð<Ñ<Ô<Ð<à�HÒÐØ—J’J‘L”LˆEØˆ}ÝÐ1Ñ2Ô2Ð2ÝÐ+°%´*Ð=Ñ=Ô=Ð=àÐ-Ð-Ð-Ø—,’,‘.”.ˆCØ�IŠI‰KŒKˆKðYØFKÄlÐ\˜$œ-×+Ò+¨E¬LÔ,AÑBÔBÐBÐX\�ØKPÌ<Ða˜T×9Ò9¸%¼,ÑGÔGÐGÐ]a�
Øð P˜zð PØ×:Ò:¸:ÀwÑOÔOÐOøøÝð Yð Yð YÝ—’ÐRÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøà03ÐT•1Ð+Ñ,Ô,Ð,½Ð;SÑ9TÔ9TÐTð �FŠ?ˆ?˜e×.Ò.¨wÑ7Ô7ˆ?Ø�C ™KœK˜L˜LÔ)×/Ò/Ñ1Ô1ˆHØð :Ø9Ð9Ø—n’n T¨1Ñ-Ô-ˆGðJÝ˜' !œ*‘o”o��øÝð Jð Jð JØIÐIÐIðJøøøå+.¨w©<¬<¸!Ò+;Ð+;�W˜Q”Z×%Ò%Ñ'Ô'Ð'ÀˆFð,Ø—’˜C¨�Ñ/Ô/Ð/Ð/øÝ ¥*Ð-ð ,ð ,ð ,Ø+ cÐ+Ð+Ð+Ð+Ð+Ð+Ð+Ð+øøøøð,øøøà%+Ð3�>˜�>�>�>�>°ˆDØU¨SÐU°$ÐUÐUÐUÐUð �HÒÐØ×ÒÑ!Ô!ð IØHÐHØ)Ð)ð �FŠ?ˆ?˜e×.Ò.¨wÑ7Ô7‰?Ø�C ™KœK˜L˜LÔ)×/Ò/Ñ1Ô1ˆHØ!ŸšÑ)Ô)ˆJØð *˜z¨VÒ3Ð3Ø×'Ò'Ñ)Ô)Ð)Ø×$Ò$ VÑ,Ô,ð 
Ø"¥3 u¡:¤: ; ;Ô/×5Ò5Ñ7Ô7�ð4ØŸ<š<¨Ñ0Ô0�D�DøÝ$¥jÐ1ð 4ð 4ð 4Ø3¨cÐ3Ð3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøðB¨¬ð Bð BØÔ(ðBð BØ48Ô4HðBð Bð Bðð
 ×$Ò$ YÑ/Ô/ð 8°:×3HÒ3HÈÑ3OÔ3Oð 8Ø#Ÿ>š>¨$°Ñ2Ô2°1Ô5×;Ò;Ñ=Ô=�ð7Ø!Ÿošo­c°(©m¬mÑ<Ô<�G�GøÝ$¥jµ*Ð=ð 7ð 7ð 7Ø6°Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøà7¨gÐ7Ð7Ð7Ø˜WÒ$Ð$ð6ØŸ?š?Ñ,Ô,�D�DøÝ#ð 6ð 6ð 6Ø5°Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð6øøøàL dÐLÐL¸Àº	¸	°°ÀrÐLÐLÐLÐLØRÐRð "ÐØ×Ò˜GÑ$Ô$ð 	AØ�S ™\œ\˜]˜]Ô+×1Ò1Ñ3Ô3ˆIØð JØIÐIð	*Ø���Ø;Ð;Ð;Ð;Ð;Ð;à+C¨7Ô+CÑ+EÔ+E×+UÒ+UØ˜.¨)ñ,ô ,ð &ð &ð &ð &ð &ð &Ð"Ð"øõ ð *ð *ð *Ý—’Ð4°cÑ:Ô:Ð:Ø%)Ð"Ð"Ð"Ð"Ð"Ð"øøøøð*øøøð ˆDØ)ˆHˆHð
 8Ð7Ð7Ð7Ð7Ð7à-˜~¨dÑ3Ô3ÑˆH�fØÐ#˜tˆDØ%+§_¢_Ñ%6Ô%6Ð@�v�v¸DˆHð	=Ø—G’G˜D¨8�GÑ4Ô4ˆEˆEøÝð 	=ð 	=ð 	=ÝÐ+µ3°s±8´8Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøð
 ?D¼lÐT�$”-×#Ò# E¤LÔ$9Ñ:Ô:Ð:ÐPTˆØCHÄ<ÐY�T×1Ò1°%´,Ñ?Ô?Ð?ÐUYˆ
Øð 	E�zð 	Eð
EÝ ,ØœÝ!,Ô!1Ø œ<Ø$Ô/Ø#(Ô#7ð!ñ !ô !�ð ×"Ò" :¨}¸gÑFÔFÐFÐFøÝð Eð Eð EÝ—’Ð>ÀÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøõ Ð#¨E¬OÀ%Ä*ÐMÑMÔMˆØ×ÒÑÔð 	TØÐSÐS°E´N×4OÒ4OÑ4QÔ4QÐSÐSÐSØ×Ò˜GÑ$Ô$ð 	[àÐZÐZÐZÐZØˆs  Ã)A*E Å
FÅE>Å>FÈ
A*I5 É5
J$É?JÊJ$Ì&L< Ì<
M
Í	M
Í=N ÎN5Î&N0Î*N5Î0N5ÒR2 Ò2SÓSÓSÓSÕ	"U, Õ,VÖVÖVÖVÖ!V6 Ö6
W× W
×W×
WØ*4Y Ù
ZÙ)ZÚZÛ	[! Û!
\Û+\Ü\Ü\Ý+A	^5 Þ5
_$Þ?_ß_$c              ƒ  ó¬  K  — ddl m}m}m} |                     ¦   «         pd                     ¦   «         }|                     ¦   «         }|                      |¦  «        ƒ d{V —†\  }}|€dS |j        r|  	                    |j        ¦  «        nd}	|r|dk    r| 
                    ¦   «         S |dk    r"|                     ¦   «         }
|
r
d|
j        › �nd	S |d
k    r]|                     ¦   «         }
|
€dS |	r(|j        �!|                      |	|j        |j        ¦  «         d ||
j        ¦  «        › d|
j        › �S |dv r1|                     ¦   «         }|	r|                      |	¦  «         |rdnd	S |                     dd¦  «        }d}d}|rc|d                              ¦   «         dk    rEt)          |¦  «        dk    r2 |d|d         › �¦  «        }t)          |¦  «        dk    r|d         nd}nL|rJ ||d         ¦  «        }|r5|dk    r/|t)          |d         ¦  «        d…                              ¦   «         nd}|€	 dS |dk     rd|› d�S |                     ¦   «         sdS 	 |                     ||¦  «        }
n# t,          $ r}d|› �cY d}~S d}~ww xY w|	r(|j        �!|                      |	|j        |j        ¦  «         d ||
j        ¦  «        › d|
j        › d�S )a&  Handle /heartbeat for gateway platforms (mirror of CLI handler).

        Sets/manages the session's one recurring re-entry prompt. The
        gateway-wide poller injects due heartbeats through the adapter FIFO
        as ordinary user turns, so alternation and caching are untouched.
        r   )Úparse_intervalÚformat_intervalÚMIN_INTERVAL_SECONDSr#   Nz$Heartbeats unavailable (no session).rä  r9  u   â�¸ Heartbeat paused: zNo heartbeat set.r:  zNo heartbeat to resume.u   â–¶ Heartbeat resumed (every z): >   Úoffrm  rn  u   âœ“ Heartbeat cleared.ræ   Úeveryzevery rå   z‚Usage: /heartbeat every <interval> <prompt>  (e.g. /heartbeat every 10m Check CI)
Also: /heartbeat status | pause | resume | clearu"   Interval too small â€” minimum is zs.uG   Usage: /heartbeat every <interval> <prompt> â€” the prompt is required.zInvalid heartbeat: u   â™¥ Heartbeat set (every u�   
Fires as a normal turn whenever this session is idle and the interval has elapsed. Lives while the gateway runs â€” use `hermes cron` for durable schedules.)Úhermes_cli.heartbeatr£  r¤  r¥  r‡   r&   rÑ   Ú _get_heartbeat_manager_for_eventri   rj   ry  r9  rS  r:  Ú_register_heartbeat_watchrS   Úinterval_secondsrn  Ú_unregister_heartbeat_watchr  r  rÖ   r/   )rF   rJ   r£  r¤  r¥  rl  rÑ   r�  rU  Ú	quick_keyr8  r‘  r  ÚintervalrS  r  s                   r(   Ú_handle_heartbeat_commandz3GatewaySlashCommandsMixin._handle_heartbeat_commandÛ
  s¦  è è € ð 	_Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^à×&Ò&Ñ(Ô(Ð.¨B×5Ò5Ñ7Ô7ˆØ—
’
‘”ˆà#'×#HÒ#HÈÑ#OÔ#OÐOÐOÐOÐOÐOÐOÑˆˆ]Øˆ;Ø9Ð9àBGÄ,ÐX�D×0Ò0°´Ñ>Ô>Ð>ÐTXˆ	àð 	%�u Ò(Ð(Ø—?’?Ñ$Ô$Ð$à�GÒÐØ—I’I‘K”KˆEØ>CÐ\Ð:¨E¬LÐ:Ð:Ð:ÐI\Ð\à�HÒÐØ—J’J‘L”LˆEØˆ}Ø0Ð0Øð X˜Uœ\Ð5Ø×.Ò.¨y¸%¼,ÈÌÑWÔWÐWØm°?°?À5ÔCYÑ3ZÔ3ZÐmÐmÐ_dÔ_kÐmÐmÐmàÐ,Ð,Ð,Ø—)’)‘+”+ˆCØð <Ø×0Ò0°Ñ;Ô;Ð;Ø/2ÐKÐ+Ð+Ð8KÐKð —’˜D !Ñ$Ô$ˆØˆØˆØð 	X�f˜Q”i—o’oÑ'Ô'¨7Ò2Ð2µs¸6±{´{ÀaÒ7GÐ7GØ%�~Ð&:¨v°a¬yÐ&:Ð&:Ñ;Ô;ˆHÝ"% f¡+¤+°¢/ /�V˜A”Y�Y°rˆFˆFØð 	XØ%�~ f¨Q¤iÑ0Ô0ˆHØ6>ÐWÀ8ÈaÂ<À<�T�#˜f Qœi™.œ.˜/˜/Ô*×0Ò0Ñ2Ô2Ð2ÐUWˆFàÐðCðð ð �aŠ<ˆ<ØPÐ8LÐPÐPÐPÐPØ�|Š|‰~Œ~ð 	]Ø\Ð\ð	/Ø—G’G˜F HÑ-Ô-ˆEˆEøÝð 	/ð 	/ð 	/Ø.¨Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øøøøð	/øøøàð 	T˜œÐ1Ø×*Ò*¨9°e´lÀCÄNÑSÔSÐSða¨¨¸Ô8NÑ(OÔ(Oð að aÐTYÔT`ð að að að	
s   ÉI4 É4
JÉ>JÊJÊJc              ƒ  ó²  K  — |                      ¦   «         pd                     ¦   «         }|j        r|                      |j        ¦  «        nd}|sdS || j        v rdS d}t          | dd¦  «        }|�W|5  | j                             |¦  «        }t          |t          ¦  «        r|d         n|r|nd}ddd¦  «         n# 1 swxY w Y   |€dS t          t          |dd¦  «        pg ¦  «        }|sd	S d
t          |dt          ¦   «         ¦  «        v }	 |                     |d||pd¬¦  «         n# t          $ r}	d|	› �cY d}	~	S d}	~	ww xY w|rd|› d�nd}
d|
› d�S )uh  Handle /refine â€” run the memory/skill review fork on demand.

        Uses the session's cached AIAgent (idle agents live in
        ``_agent_cache``). The review runs in a daemon thread against a
        snapshot of the conversation; the live session and prompt cache are
        untouched. Requires the session to have at least one completed turn.
        r#   Nz Refine unavailable (no session).u?   Agent is running â€” wait for the turn to finish, then /refine.rP   r   u/   Nothing to refine yet â€” send a message first.Ú_session_messagesu4   Nothing to refine yet â€” the conversation is empty.Úskill_manageÚvalid_tool_namesT)Úmessages_snapshotÚreview_memoryÚreview_skillsÚfocusz/refine failed to start: z	 (focus: r8  u1   âš— Reviewing this conversation in the backgroundu9    â€” any memory/skill updates will be reported when done.)r‡   r&   ri   rj   rF  rD   ro   rE   r%   rp   r-  rÖ   Ú_spawn_background_reviewry   )rF   rJ   rl  r­  rW  r^  r`  Úsnapshotr¶  r  Útails              r(   Ú_handle_refine_commandz0GatewaySlashCommandsMixin._handle_refine_command#  s8  è è € ð ×&Ò&Ñ(Ô(Ð.¨B×5Ò5Ñ7Ô7ˆØBGÄ,ÐX�D×0Ò0°´Ñ>Ô>Ð>ÐTXˆ	Øð 	6Ø5Ð5Ø˜Ô,Ð,Ð,ØTÐTàˆÝ˜TÐ#6¸Ñ=Ô=ˆ
ØÐ!Øð _ð _ØÔ*×.Ò.¨yÑ9Ô9�Ý%/°½Ñ%>Ô%>Ð^˜˜qœ	˜	ÈfÐD^ÀFÀFÐZ^�ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ð ˆ=ØDÐDå� Ð':¸DÑAÔAÐGÀRÑHÔHˆØð 	JØIÐIà&­'°%Ð9KÍSÉUÌUÑ*SÔ*SÐSˆð	5Ø×*Ò*Ø"*Ø"Ø+Ø�l˜dð	 +ñ ô ð ð øõ ð 	5ð 	5ð 	5Ø4¨sÐ4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð	5øøøà&*Ð2Ð"˜4Ð"Ð"Ð"Ð"°ˆðDÀð Dð Dð Dð	
s0   Á4>B>Â>CÃCÄD- Ä-
EÄ7EÄ;EÅEc              ƒ  óf  K  — |                      ¦   «         pd                     ¦   «         }|                      |¦  «        ƒ d{V —†\  }}|€t          d¦  «        S |                     ¦   «         sdS |s+|                     ¦   «         › d|                     ¦   «         › �S |                     dd¦  «        }|d                              ¦   «         }t          |¦  «        dk    r|d                              ¦   «         nd}|dk    r€|sd	S 	 t          |                     ¦   «         d         ¦  «        }n# t          $ r Y d
S w xY w	 |                     |¦  «        }	n## t          t          f$ r}
d|
› �cY d}
~
S d}
~
ww xY wd|› d|	› �S |dk    rG	 |                     ¦   «         }n# t          $ r}
d|
› �cY d}
~
S d}
~
ww xY w|rd|› d|dk    rdnd› d�S dS 	 |                     |¦  «        }n## t          t          f$ r}
d|
› �cY d}
~
S d}
~
ww xY w|j        rt          |j        j        ¦  «        nd}d|› d|› �S )a
  Handle /subgoal for gateway platforms (mirror of CLI handler).

        Subgoals are extra criteria appended to the active goal mid-loop.
        They modify state read at the next turn boundary, so this is safe
        to invoke while the agent is running.
        r#   Nrk  z*No active goal. Set one with /goal <text>.r±   rå   r   ÚremovezUsage: /subgoal remove <n>z8/subgoal remove: <n> must be an integer (1-based index).z/subgoal remove: u   âœ“ Removed subgoal rÿ  rn  z/subgoal clear: rr  z subgoalrú  r¡  zNo subgoals to clear.z
/subgoal: u   âœ“ Added subgoal )r‡   r&   rx  r   r|  ry  Úrender_subgoalsr  rÑ   r  r+   r/   Úremove_subgoalr…  r~  Úclear_subgoalsÚadd_subgoalr8  Úsubgoals)rF   rJ   rl  r�  Ú_session_entryr  ÚverbÚrestr  r™  r  rš  rÿ   s                r(   Ú_handle_subgoal_commandz1GatewaySlashCommandsMixin._handle_subgoal_commandO  sñ  è è € ð ×&Ò&Ñ(Ô(Ð.¨B×5Ò5Ñ7Ô7ˆØ$(×$DÒ$DÀUÑ$KÔ$KÐKÐKÐKÐKÐKÐKÑˆˆ^Øˆ;ÝÐ/Ñ0Ô0Ð0Ø�|Š|‰~Œ~ð 	@Ø?Ð?ð ð 	CØ—o’oÑ'Ô'ÐBÐB¨3×+>Ò+>Ñ+@Ô+@ÐBÐBÐBà—’˜D !Ñ$Ô$ˆØ�aŒy�ŠÑ Ô ˆÝ$'¨¡K¤K°!¢O Oˆv�aŒy�ŠÑ Ô Ð ¸ˆà�8ÒÐØð 4Ø3Ð3ðRÝ˜$Ÿ*š*™,œ, qœ/Ñ*Ô*��øÝð Rð Rð RØQÐQÐQðRøøøð1Ø×,Ò,¨SÑ1Ô1��øÝ¥Ð-ð 1ð 1ð 1Ø0¨3Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøà:¨#Ð:Ð:°Ð:Ð:Ð:à�7Š?ˆ?ð0Ø×)Ò)Ñ+Ô+��øÝð 0ð 0ð 0Ø/¨#Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð0øøøàð PØO dÐOÐO¸4À1º9¸9°C°CÈ"ÐOÐOÐOÐOØ*Ð*ð	&Ø—?’? 4Ñ(Ô(ˆDˆDøÝ�LÐ)ð 	&ð 	&ð 	&Ø% Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%øøøøð	&øøøà),¬Ð9�c�#”)Ô$Ñ%Ô%Ð%¸ˆØ1 CÐ1Ð1¨4Ð1Ð1Ð1sl   Ä'D/ Ä/
D=Ä<D=ÅE ÅE7Å(E2Å,E7Å2E7Æ	F Æ
F7Æ(F2Æ,F7Æ2F7ÇG& Ç&HÇ7HÇ;HÈHc              ƒ  óH  K  — |j         }d}|                     ¦   «                              ¦   «         }|rq	 t          |                     ¦   «         d         ¦  «        }n@# t
          t          f$ r, t          d|                     ¦   «         d         ¬¦  «        cY S w xY w|dk     rd}| j         	                    |¦  «        ƒ d{V —†}| j         
                    |j        |¦  «        ƒ d{V —†}|€t          d¦  «        S d|_        	 t          |¦  «        }|                      |¦  «         n2# t          $ r%}t                                d|¦  «         Y d}~nd}~ww xY w|d         }	t%          |	¦  «        d	k    r|	dd	…         d
z   n|	}
t          d|d         |d         |
¬¦  «        S )u4  Handle /undo [N] â€” back up N user turns (default 1), soft-deleting
        the truncated rows on disk and echoing the backed-up message text so
        the user can copy/edit and resend.

        Mirrors the CLI/TUI /undo: rewound rows stay in state.db (active=0)
        for audit and are hidden from re-prompts and search. The cached agent
        is evicted so the next message rebuilds context from the truncated
        (active-only) transcript â€” the gateway's equivalent of the CLI's
        in-place history surgery + memory-cache invalidation.
        rå   r   zgateway.undo.invalid_count©ÚargNzgateway.undo.nothingz'undo: cached-agent eviction skipped: %sÚtarget_textéÈ   rî  zgateway.undo.removedÚturns_undoneÚrewound_count)Úturnsr:  rI  )ri   r‡   r&   r+   r  r/   r…  r   r?   r†   Úrewind_sessionrS   r(  r   rz   ry   rw   rŽ   r  )rF   rJ   ri   rK  r)  rU  rÙ  rT   rœ   rÊ  rI  s              r(   Ú_handle_undo_commandz.GatewaySlashCommandsMixin._handle_undo_command‚  s  è è € ð ”ˆð ˆØ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØð 	ðPÝ˜ŸšÑ(Ô(¨Ô+Ñ,Ô,��øÝ¥
Ð+ð Pð Pð PÝÐ5¸8¿>º>Ñ;KÔ;KÈAÔ;NÐOÑOÔOÐOÐOÐOðPøøøà�1ŠuˆuØ�à"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ/×>Ò>¸}Ô?WÐYZÑ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[ˆàˆ>ÝÐ+Ñ,Ô,Ð,ð ,-ˆÔ(ð	GÝ+¨FÑ3Ô3ˆKØ×$Ò$ [Ñ1Ô1Ð1Ð1øÝð 	Gð 	Gð 	GÝ�LŠLÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøð	Gøøøð ˜]Ô+ˆÝ/2°;Ñ/?Ô/?À#Ò/EÐ/E�+˜d˜s˜dÔ# eÑ+Ð+È;ˆÝØ"Ø˜Ô(Ø˜Ô)Øð	
ñ 
ô 
ð 	
s)   µ'A Á:BÂBÄ$D) Ä)
EÄ3EÅEc              ƒ  óD  K  — ddl m}m} |j        }|j        r|j        j        nd}|j        }|j        p|}|j        €t          dd¬¦  «        S t          |dd	¦  «        d
u }|rŸt          | dd¦  «        }	t          |	¦  «        r |	|¦  «        nd}
t          |
dd¦  «        }|j        dt          j        t          j        hv s0t          |dd¦  «        rt          |¦  «        r ||j        ¦  «        st          dd¬¦  «        S |j        }t          |j        t!          |¦  «        ||rt!          |¦  «        ndt          |dd¦  «        rt!          |j        ¦  «        ndt          |dd¦  «        rt!          |j        ¦  «        nd¬¦  «        }	 t'          || ¬¦  «         n(# t(          $ r}t          d|¬¦  «        cY d}~S d}~ww xY w ||¦  «        } ||¦  «        }	 ddlm}  ||t!          |¦  «        ¦  «          ||t!          |pd¦  «        ¦  «         n2# t(          $ r%}t.                               d|¦  «         Y d}~nd}~ww xY wt          | d¦  «        j                             |j        t7          | ¬¦  «        ¦  «        }||_        t          d||¬¦  «        S )zOHandle /sethome command -- set the current chat as the platform's home channel.r   )Ú_home_target_env_varÚ_home_thread_env_varrû  Nzgateway.set_home.save_failedzMissing logical platformr6   rE  FTr„  Úfronts_platformr\   z4Relay does not authenticate this logical home targetrF  )rG   ré   r.  rê   r\   rF  )Úenabled_if_new)Úsave_env_valuer#   z7Home config saved but legacy env persistence failed: %sr¦   ©rÒ   zgateway.set_home.success)r.  ré   )r´   rÒ  rÓ  ri   rG   r   ré   rS  r   rD   r°  r   ÚLOCALÚRELAYrê   r   r!   r\   rF  r   ry   rÒ  rÖ  rw   rx   rB  r
  r   Úhome_channel)rF   rJ   rÒ  rÓ  ri   Úplatform_nameré   rS  Ú	via_relayÚadapter_for_sourceÚrelay_adapterrÔ  rê   r°   rœ   Úenv_keyÚthread_env_keyrÖ  Úplatform_configs                      r(   Ú_handle_set_home_commandz2GatewaySlashCommandsMixin._handle_set_home_command³  sM  è è € àJÐJÐJÐJÐJÐJÐJÐJØ”ˆØ17´ÐO˜œÔ-Ð-ÀiˆØ”.ˆØÔ$Ð/¨ˆ	ØŒ?Ð"ÝÐ3Ð;UÐVÑVÔVÐVå˜FÐ$BÀEÑJÔJÈdÐRˆ	Øð 	Ý!(¨Ð/DÀdÑ!KÔ!KÐÝ:BÐCUÑ:VÔ:VÐ`Ð.Ð.¨vÑ6Ô6Ð6Ð\`ˆMÝ% mÐ5FÈÑMÔMˆOà” D­(¬.½(¼.Ð#IÐIÐIÝ˜v y°$Ñ7Ô7ð Jå Ñ0Ô0ð Jð '� v¤Ñ7Ô7ð Jõ
 Ø2ØPðñ ô ð ð
 Ô$ˆ	ÝØ”_Ý˜‘L”LØØ(1Ð;•c˜)‘n”n�n°tõ ˜6 9¨dÑ3Ô3ð•�F”NÑ#Ô#Ð#àõ ˜6 :¨tÑ4Ô4ð•�F”OÑ$Ô$Ð$àð
ñ 
ô 
ˆð&	>Ý  ¸)°mÐDÑDÔDÐDÐDøÝð 	>ð 	>ð 	>ÝÐ3¸1Ð=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøð 'Ð& }Ñ5Ô5ˆØ-Ð-¨mÑ<Ô<ˆð	YØ8Ð8Ð8Ð8Ð8Ð8ØˆN˜7¥C¨¡L¤LÑ1Ô1Ð1ØˆN˜>­3¨y¨¸BÑ+?Ô+?Ñ@Ô@Ð@Ð@øÝð 	Yð 	Yð 	YÝ�NŠNÐTÐVWÑXÔXÐXÐXÐXÐXÐXÐXøøøøð	Yøøøõ
 " $¨Ñ1Ô1Ô;×FÒFØŒOÝ y =Ð1Ñ1Ô1ñ
ô 
ˆð (,ˆÔ$åÐ+°)ÀWÐMÑMÔMÐMs6   ÆF  Æ 
GÆ*G Æ:GÇ GÇ:H È
I	È$IÉI	c              ƒ  óP  K  — |                      ¦   «                              ¦   «                              ¦   «         }|j        j        }|j        j        }|                      ||¦  «        }| j                             |¦  «        }|dv rGd| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         t          d¦  «        S |dv rGd| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         t          d	¦  «        S |d
k    rGd| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         t          d¦  «        S |dv r|                      |¦  «        ƒ d{V —†S |dk    r|                      |¦  «        ƒ d{V —†S |dk    �r’| j	                             |d¦  «        }t          d¦  «        t          d¦  «        t          d¦  «        dœ}| j                             |j        j        ¦  «        }|                      |¦  «        }	|	rêt#          |d¦  «        rÚ|                     |	¦  «        }
|
rÃt          d|                     ||¦  «        ¬¦  «        t          d|
d         ¬¦  «        t          d|
d         ¬¦  «        g}|
d         D ]S}|                     d¦  «        rt          d ¦  «        nd!}|                     t          d"|d#         |¬$¦  «        ¦  «         ŒTd%                     |¦  «        S t          d|                     ||¦  «        ¬¦  «        S | j	                             |d¦  «        }|dk    rHd| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         t          d&¦  «        }nGd| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         t          d'¦  «        }|duot#          |d(¦  «        }|rt          d)¦  «        nd!}t          d*||¬+¦  «        S ),z8Handle /voice [on|off|tts|channel|leave|status] command.>   ÚonÚenableÚ
voice_onlyTr×  z gateway.voice.enabled_voice_only>   r¦  Údisabler¦  )Údisabledzgateway.voice.disabled_textÚttsrw  zgateway.voice.tts_enabled>   r·   ÚchannelNÚleaverä  zgateway.voice.label_offzgateway.voice.label_voice_onlyzgateway.voice.label_all)r¦  ræ  rw  Úget_voice_channel_infozgateway.voice.status_mode©Úlabelzgateway.voice.status_channelÚchannel_name)rê  z!gateway.voice.status_participantsÚmember_countr9  ÚmembersÚis_speakingzgateway.voice.speakingr#   zgateway.voice.status_memberÚdisplay_name)r.  rä  r±   zgateway.voice.enabled_shortzgateway.voice.disabled_shortÚjoin_voice_channelzgateway.voice.help_channelszgateway.voice.help)ÚtoggleÚchannels)r‡   r&   rÑ   ri   ré   rG   Ú
_voice_keyrA   rE   Ú_voice_modeÚ_save_voice_modesÚ_set_adapter_auto_tts_enabledr   Ú_set_adapter_auto_tts_disabledÚ_handle_voice_channel_joinÚ_handle_voice_channel_leaveÚ_get_guild_idr  rì  rØ   r·   )rF   rJ   rl  ré   rG   Ú	voice_keyrH   ÚmodeÚlabelsÚguild_idr%  r¼   r  rä  r¶  Útoggle_lineÚsupports_voice_channelsrö  s                     r(   Ú_handle_voice_commandz/GatewaySlashCommandsMixin._handle_voice_commandú  s­  è è € à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆØ”,Ô&ˆØ”<Ô(ˆØ—O’O H¨gÑ6Ô6ˆ	à”-×#Ò# HÑ-Ô-ˆàÐ#Ð#Ð#Ø*6ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð SØ×2Ò2°7¸GÈTÐ2ÑRÔRÐRÝÐ7Ñ8Ô8Ð8ØÐ'Ð'Ð'Ø*/ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð UØ×3Ò3°G¸WÈtÐ3ÑTÔTÐTÝÐ2Ñ3Ô3Ð3Ø�UŠ]ˆ]Ø*/ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð SØ×2Ò2°7¸GÈTÐ2ÑRÔRÐRÝÐ0Ñ1Ô1Ð1ØÐ(Ð(Ð(Ø×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø�WŠ_ˆ_Ø×9Ò9¸%Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø�XÒÑØÔ#×'Ò'¨	°5Ñ9Ô9ˆDåÐ2Ñ3Ô3ÝÐ @ÑAÔAÝÐ2Ñ3Ô3ðð ˆFð ”m×'Ò'¨¬Ô(=Ñ>Ô>ˆGØ×)Ò)¨%Ñ0Ô0ˆHØð ,�G GÐ-EÑFÔFð ,Ø×5Ò5°hÑ?Ô?�Øð 	,åÐ5¸V¿ZºZÈÈdÑ=SÔ=SÐTÑTÔTÝÐ8À$À~ÔBVÐWÑWÔWÝÐ=ÀTÈ.ÔEYÐZÑZÔZð�Eð
 " )œ_ð nð n˜Ø@AÇÂÀmÑ@TÔ@TÐ!\¥Ð#;Ñ!<Ô!<Ð!<ÐZ\˜ØŸš¥QÐ'DÈ1È^ÔK\ÐekÐ%lÑ%lÔ%lÑmÔmÐmÐmØŸ9š9 UÑ+Ô+Ð+ÝÐ0¸¿
º
À4ÈÑ8NÔ8NÐOÑOÔOÐOð Ô&×*Ò*¨9°eÑ<Ô<ˆGØ˜%ÒÐØ.:�Ô  Ñ+Ø×&Ò&Ñ(Ô(Ð(Øð WØ×6Ò6°wÀÐQUÐ6ÑVÔVÐVÝÐ =Ñ>Ô>��à.3�Ô  Ñ+Ø×&Ò&Ñ(Ô(Ð(Øð YØ×7Ò7¸ÀÐSWÐ7ÑXÔXÐXÝÐ >Ñ?Ô?�ð
 '.°TÐ&9ð '½gØÐ-ñ?ô ?Ð#ð 5LÐS•Ð/Ñ0Ô0Ð0ÐQSð õ Ð)°+ÈÐQÑQÔQÐQr*   c              ƒ  óŽ  K  — ddl m}m} ddlm}m}  | |¦   «         ¦  «        }|d         st          d¦  «        S  |d|d         |d         |d	         ¬
¦  «        }t          j        dt          t          j        ¦   «         ¦  «        ¦  «        }|                     ¦   «                              ¦   «         }	|	s!|                     |¦  «        }
 ||
|¦  «        S |                     |¦  «        }
|
st          d|¬¦  «        S d}	 t          |	¦  «        dz
  }d|cxk    rt!          |
¦  «        k     rn n|
|         d         }nt          dt!          |
¦  «        ¬¦  «        S n# t"          $ r |	}Y nw xY w|                     ||¦  «        }|d         rt          d|d         |d         ¬¦  «        S t          d|d         ¬¦  «        S )uD   Handle /rollback command â€” list or restore filesystem checkpoints.r   ©Ú_checkpoint_agent_kwargsr  )ÚCheckpointManagerÚformat_checkpoint_listÚcheckpoints_enabledzgateway.rollback.not_enabledTÚcheckpoint_max_snapshotsÚcheckpoint_max_total_size_mbÚcheckpoint_max_file_size_mb©rÒ   Úmax_snapshotsÚmax_total_size_mbÚmax_file_size_mbÚTERMINAL_CWDzgateway.rollback.none_found)ÚcwdNrå   Úhashzgateway.rollback.invalid_number)rœ  rÉ  zgateway.rollback.restoredÚrestored_torO   )r  rO   zgateway.rollback.restore_failedr7   r6   )r´   r  r  Útools.checkpoint_managerr	  r
  r   rQ  rR  r!   r   r°   r‡   r&   Úlist_checkpointsr+   r  r/   Úrestore)rF   rJ   r  r  r	  r
  Ú	cp_kwargsr�  r  rÉ  ÚcheckpointsÚtarget_hashr  rÙ  s                 r(   Ú_handle_rollback_commandz2GatewaySlashCommandsMixin._handle_rollback_commandK  s@  è è € àNÐNÐNÐNÐNÐNÐNÐNØVÐVÐVÐVÐVÐVÐVÐVà,Ð,Ð-AÐ-AÑ-CÔ-CÑDÔDˆ	àÐ.Ô/ð 	5ÝÐ3Ñ4Ô4Ð4àÐØØ#Ð$>Ô?Ø'Ð(FÔGØ&Ð'DÔEð	
ñ 
ô 
ˆõ Œi˜­­D¬I©K¬KÑ(8Ô(8Ñ9Ô9ˆØ×$Ò$Ñ&Ô&×,Ò,Ñ.Ô.ˆàð 	<Ø×.Ò.¨sÑ3Ô3ˆKØ)Ð)¨+°sÑ;Ô;Ð;ð ×*Ò*¨3Ñ/Ô/ˆØð 	=ÝÐ2¸Ð<Ñ<Ô<Ð<àˆð	Ý�c‘(”(˜Q‘,ˆCØ�CÐ*Ð*Ò*Ð*�#˜kÑ*Ô*Ò*Ð*Ð*Ð*Ð*Ø)¨#Ô.¨vÔ6��åÐ:ÅÀKÑ@PÔ@PÐQÑQÔQÐQð øõ ð 	ð 	ð 	ØˆKˆKˆKð	øøøð —’˜S +Ñ.Ô.ˆØ�)Ôð 	ÝØ+Ø˜MÔ*Ø˜hÔ'ðñ ô ð õ
 Ð2¸&À¼/ÐJÑJÔJÐJs   ÄAE" Å"E1Å0E1c              ƒ  ó¾  K  — |                      ¦   «                              ¦   «         }d}d}|                     ¦   «         D ]3}|                     ¦   «         }|dv rd}Œ|dv rd}Œ$|dv rd}Œ+|d	k    rd	}Œ4t	          j        d
t          t          j        ¦   «         ¦  «        ¦  «        }|d	k    r|  	                    ||¦  «        ƒ d{V —†S ddl
m} t          j        |||¦  «        ƒ d{V —†}	|	                     d¦  «        s%t          d|	                     dd¦  «        ¬¦  «        S |	                     dd¦  «        }
|	                     dd¦  «        }|	                     dg ¦  «        }|	                     d¦  «        s|
s|s|st          d¦  «        S g }|
r|                     d|
› d�¦  «         |rmd                     d„ |dd…         D ¦   «         ¦  «        }t%          |¦  «        dk    rdt%          |¦  «        dz
  › d�nd}|                     d |› |› d�¦  «         |s*|r(|                     |                      |¦  «        ¦  «         d!                     |¦  «        S )"uv  Handle /diff â€” show git changes in the working directory.

        ``/diff`` (default) shows unstaged + untracked changes, ``/diff
        staged`` the staged ones, ``/diff all`` everything since HEAD, and
        ``/diff session`` the cumulative checkpoint-baseline diff of what
        Hermes itself changed. ``--stat`` limits output to the summary.

        The diff body is truncated hard here (messaging surfaces are not a
        pager); platform senders additionally split/clamp long messages to
        per-platform limits, the same way tool-progress output is truncated
        in three layers before delivery.
        FÚworking)z--statÚstatT)Ústagedz--stagedr`  z--cachedr!  )rw  ú--allÚheadrw  Úsessionr  Nr   )Úcollect_working_diffrÉ  úgateway.diff.failedr7   úCould not generate diffr6   r   r#   ÚdiffÚ	untrackedÚemptyúgateway.diff.no_changesú```
ú
```r±   c              3  ó    K  — | ]	}d |› �V — Œ
dS )z+ NrË   )rÌ   Úrels     r(   rÎ   zAGatewaySlashCommandsMixin._handle_diff_command.<locals>.<genexpr>­  s(   è è € ÐCÐC¨S˜j 3˜j˜jÐCÐCÐCÐCÐCÐCr*   rh  z	
... and z morez**Untracked:**
```
rh   )r‡   r&   r  rÑ   rQ  rR  r!   r   r°   Ú_gateway_session_diffÚtools.working_diffr%  rq   rƒ   rE   r   rØ   r·   r  Ú_fenced_truncated_diff)rF   rJ   rl  Ú	stat_onlyr   rÉ  Úlowr  r%  rÙ  r   r(  r)  ÚoutÚshownÚmores                   r(   Ú_handle_diff_commandz.GatewaySlashCommandsMixin._handle_diff_command{  sÒ  è è € ð ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆàˆ	ØˆØ—:’:‘<”<ð 		!ð 		!ˆCØ—)’)‘+”+ˆCØÐ(Ð(Ð(Ø �	�	ØÐDÐDÐDØ��ØÐ0Ð0Ð0Ø��Ø˜	Ò!Ð!Ø �øåŒi˜­­D¬I©K¬KÑ(8Ô(8Ñ9Ô9ˆà�9ÒÐØ×3Ò3°C¸ÑCÔCÐCÐCÐCÐCÐCÐCÐCà;Ð;Ð;Ð;Ð;Ð;åÔ(Ð)=¸sÀDÑIÔIÐIÐIÐIÐIÐIÐIˆØ�zŠz˜)Ñ$Ô$ð 	KÝÐ*Ø!Ÿ:š: gÐ/HÑIÔIðKñ Kô Kð Kð �zŠz˜& "Ñ%Ô%ˆØ�zŠz˜& "Ñ%Ô%ˆØ—J’J˜{¨BÑ/Ô/ˆ	Ø�:Š:�gÑÔð 	0 tð 	0°Dð 	0Àð 	0ÝÐ.Ñ/Ô/Ð/àˆØð 	,Ø�JŠJÐ*˜tÐ*Ð*Ð*Ñ+Ô+Ð+Øð 	CØ—I’IÐCÐC°I¸c¸r¸c´NÐCÑCÔCÑCÔCˆEÝ>AÀ)¹n¼nÈrÒ>QÐ>QÐ:¥ I¡¤°Ñ 3Ð:Ð:Ð:Ð:ÐWYˆDØ�JŠJÐA¨uÐA°dÐAÐAÐAÑBÔBÐBØð 	:˜Tð 	:Ø�JŠJ�t×2Ò2°4Ñ8Ô8Ñ9Ô9Ð9Ø�{Š{˜3ÑÔÐr*   r  r3  c              ƒ  óÐ  K  — ddl m}m} ddlm}  | |¦   «         ¦  «        }|d         st          d¦  «        S  |d|d         |d         |d	         ¬
¦  «        }t          j        |j        |¦  «        ƒ d{V —†}| 	                    d¦  «        s%t          d| 	                    dd¦  «        ¬¦  «        S | 	                    dd¦  «        }	| 	                    dd¦  «        }
| 	                    d¦  «        s|	s|
st          d¦  «        S g }|	r| 
                    d|	› d�¦  «         |s*|
r(| 
                    |                      |
¦  «        ¦  «         d                     |¦  «        S )z@Cumulative checkpoint-baseline diff for /diff session (gateway).r   r  )r	  r  zgateway.diff.not_enabledTr  r  r  r  NrÉ  r&  r7   r'  r6   r   r#   r(  r*  r+  r,  r-  rh   )r´   r  r  r  r	  r   rq   rƒ   Úsession_diffrE   rØ   r2  r·   )rF   r  r3  r  r  r	  r  r�  rÙ  r   r(  r5  s               r(   r0  z/GatewaySlashCommandsMixin._gateway_session_diff´  sÏ  è è € àNÐNÐNÐNÐNÐNÐNÐNØ>Ð>Ð>Ð>Ð>Ð>à,Ð,Ð-AÐ-AÑ-CÔ-CÑDÔDˆ	ØÐ.Ô/ð 	1ÝÐ/Ñ0Ô0Ð0àÐØØ#Ð$>Ô?Ø'Ð(FÔGØ&Ð'DÔEð	
ñ 
ô 
ˆõ Ô(¨Ô)9¸3Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ˆØ�zŠz˜)Ñ$Ô$ð 	KÝÐ*Ø!Ÿ:š: gÐ/HÑIÔIðKñ Kô Kð Kð �zŠz˜& "Ñ%Ô%ˆØ�zŠz˜& "Ñ%Ô%ˆØ�:Š:�gÑÔð 	0 tð 	0°Dð 	0ÝÐ.Ñ/Ô/Ð/àˆØð 	,Ø�JŠJÐ*˜tÐ*Ð*Ð*Ñ+Ô+Ð+Øð 	:˜Tð 	:Ø�JŠJ�t×2Ò2°4Ñ8Ô8Ñ9Ô9Ð9Ø�{Š{˜3ÑÔÐr*   rü  é¸  r(  Ú	max_linesr+   Ú	max_charsc                ó  — |                       ¦   «         }d}t          |¦  «        |k    rd                     |d|…         ¦  «        } d}t          | ¦  «        |k    r| d|…         } d}d}|rdt          |¦  «        › d�}d| › |› d	�S )
z9Fence a diff body, truncating to messaging-friendly size.Fr±   NTr#   u   
... (truncated â€” z- lines total; use /diff --stat for a summary)z```diff
r-  )Ú
splitlinesr  r·   )r(  r<  r=  Ú
diff_linesrf  Únotes         r(   r2  z0GatewaySlashCommandsMixin._fenced_truncated_diffÕ  s²   € ð —_’_Ñ&Ô&ˆ
Øˆ	Ýˆz‰?Œ?˜YÒ&Ð&Ø—9’9˜Z¨
¨¨
Ô3Ñ4Ô4ˆDØˆIÝˆt‰9Œ9�yÒ Ð Ø˜
˜˜
Ô#ˆDØˆIØˆØð 	ð2­¨J©¬ð 2ð 2ð 2ð ð -˜4Ð, Ð,Ð,Ð,Ð,r*   c           
   ƒ  óô  K  — |                      ¦   «                              ¦   «         }|st          d¦  «        S |j        }dt	          j        ¦   «                              d¦  «        › dt          j        d¦  «         	                    ¦   «         › �}|  
                    |¦  «        }|j        rt          |j        ¦  «        ng }|j        rt          |j        ¦  «        ng }t          j        |                      ||||||¬¦  «        ¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         |dd…         t+          |¦  «        dk    rd	nd
z   }	t          d|	|¬¦  «        S )u)  Handle /background <prompt> â€” run a prompt in a separate background session.

        Spawns a new AIAgent in a background thread with its own session.
        When it completes, sends the result back to the same chat without
        modifying the active session's conversation history.
        zgateway.background.usageÚbg_z%H%M%SÚ_é   )Úevent_message_idÚ
media_urlsÚmedia_typesNrü  rî  r#   zgateway.background.started)rI  rï   )r‡   r&   r   ri   r   r  rN  rQ  ÚurandomÚhexr  rG  r-  rH  rq   Úcreate_taskÚ_run_background_taskrè  r×   Úadd_done_callbackÚdiscardr  )
rF   rJ   rS  ri   rï   rF  rG  rH  Ú_taskrI  s
             r(   Ú_handle_background_commandz4GatewaySlashCommandsMixin._handle_background_commandé  s}  è è € ð ×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1ˆØð 	1ÝÐ/Ñ0Ô0Ð0à”ˆØQ�œ™œ×/Ò/°Ñ9Ô9ÐQÐQ½B¼JÀq¹M¼M×<MÒ<MÑ<OÔ<OÐQÐQˆà×7Ò7¸Ñ>Ô>Ðð 05Ô/?ÐG•T˜%Ô*Ñ+Ô+Ð+ÀRˆ
Ø16Ô1BÐJ•d˜5Ô,Ñ-Ô-Ð-Èˆõ Ô#Ø×%Ò%ØØØØ!1Ø%Ø'ð &ñ ô ñ	
ô 	
ˆð 	Ô×"Ò" 5Ñ)Ô)Ð)Ø×Ò Ô 6Ô >Ñ?Ô?Ð?à˜˜"˜”+­#¨f©+¬+¸Ò*:Ð*:  ÀÑCˆÝÐ-°wÈÐPÑPÔPÐPr*   Úkey_pathc                ó~  — ddl m} ddlm} |dz  }	  ||¦  «        }|                     d¦  «        }|}|dd…         D ].}	|	|vst          ||	         t          ¦  «        si ||	<   ||	         }Œ/|||d         <   t          ||¦  «         dS # t          $ r'}
t           
                    d	||
¦  «         Y d}
~
d
S d}
~
ww xY w)zlSave a dot-separated key to config.yaml (shared by /reasoning, /fast
        and their interactive pickers).r   rC  r«  r|  r¡  NrY  Tz Failed to save config key %s: %sF)r´   rD  rÒ  r¬  r  r%   r	  r   ry   rw   r7   )rF   rQ  r   rD  r¬  rñ  rf  rE  r¶  Úkrœ   s              r(   Ú_save_gateway_config_keyz2GatewaySlashCommandsMixin._save_gateway_config_key  s  € ð 	-Ð,Ð,Ð,Ð,Ð,Ø:Ð:Ð:Ð:Ð:Ð:Ø" ]Ñ2ˆð	ð /Ð.¨{Ñ;Ô;ˆKØ—>’> #Ñ&Ô&ˆDØ!ˆGØ˜#˜2˜#”Yð %ð %�Ø˜GÐ#Ð#­:°g¸a´jÅ$Ñ+GÔ+GÐ#Ø!#�G˜A‘JØ! !œ*��Ø %ˆG�D˜”HÑÝ ¨[Ñ9Ô9Ð9Ø�4øÝð 	ð 	ð 	Ý�LŠLÐ;¸XÀqÑIÔIÐIØ�5�5�5�5�5øøøøð	øøøs   “A6B Â
B<ÂB7Â7B<Úplatform_keyr   ró  c                óì  — ddl m} |pd                     ¦   «                              ¦   «         }|dv r2d| _        |                      d|› d�d¦  «         t          d|¬	¦  «        S |d
v r2d| _        |                      d|› d�d¦  «         t          d|¬	¦  «        S |dk    rd|rt          d¦  «        S |                      |d¦  «         |                      ¦   «         | _	        |  
                    |¦  «         t          d¦  «        S  ||¦  «        }|€t          d|¬¦  «        S || _	        |rŽ|                      d|¦  «        r<|                      |d¦  «         |  
                    |¦  «         t          d|¬¦  «        S |                      ||¦  «         |  
                    |¦  «         t          d|¬¦  «        S |                      ||¦  «         |  
                    |¦  «         t          d|¬¦  «        S )a  Apply a /reasoning argument (typed or picked) and return the reply.

        Single application path shared by the typed `/reasoning <arg>` branch
        and the interactive choice picker, so both surfaces stay in lockstep
        with the canonical parser.
        r   )Úparse_reasoning_effortr#   >   rä  rl  Tzdisplay.platforms.z.show_reasoningz gateway.reasoning.display_set_on©rG   >   r¦  ÚhideFz!gateway.reasoning.display_set_offÚresetz*gateway.reasoning.reset_global_unsupportedNzgateway.reasoning.reset_donezgateway.reasoning.unknown_argrÈ  zagent.reasoning_effortzgateway.reasoning.set_global)Úeffortz(gateway.reasoning.set_global_save_failedzgateway.reasoning.set_session)r²   rW  r&   rÑ   Ú_show_reasoningrT  r   Ú_set_session_reasoning_overrideÚ_load_reasoning_configÚ_reasoning_configrz   )rF   rT   rU  r   ró  rW  rž  s          r(   Ú_apply_reasoning_selectionz4GatewaySlashCommandsMixin._apply_reasoning_selection%  sY  € ð 	<Ð;Ð;Ð;Ð;Ð;à�˜"×#Ò#Ñ%Ô%×+Ò+Ñ-Ô-ˆð �NÐ"Ð"Ø#'ˆDÔ Ø×)Ò)ØB \ÐBÐBÐBÀDñô ð õ Ð7À,ÐOÑOÔOÐOØ�OÐ#Ð#Ø#(ˆDÔ Ø×)Ò)ØB \ÐBÐBÐBÀEñô ð õ Ð8À<ÐPÑPÔPÐPà�GÒÐØð GÝÐEÑFÔFÐFØ×0Ò0°¸dÑCÔCÐCØ%)×%@Ò%@Ñ%BÔ%BˆDÔ"Ø×$Ò$ [Ñ1Ô1Ð1ÝÐ3Ñ4Ô4Ð4à'Ð'¨Ñ.Ô.ˆØˆ>ÝÐ4¸%Ð@Ñ@Ô@Ð@à!'ˆÔØð 	OØ×,Ò,Ð-EÀuÑMÔMð GØ×4Ò4°[À$ÑGÔGÐGØ×(Ò(¨Ñ5Ô5Ð5ÝÐ7ÀÐFÑFÔFÐFØ×0Ò0°¸fÑEÔEÐEØ×$Ò$ [Ñ1Ô1Ð1ÝÐ?ÈÐNÑNÔNÐNà×,Ò,¨[¸&ÑAÔAÐAØ× Ò  Ñ-Ô-Ð-ÝÐ0¸Ð?Ñ?Ô?Ð?r*   Úcurrent_effortr-  c                ó  — ddl m} dt          d¦  «        |dk    dœg}|D ]}|                     ||||k    dœ¦  «         Œ |                     dt          d¦  «        ddœd	t          d
¦  «        ddœdt          d¦  «        ddœg¦  «         |S )z<Build the choice list for the interactive /reasoning picker.r   )ÚVALID_REASONING_EFFORTSr>  zgateway.reasoning.choice_none©r   rî  rý  rZ  zgateway.reasoning.choice_resetFrl  zgateway.reasoning.choice_showrY  zgateway.reasoning.choice_hide)r²   rc  r   rØ   rL  )rF   ra  rc  ÚchoicesÚlevels        r(   Ú_reasoning_picker_choicesz3GatewaySlashCommandsMixin._reasoning_picker_choices^  së   € à<Ð<Ð<Ð<Ð<Ð<ð  ÝÐ:Ñ;Ô;Ø,°Ò6ðð ð
ˆð -ð 	ð 	ˆEØ�NŠNà"Ø"Ø"'¨>Ò"9ðð ñô ð ð ð 	�Šà!­AÐ.NÑ,OÔ,OÐ_dÐeÐeØ ­1Ð-LÑ+MÔ+MÐ]bÐcÐcØ ­1Ð-LÑ+MÔ+MÐ]bÐcÐcðñ	
ô 	
ð 	
ð ˆr*   ra   re  c              ƒ  óè  K  —  t          | d¦  «        |j        ¦  «        }|duot          t          |¦  «        dd¦  «        du}|sdS 	 |                      |j        |                      |¦  «        ¦  «        }|                     |j        j        |||||¬¦  «        ƒ d{V —†}	t          t          |	dd¦  «        ¦  «        S # t          $ r&}
t           
                    d|
¦  «         Y d}
~
dS d}
~
ww xY w)a.  Send an interactive choice picker when the platform supports it.

        Mirrors the `/model` picker gate: the capability is detected on the
        adapter *type* (``send_choice_picker``), and a failed send falls back
        to the text path (returns False) instead of erroring the command.
        r„  NÚsend_choice_pickerF)ré   ra   re  rT   Úon_choice_selectedrú  rÉ  z3send_choice_picker failed, falling back to text: %s)rD   ri   r¯  r  r  ri  ré   rš  ry   rw   rx   )rF   rJ   rT   ra   re  rj  rH   r0  rú  rÙ  rœ   s              r(   Ú_try_send_choice_pickerz1GatewaySlashCommandsMixin._try_send_choice_pickerz  s?  è è € ð 7•'˜$Ð 5Ñ6Ô6°u´|ÑDÔDˆà˜4Ðð OÝ�˜W™œÐ';¸TÑBÔBÈ$ÐNð 	ð ð 	Ø�5ð	Ø×7Ò7Ø”˜d×:Ò:¸5ÑAÔAñô ˆHð #×5Ò5ØœÔ,ØØØ'Ø#5Ø!ð 6ñ ô ð ð ð ð ð ð ˆFõ � ¨	°5Ñ9Ô9Ñ:Ô:Ð:øÝð 	ð 	ð 	Ý�NŠNÐPÐRSÑTÔTÐTØ�5�5�5�5�5øøøøð	øøøs   Á
A6C Ã
C1ÃC,Ã,C1c           
   ƒ  óÐ  ‡ ‡‡K  — ddl m} |                     ¦   «                              ¦   «         }‰                      |¦  «        \  }}t          j        ‰ j        |j        ¦  «        ƒ d{V —†}‰  	                    |¦  «        Š‰  
                    ¦   «         ‰ _        t          t          ‰ di ¦  «        pi                      ‰¦  «        pi                      d¦  «        pd¦  «        }‰                      |j        ‰|¬¦  «        ‰ _        |�s.‰ j        }|€t#          d¦  «        }	d	}
nA|                     d
¦  «        du rt#          d¦  «        }	d}
n|                     dd	¦  «        }	|	}
‰ j        rt#          d¦  «        nt#          d¦  «        }‰t          ‰ di ¦  «        pi v }|rt#          d¦  «        nt#          d¦  «        } ||j        j        ¦  «        Šdˆˆ ˆfd„}‰                      |‰t#          d|	||¬¦  «        ‰                      |
¦  «        |¬¦  «        ƒ d{V —†}|rdS t#          d|	||¬¦  «        S  ||j        j        ¦  «        }‰                      ‰|||¬¦  «        S )u]  Handle /reasoning command â€” manage reasoning effort and display toggle.

        Usage:
            /reasoning                       Show current effort level and display state
            /reasoning <level>               Set reasoning effort for this session only
            /reasoning <level> --global      Persist reasoning effort to config.yaml
            /reasoning reset                 Clear this session's reasoning override
            /reasoning show|on               Show model reasoning in responses
            /reasoning hide|off              Hide model reasoning from responses
        r   )Ú_platform_config_keyNrÐ  r$  r#   )ri   rT   r$  zgateway.reasoning.level_defaultÚmediumrÒ   Fz gateway.reasoning.level_disabledr>  r[  zgateway.reasoning.display_onzgateway.reasoning.display_offÚ_session_reasoning_overrideszgateway.reasoning.scope_sessionzgateway.reasoning.scope_globalr�  r!   r   r    c              “  ó6   •K  — ‰                      ‰‰|¦  «        S r0  )r`  )r�  r   Ú_picker_platform_keyrF   rT   s     €€€r(   Ú_on_reasoning_choicezQGatewaySlashCommandsMixin._handle_reasoning_command.<locals>._on_reasoning_choiceÜ  s'   øè è € Ø×6Ò6ØÐ!5°uñô ð r*   zgateway.reasoning.picker_title)rf  rÛ   r¹   ©ra   re  rj  zgateway.reasoning.status)ró  ©r�  r!   r   r!   r    r!   )r´   rm  r‡   r&   Ú_parse_reasoning_command_argsrq   rƒ   r%  ri   rj   Ú_load_show_reasoningr\  r!   rD   rE   Ú!_resolve_session_reasoning_configr_  r   rG   rk  rg  r`  )rF   rJ   rm  r)  rl  ró  Ú_reasoning_sourceÚ_session_modelÚrcrf  ra  Údisplay_stateÚhas_session_overriderÛ   rr  Úpicker_sentrU  rq  rT   s   `                @@r(   Ú_handle_reasoning_commandz3GatewaySlashCommandsMixin._handle_reasoning_command   s+  øøøè è € ð 	5Ð4Ð4Ð4Ð4Ð4à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ#×AÒAÀ(ÑKÔKÑˆˆnõ #*Ô"3°DÔ4ZÐ\aÔ\hÑ"iÔ"iÐiÐiÐiÐiÐiÐiÐØ×2Ò2Ð3DÑEÔEˆØ#×8Ò8Ñ:Ô:ˆÔõ Ý�dÐ6¸Ñ;Ô;ÐA¸r×FÒFÀ{ÑSÔSÐYÐWY×^Ò^Ð_fÑgÔgÐmÐkmñ
ô 
ˆð "&×!GÒ!GØ”<Ø#Ø ð "Hñ "
ô "
ˆÔð ñ 5	àÔ'ˆBØˆzÝÐ;Ñ<Ô<�Ø!)��Ø—’˜	Ñ"Ô" eÐ+Ð+ÝÐ<Ñ=Ô=�Ø!'��àŸš˜x¨Ñ2Ô2�Ø!&�ð Ô'ð8•Ð0Ñ1Ô1Ð1åÐ6Ñ7Ô7ð ð
 $/µ7¸4ÐA_ÐacÑ3dÔ3dÐ3jÐhjÐ#kÐ ð (ð9•Ð3Ñ4Ô4Ð4åÐ7Ñ8Ô8ð ð $8Ð#7¸¼Ô8MÑ#NÔ#NÐ ðð ð ð ð ð ð ð ð
 !%× <Ò <ØØÝØ4ØØØ)ð	ñ ô ð ×6Ò6°~ÑFÔFØ#7ð !=ñ !ô !ð ð ð ð ð ð ˆKð ð Ø�tåØ*ØØØ%ð	ñ ô ð ð ,Ð+¨E¬LÔ,AÑBÔBˆØ×.Ò.Ø˜ t¸Nð /ñ 
ô 
ð 	
r*   c              ƒ  óN  ‡ ‡‡K  — ddl m} ddlm} ddlm} ddlm} |                     ¦   «          	                    ¦   «         }|r| 
                    ¦   «         ng }‰                      |j        ¦  «        Š|dz  Šdˆˆ ˆfd	„} |¦   «         }	 ||j        ||	|¬
¦  «        }
|
€d}
|
S )uv  Handle /memory â€” review pending memory writes + toggle the approval gate.

        Memory entries are small enough to review inline in a chat bubble, so
        the full pending/approve/reject/approval flow works on every platform.
        Gate changes persist to config.yaml and evict the cached agent so the
        new setting takes effect on the next message.
        r   rC  ©Úhandle_pending_subcommand©Úwrite_approval)Úload_on_disk_storer|  rÒ   rš  c                óÀ   •— ddl m}  |‰¦  «        }t          | ¦  «        |                     di ¦  «        d<   t	          ‰|¦  «         ‰                     ‰¦  «         d S )Nr   r«  Úmemoryrƒ  ©rÒ  r¬  rš  r
  r   rz   ©rÒ   r¬  rf  rñ  rF   rT   s      €€€r(   Ú_set_approvalzGGatewaySlashCommandsMixin._handle_memory_command.<locals>._set_approval  ór   ø€ ð ?Ð>Ð>Ð>Ð>Ð>Ø.Ð.¨{Ñ;Ô;ˆKÝEIÈ'Á]Ä]ˆK×"Ò" 8¨RÑ0Ô0Ð1AÑBÝ ¨[Ñ9Ô9Ð9à×$Ò$ [Ñ1Ô1Ð1Ð1Ð1r*   )Úmemory_storeÚset_mode_fnNzWUnknown /memory subcommand. Use: pending, approve <id>, reject <id>, approval <on|off>.©rÒ   rš  )r´   rD  Ú"hermes_cli.write_approval_commandsr�  Útoolsrƒ  Útools.memory_toolr„  r‡   r&   r  rj   ri   ÚMEMORY)rF   rJ   rD  r�  Úwar„  r)  rl  r‰  Ústorer5  rñ  rT   s   `          @@r(   Ú_handle_memory_commandz0GatewaySlashCommandsMixin._handle_memory_commandý  s  øøøè è € ð 	-Ð,Ð,Ð,Ð,Ð,ØPÐPÐPÐPÐPÐPØ.Ð.Ð.Ð.Ð.Ð.Ø8Ð8Ð8Ð8Ð8Ð8à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ#+Ð3ˆx�~Š~ÑÔÐ°ˆØ×2Ò2°5´<Ñ@Ô@ˆØ" ]Ñ2ˆð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð #Ð"Ñ$Ô$ˆà'Ð'ØŒI�t¨%¸]ð
ñ 
ô 
ˆð ˆ;ð5ˆCàˆ
r*   c              ƒ  óÀ  ‡ ‡‡K  — ddl m} ddlm} ddlm} |                     ¦   «                              ¦   «         }|r|                     ¦   «         ng }‰  	                    |j
        ¦  «        Š|dz  Š|                     |j        ¦  «        }t          |¦  «        o|d                              ¦   «         dv }|s"|s |                     |j        ¦  «        dk    rdS dˆˆ ˆfd
„}	 ||j        ||	¬¦  «        }
|
€dS |r_|d                              ¦   «         dk    rAt!          |
¦  «        dk    r.t!          |¦  «        dk    r|d         nd}|
dd…         d|› d�z   }
|
S )uf  Handle /skills on the gateway â€” pending skill-write review only.

        The full skills hub (search/browse/install) stays CLI-only; this
        handler covers the write-approval review surface (pending / approve /
        reject / diff / approval) so a skill staged from a gateway session can
        be reviewed from that same session. Gated by ``skills.write_approval``
        via the CommandDef's ``gateway_config_gate``; also answers when staged
        writes still exist after the gate was turned off (so they are never
        stranded).

        ``diff`` output is truncated for chat bubbles â€” the full diff lives in
        the pending JSON file under ``~/.hermes/pending/skills/``. (Note this is
        the write-approval ``diff <id>``; the CLI also has an unrelated
        ``hermes skills diff <name>`` that diffs a bundled skill vs stock.)
        r   rC  r€  r‚  r|  >   r   Úapprovalz�Skill write approval is off (skills.write_approval). Enable it with /skills approval on, then review staged writes here with /skills pending.rÒ   rš  c                óÀ   •— ddl m}  |‰¦  «        }t          | ¦  «        |                     di ¦  «        d<   t	          ‰|¦  «         ‰                     ‰¦  «         d S )Nr   r«  Úskillsrƒ  r‡  rˆ  s      €€€r(   r‰  zGGatewaySlashCommandsMixin._handle_skills_command.<locals>._set_approvalF  rŠ  r*   )rŒ  Nz’Unknown /skills subcommand on this platform. Use: pending, approve <id>, reject <id>, diff <id>, approval <on|off>. (Search/install are CLI-only.)r(  r;  rå   z<id>u:   
â€¦ (truncated â€” full diff in ~/.hermes/pending/skills/z.json)r�  )r´   rD  rŽ  r�  r�  rƒ  r‡   r&   r  rj   ri   Úwrite_approval_enabledÚSKILLSrš  rÑ   Úpending_countr  )rF   rJ   rD  r�  r’  r)  rl  Úgate_onÚwants_toggler‰  r5  Ú
pending_idrñ  rT   s   `           @@r(   Ú_handle_skills_commandz0GatewaySlashCommandsMixin._handle_skills_command&  sÚ  øøøè è € ð  	-Ð,Ð,Ð,Ð,Ð,ØPÐPÐPÐPÐPÐPØ.Ð.Ð.Ð.Ð.Ð.à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ#+Ð3ˆx�~Š~ÑÔÐ°ˆØ×2Ò2°5´<Ñ@Ô@ˆØ" ]Ñ2ˆà×+Ò+¨B¬IÑ6Ô6ˆÝ˜D‘z”zÐM d¨1¤g§m¢m¡o¤oÐ9MÐ&MˆØð 	9˜|ð 	9°×0@Ò0@ÀÄÑ0KÔ0KÈqÒ0PÐ0Pð8ð 8ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð (Ð'ØŒI�t¨ð
ñ 
ô 
ˆð ˆ;ð5ð 5ð ð 	E�D˜”G—M’M‘O”O vÒ-Ð-µ#°c±(´(¸T²/°/Ý$'¨¡I¤I°¢M M˜˜aœ˜°vˆJØ�u˜�u”:ðDØ1;ðDð Dð DñDˆCð ˆ
r*   c           
   ƒ  ó  ‡ ‡‡‡K  — ddl m}m} ddlm} |                     ¦   «                              ¦   «                              ¦   «         }‰                      |¦  «        \  }Š‰  	                    |j
        ¦  «        Š‰                      ‰¬¦  «        ‰ _         |¦   «         } ||¦  «        } ||¦  «        st          d¦  «        S ddˆ ˆfd„Š|r|dk    r›‰ j        dk    }	|	rt          d¦  «        nt          d¦  «        }
d ˆˆfd„}‰                      |‰t          d|
¬¦  «        dt          d¦  «        |	dœdt          d¦  «        |	 dœg|¬¦  «        ƒ d{V —†}|rdS t          d|
¬¦  «        S  ‰|‰¬¦  «        S )!uÞ   Handle /fast â€” mirror the CLI Priority Processing toggle in gateway chats.

        Session-scoped by default; ``--global`` persists agent.service_tier
        to config.yaml (parity with /model and /reasoning).
        r   )r  r  )Úmodel_supports_fast_moderA  zgateway.fast.not_supportedFr   r!   Úpersistrš  r    c                ó0  •— | dv rd}d}t          d¦  «        }n)| dv rd}d}t          d¦  «        }nt          d	| ¬
¦  «        S |‰_        |r�‰                     d|¦  «        r>‰                     ‰dd¬¦  «         ‰                     ‰¦  «         t          d|¬¦  «        S ‰                     ‰|¦  «         ‰                     ‰¦  «         t          d|¬¦  «        S ‰                     ‰|¦  «         ‰                     ‰¦  «         t          d|¬¦  «        S )z>Apply a /fast argument (typed or picked) and return the reply.>   rä  ÚfastÚpriorityr¤  zgateway.fast.label_fast>   r¦  ÚnormalNr¦  zgateway.fast.label_normalzgateway.fast.unknown_argrÈ  zagent.service_tierT)rn  zgateway.fast.savedrí  zgateway.fast.session_only)r   Ú_service_tierrT  Ú"_set_session_service_tier_overriderz   )r   r¢  ÚtierÚsaved_valuerî  rF   rT   s        €€r(   Ú_apply_fast_selectionzMGatewaySlashCommandsMixin._handle_fast_command.<locals>._apply_fast_selectionz  sY  ø€ à˜Ð&Ð&Ø!�Ø$�ÝÐ3Ñ4Ô4��ØÐ+Ð+Ð+Ø�Ø&�ÝÐ5Ñ6Ô6��åÐ3¸Ð?Ñ?Ô?Ð?Ø!%ˆDÔØð CØ×0Ò0Ð1EÀ{ÑSÔSð @à×;Ò;Ø# T°ð <ñ ô ð ð ×,Ò,¨[Ñ9Ô9Ð9ÝÐ1¸Ð?Ñ?Ô?Ð?ð ×7Ò7¸ÀTÑJÔJÐJØ×(Ò(¨Ñ5Ô5Ð5ÝÐ4¸EÐBÑBÔBÐBØ×3Ò3°KÀÑFÔFÐFØ×$Ò$ [Ñ1Ô1Ð1ÝÐ0¸Ð>Ñ>Ô>Ð>r*   rä  r¥  zgateway.fast.status_fastzgateway.fast.status_normalr�  c              “  ó"   •K  —  ‰|‰¬¦  «        S )N©r¢  rË   )r�  r   r«  ró  s     €€r(   Ú_on_fast_choicezGGatewaySlashCommandsMixin._handle_fast_command.<locals>._on_fast_choiceœ  s   øè è € Ø,Ð,¨U¸NÐKÑKÔKÐKr*   zgateway.fast.picker_title)r   r¤  zgateway.fast.choice_fastrd  r¦  zgateway.fast.choice_normalrs  Nzgateway.fast.statusr­  ©F)r   r!   r¢  rš  r    r!   rt  )r´   r  r  r$  r¡  r‡   r&   rÑ   ru  rj   ri   Ú_resolve_session_service_tierr§  r   rk  )rF   rJ   r  r  r¡  r)  rl  rf  r$  Úis_fasträ  r®  r}  r«  ró  rT   s   `            @@@r(   Ú_handle_fast_commandz.GatewaySlashCommandsMixin._handle_fast_commandc  sX  øøøøè è € ð 	MÐLÐLÐLÐLÐLÐLÐLØ>Ð>Ð>Ð>Ð>Ð>à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;ˆð  $×AÒAÀ(ÑKÔKÑˆˆnØ×2Ò2°5´<Ñ@Ô@ˆØ!×?Ò?Ø#ð @ñ 
ô 
ˆÔð +Ð*Ñ,Ô,ˆØ&Ð& {Ñ3Ô3ˆØ'Ð'¨Ñ.Ô.ð 	3ÝÐ1Ñ2Ô2Ð2ð	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð< ð 	9�t˜xÒ'Ð'ØÔ(¨JÒ6ˆGØ6=Ðb•QÐ1Ñ2Ô2Ð2Å1ÐEaÑCbÔCbˆFðLð Lð Lð Lð Lð Lð Lð !%× <Ò <ØØÝÐ3¸&ÐAÑAÔAð "(Ý!"Ð#=Ñ!>Ô!>Ø&-ðð ð "*Ý!"Ð#?Ñ!@Ô!@Ø*1 kðð ðð $3ð! !=ñ !ô !ð ð ð ð ð ð ˆKð$ ð Ø�tåÐ*°Ð8Ñ8Ô8Ð8à$Ð$ T°>ÐBÑBÔBÐBr*   c              ƒ  ó  K  — ddl m} ddlm} |                     ¦   «                              ¦   «         pd} || j        |j        ¦  «        }|r!|                     |j        j	        ¦  «        sdS  ||¦  «        }|j
        S )zAShow or persist the profile-wide dangerous-command approval mode.r   r¿   )Úrun_approval_mode_commandNz<Only gateway admins can change the persistent approval mode.)rÏ   rÀ   Úhermes_cli.approval_moder´  r‡   r&   r¦   ri   rÓ   r\   r  )rF   rJ   rÀ   r´  Ú	requestedrÚ   rÙ  s          r(   Ú_handle_approvals_commandz3GatewaySlashCommandsMixin._handle_approvals_command¸  s¦   è è € à:Ð:Ð:Ð:Ð:Ð:ØFÐFÐFÐFÐFÐFà×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4Ð<¸ˆ	ð #Ð" 4¤;°´Ñ=Ô=ˆØð 	R˜VŸ_š_¨U¬\Ô-AÑBÔBð 	RØQÐQØ*Ð*¨9Ñ5Ô5ˆð Œ~Ðr*   c              ƒ  ó  K  — ddl m}m}m} |                      |j        ¦  «        } ||¦  «        }|r' ||¦  «         t          t          d¦  «        ¦  «        S  ||¦  «         t          t          d¦  «        ¦  «        S )uP   Handle /yolo â€” toggle dangerous command approval bypass for this session only.r   )Údisable_session_yoloÚenable_session_yoloÚis_session_yolo_enabledzgateway.yolo.disabledzgateway.yolo.enabled)Útools.approvalr¹  rº  r»  rj   ri   r   r   )rF   rJ   r¹  rº  r»  rT   r¶  s          r(   Ú_handle_yolo_commandz.GatewaySlashCommandsMixin._handle_yolo_commandÉ  s·   è è € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×2Ò2°5´<Ñ@Ô@ˆØ)Ð)¨+Ñ6Ô6ˆØð 	=Ø Ð  Ñ-Ô-Ð-Ý!¥!Ð$;Ñ"<Ô"<Ñ=Ô=Ð=àÐ Ñ,Ô,Ð,Ý!¥!Ð$:Ñ";Ô";Ñ<Ô<Ð<r*   c              ƒ  ó�  K  — ddl m}m}m} |dz  } ||j        j        ¦  «        }	  |¦   «         }t          t          |dd¦  «        d¬¦  «        }n# t          $ r d}Y nw xY w|st          d¦  «        S g d	¢}	t          d
¦  «        t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        d	œ}
ddl
m}  |||dd¦  «        }||	vrd}|	                     |¦  «        dz   t          |	¦  «        z  }|	|         }	 d|vs(t          |                     d¦  «        t           ¦  «        si |d<   |d         }d|vs(t          |                     d¦  «        t           ¦  «        si |d<   ||d         vs.t          |d                              |¦  «        t           ¦  «        si |d         |<   ||d         |         d<   t#          ||¦  «         |
|         › d�t          d|¬¦  «        z   S # t          $ rB}t$                               d|¦  «         |
|         › d�t          d|¬¦  «        z   cY d}~S d}~ww xY w)u¸  Handle /verbose command â€” cycle tool progress display mode.

        Gated by ``display.tool_progress_command`` in config.yaml (default off).
        When enabled, cycles the tool progress mode through off â†’ new â†’ all â†’
        verbose â†’ off for the *current platform*.  The setting is saved to
        ``display.platforms.<platform>.tool_progress`` so each channel can
        have its own verbosity level independently.
        r   )rD  r  rm  r|  r¹   Útool_progress_commandFrN  zgateway.verbose.not_enabled)r¦  Únewrw  ÚverboseÚlogzgateway.verbose.mode_offzgateway.verbose.mode_newzgateway.verbose.mode_allzgateway.verbose.mode_verbosezgateway.verbose.mode_log)Úresolve_display_settingÚtool_progressrw  rå   rB  r±   zgateway.verbose.saved_suffixrX  z%Failed to save tool_progress mode: %szgateway.verbose.save_failedr6   N)r´   rD  r  rm  ri   rG   r   r   ry   r   Úgateway.display_configrÃ  Úindexr  r%   rE   r	  r   rw   rx   )rF   rJ   rD  r  rm  rñ  rU  rf  Úgate_enabledÚcycleÚdescriptionsrÃ  r¶  r  Únew_moder¹   rœ   s                    r(   Ú_handle_verbose_commandz1GatewaySlashCommandsMixin._handle_verbose_commandÚ  sô  è è € ð 	YÐXÐXÐXÐXÐXÐXÐXÐXÐXà" ]Ñ2ˆØ+Ð+¨E¬LÔ,AÑBÔBˆð	!Ø.Ð.Ñ0Ô0ˆKÝ*Ý˜ YÐ0GÑHÔHØðñ ô ˆLˆLøõ ð 	!ð 	!ð 	!Ø ˆLˆLˆLð	!øøøð ð 	4ÝÐ2Ñ3Ô3Ð3ð 8Ð7Ð7ˆåÐ/Ñ0Ô0ÝÐ/Ñ0Ô0ÝÐ/Ñ0Ô0ÝÐ7Ñ8Ô8ÝÐ/Ñ0Ô0ð
ð 
ˆð 	CÐBÐBÐBÐBÐBØ)Ð)¨+°|À_ÐV[Ñ\Ô\ˆØ˜%ÐÐØˆGØ�{Š{˜7Ñ#Ô# aÑ'­3¨u©:¬:Ñ5ˆØ˜”:ˆð	]Ø Ð+Ð+µ:¸k¿oºoÈiÑ>XÔ>XÕZ^Ñ3_Ô3_Ð+Ø)+�˜IÑ&Ø! )Ô,ˆGØ 'Ð)Ð)µ¸G¿KºKÈÑ<TÔ<TÕVZÑ1[Ô1[Ð)Ø')�˜Ñ$Ø 7¨;Ô#7Ð7Ð7½zÈ'ÐR]ÔJ^×JbÒJbÐcoÑJpÔJpÕrvÑ?wÔ?wÐ7Ø57�˜Ô$ \Ñ2ØBJˆG�KÔ  Ô.¨Ñ?Ý ¨[Ñ9Ô9Ð9à Ô)Ð-Ð-Ð-ÝÐ2¸\ÐJÑJÔJñKðøõ ð 	]ð 	]ð 	]Ý�NŠNÐBÀAÑFÔFÐFØ" 8Ô,Ð0Ð0Ð0µ1Ð5RÐZ[Ð3\Ñ3\Ô3\Ñ\Ð\Ð\Ð\Ð\Ð\Ð\øøøøð	]øøøs0   ¨*A ÁA"Á!A"ÄC*G9 Ç9
IÈ7I È:IÉ Ic              ƒ  óÔ  K  — ddl m}m}m}m} ddlm} |dz  } ||j        j        ¦  «        }d}		 t          |dd¦  «        pd 
                    ¦   «         }
|
                     d¦  «        rU|
                     dd	¦  «        }t          |¦  «        d	k    r,|d	          
                    ¦   «                              ¦   «         }	n# t          $ r d}	Y nw xY w	  |¦   «         }n(# t          $ r}t!          d
|¬¦  «        cY d}~S d}~ww xY w |||¦  «        }|	dv rc|d         rt!          d¦  «        nt!          d¦  «        }d                     |                     d¦  «        pg ¦  «        }t!          d|||¬¦  «        S |	dv rd}n&|	dv rd}n|	dk    r
|d          }nt!          d¦  «        S 	 t'          |                     d¦  «        t(          ¦  «        si |d<   |d         }t'          |                     d¦  «        t(          ¦  «        si |d<   ||d         d<   t+          ||¦  «         nC# t          $ r6}t,                               d|¦  «         t!          d|¬¦  «        cY d}~S d}~ww xY w|rt!          d¦  «        nt!          d¦  «        }d}|rJddlm}  | ||¦  «        pddd|                     d¦  «        pg d¢¬¦  «        }|rt!          d |¬!¦  «        }t!          d"||¬#¦  «        S )$u8  Handle /footer command â€” toggle the runtime-metadata footer.

        Usage:
            /footer           â†’ toggle on/off
            /footer on        â†’ enable globally
            /footer off       â†’ disable globally
            /footer status    â†’ show current state + fields

        The footer is saved to ``display.runtime_footer.enabled`` (global).
        Per-platform overrides under ``display.platforms.<platform>.runtime_footer``
        are respected but not modified here â€” edit config.yaml directly for
        per-platform control.
        r   )rD  r  rm  r  )Úresolve_footer_configr|  r#   r  NrC   rå   zgateway.config_read_failedr6   >   rä  rÁ   rÒ   zgateway.footer.state_onzgateway.footer.state_offrÉ   Úfieldszgateway.footer.status)r8  rÎ  rG   >   Ú1rä  Útruerå  T>   Ú0r¦  Úfalserç  Fzgateway.footer.usager¹   Úruntime_footerz)Failed to save runtime_footer.enabled: %szgateway.config_save_failed)Úformat_runtime_footer)r$  Úcontext_pctr  )r$  Úcontext_tokensr)  rÎ  zgateway.footer.example_line©rI  zgateway.footer.saved)r8  Úexample)r´   rD  r  rm  r  Úgateway.runtime_footerrÍ  ri   rG   rD   r&   r   r  r  rÑ   ry   r   r·   rE   r%   r	  r   rw   rx   rÔ  )rF   rJ   rD  r  rm  r  rÍ  rñ  rU  rÉ  rÿ   r=  rf  rœ   Ú	effectiver8  rÎ  Ú	new_stater¹   rØ  rÔ  rI  s                         r(   Ú_handle_footer_commandz0GatewaySlashCommandsMixin._handle_footer_command  sÓ  è è € ð 	qÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpØ@Ð@Ð@Ð@Ð@Ð@à" ]Ñ2ˆØ+Ð+¨E¬LÔ,AÑBÔBˆð ˆð	Ý˜E 9¨dÑ3Ô3Ð9°r×@Ò@ÑBÔBˆDØ�Š˜sÑ#Ô#ð 3ØŸ
š
 4¨Ñ+Ô+�Ý�u‘:”: ’>�>Ø œ(Ÿ.š.Ñ*Ô*×0Ò0Ñ2Ô2�CøøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøð	<Ø 4Ð 4Ñ 6Ô 6ˆKˆKøÝð 	<ð 	<ð 	<ÝÐ1¸Ð;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð	<øøøð *Ð)¨+°|ÑDÔDˆ	à�/Ð!Ð!Ø4=¸iÔ4HÐk•AÐ/Ñ0Ô0Ð0ÍaÐPjÑNkÔNkˆEØ—Y’Y˜yŸ}š}¨XÑ6Ô6Ð<¸"Ñ=Ô=ˆFÝØ'ØØØ%ð	ñ ô ð ð Ð/Ð/Ð/ØˆIˆIØÐ4Ð4Ð4ØˆIˆIØ�BŠYˆYØ% iÔ0Ð0ˆIˆIåÐ+Ñ,Ô,Ð,ð
	<Ý˜kŸošo¨iÑ8Ô8½$Ñ?Ô?ð ,Ø)+�˜IÑ&Ø! )Ô,ˆGÝ˜gŸkškÐ*:Ñ;Ô;½TÑBÔBð /Ø,.�Ð(Ñ)Ø3<ˆGÐ$Ô% iÑ0Ý ¨[Ñ9Ô9Ð9Ð9øÝð 	<ð 	<ð 	<Ý�NŠNÐFÈÑJÔJÐJÝÐ1¸Ð;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð	<øøøð 1:Ð\•Ð+Ñ,Ô,Ð,½qÐA[Ñ?\Ô?\ˆØˆØð 
	LàDÐDÐDÐDÐDÐDØ+Ð+Ø,Ð,¨[Ñ9Ô9ÐA¸TØ Ø#Ø —}’} XÑ.Ô.ÐQÐ2QÐ2QÐ2Qð	ñ ô ˆGð ð LÝÐ9À7ÐKÑKÔK�ÝÐ'¨u¸gÐFÑFÔFÐFsO   ²BC ÃCÃCÃ
C  Ã 
DÃ*D Ã:DÄ DÆ)A=H' È'
I'È1+I"ÉI'É"I'c              ƒ  ó<  K  — t          t          | dd¦  «        dd¦  «        s|                      |¦  «        ƒ d{V —†S ddlm} |                      |j        ¦  «        } ||¦  «        5  |                      |¦  «        ƒ d{V —†cddd¦  «         S # 1 swxY w Y   dS )u¼  Profile-scoping wrapper around manual /compress.

        Multiplexed gateways resolve credentials through the fail-closed
        per-profile secret scope (``agent.secret_scope``, Workstream A). The
        agent turn installs it via ``_run_agent``'s wrapper, but slash-command
        dispatch does not â€” so manual /compress reached the compressor's
        provider resolution unscoped and died with ``UnscopedSecretError``
        (``get_secret('OPENROUTER_BASE_URL') called with no profile secret
        scope active``). Install the source profile's scope around the whole
        handler, mirroring ``_run_agent``. Single-profile gateways skip this
        â€” zero behavior change.
        r¦   Nr§   Fr   r©   )rD   Ú_handle_compress_command_innerr´   rª   rµ   ri   )rF   rJ   rª   rº   s       r(   Ú_handle_compress_commandz2GatewaySlashCommandsMixin._handle_compress_commandp  s#  è è € õ •w˜t X¨tÑ4Ô4Ð6JÈEÑRÔRð 	DØ×<Ò<¸UÑCÔCÐCÐCÐCÐCÐCÐCÐCà6Ð6Ð6Ð6Ð6Ð6à×<Ò<¸U¼\ÑJÔJˆØ#Ð# LÑ1Ô1ð 	Dð 	DØ×<Ò<¸UÑCÔCÐCÐCÐCÐCÐCÐCð	Dð 	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Dð 	Ds   Á)BÂBÂBc              ƒ  ó–  ‡5‡6‡7‡8K  — |j         }| j                             |¦  «        ƒ d{V —†}| j                             |j        ¦  «        ƒ d{V —†}|rt          |¦  «        dk     rt          d¦  «        S ddlm}m	}m
}m}m}	 ddlm}
 |                     ¦   «         pd                     ¦   «         } ||¦  «        \  }}} ||¦  «        \  }}Š6d}|rt          d¦  «        }|s|S |rjdd	lm} d
„ |D ¦   «         } ||¦  «        Š5 |	|||‰6‰5¦  «        }d„ |d         D ¦   «         }|r|                     |¦  «         d                     |¦  «        S 	 ddlm} ddlm} dd	lm} |                      |¦  «        }ddlm}m}m} |j        r ||j        ¦  «        nd}|                      ||¬¦  «        \  }}|                      d¦  «        st          d¦  «        S d„ |D ¦   «         }g }|Š7|r |||¦  «        \  Š7}|sd}|Š7|�||d<   ||d<   d} tC          | j"        dd¦  «        }!tG          |!¦  «        rR	  |!|j        ¦  «        ƒ d{V —†} n:# tH          $ r-}"tJ           &                    d|j        |"d¬¦  «         Y d}"~"nd}"~"ww xY w |dDi |¤|ddddg|j        tC          | j"        d| j"        ¦  «        dœ¤ŽŠ8 |‰8| ¦  «         |‰8_        	 d„ ‰8_'        d‰8_(        tC          ‰8d d¦  «        pd}#tC          ‰8d!d¦  «        pd}$ |||#|$¬"¦  «        Š5‰8j)        }%|% *                    ‰7¦  «        sNt          d#¦  «         |
‰8d¬$¦  «         |  +                    |¦  «         |  ,                    ‰8d%¬&¦  «        ƒ d{V —† S |  -                    ˆ5ˆ6ˆ7ˆ8fd'„¦  «        ƒ d{V —†\  }&}'tC          ‰8d(d¦  «        }(|(du st]          |(t^          ¦  «        rPdd)lm0})  |)|(¦  «         |
‰8d¬$¦  «         |  +                    |¦  «         |  ,                    ‰8d%¬&¦  «        ƒ d{V —† S |r|r ||&|¦  «        }&‰8j        }*|*|j        k    }+tc          tC          ‰8d*d¦  «        ¦  «        },|+r}| j         2                    |*|&¦  «        ƒ d{V —†stg          d+|*› �¦  «        ‚|*|_        | j         4                    ¦   «         ƒ d{V —† tk          j6        | j7        ||d,¬-¦  «        ƒ d{V —† n|,rntJ           &                    d.¦  «         | j         8                    |j9        d¬/¦  «        ƒ d{V —†  |
‰8d¬$¦  «          ||&|#|$¬"¦  «        }- |||&‰5|-|%¬0¦  «        }.tc          tC          |%d1d¦  «        ¦  «        }/tC          |%d2d¦  «        }0|0rdd3l:m;}1  |1|0d¬4¦  «        }0tC          |%d5d¦  «        }2tC          |%d6d¦  «        }3 |
‰8d¬$¦  «         |  +                    |¦  «         |  ,                    ‰8d%¬&¦  «        ƒ d{V —† nD#  |
‰8d¬$¦  «         |  +                    |¦  «         |  ,                    ‰8d%¬&¦  «        ƒ d{V —† w xY wd7|.d8         › �g}‰6r$|                     t          d9‰6¬:¦  «        ¦  «         |                     |.d;         ¦  «         |.d<         r|                     |.d<         ¦  «         |/r'|                     t          d=|0pd>¬?¦  «        ¦  «         n)|2r'|                     t          d@|2|3pd>¬A¦  «        ¦  «         d                     |¦  «        S # tH          $ r6}4tJ           &                    dB|4¦  «         t          dC|4¬?¦  «        cY d}4~4S d}4~4ww xY w)Eab  Handle /compress command -- manually compress conversation context.

        Accepts an optional focus topic: ``/compress <focus>`` guides the
        summariser to preserve information related to *focus* while being
        more aggressive about discarding everything else.

        Also accepts the boundary-aware form ``/compress here [N]``:
        summarize everything except the most recent ``N`` exchanges
        (default 2), kept verbatim. Inspired by Claude Code's Rewind
        "Summarize up to here" action (v2.1.139, May 2026,
        https://code.claude.com/docs/en/whats-new/2026-w20).
        Né   zgateway.compress.not_enoughr   )Úextract_compress_flagsÚparse_partial_compress_argsÚrejoin_compressed_head_and_tailÚ"split_history_for_partial_compressÚsummarize_compress_preview)Ú0finalize_context_engine_compression_notificationr#   z'gateway.compress.aggressive_unsupported)Úestimate_request_tokens_roughc                ó¼   — g | ]Y}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|                      d ¦  «        |                      d¦  «        dœ‘ŒZS )r“  >   r”  r•  r–  )r“  r–  r—  r˜  s     r(   r  zLGatewaySlashCommandsMixin._handle_compress_command_inner.<locals>.<listcomp>¸  sg   € ð ð ð àØ—5’5˜‘=”=Ð$9Ð9Ð9¸a¿eºeÀIÑ>NÔ>NÐ9ð Ÿš˜v™œ°1·5²5¸Ñ3CÔ3CÐDÐDà9Ð9Ð9r*   c                ó   — g | ]}d |› �‘ŒS )õ   ðŸ—œï¸� rË   )rÌ   Úlines     r(   r  zLGatewaySlashCommandsMixin._handle_compress_command_inner.<locals>.<listcomp>Á  s!   € ÐCÐCÐC¨4Ð& Ð&Ð&ÐCÐCÐCr*   r¼   r±   )ÚAIAgent)Úsummarize_manual_compression)Ú_GATEWAY_HYGIENE_PLATFORMrm  Ú_seed_hygiene_system_prompt)ri   rT   rƒ  zgateway.compress.no_providerc                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )r“  >   r  r”  r•  r—  r˜  s     r(   r  zLGatewaySlashCommandsMixin._handle_compress_command_inner.<locals>.<listcomp>ç  s8   € ð ð ð ØØ—5’5˜‘=”=Ð$AÐAÐAð ØAÐAÐAr*   FrG   Úgateway_session_keyrI  z¡Manual compression could not restore the system prompt for session %s: %s. Preserving an empty prompt so the live turn rebuilds it with its configured providers.Trb   r†  Ú_db)r$  Úmax_iterationsÚ
quiet_modeÚskip_memoryÚenabled_toolsetsrS   Ú
session_dbc                 ó   — d S r0  rË   )ÚaÚkws     r(   rà  zJGatewaySlashCommandsMixin._handle_compress_command_inner.<locals>.<lambda>,  s   € °t€ r*   Ú_cached_system_promptr�  )rM  r�  zgateway.compress.nothing_to_do)Ú	committedzmanual compression)Úcontextc                 ó:   •— ‰                      ‰d‰ ‰dd¬¦  «        S )Nr#   T)Úapprox_tokensÚfocus_topicÚforceÚ!defer_context_engine_notification)Ú_compress_context)r   r  r#  Ú	tmp_agents   €€€€r(   rà  zJGatewaySlashCommandsMixin._handle_compress_command_inner.<locals>.<lambda>G  s.   ø€ ˜I×7Ò7ØØØ&3Ø$/Ø"Ø:>ð 8ñ ô € r*   Ú _compression_skipped_due_to_lock)Údescribe_compression_lock_skipÚ_last_compaction_in_placez4failed to persist compressed transcript for session zcompress-commandrN   u§   Manual /compress: session rotation did not occur (session_id unchanged) and in-place mode is off â€” preserving original transcript instead of overwriting it (#44794).)r(  )Úcompression_stateÚ_last_compress_abortedÚ_last_summary_error)Úredact_sensitive_text)r  Ú_last_aux_model_failure_modelÚ_last_aux_model_failure_errorrë  r�  zgateway.compress.focus_line)ÚtopicÚ
token_linerA  zgateway.compress.abortedzunknown errorr6   zgateway.compress.aux_failed)r$  r7   zManual compress failed: %szgateway.compress.failedrË   )<ri   r?   r†   rž  rS   r  r   Úhermes_cli.partial_compressrâ  rã  rä  rå  ræ  Úagent.conversation_compressionrç  r‡   r&   r›  rè  rØ   r·   Ú	run_agentrí  Ú!agent.manual_compression_feedbackrî  rj   r´   rï  rm  rð  rG   Ú_resolve_session_agent_runtimerE   rD   rˆ   r°  ry   rw   rx   Ú	_print_fnÚ_end_session_on_closer'  Úhas_content_to_compressrz   Ú!_cleanup_agent_resources_off_looprs   r%   r!   r  rš  r`  r~  Ú_saverq   rƒ   Ú_sync_telegram_topic_bindingÚupdate_sessionrT   Úagent.redactr  )9rF   rJ   ri   rU  r§  râ  rã  rä  rå  ræ  rç  Ú	_raw_argsÚ_previewÚ_aggressiveÚpartialÚ	keep_lastÚ	_agg_noterè  Ú_pv_msgsÚreportr¼   rí  rî  rT   rï  rm  rð  rU  r$  Úruntime_kwargsr¨  rº  rZ  rI  r  Ú_sys_promptÚ_toolsÚ
compressorÚ
compressedrD  Ú_lock_skippedr  r[   ÚrotatedÚ	_in_placeÚ
new_tokensÚsummaryÚ_summary_abortedÚ_summary_errr  Ú_aux_fail_modelÚ_aux_fail_errrœ   r   r  r#  r  s9                                                        @@@@r(   rÞ  z8GatewaySlashCommandsMixin._handle_compress_command_inner†  s$  øøøøè è € ð ”ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ0×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZˆàð 	4�#˜g™,œ,¨Ò*Ð*ÝÐ2Ñ3Ô3Ð3ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×+Ò+Ñ-Ô-Ð3°×:Ò:Ñ<Ô<ˆ	ð ,BÐ+AÀ)Ñ+LÔ+LÑ(ˆ	�8˜[Ø*EÐ*EÀiÑ*PÔ*PÑ'ˆ�˜Kàˆ	Øð 	!õ ÐCÑDÔDˆIØð !Ø Ð àð 	$àJÐJÐJÐJÐJÐJðð à ðñ ô ˆHð
 :Ð9¸(ÑCÔCˆMØ/Ð/Ø˜' 9¨k¸=ñô ˆFð DÐC°6¸'´?ÐCÑCÔCˆEØð (Ø—’˜YÑ'Ô'Ð'Ø—9’9˜UÑ#Ô#Ð#ðh	9Ø)Ð)Ð)Ð)Ð)Ð)ØVÐVÐVÐVÐVÐVØJÐJÐJÐJÐJÐJà×6Ò6°vÑ>Ô>ˆKðð ð ð ð ð ð ð ð ð ð :@¼ÐRÐ$Ð$ V¤_Ñ5Ô5Ð5Èdð ð %)×$GÒ$GØØ'ð %Hñ %ô %Ñ!ˆE�>ð "×%Ò% iÑ0Ô0ð 9ÝÐ7Ñ8Ô8Ð8ðð Ø"ðñ ô ˆDð ˆDØˆDØð  Ø?Ð?ÀÀiÑPÔP‘
��dØð  à#�GØ�Dð Ð'Ø-9�˜zÑ*Ø4?ˆNÐ0Ñ1ð
 ˆKÝ! $Ô"2°MÀ4ÑHÔHˆKÝ˜Ñ$Ô$ð ð
Ø(3¨°MÔ4LÑ(MÔ(MÐ"MÐ"MÐ"MÐ"MÐ"MÐ"M�K�KøÝ ð ð ð Ý—N’NðOð &Ô0ØØ!%ð #ñ ô ð ð ð ð ð ð øøøøðøøøð  ˜ð 	ð 	Ø ð	àØ ØØ Ø"* Ø(Ô3Ý" 4Ô#3°U¸DÔ<LÑMÔMð	ð 	ð 	ð 	ˆIð (Ð'¨	°;Ñ?Ô?Ð?ð
 ";ˆIÔðjØ&;Ð&;�	Ô#ð 38�	Ô/õ & iÐ1HÈ"ÑMÔMÐSÐQS�Ý  ¨G°TÑ:Ô:ÐB¸d�Ø =Ð =Ø¨¸6ð!ñ !ô !�ð 'Ô9�
Ø!×9Ò9¸$Ñ?Ô?ð ?ÝÐ=Ñ>Ô>ðR AÐ@ØØ#ðñ ô ð ð ×(Ò(¨Ñ5Ô5Ð5ð ×<Ò<ØÐ';ð =ñ ô ð ð ð ð ð ð ð ð ð[ '+×&HÒ&Hðð ð ð ð ð ð ñ	'ô 	'ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!‘�
˜Aõ& !(¨	Ð3UÐW[Ñ \Ô \�Ø  DÐ(Ð(­J°}ÅcÑ,JÔ,JÐ(ðð ð ð ð ð ð :Ð9¸-ÑHÔHðR AÐ@ØØ#ðñ ô ð ð ×(Ò(¨Ñ5Ô5Ð5ð ×<Ò<ØÐ';ð =ñ ô ð ð ð ð ð ð ð ð ðg ð S˜tð SØ!@Ð!@ÀÈTÑ!RÔ!R�Jð "+Ô!5�Ø(¨MÔ,DÒD�Ý ¥¨Ð4OÐQVÑ!WÔ!WÑXÔX�	ð< ð Ø!%Ô!9×!LÒ!LØ&¨
ñ"ô "ð ð ð ð ð ð ð õ +ð8Ø'5ð8ð 8ñô ð ð 0>�MÔ,ØÔ2×8Ò8Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ý!Ô+ØÔ9Ø Ð6Hðñ ô ð ð ð ð ð ð ð ð ð ð 
ð å—N’Nð'ñô ð ð Ô.×=Ò=Ø!Ô-À!ð >ñ ô ð ð ð ð ð ð ð ð AÐ@ØØ"ðñ ô ð ð ;Ð:Ø¨kÀðñ ô �
ð 7Ð6ØØØ!ØØ&0ðñ ô �õ $(­°
Ð<TÐV[Ñ(\Ô(\Ñ#]Ô#]Ð Ý& zÐ3HÈ$ÑOÔO�ð  ð SØBÐBÐBÐBÐBÐBØ#8Ð#8¸ÈTÐ#RÑ#RÔ#R�Lõ #*¨*Ð6UÐW[Ñ"\Ô"\�Ý '¨
Ð4SÐUYÑ ZÔ Z�à@Ð@ØØ#ðñ ô ð ð ×(Ò(¨Ñ5Ô5Ð5ð ×<Ò<ØÐ';ð =ñ ô ð ð ð ð ð ð ð ð øð AÐ@ØØ#ðñ ô ð ð ×(Ò(¨Ñ5Ô5Ð5ð ×<Ò<ØÐ';ð =ñ ô ð ð ð ð ð ð ð ð øøøð 6 ¨
Ô 3Ð5Ð5Ð6ˆEØð RØ—’�QÐ<ÀKÐPÑPÔPÑQÔQÐQØ�LŠL˜ Ô.Ñ/Ô/Ð/Ø�vŒð .Ø—’˜W Vœ_Ñ-Ô-Ð-Øð Ø—’ÝØ2Ø+Ð>¨ðñ ô ñô ð ð ð !ð Ø—’ÝØ5Ø-Ø,Ð?°ðñ ô ñô ð ð —9’9˜UÑ#Ô#Ð#øÝð 	9ð 	9ð 	9Ý�NŠNÐ7¸Ñ;Ô;Ð;ÝÐ.°aÐ8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøs‡   ÅB\ ÇA\ È8I É\ É
JÉ#JÉ<\ ÊJÊA\ ËA-W- Ì;?\ Í;AW- Ï?\ ÐFW- Ö-A \ ×-AX.Ø.C\ Ü
]Ü+]Ü=]Ý]r#   rl  c              ƒ  ó¦  K  — |j         }|j        t          j        k    s|j        dk    rt          d¦  «        S | j        sddlm}  |t          d¦  «        ¬¦  «        S t          | dd¦  «        }t          |¦  «        rH	  ||¦  «        st          d	¦  «        S n,# t          $ r t                               d
d¬¦  «         Y nw xY w|                     ¦   «                              ¦   «         }|                     ¦   «         dv r|                      ¦   «         S |                     ¦   «         dv r|                      |¦  «        ƒ d{V —†S |r2|j        st          d¦  «        S |                      ||¦  «        ƒ d{V —†S |                      |¦  «        ƒ d{V —†}|                     d¦  «        r¬|                     d¦  «        du r?|                      |¦  «        r|                      |¦  «        ƒ d{V —† t          d¦  «        S |                     d¦  «        du r?|                      |¦  «        r|                      |¦  «        ƒ d{V —† t          d¦  «        S 	 | j                             t5          |j        ¦  «        t5          |j        ¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        ƒ d{V —† nB# t          $ r5}t                               d¦  «         t          d|¬¦  «        cY d}~S d}~ww xY w|j        s|                      |¦  «        ƒ d{V —† |j        �r	 | j                             t5          |j        ¦  «        t5          |j        ¦  «        ¬¦  «        ƒ d{V —†}n.# t          $ r! t                               dd¬¦  «         d}Y nw xY w|r}t5          |                     d¦  «        pd¦  «        }	d}
	 | j                              |	¦  «        ƒ d{V —†}
n# t          $ r d}
Y nw xY w|
pt          d¦  «        }t          d||	¬ ¦  «        S t          d!¦  «        S |  !                    |¦  «        ƒ d{V —†S )"z:Handle /topic for Telegram DM user-managed topic sessions.rÂ   zgateway.topic.not_telegram_dmr   ©Úformat_session_db_unavailableú,gateway.shared.session_db_unavailable_prefix©r@  r'  Nzgateway.topic.unauthorizedzTopic auth check failedTrb   >   ú-hú--helprÇ   rÁ   >   r¦  rm  rç  z!gateway.topic.restore_needs_topicÚcheckedÚhas_topics_enabledFzgateway.topic.topics_disabledÚallows_users_to_create_topicsz$gateway.topic.topics_user_disallowed)ré   r\   r<  r=  z$Failed to enable Telegram topic modezgateway.topic.enable_failedr6   )ré   rê   z%Failed to read Telegram topic bindingrS   r#   zgateway.topic.untitled_sessionzgateway.topic.bound_status)rî  rS   zgateway.topic.thread_ready)"ri   rG   r   rn  rÐ   r   rˆ   r‰   r6  rD   r°  ry   rw   rŽ   r‡   r&   rÑ   Ú_telegram_topic_help_textÚ%_disable_telegram_topic_mode_for_chatrê   Ú_restore_telegram_topic_sessionÚ _get_telegram_topic_capabilitiesrE   Ú%_should_send_telegram_capability_hintÚ _send_telegram_topic_setup_imageÚenable_telegram_topic_moder!   ré   r\   Ú	exceptionÚ_ensure_telegram_system_topicÚget_telegram_topic_bindingrH  Ú#_telegram_topic_root_status_message)rF   rJ   rl  ri   r6  Úauth_fnrÄ  r  ÚbindingrS   ra   Úsession_labels               r(   Ú_handle_topic_commandz/GatewaySlashCommandsMixin._handle_topic_commandð  sy  è è € à”ˆØŒ?�hÔ/Ò/Ð/°6Ô3CÀtÒ3KÐ3KÝÐ4Ñ5Ô5Ð5ØÔð 	kØBÐBÐBÐBÐBÐBØ0Ð0½Ð:hÑ8iÔ8iÐjÑjÔjÐjõ ˜$Ð 5°tÑ<Ô<ˆÝ�GÑÔð 	GðGØ�w˜v‘”ð ;ÝÐ9Ñ:Ô:Ð:ð;øåð Gð Gð GÝ—’Ð6À�ÑFÔFÐFÐFÐFðGøøøð ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆð �:Š:‰<Œ<Ð8Ð8Ð8Ø×1Ò1Ñ3Ô3Ð3ð �:Š:‰<Œ<Ð5Ð5Ð5Ø×CÒCÀFÑKÔKÐKÐKÐKÐKÐKÐKÐKàð 	KØÔ#ð >ÝÐ<Ñ=Ô=Ð=Ø×=Ò=¸eÀTÑJÔJÐJÐJÐJÐJÐJÐJÐJà!×BÒBÀ6ÑJÔJÐJÐJÐJÐJÐJÐJˆØ×Ò˜IÑ&Ô&ð 
	AØ×ÒÐ 4Ñ5Ô5¸Ð>Ð>ð ×=Ò=¸fÑEÔEð HØ×?Ò?ÀÑGÔGÐGÐGÐGÐGÐGÐGÐGÝÐ8Ñ9Ô9Ð9Ø×ÒÐ ?Ñ@Ô@ÀEÐIÐIØ×=Ò=¸fÑEÔEð HØ×?Ò?ÀÑGÔGÐGÐGÐGÐGÐGÐGÐGÝÐ?Ñ@Ô@Ð@ð		?ØÔ"×=Ò=Ý˜FœNÑ+Ô+Ý˜FœNÑ+Ô+Ø#/×#3Ò#3Ð4HÑ#IÔ#IØ.:×.>Ò.>Ð?^Ñ._Ô._ð	 >ñ ô ð ð ð ð ð ð ð ð øõ ð 	?ð 	?ð 	?Ý×ÒÐCÑDÔDÐDÝÐ2¸#Ð>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð	?øøøð Ôð 	=Ø×4Ò4°VÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<àÔñ 	3ðØ $Ô 0× KÒ KÝ ¤Ñ/Ô/Ý! &Ô"2Ñ3Ô3ð !Lñ !ô !ð ð ð ð ð ð ��øõ ð ð ð Ý—’ÐDÈt�ÑTÔTÐTØ���ðøøøð ð Ý  §¢¨\Ñ!:Ô!:Ð!@¸bÑAÔA�
Ø�ð!Ø"&Ô"2×"DÒ"DÀZÑ"PÔ"PÐPÐPÐPÐPÐPÐP�E�EøÝ ð !ð !ð !Ø �E�E�Eð!øøøà %Ð L­Ð+KÑ)LÔ)L�ÝØ0Ø'Ø)ðñ ô ð õ
 Ð1Ñ2Ô2Ð2à×=Ò=¸fÑEÔEÐEÐEÐEÐEÐEÐEÐEsV   Â B Â&CÃCÉA.K Ë
LË*LË<LÌLÌ5AM< Í<(N'Î&N'Ï O4 Ï4PÐPc              ƒ  óâ  K  — |j         }| j                             |¦  «        ƒ d{V —†}|j        }| j        sddlm}  |t          d¦  «        ¬¦  «        S | j                             |¦  «        ƒ d{V —†}|€_	 | j         	                    ||j
        r|j
        j        nd|j        |j        |j        |j        ¬¦  «        ƒ d{V —† n# t           $ r Y nw xY w|                     ¦   «                              ¦   «         }|�r+	 ddlm} |                     |¦  «        }	n(# t*          $ r}
t          d	|
¬
¦  «        cY d}
~
S d}
~
ww xY w|	st          d¦  «        S 	 | j                             ||	¦  «        ƒ d{V —†r|t/          | dd¦  «        }t1          |¦  «        rK	 t3          j        ||||	¦  «        ƒ d{V —† n,# t           $ r t6                               dd¬¦  «         Y nw xY wt          d|	¬¦  «        S t          d¦  «        S # t*          $ r}
t          d	|
¬
¦  «        cY d}
~
S d}
~
ww xY w| j                             |¦  «        ƒ d{V —†}|rt          d||¬¦  «        S t          d|¬¦  «        S )uB   Handle /title command â€” set or show the current session's title.Nr   r5  r7  r8  rû  )rS   ri   r\   ré   rÐ   rê   r^   zgateway.shared.warn_passthroughr6   zgateway.title.empty_after_cleanÚ%_schedule_telegram_topic_title_renamez+Failed to rename Telegram topic from /titleTrb   zgateway.title.set_tor`   zgateway.title.not_foundz gateway.title.current_with_title)rS   ra   zgateway.title.current_no_titler4  )ri   r?   r†   rS   rˆ   r‰   r6  r   rH  Úcreate_sessionrG   r   r\   ré   rÐ   rê   ry   r‡   r&   r_   rŠ   r/   r‹   rD   r°  rq   rƒ   rw   rŽ   )rF   rJ   ri   rU  rS   r6  Úexisting_titleÚ	title_argr_   r›   rœ   Úschedule_renamera   s                r(   Ú_handle_title_commandz/GatewaySlashCommandsMixin._handle_title_commandI  s’  è è € à”ˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØ"Ô-ˆ
àÔð 	kØBÐBÐBÐBÐBÐBØ0Ð0½Ð:hÑ8iÔ8iÐjÑjÔjÐjð  $Ô/×AÒAÀ*ÑMÔMÐMÐMÐMÐMÐMÐMˆØÐ!ðØÔ&×5Ò5Ø)Ø4:´OÐR˜6œ?Ô0Ð0ÈØ"œNð #œNØ$Ô.Ø$Ô.ð 6ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øõ ð ð ð Ø�ðøøøð ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4ˆ	Øñ '	RðEØ2Ð2Ð2Ð2Ð2Ð2Ø%×4Ò4°YÑ?Ô?�	�	øÝð Eð Eð EÝÐ:À!ÐDÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøàð <ÝÐ:Ñ;Ô;Ð;ðEØÔ)×;Ò;¸JÈ	ÑRÔRÐRÐRÐRÐRÐRÐRð 8õ '.ØÐEÀtñ'ô '�Oõ   Ñ0Ô0ð ðÝ")Ô"3°OÀVÈZÐYbÑ"cÔ"cÐcÐcÐcÐcÐcÐcÐcÐcøÝ(ð ð ð Ý"ŸLšLØ MØ)-ð )ñ ô ð ð ð ðøøøõ
 Ð3¸9ÐEÑEÔEÐEåÐ6Ñ7Ô7Ð7øÝð Eð Eð EÝÐ:À!ÐDÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøð Ô*×<Ò<¸ZÑHÔHÐHÐHÐHÐHÐHÐHˆEØð RÝÐ;È
ÐZ_Ð`Ñ`Ô`Ð`åÐ9ÀjÐQÑQÔQÐQsz   Á:AC Ã
CÃCÄD Ä
EÄ(D>Ä8EÄ>EÅAH ÆF8 Æ7H Æ8&G!ÇH Ç G!Ç!H Ç5H È
H)ÈH$ÈH)È$H)c           	   ƒ  ó�  ‡ ‡‡‡K  — ‰ j         sddlm}  |t          d¦  «        ¬¦  «        S t	          j        ‰ j        |j        ¦  «        ƒ d{V —†Š‰                      ‰¦  «        Š| 	                    ¦   «          
                    ¦   «         }	 t          j        |¦  «        }n(# t          $ r}t          d|¬¦  «        cY d}~S d}~ww xY wd|v Šd	|v }d
                     d„ |D ¦   «         ¦  «         
                    ¦   «         }t          |¦  «        dk    r||d         dk    r|d         dk    sH|d         dk    r|d         dk    s0|d         dk    r|d         dk    s|d         dk    r(|d         dk    r|dd…          
                    ¦   «         }dHˆˆ ˆˆfd„}|�sË	  |¦   «         ƒ d{V —†}	ˆˆ ˆfd„|	D ¦   «         ƒ d{V —†}	|	s5‰j        t"          j        k    r‰st          d¦  «        S t          d¦  «        S t          d¦  «        g}
t'          |	dd…         d¬¦  «        D ]É\  }}|d         }‰j        t"          j        k    rN‰rL‰                      t+          |                     d¦  «        pd ¦  «        ¦  «        }|r|› d!|j        p|j        › �}|                     d"d ¦  «        dd#…         }|rt          d$|¬%¦  «        nd }|
                     t          d&|||¬'¦  «        ¦  «         ŒÊ|
                     t          d(¦  «        ¦  «         d)                     |
¦  «        S # t4          $ r6}t6                               d*|¦  «         t          d+|¬¦  «        cY d}~S d}~ww xY w|                     ¦   «         rÜ	  |¦   «         ƒ d{V —†}	ˆˆ ˆfd,„|	D ¦   «         ƒ d{V —†}	nC# t4          $ r6}t6                               d-|¦  «         t          d+|¬¦  «        cY d}~S d}~ww xY wt=          |¦  «        }|dk     s|t          |	¦  «        k    rt          d.|¬/¦  «        S |	|dz
           }|                     d¦  «        }|                     d¦  «        p|}nK‰ j                              |¦  «        ƒ d{V —†}|r	|d         }n ‰ j                               |¦  «        ƒ d{V —†}|st          d0|¬1¦  «        S 	 ‰ j          !                    |¦  «        ƒ d{V —†}n3# t4          $ r&}t6                               d2||¦  «         Y d}~nd}~ww xY w‰j        t"          j        k    r_‰                      |¦  «        }‰  "                    ‰|¦  «        s3|s1|€t          d3|¬1¦  «        S t          d4|j        p|j        |¬5¦  «        S n1‰  #                    ‰|‰p|¬6¦  «        ƒ d{V —†st          d7|¬1¦  «        S ‰ j$         %                    ‰¦  «        ƒ d{V —†}|j&        |k    rt          d8|¬1¦  «        S ‰  '                    ‰¦  «         ‰ j$         (                    ‰|¦  «        ƒ d{V —†}|st          d9¦  «        S ‰  )                    ‰d:¬;¦  «         ‰  *                    ‰¦  «         ‰ j          +                    |¦  «        ƒ d{V —†p|}‰ j$         ,                    |¦  «        ƒ d{V —†}|rt          d<„ |D ¦   «         ¦  «        nd}|rd=|› d>|dk    rd?nd › d@�nd }‰j        t"          j        k    r!|rt          dA|‰j        p‰j        |¬B¦  «        S |st          dC|¬D¦  «        S |dk    rt          dE||¬F¦  «        S t          dG||¬F¦  «        S )Iu@   Handle /resume command â€” list or switch to a previous session.r   r5  r7  r8  Núgateway.resume.parse_errorr6   r"  ú--cross-roomrê  c              3  ó"   K  — | ]
}|d v¯|V — ŒdS )>   r"  rV  NrË   r  s     r(   rÎ   zCGatewaySlashCommandsMixin._handle_resume_command.<locals>.<genexpr>¢  s-   è è € ÐOÐO˜a¨AÐ5NÐ,NÐ,N˜Ð,NÐ,NÐ,NÐ,NÐOÐOr*   ræ   Ú<rY  Ú>Ú[Ú]ú"ú'rå   r    ú
list[dict]c               “  óÖ   •K  — ‰j         r‰j         j        nd } ‰o‰                     ‰¦  «        }‰j                             | |rd n‰d¬¦  «        ƒ d {V —†}d„ |D ¦   «         d d…         S )Né
   )ri   rT   Úlimitc                ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS r`   r—  )rÌ   rú  s     r(   r  zcGatewaySlashCommandsMixin._handle_resume_command.<locals>._list_titled_sessions.<locals>.<listcomp>¶  s'   € Ð:Ð:Ð:˜!¨1¯5ª5°©>¬>Ð:�AÐ:Ð:Ð:r*   )rG   r   rÄ  rˆ   Úlist_sessions_rich)Úuser_sourceÚwidenÚsessionsrÔ  rF   rT   ri   s      €€€€r(   Ú_list_titled_sessionszOGatewaySlashCommandsMixin._handle_resume_command.<locals>._list_titled_sessions®  s¢   øè è € Ø39´?ÐL˜&œ/Ô/Ð/ÈˆKØÐF $×">Ò">¸vÑ"FÔ"FˆEØ!Ô-×@Ò@Ø"Ø$)Ð:˜D˜D¨{Øð Añ ô ð ð ð ð ð ð ˆHð
 ;Ð:˜xÐ:Ñ:Ô:¸3¸B¸3Ô?Ð?r*   c              “  óR   •K  — g | ]!}‰                      ‰|‰¦  «        ƒ d {V —†¯|‘Œ"S r0  ©rÙ  ©rÌ   rú  rÔ  rF   ri   s     €€€r(   r  zDGatewaySlashCommandsMixin._handle_resume_command.<locals>.<listcomp>¼  óW   øè è € ð ð ð ØØ!×5Ò5°f¸aÀÑKÔKÐKÐKÐKÐKÐKÐKðØðð ð r*   z'gateway.resume.matrix_no_named_sessionsz gateway.resume.no_named_sessionszgateway.resume.list_headerr`  )Ústartra   rÖ  r#   u    â€” rI  é(   z"gateway.resume.list_preview_suffixr×  z!gateway.resume.list_item_numbered)rÆ  ra   Úpreview_partz#gateway.resume.list_footer_numberedr±   z"Failed to list titled sessions: %szgateway.resume.list_failedc              “  óR   •K  — g | ]!}‰                      ‰|‰¦  «        ƒ d {V —†¯|‘Œ"S r0  ri  rj  s     €€€r(   r  zDGatewaySlashCommandsMixin._handle_resume_command.<locals>.<listcomp>Ø  rk  r*   z5Failed to list titled sessions for numeric resume: %szgateway.resume.out_of_range)rÆ  zgateway.resume.not_foundrO  z0Failed to resolve resume continuation for %s: %sz'gateway.resume.matrix_blocked_no_originz(gateway.resume.matrix_blocked_other_room)r?  r.  r×  z gateway.resume.blocked_not_ownerzgateway.resume.already_onzgateway.resume.switch_failedr:  rN   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©r“  r”  r—  r˜  s     r(   r  zDGatewaySlashCommandsMixin._handle_resume_command.<locals>.<listcomp>)  ó,   € ÐGÐGÐG˜q¨q¯uªu°V©}¬}ÀÒ/FÐ/F˜Ð/FÐ/FÐ/Fr*   rÆ   z messagerú  r8  z(gateway.resume.matrix_cross_room_success)ra   r?  Úmsg_partzgateway.resume.resumed_no_countr`   zgateway.resume.resumed_one)ra   r:  zgateway.resume.resumed_many)r    r^  )-rˆ   r‰   r6  r   rq   rƒ   r%  ri   rj   r‡   r&   rý   r  r/   r·   r  rG   r   rP  r  rµ  r!   rE   rS  ré   rØ   ry   rw   rŽ   Úisdigitr+   rI  Úresolve_session_by_titleÚresolve_resume_session_idr¸  rÓ  r?   r†   rS   rl   Úswitch_sessionr{   rz   rH  rž  )rF   rJ   r6  r)  r=  r  Úallow_cross_roomr.  rg  Útitledr¼   r  rú  ra   r®  rI  rn  rœ   rÆ  r>  rÅ  r$  Útarget_originÚcurrent_entryr•   r§  Ú	msg_countrs  rÔ  rT   ri   s   `                           @@@r(   Ú_handle_resume_commandz0GatewaySlashCommandsMixin._handle_resume_command‘  s¾	  øøøøè è € àÔð 	kØBÐBÐBÐBÐBÐBØ0Ð0½Ð:hÑ8iÔ8iÐjÑjÔjÐjåÔ(ØÔ2°E´Lñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×2Ò2°6Ñ:Ô:ˆØ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆð	>Ý”K Ñ)Ô)ˆEˆEøÝð 	>ð 	>ð 	>ÝÐ1¸Ð=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøà˜uÐ$ˆ	Ø)¨UÐ2ÐØ�xŠxÐOÐO 5ÐOÑOÔOÑOÔO×UÒUÑWÔWˆõ ˆt‰9Œ9˜Š>ˆ>Ø�!ŒW˜Š^ˆ^  R¤¨C¢ Ø�Q”˜3’� 4¨¤8¨s¢? ?Ø�Q”˜3’� 4¨¤8¨s¢? ?Ø�Q”˜3’� 4¨¤8¨s¢? ?à˜˜"˜”:×#Ò#Ñ%Ô%ˆDð	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð ñ 	@ð@Ø4Ð4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6�ðð ð ð ð ð Ø%ðñ ô ð ð ð ð ð ð �ð ð AØ”­(¬/Ò9Ð9À)Ð9Ý Ð!JÑKÔKÐKÝÐ?Ñ@Ô@Ð@ÝÐ7Ñ8Ô8Ð9�Ý'¨¨s°¨s¬¸1Ð=Ñ=Ô=ð |ð |‘F�C˜Ø˜gœJ�EØ”­(¬/Ò9Ð9¸iÐ9Ø!%×!DÒ!DÅSÈÏÊÈtÉÌÐIZÐXZÑE[ÔE[Ñ!\Ô!\˜Ø!ð XØ',Ð$WÐ$W°6Ô3CÐ3UÀvÄ~Ð$WÐ$W˜EØŸeše I¨rÑ2Ô2°3°B°3Ô7�GØ_fÐ#n¥1Ð%IÐSZÐ#[Ñ#[Ô#[Ð#[Ðln�LØ—L’L¥Ð#FÈcÐY^ÐmyÐ!zÑ!zÔ!zÑ{Ô{Ð{Ð{Ø—’�QÐDÑEÔEÑFÔFÐFØ—y’y Ñ'Ô'Ð'øÝð @ð @ð @Ý—’ÐAÀ1ÑEÔEÐEÝÐ5¸QÐ?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð@øøøð
 �<Š<‰>Œ>ð 	Rð@Ø4Ð4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6�ðð ð ð ð ð Ø%ðñ ô ð ð ð ð ð ð ��øõ ð @ð @ð @Ý—’ÐTÐVWÑXÔXÐXÝÐ5¸QÐ?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð@øøøõ ˜‘I”IˆEØ�qŠyˆy˜E¥C¨¡K¤KÒ/Ð/ÝÐ6¸eÐDÑDÔDÐDØ˜E A™IÔ&ˆFØŸ
š
 4Ñ(Ô(ˆIØ—:’:˜gÑ&Ô&Ð.¨$ˆDˆDð !Ô,×8Ò8¸Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆGØð RØ# DœM�	�	à"&Ô"2×"KÒ"KÈDÑ"QÔ"QÐQÐQÐQÐQÐQÐQ�	Øð 	<ÝÐ/°dÐ;Ñ;Ô;Ð;ð	[Ø"Ô.×HÒHÈÑSÔSÐSÐSÐSÐSÐSÐSˆIˆIøÝð 	[ð 	[ð 	[Ý�LŠLÐKÈYÐXYÑZÔZÐZÐZÐZÐZÐZÐZøøøøð	[øøøð Œ?�hœoÒ-Ð-Ø ×?Ò?À	ÑJÔJˆMØ×)Ò)¨&°-Ñ@Ô@ð ÐIYð Ø Ð(ÝÐFÈTÐRÑRÔRÐRÝØ>Ø&Ô0ÐI°MÔ4IØðñ ô ð øð
 ×2Ò2Ø�I¨yÐ/LÐ<Lð 3ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	Dõ Ð7¸dÐCÑCÔCÐCð #Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ# yÒ0Ð0ÝÐ0°tÐ<Ñ<Ô<Ð<ð 	×)Ò)¨+Ñ6Ô6Ð6ð Ô2×AÒAÀ+ÈyÑYÔYÐYÐYÐYÐYÐYÐYˆ	Øð 	5ÝÐ3Ñ4Ô4Ð4ð 	×&Ò& {¸8Ð&ÑDÔDÐDð 	× Ò  Ñ-Ô-Ð-ð Ô&×8Ò8¸ÑCÔCÐCÐCÐCÐCÐCÐCÐKÀtˆð Ô0×@Ò@ÀÑKÔKÐKÐKÐKÐKÐKÐKˆØLSÐZ•CÐGÐG GÐGÑGÔGÑHÔHÐHÐYZˆ	ØOXÐ`ÐK˜	ÐKÐK°)¸q².°.¨3¨3ÀbÐKÐKÐKÐKÐ^`ˆàŒ?�hœoÒ-Ð-Ð2BÐ-ÝØ:ØØÔ%Ð7¨¬Ø!ð	ñ ô ð ð ð 	EÝÐ6¸eÐDÑDÔDÐDØ˜Š>ˆ>ÝÐ1¸ÀiÐPÑPÔPÐPÝÐ.°eÀ9ÐMÑMÔMÐMs€   ÂB# Â#
CÂ-CÂ=CÃCÆ AL' Ç.L' Ç=D)L' Ì'
M'Ì1+M"ÍM'Í"M'Í?&N& Î&
O&Î0+O!ÏO&Ï!O&Ò9 S Ó
T
Ó$TÔT
c              ƒ  óÀ  ‡ ‡K  — ‰ j         sddlm}  |t          d¦  «        ¬¦  «        S ddlm}m}m} |                     ¦   «          	                    ¦   «         }	  ||¦  «        \  }}}	}
n(# t          $ r}t          d|¬¦  «        cY d}~S d}~ww xY w|
d	k    rd
S |	r4t          j        |d|	› �¬¦  «        }‰                      |¦  «        ƒ d{V —†S t          j        ‰ j        |j        ¦  «        ƒ d{V —†Š‰                      ‰¦  «        }|o‰                      ‰¦  «        }‰ j                             ‰¦  «        ƒ d{V —†}t          j        |t-          ‰ j         d‰ j         ¦  «        ‰j        r‰j        j        nd|rdn||j        |||
|
rdnddg¬¦
  «
        ƒ d{V —†}|sˆ ˆfd„|D ¦   «         ƒ d{V —†}|dd…         }|
rd|
› d�}n|rdnd} ||||¬¦  «        S )u>   Handle /sessions â€” list previous sessions for gateway chats.r   r5  r7  r8  )Úformat_gateway_session_listingÚparse_session_listing_argsÚquery_session_listingrU  r6   Nr#   z!Usage: `/sessions search <query>`z/resume )rÿ   ró  r†  r`  r  )ri   rT   Úcurrent_session_idÚinclude_all_sourcesÚinclude_unnamedÚsearch_queryra  Úexclude_sourcesc              “  óT   •K  — g | ]"}‰                      ‰|d ¬¦  «        ƒ d{V —†¯ |‘Œ#S )F)rÔ  Nri  )rÌ   r\  rF   ri   s     €€r(   r  zFGatewaySlashCommandsMixin._handle_sessions_command.<locals>.<listcomp>q  sZ   øè è € ð ð ð ØØ×1Ò1°&¸#ÈÐ1ÑOÔOÐOÐOÐOÐOÐOÐOðØðð ð r*   u   Sessions matching â€œu   â€�ÚSessionszNamed Sessions)Úinclude_sourcera   )rˆ   r‰   r6  r   Úhermes_cli.session_listingr  r€  r�  r‡   r&   r/   rT  rU  r}  rq   rƒ   r%  ri   rj   rÄ  r?   r†   rD   rG   r   rS   )rF   rJ   r6  r  r€  r�  r)  Úinclude_allr„  r>  r…  r  Úresume_eventrT   Úcross_originr{  Úrowsra   ri   s   `                 @r(   Ú_handle_sessions_commandz2GatewaySlashCommandsMixin._handle_sessions_command9  s+  øøè è € àÔð 	kØBÐBÐBÐBÐBÐBØ0Ð0½Ð:hÑ8iÔ8iÐjÑjÔjÐjð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆð	>à*Ð*¨8Ñ4Ô4ñ ?ˆK˜¨&°,°,øõ ð 	>ð 	>ð 	>ÝÐ1¸Ð=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøð ˜2ÒÐØ6Ð6àð 	CÝ&Ô.¨uÐ;NÀfÐ;NÐ;NÐOÑOÔOˆLØ×4Ò4°\ÑBÔBÐBÐBÐBÐBÐBÐBÐBåÔ(ØÔ2°E´Lñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×2Ò2°6Ñ:Ô:ˆð #ÐK t×'CÒ'CÀFÑ'KÔ'KˆØ"Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆÝÔ&Ø!Ý�DÔ$ e¨TÔ-=Ñ>Ô>Ø,2¬OÐE�6”?Ô(Ð(ÀØ ,Ð=˜˜°+Ø,Ô7Ø ,Ø+Ø%ð %Ð,�"�"¨"Ø#˜Hð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ð 	ðð ð ð ð Ø#ðñ ô ð ð ð ð ð ð ˆDð �C�R�CŒyˆØð 	HØ=¨LÐ=Ð=Ð=ˆEˆEà"1ÐG�J�JÐ7GˆEØ-Ð-ØØ'Øð
ñ 
ô 
ð 	
s   ÁA- Á-
BÁ7BÂBÂBc              ƒ  óV  K  — ddl }| j        sddlm}  |t	          d¦  «        ¬¦  «        S |j        }|                      |¦  «        }| j                             |¦  «        ƒ d{V —†}| j         	                    |j
        ¦  «        ƒ d{V —†}|st	          d¦  «        S |                     ¦   «                              ¦   «         }ddlm}	 |	                     ¦   «         }
|
                     d¦  «        }|                     ¦   «         j        dd	…         }|› d
|› �}|r|}nI| j                             |j
        ¦  «        ƒ d{V —†}|pd}| j                             |¦  «        ƒ d{V —†}|j
        }|j        p|}d}|�?	 ddl}|                     |                     ¦   «         ¦  «        }n# t0          $ r d}Y nw xY w	 | j                             ||j        r|j        j        ndt9          | j        t<          ¦  «        r0| j                             di ¦  «        pi                      d¦  «        ndd|i||j         ||j!        |j"        |j#        ||j$        ¬¦  «        ƒ d{V —† nC# t0          $ r6}tJ           &                    d|¦  «         t	          d|¬¦  «        cY d}~S d}~ww xY w	 | j         '                    |d„ |D ¦   «         d¬¦  «        ƒ d{V —† n# t0          $ r Y nw xY w	 | j         (                    ||¦  «        ƒ d{V —† n# t0          $ r Y nw xY w| j         )                    ||¦  «        ƒ d{V —†}|st	          d¦  «        S |  *                    |¦  «         |  +                    |¦  «         tY          d„ |D ¦   «         ¦  «        }|dk    rdnd}t	          |||||¬¦  «        S )u  Handle /branch [name] â€” fork the current session into a new independent copy.

        Copies conversation history to a new session so the user can explore
        a different approach without losing the original.
        Inspired by Claude Code's /branch command.
        r   Nr5  r7  r8  zgateway.branch.no_conversationr   z%Y%m%d_%H%M%Sé   rD  Úbranchr«   r$  r}  Ú_branched_from)rS   ri   r$  Úmodel_configrU   r\   rT   ré   rÐ   rê   Úorigin_jsonró  z#Failed to create branch session: %szgateway.branch.create_failedr6   c                ó@  — g | �]}|                      d d¦  «        |                      d¦  «        |                      d¦  «        p|                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d	¦  «        |                      d
¦  «        |                      d¦  «        |                      d¦  «        t          |¦  «        |                      d¦  «        dœ‘�ŒS )r“  r”  r–  Ú	tool_namer.  Ú
tool_callsÚtool_call_idÚfinish_reasonrŽ  Úreasoning_contentÚreasoning_detailsÚcodex_reasoning_itemsÚcodex_message_itemsr5  )r“  r–  r—  r˜  r™  rš  rŽ  r›  rœ  r�  rž  Úapi_contentr5  )rE   r   )rÌ   re  s     r(   r  zDGatewaySlashCommandsMixin._handle_branch_command.<locals>.<listcomp>é  s  € ð ð ñ ð& ð# !$§¢¨°Ñ 7Ô 7Ø#&§7¢7¨9Ñ#5Ô#5Ø%(§W¢W¨[Ñ%9Ô%9Ð%L¸S¿WºWÀV¹_¼_Ø&)§g¢g¨lÑ&;Ô&;Ø(+¯ª°Ñ(?Ô(?Ø),¯ª°Ñ)AÔ)AØ%(§W¢W¨[Ñ%9Ô%9Ø-0¯WªWÐ5HÑ-IÔ-IØ-0¯WªWÐ5HÑ-IÔ-IØ14·²Ð9PÑ1QÔ1QØ/2¯wªwÐ7LÑ/MÔ/Mõ (CÀ3Ñ'GÔ'GØ%(§W¢W¨[Ñ%9Ô%9ð!ð ðñ ð r*   iô  )Ú
chunk_rowszgateway.branch.switch_failedc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rq  r—  r˜  s     r(   r  zDGatewaySlashCommandsMixin._handle_branch_command.<locals>.<listcomp>  rr  r*   rå   zgateway.branch.branched_onezgateway.branch.branched_many)ra   r:  ÚparentrÀ  )-Úuuidrˆ   r‰   r6  r   ri   rj   r?   r†   rž  rS   r‡   r&   r   r  rN  Úuuid4rJ  rH  Úget_next_title_in_lineager®  ÚjsonÚdumpsÚto_dictry   rO  rG   r   r%   r¦   r	  rE   r\   ré   rÐ   rê   ró  rw   r7   Úappend_messages_batchr‹   rw  Ú&_clear_session_boundary_security_staterz   r  )rF   rJ   Ú_uuidr6  ri   rT   r{  r§  Úbranch_nameÚ_dtr  Útimestamp_strÚ
short_uuidr[   Úbranch_titleÚcurrent_titler   rU   Ú_branch_originÚ_branch_origin_jsonÚ_jsonrœ   r•   r|  rá  s                            r(   Ú_handle_branch_commandz0GatewaySlashCommandsMixin._handle_branch_command€  s   è è € ð 	ÐÐÐàÔð 	kØBÐBÐBÐBÐBÐBØ0Ð0½Ð:hÑ8iÔ8iÐjÑjÔjÐjà”ˆØ×2Ò2°6Ñ:Ô:ˆð #Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ0×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZˆØð 	7ÝÐ5Ñ6Ô6Ð6à×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6ˆð 	-Ð,Ð,Ð,Ð,Ð,Ø�gŠg‰iŒiˆØŸš _Ñ5Ô5ˆØ—[’[‘]”]Ô& r¨ rÔ*ˆ
Ø)Ð8Ð8¨JÐ8Ð8ˆð ð 	RØ&ˆLˆLà"&Ô"2×"DÒ"DÀ]ÔE]Ñ"^Ô"^Ð^Ð^Ð^Ð^Ð^Ð^ˆMØ Ð, HˆDØ!%Ô!1×!KÒ!KÈDÑ!QÔ!QÐQÐQÐQÐQÐQÐQˆLà)Ô4Ðð 'Ô-Ð7°ˆØ"ÐØÐ%ð+Ø$Ð$Ð$Ð$à&+§k¢k°.×2HÒ2HÑ2JÔ2JÑ&KÔ&KÐ#Ð#øÝð +ð +ð +Ø&*Ð#Ð#Ð#ð+øøøð#	>ØÔ"×1Ò1Ø)Ø06´ÐN�v”Ô,Ð,ÀYÝMWÐX\ÔXcÕeiÑMjÔMjÐt�t”{—’ w°Ñ3Ô3Ð9°r×>Ò>¸yÑIÔIÐIÐptØ.Ð0AÐBØ"3ð& œØ'ØœØ Ô*Ø Ô*Ø/Ø*Ô7ð= 2ñ ô ð ð ð ð ð ð ð ð øõ@ ð 	>ð 	>ð 	>Ý�LŠLÐ>ÀÑBÔBÐBÝÐ3¸1Ð=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøð	ØÔ"×8Ò8Øðð ð&  'ð'ñ ô ð* ð/ 9ñ ô ð ð ð ð ð ð ð ð øõ2 ð 	ð 	ð 	ØˆDð	øøøð	ØÔ"×4Ò4°^À\ÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRøÝð 	ð 	ð 	ØˆDð	øøøð Ô2×AÒAÀ+È~Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^ˆ	Øð 	5ÝÐ3Ñ4Ô4Ð4Ø×3Ò3°KÑ@Ô@Ð@ð 	× Ò  Ñ-Ô-Ð-åÐGÐG GÐGÑGÔGÑHÔHˆ	Ø/8¸Aª~¨~Ð+Ð+ÐCaˆÝ�˜L°	ÐBSÐYgÐhÑhÔhÐhsU   Å?+F+ Æ+F:Æ9F:Æ>B$I# É#
J#É-+JÊJ#ÊJ#Ê'-K Ë
K"Ë!K"Ë&!L Ì
LÌLc              ƒ  óh  K  — ddl m} 	 t          j        |d¬¦  «        ƒ d{V —†}n# t          $ r d}Y nw xY w|�|j        st          d¦  «        S dg}|j        D ]?}|                     ¦   «          	                    d¦  «        rŒ*| 
                    |¦  «         Œ@|j        r/| 
                    d	¦  «         | 
                    |j        ¦  «         |j        rG| 
                    d	¦  «         | 
                    d
|j        › �¦  «         | 
                    d¦  «         d                     |¦  «        S )u2  Handle /topup -- show the Nous balance and hand off to the portal.

        Renders the balance block + identity line + a tappable portal URL that
        opens the billing page. Remote spending is managed on the portal: this
        messaging command does NOT charge, confirm, or track payment here â€”
        everything happens in the browser and the next /topup shows the new balance. The
        tappable URL is the affordance and works on every platform (button-capable
        or plain text like SMS/email). Fetched off the event loop; fail-open.
        r   )Úbuild_credits_viewT©ÚmarkdownNzgateway.credits.not_logged_inu   ðŸ’³ **Nous balance**u   ðŸ“ˆr#   zManage billing on the portal: uM   Top up and manage billing in the browser â€” your balance updates here after.r±   )Úagent.account_usager·  rq   rƒ   ry   Ú	logged_inr   Úbalance_linesr  r   rØ   Úidentity_lineÚ	topup_urlr·   )rF   rJ   r·  Úviewr¼   rì  s         r(   Ú_handle_topup_commandz/GatewaySlashCommandsMixin._handle_topup_command  sj  è è € ð 	;Ð:Ð:Ð:Ð:Ð:ð	Ý Ô*Ð+=ÈÐMÑMÔMÐMÐMÐMÐMÐMÐMˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð ˆ<˜tœ~ˆ<ÝÐ4Ñ5Ô5Ð5à3Ð4ˆØÔ&ð 	ð 	ˆDØ�{Š{‰}Œ}×'Ò'¨Ñ/Ô/ð ØØ�LŠL˜ÑÔÐÐØÔð 	-Ø�LŠL˜ÑÔÐØ�LŠL˜Ô+Ñ,Ô,Ð,ØŒ>ð 	jØ�LŠL˜ÑÔÐØ�LŠLÐJ¸$¼.ÐJÐJÑKÔKÐKØ�LŠLÐhÑiÔiÐiØ�yŠy˜ÑÔÐs   Š' §6µ6rŸ  ú	list[str]c                ó�  — 	 ddl m}m}m} g }	 | j                             |¦  «        }| j                             |j        ¦  «        pg }n# t          $ r g }Y nw xY w |||¦  «        }	|	 	                    d¦  «        sg sg S d}
|r"	  ||¦  «        }
n# t          $ r g g dœ}
Y nw xY w ||	|
d¬¦  «        S # t          $ r g cY S w xY w)uo  Render the /context per-category block (plain text, no grid).

        Estimated (chars/4) â€” same engine as the desktop popover and /usage.
        ``expanded`` appends the per-skill / per-toolset listings from the
        prompt-size attribution mechanism. Runs in a thread (sync store reads);
        returns [] and never raises so /context stays robust.
        r   )Úcompute_context_detailsÚ!compute_session_context_breakdownÚrender_context_breakdown_linesÚ
categoriesN)r˜  ÚtoolsetsF)ry  Úgrid)
Úagent.context_breakdownrÃ  rÄ  rÅ  rm   r†   rž  rS   ry   rE   )rF   rW  ri   rŸ  rÃ  rÄ  rÅ  r§  r³  Úpayloadry  s              r(   r�  z2GatewaySlashCommandsMixin._context_breakdown_block8  sc  € ð	ðð ð ð ð ð ð ð ð ð ð #%ˆGðØÔ*×@Ò@ÀÑHÔH�ØÔ,×<Ò<¸UÔ=MÑNÔNÐTÐRT��øÝð ð ð Ø���ðøøøð 8Ð7¸¸wÑGÔGˆGØ—K’K Ñ-Ô-ð °ð Ø�	àˆGØð =ð=Ø5Ð5°eÑ<Ô<�G�GøÝ ð =ð =ð =Ø)+¸Ð<Ð<�G�G�Gð=øøøð 2Ð1°'À7ÐQVÐWÑWÔWÐWøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs^   ‚B6 �;A Á
B6 ÁAÁB6 ÁAÁ'B6 ÂB6 ÂB ÂB6 ÂB%Â"B6 Â$B%Â%B6 Â6CÃCc           	     óf  — 	 ddl m} g }	 | j                             |¦  «        }| j                             |j        ¦  «        pg }n# t          $ r g }Y nw xY w |||¦  «        }|                     d¦  «        pg }|sg S |                     d¦  «        pd}t          d¦  «        g}	|D ]à}
t          |
                     d¦  «        pd¦  «        }|dk    rŒ-t          |
                     d¦  «        pd¦  «        }t          d	|› �¦  «        }|                     d
|› �¦  «        r$t          |
                     d¦  «        p|¦  «        }|rt          ||z  dz  ¦  «        nd}|	                     t          d||d›|¬¦  «        ¦  «         Œát          |	¦  «        dk    r|	ng S # t          $ r g cY S w xY w)u×   Render the per-category context breakdown for /usage.

        Estimated (chars/4) â€” same engine the desktop popover uses. Returns an
        empty list and never raises on failure so /usage stays robust.
        r   )rÄ  rÆ  Úestimated_totalzgateway.usage.breakdown_headerr  rÖ  r#   zgateway.usage.breakdown_cat_Úbreakdown_cat_rî  r.  zgateway.usage.breakdown_liner/  )rî  r:  r3  rå   )rÉ  rÄ  rm   r†   rž  rS   ry   rE   r   r+   r!   ÚendswithrK  rØ   r  )rF   rW  ri   rÄ  r§  r³  rÊ  rÆ  r2  r5  Úcatr  Úcat_idrî  r3  s                  r(   Ú_context_breakdown_linesz2GatewaySlashCommandsMixin._context_breakdown_lines]  s  € ð!	ØQÐQÐQÐQÐQÐQà"$ˆGðØÔ*×@Ò@ÀÑHÔH�ØÔ,×<Ò<¸UÔ=MÑNÔNÐTÐRT��øÝð ð ð Ø���ðøøøð 8Ð7¸¸wÑGÔGˆGØ Ÿš \Ñ2Ô2Ð8°bˆJØð Ø�	à—K’KÐ 1Ñ2Ô2Ð7°aˆEÝÐ5Ñ6Ô6Ð7ˆCØ!ð ð �Ý˜SŸWšW XÑ.Ô.Ð3°!Ñ4Ô4�Ø˜Q’;�;ØÝ˜SŸWšW T™]œ]Ð0¨bÑ1Ô1�ÝÐA¸ÐAÐAÑBÔB�ð —>’>Ð";°6Ð";Ð";Ñ<Ô<ð <Ý §¢¨Ñ 0Ô 0Ð :°FÑ;Ô;�EØ5:ÐA•e˜F U™N¨SÑ0Ñ1Ô1Ð1À�Ø—
’
ÝÐ4¸EÈFÈÈÐ\_Ð`Ñ`Ô`ñô ð ð õ ˜c™(œ( Qš,˜,�3�3¨BÐ.øÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs;   ‚F! ‹;A ÁF! ÁAÁF! ÁAÁ)F! Â D F! Æ!F0Æ/F0c           	   ƒ  ó  K  — ddl m} |j        }|                      |¦  «        }|                     ¦   «                              ¦   «         }|rd„ |                     ¦   «         D ¦   «         ng }t          |¦  «        o|d         dk    }|r|st          d|¬¦  «        S | j	         
                    |¦  «        }|r||u r_t          | dd¦  «        }	t          | d	d¦  «        }
|	r;|
�9|	5  |
 
                    |¦  «        }|r|d         }ddd¦  «         n# 1 swxY w Y   |r||urt          |d
d¦  «        nd}|r||urt          |dd¦  «        nd}|r||urt          |dd¦  «        nd}|sšt          | dd¦  «        �‰	 | j                             |¦  «        ƒ d{V —†}| j                             |j        ¦  «        ƒ d{V —†pi }n# t"          $ r i }Y nw xY w|p| 
                    d¦  «        }|p| 
                    d¦  «        }|r�t%          |pd¦  «                             ¦   «                              ¦   «         }|dk    rt          d¦  «        S d|dd…         v }ddlm} t-          j        ||||¬¦  «        ƒ d{V —†}|j        S g }g }|rJ	 t-          j        t2          |||¬¦  «        ƒ d{V —†}n# t"          $ r d}Y nw xY w|rt5          |d¬¦  «        }	 ddlm} t-          j        |d¬¦  «        ƒ d{V —†}n# t"          $ r g }Y nw xY w|�rñt9          |d¦  «        �rà|j        dk    �rÔg }|                     ¦   «         }|rO|j        rHddl m!} | "                    t          d ||¦  «        ¬¦  «        ¦  «         | "                    d¦  «         t          |dd¦  «        pd}t          |d d¦  «        pd}| "                    t          d!¦  «        ¦  «         | "                    t          d"|j#        ¬#¦  «        ¦  «         | "                    t          d$|d%›¬&¦  «        ¦  «         | "                    t          d'|d%›¬&¦  «        ¦  «         | "                    t          d(|j$        d%›¬&¦  «        ¦  «         | "                    t          d)|j        ¬&¦  «        ¦  «         |j%        }|j&        dk    r|j&        nd}|rU|j'        rtQ          d*||j'        z  d*z  ¦  «        nd} | "                    t          d+|d%›|j'        d%›| d,›¬-¦  «        ¦  «         |j)        r)| "                    t          d.|j)        ¬&¦  «        ¦  «         t-          j        | j*        ||¦  «        ƒ d{V —†}!|!r*| "                    d¦  «         | +                    |!¦  «         |r*| "                    d¦  «         | +                    |¦  «         |r*| "                    d¦  «         | +                    |¦  «         d/ ,                    |¦  «        S | j                             |¦  «        ƒ d{V —†}"| j         -                    |"j        ¦  «        ƒ d{V —†}#|#r×dd0l.m/}$ d1„ |#D ¦   «         }% |$|%¦  «        }&t          d2¦  «        t          d3ta          |%¦  «        ¬&¦  «        t          d4|&d%›¬&¦  «        t          d5¦  «        g}|r*| "                    d¦  «         | +                    |¦  «         |r*| "                    d¦  «         | +                    |¦  «         d/ ,                    |¦  «        S |s|rRtc          |¦  «        }'|r,|'r|' "                    d¦  «         |' +                    |¦  «         d/ ,                    |'¦  «        S t          d6¦  «        S )7a:  Handle /usage command -- show token usage for the current session.

        Checks both _running_agents (mid-turn) and _agent_cache (between turns)
        so that rate limits, cost estimates, and detailed token breakdowns are
        available whenever the user asks, not only while the agent is running.
        r   rv  c                ó6   — g | ]}|                      ¦   «         ‘ŒS rË   )rÑ   ©rÌ   rú  s     r(   r  zCGatewaySlashCommandsMixin._handle_usage_command.<locals>.<listcomp>•  s    € Ð4Ð4Ð4˜a�—’‘	”	Ð4Ð4Ð4r*   rZ  z gateway.usage.unknown_subcommand)rl  rP   Nro   r%  r&  rƒ  rˆ   r*  r+  r#   zopenai-codexz"gateway.usage.reset_wrong_providerz--forcerå   )Úredeem_codex_reset_credit)r&  rƒ  r  )r&  rƒ  Tr¸  )Únous_credits_linesr‹  )Úformat_rate_limit_compactzgateway.usage.rate_limitsr7  rˆ  r‰  zgateway.usage.header_sessionzgateway.usage.label_modelr-  z gateway.usage.label_input_tokensr/  r9  z!gateway.usage.label_output_tokenszgateway.usage.label_totalzgateway.usage.label_api_callsr.  zgateway.usage.label_contextr|  r0  z gateway.usage.label_compressionsr±   r�  c                ój   — g | ]0}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|‘Œ1S r’  r—  r˜  s     r(   r  zCGatewaySlashCommandsMixin._handle_usage_command.<locals>.<listcomp>  sB   € ÐfÐfÐf˜!¨!¯%ª%°©-¬-Ð;PÐ*PÐ*PÐUV×UZÒUZÐ[dÑUeÔUeÐ*P�AÐ*PÐ*PÐ*Pr*   z!gateway.usage.header_session_infozgateway.usage.label_messagesz%gateway.usage.label_estimated_contextz"gateway.usage.detailed_after_firstzgateway.usage.no_data)2r´   r  ri   rj   r‡   r&   r  rš  r   rF  rE   rD   r?   r†   rˆ   rI  rS   ry   r!   rÑ   rº  rÕ  rq   rƒ   r  r
   r   rÖ  r  r‡  Úget_rate_limit_stateÚhas_dataÚagent.rate_limit_trackerr×  rØ   r$  r‹  r'  r(  r)  rJ  r„  rÑ  rL  r·   rž  r›  r�  r  r-  )(rF   rJ   r  ri   rT   r)  rl  Úwants_resetrW  r‘   rÛ  r`  r%  r&  rƒ  Ú_entry_for_billingÚ	persistedÚnormalized_providerr  rÕ  rÙ  Úaccount_linesÚcredits_linesÚaccount_snapshotrÖ  r¼   Úrl_stater×  r  r   re  Ú_lptr3  Úbreakdown_linesrU  r§  r�  r¨  r©  r=  s(                                           r(   Ú_handle_usage_commandz/GatewaySlashCommandsMixin._handle_usage_command†  s®	  è è € ð 	8Ð7Ð7Ð7Ð7Ð7Ø”ˆØ×2Ò2°6Ñ:Ô:ˆð
 ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ8@ÐHÐ4Ð4 8§>¢>Ñ#3Ô#3Ð4Ñ4Ô4Ð4ÀbˆÝ˜4‘j”jÐ7 T¨!¤W°Ò%7ˆØð 	H˜ð 	HÝÐ7¸hÐGÑGÔGÐGð Ô$×(Ò(¨Ñ5Ô5ˆØð 	*˜Ð!8Ð8Ð8Ý! $Ð(;¸TÑBÔBˆKÝ˜T >°4Ñ8Ô8ˆFØð *˜vÐ1Ø ð *ð *Ø#ŸZšZ¨Ñ4Ô4�FØð *Ø & q¤	˜ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð 8=ÐoÀÐNeÐAeÐAe•7˜5 *¨dÑ3Ô3Ð3ÐkoˆØ7<ÐoÀÐNeÐAeÐAe•7˜5 *¨dÑ3Ô3Ð3ÐkoˆØ5:Ðm¸uÐLcÐ?cÐ?c•'˜% ¨DÑ1Ô1Ð1ÐimˆØð 	E�G D¨-¸Ñ>Ô>ÐJðØ+/Ô+C×+YÒ+YÐZ`Ñ+aÔ+aÐ%aÐ%aÐ%aÐ%aÐ%aÐ%aÐ"Ø"&Ô"2×">Ò">Ð?QÔ?\Ñ"]Ô"]Ð]Ð]Ð]Ð]Ð]Ð]ÐcÐac�	�	øÝð ð ð Ø�	�	�	ðøøøàÐD 9§=¢=Ð1CÑ#DÔ#DˆHØÐD 9§=¢=Ð1CÑ#DÔ#DˆHàð 	"Ý"% h n°"Ñ"5Ô"5×";Ò";Ñ"=Ô"=×"CÒ"CÑ"EÔ"EÐØ" nÒ4Ð4ÝÐ=Ñ>Ô>Ð>Ø  a b b¤Ð)ˆEØEÐEÐEÐEÐEÐEå"Ô,Ø)Ø!ØØð	ñ ô ð ð ð ð ð ð ˆFð ”>Ð!ð $&ˆØ#%ˆØð 	\ð(Ý)0Ô):Ý'ØØ%Ø#ð	*ñ *ô *ð $ð $ð $ð $ð $ð $Ð Ð øõ ð (ð (ð (Ø#'Ð Ð Ð ð(øøøàð \Ý :Ð;KÐVZÐ [Ñ [Ô [�ð	Ø>Ð>Ð>Ð>Ð>Ð>å")Ô"3Ð4FÐQUÐ"VÑ"VÔ"VÐVÐVÐVÐVÐVÐVˆMˆMøÝð 	ð 	ð 	ØˆMˆMˆMð	øøøð ñ 0	$•W˜UÐ$:Ñ;Ô;ñ 0	$ÀÔ@WÐZ[Ò@[Ñ@[ØˆEð ×1Ò1Ñ3Ô3ˆHØð !˜HÔ-ð !ØNÐNÐNÐNÐNÐNØ—’�QÐ:ÐB[ÐB[Ð\dÑBeÔBeÐfÑfÔfÑgÔgÐgØ—’˜RÑ Ô Ð õ # 5Ð*@À!ÑDÔDÐIÈˆLÝ# EÐ+BÀAÑFÔFÐKÈ!ˆMà�LŠL�Ð9Ñ:Ô:Ñ;Ô;Ð;Ø�LŠL�Ð6¸e¼kÐJÑJÔJÑKÔKÐKØ�LŠL�Ð=ÈÐEXÐEXÐYÑYÔYÑZÔZÐZØ�LŠL�Ð>ÈÐFZÐFZÐ[Ñ[Ô[Ñ\Ô\Ð\Ø�LŠL�Ð6ÀÔA[Ð>_Ð>_Ð`Ñ`Ô`ÑaÔaÐaØ�LŠL�Ð:À%ÔBYÐZÑZÔZÑ[Ô[Ð[ð Ô*ˆCØ-0Ô-CÀaÒ-GÐ-G�3Ô)Ð)ÈQˆDØð DØCFÔCUÐ\•c˜#˜t cÔ&8Ñ8¸3Ñ>Ñ?Ô?Ð?Ð[\�Ø—’�QÐ<ÀdÀ;À;ÐY\ÔYkÐVoÐVoÐx{ð  vBð  vBð  Cñ  Cô  Cñ  Dô  Dð  DØÔ$ð aØ—’�QÐAÈÔI^Ð_Ñ_Ô_Ñ`Ô`Ð`õ %,Ô$5ØÔ-¨u°fñ%ô %ð ð ð ð ð ð ˆOð ð .Ø—’˜RÑ Ô Ð Ø—’˜_Ñ-Ô-Ð-àð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+Øð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+à—9’9˜UÑ#Ô#Ð#ð #Ô6×LÒLÈVÑTÔTÐTÐTÐTÐTÐTÐTˆØÔ0×@Ò@ÀÔAYÑZÔZÐZÐZÐZÐZÐZÐZˆØð 	$ØKÐKÐKÐKÐKÐKØfÐf˜wÐfÑfÔfˆDØ3Ð3°DÑ9Ô9ˆFåÐ5Ñ6Ô6ÝÐ0½¸D¹	¼	ÐBÑBÔBÝÐ9ÀFÀÀÐOÑOÔOÝÐ6Ñ7Ô7ð	ˆEð ð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+Øð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+Ø—9’9˜UÑ#Ô#Ð#Øð 	$˜Mð 	$å˜Ñ'Ô'ˆEØð ,Øð %Ø—L’L Ñ$Ô$Ð$Ø—’˜]Ñ+Ô+Ð+Ø—9’9˜UÑ#Ô#Ð#ÝÐ(Ñ)Ô)Ð)sI   Ã% DÄDÄDÅ;AG ÇGÇGÊ#J1 Ê1K Ê?K Ë"K: Ë:L	ÌL	c              ƒ  óÐ  ‡‡	‡
‡K  — |                      ¦   «                              ¦   «         }t          j        dd|¦  «        }dŠ
dŠ|�r|                     ¦   «         }d}|t          |¦  «        k     rì||         dk    r`|dz   t          |¦  «        k     rJ	 t          ||dz            ¦  «        Š
n*# t          $ r t          d||dz            ¬	¦  «        cY S w xY w|d
z  }nm||         dk    r'|dz   t          |¦  «        k     r||dz            Š|d
z  }n:||          	                    ¦   «         rt          ||         ¦  «        Š
|dz  }n|dz  }|t          |¦  «        k     °ì	 ddl
mŠ	 ddlmŠ t          j        ¦   «         }ˆˆ	ˆ
ˆfd„}|                     d|¦  «        ƒ d{V —†S # t"          $ r8}t$                               d|d¬¦  «         t          d|¬¦  «        cY d}~S d}~ww xY w)z>Handle /insights command -- show usage insights and analytics.z'[\u2012\u2013\u2014\u2015](days|source)z--\1é   Nr   z--daysrå   zgateway.insights.invalid_daysr'   ræ   z--sourcer^   )ÚInsightsEnginec                 ó²   •—  ‰¦   «         }  ‰| ¦  «        }|                      ‰‰¬¦  «        }|                     |¦  «        }|                      ¦   «          |S )N)Údaysri   )ÚgenerateÚformat_gatewayrö   )ÚdbÚenginer%  rÙ  ré  r_   rë  ri   s       €€€€r(   Ú_run_insightszIGatewaySlashCommandsMixin._handle_insights_command.<locals>._run_insightsX  sW   ø€ Ø�Y‘[”[�Ø'˜¨Ñ+Ô+�ØŸš¨d¸6˜ÑBÔB�Ø×.Ò.¨vÑ6Ô6�Ø—’‘
”
�
Ø�r*   zInsights command error: %sTrb   zgateway.insights.errorr6   )r‡   r&   rü   Úsubr  r  r+   r/   r   rt  r‰   r_   Úagent.insightsré  rq   rˆ  r‰  ry   rw   r7   )rF   rJ   rl  r=  r  Úlooprð  rœ   ré  r_   rë  ri   s           @@@@r(   Ú_handle_insights_commandz2GatewaySlashCommandsMixin._handle_insights_command4  sj  øøøøè è € à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆõ ŒvÐ@À'È4ÑPÔPˆàˆØˆð ñ 	Ø—J’J‘L”LˆEØˆAØ•c˜%‘j”j’.�.Ø˜”8˜xÒ'Ð'¨A°©EµC¸±J´JÒ,>Ð,>ðVÝ" 5¨¨Q©¤<Ñ0Ô0˜˜øÝ%ð Vð Vð VÝ Ð!@ÈÈaÐRSÉeÌÐUÑUÔUÐUÐUÐUðVøøøà˜‘F�A�AØ˜1”X Ò+Ð+°°A±½¸E¹
¼
Ò0BÐ0BØ" 1 q¡5œ\�FØ˜‘F�A�AØ˜1”X×%Ò%Ñ'Ô'ð Ý˜u Qœx™=œ=�DØ˜‘F�A�Aà˜‘F�Að •c˜%‘j”j’.�.ð 	8Ø.Ð.Ð.Ð.Ð.Ð.Ø5Ð5Ð5Ð5Ð5Ð5åÔ+Ñ-Ô-ˆDðð ð ð ð ð ð ð ð ×-Ò-¨d°MÑBÔBÐBÐBÐBÐBÐBÐBÐBøÝð 	8ð 	8ð 	8Ý�LŠLÐ5°qÀ4ˆLÑHÔHÐHÝÐ-°QÐ7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð	8øøøs1   ÂB/ Â/$CÃCÅ AF# Æ#
G%Æ--G ÇG%Ç G%c              ƒ  óà  ‡ ‡‡K  — ‰j         }‰                      |¦  «        Š‰                      ¦   «         }t          |t          ¦  «        r|                     d¦  «        nd}d}t          |t          ¦  «        r#t          |                     dd¦  «        ¦  «        }|s‰                      ‰¦  «        ƒ d{V —†S dˆˆ ˆfd	„}t          d
¦  «        }‰  	                    ‰dd||¬¦  «        ƒ d{V —†S )u  Handle /reload-mcp â€” reconnect MCP servers and rebuild the cached agent.

        Reloading MCP tools invalidates the provider prompt cache for the
        active session (tool schemas are baked into the system prompt).  The
        next message re-sends full input tokens, which is expensive on
        long-context or high-reasoning models.

        To surface that cost, the command routes through the slash-confirm
        primitive: users get an Approve Once / Always Approve / Cancel
        prompt before the reload actually runs.  "Always Approve" persists
        ``approvals.mcp_reload_confirm: false`` so the prompt is silenced
        for subsequent reloads in any session.

        Users can also skip the confirm by flipping the config key directly.
        Ú	approvalsNTÚmcp_reload_confirmr  r!   r    r2   c              “  óp  •K  — | dk    rt          d¦  «        S | dk    ra	 ddlm}  |dd¦  «         t                               d‰¦  «         n2# t
          $ r%}t                               d	|¦  «         Y d }~nd }~ww xY w‰                     ‰¦  «        ƒ d {V —†}| dk    r|› d
�t          d¦  «        z   S |S )Nr  zgateway.reload_mcp.cancelledÚalwaysr   )Úsave_config_valuezapprovals.mcp_reload_confirmFz7User opted out of /reload-mcp confirmation (session=%s)z.Failed to persist mcp_reload_confirm=false: %srh   z"gateway.reload_mcp.always_followup)r   Úclirú  rw   r%  ry   rx   Ú_execute_mcp_reload)r  rú  r  rÙ  rJ   rF   rT   s       €€€r(   Ú_on_confirmzIGatewaySlashCommandsMixin._handle_reload_mcp_command.<locals>._on_confirm‡  s  øè è € Ø˜Ò!Ð!ÝÐ7Ñ8Ô8Ð8Ø˜Ò!Ð!ðZØ5Ð5Ð5Ð5Ð5Ð5Ø%Ð%Ð&DÀeÑLÔLÐLÝ—K’KØQØ#ñô ð ð øõ !ð Zð Zð ZÝ—N’NÐ#SÐUXÑYÔYÐYÐYÐYÐYÐYÐYøøøøðZøøøð  ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆFØ˜Ò!Ð!Ø ���­Ð+OÑ)PÔ)PÑPÐPØˆMs    -A Á
A=ÁA8Á8A=z!gateway.reload_mcp.confirm_promptz
reload-mcpz/reload-mcpr  )r  r!   r    r2   )
ri   rj   Ú_read_user_configr%   r	  rE   rš  rü  r   r(  )	rF   rJ   ri   rf  rö  Úconfirm_requiredrý  Úprompt_messagerT   s	   ``      @r(   Ú_handle_reload_mcp_commandz4GatewaySlashCommandsMixin._handle_reload_mcp_commande  sD  øøøè è € ð  ”ˆØ×2Ò2°6Ñ:Ô:ˆð ×,Ò,Ñ.Ô.ˆÝ4>¸{ÍDÑ4QÔ4QÐ[�K—O’O KÑ0Ô0Ð0ÐW[ˆ	ØÐÝ�i¥Ñ&Ô&ð 	OÝ# I§M¢MÐ2FÈÑ$MÔ$MÑNÔNÐàð 	9Ø×1Ò1°%Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ( Ð>Ñ?Ô?ˆØ×0Ò0ØØ ØØ"Øð 1ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r*   c           
   ƒ  ó�  K  — t          j        ¦   «         }	 ddlm} |                     d|¦  «        ƒ d{V —†}|                     dg ¦  «        }|                     dg ¦  «        }|                     dd¦  «        }t          | j                             ¦   «         ¦  «        D ]Œ}t          |dd¦  «        }	t          |	¦  «        sŒ#	  |	¦   «         }
t          j        |
¦  «        r|
ƒ d{V —† ŒK# t          $ r5}t                               dt          |d	|¦  «        |¦  «         Y d}~Œ…d}~ww xY wt!          d
¦  «        g}|s]|s[|                     t!          d¦  «        ¦  «         |                     t!          d|¬¦  «        ¦  «         d                     |¦  «        S dd„}|rE|                     t!          d¦  «        ¦  «         |D ] }|                      ||¦  «        ¦  «         Œ!|rE|                     t!          d¦  «        ¦  «         |D ] }|                      ||¦  «        ¦  «         Œ!|                     t!          d|¬¦  «        ¦  «         dg}|rM|                     d¦  «         |                     d¦  «         |D ] }|                      ||¦  «        ¦  «         Œ!|rM|                     d¦  «         |                     d¦  «         |D ] }|                      ||¦  «        ¦  «         Œ!|                     d¦  «         |                     d¦  «         d                     |¦  «        }|                      |j        ¦  «        }t+          | d¦  «        si | _        |r
|| j        |<   d                     |¦  «        S # t          $ r6}t                               d|¦  «         t!          d|¬¦  «        cY d}~S d}~ww xY w) uå  Handle /reload-skills â€” rescan skills dir, queue a note for next turn.

        Skills don't need to be in the system prompt for the model to use
        them (they're invoked via ``/skill-name``, ``skills_list``, or
        ``skill_view`` at runtime), so this does NOT clear the prompt cache
        â€” prefix caching stays intact.

        If any skills were added or removed, a one-shot note is queued on
        ``self._pending_skills_reload_notes[session_key]``. The gateway
        prepends it to the NEXT user message in this session (see the
        consumer at ~L11025 in ``_run_agent_turn``), then clears it. Nothing
        is written to the session transcript out-of-band, so message
        alternation is preserved.
        r   )Úreload_skillsNÚaddedr™  r2  Úrefresh_skill_groupz)Adapter %s refresh_skill_group raised: %sr.  zgateway.reload_skills.headerzgateway.reload_skills.no_newzgateway.reload_skills.totalr9  r±   Úitemr	  r    r!   c                ó¤   — |                       dd¦  «        }|                       dd¦  «        }|rt          d||¬¦  «        S t          d|¬¦  «        S )Nr.  r#   Údescriptionz$gateway.reload_skills.item_with_desc)r.  Údescz"gateway.reload_skills.item_no_descrO  )rE   r   )r  Únmr	  s      r(   Ú	_fmt_linezJGatewaySlashCommandsMixin._handle_reload_skills_command.<locals>._fmt_lineØ  s\   € Ø—X’X˜f bÑ)Ô)�Ø—x’x ¨rÑ2Ô2�Øð YÝÐCÈ"ÐSWÐXÑXÔXÐXÝÐ=ÀBÐGÑGÔGÐGr*   z"gateway.reload_skills.added_headerz$gateway.reload_skills.removed_headerz[USER INITIATED SKILLS RELOAD:r#   zAdded Skills:zRemoved Skills:z,Use skills_list to see the updated catalog.]Ú_pending_skills_reload_noteszSkills reload failed: %szgateway.reload_skills.failedr6   )r  r	  r    r!   )rq   rˆ  Úagent.skill_commandsr  r‰  rE   r-  rA   r±  rD   r°  ÚinspectÚisawaitablery   rw   rx   r   rØ   r·   rj   ri   r  r  )rF   rJ   ró  r  rÙ  r  r™  r2  rH   ÚrefreshÚmayber  r¼   r  r  ÚsectionsrA  rT   rœ   s                      r(   Ú_handle_reload_skills_commandz7GatewaySlashCommandsMixin._handle_reload_skills_command¤  sX  è è € õ Ô'Ñ)Ô)ˆðR	>Ø:Ð:Ð:Ð:Ð:Ð:à×/Ò/°°mÑDÔDÐDÐDÐDÐDÐDÐDˆFØ—J’J˜w¨Ñ+Ô+ˆEØ—j’j ¨BÑ/Ô/ˆGØ—J’J˜w¨Ñ*Ô*ˆEõ   ¤× 4Ò 4Ñ 6Ô 6Ñ7Ô7ð ð �Ý! 'Ð+@À$ÑGÔG�Ý Ñ(Ô(ð ØðØ#˜G™IœI�EÝÔ*¨5Ñ1Ô1ð $Ø#˜˜˜˜˜˜˜øøÝ ð ð ð Ý—N’NØCÝ ¨°Ñ9Ô9¸3ñô ð ð ð ð ð ð øøøøðøøøõ Ð5Ñ6Ô6Ð7ˆEØð ( ð (Ø—’�QÐ=Ñ>Ô>Ñ?Ô?Ð?Ø—’�QÐ<ÀEÐJÑJÔJÑKÔKÐKØ—y’y Ñ'Ô'Ð'ðHð Hð Hð Hð ð 2Ø—’�QÐCÑDÔDÑEÔEÐEØ!ð 2ð 2�DØ—L’L  ¨4¡¤Ñ1Ô1Ð1Ð1Øð 2Ø—’�QÐEÑFÔFÑGÔGÐGØ#ð 2ð 2�DØ—L’L  ¨4¡¤Ñ1Ô1Ð1Ð1Ø�LŠL�Ð8ÀÐFÑFÔFÑGÔGÐGð 9Ð9ˆHØð 5Ø—’ Ñ#Ô#Ð#Ø—’ Ñ0Ô0Ð0Ø!ð 5ð 5�DØ—O’O I I¨d¡O¤OÑ4Ô4Ð4Ð4Øð 5Ø—’ Ñ#Ô#Ð#Ø—’Ð 1Ñ2Ô2Ð2Ø#ð 5ð 5�DØ—O’O I I¨d¡O¤OÑ4Ô4Ð4Ð4Ø�OŠO˜BÑÔÐØ�OŠOÐJÑKÔKÐKØ—9’9˜XÑ&Ô&ˆDà×6Ò6°u´|ÑDÔDˆKÝ˜4Ð!?Ñ@Ô@ð 7Ø46�Ô1Øð FØAE�Ô1°+Ñ>à—9’9˜UÑ#Ô#Ð#øåð 	>ð 	>ð 	>Ý�NŠNÐ5°qÑ9Ô9Ð9ÝÐ3¸1Ð=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøsP   —B-N Ã&C,Ã+N Ã,
D+Ã6+D&Ä!N Ä&D+Ä+A1N ÆG'N Î
OÎ+O Î:OÏ Oc           
   ƒ  óÈ  K  — ddl m}m}  |d |d¬¦  «        ¦  «        }d|j        v r-t                               d|j        d         ¦  «         |j        S |j        d         }|sd|j        d	         › d
�S dt          |¦  «        › d�dg}|D ]–}t          |                     dg ¦  «        ¦  «        }|                     d¦  «        pd|› d�}	| 	                    d|d         › d|	› d|› d�¦  «         |                     dg ¦  «        D ]}
| 	                    d|
› �¦  «         ŒŒ—| 	                    d¦  «         | 	                    d¦  «         d 
                    |¦  «        S )u  Handle /bundles â€” list installed skill bundles.

        Mirrors the CLI ``/bundles`` handler. Returns a single text
        message suitable for any gateway adapter; bundles are loaded by
        invoking the bundle's own ``/<slug>`` command, not by this one.
        r   r£   Úbundlesr«   ra  r7   zBundles command unavailable: %sz€No skill bundles installed.
Create one on the host with:
  `hermes bundles create <name> --skill <s1> --skill <s2>`
Directory: `Údirré  z**Skill Bundles** (z installed):r#   r˜  r  zLoad z skillsu   â€¢ `/rþ  u   ` â€” z _(z	 skills)_u       Â· z6Invoke a bundle with `/<slug>` to load all its skills.r±   )r³   r¤   r¥   r¶   rw   rx   rÿ   r  rE   rØ   r·   )rF   rJ   r¤   r¥   r»   r  r¼   r%  Úskill_countr	  rú  s              r(   Ú_handle_bundles_commandz1GatewaySlashCommandsMixin._handle_bundles_command  sÁ  è è € ð 	JÐIÐIÐIÐIÐIÐIÐIà� 	¨>¨>À)Ð+LÑ+LÔ+LÑMÔMˆØ�e”jÐ Ð Ý�NŠNÐ<¸e¼jÈÔ>QÑRÔRÐRØ”:Ðà”*˜YÔ'ˆØð 	ð4ð  %œz¨%Ô0ð4ð 4ð 4ðð B¥s¨7¡|¤|ÐAÐAÐAÀ2ÐFˆØð 	,ð 	,ˆDÝ˜dŸhšh x°Ñ4Ô4Ñ5Ô5ˆKØ—8’8˜MÑ*Ô*ÐJÐ.J°kÐ.JÐ.JÐ.JˆDØ�LŠLØL˜˜fœÐLÐL¨TÐLÐL°kÐLÐLÐLñô ð ð —X’X˜h¨Ñ+Ô+ð ,ð ,�Ø—’˜] q˜]˜]Ñ+Ô+Ð+Ð+ð,à�Š�RÑÔÐØ�ŠÐMÑNÔNÐNØ�yŠy˜ÑÔÐr*   c              ƒ  ó<  K  — |j         }|                      |¦  «        }ddlm}m}  ||¦  «        sA|| j        v r)| j                             |¦  «         t          d¦  «        S t          d¦  «        S |                     ¦   «          	                    ¦   «          
                    ¦   «                              ¦   «         }d|v }d„ |D ¦   «         }t          d„ |D ¦   «         ¦  «        rd}	nt          d	„ |D ¦   «         ¦  «        rd
}	nd}	 |||	|¬¦  «        }
|
st          d¦  «        S | j                             |j        ¦  «        }|r|                     |j        ¦  «         t$                               d|
|	¦  «         |
dk    rdnd}t          d|	› d|› �|
¬¦  «        S )u  Handle /approve command â€” unblock waiting agent thread(s).

        The agent thread(s) are blocked inside tools/approval.py waiting for
        the user to respond.  This handler signals the event so the agent
        resumes and the terminal_tool executes the command inline â€” the same
        flow as the CLI's synchronous input() approval.

        Supports multiple concurrent approvals (parallel subagents,
        execute_code).  ``/approve`` resolves the oldest pending command;
        ``/approve all`` resolves every pending command at once.

        Usage:
            /approve              â€” approve oldest pending command once
            /approve all          â€” approve ALL pending commands at once
            /approve session      â€” approve oldest + remember for session
            /approve all session  â€” approve all + remember for session
            /approve always       â€” approve oldest + remember permanently
            /approve all always   â€” approve all + remember permanently
        r   ©Úresolve_gateway_approvalÚhas_blocking_approvalzgateway.approval_expiredzgateway.approve.no_pendingrw  c                ó   — g | ]
}|d k    ¯|‘ŒS )rw  rË   rÔ  s     r(   r  zEGatewaySlashCommandsMixin._handle_approve_command.<locals>.<listcomp>P  s   € Ð3Ð3Ð3˜1¨¨Uª
¨
�Q¨
¨
¨
r*   c              3  ó   K  — | ]}|d v V — Œ	dS )>   rù  Ú	permanentÚpermanentlyNrË   rÔ  s     r(   rÎ   zDGatewaySlashCommandsMixin._handle_approve_command.<locals>.<genexpr>R  s(   è è € ÐNÐN¸qˆqÐ:Ð:ÐNÐNÐNÐNÐNÐNr*   rù  c              3  ó   K  — | ]}|d v V — Œ	dS )>   Úsesr$  NrË   rÔ  s     r(   rÎ   zDGatewaySlashCommandsMixin._handle_approve_command.<locals>.<genexpr>T  s(   è è € Ð<Ð<¨Q�Ð(Ð(Ð<Ð<Ð<Ð<Ð<Ð<r*   r$  Úonce)Úresolve_allz7User approved %d dangerous command(s) via /approve (%s)rå   ÚpluralÚsingularzgateway.approve.rD  r9  )ri   rj   r¼  r  r  Ú_pending_approvalsrÔ  r   r‡   r&   rÑ   r  ÚanyrA   rE   rG   Úresume_typing_for_chatré   rw   r%  )rF   rJ   ri   rT   r  r  rl  r$  Ú	remainingr  r:  Ú_adapterr%  s                r(   Ú_handle_approve_commandz1GatewaySlashCommandsMixin._handle_approve_command,  sø  è è € ð( ”ˆØ×2Ò2°6Ñ:Ô:ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð %Ð$ [Ñ1Ô1ð 	3Ø˜dÔ5Ð5Ð5ØÔ'×+Ò+¨KÑ8Ô8Ð8ÝÐ3Ñ4Ô4Ð4ÝÐ1Ñ2Ô2Ð2ð ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?ˆØ˜t�mˆØ3Ð3 Ð3Ñ3Ô3ˆ	åÐNÐNÀIÐNÑNÔNÑNÔNð 	ØˆFˆFÝÐ<Ð<°)Ð<Ñ<Ô<Ñ<Ô<ð 	ØˆFˆFàˆFà(Ð(¨°fÈ+ÐVÑVÔVˆØð 	3ÝÐ1Ñ2Ô2Ð2ð ”=×$Ò$ V¤_Ñ5Ô5ˆØð 	<Ø×+Ò+¨F¬NÑ;Ô;Ð;å�ŠÐMÈuÐV\Ñ]Ô]Ð]Ø" QšY˜Y��¨JˆÝÐ5 FÐ5Ð5¨VÐ5Ð5¸UÐCÑCÔCÐCr*   c              ƒ  óô  K  — |j         }|                      |¦  «        }ddlm}m}  ||¦  «        sA|| j        v r)| j                             |¦  «         t          d¦  «        S t          d¦  «        S |                     ¦   «          	                    ¦   «         }| 
                    ¦   «         }t          |¦  «        o|d                              ¦   «         dk    }|r0|t          |d         ¦  «        d…          	                    ¦   «         }	n|}	|	r|	dd…          	                    ¦   «         }	 ||d||	pd¬	¦  «        }
|
st          d¦  «        S | j                             |j        ¦  «        }|r|                     |j        ¦  «         t&                               d
|
|	rdnd¦  «         |	r)|
dk    rt          d|
|	¬¦  «        S t          d|	¬¦  «        S |
dk    rt          d|
¬¦  «        S t          d¦  «        S )uö  Handle /deny command â€” reject pending dangerous command(s).

        Signals blocked agent thread(s) with a 'deny' result so they receive
        a definitive BLOCKED message, same as the CLI deny flow.

        ``/deny`` denies the oldest; ``/deny all`` denies everything.
        ``/deny <reason>`` (or ``/deny all <reason>``) attaches a one-line
        reason that is relayed back to the agent so it can adapt instead of
        only hearing "denied". Ported from qwibitai/nanoclaw#2832.
        r   r  zgateway.deny.stalezgateway.deny.no_pendingrw  Ni  Údeny)r$  rO   z/User denied %d dangerous command(s) via /deny%sz (with reason)r#   rå   z!gateway.deny.denied_reason_plural)r:  rO   z#gateway.deny.denied_reason_singularrN   zgateway.deny.denied_pluralr9  zgateway.deny.denied_singular)ri   rj   r¼  r  r  r'  rÔ  r   r‡   r&   r  rš  rÑ   r  rA   rE   rG   r)  ré   rw   r%  )rF   rJ   ri   rT   r  r  r)  r  r$  rO   r:  r+  s               r(   Ú_handle_deny_commandz.GatewaySlashCommandsMixin._handle_deny_commandf  sP  è è € ð ”ˆØ×2Ò2°6Ñ:Ô:ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð %Ð$ [Ñ1Ô1ð 	0Ø˜dÔ5Ð5Ð5ØÔ'×+Ò+¨KÑ8Ô8Ð8ÝÐ-Ñ.Ô.Ð.ÝÐ.Ñ/Ô/Ð/ð
 ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ—’Ñ!Ô!ˆÝ˜6‘l”lÐA v¨a¤y§¢Ñ'8Ô'8¸EÒ'AˆØð 	Ø�c &¨¤)™nœn˜o˜oÔ.×4Ò4Ñ6Ô6ˆFˆFàˆFàð 	*Ø˜D˜S˜D”\×'Ò'Ñ)Ô)ˆFà(Ð(Ø˜¨[Ø�>˜Tð
ñ 
ô 
ˆð ð 	0ÝÐ.Ñ/Ô/Ð/ð ”=×$Ò$ V¤_Ñ5Ô5ˆØð 	<Ø×+Ò+¨F¬NÑ;Ô;Ð;å�ŠØ=Ø vÐ5Ð#Ð#°2ñ	
ô 	
ð 	
ð ð 	KØ�qŠyˆyÝÐ<ÀEÐRXÐYÑYÔYÐYÝÐ:À6ÐJÑJÔJÐJØ�1Š9ˆ9ÝÐ1¸Ð?Ñ?Ô?Ð?ÝÐ/Ñ0Ô0Ð0r*   c              ƒ  ó¤   ‡‡‡‡‡	‡
K  — ddl }ddlmŠmŠ	mŠ
mŠmŠmŠ  |j        ¦   «         }ˆˆˆˆˆ	ˆ
fd„}| 	                    d|¦  «        ƒ d{V —†S )u6  Handle /debug â€” upload debug report (summary only) and return paste URLs.

        Gateway uploads ONLY the summary report (system info + log tails),
        NOT full log files, to protect conversation privacy.  Users who need
        full log uploads should use ``hermes debug share`` from the CLI.
        r   N)Ú_capture_dumpÚcollect_debug_reportÚupload_to_pastebinÚ_schedule_auto_deleteÚ_GATEWAY_PRIVACY_NOTICEÚ!_best_effort_sweep_expired_pastesc                 óø  •—  ‰	¦   «           ‰
¦   «         }  ‰d| ¬¦  «        }i }	  ‰|¦  «        |d<   n(# t           $ r}t          d|¬¦  «        cY d }~S d }~ww xY w ‰t          |                     ¦   «         ¦  «        ¦  «         ‰dt          d¦  «        dg}t	          d„ |D ¦   «         ¦  «        }|                     ¦   «         D ]$\  }}|                     d	|d
|› �›d|› �¦  «         Œ%|                     d¦  «         |                     t          d¦  «        ¦  «         |                     t          d¦  «        ¦  «         |                     t          d¦  «        ¦  «         d                     |¦  «        S )NrË  )Ú	log_linesÚ	dump_textÚReportzgateway.debug.upload_failedr6   r#   zgateway.debug.headerc              3  ó4   K  — | ]}t          |¦  «        V — Œd S r0  )r  )rÌ   rS  s     r(   rÎ   z_GatewaySlashCommandsMixin._handle_debug_command.<locals>._collect_and_upload.<locals>.<genexpr>Ä  s(   è è € Ð3Ð3¨�c !™fœfÐ3Ð3Ð3Ð3Ð3Ð3r*   ré  rX  z`  zgateway.debug.auto_deletezgateway.debug.full_logs_hintzgateway.debug.share_hintr±   )ry   r   r-  r±  rœ  r  rØ   r·   )r9  r%  Úurlsr  r¼   Úlabel_widthrî  Úurlr5  r6  r1  r4  r2  r3  s           €€€€€€r(   Ú_collect_and_uploadzLGatewaySlashCommandsMixin._handle_debug_command.<locals>._collect_and_uploadµ  s²  ø€ Ø-Ð-Ñ/Ô/Ð/Ø%˜™œˆIØ)Ð)°CÀ9ÐMÑMÔMˆFàˆDðCØ!3Ð!3°FÑ!;Ô!;��X‘�øÝð Cð Cð CÝÐ6¸cÐBÑBÔBÐBÐBÐBÐBÐBÐBøøøøðCøøøð "Ð!¥$ t§{¢{¡}¤}Ñ"5Ô"5Ñ6Ô6Ð6à,¨bµ!Ð4JÑ2KÔ2KÈRÐPˆEÝÐ3Ð3¨dÐ3Ñ3Ô3Ñ3Ô3ˆKØ"Ÿjšj™lœlð Að A‘
��sØ—’Ð? Ð?¨Ð?Ð?Ð?Ð?¸#Ð?Ð?Ñ@Ô@Ð@Ð@à�LŠL˜ÑÔÐØ�LŠL�Ð6Ñ7Ô7Ñ8Ô8Ð8Ø�LŠL�Ð9Ñ:Ô:Ñ;Ô;Ð;Ø�LŠL�Ð5Ñ6Ô6Ñ7Ô7Ð7Ø—9’9˜UÑ#Ô#Ð#s   ¦5 µ
A¿AÁAÁA)
rq   Úhermes_cli.debugr1  r2  r3  r4  r5  r6  rˆ  r‰  )rF   rJ   rq   ró  r?  r5  r6  r1  r4  r2  r3  s        @@@@@@r(   Ú_handle_debug_commandz/GatewaySlashCommandsMixin._handle_debug_command¤  sÖ   øøøøøøè è € ð 	ˆˆˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð (ˆwÔ'Ñ)Ô)ˆð	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð2 ×)Ò)¨$Ð0CÑDÔDÐDÐDÐDÐDÐDÐDÐDr*   c           
   ƒ  ó  K  — ddl m}m} ddl}ddl}ddl}ddlm} ddlm}m	}	 |j
        j        }
| j        }|
|vrY	 ddlm} |                     |
j        ¦  «        }|r|j        st%          d¦  «        S n# t&          $ r t%          d¦  «        cY S w xY w |¦   «         rd |	d	¦  «        › �S t)          t*          ¦  «        j        j                             ¦   «         }|d
z  }|                     ¦   «         st%          d¦  «        S  |¦   «         }|st%          d¦  «        S |dz  }|dz  }|dz  }|                      |j
        ¦  «        }|j
        j        j        |j
        j        |j
        j        |j
        j        | |j        ¦   «                              ¦   «         dœ}|j
        j        r|j
        j        |d<   |j         r
|j         |d<   | !                    d¦  «        }| "                    | #                    |¦  «        d¬¦  «         | $                    |¦  «         | %                    d¬¦  «         	 tL          j        dk    r„ddl'}ddl(m)} | *                    d¦  «         +                    ¦   «         } |j,        tL          j-        d|t]          |¦  «        t]          |¦  «        g|¢d‘d‘f|j/        |j/        dœ |¦   «         ¤Ž nÍd 0                    d „ |D ¦   «         ¦  «        }d!|› d"tc          j2        t]          |¦  «        ¦  «        › d#tc          j2        t]          |¦  «        ¦  «        › �}| 3                    d$¦  «        }|r(| ,                    |d%d|g|j/        |j/        d¬&¦  «         n&| ,                    d%d|g|j/        |j/        d¬&¦  «         nT# t&          $ rG}| %                    d¬¦  «         | %                    d¬¦  «         t%          d'|¬(¦  «        cY d}~S d}~ww xY w|  4                    ¦   «          t%          d)¦  «        S )*us  Handle /update command â€” update Hermes Agent to the latest version.

        Spawns ``hermes update`` in a detached session (via ``setsid``) so it
        survives the gateway restart that ``hermes update`` may trigger. Marker
        files are written so either the current gateway process or the next one
        can notify the user when the update finishes.
        r   )rD  Ú_resolve_hermes_binNr   )Ú
is_managedÚformat_managed_message)Úplatform_registryz%gateway.update.platform_not_messagingu   âœ— zupdate Hermes Agentz.gitzgateway.update.not_git_repoz#gateway.update.hermes_cmd_not_foundz.update_pending.jsonz.update_output.txtz.update_exit_code)rG   ré   rÐ   r\   rT   r5  rê   rG  z.tmprn  )ÚencodingT)Ú
missing_okÚwin32)Úwindows_detach_popen_kwargsai  
                    import os, subprocess, sys
                    output_path = sys.argv[1]
                    exit_code_path = sys.argv[2]
                    cmd = sys.argv[3:]
                    env = dict(os.environ)
                    env["PYTHONUNBUFFERED"] = "1"
                    with open(output_path, "wb") as f:
                        proc = subprocess.Popen(cmd, stdout=f, stderr=subprocess.STDOUT, env=env)
                        rc = proc.wait(timeout=3600)
                    with open(exit_code_path, "w", encoding="utf-8") as f:
                        f.write(str(rc))
                    z-cÚupdatez	--gateway)ÚstdoutÚstderrrê  c              3  ó>   K  — | ]}t          j        |¦  «        V — Œd S r0  )rý   Úquote)rÌ   r  s     r(   rÎ   zCGatewaySlashCommandsMixin._handle_update_command.<locals>.<genexpr>G  s,   è è € Ð)SÐ)SÀ­%¬+°dÑ*;Ô*;Ð)SÐ)SÐ)SÐ)SÐ)SÐ)Sr*   zPYTHONUNBUFFERED=1 z update --gateway > z" 2>&1; rc=$?; printf '%s' "$rc" > ÚsetsidÚbash)rL  rM  Ústart_new_sessionzgateway.update.start_failedr6   zgateway.update.starting)5r´   rD  rC  r¦  ÚshutilÚ
subprocessr   rÒ  rD  rE  ri   rG   Ú_UPDATE_ALLOWED_PLATFORMSÚgateway.platform_registryrF  rE   r   Úallow_update_commandr   ry   r   Ú__file__r¢  ÚresolveÚexistsrj   ré   rÐ   r\   r  Ú	isoformatrê   rG  Úwith_suffixÚ
write_textr§  rU  ÚunlinkÚsysÚtextwrapÚhermes_cli._subprocess_compatrJ  Údedentr&   ÚPopenÚ
executabler!   ÚDEVNULLr·   rý   rO  ÚwhichÚ#_schedule_update_notification_watch)rF   rJ   rD  rC  r¦  rS  rT  r   rD  rE  rG   Ú_allowedrF  r³  Úproject_rootÚgit_dirÚ
hermes_cmdÚpending_pathÚoutput_pathÚexit_code_pathrT   ÚpendingÚ_tmp_pendingr`  rJ  ÚhelperÚhermes_cmd_strÚ
update_cmdÚ
setsid_binrœ   s                                 r(   Ú_handle_update_commandz0GatewaySlashCommandsMixin._handle_update_commandÐ  sG  è è € ð 	BÐAÐAÐAÐAÐAÐAÐAØˆˆˆØˆˆˆØÐÐÐØ%Ð%Ð%Ð%Ð%Ð%ØHÐHÐHÐHÐHÐHÐHÐHð ”<Ô(ˆØÔ1ˆà˜8Ð#Ð#ðBØGÐGÐGÐGÐGÐGØ)×-Ò-¨h¬nÑ=Ô=�Øð F EÔ$>ð FÝÐDÑEÔEÐEðFøåð Bð Bð BÝÐ@ÑAÔAÐAÐAÐAðBøøøð ˆ:‰<Œ<ð 	JØIÐ0Ð0Ð1FÑGÔGÐIÐIÐIå�H‘~”~Ô,Ô3×;Ò;Ñ=Ô=ˆØ Ñ'ˆà�~Š~ÑÔð 	4ÝÐ2Ñ3Ô3Ð3à(Ð(Ñ*Ô*ˆ
Øð 	<ÝÐ:Ñ;Ô;Ð;à#Ð&<Ñ<ˆØ"Ð%9Ñ9ˆØ%Ð(;Ñ;ˆØ×2Ò2°5´<Ñ@Ô@ˆàœÔ-Ô3Ø”|Ô+ØœÔ/Ø”|Ô+Ø&Ø%˜œ™œ×1Ò1Ñ3Ô3ð
ð 
ˆð Œ<Ô!ð 	:Ø#(¤<Ô#9ˆG�KÑ ØÔð 	5Ø$)Ô$4ˆG�LÑ!Ø#×/Ò/°Ñ7Ô7ˆØ×Ò §
¢
¨7Ñ 3Ô 3¸gÐÑFÔFÐFØ×Ò˜\Ñ*Ô*Ð*Ø×Ò¨ÐÑ.Ô.Ð.ð4?	=ÝŒ|˜wÒ&Ð&Ø���ØUÐUÐUÐUÐUÐUð "Ÿšðñô ÷ ’%‘'”'ð ð !�
Ô åœ¨¨fÝ˜KÑ(Ô(­#¨nÑ*=Ô*=ðð $ðð &.ðð 0;ðð	ð &Ô-Ø%Ô-ð	ð 	ð 2Ð1Ñ3Ô3ð	ð 	ð 	ð 	ð "%§¢Ð)SÐ)SÈ
Ð)SÑ)SÔ)SÑ!SÔ!S�ðW¨.ð Wð WÝœ+¥c¨+Ñ&6Ô&6Ñ7Ô7ðWð Wõ 5:´KÅÀNÑ@SÔ@SÑ4TÔ4TðWð Wð ð $Ÿ\š\¨(Ñ3Ô3�
Øð à×$Ò$Ø# V¨T°:Ð>Ø)Ô1Ø)Ô1Ø*.ð	 %ñ ô ð ð ð ×$Ò$Ø  zÐ2Ø)Ô1Ø)Ô1Ø*.ð	 %ñ ô ð øøõ ð 	=ð 	=ð 	=Ø×Ò¨4ÐÑ0Ô0Ð0Ø×!Ò!¨TÐ!Ñ2Ô2Ð2ÝÐ2¸!Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøð
 	×0Ò0Ñ2Ô2Ð2ÝÐ*Ñ+Ô+Ð+s0   ½7A6 Á6BÂBÈ5E!N Î
O(Î!<O#ÏO(Ï#O(Nr  )rJ   r   r    rK   )rJ   r   r    r!   )rT   r!   r    r!   )rS   r!   r    r«  )r¶  r   r®  r«  r    rš  )ri   r   r    rš  r¯  )ri   r   rÅ  r!   rÆ  rš  r    rš  )ri   r   r\  r	  rÔ  rš  r    rš  )rJ   r   r    r2   )rJ   ri  r    r!   )r  r!   r3  rš  r    r!   )rü  r;  )r(  r!   r<  r+   r=  r+   r    r!   )rQ  r!   r    rš  )
rT   r!   rU  r!   r   r!   ró  rš  r    r!   )ra  r!   r    r-  )
rJ   r   rT   r!   ra   r!   re  r-  r    rš  )r#   )rJ   r   rl  r!   r    r!   )rŸ  rš  r    rÁ  )r    rÁ  )JÚ__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rI   r    r½   rá   r  rl  ÚstaticmethodrT  rª  rµ  r¸  rÁ  rÄ  rÓ  rÙ  r  r*  rA  r^  rb  rf  ro  r6  rA  rV  rh  r¡  r¯  r»  rÆ  rÐ  râ  r  r  r8  r0  r2  rP  rT  r`  rg  rk  r~  r”  rŸ  r²  r·  r½  rË  rÜ  rß  rÞ  rL  rS  r}  r�  rµ  rÀ  r�  rÑ  ræ  rô  r  r  r  r,  r/  rA  ru  rË   r*   r(   r>   r>   e   s°  € € € € € € Ø>Ð>à*Ð*Ð*Ñ*ð]ð ]ð ]ð ]ðO6ð O6ð O6ð O6ðb3 ð 3 ð 3 ð 3 ðj1
ð 1
ð 1
ð 1
ðfj7ð j7ð j7ð j7ðXm ð m ð m ð m ð^ ð"ð "ð "ñ „\ð"ð|,ð |,ð |,ð |,ð|ð ð ð ð ð
ð 
ð 
ñ „\ð
ð"@ð @ð @ð @ðDð ð ð ð( MRðMð Mð Mð Mð Mð^Tð Tð Tð Tð0U ð U ð U ð U ðnQ+ð Q+ð Q+ð Q+ðf[
ð [
ð [
ð [
ðzl?ð l?ð l?ð l?ð\Rð Rð Rð Rð	
ð 	
ð 	
ð 	
ð
ð 
ð 
ð 
ð(F&ð F&ð F&ð F&ðP+,ð +,ð +,ð +,ðZ;:ð ;:ð ;:ð ;:ðz47ð 47ð 47ð 47ðljð jð jð jðXF
ð F
ð F
ð F
ðP*
ð *
ð *
ð *
ðX12ð 12ð 12ð 12ðf/
ð /
ð /
ð /
ðbENð ENð ENð ENðNORð ORð ORð ORðb.Kð .Kð .Kð .Kð`7 ð 7 ð 7 ð 7 ðr ð  ð  ð  ðB Ø;=Ø04ð-ð -ð -ð -ñ „\ð-ð&#Qð #Qð #Qð #QðJð ð ð ð8  %ð7@ð 7@ð 7@ð 7@ð 7@ðrð ð ð ð8$ð $ð $ð $ðL[
ð [
ð [
ð [
ðz'ð 'ð 'ð 'ðR;ð ;ð ;ð ;ðzSCð SCð SCð SCðjð ð ð ð"=ð =ð =ð =ð">]ð >]ð >]ð >]ð@TGð TGð TGð TGðlDð Dð Dð Dð,h9ð h9ð h9ð h9ðTWFð WFð WFð WFð WFðrFRð FRð FRð FRðPfNð fNð fNð fNðPE
ð E
ð E
ð E
ðNTið Tið Tið Tiðl  ð   ð   ð   ðD#ð #ð #ð #ðJ'ð 'ð 'ð 'ðRl*ð l*ð l*ð l*ð\/8ð /8ð /8ð /8ðb=
ð =
ð =
ð =
ð~b>ð b>ð b>ð b>ðH" ð " ð " ð " ðH8Dð 8Dð 8Dð 8Dðt<1ð <1ð <1ð <1ð|*Eð *Eð *Eð *EðXX,ð X,ð X,ð X,ð X,ð X,r*   r>   rC  rD  )r    r2   )8ry  Ú
__future__r   rq   rT  rp  r  ÚloggingrQ  rü   rý   r_  r  r   Úpathlibr   Útypingr   r   r	   rº  r
   r   Ú
agent.i18nr   Úagent.turn_contextr   rm  r   r   r   r   Úgateway.platforms.baser   r   r   Úgateway.sessionr   r   r   r   rÒ  r   r   r   Úutilsr   r   r   Ú	getLoggerrw   ru   r)   r0   r<   r>   rË   r*   r(   ú<module>r†     sq  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð ð ð ]Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \ðð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜=Ñ	)Ô	)€ð  Ð ðMð Mð Mð Mð
ð ð ð ðð ð ð ð:CX,ð CX,ð CX,ð CX,ð CX,ñ CX,ô CX,ð CX,ð CX,ð CX,r*   