§
    øžyjÖˆ ã                  ó(  — U 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	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  ej        e¦  «        Z	 dd	lmZmZ dd
lmZmZ n# e$ r eZeZdZdZY nw xY w ed¬¦  «         G d„ d¦  «        ¦   «         Z  e!h d£¦  «        Z"de#d<   g  e dddddd¬¦  «        ‘ e ddddddd¬¦  «        ‘ e ddddd¬ ¦  «        ‘ e d!d"dd¬#¦  «        ‘ e d$d%dd¬#¦  «        ‘ e d&d'dd¬#¦  «        ‘ e d(d)dd¬#¦  «        ‘ e d*d+d¦  «        ‘ e d,d-ddd.d/¬0¦  «        ‘ e d1d2dd3¬4¦  «        ‘ e d5d6dd¬4¦  «        ‘ e d7d8dd9d¬:¦  «        ‘ e d;d<dd=d¬>¦  «        ‘ e d?d@ddAdB¬>¦  «        ‘ e dCdDddE¬4¦  «        ‘ e dFdGdddHdI¬J¦  «        ‘ e dKdLdMddN¬O¦  «        ‘ e dPdQdMddR¬O¦  «        ‘ e dSdTdddS¬U¦  «        ‘ e dVdWdddXd¬Y¦  «        ‘ e dZd[ddd\d¬Y¦  «        ‘ e d]d^ddd_d¬Y¦  «        ‘ e d`daddbdcd¬d¦  «        ‘ e dedfddgd¬h¦  «        ‘ e didjddkddldm¬n¦  «        ‘ e dodpddqdcddo¬¦  «        ‘ e drdsddcddr¬t¦  «        ‘ e dudvddwddu¬t¦  «        ‘ e dxdyddzd{d|d¬}¦  «        ‘ e d~ddd€¬4¦  «        ‘ e d�d‚ddcdƒd�¬t¦  «        ‘ e d„d…dd†d¬‡¦  «        ‘ e dˆd‰dd¬Š¦  «        ‘ e d‹dŒdd�dŽdd‹d‹¬�¦  «        ‘ e d�d‘dd’d“d”d¬}¦  «        ‘ e d•d–d—¦  «        ‘ e d˜d™d—dd˜¬š¦  «        ‘ e d›dœddd�¬ž¦  «        ‘ e dŸd dd¬4¦  «        ‘ e d¡d¢d¦  «        ‘ e d£d¤dMd¬#¦  «        ‘ e d¥d¦dMd§dƒd¥¬t¦  «        ‘ e d¨d©dMdªd«dƒd¨¬¦  «        ‘ e d¬d­dMd¬4¦  «        ‘ e d®d¯dMdd°¬±¦  «        ‘ e d²d³dMdd´dµ¬¶¦  «        ‘ e d·d¸dMdd´dµd¹¬º¦  «        ‘ e d»d¼d—d½d¾¬¿¦  «        ‘ e dÀdÁdMddÂd¬Ã¦  «        ‘ e dÄdÅdMdd´dµ¬¶¦  «        ‘ e dÆdÇdMd´dµd¬È¦  «        ‘ e dÉdÊdMd¬Š¦  «        ‘ e dËdÌdMdÍdÎ¬¿¦  «        ‘ e dÏdÐdMdÑdÒ¬¿¦  «        ‘ e dÓdÔdMdÕdÖ¬¿¦  «        ‘ e d×dØdMdd¬O¦  «        ‘ e dÙdÚdMddÛdÜ $                    e¦  «        › dÝ�e¬¶¦  «        ‘ e dÞdßdMdàdá¬¿¦  «        ‘ e dâdãdMdd´dµ¬¶¦  «        ‘ e dädådMddædç¬¶¦  «        ‘ e dèdédêdëd¬:¦  «        ‘ e dìdídêd¬#¦  «        ‘ e dîdïdêddðdñ¬ò¦  «        ‘ e dódôdêdõdö¬¿¦  «        ‘ e d÷dødêd÷¬ù¦  «        ‘ e dúdûdêddüdý¬¶¦  «        ‘ e dþdÿdêd�d �d¬J¦  «        ‘ e �d�ddê�d¬4¦  «        ‘ e �d�ddê�d¬4¦  «        ‘ e �d�d	dêd�d
�d¬¶¦  «        ‘ e �d�ddê�d�d�d�¬¦  «        ‘ e �d�ddê�d�d¬>¦  «        ‘ e �d�ddê�d
�d¬¿¦  «        ‘ e �d�ddê�d
�dd¬È¦  «        ‘ e �d�ddêd¬#¦  «        ‘ e �d�ddê�d �¬!¦  «        ‘ e �d"�d#dê�d$�¬!¦  «        ‘ e �d%�d&dêd�d'�d(¬¶¦  «        ‘ e �d)�d*dêd¬#¦  «        ‘ e �d+�d,d—d�d-d�d.�¬/¦  «        ‘ e �d0�d1d—d�d2¬š¦  «        ‘ e �d3�d4ddd�¬5¦  «        ‘ e �d6�d7d—�d8¬4¦  «        ‘ e �d9�d:d—d�d;¬±¦  «        ‘ e �d<�d=d—¦  «        ‘ e �d>�d?d—�d@¬4¦  «        ‘ e �dA�dBd—d�dC¬±¦  «        ‘ e �dD�dEd—d�dF¬ ¦  «        ‘ e �dG�dHd—ddE¬O¦  «        ‘ e �dI�dJd—d¬#¦  «        ‘ e �dK�dLd—d�dM¬O¦  «        ‘ e �dN�dOd—d¬Š¦  «        ‘ e �dP�dQd—�dRd�dP�¬S¦  «        ‘ e �dT�dUd—�dV¬4¦  «        ‘ e �dW�dX�dYd�dZ�d[¬J¦  «        ‘Z%�d\e#�d]<   �dÁ�d`„Z& e&¦   «         Z'�d_e#�da<   �dÂ�de„Z(�dÃ�dg„Z)i Z*�dhe#�di<   e%D ]EZ+e+j,        s< e)e+¦  «        e*�dje+j-        › �<   e+j.        D ]Z/e+j0        › �dke+j-        › �dl�e*�dje/› �<   ŒŒFi Z1�dme#�dn<   e%D ]^Z+e+j,        sUe1 2                    e+j3        i ¦  «        Z4e*�dje+j-        › �         e4�dje+j-        › �<   e+j.        D ]Z/e*�dje/› �         e4�dje/› �<   ŒŒ_i Z5�doe#�dp<   e%D ]%Z+e+j6        r e7e+j6        ¦  «        e5�dje+j-        › �<   Œ& ej8        �dq¦  «        Z9e%D ]`Z+�dje+j-        › �Z:e:e5v se+j;        sŒe9 <                    e+j;        ¦  «        Z=e=r+e= >                    d¦  «         ?                    dÜ¦  «        e5e:<   Œa e!�dr„ e%D ¦   «         ¦  «        Z@de#�ds<   �dÄ�dv„ZA e!�dw„ e%D ¦   «         ¦  «        ZBde#�dx<   �dÅ�dz„ZC�dÅ�d{„ZD�dÆ�d}„ZE�dÇ�dÈ�d€„ZF�dÉ�d‚„ZG�dÊ�d„„ZH�dË�d†„ZI�dÌ�dˆ„ZJ�d‰ZK�dŠZLh �d‹£ZM�dŒZN	 �dÍ�d�„ZO�dÎ�d’„ZP�dÏ�d”„ZQ�dÐ�d˜„ZR�dÑ�d™„ZS�dÒ�dš„ZT�d›ZU	 eUZV ej8        �dœ¦  «        ZW ej8        �d�¦  «        ZX�dÓ�dŸ„ZY�dÔ�d£„ZZeZZ[	 	 �dÕ�dÖ�dª„Z\�d×�dØ�d­„Z]�dÙ�d®„Z^�dÚ�d°„Z_�d±Z`�d›Za ej8        �d²¦  «        Zb e!h �d³£¦  «        Zc�d´Zd e!h �dµ£¦  «        Ze�dÓ�d¶„Zf�dË�d·„Zg�dÛ�dÜ�dº„Zh�dÝ�d»„Zi G �d¼„ �d½e¦  «        Zj G �d¾„ �d¿e¦  «        Zk�dÞ�dÀ„ZldS (ß  a–  Slash command definitions and autocomplete for the Hermes CLI.

Central registry for all slash commands. Every consumer -- CLI help, gateway
dispatch, Telegram BotCommands, Slack subcommand mapping, autocomplete --
derives its data from ``COMMAND_REGISTRY``.

To add a command: add a ``CommandDef`` entry to ``COMMAND_REGISTRY``.
To add an alias: set ``aliases=("short",)`` on the existing ``CommandDef``.
é    )ÚannotationsN)ÚCallableÚMapping)Ú	dataclassÚfield)ÚAny)Úis_truthy_value)ÚINDICATOR_STYLES)ÚAutoSuggestÚ
Suggestion)Ú	CompleterÚ
CompletionT)Úfrozenc                  ó°   — e Zd ZU dZded<   ded<   ded<   dZded<   d	Zded
<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dS )Ú
CommandDefz%Definition of a single slash command.ÚstrÚnameÚdescriptionÚcategory© útuple[str, ...]ÚaliasesÚ Ú	args_hintÚsubcommandsFÚboolÚcli_onlyÚgateway_onlyNú
str | NoneÚgateway_config_gateÚrejectÚbusy_policyÚbusy_handlerÚexecute)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r    r"   r#   r$   r   ó    ú9/home/ragecks/.hermes/hermes-agent/hermes_cli/commands.pyr   r   .   sÖ   € € € € € € à/Ð/à€I€I�IØÐÐÑØ€M€M�MØ!€GÐ!Ð!Ð!Ñ!Ø€IÐÐÐÑØ#%€KÐ%Ð%Ð%Ñ%Ø€HÐÐÐÑØ€LÐÐÐÑØ&*ÐÐ*Ð*Ð*Ñ*ð"  €KÐÐÐÑð
  $€LÐ#Ð#Ð#Ñ#ð €GÐÐÐÑÐÐr*   r   >   r!   ÚdispatchÚinterrupt_then_dispatchzfrozenset[str]ÚVALID_BUSY_POLICIESÚstartz0Acknowledge platform start pings without a replyÚSessionr,   )r   r"   r#   Únewz0Start a new session (fresh session ID + history))Úresetz[name]r-   )r   r   r"   r#   Útopicz,Enable or inspect Telegram DM topic sessionsz[off|help|session-id])r   r   Úclearz$Clear screen and start a new session)r   Úredrawz6Force a full UI repaint (recovers from terminal drift)ÚhistoryzShow conversation historyÚsavezSave the current conversationÚretryz(Retry the last message (resend to agent)Úpromptz<Compose your next prompt in $EDITOR (markdown), then send itz[initial text])Úcompose)r   r   r   Úundoz.Back up N user turns and re-prompt (default 1)z[N]©r   Útitlez#Set a title for the current sessionÚhandoffzGHand off this session to a messaging platform (Telegram, Discord, etc.)z
<platform>)r   r   Úbranchz5Branch the current session (explore a different path))Úfork)r   r   ÚcompresszhCompress conversation context (add 'here [N]' to keep recent N turns; --preview shows what would happen))Úcompactz.[here [N] | focus topic | --preview|--dry-run]Úrollbackz&List or restore filesystem checkpointsz[number]Úsnapshotz8Create or restore state snapshots of Hermes config/state)Úsnapz[create|restore <id>|prune])r   r   r   Úexportz?Export a profile (config, skills, theme) to a shareable archiveÚConfigurationz[profile] [-o output.tar.gz])r   r   Úimportz0Import a shared profile archive as a new profilez <archive.tar.gz> [--name <name>]Ústopz%Kill all running background processes)r"   r#   Úpausez>Pause new work globally (emergency stop); '/pause off' resumesz[reason | off])r   r   r"   Úapprovez#Approve a pending dangerous commandz[session|always]Údenyz;Deny a pending dangerous command (optionally with a reason)z[all] [reason]Ú
backgroundzRun a prompt in the background)ÚbgÚbtwz<prompt>)r   r   r"   Úagentsz$Show active agents and running tasks)Útasks)r   r"   Újourneyz"Open the learning journey timeline)Úlearningzmemory-graphz[list|delete <id>|edit <id>])ÚlistÚdeleteÚedit)r   r   r   r   Úqueuez4Queue a prompt for the next turn (doesn't interrupt))ÚqÚsteerz>Inject a message after the next tool call without interrupting)r   r"   r#   Úgoalz?Set a standing goal Hermes works on across turns until achievedze[text | draft <text> | show | gate add <cmd> | pause | resume | clear | status | wait <pid> | unwait]Ú	heartbeatz<Set a recurring prompt that re-enters this session when idle)Úhbz=[every <interval> <prompt> | status | pause | resume | clear])ÚstatusrJ   Úresumer4   )r   r   r   r"   Úrefinez>Review this conversation now and save lessons to memory/skillsz[focus instructions]ÚmoazTRun one prompt through the default Mixture of Agents preset, then restore your modelr!   Úsubgoalz/Add or manage extra criteria on the active goalz[text | remove N | clear])r   r"   r]   z,Show session, model, token, and context info)r"   ÚegresszShow Docker egress proxy statusz[status])r]   )r   r   r"   r#   r$   ÚcontextziShow detailed context window view with usage gauge, category breakdown, compression stats, and throughput)Úctxz[all])ÚallÚwhoamiz-Show your slash command access (admin / user)ÚInfoÚprofilez+Show active profile name and home directory)r"   r$   Úsethomez!Set this chat as the home channel)zset-home)r   r   r^   z!Resume a previously-named sessionÚsessionsz#Browse and resume previous sessionsÚconfigzShow current configurationÚmodelz2Switch model (session-scoped; --global to persist)z:[model] [--provider name] [--global|--session] [--refresh]zcodex-runtimez7Toggle codex app-server runtime for OpenAI/Codex models)Úcodex_runtimez[auto|codex_app_server]ÚpersonalityzSet a predefined personalityÚ	statusbarz#Toggle the context/model status bar)Úsb)r   r   Úbatteryz8Toggle a color-coded battery indicator in the status barz[on|off|status])ÚonÚoffr]   )r   r   r   Ú
timestampsz2Toggle [HH:MM] timestamps on messages and /history)Úts)r   r   r   r   Údiffz)Show git changes in the working directoryz'[staged|all|session] [--stat] [path...])Ústagedre   Úsession)r   r   Úverbosez@Cycle tool progress display: off -> new -> all -> verbose -> logzdisplay.tool_progress_command)r   r    r"   ÚfocusuB   Toggle focus view â€” show only your prompt and the final responseÚfooterz7Toggle gateway runtime-metadata footer on final replies)r   r   r"   Úyoloz7Toggle YOLO mode (skip all dangerous command approvals)Ú	approvalsz:Show or set the persistent dangerous-command approval modez[manual|smart|off])ÚmanualÚsmartrs   Ú	reasoningz#Manage reasoning effort and displayz'[level|show|hide|full|clamp] [--global])ÚnoneÚminimalÚlowÚmediumÚhighÚxhighÚmaxÚultraÚshowÚhiderr   rs   ÚfullÚclampú--globalÚfastuS   Toggle fast mode â€” OpenAI Priority Processing / Anthropic Fast Mode (Normal/Fast)z[normal|fast|status] [--global])ÚnormalrŽ   r]   rr   rs   r�   Úskinz%Show or change the display skin/themeÚ	indicatorz!Pick the TUI busy-indicator styleÚ[Ú|Ú]ÚvoicezToggle voice modez[on|off|tts|status])rr   rs   Úttsr]   Úwakez*Toggle the 'Hey Hermes' wake word listenerÚbusyz/Control what Enter does while Hermes is workingz[queue|steer|interrupt|status])rW   rY   Ú	interruptr]   Útoolsz4Manage tools: /tools [list|disable|enable] [name...]zTools & Skillsz[list|disable|enable] [name...]ÚtoolsetszList available toolsetsÚskillsz*Search, install, inspect, or manage skillszskills.write_approval)
ÚsearchÚbrowseÚinspectÚinstallÚauditÚpendingrK   r!   rv   Úapproval)r   r    r   Úmemoryz7Review pending memory writes / toggle the approval gatez-[pending|approve|reject|approval] [id|on|off])r¢   rK   r!   r£   Úbundlesz8List skill bundles (aliases /<name> for multiple skills))r$   Úpetz>Toggle or adopt a petdex mascot (/pet, /pet list, /pet <slug>)z[toggle|list|scale <n>|<slug>])ÚtogglerT   Úscalers   Úhatchz,Generate a new petdex pet from a description)zgenerate-petz[description]ÚlearnzPLearn a reusable skill from anything you describe (dirs, URLs, this chat, notes)z<what to learn from>ÚinitzBGenerate or update AGENTS.md project instructions from a repo scanz[notes]ÚcronzManage scheduled tasksz[subcommand])rT   ÚaddÚcreaterV   rJ   r^   ÚrunÚremoveÚsuggestionsz-Review suggested automations (accept/dismiss))Úsuggestz[accept|dismiss N | catalog])ÚacceptÚdismissÚcatalogr4   )r   r   r   Ú	blueprintz.Set up an automation from a blueprint template)Úbpz[name] [slot=value ...]ÚcuratorzGBackground skill maintenance (status, run, pin, archive, list-archived))r]   r¯   rJ   r^   ÚpinÚunpinÚrestorezlist-archivedÚkanbanz:Multi-profile collaboration board (tasks, links, comments))!r«   Úboardsr®   rT   Úlsr‰   ÚassignÚreclaimÚreassignÚdiagnosticsÚdiagÚlinkÚunlinkÚclaimÚcommentÚcompleterV   ÚblockÚunblockÚarchiveÚtailr,   Ústatsznotify-subscribeznotify-listznotify-unsubscribeÚlogÚrunsr[   Ú	assigneesrc   ÚspecifyÚgcÚreloadz.Reload .env variables into the running sessionz
reload-mcpzReload MCP servers from config)Ú
reload_mcp)r   zreload-skillsz?Re-scan ~/.hermes/skills/ for newly installed or removed skills)Úreload_skillsÚbrowserzBConnect browser tools to your live Chromium-family browser via CDPz[connect|disconnect|status])ÚconnectÚ
disconnectr]   Úpluginsz'List installed plugins and their statusÚcommandsz*Browse all commands and skills (paginated)z[page]Úgateway_commands)r   r   r"   r$   ÚhelpzShow available commandsÚgateway_helpÚrestartz9Gracefully restart the gateway after draining active runs)r   r"   ÚusagezLShow token usage and rate limits; `reset` redeems a banked Codex limit resetz[reset [--force]]Úsubscriptionz0View your Nous plan and change it in the browser)ÚupgradeÚtopupz7Show your Nous balance and manage billing on the portalÚinsightsz!Show usage insights and analyticsz[days]Ú	platformsz&Show gateway/messaging platform status)ÚgatewayÚplatformz1Pause, resume, or list a failing gateway platformz<pause|resume|list> [name]Úcopyz-Copy the last assistant response to clipboardÚpastez*Attach clipboard image from your clipboardÚimagez.Attach a local image file for your next promptz<path>Úupdatez)Update Hermes Agent to the latest versionÚversionzShow Hermes Agent version)Úv)r   r"   r$   Údebugz@Upload debug report (system info + logs) and get shareable linksz[nous|local]Úquitz:Exit the CLI (use --delete to also remove session history)ÚExit)Úexitz
[--delete]zlist[CommandDef]ÚCOMMAND_REGISTRYÚreturnúdict[str, CommandDef]c                 óP   — i } t           D ]}|| |j        <   |j        D ]}|| |<   ŒŒ| S )z+Map every name and alias to its CommandDef.)rñ   r   r   )ÚlookupÚcmdÚaliass      r+   Ú_build_command_lookuprø   `  sH   € à$&€FÝð  ð  ˆØˆˆsŒxÑØ”[ð 	 ð 	 ˆEØˆF�5‰MˆMð	 à€Mr*   Ú_COMMAND_LOOKUPr   r   úCommandDef | Nonec                ó€   — t                                |                      ¦   «                              d¦  «        ¦  «        S )zmResolve a command name or alias to its CommandDef.

    Accepts names with or without the leading slash.
    ú/)rù   ÚgetÚlowerÚlstrip)r   s    r+   Úresolve_commandr   m  s.   € õ
 ×Ò˜tŸzšz™|œ|×2Ò2°3Ñ7Ô7Ñ8Ô8Ð8r*   rö   c                óR   — | j         r| j        › d| j        › d| j         › d�S | j        S )z;Build a CLI-facing description string including usage hint.z
 (usage: /Ú ú))r   r   r   )rö   s    r+   Ú_build_descriptionr  u  s:   € à
„}ð IØ”/ÐHÐH¨S¬XÐHÐH¸¼ÐHÐHÐHÐHØŒ?Ðr*   údict[str, str]ÚCOMMANDSrü   z (alias for /r  zdict[str, dict[str, str]]ÚCOMMANDS_BY_CATEGORYzdict[str, list[str]]ÚSUBCOMMANDSz[a-z]+(?:\|[a-z]+)+c              #  ó\   K  — | ]'}|j         r|j        ¯|j        g|j        ¢R D ]}|V — ŒŒ(d S ©N)r   r    r   r   )Ú.0rö   r   s      r+   ú	<genexpr>r  ©  su   è è € ð 3ð 3àØŒ<ð3ð Ô2ð3ð ”Ð(˜CœKÐ(Ð(ð	3ð 3ð 	ð 	ð3ð 3ð 3ð 3ð 3ð 3ð 3r*   ÚGATEWAY_KNOWN_COMMANDSr   r   c                ó`   — | sdS | t           v rdS t          ¦   «         D ]\  }}}|| k    r dS ŒdS )uÆ  Return True if ``name`` resolves to a gateway-dispatchable slash command.

    This covers both built-in commands (``GATEWAY_KNOWN_COMMANDS`` derived
    from ``COMMAND_REGISTRY``) and plugin-registered commands, which are
    looked up lazily so importing this module never forces plugin
    discovery. Gateway code uses this to decide whether to emit
    ``command:<name>`` hooks â€” plugin commands get the same lifecycle
    events as built-ins.
    FT)r  Ú_iter_plugin_command_entries)r   Úplugin_nameÚ_descriptionÚ
_args_hints       r+   Úis_gateway_known_commandr  ±  sZ   € ð ð ØˆuØÕ%Ð%Ð%ØˆtÝ1MÑ1OÔ1Oð ð Ñ-ˆ�\ :Ø˜$ÒÐØ�4�4ð àˆ5r*   c              #  ó:   K  — | ]}|j         d k    ¯|j        V — ŒdS )r!   N)r"   r   )r  rö   s     r+   r  r  Ë  s9   è è € ð ;ð ;Ø¨C¬O¸xÒ,GÐ,G€C„HÐ,GÐ,GÐ,GÐ,Gð;ð ;r*   ÚACTIVE_SESSION_BYPASS_COMMANDSÚcommand_namec                óF   — | sdS t          | ¦  «        }|duo
|j        dk    S )a›  Return True when *command_name* must interrupt a running agent first.

    Derived from the registry: commands whose ``busy_policy`` is
    "interrupt_then_dispatch" (the /stop, /new, /reset class).  Guard 1
    (gateway/platforms/base.py) routes these through the cancel-handoff
    path that serializes cancellation + runner response + pending drain.
    Accepts aliases (e.g. "reset" resolves to "new").
    FNr-   )r   r"   )r  rö   s     r+   Úis_interrupt_then_dispatchr  Ð  s5   € ð ð ØˆuÝ
˜,Ñ
'Ô
'€CØ�dˆ?ÐK˜sœÐ2KÒKÐKr*   c                ó,   — | rt          | ¦  «        dundS )uÆ  Return True for any resolvable slash command.

    Rationale: every gateway-registered slash command either has a
    specific Level-2 handler in gateway/run.py (/stop, /new, /model,
    /approve, etc.) or reaches the running-agent catch-all that returns
    a "busy â€” wait or /stop first" response. In both paths the command
    is dispatched, not queued.

    Queueing is always wrong for a recognized slash command because the
    safety net in gateway.run discards any command text that reaches
    the pending queue â€” which meant a mid-run /model (or /reasoning,
    /voice, /insights, /title, /resume, /retry, /undo, /compress,
    /usage, /reload-mcp, /sethome, /reset) would silently
    interrupt the agent AND get discarded, producing a zero-char
    response. See issue #5057 / PRs #6252, #10370, #4665.

    ACTIVE_SESSION_BYPASS_COMMANDS remains the subset of commands with
    explicit Level-2 handlers; the rest fall through to the catch-all.
    NF)r   )r  s    r+   Úshould_bypass_active_sessionr  ß  s"   € ð( 9EÐO�?˜<Ñ(Ô(°Ð4Ð4È%ÐOr*   úset[str]c                 ó¼  — d„ t           D ¦   «         } | st          ¦   «         S 	 ddlm}  |¦   «         }n# t          $ r t          ¦   «         cY S w xY wt          ¦   «         }| D ]y}|}|j                             d¦  «        D ]/}t          |t          ¦  «        r| 	                    |¦  «        }Œ-d} t          |d¬¦  «        r|                     |j        ¦  «         Œz|S )zùReturn canonical names of commands whose ``gateway_config_gate`` is truthy.

    Reads ``config.yaml`` and walks the dot-separated key path for each
    config-gated command.  Returns an empty set on any error so callers
    degrade gracefully.
    c                ó    — g | ]}|j         ¯	|‘ŒS r   )r    )r  Úcs     r+   ú
<listcomp>z)_resolve_config_gates.<locals>.<listcomp>ý  s    € ÐBÐBÐB�1¨AÔ,AÐBˆQÐBÐBÐBr*   r   ©Úread_raw_configú.NF)Údefault)rñ   ÚsetÚhermes_cli.configr!  Ú	Exceptionr    ÚsplitÚ
isinstanceÚdictrý   r	   r­   r   )Úgatedr!  ÚcfgÚresultrö   ÚvalÚkeys          r+   Ú_resolve_config_gatesr/  ö  s  € ð CÐBÕ(ÐBÑBÔB€EØð Ý‰uŒuˆðØ5Ð5Ð5Ð5Ð5Ð5ØˆoÑÔˆˆøÝð ð ð Ý‰uŒuˆˆˆðøøøå‘u”u€FØð 	!ð 	!ˆØˆØÔ*×0Ò0°Ñ5Ô5ð 	ð 	ˆCÝ˜#�tÑ$Ô$ð Ø—g’g˜c‘l”l��à�ØÝ˜3¨Ð.Ñ.Ô.ð 	!Ø�JŠJ�s”xÑ Ô Ð øØ€Ms   £4 ´AÁAÚconfig_overridesúset[str] | Nonec                ó\   — | j         sdS | j        r|�|nt          ¦   «         }| j        |v S dS )a}  Check if *cmd* should appear in gateway surfaces (help, menus, mappings).

    Unconditionally available when ``cli_only`` is False.  When ``cli_only``
    is True but ``gateway_config_gate`` is set, the command is available only
    when the config value is truthy.  Pass *config_overrides* (from
    ``_resolve_config_gates()``) to avoid re-reading config for every command.
    TNF)r   r    r/  r   )rö   r0  Ú	overridess      r+   Ú_is_gateway_availabler4    sG   € ð Œ<ð ØˆtØ
Ôð %Ø(8Ð(DÐ$Ð$ÕJ_ÑJaÔJaˆ	ØŒx˜9Ð$Ð$Øˆ5r*   r   c                óP   — |                       ¦   «                              d¦  «        S )zFReturn True when selecting a command without text would be incomplete.Ú<)ÚstripÚ
startswithr<   s    r+   Ú_requires_argumentr9  #  s    € à�?Š?ÑÔ×'Ò'¨Ñ,Ô,Ð,r*   ú	list[str]c            	     óÖ  — t          ¦   «         } g }t          D ]Ð}t          || ¦  «        sŒ|j        r
d|j        › �nd}g }|j        D ]Z}|                     dd¦  «        |j                             dd¦  «        k    r||j        k    rŒA|                     d|› d�¦  «         Œ[|rdd                     |¦  «        › d	�nd}|                     d|j        › |› d
|j	        › |› �¦  «         ŒÑ|S )z3Generate gateway help text lines from the registry.r  r   Ú-Ú_z`/ú`z	 (alias: z, r  z` -- )
r/  rñ   r4  r   r   Úreplacer   ÚappendÚjoinr   )r3  Úlinesrö   ÚargsÚalias_partsÚaÚ
alias_notes          r+   Úgateway_help_linesrG  (  s!  € å%Ñ'Ô'€IØ€EÝð Nð NˆÝ$ S¨)Ñ4Ô4ð 	ØØ&)¤mÐ;Ð"�3”=Ð"Ð"Ð"¸ˆØ!#ˆØ”ð 	*ð 	*ˆAà�yŠy˜˜cÑ"Ô" c¤h×&6Ò&6°s¸CÑ&@Ô&@Ò@Ð@ÀQÈ#Ì(Â]À]ØØ×Ò˜y A˜y˜y˜yÑ)Ô)Ð)Ð)Ø>IÐQÐ: §¢¨;Ñ!7Ô!7Ð:Ð:Ð:Ð:Èrˆ
Ø�ŠÐL˜#œ(ÐL DÐLÐL¨s¬ÐLÀ
ÐLÐLÑMÔMÐMÐMØ€Lr*   úlist[tuple[str, str, str]]c                 óò  — 	 ddl m}  n# t          $ r g cY S w xY w	  | ¦   «         pi }n# t          $ r g cY S w xY wg }|                     ¦   «         D ]¥\  }}t	          |t
          ¦  «        rt	          |t          ¦  «        sŒ0t          |                     d¦  «        pd|› �¦  «        }t          |                     d¦  «        pd¦  «                             ¦   «         }| 	                    |||f¦  «         Œ¦|S )am  Yield (name, description, args_hint) tuples for all plugin slash commands.

    Plugin commands are registered via
    :func:`hermes_cli.plugins.PluginContext.register_command`. They behave
    like ``CommandDef`` entries for gateway surfacing: they appear in the
    Telegram command menu, in Slack's ``/hermes`` subcommand mapping, and
    (via :func:`plugins.platforms.discord.adapter._register_slash_commands`) in
    Discord's native slash command picker.

    Lookup is lazy so importing this module never forces plugin discovery
    (which can trigger filesystem scans and environment-dependent
    behavior).
    r   ©Úget_plugin_commandsr   úRun /r   r   )
Úhermes_cli.pluginsrK  r&  Úitemsr(  r   r)  rý   r7  r@  )rK  rÚ   Úentriesr   Úmetar   r   s          r+   r  r  ;  s5  € ðØ:Ð:Ð:Ð:Ð:Ð:Ð:øÝð ð ð Øˆ	ˆ	ˆ	ðøøøðØ&Ð&Ñ(Ô(Ð.¨BˆˆøÝð ð ð Øˆ	ˆ	ˆ	ðøøøà*,€GØ—n’nÑ&Ô&ð 7ð 7‰
ˆˆdÝ˜$¥Ñ$Ô$ð 	­J°t½TÑ,BÔ,Bð 	ØÝ˜$Ÿ(š( =Ñ1Ô1ÐC°^¸T°^°^ÑDÔDˆÝ˜Ÿš Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<ˆ	Ø�Š˜˜k¨9Ð5Ñ6Ô6Ð6Ð6Ø€Ns   ‚	 ‰—œ) ©8·8úlist[tuple[str, str]]c                 óZ  — t          ¦   «         } g }t          D ]E}t          || ¦  «        sŒt          |j        ¦  «        }|r|                     ||j        f¦  «         ŒFt          ¦   «         D ]>\  }}}t          |¦  «        rŒt          |¦  «        }|r|                     ||f¦  «         Œ?|S )ac  Return (command_name, description) pairs for Telegram setMyCommands.

    Telegram command names cannot contain hyphens, so they are replaced with
    underscores.  Aliases are skipped -- Telegram shows one menu entry per
    canonical command.

    Built-in commands that require arguments (e.g. /queue, /steer, /background)
    are **included** because their handlers return usage text when selected
    without a payload, making them discoverable via autocomplete.

    Plugin-registered slash commands that require arguments are **excluded**
    because plugins may not provide a no-arg usage fallback.
    )	r/  rñ   r4  Ú_sanitize_telegram_namer   r@  r   r  r9  )r3  r,  rö   Útg_namer   r   r   s          r+   Útelegram_bot_commandsrU  [  sÌ   € õ &Ñ'Ô'€IØ$&€FÝð 6ð 6ˆÝ$ S¨)Ñ4Ô4ð 	Øõ *¨#¬(Ñ3Ô3ˆØð 	6Ø�MŠM˜7 C¤OÐ4Ñ5Ô5Ð5øÝ(DÑ(FÔ(Fð 2ð 2Ñ$ˆˆk˜9Ý˜iÑ(Ô(ð 	ØÝ)¨$Ñ/Ô/ˆØð 	2Ø�MŠM˜7 KÐ0Ñ1Ô1Ð1øØ€Mr*   é<   éd   >   r@  Úprependr?  )rÜ   r1   rI   r]   rb   r^   rj   rl   rí   rÞ   rê   ry   rÚ   rK   rL   rW   rY   rM   r€   rß   rä   ræ   rh   rf   ÚrootúMapping[str, Any]Úpathc                óž   — | }|D ]0}t          |t          ¦  «        si c S |                     |¦  «        }Œ1t          |t          ¦  «        r|ni S r
  )r(  r   rý   )rY  r[  Únoder.  s       r+   Ú_nested_mappingr^  «  s[   € Ø€DØð ð ˆÝ˜$¥Ñ(Ô(ð 	ØˆIˆIˆIØ�xŠx˜‰}Œ}ˆˆÝ˜d¥GÑ,Ô,Ð4ˆ4ˆ4°"Ð4r*   údict[str, Any]c            	     óº  — 	 ddl m}   | ¦   «         pi }n# t          $ r i }Y nw xY wt          |t          ¦  «        si }t          t          |dddd¦  «        ¦  «        }|                     dt          ¦  «        }	 t          |¦  «        }n# t          t          f$ r
 t          }Y nw xY wt          dt          t          |¦  «        ¦  «        }t          |                     d	¦  «        pd
¦  «                             ¦   «                              ¦   «         }|t$          vrd
}|                     d¦  «        }t          |t&          ¦  «        rd„ |D ¦   «         }ng }|||dœS )z—Return normalized Telegram command-menu config with safe defaults.

    Canonical user-facing path:
    ``platforms.telegram.extra.command_menu``.
    r   r   rä   ÚtelegramÚextraÚcommand_menuÚmax_commandsé   Úpriority_moderX  Úpriorityc                ón   — g | ]2}t          |¦  «                             ¦   «         ¯#t          |¦  «        ‘Œ3S r   )r   r7  )r  Úitems     r+   r  z1_telegram_command_menu_config.<locals>.<listcomp>Ñ  s3   € ÐLÐLÐL $½#¸d¹)¼)¿/º/Ñ:KÔ:KÐL•C˜‘I”IÐLÐLÐLr*   )rd  rf  rg  )r%  r!  r&  r(  r   r)  r^  rý   Ú#_DEFAULT_TELEGRAM_MENU_MAX_COMMANDSÚintÚ	TypeErrorÚ
ValueErrorr‡   ÚminÚ_TELEGRAM_BOT_API_MAX_COMMANDSr   r7  rþ   Ú_TELEGRAM_PRIORITY_MODESrT   )r!  Úraw_cfgÚmenu_cfgrd  rf  Úraw_priorityrg  s          r+   Ú_telegram_command_menu_configrt  ´  sŽ  € ðØ5Ð5Ð5Ð5Ð5Ð5Ø!�/Ñ#Ô#Ð) rˆˆøÝð ð ð Øˆˆˆðøøøå�g�wÑ'Ô'ð Øˆå•O G¨[¸*ÀgÈ~Ñ^Ô^Ñ_Ô_€Hà—<’< Õ0SÑTÔT€Lð;Ý˜<Ñ(Ô(ˆˆøÝ•zÐ"ð ;ð ;ð ;Ý:ˆˆˆð;øøøå�q�#Õ<¸lÑKÔKÑLÔL€Lå˜Ÿš _Ñ5Ô5ÐB¸ÑCÔC×IÒIÑKÔK×QÒQÑSÔS€MØÕ4Ð4Ð4Ø!ˆà—<’< 
Ñ+Ô+€LÝ�,¥Ñ%Ô%ð ØLÐL¨,ÐLÑLÔLˆˆàˆð %Ø&Øðð ð s   ‚ •$£$Á:B
 Â
B%Â$B%rk  c                 óD   — t          t          ¦   «         d         ¦  «        S )z@Return configured Telegram BotCommand menu cap with safe bounds.rd  )rk  rt  r   r*   r+   Útelegram_menu_max_commandsrv  Ü  s   € åÕ,Ñ.Ô.¨~Ô>Ñ?Ô?Ð?r*   Ú	raw_namesúlist[str] | tuple[str, ...]r   c                óâ   — g }t          ¦   «         }| D ]N}t          t          |¦  «        ¦  «        }|r.||vr*|                     |¦  «         |                     |¦  «         ŒOt          |¦  «        S r
  )r$  rS  r   r­   r@  Útuple)rw  r,  ÚseenÚraw_namer   s        r+   Ú_dedupe_sanitized_namesr}  á  sr   € Ø€FÝ‘U”U€DØð  ð  ˆÝ&¥s¨8¡}¤}Ñ5Ô5ˆØð 	 �D Ð$Ð$Ø�HŠH�T‰NŒNˆNØ�MŠM˜$ÑÔÐøÝ�‰=Œ=Ðr*   c                 ó  — t          ¦   «         } t          t          | d         ¦  «        ¦  «        }t          t          t          ¦  «        ¦  «        }| d         dk    r|}n| d         dk    r||z   }n||z   }t          |¦  «        S )Nrg  rf  r?  r@  )rt  rT   r}  Ú_TELEGRAM_MENU_PRIORITY)rr  Ú
configuredÚdefaultsrs  s       r+   Ú_telegram_effective_priorityr‚  ì  sŠ   € Ý,Ñ.Ô.€HÝÕ-¨h°zÔ.BÑCÔCÑDÔD€JÝÕ+Õ,CÑDÔDÑEÔE€Hà�Ô  IÒ-Ð-Ø!ˆˆØ	�/Ô	" hÒ	.Ð	.Ø *Ñ,ˆˆà! HÑ,ˆå" <Ñ0Ô0Ð0r*   c                ó¤   ‡— d„ t          t          ¦   «         ¦  «        D ¦   «         Šd„ t          t          | ¦  «        ˆfd„¬¦  «        D ¦   «         S )Nc                ó   — i | ]\  }}||“Œ	S r   r   )r  Úindexr   s      r+   ú
<dictcomp>z6_prioritize_telegram_menu_commands.<locals>.<dictcomp>þ  s.   € ð ð ð áˆE�4ð 	ˆeðð ð r*   c                ó   — g | ]\  }}|‘ŒS r   r   )r  Ú_indexÚcommands      r+   r  z6_prioritize_telegram_menu_commands.<locals>.<listcomp>  s,   € ð ð ð áˆF�Gð 	ðð ð r*   c                ór   •— | d         d         ‰v rd‰| d         d                  | d         fn	d| d         fS )Nre  r   r   )ri  rg  s    €r+   ú<lambda>z4_prioritize_telegram_menu_commands.<locals>.<lambda>  sT   ø€ ð
 �AŒw�qŒz˜XÐ%Ð%ð	 Ø˜˜aœ œÔ$Ø�Q”ðð ð Ø�Q”ðð r*   ©r.  )Ú	enumerater‚  Úsorted)rÚ   rg  s    @r+   Ú"_prioritize_telegram_menu_commandsr�  û  s   ø€ ðð å$Õ%AÑ%CÔ%CÑDÔDðñ ô €Hðð å%Ý�hÑÔð	ð 	ð 	ð 	ð 
ñ  
ô  
ðñ ô ð r*   é    z
[^a-z0-9_]z_{2,}Úrawc                óè   — |                       ¦   «                              dd¦  «        }t                               d|¦  «        }t                               d|¦  «        }|                     d¦  «        S )uR  Convert a command/skill/plugin name to a valid Telegram command name.

    Telegram requires: 1-32 chars, lowercase a-z, digits 0-9, underscores only.
    Steps: lowercase â†’ replace hyphens with underscores â†’ strip all other
    invalid characters â†’ collapse consecutive underscores â†’ strip leading/
    trailing underscores.
    r<  r=  r   )rþ   r?  Ú_TG_INVALID_CHARSÚsubÚ_TG_MULTI_UNDERSCOREr7  ©r‘  r   s     r+   rS  rS     s[   € ð �9Š9‰;Œ;×Ò˜s CÑ(Ô(€DÝ× Ò   TÑ*Ô*€DÝ×#Ò# C¨Ñ.Ô.€DØ�:Š:�c‰?Œ?Ðr*   rO  úlist[tuple[str, ...]]Úreservedc                ó`  — t          |¦  «        }g }| D ]™}|^}}}t          |¦  «        t          k    rF|dt          …         }||v r1|dt          dz
  …         }	t          d¦  «        D ]}
|	› |
› �}||vr nŒŒc|}||v rŒj|                     |¦  «         |                     ||g|¢R ¦  «         Œš|S )a€  Enforce 32-char command name limit with collision avoidance.

    Both Telegram and Discord cap slash command names at 32 characters.
    Names exceeding the limit are truncated.  If truncation creates a duplicate
    (against *reserved* names or earlier entries in the same batch), the name is
    shortened to 31 chars and a digit ``0``-``9`` is appended to differentiate.
    If all 10 digit slots are taken the entry is silently dropped.

    Accepts tuples of any length >= 2.  Extra elements beyond ``(name, desc)``
    (e.g. ``cmd_key``) are passed through unchanged, so callers can attach
    metadata that survives the rename.
    Nre  é
   )r$  ÚlenÚ_CMD_NAME_LIMITÚranger­   r@  )rO  r˜  Úusedr,  Úentryr   Údescrb  Ú	candidateÚprefixÚdigits              r+   Ú_clamp_command_namesr¤  .  sö   € õ  ˜‘]”]€DØ€FØð ,ð ,ˆØ"Ðˆˆd�UÝˆt‰9Œ9•Ò&Ð&ØÐ-�oÐ-Ô.ˆIØ˜DÐ Ð ØÐ2�°Ñ2Ð2Ô3�Ý" 2™YœYð ð �EØ#)Ð 2¨5Ð 2Ð 2�IØ ¨Ð,Ð,Ø˜ð -ð ØˆDØ�4ˆ<ˆ<ØØ�Š�‰ŒˆØ�Š�t˜TÐ* EÐ*Ð*Ñ+Ô+Ð+Ð+Ø€Mr*   Ú	max_slotsÚreserved_namesÚ
desc_limitÚsanitize_nameú'Callable[[str], str] | None'ú&tuple[list[tuple[str, str, str]], int]c                óÖ  ‡— g }g }	 ddl m}  |¦   «         }t          |¦  «        D ]j}	|r ||	¦  «        n|	}
|
sŒ||	                              dd¦  «        }t	          |¦  «        |k    r|d|dz
  …         dz   }|                     |
|f¦  «         Œkn# t          $ r Y nw xY wt          ||¦  «        }|                     d„ |D ¦   «         ¦  «         |D ]\  }}|                     ||d	f¦  «         Œt          ¦   «         }	 dd
l
m}  || ¬¦  «        }n# t          $ r Y nw xY wg }	 ddlm} ddlm} ddl
m} t#          |                     ¦   «         ¦  «        }t#          |dz                       ¦   «         ¦  «                             d¦  «        dz   }|                     d¦  «        dz   g}|                     d„  |¦   «         D ¦   «         ¦  «          |¦   «         }t          |¦  «        D ]è}||         }|                     dd	¦  «        Š‰sŒ#t+          ˆfd„|D ¦   «         ¦  «        sŒ?‰                     |¦  «        rŒU|                     dd	¦  «        }||v rŒp|                     d¦  «        }|r ||¦  «        n|}
|
sŒ—|                     dd	¦  «        }t	          |¦  «        |k    r|d|dz
  …         dz   }|                     |
||f¦  «         Œén# t          $ r Y nw xY wt          ||¦  «        }t1          d|t	          |¦  «        z
  ¦  «        }t1          dt	          |¦  «        |z
  ¦  «        }|d|…         D ]\  }}}|                     |||f¦  «         Œ|d|…         |fS )a  Collect plugin + skill entries for a gateway platform.

    Priority order:
      1. Plugin slash commands (take precedence over skills)
      2. Built-in skill commands (fill remaining slots, alphabetical)

    Only skills are trimmed when the cap is reached.
    Hub-installed skills are excluded.  Per-platform disabled skills are
    excluded.

    Args:
        platform: Platform identifier for per-platform skill filtering
            (``"telegram"``, ``"discord"``, etc.).
        max_slots: Maximum number of entries to return (remaining slots after
            built-in/core commands).
        reserved_names: Names already taken by built-in commands.  Mutated
            in-place as new names are added.
        desc_limit: Max description length (40 for Telegram, 100 for Discord).
        sanitize_name: Optional name transform applied before clamping, e.g.
            :func:`_sanitize_telegram_name` for Telegram.  May return an
            empty string to signal "skip this entry".

    Returns:
        ``(entries, hidden_count)`` where *entries* is a list of
        ``(name, description, cmd_key)`` triples and *hidden_count* is the
        number of skill entries dropped due to the cap.  ``cmd_key`` is the
        original ``/skill-name`` key from :func:`get_skill_commands`.
    r   rJ  r   úPlugin commandNé   ú...c              3  ó    K  — | ]	\  }}|V — Œ
d S r
  r   ©r  Únr=  s      r+   r  z1_collect_gateway_skill_entries.<locals>.<genexpr>“  s&   è è € Ð5Ð5¡  1˜!Ð5Ð5Ð5Ð5Ð5Ð5r*   r   ©Úget_disabled_skill_names©ræ   ©Úget_skill_commands©Ú
SKILLS_DIR©Úget_external_skills_dirsú.hubrü   c              3  ó`   K  — | ])}t          |¦  «                             d ¦  «        d z   V — Œ*dS )rü   N)r   Úrstrip)r  Úds     r+   r  z1_collect_gateway_skill_entries.<locals>.<genexpr>®  sJ   è è € ð !
ð !
Ø)*�C�‰FŒF�MŠM˜#ÑÔ Ñ$ð!
ð !
ð !
ð !
ð !
ð !
r*   Úskill_md_pathc              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r
  )r8  )r  r¢  Ú
skill_paths     €r+   r  z1_collect_gateway_skill_entries.<locals>.<genexpr>·  s1   øè è € ÐUÐU¸�z×,Ò,¨VÑ4Ô4ÐUÐUÐUÐUÐUÐUr*   r   )rM  rK  rŽ  rý   r›  r@  r&  r¤  rê   r$  Úagent.skill_utilsr³  Úagent.skill_commandsr¶  Útools.skills_toolr¸  rº  r   Úresolver½  ÚextendÚanyr8  rÿ   r‡   ) ræ   r¥  r¦  r§  r¨  Úall_entriesÚplugin_pairsrK  Úplugin_cmdsÚcmd_namer   r   r±  r¾  Ú_platform_disabledr³  Úskill_triplesr¶  r¸  rº  Ú_skills_dirÚ_hub_dirÚ_allowed_prefixesÚ
skill_cmdsÚcmd_keyÚinfoÚ
skill_namer|  Ú	remainingÚhidden_countÚkrÁ  s                                   @r+   Ú_collect_gateway_skill_entriesrØ  ]  sž  ø€ ðF /1€Kð +-€LðØ:Ð:Ð:Ð:Ð:Ð:Ø)Ð)Ñ+Ô+ˆÝ˜{Ñ+Ô+ð 	.ð 	.ˆHØ.;ÐI�=�= Ñ*Ô*Ð*ÀˆDØð ØØ˜xÔ(×,Ò,¨]Ð<LÑMÔMˆDÝ�4‰yŒy˜:Ò%Ð%Ø˜O˜Z¨!™^˜OÔ,¨uÑ4�Ø×Ò  t Ñ-Ô-Ð-Ð-ð	.øõ ð ð ð Øˆðøøøõ (¨°nÑEÔE€LØ×ÒÐ5Ð5¨Ð5Ñ5Ô5Ñ5Ô5Ð5àð 'ð '‰ˆˆ1Ø×Ò˜A˜q "˜:Ñ&Ô&Ð&Ð&õ $'¡5¤5ÐðØ>Ð>Ð>Ð>Ð>Ð>Ø5Ð5¸xÐHÑHÔHÐÐøÝð ð ð Øˆðøøøð 13€Mð&Ø;Ð;Ð;Ð;Ð;Ð;Ø0Ð0Ð0Ð0Ð0Ð0Ø>Ð>Ð>Ð>Ð>Ð>Ý˜*×,Ò,Ñ.Ô.Ñ/Ô/ˆÝ˜
 VÑ+×4Ò4Ñ6Ô6Ñ7Ô7×>Ò>¸sÑCÔCÀcÑIˆð )×/Ò/°Ñ4Ô4°sÑ:Ð;ÐØ× Ò ð !
ð !
Ø.FÐ.FÑ.HÔ.Hð!
ñ !
ô !
ñ 	
ô 	
ð 	
ð (Ð'Ñ)Ô)ˆ
Ý˜jÑ)Ô)ð 	8ð 	8ˆGØ˜gÔ&ˆDØŸš /°2Ñ6Ô6ˆJØð ØÝÐUÐUÐUÐUÐCTÐUÑUÔUÑUÔUð ØØ×$Ò$ XÑ.Ô.ð ØØŸš &¨"Ñ-Ô-ˆJØÐ/Ð/Ð/ØØ—~’~ cÑ*Ô*ˆHØ.;ÐI�=�= Ñ*Ô*Ð*ÀˆDØð ØØ—8’8˜M¨2Ñ.Ô.ˆDÝ�4‰yŒy˜:Ò%Ð%Ø˜O˜Z¨!™^˜OÔ,¨uÑ4�Ø× Ò  $¨¨gÐ!6Ñ7Ô7Ð7Ð7ð'	8øõ( ð ð ð Øˆðøøøõ
 )¨¸ÑGÔG€Mõ �A�y¥3 {Ñ#3Ô#3Ñ3Ñ4Ô4€IÝ�q�#˜mÑ,Ô,¨yÑ8Ñ9Ô9€LØ   ) Ô,ð &ð &‰ˆˆ1ˆaØ×Ò˜A˜q !˜9Ñ%Ô%Ð%Ð%à�z˜	�zÔ" LÐ0Ð0s7   ‡B
B Â
BÂBÄ D Ä
D ÄD Ä&F/K Ë
K#Ë"K#rd  ú!tuple[list[tuple[str, str]], int]c                óœ  — t          t          t          ¦   «         ¦  «        ¦  «        }d„ |D ¦   «         }t          |¦  «        }t          dt	          |¦  «        | z
  ¦  «        }t          d| t	          |¦  «        z
  ¦  «        }t          d||dt          ¬¦  «        \  }}|                     d„ |D ¦   «         ¦  «         |d| …         ||z   fS )uÁ  Return Telegram menu commands capped to the Bot API limit.

    Priority order (higher priority = never bumped by overflow):
      1. Core CommandDef commands (always included)
      2. Plugin slash commands (take precedence over skills)
      3. Built-in skill commands (fill remaining slots, alphabetical)

    Skills are the only tier that gets trimmed when the cap is hit.
    User-installed hub skills are excluded â€” accessible via /skills.
    Skills disabled for the ``"telegram"`` platform (via ``hermes skills
    config``) are excluded from the menu entirely.

    Returns:
        (menu_commands, hidden_count) where hidden_count is the number of
        commands omitted due to the cap.
    c                ó   — h | ]\  }}|’ŒS r   r   r°  s      r+   ú	<setcomp>z)telegram_menu_commands.<locals>.<setcomp>ì  s   € Ð2Ð2Ð2™D˜A˜q�aÐ2Ð2Ð2r*   r   ra  é(   )ræ   r¥  r¦  r§  r¨  c              3  ó&   K  — | ]\  }}}||fV — Œd S r
  r   )r  r±  r¾  Ú_ks       r+   r  z)telegram_menu_commands.<locals>.<genexpr>ù  s,   è è € Ð7Ð7¡8 1 a¨˜˜A˜Ð7Ð7Ð7Ð7Ð7Ð7r*   N)r�  rT   rU  r‡   r›  rØ  rS  rÆ  )rd  Úcore_commandsr¦  Úall_commandsÚhidden_core_countÚremaining_slotsrO  rÖ  s           r+   Útelegram_menu_commandsrä  Ú  sà   € õ" 7µtÕ<QÑ<SÔ<SÑ7TÔ7TÑUÔU€MØ2Ð2 MÐ2Ñ2Ô2€NÝ˜Ñ&Ô&€LÝ˜A�s <Ñ0Ô0°<Ñ?Ñ@Ô@Ðå˜!˜\­C°Ñ,=Ô,=Ñ=Ñ>Ô>€OÝ:ØØ!Ø%ØÝ-ðñ ô Ñ€Gˆ\ð ×ÒÐ7Ð7¨wÐ7Ñ7Ô7Ñ7Ô7Ð7Ø˜˜˜Ô&¨Ð7HÑ(HÐHÐHr*   c                óB   — t          d| t          |¦  «        d¬¦  «        S )u  Return skill entries for Discord slash command registration.

    Same priority and filtering logic as :func:`telegram_menu_commands`
    (plugins > skills, hub excluded, per-platform disabled excluded), but
    adapted for Discord's constraints:

    - Hyphens are allowed in names (no ``-`` â†’ ``_`` sanitization)
    - Descriptions capped at 100 chars (Discord's per-field max)

    Args:
        max_slots: Available command slots (100 minus existing built-in count).
        reserved_names: Names of already-registered built-in commands.

    Returns:
        ``(entries, hidden_count)`` where *entries* is a list of
        ``(discord_name, description, cmd_key)`` triples.  ``cmd_key`` is
        the original ``/skill-name`` key needed for the slash handler callback.
    ÚdiscordrW  )ræ   r¥  r¦  r§  )rØ  r$  )r¥  r¦  s     r+   Údiscord_skill_commandsrç  ý  s/   € õ, *ØØÝ˜>Ñ*Ô*Øð	ñ ô ð r*   úMtuple[dict[str, list[tuple[str, str, str]]], list[tuple[str, str, str]], int]c                ó8  — ddl m} t          ¦   «         }	 ddlm}  |d¬¦  «        }n# t
          $ r Y nw xY wi }g }t                               | d¦  «        }d}	 ddlm	} ddlm
}	 dd	lm}
 |
                     ¦   «         }|
d
z                       ¦   «         }|g}	  |	¦   «         D ]C}	 |                      ||¦  «                             ¦   «         ¦  «         Œ4# t
          $ r Y Œ@w xY wn# t
          $ r Y nw xY w |¦   «         }t          |¦  «        D �]ð}||         }|                     dd¦  «        }|sŒ$ ||¦  «                             ¦   «         }t#          |¦  «                             t#          |¦  «        ¦  «        rŒqd}|D ]+}	 |                     |¦  «         n# t(          $ r Y Œ%w xY w|} |€Œ¤|                     dd¦  «        }||v rŒ¿|                     d¦  «        }|dd…         }||v rQ||         }|dk    rt,                               d|||¦  «         nt,                               d||||¦  «         |dz  }�Œ3|||<   |                     dd¦  «        }t1          |¦  «        dk    r|dd…         dz   }|j                             |¦  «        }|j        }t1          |¦  «        dk    r6|d         }|                     |g ¦  «                             |||f¦  «         �ŒØ|                     |||f¦  «         �Œòn# t
          $ r Y nw xY w|||fS )uI  Return skill entries organized by category for Discord ``/skill`` autocomplete.

    Skills whose directory is nested at least 2 levels under a scan root
    (e.g. ``creative/ascii-art/SKILL.md``) are grouped by their top-level
    category.  Root-level skills (e.g. ``some-skill/SKILL.md`` directly under a
    scan root) are returned as
    *uncategorized*.

    Scan roots include the local ``SKILLS_DIR`` **and** any configured
    ``skills.external_dirs`` â€” matching the widened filter applied to the
    flat ``discord_skill_commands()`` collector in #18741. Without this
    parity, external-dir skills are visible via ``hermes skills list`` and
    the agent's ``/skill-name`` dispatch but silently absent from Discord's
    ``/skill`` autocomplete.

    Filtering mirrors :func:`discord_skill_commands`: hub skills excluded,
    per-platform disabled excluded, names clamped to 32 chars, descriptions
    clamped to 100 chars.

    The legacy 25-group Ã— 25-subcommand caps (from the old nested
    ``/skill <cat> <name>`` layout) are **not** applied â€” the live caller
    (``_register_skill_group`` in ``gateway/platforms/discord.py``, refactored
    in PR #11580) flattens these results and feeds them into a single
    autocomplete callback, which scales to thousands of entries without any
    per-command payload concerns. ``hidden_count`` is retained in the return
    tuple for backward compatibility and still reports skills dropped for
    other reasons (32-char clamp collision vs a reserved name).

    Returns:
        ``(categories, uncategorized, hidden_count)``

        - *categories*: ``{category_name: [(name, description, cmd_key), ...]}``
        - *uncategorized*: ``[(name, description, cmd_key), ...]``
        - *hidden_count*: skills dropped due to name clamp collisions
          against already-registered command names.
    r   )ÚPathr²  ræ  r´  z
<reserved>rµ  r¹  r·  r»  r¿  r   Nr   rü   r�  uæ   Discord /skill: %r (from %r) collides on its 32-char clamp with a reserved gateway command name %r â€” the skill will not appear in the /skill autocomplete. Rename the skill's frontmatter ``name:`` to differ in its first 32 chars.uÐ   Discord /skill: %r and %r both clamp to %r on Discord's 32-char command-name limit â€” only %r will appear in the /skill autocomplete. Rename one skill's frontmatter ``name:`` to differ in its first 32 chars.re  r   rW  éa   r®  é   )Úpathlibrê  r$  rÂ  r³  r&  r)  ÚfromkeysrÃ  r¶  rº  rÄ  r¸  rÅ  r@  rŽ  rý   r   r8  Úrelative_torm  rÿ   ÚloggerÚwarningr›  ÚparentÚpartsÚ
setdefault)r¦  Ú_PrÌ  r³  Ú
categoriesÚuncategorizedÚ_names_usedÚhiddenr¶  rº  r¸  rÎ  rÏ  Ú_scan_rootsÚextrÑ  rÒ  rÓ  rÁ  ÚspÚmatched_rootrY  rÔ  r|  Údiscord_nameÚpriorr   Úrelró  Úcats                                 r+   Ú"discord_skill_commands_by_categoryr    s@  € ðN #Ð"Ð"Ð"Ð"Ð"å#&¡5¤5ÐðØ>Ð>Ð>Ð>Ð>Ð>Ø5Ð5¸yÐIÑIÔIÐÐøÝð ð ð Øˆðøøøð 9;€JØ02€Mõ #'§-¢-°ÀÑ"MÔ"M€KØ€FðdØ;Ð;Ð;Ð;Ð;Ð;Ø>Ð>Ð>Ð>Ð>Ð>Ø0Ð0Ð0Ð0Ð0Ð0à ×(Ò(Ñ*Ô*ˆØ Ñ'×0Ò0Ñ2Ô2ˆð "- ˆð	Ø/Ð/Ñ1Ô1ð ð �ðØ×&Ò& r r¨#¡w¤w§¢Ñ'8Ô'8Ñ9Ô9Ð9Ð9øÝ ð ð ð Ø�Hðøøøðøõ
 ð 	ð 	ð 	ØˆDð	øøøà'Ð'Ñ)Ô)ˆ
å˜jÑ)Ô)ð M	Dñ M	DˆGØ˜gÔ&ˆDØŸš /°2Ñ6Ô6ˆJØð ØØ��J‘”×'Ò'Ñ)Ô)ˆBõ �2‰wŒw×!Ò!¥# h¡-¤-Ñ0Ô0ð Øð '+ˆLØ#ð ð �ðØ—N’N 4Ñ(Ô(Ð(Ð(øÝ!ð ð ð Ø�Hðøøøà#�ØØÐ#ØàŸš &¨"Ñ-Ô-ˆJØÐ/Ð/Ð/Øà—~’~ cÑ*Ô*ˆHà# C R Cœ=ˆLØ˜{Ð*Ð*ð $ LÔ1�Ø˜LÒ(Ð(Ý—N’Nð1ð
 % g¨|ñô ð ð õ —N’Nð.ð
 ˜w¨°eñô ð ð ˜!‘�ÙØ(/ˆK˜Ñ%à—8’8˜M¨2Ñ.Ô.ˆDÝ�4‰yŒy˜3ŠˆØ˜C˜R˜C”y 5Ñ(�ð ”)×'Ò'¨Ñ5Ô5ˆCØ”IˆEÝ�5‰zŒz˜QŠˆØ˜A”h�Ø×%Ò% c¨2Ñ.Ô.×5Ò5°|ÀTÈ7Ð6SÑTÔTÐTÑTà×$Ò$ l°D¸'Ð%BÑCÔCÐCÑCð[M	Døõ\ ð ð ð Øˆðøøøð �} fÐ,Ð,s�   –) ©
6µ6ÁA L ÂC+ Â)0CÃC+ Ã
C'Ã$C+ Ã&C'Ã'C+ Ã*L Ã+
C8Ã5L Ã7C8Ã8BL ÆF"Æ!L Æ"
F/Æ,L Æ.F/Æ/EL Ì
LÌLé2   z[^a-z0-9_\-]>   ÚmeÚdndÚmsgÚproÚwhoÚawayÚfeedrA  ÚmuteÚopenÚleaveÚshrugr3   ÚexpandÚremindr�   r]   ÚcollapseÚ	shortcuts)rO   rN   >   r`   rv   r«   rí   rJ   râ   rb   r_   rê   rë   r[   c                ó¨   — |                       ¦   «         }t                               d|¦  «        }|                     d¦  «        }|dt          …         S )zÊConvert a command name to a valid Slack slash command name.

    Slack allows lowercase a-z, digits, hyphens, and underscores. Max 32
    chars. Uppercase is lowercased; invalid chars are stripped.
    r   z-_N)rþ   Ú_SLACK_INVALID_CHARSr”  r7  Ú_SLACK_NAME_LIMITr–  s     r+   Ú_sanitize_slack_namer    sI   € ð �9Š9‰;Œ;€DÝ×#Ò# B¨Ñ-Ô-€DØ�:Š:�dÑÔ€DØÐ"Õ"Ð"Ô#Ð#r*   c            	     ó¦  ‡‡‡	— t          ¦   «         Šg Št          ¦   «         Š	‰                     d¦  «         ‰	                     d¦  «         dˆˆ	fd	„} ˆfd
„t          D ¦   «         }t
          D ]=}|                     |¦  «        }|�$ | |d|j        › d|j        › �|j	        pd¦  «         Œ>t          D ]1}t          |‰¦  «        sŒ | |j        |j        |j	        pd¦  «         Œ2t          D ]A}t          |‰¦  «        sŒ|j        D ]&} | |d|j        › d|j        › �|j	        pd¦  «         Œ'ŒBt          ¦   «         D ]\  }}} | |||pd¦  «         Œ‰S )aÿ  Return (slash_name, description, usage_hint) triples for Slack.

    Every gateway-available command in ``COMMAND_REGISTRY`` is surfaced as
    a standalone Slack slash command (e.g. ``/btw``, ``/stop``, ``/model``),
    matching Discord's and Telegram's model where every command is a
    first-class slash and not a ``/hermes <verb>`` subcommand.

    Both canonical names and aliases are included so users can type any
    documented form (e.g. ``/background``, ``/bg``, and ``/btw`` all work).
    Plugin-registered slash commands are included too.

    Commands whose sanitized name collides with a Slack built-in
    (e.g. ``/status``, ``/me``, ``/join``) are silently skipped.  Users
    can still reach them via ``/hermes <command>``.

    Results are clamped to Slack's 50-command limit with duplicate-name
    avoidance. ``/hermes`` is always reserved as the first entry so the
    legacy ``/hermes <subcommand>`` form keeps working for anything that
    gets dropped by the clamp or for free-form questions.
    )Úhermesz"Talk to Hermes or run a subcommandz[subcommand] [args]r  r   r   r   Úhintrò   ÚNonec                ó  •— t          | ¦  «        }|r|‰v rd S |t          v rd S |t          v rd S t          ‰¦  «        t          k    rd S ‰                     ||d d…         |d d…         f¦  «         ‰                     |¦  «         d S )NéŒ   rW  )r  Ú_SLACK_RESERVED_COMMANDSÚ_SLACK_VIA_HERMES_ONLYr›  Ú_SLACK_MAX_SLASH_COMMANDSr@  r­   )r   r   r  Ú
slack_namerO  r{  s       €€r+   Ú_addz"slack_native_slashes.<locals>._add,  s¡   ø€ Ý)¨$Ñ/Ô/ˆ
Øð 	˜Z¨4Ð/Ð/ØˆFØÕ1Ð1Ð1ØˆFØÕ/Ð/Ð/àˆFÝˆw‰<Œ<Õ4Ò4Ð4ØˆFà�Š˜
 D¨¨#¨¤J°°T°c°T´
Ð;Ñ<Ô<Ð<Ø�Š�ÑÔÐÐÐr*   c                óJ   •— i | ]}t          |‰¦  «        ¯|j        D ]}||“ŒŒ S r   )r4  r   )r  rö   r÷   r3  s      €r+   r†  z(slack_native_slashes.<locals>.<dictcomp>?  sX   ø€ ð ð ð àÝ   iÑ0Ô0ðð ”[ð	ð ð ð 	ˆsðð ð ð r*   NzAlias for /u    â€” r   )r   r   r   r   r  r   rò   r  )r/  r$  r@  r­   rñ   Ú_SLACK_PRIORITY_ALIASESrý   r   r   r   r4  r   r  )
r!  Ú_alias_to_cmdr÷   rö   r   r   r   rO  r3  r{  s
          @@@r+   Úslack_native_slashesr%    sí  øøø€ õ* &Ñ'Ô'€IØ*,€GÝ‘U”U€Dð ‡N‚NÐZÑ[Ô[Ð[Ø‡H‚HˆXÑÔÐðð ð ð ð ð ð ð&ð ð ð å#ðñ ô €Mõ )ð ]ð ]ˆØ×Ò Ñ&Ô&ˆØˆ?ØˆD�ÐF c¤hÐFÐF°S´_ÐFÐFÈÌÐH[ÐY[Ñ\Ô\Ð\øõ  ð =ð =ˆÝ$ S¨)Ñ4Ô4ð 	ØØˆˆSŒX�s”¨¬Ð(;¸Ñ<Ô<Ð<Ð<õ  ð ]ð ]ˆÝ$ S¨)Ñ4Ô4ð 	ØØ”[ð 	]ð 	]ˆEð ˆD�ÐF c¤hÐFÐF°S´_ÐFÐFÈÌÐH[ÐY[Ñ\Ô\Ð\Ð\ð	]õ )EÑ(FÔ(Fð 1ð 1Ñ$ˆˆk˜9ØˆˆT�; 	 ¨RÑ0Ô0Ð0Ð0à€Nr*   ú)https://hermes-agent.local/slack/commandsÚrequest_urlc                ó’   — g }t          ¦   «         D ]1\  }}}d|› �|pd|› �d| dœ}|r||d<   |                     |¦  «         Œ2dd|iiS )u‚  Generate a Slack app manifest with all gateway commands as slashes.

    ``request_url`` is required by Slack's manifest schema for every slash
    command, but in Socket Mode (which we use) Slack ignores it and routes
    the command event through the WebSocket. A placeholder URL is fine.

    The returned dict is the ``features.slash_commands`` portion only â€”
    callers compose it into a full manifest (or merge into an existing
    one). Keeping it narrow avoids coupling us to the rest of the manifest
    schema (display_information, oauth_config, settings, etc.) which users
    set up once in the Slack UI and rarely change.
    rü   rL  F)r‰  r   Úshould_escapeÚurlÚ
usage_hintÚfeaturesÚslash_commands)r%  r@  )r'  Úslashesr   r   rß   rŸ  s         r+   Úslack_app_manifestr/  `  sˆ   € ð €GÝ1Ñ3Ô3ð 	ð 	Ñˆˆd�Eà!˜4�z�zØÐ1 >¨4 > >Ø"Øð	
ð 
ˆð ð 	(Ø"'ˆE�,ÑØ�Š�uÑÔÐÐØÐ)¨7Ð3Ð4Ð4r*   c                 óæ   — t          ¦   «         } i }t          D ]7}t          || ¦  «        sŒd|j        › �||j        <   |j        D ]
}d|› �||<   ŒŒ8t          ¦   «         D ]\  }}}||vrd|› �||<   Œ|S )a0  Return subcommand -> /command mapping for Slack /hermes handler.

    Maps both canonical names and aliases so /hermes bg do stuff works
    the same as /hermes background do stuff.

    Plugin-registered slash commands are included so ``/hermes <plugin-cmd>``
    routes through the plugin handler.
    rü   )r/  rñ   r4  r   r   r  )r3  Úmappingrö   r÷   r   r  r  s          r+   Úslack_subcommand_mapr2  {  s¯   € õ &Ñ'Ô'€IØ €GÝð )ð )ˆÝ$ S¨)Ñ4Ô4ð 	ØØ* ¤˜N˜Nˆ�”ÑØ”[ð 	)ð 	)ˆEØ( ˜[˜[ˆG�E‰NˆNð	)å*FÑ*HÔ*Hð 'ð 'Ñ&ˆˆl˜JØ�wÐÐØ& ˜J˜JˆG�D‰MøØ€Nr*   c                  óx  — e Zd ZdZ	 	 	 d1d2d
„Zd3d„Zd4d„Zd4d„Zed5d„¦   «         Z	d6d„Z
d7d„Z eh d£¦  «        Zed8d„¦   «         Zed9d„¦   «         Zed:d;d „¦   «         Zed9d!„¦   «         Zd:d;d"„Zd<d$„Zed=d'„¦   «         Zd>d?d)„Zed@d,„¦   «         Zed@d-„¦   «         Zed@d.„¦   «         Zed@d/„¦   «         Zd0„ ZdS )AÚSlashCommandCompleterzJAutocomplete for built-in slash commands, subcommands, and skill commands.NÚskill_commands_providerú1Callable[[], Mapping[str, dict[str, Any]]] | NoneÚcommand_filterúCallable[[str], bool] | NoneÚskill_bundles_providerrò   r  c                óZ   — || _         || _        || _        g | _        d| _        d| _        d S )Ng        r   )Ú_skill_commands_providerÚ_command_filterÚ_skill_bundles_providerÚ_file_cacheÚ_file_cache_timeÚ_file_cache_cwd)Úselfr5  r7  r9  s       r+   Ú__init__zSlashCommandCompleter.__init__š  s;   € ð )@ˆÔ%Ø-ˆÔØ'=ˆÔ$à&(ˆÔØ'*ˆÔØ$&ˆÔÐÐr*   Úslash_commandr   r   c                ó|   — | j         €dS 	 t          |                       |¦  «        ¦  «        S # t          $ r Y dS w xY w)NT)r<  r   r&  )rA  rC  s     r+   Ú_command_allowedz&SlashCommandCompleter._command_allowed¨  sS   € ØÔÐ'Ø�4ð	Ý˜×,Ò,¨]Ñ;Ô;Ñ<Ô<Ð<øÝð 	ð 	ð 	Ø�4�4ð	øøøs   ‹!- ­
;º;úMapping[str, dict[str, Any]]c                óf   — | j         €i S 	 |                       ¦   «         pi S # t          $ r i cY S w xY wr
  )r;  r&  ©rA  s    r+   Ú_iter_skill_commandsz*SlashCommandCompleter._iter_skill_commands°  sP   € ØÔ(Ð0ØˆIð	Ø×0Ò0Ñ2Ô2Ð8°bÐ8øÝð 	ð 	ð 	ØˆIˆIˆIð	øøøó   ‹! ¡0¯0c                óf   — | j         €i S 	 |                       ¦   «         pi S # t          $ r i cY S w xY wr
  )r=  r&  rH  s    r+   Ú_iter_skill_bundlesz)SlashCommandCompleter._iter_skill_bundles¸  sP   € ØÔ'Ð/ØˆIð	Ø×/Ò/Ñ1Ô1Ð7°RÐ7øÝð 	ð 	ð 	ØˆIˆIˆIð	øøørJ  Útokenc                ó~   — d|                       d¦  «                             dd¦  «                             ¦   «         z   S )zêCanonicalize a typed skill token to its hyphenated /slug form.

        Mirrors resolve_skill_command_key() in agent/skill_commands.py:
        underscores (Telegram bot-command form) are interchangeable with
        hyphens.
        rü   r=  r<  )rÿ   r?  rþ   )rM  s    r+   Ú_normalize_skill_tokenz,SlashCommandCompleter._normalize_skill_tokenÂ  s7   € ð �U—\’\ #Ñ&Ô&×.Ò.¨s°CÑ8Ô8×>Ò>Ñ@Ô@Ñ@Ð@r*   c                óT   — |                       |¦  «        |                      ¦   «         v S r
  )rO  rI  )rA  rM  s     r+   Ú_is_skill_commandz'SlashCommandCompleter._is_skill_commandÌ  s'   € Ø×*Ò*¨5Ñ1Ô1°T×5NÒ5NÑ5PÔ5PÐPÐPr*   Útextc              #  óp  K  — 	 ddl m} n# t          $ r d}Y nw xY w|                     ¦   «         }|                     d¦  «        r|d}}n|dd…         |d         }}t          ¦   «         }|D ]I}|                      |¦  «        }||                      ¦   «         vs||v r dS |                     |¦  «         ŒJt          |¦  «        |k    rdS | 
                    d¦  «        sdS |                      |¦  «        }	|                      ¦   «                              ¦   «         D ]—\  }
}|
|v s|
 
                    |	¦  «        sŒt          |                     d	d
¦  «        ¦  «        }|dd…         t          |¦  «        dk    rdndz   }|
|	k    r|
› d�n|
}t          |t          |¦  «         |
d|› �¬¦  «        V — Œ˜dS )ug  Offer skill-command completions for stacked invocations.

        After ``/skill-a `` the user may chain more leading skills
        (``/skill-a /skill-b do XYZ``). While every whitespace-delimited
        token so far resolves to a distinct skill command and the current
        word under the cursor starts with ``/``, keep offering the remaining
        skill commands. The moment the chain is broken (a non-skill token
        appears, the cap is reached, or the user is typing plain instruction
        text) we offer nothing â€” instruction text must never be polluted
        with skill suggestions.
        r   )Ú_MAX_STACKED_SKILLSé   r  r   Néÿÿÿÿrü   r   úSkill commandr  r®  õ   âš¡ ©Ústart_positionÚdisplayÚdisplay_meta)rÃ  rT  r&  r'  Úendswithr$  rO  rI  r­   r›  r8  rN  r   rý   r   )rA  rR  Ú_capÚtokensÚ	completedÚcurrent_wordr{  rM  r.  Úword_keyrö   rÓ  r   Ú
short_descÚreplacements                  r+   Ú_stacked_skill_completionsz0SlashCommandCompleter._stacked_skill_completionsÏ  s%  è è € ð	ØHÐHÐHÐHÐHÐHÐHøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð —’‘”ˆØ�=Š=˜ÑÔð 	>Ø&,¨b�|ˆIˆIà&,¨S¨b¨S¤k°6¸"´:�|ˆIõ ™œˆØð 	ð 	ˆEØ×-Ò-¨eÑ4Ô4ˆCØ˜$×3Ò3Ñ5Ô5Ð5Ð5¸À¸¸Ø��Ø�HŠH�S‰MŒMˆMˆMÝˆt‰9Œ9˜ÒÐØˆFð ×&Ò& sÑ+Ô+ð 	ØˆFà×.Ò.¨|Ñ<Ô<ˆØ×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ð 	ð 	‰IˆC�Ø�dˆ{ˆ{ #§.¢.°Ñ":Ô":ˆ{ØÝ˜dŸhšh }°oÑFÔFÑGÔGˆKØ$ S b SÔ)µc¸+Ñ6FÔ6FÈÒ6KÐ6K¨U¨UÐQSÑTˆJð (+¨h¢ ˜S˜)˜)˜)˜)¸CˆKÝØÝ # LÑ 1Ô 1Ð1ØØ0 JÐ0Ð0ð	ñ ô ð ð ð ð ð	ð 	s   „ ‹™>   r�   rl   rn   rË  Úwordc                ó<   — | |k    r| S | t           j        v r| S | › d�S )u  Return replacement text for a completion.

        When the user has already typed the full command exactly (``/help``),
        returning ``help`` would be a no-op and prompt_toolkit suppresses the
        menu. Appending a trailing space keeps the dropdown visible and makes
        backspacing retrigger it naturally.

        However, commands that open pickers (model, skin, personality) should
        NOT get a trailing space â€” the TUI would apply the completion on Enter
        and block the picker from opening.
        r  )r4  Ú_PICKER_COMMANDS)rË  rf  s     r+   Ú_completion_textz&SlashCommandCompleter._completion_text  s4   € ð �tÒÐØˆOàÕ,Ô=Ð=Ð=ØˆOØˆ~ˆ~ˆ~Ðr*   r   c                óè   — | sdS t          | ¦  «        dz
  }|dk    r#| |         dk    r|dz  }|dk    r| |         dk    °| |dz   d…         }|sdS d|v rdS |                     d¦  «        sd|v r|S dS )u  Extract the current word if it looks like a file path.

        Returns the path-like token under the cursor, or None if the
        current word doesn't look like a path.  A word is path-like when
        it starts with ``./``, ``../``, ``~/``, ``/``, or contains a
        ``/`` separator (e.g. ``src/main.py``).

        Tokens containing a ``://`` scheme separator (e.g. URLs like
        ``https://example.com/x``) are excluded even though they contain a
        ``/`` â€” they are never useful local-path completions.
        Nre  r   r  z://)z./z../ú~/rü   rü   ©r›  r8  ©rR  Úirf  s      r+   Ú_extract_path_wordz(SlashCommandCompleter._extract_path_word!  s¬   € ð ð 	Ø�4õ �‰IŒI˜‰MˆØ�1Šfˆf˜˜aœ Cš˜Ø�‰FˆAð �1Šfˆf˜˜aœ Cš˜à�A˜‘E�F�FŒ|ˆØð 	Ø�4ð
 �Dˆ=ˆ=Ø�4à�?Š?Ð3Ñ4Ô4ð 	¸¸t¸¸ØˆKØˆtr*   é   Úlimitrk  c              #  óF  K  — t           j                             | ¦  «        }|                     d¦  «        r|}d}n@t           j                             |¦  «        pd}t           j                             |¦  «        }	 t          j        |¦  «        }n# t          $ r Y dS w xY wd}|                     ¦   «         }t          |¦  «        D �]W}|r(|                     ¦   «          
                    |¦  «        sŒ-||k    r dS t           j                             ||¦  «        }	t           j                             |	¦  «        }
|  
                    d¦  «        rAdt           j                             |	t           j                             d¦  «        ¦  «        z   }nAt           j                             | ¦  «        r|	}nt           j                             |	¦  «        }|
r|dz  }|
rdnd}|
rdnt          |	¦  «        }t!          |t#          | ¦  «         ||z   |¬	¦  «        V — |d
z  }�ŒYdS )z8Yield Completion objects for file paths matching *word*.rü   r   r"  Nr   Ú~rk  ÚdirrY  re  )Úosr[  Ú
expanduserr]  ÚdirnameÚbasenameÚlistdirÚOSErrorrþ   rŽ  r8  rA  ÚisdirÚrelpathÚisabsÚ_file_size_labelr   r›  )rf  rq  ÚexpandedÚ
search_dirr¢  rO  ÚcountÚprefix_lowerrŸ  Ú	full_pathÚis_dirÚdisplay_pathÚsuffixrP  s                 r+   Ú_path_completionsz'SlashCommandCompleter._path_completionsC  s)  è è € õ ”7×%Ò% dÑ+Ô+ˆà×Ò˜SÑ!Ô!ð 	0Ø!ˆJØˆFˆFåœŸš¨Ñ2Ô2Ð9°cˆJÝ”W×%Ò% hÑ/Ô/ˆFð	Ý”j Ñ,Ô,ˆGˆGøÝð 	ð 	ð 	ØˆFˆFð	øøøð ˆØ—|’|‘~”~ˆÝ˜G‘_”_ð 	ñ 	ˆEØð ˜eŸkšk™mœm×6Ò6°|ÑDÔDð ØØ˜Š~ˆ~Ø��åœŸš Z°Ñ7Ô7ˆIÝ”W—]’] 9Ñ-Ô-ˆFð �Š˜sÑ#Ô#ð :Ø#¥b¤g§o¢o°iÅÄ×ASÒASÐTWÑAXÔAXÑ&YÔ&YÑY��Ý”—’˜tÑ$Ô$ð :Ø(��õ  "œwŸš¨yÑ9Ô9�àð $Ø Ñ#�à"Ð*�S�S¨ˆFØ"ÐC�5�5Õ(8¸Ñ(CÔ(CˆDåØÝ # D¡	¤	˜zØ ™Ø!ð	ñ ô ð ð ð ð �Q‰JˆE‰Eð=	ð 	s   Á=B Â
B ÂB c                óÌ   — | sdS t          | ¦  «        dz
  }|dk    r#| |         dk    r|dz  }|dk    r| |         dk    °| |dz   d…         }|                     d¦  «        sdS |S )z=Extract a bare ``@`` token for context reference completions.Nre  r   r  ú@rl  rm  s      r+   Ú_extract_context_wordz+SlashCommandCompleter._extract_context_wordv  s„   € ð ð 	Ø�4å�‰IŒI˜‰MˆØ�1Šfˆf˜˜aœ Cš˜Ø�‰FˆAð �1Šfˆf˜˜aœ Cš˜à�A˜‘E�F�FŒ|ˆØ�Š˜sÑ#Ô#ð 	Ø�4Øˆr*   c              #  óv  K  — |                      ¦   «         }d}|D ]g\  }}|                      ¦   «                              |¦  «        r;|                      ¦   «         |k    r#t          |t          |¦  «         ||¬¦  «        V — ŒhdD �]}|dd…         }||k    s|                     |¦  «        �râ|dk    }	||k    rdn|t          |¦  «        d…         }
t          j                             |
¦  «        }|r|dk    rd	\  }}nZ|                     d
¦  «        r|d}}n@t          j                             |¦  «        pd}t          j         	                    |¦  «        }	 t	          j
        |¦  «        }n# t          $ r Y  dS w xY wd}|                      ¦   «         }t          |¦  «        D ]å}|r(|                      ¦   «                              |¦  «        sŒ,t          j                             ||¦  «        }t          j                             |¦  «        }|	|k    rŒr||k    r nlt          j                             |¦  «        }|rd
nd}|rdnt!          |¦  «        }|› |› |› �}t          |t          |¦  «         ||z   |¬¦  «        V — |dz  }Œæ dS �Œ|dd…         }|                      |||¦  «        E d{V —† dS )zöYield Claude Code-style @ context completions.

        Bare ``@`` or ``@partial`` shows static references and matching
        files/folders.  ``@file:path`` and ``@folder:path`` are handled
        by the existing path completion path.
        ))z@diffzGit working tree diff)z@stagedzGit staged diff)ú@file:zAttach a file)ú@folder:zAttach a folder)z@git:z Git log with diffs (e.g. @git:5))z@url:zFetch web contentrY  )rŒ  r�  NrV  r�  r   r"  )r"  r   rü   r   rt  re  )rþ   r8  r   r›  ru  r[  rv  r]  rw  rx  ry  rz  rŽ  rA  r{  r|  r~  Ú_fuzzy_file_completions)rA  rf  rq  ÚloweredÚ_STATIC_REFSr¡  rP  r¢  ÚbareÚwant_dirÚ	path_partr  r€  Úmatch_prefixrO  r�  r‚  rŸ  rƒ  r„  r…  r†  Ú
completionÚquerys                           r+   Ú_context_completionsz*SlashCommandCompleter._context_completions„  s0  è è € ð —*’*‘,”,ˆð
ˆð  ,ð 	ð 	‰OˆI�tØ�ŠÑ Ô ×+Ò+¨GÑ4Ô4ð ¸¿ºÑ9JÔ9JÈgÒ9UÐ9UÝ ØÝ$'¨¡I¤I :Ø%Ø!%ð	ñ ô ð ð ð øð -ð 0	ñ 0	ˆFØ˜#˜2˜#”;ˆDà�tŠ|ˆ|˜tŸš¨vÑ6Ô6‰|Ø! ZÒ/�Ø"&¨$¢, ,˜B˜B°D½¸V¹¼¸¸Ô4F�	Ýœ7×-Ò-¨iÑ8Ô8�àð > 8¨s¢? ?Ø/6Ñ,�J  Ø×&Ò& sÑ+Ô+ð >Ø/7¸ �J�Jå!#¤§¢°Ñ!:Ô!:Ð!A¸c�JÝ#%¤7×#3Ò#3°HÑ#=Ô#=�LðÝ œj¨Ñ4Ô4�G�GøÝð ð ð Ø�F�F�Fðøøøð �Ø+×1Ò1Ñ3Ô3�Ý# G™_œ_ð ð �EØ#ð !¨E¯KªK©M¬M×,DÒ,DÀ\Ñ,RÔ,Rð !Ø Ý "¤§¢¨Z¸Ñ ?Ô ?�IÝœWŸ]š]¨9Ñ5Ô5�Fð   6Ò)Ð)Ø Ø ’~�~Ø˜Ý#%¤7§?¢?°9Ñ#=Ô#=�LØ$*Ð2˜S˜S°�FØ$*ÐK˜5˜5Õ0@ÀÑ0KÔ0K�DØ$*Ð!B¨LÐ!B¸&Ð!BÐ!B�JÝ$Ø"Ý(+¨D©	¬	 zØ %¨¡Ø%)ð	ñ ô ð ð ð ð ˜Q‘J�E�EØ��ñ[ ð` �Q�R�R”ˆØ×/Ò/°°e¸UÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCs   ÅE0Å0
E?Å>E?r:  c           
     ó  — t          j        ¦   «         }t          j        ¦   «         }| j        r | j        |k    r|| j        z
  dk     r| j        S g }ddd|gdd|gdddd|gfD �]}|d	         }t          j        |¦  «        sŒ 	 t          j
        |d
d
d|dd¬¦  «        }|j        d	k    r±|j        rª|j                             ¦   «         r‘|j                             ¦   «                              d¦  «        }|dd…         D ]X}t           j                             |¦  «        r t           j                             ||¦  «        n|}	|                     |	¦  «         ŒY nŒù# t          j        t(          f$ r Y �Œw xY w|| _        || _        || _        |S )z9Return cached list of project files (refreshed every 5s).g      @Úrgz--filesz--sortr=modifiedÚfdz--typeÚfz--base-directoryr   Trì  zutf-8r?  )Úcapture_outputrR  ÚtimeoutÚcwdÚencodingÚerrorsÚ
Niˆ  )ru  ÚgetcwdÚtimeÚ	monotonicr>  r@  r?  ÚshutilÚwhichÚ
subprocessr¯   Ú
returncodeÚstdoutr7  r'  r[  r}  r|  r@  ÚTimeoutExpiredrz  )
rA  rž  ÚnowÚfilesrö   ÚtoolÚprocr‘  Úpr   s
             r+   Ú_get_project_filesz(SlashCommandCompleter._get_project_filesÚ  sÈ  € åŒi‰kŒkˆÝŒnÑÔˆàÔð	$àÔ$¨Ò+Ð+Ø�dÔ+Ñ+¨cÒ1Ð1àÔ#Ð#àˆð �9Ð0°#Ð6Ø�9˜cÐ"Ø�8˜SÐ"4°cÐ:ð
ð 	ñ 	ˆCð
 �q”6ˆDÝ”< Ñ%Ô%ð ØðÝ!”~Ø¨°4ÀØ g°iðñ ô �ð ”? aÒ'Ð'¨D¬KÐ'¸D¼K×<MÒ<MÑ<OÔ<OÐ'Øœ+×+Ò+Ñ-Ô-×3Ò3°DÑ9Ô9�Cà   $ œZð *ð *˜Ý9;¼¿ºÀqÑ9IÔ9IÐP�bœgŸošo¨a°Ñ5Ô5Ð5Èq˜ØŸš SÑ)Ô)Ð)Ð)Ø�EøøÝÔ-­wÐ7ð ð ð Ø‘ðøøøð !ˆÔØ #ˆÔØ"ˆÔØˆs   ÂCEÅE4Å3E4Úfilepathr–  c                ó>  — |sdS t           j                             | ¦  «        }|                     ¦   «         }|                      ¦   «         }|                     ¦   «         }||k    rdS |                     |¦  «        rdS ||v rdS ||v rdS d}|D ]&}|t          |¦  «        k     r|||         k    r|dz  }Œ'|t          |¦  «        k    rTd}d}d}	|D ]1}|t          |¦  «        k     r|||         k    r|	dv r|dz  }|dz  }|}	Œ2|t          |¦  «        d	z  k    rd
S dS dS )z?Score a file path against a fuzzy query. Higher = better match.re  rW  éP   rV  rÝ  r   r=  z_-./g      à?é#   é   )ru  r[  rx  rþ   r8  r›  )
r±  r–  ÚfilenameÚ
lower_fileÚ
lower_pathÚlower_qÚqir  Úboundary_hitsÚprevs
             r+   Ú_score_pathz!SlashCommandCompleter._score_path  ss  € ð ð 	Ø�1å”7×#Ò# HÑ-Ô-ˆØ—^’^Ñ%Ô%ˆ
Ø—^’^Ñ%Ô%ˆ
Ø—+’+‘-”-ˆð ˜Ò Ð Ø�3à× Ò  Ñ)Ô)ð 	Ø�2à�jÐ Ð Ø�2à�jÐ Ð Ø�2ð ˆØð 	ð 	ˆAØ•C˜‘L”LÒ Ð  Q¨'°"¬+Ò%5Ð%5Ø�a‘�øØ•�W‘”ÒÐàˆMØˆBØˆDØð ð �Ø�˜G™œÒ$Ð$¨¨g°b¬kÒ)9Ð)9Ø˜v�~�~Ø%¨Ñ*˜Ø˜!‘G�BØ��Ø¥ G¡¤¨sÑ 2Ò2Ð2Ø�rØ�2Øˆqr*   é   c           	   #  ó¼  K  — |                       ¦   «         }|s´|d|…         D ]§}|                     d¦  «        }t          j                             |¦  «        }|rdnd}|rdn=t          t          j                             t          j        ¦   «         |¦  «        ¦  «        }	t          d|› d|› �t          |¦  «         ||	¬¦  «        V — Œ¨dS g }
|D ]5}|  
                    ||¦  «        }|d	k    r|
                     ||f¦  «         Œ6|
                     d
„ ¬¦  «         |
d|…         D ]³\  }}|                     d¦  «        }t          j                             |¦  «        }|rdnd}|rdn=t          t          j                             t          j        ¦   «         |¦  «        ¦  «        }	t          d|› d|› �t          |¦  «         ||	r|› d|	› �n|¬¦  «        V — Œ´dS )z-Yield fuzzy file completions for bare @query.Nrü   ÚfolderÚfilert  r‰  ú:rY  r   c                ó$   — | d          | d         fS )Nr   re  r   )Úxs    r+   r‹  z?SlashCommandCompleter._fuzzy_file_completions.<locals>.<lambda>K  s   €  A a¤D 5¨!¨A¬$ -€ r*   rŒ  z  )r°  r]  ru  r[  rx  r~  rA  r¢  r   r›  r½  r@  Úsort)rA  rf  r–  rq  r¬  Úfpr„  r¶  ÚkindrP  ÚscoredÚsr=  s                r+   rŽ  z-SlashCommandCompleter._fuzzy_file_completions0  s8  è è € à×'Ò'Ñ)Ô)ˆàð 	à˜F˜U˜F”mð ð �ØŸš SÑ)Ô)�Ýœ7×+Ò+¨BÑ/Ô/�Ø#)Ð5�x�x¨v�Ø &ð �u�uÕ,<Ý”G—L’L¥¤¡¤¨bÑ1Ô1ñ-ô -�õ !Ø#˜�O�O˜r�O�OÝ$'¨¡I¤I :Ø$Ø!%ð	ñ ô ð ð ð ð ð ˆFð ˆØð 	'ð 	'ˆBØ× Ò   UÑ+Ô+ˆAØ�1ŠuˆuØ—’˜q "˜gÑ&Ô&Ð&øØ�ŠÐ/Ð/ˆÑ0Ô0Ð0à˜F˜U˜F”^ð 	ð 	‰EˆAˆrØ—[’[ Ñ%Ô%ˆFÝ”w×'Ò'¨Ñ+Ô+ˆHØ%Ð1�8�8¨6ˆDØ"ð �5�5Õ(8Ý”—’�RœY™[œ[¨"Ñ-Ô-ñ)ô )ˆDõ Ø�D��˜2��Ý # D¡	¤	˜zØ Ø04Ð< ˜_˜_ d˜_˜_˜_¸"ð	ñ ô ð ð ð ð ð	ð 	r*   Úsub_textÚ	sub_lowerc           
   #  ó4  K  — 	 ddl m}  |¦   «         D ]r}|d         }|                     |¦  «        rS||k    rMt          |t	          | ¦  «         ||                     dd¦  «        p|                     dd¦  «        ¬¦  «        V — ŒsdS # t          $ r Y dS w xY w)	z1Yield completions for /skin from available skins.r   )Ú
list_skinsr   r   r   ÚsourcerY  N)Úhermes_cli.skin_enginerÍ  r8  r   r›  rý   r&  )rÊ  rË  rÍ  rÉ  r   s        r+   Ú_skin_completionsz'SlashCommandCompleter._skin_completions[  sß   è è € ð	Ø9Ð9Ð9Ð9Ð9Ð9Ø�Z‘\”\ð ð �Ø˜”y�Ø—?’? 9Ñ-Ô-ð °$¸)Ò2CÐ2CÝ$ØÝ(+¨H©¬ ~Ø $Ø%&§U¢U¨=¸"Ñ%=Ô%=Ð%TÀÇÂÀxÐQSÑATÔATð	ñ ô ð ð ð øðð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   „BB	 Â	
BÂBc           	   #  ód  K  — d}|                       ¦   «         }|                      d¦  «        }t          |¦  «        dk    st          |¦  «        dk    rp|sn|s| nd}|D ]c}|                     |                     ¦   «         ¦  «        r:||                     ¦   «         k    r"t          |t          |¦  «         |¬¦  «        V — ŒddS |d                              ¦   «         }|dvrdS |rdn|d	         }|                     ¦   «         }t          |r
|dd…         n	|dd	…         ¦  «        }		 dd
lm}
 ddl	m
}m}m}  |
¦   «         } ||dd¬¦  «        }|D ]Y\  }}}||	v s|                     |¦  «        sŒ ||v }|dk    r|rŒ-|dk    r|sŒ6t          |t          |¦  «         ||¬¦  «        V — ŒZt           |¦   «         ¦  «        D ]U}||	v s|                     |¦  «        sŒ||v }|dk    r|rŒ)|dk    r|sŒ2t          |t          |¦  «         |d¬¦  «        V — ŒV|                     d¦  «        pi }t          |t           ¦  «        rXt          |¦  «        D ]J}|› d�}||	v s|                     |¦  «        sŒ!t          |t          |¦  «         |d|› d�¬¦  «        V — ŒIdS dS # t"          $ r Y dS w xY w)uh  Yield completions for /tools â€” subcommand + toolset/MCP-server name.

        Handles both ``/tools <tab>`` (suggesting ``list|disable|enable``) and
        ``/tools enable <tab>`` / ``/tools disable <tab>`` (suggesting toolset
        keys and MCP server prefixes, filtered by current enable state so the
        user only sees actionable options).
        )rT   ÚdisableÚenabler  r   re  r   ©rZ  r[  N)rÓ  rÒ  rV  )Úload_config)ÚCONFIGURABLE_TOOLSETSÚ_get_platform_toolsÚ_get_plugin_toolset_keysÚcliF)Úinclude_default_mcp_serversrÓ  rÒ  rY  zplugin toolsetÚmcp_serversrÂ  zMCP server 'ú')r'  r]  r›  r8  rþ   r   r$  r%  rÕ  Úhermes_cli.tools_configrÖ  r×  rØ  rŽ  rý   r(  r)  r&  )rÊ  rË  ÚSUBSró  Útrailing_spaceÚpartialr”  Ú
subcommandÚpartial_lowerÚalreadyrÕ  rÖ  r×  rØ  rk   ÚenabledÚts_keyÚlabelÚ_descÚis_onrÛ  Úserverr¢  s                          r+   Ú_tools_completionsz(SlashCommandCompleter._tools_completionsl  sÚ  è è € ð -ˆØ—’Ñ Ô ˆØ!×*Ò*¨3Ñ/Ô/ˆõ ˆu‰:Œ:˜Š?ˆ?�s 5™zœz¨Qš˜°~˜Ø&4Ð<�h�h¸"ˆGØð Uð U�Ø—>’> '§-¢-¡/¤/Ñ2Ô2ð U°s¸g¿mºm¹o¼oÒ7MÐ7MÝ$ S½#¸g¹,¼,¸ÐPSÐTÑTÔTÐTÐTÐTøØˆFà˜1”X—^’^Ñ%Ô%ˆ
ØÐ2Ð2Ð2ØˆFà&Ð5�"�"¨E°"¬IˆØŸš™œˆÝ >ÐB�e˜A˜B˜B”i�i°u¸Q¸r¸T´{ÑCÔCˆð6	Ø5Ð5Ð5Ð5Ð5Ð5ðð ð ð ð ð ð ð ð ð ð !�[‘]”]ˆFØ)Ð)¨&°%ÐUZÐ[Ñ[Ô[ˆGà(=ð ð Ñ$�˜˜uØ˜WÐ$Ð$¨F×,=Ò,=¸mÑ,LÔ,LÐ$ØØ 'Ð)�Ø Ò)Ð)¨eÐ)ØØ Ò*Ð*°5Ð*ØÝ ØÝ$'¨¡L¤L =Ø"Ø!&ð	ñ ô ð ð ð ð õ !Ð!9Ð!9Ñ!;Ô!;Ñ<Ô<ð ð �Ø˜WÐ$Ð$¨F×,=Ò,=¸mÑ,LÔ,LÐ$ØØ 'Ð)�Ø Ò)Ð)¨eÐ)ØØ Ò*Ð*°5Ð*ØÝ ØÝ$'¨¡L¤L =Ø"Ø!1ð	ñ ô ð ð ð ð ð !Ÿ*š* ]Ñ3Ô3Ð9°rˆKÝ˜+¥tÑ,Ô,ð 
Ý$ [Ñ1Ô1ð 	ð 	�FØ &˜\˜\˜\�FØ Ð(Ð(°×0AÒ0AÀ-Ñ0PÔ0PÐ(Ø Ý$ØÝ(+¨G©¬ }Ø &Ø%=°FÐ%=Ð%=Ð%=ð	ñ ô ð ð ð ð ð
ð 
ð	ð 	øõ ð 	ð 	ð 	ØˆFˆFð	øøøs   Ä(E5J! Ê!
J/Ê.J/c              #  ó|  K  — |                       ¦   «         }|                      d¦  «        }t          |¦  «        dk    st          |¦  «        dk    r|rdS |r|rdn|d         }|                     ¦   «         }	 ddlm}  |¦   «         }|                     ¦   «         }n# t          $ r Y dS w xY w|D ]Š}	|	j        }
|
 	                    |¦  «        sŒ	 | 
                    |	¦  «        }n# t          $ r d}Y nw xY w|rt          |dd¦  «        r
d	|j        › �nd
}t          |
t          |¦  «         |
|¬¦  «        V — Œ‹dS )u_  Yield platform completions for /handoff.

        Offers connected (enabled + configured) gateway platforms. A recorded
        home channel is NOT required to list a platform â€” it's often learned at
        runtime â€” so the meta hints whether one is set yet. Completes only the
        first arg (the platform); once one is chosen, stop.
        r  re  Nr   rV  r   )Úload_gateway_configr   u   â†’ zsend this session hererY  )r'  r]  r›  rþ   Úgateway.configrì  Úget_connected_platformsr&  Úvaluer8  Úget_home_channelÚgetattrr   r   )rÊ  rË  ró  rß  rà  râ  rì  Úgwrä   ræ   r   ÚhomerP  s                r+   Ú_handoff_completionsz*SlashCommandCompleter._handoff_completionsÁ  s©  è è € ð —’Ñ Ô ˆØ!×*Ò*¨3Ñ/Ô/ˆÝˆu‰:Œ:˜Š>ˆ>�c %™jœj¨Ašo˜o°.˜oØˆFØ"ÐD nÐD�"�"¸5À¼9ˆØŸš™œˆð	Ø:Ð:Ð:Ð:Ð:Ð:à$Ð$Ñ&Ô&ˆBØ×2Ò2Ñ4Ô4ˆIˆIøÝð 	ð 	ð 	ØˆFˆFð	øøøà!ð 	ð 	ˆHØ”>ˆDØ—?’? =Ñ1Ô1ð ØðØ×*Ò*¨8Ñ4Ô4��øÝð ð ð Ø���ðøøøà)-Ðkµ'¸$ÀÈÑ2MÔ2MÐkÐ%˜$œ)Ð%Ð%Ð%ÐSkˆDÝØÝ # G¡¤˜}ØØ!ð	ñ ô ð ð ð ð ð	ð 	s$   Á9$B Â
B,Â+B,ÃC'Ã'C6Ã5C6c           	   #  ó®  K  — 	 ddl m} ddlm}m}  | |¦   «         ¦  «        }d                     |¦  «        r)d|k    r#t          dt          | ¦  «         dd¬¦  «        V — |                     ¦   «         D ]L\  }}|                     |¦  «        r2||k    r,t          |t          | ¦  «         | ||¦  «        ¬¦  «        V — ŒMdS # t          $ r Y dS w xY w)z>Yield completions for /personality via hermes_cli.personality.r   )Úload_cli_config)Úavailable_personalitiesÚdescribe_personalityr�   zclear personality overlayrY  N)
rÙ  rö  Úhermes_cli.personalityr÷  rø  r8  r   r›  rN  r&  )rÊ  rË  rö  r÷  rø  Úpersonalitiesr   r9   s           r+   Ú_personality_completionsz.SlashCommandCompleter._personality_completionsç  sb  è è € ð	à+Ð+Ð+Ð+Ð+Ð+ðð ð ð ð ð ð ð ð
 4Ð3°O°OÑ4EÔ4EÑFÔFˆMØ× Ò  Ñ+Ô+ð °¸)Ò0CÐ0CÝ ØÝ$'¨¡M¤M >Ø"Ø!<ð	ñ ô ð ð ð ð !.× 3Ò 3Ñ 5Ô 5ð ð ‘��fØ—?’? 9Ñ-Ô-ð °$¸)Ò2CÐ2CÝ$ØÝ(+¨H©¬ ~Ø $Ø%9Ð%9¸&Ñ%AÔ%Að	ñ ô ð ð ð øðð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   „C C Ã
CÃCc              #  óþ
  K  — |j         }|                     d¦  «        sh|                      |¦  «        }|�|                      |¦  «        E d {V —† d S |                      |¦  «        }|�|                      |¦  «        E d {V —† d S |                     d¬¦  «        }|d                              ¦   «         }t          |¦  «        dk    s*t          |¦  «        dk    �r~| 	                    d¦  «        �rht          |¦  «        dk    r|d         nd}|                     ¦   «         }	|  
                    |¦  «        r|                      |¦  «        E d {V —† d S d|vrH|dk    r|                      ||	¦  «        E d {V —† d S |dk    r|                      ||	¦  «        E d {V —† d S |d	k    r|                      ||	¦  «        E d {V —† d S |d
k    r|                      ||	¦  «        E d {V —† d S d|vrk|t           v rb|                      |¦  «        rMt           |         D ]?}
|
                     |	¦  «        r(|
|	k    r"t%          |
t          |¦  «         |
¬¦  «        V — Œ@d S |dd …         }t&                               ¦   «         D ]q\  }}|                      |¦  «        sŒ|dd …         }|                     |¦  «        r7t%          |                      ||¦  «        t          |¦  «         ||¬¦  «        V — Œr|                      ¦   «                              ¦   «         D ]Ê\  }}|dd …         }|                     |¦  «        r¦t/          |                     dd¦  «        ¦  «        }|d d…         t          |¦  «        dk    rdndz   }t          |                     dg ¦  «        ¦  «        }t%          |                      ||¦  «        t          |¦  «         |d|› d|› d�¬¦  «        V — ŒË|                      ¦   «                              ¦   «         D ]£\  }}|dd …         }|                     |¦  «        rt/          |                     dd¦  «        ¦  «        }|d d…         t          |¦  «        dk    rdndz   }t%          |                      ||¦  «        t          |¦  «         |d|› �¬¦  «        V — Œ¤	 ddlm}  |¦   «                              ¦   «         D ]œ\  }}|                     |¦  «        r‚t/          |                     dd¦  «        ¦  «        }|d d…         t          |¦  «        dk    rdndz   }t%          |                      ||¦  «        t          |¦  «         d|› �d|› �¬¦  «        V — Œ�d S # t8          $ r Y d S w xY w)Nrü   re  ©Úmaxsplitr   r  r   z/skinz/personalityz/toolsz/handoffrÔ  rY  r   zSkill bundler  r®  rœ   u   â–£ z (z skills)rW  rX  rJ  r¬  u   ðŸ”Œ )Útext_before_cursorr8  rŠ  r—  ro  r‡  r'  rþ   r›  r]  rQ  re  rÐ  rû  rê  rô  r  rE  r   r  rN  ri  rL  r   rý   rI  rM  rK  r&  )rA  ÚdocumentÚcomplete_eventrR  Úctx_wordÚ	path_wordró  Úbase_cmdrÊ  rË  r”  rf  rö   r   rË  rÓ  r   rc  Úskill_countrK  Úcmd_infos                        r+   Úget_completionsz%SlashCommandCompleter.get_completions  s¢  è è € ØÔ*ˆØ�Š˜sÑ#Ô#ð 
	à×1Ò1°$Ñ7Ô7ˆHØÐ#Ø×4Ò4°XÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ø�à×/Ò/°Ñ5Ô5ˆIØÐ$Ø×1Ò1°)Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØˆFð —
’
 A�
Ñ&Ô&ˆØ˜”8—>’>Ñ#Ô#ˆÝˆu‰:Œ:˜Š>ˆ>�c %™jœj¨Ašo™o°$·-²-ÀÑ2DÔ2D™oÝ#& u¡:¤:°¢> >�u˜Q”x�x°rˆHØ ŸšÑ(Ô(ˆIð ×%Ò% hÑ/Ô/ð Ø×:Ò:¸4Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø�ð ˜(Ð"Ð"Ø˜wÒ&Ð&Ø#×5Ò5°hÀ	ÑJÔJÐJÐJÐJÐJÐJÐJÐJØ�FØ˜~Ò-Ð-Ø#×<Ò<¸XÀyÑQÔQÐQÐQÐQÐQÐQÐQÐQØ�Fð
 ˜8Ò#Ð#Ø×2Ò2°8¸YÑGÔGÐGÐGÐGÐGÐGÐGÐGØ�à˜:Ò%Ð%Ø×4Ò4°X¸yÑIÔIÐIÐIÐIÐIÐIÐIÐIØ�ð ˜(Ð"Ð" xµ;Ð'>Ð'>À4×CXÒCXÐYaÑCbÔCbÐ'>Ý& xÔ0ð ð �CØ—~’~ iÑ0Ô0ð °S¸IÒ5EÐ5EÝ(ØÝ,/°©M¬M¨>Ø$'ðñ ô ð ð ð øð
 ˆFà�A�B�BŒxˆå!ŸšÑ)Ô)ð 
	ð 
	‰IˆC�Ø×(Ò(¨Ñ-Ô-ð ØØ˜1˜2˜2”wˆHØ×"Ò" 4Ñ(Ô(ð Ý Ø×)Ò)¨(°DÑ9Ô9Ý$'¨¡I¤I :ØØ!%ð	ñ ô ð ð ð øð ×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;ð 	ð 	‰IˆC�Ø˜1˜2˜2”wˆHØ×"Ò" 4Ñ(Ô(ð 	Ý! $§(¢(¨=¸.Ñ"IÔ"IÑJÔJ�Ø(¨¨"¨Ô-½#¸kÑ:JÔ:JÈRÒ:OÐ:O°°ÐUWÑX�
Ý! $§(¢(¨8°RÑ"8Ô"8Ñ9Ô9�Ý Ø×)Ò)¨(°DÑ9Ô9Ý$'¨¡I¤I :ØØ!K¨
Ð!KÐ!K°kÐ!KÐ!KÐ!Kð	ñ ô ð ð ð øð ×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ð 
	ð 
	‰IˆC�Ø˜1˜2˜2”wˆHØ×"Ò" 4Ñ(Ô(ð Ý! $§(¢(¨=¸/Ñ"JÔ"JÑKÔK�Ø(¨¨"¨Ô-½#¸kÑ:JÔ:JÈRÒ:OÐ:O°°ÐUWÑX�
Ý Ø×)Ò)¨(°DÑ9Ô9Ý$'¨¡I¤I :ØØ!4¨
Ð!4Ð!4ð	ñ ô ð ð ð øð	Ø>Ð>Ð>Ð>Ð>Ð>Ø&9Ð&9Ñ&;Ô&;×&AÒ&AÑ&CÔ&Cð 	ð 	Ñ"�˜(Ø×&Ò& tÑ,Ô,ð Ý˜xŸ|š|¨MÐ;KÑLÔLÑMÔM�DØ!% c r c¤µs¸4±y´yÀ2²~°~¨e¨eÈ2Ñ!N�JÝ$Ø×-Ò-¨h¸Ñ=Ô=Ý(+¨D©	¬	 zØ . H  Ø%9¨ZÐ%9Ð%9ð	ñ ô ð ð ð øð		ð 	øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   Ò-B?U. Õ.
U<Õ;U<)NNN)r5  r6  r7  r8  r9  r6  rò   r  )rC  r   rò   r   )rò   rF  )rM  r   rò   r   )rM  r   rò   r   )rR  r   )rË  r   rf  r   rò   r   )rR  r   rò   r   )rp  )rf  r   rq  rk  ©rò   r:  )r±  r   r–  r   rò   rk  )r¾  )rf  r   r–  r   rq  rk  )rÊ  r   rË  r   )r%   r&   r'   r(   rB  rE  rI  rL  ÚstaticmethodrO  rQ  re  Ú	frozensetrh  ri  ro  r‡  rŠ  r—  r°  r½  rŽ  rÐ  rê  rô  rû  r  r   r*   r+   r4  r4  —  sy  € € € € € ØTÐTð VZØ7;ØTXð	'ð 'ð 'ð 'ð 'ðð ð ð ðð ð ð ðð ð ð ð ðAð Að Añ „\ðAðQð Qð Qð Qð6ð 6ð 6ð 6ðx !�yÐ!AÐ!AÐ!AÑBÔBÐàðð ð ñ „\ðð& ðð ð ñ „\ððB ð0ð 0ð 0ð 0ñ „\ð0ðd ðð ð ñ „\ððTDð TDð TDð TDð TDðl'ð 'ð 'ð 'ðR ð*ð *ð *ñ „\ð*ðX)ð )ð )ð )ð )ðV ðð ð ñ „\ðð  ðRð Rð Rñ „\ðRðh ð#ð #ð #ñ „\ð#ðJ ðð ð ñ „\ðð:rð rð rð rð rr*   r4  c                  ó&   — e Zd ZdZ	 	 ddd	„Zd
„ ZdS )ÚSlashCommandAutoSuggestzÕInline ghost-text suggestions for slash commands and their subcommands.

    Shows the rest of a command or subcommand in dim text as you type.
    Falls back to history-based suggestions for non-slash input.
    NÚhistory_suggestúAutoSuggest | NoneÚ	completerúSlashCommandCompleter | Nonerò   r  c                ó"   — || _         || _        d S r
  )Ú_historyÚ
_completer)rA  r  r  s      r+   rB  z SlashCommandAutoSuggest.__init__…  s   € ð
 (ˆŒØ#ˆŒˆˆr*   c                óV  — |j         }|                     d¦  «        s$| j        r| j                             ||¦  «        S d S |                     d¬¦  «        }|d                              ¦   «         }t          |¦  «        dk    r¾|                     d¦  «        s©|dd …                              ¦   «         }t          t          t          ¬¦  «        D ]o}| j
        �| j
                             |¦  «        sŒ$|dd …         }|                     |¦  «        r,||k    r&t          |t          |¦  «        d …         ¦  «        c S Œpd S t          |¦  «        dk    r|d         nd}	|	                     ¦   «         }
| j
        �| j
                             |¦  «        re| j
                             |¦  «        D ]J}|j        r|j        |j         d …         n|j        }|                     ¦   «         rt          |¦  «        c S ŒK| j
        �| j
                             |¦  «        sd S |t$          v rbt$          |         rUd|	vrQt$          |         D ]C}|                     |
¦  «        r,||
k    r&t          |t          |	¦  «        d …         ¦  «        c S ŒD| j        r| j                             ||¦  «        S d S )Nrü   re  rý  r   r  rŒ  r   )rÿ  r8  r  Úget_suggestionr'  rþ   r›  r]  rŽ  r  r  rE  r   rQ  re  rZ  rR  r7  r  )rA  Úbufferr   rR  ró  r  rf  rö   rË  rÊ  rË  r•  Ú	remainderr”  s                 r+   r  z&SlashCommandAutoSuggest.get_suggestion�  sÆ  € ØÔ*ˆð �Š˜sÑ#Ô#ð 	àŒ}ð FØ”}×3Ò3°F¸HÑEÔEÐEØ�4à—
’
 A�
Ñ&Ô&ˆØ˜”8—>’>Ñ#Ô#ˆåˆu‰:Œ:˜Š?ˆ? 4§=¢=°Ñ#5Ô#5ˆ?ð ˜˜˜”8—>’>Ñ#Ô#ˆDÝ�h­CÐ0Ñ0Ô0ð <ð <�Ø”?Ð.°t´×7WÒ7WÐX[Ñ7\Ô7\Ð.ØØ˜q˜r˜rœ7�Ø×&Ò& tÑ,Ô,ð <°¸TÒ1AÐ1AÝ% h­s°4©y¬y¨z¨zÔ&:Ñ;Ô;Ð;Ð;Ð;øØ�4õ  # 5™zœz¨Aš~˜~�5˜”8�8°2ˆØ—N’NÑ$Ô$ˆ	ð ŒOÐ'Ø”×1Ò1°(Ñ;Ô;ð (ð #œo×HÒHÈÑNÔNð 1ð 1�
à!Ô0ðF˜JœO¨ZÔ-FÐ,FÐ,GÐ,GÔHÐHØ6@´oð à—?’?Ñ$Ô$ð 1Ý% iÑ0Ô0Ð0Ð0Ð0ð1ð Œ?Ð&¨t¬×/OÒ/OÐPXÑ/YÔ/YÐ&Ø�4Ø•{Ð"Ð"¥{°8Ô'<Ð"Ø˜(Ð"Ð"Ý& xÔ0ð ?ð ?�CØ—~’~ iÑ0Ô0ð ?°S¸IÒ5EÐ5EÝ)¨#­c°(©m¬m¨n¨nÔ*=Ñ>Ô>Ð>Ð>Ð>øð Œ=ð 	BØ”=×/Ò/°¸ÑAÔAÐAØˆtr*   )NN)r  r  r  r  rò   r  )r%   r&   r'   r(   rB  r  r   r*   r+   r  r  ~  sN   € € € € € ðð ð /3Ø26ð$ð $ð $ð $ð $ð:ð :ð :ð :ð :r*   r  c                óÊ   — 	 t           j                             | ¦  «        }n# t          $ r Y dS w xY w|dk     r|› d�S |dk     r	|dz  d›d�S |dk     r	|dz  d›d	�S |dz  d›d
�S )z:Return a compact human-readable file size, or '' on error.r   i   ÚBi   z.0fÚKi   @z.1fÚMÚG)ru  r[  Úgetsizerz  )r[  Úsizes     r+   r~  r~  Ê  s¯   € ðÝŒw�Š˜tÑ$Ô$ˆˆøÝð ð ð Øˆrˆrðøøøàˆd‚{€{ØˆzˆzˆzÐØˆkÒÐØ˜‘+Ð$Ð$Ð$Ð$Ð$ØÐ Ò Ð Ø˜+Ñ&Ð-Ð-Ð-Ð-Ð-ØÐ(Ñ)Ð0Ð0Ð0Ð0Ð0s   ‚" ¢
0¯0)rò   ró   )r   r   rò   rú   )rö   r   rò   r   )r   r   rò   r   )r  r   rò   r   )rò   r  r
  )rö   r   r0  r1  rò   r   )r   r   rò   r   r  )rò   rH  )rò   rQ  )rY  rZ  r[  r   rò   rZ  )rò   r_  )rò   rk  )rw  rx  rò   r   )rò   r   )rÚ   rQ  rò   rQ  )r‘  r   rò   r   )rO  r—  r˜  r  rò   r—  )rW  N)ræ   r   r¥  rk  r¦  r  r§  rk  r¨  r©  rò   rª  )rW  )rd  rk  rò   rÙ  )r¥  rk  r¦  r  rò   rª  )r¦  r  rò   rè  )r&  )r'  r   rò   r_  )rò   r  )r[  r   rò   r   )mr(   Ú
__future__r   Úloggingru  Úrer¥  r§  r£  Úcollections.abcr   r   Údataclassesr   r   Útypingr   Úutilsr	   Úhermes_constantsr
   Ú	getLoggerr%   rð  Úprompt_toolkit.auto_suggestr   r   Úprompt_toolkit.completionr   r   ÚImportErrorÚobjectr   r
  r.   r)   rA  rñ   rø   rù   r   r  r  Ú_cmdr   r   r   Ú_aliasr   r  rô  r   Ú_catr  r   rT   ÚcompileÚ_PIPE_SUBS_REr.  r   r�   ÚmÚgroupr'  r  r  r  r  r  r/  r4  r9  rG  r  rU  rj  ro  rp  r  r^  rt  rv  r}  r‚  r�  rœ  Ú_TG_NAME_LIMITr“  r•  rS  r¤  Ú_clamp_telegram_namesrØ  rä  rç  r  r  r  r  r  r#  r  r  r%  r/  r2  r4  r  r~  r   r*   r+   ú<module>r5     s¤  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !Ø -Ð -Ð -Ð -Ð -Ð -à	ˆÔ	˜8Ñ	$Ô	$€ðØCÐCÐCÐCÐCÐCÐCÐCØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øØð ð ð Ø€KØ€IØ€JØ€J€J€Jð	øøøð €�$ÐÑÔð*ð *ð *ð *ð *ñ *ô *ñ Ôð*ð\ '0 iØ5Ð5Ð5ñ'ô 'Ð ð ð ð ñ ðs&à€JˆwÐJÈIØ ¨jÀwðPñ Pô Pðs&ð €JˆuÐHÈ)Ø!¨XØ4À5ðJñ Jô Jð	s&ð €JˆwÐFÈ	Ø Ð,CðEñ Eô Eðs&ð €JˆwÐ>À	Øðñ ô ðs&ð €JˆxÐQÐS\Øðñ ô ðs&ð €JˆyÐ5°yØðñ ô ðs&ð €JˆvÐ6¸	Øðñ ô ðs&ð" €JˆwÐBÀIÑNÔNð#s&ð$ €JˆxÐWÐYbØÐ(8À,ðPñ Pô Pð%s&ð( €JˆvÐGÈØð ñ  ô  ð)s&ð, €JˆwÐ=¸yØ!ð#ñ #ô #ð-s&ð0 €JˆyÐcÐenØ%°ð6ñ 6ô 6ð1s&ð4 €JˆxÐPÐR[Ø ¨Hð6ñ 6ô 6ð5s&ð8 €Jˆzð  Fð  HQØ#Ð/_ðañ aô að9s&ð< €JˆzÐCÀYØ#ð%ñ %ô %ð=s&ð@ €JˆzÐUÐW`Ø iÐ;XðZñ Zô ZðAs&ðD €JˆxÐZÐ\kØÐ(FðHñ Hô HðEs&ðH €JˆxÐKÈ_ØÐ(JðLñ Lô LðIs&ðL €JˆvÐ>À	Ø4À6ðKñ Kô KðMs&ðP €JˆwÐXÐZcØ Ð,<Ø%ð'ñ 'ô 'ðQs&ðV €JˆyÐ?ÀØ Ð,>ÈJðXñ Xô XðWs&ðZ €JˆvÐTÐV_Ø Ð,<È*ðVñ Vô Vð[s&ð^ €Jˆ|Ð=¸yØ$°
È
ðTñ Tô Tð_s&ðb €JˆxÐ?ÀØ!¨zð;ñ ;ô ;ðcs&ðf €JˆyÐ>ØÐ">ÈØ7Ø5ð7ñ 7ô 7ðgs&ðn €JˆwÐNÐPYØ¨Ø%°Gð=ñ =ô =ðos&ðt €JˆwÐXÐZcØ#°È'ðSñ Sô Sðus&ðx €JˆvÐXÐZcð AØ%°Fð<ñ <ô <ðys&ð~ €Jˆ{ÐZÐ\eØÐ*iØAØ%ð'ñ 'ô 'ðs&ðF €JˆxÐYÐ[dØ/ð1ñ 1ô 1ðGs&ðJ €JˆuÐlÐnwØ#°ÈðOñ Oô OðKs&ðN €JˆyÐKÈYØ4À*ðNñ Nô NðOs&ðR €JˆxÐGÈØ%ð'ñ 'ô 'ðSs&ðV €JˆxÐ:¸IØ#°Ø%°HØð!ñ !ô !ðWs&ð^ €Jˆyð  Fð  HQØ¨7ÀØ%ð'ñ 'ô 'ð_s&ðd €JˆxÐHÈ&ÑQÔQðes&ðf €JˆyÐGÈØ%¨yð:ñ :ô :ðgs&ðj €JˆyÐ=¸yØ ¨-ð9ñ 9ô 9ðks&ðn €JˆxÐ<¸iØ!ð#ñ #ô #ðos&ðv €JˆzÐ@À)ÑLÔLðws&ð| €JˆxÐ5°Øðñ ô ð}s&ð@ €JˆwÐLÈoØUØ#°'ð;ñ ;ô ;ðAs&ðF €JˆÐ YØÐ(:Ø2Ø#°/ðCñ Cô CðGs&ðP €Jˆ}Ð<¸oØ!ð#ñ #ô #ðQs&ðT €Jˆ{ÐAÀ?Ø gð/ñ /ô /ðUs&ðX €JˆyÐTØ¨Ð9JØ2ð4ñ 4ô 4ðYs&ð^ €Jˆ|ÐQÐSbØÐ(9Ø2¸GðEñ Eô Eð_s&ðd €JˆvÐBÀFØBØ7ð9ñ 9ô 9ðes&ðj €JˆyÐ\Ø¨Ø#BØ%ð'ñ 'ô 'ðks&ðr €JˆwÐ\Ø¨Ð9JØ2ð4ñ 4ô 4ðss&ðx €JˆxÐRØÐ*;Ø2À
ðLñ Lô Lðys&ð~ €JˆvÐPØ¨Jð8ñ 8ô 8ðs&ðB €Jˆ{ÐXØÐ*>Ø5ð7ñ 7ô 7ðCs&ðH €Jˆ{ÐAÀ?ØBð [ð\ñ \ô \ðIs&ðN €JˆvÐlÐn}Ø:ØPðRñ Rô RðOs&ðT €JˆvÐ>ÀØ¨ð2ñ 2ô 2ðUs&ðX €Jˆ{Ð?ÀØÐ(I¨C¯HªHÐ5EÑ,FÔ,FÐ(IÐ(IÐ(IØ+ð-ñ -ô -ðYs&ð^ €JˆwÐ+¨_Ø.Ð<Zð\ñ \ô \ð_s&ðb €JˆvÐCÀ_ØÐ(9Ø2ð4ñ 4ô 4ðcs&ðh €JˆvÐHÈ/ØÐ(HØDðFñ Fô Fðis&ðr €JˆwÐNÐP`Ø:ÀTðKñ Kô Kðss&ðv €JˆzÐ4Ð6FØðñ ô ðws&ðz €JˆxÐEØ¨$Ø#:ðPðQñ Qô Qð{s&ðD €JˆxÐRØØHØGðIñ Iô IðEs&ðL €JˆyÐTØ¨ð4ñ 4ô 4ðMs&ðP €JˆuÐVÐXhØÐ(HÐVxðzñ zô zðQs&ðT €JˆwÐFØ¨$Ñ8IÑUdðfñ fô fðUs&ðX €J‰wÑjØÑ+AðCñ Cô CðYs&ð\ €J‰vÑ[Ø©9ð6ñ 6ô 6ð]s&ð` €J‰vÑ/Ð1AØ©Ù`ðbñ bô bðas&ðf €J‰}ÑMØ©ÑA_ÙDñFñ Fô Fðgs&ðl €J‰{ÑLØ©Ñ<UðWñ Wô Wðms&ðp €J‰yÑcØ©>Ùkðmñ mô mðqs&ðv €J‰xÑUØ©>ñRð &ð'ñ 'ô 'ðws&ðH €J‰xÑIÐK[Øðñ ô ðIs&ðL €J‰|Ñ=Ð?OÙ&ñ(ñ (ô (ðMs&ðP €J‰Ñ aØÑ);ñ=ñ =ô =ðQs&ðT €J‰yÑ^Ð`pØÑ(EÙ>ð@ñ @ô @ðUs&ðZ €J‰yÑCØ¨$ð0ñ 0ô 0ð[s&ðb €J‰zÑGÈØ ©HÀ*Ù)ñ+ñ +ô +ðcs&ðh €J‰vÑ0°&ÀjÙ%ð'ñ 'ô 'ðis&ðl €J‰yÑUÐW`Ø ¨jñ:ñ :ô :ðms&ðp €J‰wÑfÐhnÙ,ð.ñ .ô .ðqs&ðt €J‰~ÑQÐSYØ¡lð4ñ 4ô 4ðus&ðx €J‰wÑQÐSYÑZÔZðys&ðz €J‰zÑ>ÀÙ!ð#ñ #ô #ð{s&ð~ €J‰{ÑDÀfØ¡lð4ñ 4ô 4ðs&ðB €J‰zÑNÐPVØ Ñ,HðJñ Jô JðCs&ðF €J‰vÑFÈØ¨
ð4ñ 4ô 4ðGs&ðJ €J‰wÑDÀfØðñ ô ðKs&ðN €J‰wÑHÈ&Ø©ð2ñ 2ô 2ðOs&ðR €J‰xÑDÀfØ%ð'ñ 'ô 'ðSs&ðV €J‰yÑ5°vÁvØ%©yñ:ñ :ô :ðWs&ðZ €J‰wÑZÐ\bÙ'ð)ñ )ô )ð[s&ðb €J‰vÑSÑU[Ø¡i¹<ðIñ Iô Iðcs&Ð ñ sð sñ sñ sñtñ ð ð ð *?Ð)>Ñ)@Ô)@€Ñ @Ð @Ñ @Ñ @ñ9ñ 9ð 9ð 9ññ ð ð ð €Ñ Ð Ñ Ñ Øð Tð T€DØÔð TØ$6Ð$6°tÑ$<Ô$<ˆ‘�T”Y��Ñ!Ø”lð 	Tð 	TˆFØ(,Ô(8Ð%SÑ%SÀtÄyÐ%SÑ%SÐ%SˆH‘\˜�\�\Ñ"Ð"øð 35Ð Ñ 4Ð 4Ñ 4Ñ 4Øð 8ð 8€DØÔð 8Ø#×.Ò.¨t¬}¸bÑAÔAˆØ (©¨T¬Y¨¨Ô 9ˆ‰_�”ˆ_ˆ_ÑØ”lð 	8ð 	8ˆFØ!)©,¨f¨,¨,Ô!7ˆD‘�V��ÑÐøð %'€Ñ &Ð &Ñ &Ñ &Øð >ð >€DØÔð >Ø'+ t¨DÔ,<Ñ'=Ô'=ˆ‘O˜œ	�O�OÑ$øð �”
Ñ1Ñ2Ô2€Øð 1ð 1€DÙ
ˆdŒiˆ/ˆ/€CØ
ˆkÐÐ ¤ÐØØ×Ò˜Tœ^Ñ,Ô,€AØð 1ØŸ7š7 1™:œ:×+Ò+¨CÑ0Ô0ˆ�CÑøð *3¨ñ 3ð 3àð3ñ 3ô 3ñ *ô *Ð ð ð ñ ñ ññ ð ð ð4 2;°ñ ;ð ;Ø(ð;ñ ;ô ;ñ 2ô 2Ð ð ð ñ ñ ñ
Lñ Lð Lð LñPñ Pð Pð Pñ.ñ ð ð ñ:ñ ñ ð ð ñ -ñ -ð -ð -ñ
ñ ð ð ñ&ñ ð ð ñ@ñ ð ð ñL ')Ð #Ù!$Ð Ø;Ñ;Ð;Ð ñÐ ð<ñ5ñ 5ð 5ð 5ñ%ñ %ð %ð %ñP@ñ @ð @ð @ñ
ñ ð ð ñ1ñ 1ð 1ð 1ññ ð ð ñ2 €Ø =ð !€ð �B”J™}Ñ-Ô-Ð Ø!�r”z¡(Ñ+Ô+Ð ññ ð ð ñ$ñ $ð $ð $ðP -Ð ð Ø37ñv1ñ v1ñ v1ð v1ð v1ñz Iñ  Iñ  Ið  Ið  IñFñ ð ð ñ<a-ñ a-ð a-ð a-ñV Ð ÙÐ Ø!�r”z¡/Ñ2Ô2Ð Ø$˜9ð &ñ &ð &ñ ô Ð ñ& (Ð ðH #˜ð  $Lñ  $Lð  $Lñ  Mô  MÐ ñ	$ñ 	$ð 	$ð 	$ñNñ Nð Nð Nñb5ñ 5ñ 5ð 5ð 5ñ6ñ ð ð ð8`ð `ñ `ð `ñ `˜Iñ `ô `ð `ðNIð Iñ Ið Iñ I˜kñ Iô Ið IñX1ñ 1ð 1ð 1ð 1ð 1s   ÁA& Á&A6Á5A6