§
    ‰eîi†ó  ã            	      ó  — 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m	Z	m
Z
 ddlmZ ddlm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g  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¦  «        ‘ e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	d-d.¬/¦  «        ‘ ed0d1d¦  «        ‘ ed2d3dd	d4¬5¦  «        ‘ ed6d7dd	¬8¦  «        ‘ ed9d:dd;d<¬$¦  «        ‘ ed=d>dd?¬¦  «        ‘ ed@dAddBd<¬$¦  «        ‘ edCdDdd<¬ ¦  «        ‘ edEdFd¦  «        ‘ edGdHdI¦  «        ‘ edJdKdd	dL¬M¦  «        ‘ edNdOdd¬ ¦  «        ‘ edPdQdRd	¬¦  «        ‘ edSdTdRdUdV¬$¦  «        ‘ edWdXdId	¬¦  «        ‘ edYdZdRd¬ ¦  «        ‘ ed[d\dRd	d]¬^¦  «        ‘ ed_d`dRd	da¬b¦  «        ‘ edcdddR¦  «        ‘ ededfdRdgdh¬i¦  «        ‘ edjdkdRdldm¬i¦  «        ‘ edndodRd	d¬p¦  «        ‘ edqdrdRdsdt¬i¦  «        ‘ edudvdRd	dwdx¬y¦  «        ‘ edzd{d|d}d	¬~¦  «        ‘ edd€d|d	¬¦  «        ‘ ed�d‚d|d	dƒ¬„¦  «        ‘ ed…d†d|d	d‡dˆ¬y¦  «        ‘ ed‰dŠd|d	¬¦  «        ‘ ed‹dŒd|d�¬¦  «        ‘ edŽd�d|d	d�d‘¬y¦  «        ‘ ed’d“d|d	¬¦  «        ‘ ed”d•dId	d–¬5¦  «        ‘ ed—d˜dI¦  «        ‘ ed™dšdd	¬8¦  «        ‘ ed›dœdI¦  «        ‘ ed�dždIdŸ¬ ¦  «        ‘ ed d¡dId	d¢¬^¦  «        ‘ ed£d¤dId	d*¬p¦  «        ‘ ed¥d¦dId	¬¦  «        ‘ ed§d¨dId	d©¬p¦  «        ‘ edªd«dId	¬8¦  «        ‘ ed¬d­dI¦  «        ‘ ed®d¯d°d	d±¬^¦  «        ‘Zd²ed³<   �dd¶„Z e¦   «         Zdµed·<   �dd»„Z�dd½„Zi Zd¾ed¿<   eD ]AZej         s8 ee¦  «        edÀej!        › �<   ej"        D ]Z#ej$        › dÁej!        › dÂ�edÀe#› �<   ŒŒBi Z%dÃedÄ<   eD ]ZZej         sQe% &                    ej'        i ¦  «        Z(edÀej!        › �         e(dÀej!        › �<   ej"        D ]Z#edÀe#› �         e(dÀe#› �<   ŒŒ[i Z)dÅedÆ<   eD ]$Zej*        r e+ej*        ¦  «        e)dÀej!        › �<   Œ% ej,        dÇ¦  «        Z-eD ]_ZdÀej!        › �Z.e.e)v sej/        sŒe- 0                    ej/        ¦  «        Z1e1r+e1 2                    d¦  «         3                    dÈ¦  «        e)e.<   Œ` e4dÉ„ eD ¦   «         ¦  «        Z5dÊedË<   �ddÎ„Z6 e4h dÏ£¦  «        Z7dÊedÐ<   �d	dÒ„Z8�d
dÔ„Z9�d�dd×„Z:�ddÙ„Z;�ddÛ„Z<�ddÝ„Z=dÞZ>	 e>Z? ej,        dß¦  «        Z@ ej,        dà¦  «        ZA�ddâ„ZB�ddå„ZCeCZD	 	 �d�ddï„ZE�d�ddò„ZF�ddó„ZG�ddõ„ZHdöZIdÞZJ ej,        d÷¦  «        ZK�ddø„ZL�ddù„ZM�d�ddý„ZN�ddþ„ZO G dÿ„ �d e¦  «        ZP G �d„ �de¦  «        ZQ�d�d„ZRd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)ÚAny)Ú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S )Ú
CommandDefz%Definition of a single slash command.ÚstrÚnameÚdescriptionÚcategory© ztuple[str, ...]ÚaliasesÚ Ú	args_hintÚsubcommandsFÚboolÚcli_onlyÚgateway_onlyNú
str | NoneÚgateway_config_gate)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   r   ó    ú5/home/div/.hermes/hermes-agent/hermes_cli/commands.pyr   r   (   s�   € € € € € € à/Ð/à€I€I�IØÐÐÑØ€M€M�MØ!€GÐ!Ð!Ð!Ñ!Ø€IÐÐÐÑØ#%€KÐ%Ð%Ð%Ñ%Ø€HÐÐÐÑØ€LÐÐÐÑØ&*ÐÐ*Ð*Ð*Ñ*Ð*Ð*r"   r   Únewz0Start a new session (fresh session ID + history)ÚSession)Úreset)r   Úclearz$Clear screen and start a new session)r   ÚhistoryzShow conversation historyÚsavezSave the current conversationÚretryz(Retry the last message (resend to agent)Úundoz'Remove the last user/assistant exchangeÚtitlez#Set a title for the current sessionz[name])r   Úbranchz5Branch the current session (explore a different path))Úfork)r   r   Úcompressz&Manually compress conversation contextz[focus topic]Úrollbackz&List or restore filesystem checkpointsz[number]Úsnapshotz8Create or restore state snapshots of Hermes config/state)Úsnapz[create|restore <id>|prune])r   r   r   Ústopz%Kill all running background processesÚapprovez#Approve a pending dangerous commandz[session|always])r   r   Údenyz Deny a pending dangerous command)r   Ú
backgroundzRun a prompt in the background)ÚbgÚbtwz<prompt>Úagentsz$Show active agents and running tasks)ÚtasksÚqueuez4Queue a prompt for the next turn (doesn't interrupt))ÚqÚsteerz>Inject a message after the next tool call without interruptingÚstatuszShow session infoÚprofilez+Show active profile name and home directoryÚInfoÚsethomez!Set this chat as the home channel)zset-home)r   r   Úresumez!Resume a previously-named sessionÚconfigzShow current configurationÚConfigurationÚmodelzSwitch model for this session)Úproviderz$[model] [--provider name] [--global]Úgquotaz*Show Google Gemini Code Assist quota usageÚpersonalityzSet a predefined personalityÚ	statusbarz#Toggle the context/model status bar)Úsb)r   r   Úverbosez9Cycle tool progress display: off -> new -> all -> verbosezdisplay.tool_progress_command)r   r   Úyoloz7Toggle YOLO mode (skip all dangerous command approvals)Ú	reasoningz#Manage reasoning effort and displayz[level|show|hide])
ÚnoneÚminimalÚlowÚmediumÚhighÚxhighÚshowÚhideÚonÚoff)r   r   ÚfastuS   Toggle fast mode â€” OpenAI Priority Processing / Anthropic Fast Mode (Normal/Fast)z[normal|fast|status])ÚnormalrX   r>   rV   rW   Úskinz%Show or change the display skin/theme)r   r   ÚvoicezToggle voice modez[on|off|tts|status])rV   rW   Úttsr>   Úbusyz/Control what Enter does while Hermes is workingz[queue|interrupt|status])r;   Ú	interruptr>   )r   r   r   Útoolsz4Manage tools: /tools [list|disable|enable] [name...]zTools & Skillsz[list|disable|enable] [name...])r   r   ÚtoolsetszList available toolsetsÚskillsz*Search, install, inspect, or manage skills)ÚsearchÚbrowseÚinspectÚinstall)r   r   ÚcronzManage scheduled tasksz[subcommand])ÚlistÚaddÚcreateÚeditÚpauserB   ÚrunÚremoveÚreloadz.Reload .env variables into the running sessionz
reload-mcpzReload MCP servers from config)Ú
reload_mcpÚbrowserz1Connect browser tools to your live Chrome via CDPz[connect|disconnect|status])ÚconnectÚ
disconnectr>   Úpluginsz'List installed plugins and their statusÚcommandsz*Browse all commands and skills (paginated)z[page]ÚhelpzShow available commandsÚrestartz9Gracefully restart the gateway after draining active runsÚusagez8Show token usage and rate limits for the current sessionÚinsightsz!Show usage insights and analyticsz[days]Ú	platformsz&Show gateway/messaging platform status)ÚgatewayÚ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Údebugz@Upload debug report (system info + logs) and get shareable linksÚquitzExit the CLIÚExit)Úexitz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’   Å   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–   Í   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"   zfrozenset[str]Ú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"   >   r$   r5   ru   r3   r;   r=   r9   r>   r~   r4   r?   rv   rt   r6   ÚACTIVE_SESSION_BYPASS_COMMANDSÚcommand_namec                ó,   — | 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ª   5  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 ]j}|}|j                             d¦  «        D ]/}t          |t          ¦  «        r| 	                    |¦  «        }Œ-d} |r| 
                    |j        ¦  «         Œk|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  s    € ÐBÐBÐB�1¨AÔ,AÐBˆQÐBÐBÐBr"   r   )Úread_raw_configú.N)rƒ   ÚsetÚhermes_cli.configr°   Ú	Exceptionr   ÚsplitÚ
isinstanceÚdictr�   rh   r   )Úgatedr°   ÚcfgÚresultrˆ   ÚvalÚkeys          r#   Ú_resolve_config_gatesr½   L  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��à�ØØð 	!Ø�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ˆ   r¾   Ú	overridess      r#   Ú_is_gateway_availablerÂ   i  sG   € ð Œ<ð ØˆtØ
Ôð %Ø(8Ð(DÐ$Ð$ÕJ_ÑJaÔJaˆ	ØŒx˜9Ð$Ð$Øˆ5r"   ú	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ƒ   rÂ   r   r   Úreplacer   ÚappendÚjoinr   )rÁ   Úlinesrˆ   ÚargsÚalias_partsÚaÚ
alias_notes          r#   Úgateway_help_linesrÐ   y  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 )ae  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:`gateway.platforms.discord._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.pluginsrÔ   r´   Úitemsr¶   r   r·   r�   ÚstriprÉ   )rÔ   rt   Ú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                 ó:  — t          ¦   «         } g }t          D ]E}t          || ¦  «        sŒt          |j        ¦  «        }|r|                     ||j        f¦  «         ŒFt          ¦   «         D ].\  }}}t          |¦  «        }|r|                     ||f¦  «         Œ/|S )a{  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.

    Plugin-registered slash commands are included so plugins get native
    autocomplete in Telegram without touching core code.
    )r½   rƒ   rÂ   Ú_sanitize_telegram_namer   rÉ   r   r¢   )rÁ   rº   rˆ   Útg_namer   r   r¥   s          r#   Útelegram_bot_commandsrß   ¬  s·   € õ &Ñ'Ô'€IØ$&€FÝð 6ð 6ˆÝ$ S¨)Ñ4Ô4ð 	ØÝ)¨#¬(Ñ3Ô3ˆØð 	6Ø�MŠM˜7 C¤OÐ4Ñ5Ô5Ð5øÝ)EÑ)GÔ)Gð 2ð 2Ñ%ˆˆk˜:Ý)¨$Ñ/Ô/ˆØð 	2Ø�MŠM˜7 KÐ0Ñ1Ô1Ð1øØ€Mr"   é    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_UNDERSCORErØ   ©rá   r   s     r#   rÝ   rÝ   Ñ  s[   € ð �9Š9‰;Œ;×Ò˜s CÑ(Ô(€DÝ× Ò   TÑ*Ô*€DÝ×#Ò# C¨Ñ.Ô.€DØ�:Š:�c‰?Œ?Ðr"   rÙ   Úreservedc                óV  — t          |¦  «        }g }| D ]”\  }}t          |¦  «        t          k    rF|dt          …         }||v r1|dt          dz
  …         }t          d¦  «        D ]}|› |› �}||vr nŒŒa|}||v rŒh|                     |¦  «         |                     ||f¦  «         Œ•|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.
    Né   é
   )r²   ÚlenÚ_CMD_NAME_LIMITÚrangerh   rÉ   )	rÙ   rç   Úusedrº   r   ÚdescÚ	candidateÚprefixÚdigits	            r#   Ú_clamp_command_namesró   ß  så   € õ ˜‘]”]€DØ$&€FØð $ð $‰
ˆˆdÝˆt‰9Œ9•Ò&Ð&ØÐ-�oÐ-Ô.ˆIØ˜DÐ Ð ØÐ2�°Ñ2Ð2Ô3�Ý" 2™YœYð ð �EØ#)Ð 2¨5Ð 2Ð 2�IØ ¨Ð,Ð,Ø˜ð -ð ØˆDØ�4ˆ<ˆ<ØØ�Š�‰ŒˆØ�Š�t˜T�lÑ#Ô#Ð#Ð#Ø€Mr"   éd   ÚplatformÚ	max_slotsÚintÚreserved_namesÚ
desc_limitÚsanitize_nameú'Callable[[str], str] | None'ú&tuple[list[tuple[str, str, str]], int]c           	     ód  — 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} t!          |                     ¦   «         ¦  «        }t!          |dz                       ¦   «         ¦  «        } |¦   «         }t          |¦  «        D ]ß}||         }|                     dd	¦  «        }|                     |¦  «        sŒ6|                     |¦  «        rŒL|                     dd	¦  «        }||v rŒg|                     d¦  «        }|r ||¦  «        n|}
|
sŒŽ|                     dd	¦  «        }t	          |¦  «        |k    r|d|dz
  …         dz   }|                     |
||f¦  «         Œàn# t          $ r Y nw xY wd„ |D ¦   «         }d„ |D ¦   «         }t          ||¦  «        }t)          d|t	          |¦  «        z
  ¦  «        }t)          dt	          |¦  «        |z
  ¦  «        }|d|…         D ]3\  }}|                     |||                     ||fd	¦  «        f¦  «         Œ4|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   rÓ   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ú.hubÚskill_md_pathr   rŽ   c                ó   — g | ]
\  }}}||f‘ŒS r   r   )rž   r  ÚdrÆ   s       r#   r¯   z2_collect_gateway_skill_entries.<locals>.<listcomp>j  s"   € Ð7Ð7Ð7™g˜a  A�A�q�6Ð7Ð7Ð7r"   c                ó    — i | ]\  }}}||f|“ŒS r   r   )rž   r  r  Úks       r#   ú
<dictcomp>z2_collect_gateway_skill_entries.<locals>.<dictcomp>k  s$   € Ð:Ð:Ð:¡  A q�A�q�6˜1Ð:Ð:Ð:r"   )rÖ   rÔ   Úsortedr�   rë   rÉ   r´   ró   r~   r²   Úagent.skill_utilsr  Úagent.skill_commandsr  Útools.skills_toolr
  r   ÚresolveÚ
startswithr‘   Úmax)rõ   rö   rø   rù   rú   Úall_entriesÚplugin_pairsrÔ   Úplugin_cmdsÚcmd_namer   rï   r  r  Ú_platform_disabledr  Úskill_triplesr  r
  Ú_skills_dirÚ_hub_dirÚ
skill_cmdsÚcmd_keyÚinfoÚ
skill_pathÚ
skill_nameÚraw_nameÚskill_pairsÚkey_by_pairÚ	remainingÚhidden_counts                                  r#   Ú_collect_gateway_skill_entriesr+  	  s9  € ð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ˆØ'Ð'Ñ)Ô)ˆ
Ý˜jÑ)Ô)ð 	8ð 	8ˆGØ˜gÔ&ˆDØŸš /°2Ñ6Ô6ˆJØ×(Ò(¨Ñ5Ô5ð ØØ×$Ò$ 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øõ$ ð ð ð Øˆðøøøð
 8Ð7¨Ð7Ñ7Ô7€KØ:Ð:¨MÐ:Ñ:Ô:€KÝ& {°NÑCÔC€Kõ �A�y¥3 {Ñ#3Ô#3Ñ3Ñ4Ô4€IÝ�q�#˜kÑ*Ô*¨YÑ6Ñ7Ô7€LØ˜J˜Y˜JÔ'ð @ð @‰ˆˆ1Ø×Ò˜A˜q +§/¢/°1°a°&¸"Ñ"=Ô"=Ð>Ñ?Ô?Ð?Ð?à�z˜	�zÔ" LÐ0Ð0s7   †B
B Â
BÂBÃ?D Ä
DÄDÄ%E
I0 É0
I=É<I=Úmax_commandsú!tuple[list[tuple[str, str]], int]c                ó<  — t          t          ¦   «         ¦  «        }d„ |D ¦   «         }t          |¦  «        }t          d| t          |¦  «        z
  ¦  «        }t	          d||dt
          ¬¦  «        \  }}|                     d„ |D ¦   «         ¦  «         |d| …         |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
        skill 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   Útelegramé(   )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)rg   rß   r  rë   r+  rÝ   Úextend)r,  Úcore_commandsrø   Úall_commandsÚremaining_slotsrÙ   r*  s          r#   Útelegram_menu_commandsr9  {  sµ   € õ" Õ.Ñ0Ô0Ñ1Ô1€MØ2Ð2 MÐ2Ñ2Ô2€NÝ˜Ñ&Ô&€Lå˜!˜\­C°Ñ,=Ô,=Ñ=Ñ>Ô>€OÝ:ØØ!Ø%ØÝ-ðñ ô Ñ€Gˆ\ð ×ÒÐ7Ð7¨wÐ7Ñ7Ô7Ñ7Ô7Ð7Ø˜˜˜Ô&¨Ð4Ð4r"   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.
    Údiscordrô   )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           	     óT  — 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lm} ddlm	}	 |	 
                    ¦   «         }
|	dz   
                    ¦   «         } |¦   «         }t          |¦  «        D �]À}||         }|                     d	d
¦  «        }|sŒ$ ||¦  «         
                    ¦   «         }t          |¦  «                             t          |
¦  «        ¦  «        sŒqt          |¦  «                             t          |¦  «        ¦  «        rŒ¡|                     dd
¦  «        }||v rŒ¼|                     d¦  «        }|dd…         }||v rŒà|                     |¦  «         |                     dd
¦  «        }t#          |¦  «        dk    r|dd…         dz   }	 |j                             |
¦  «        }n# t(          $ r Y �ŒTw xY w|j        }t#          |¦  «        dk    r6|d         }|                     |g ¦  «                             |||f¦  «         �Œ¨|                     |||f¦  «         �ŒÂn# t
          $ r Y nw xY wd}d}i }d}t          |¦  «        D ]d}||k    r|t#          ||         ¦  «        z  }Œ!||         d|…         }|t1          dt#          ||         ¦  «        |z
  ¦  «        z  }|||<   |dz  }Œe||z
  }t#          |¦  «        |k    r|t#          |¦  «        |z
  z  }|d|…         }|||fS )u�  Return skill entries organized by category for Discord ``/skill`` subcommand groups.

    Skills whose directory is nested at least 2 levels under ``SKILLS_DIR``
    (e.g. ``creative/ascii-art/SKILL.md``) are grouped by their top-level
    category.  Root-level skills (e.g. ``dogfood/SKILL.md``) are returned as
    *uncategorized* â€” the caller should register them as direct subcommands
    of the ``/skill`` group.

    The same filtering as :func:`discord_skill_commands` is applied: hub
    skills excluded, per-platform disabled excluded, names clamped.

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

        - *categories*: ``{category_name: [(name, description, cmd_key), ...]}``
        - *uncategorized*: ``[(name, description, cmd_key), ...]``
        - *hidden_count*: skills dropped due to Discord group limits
          (25 subcommand groups, 25 subcommands per group)
    r   )ÚPathr  r;  r  r  r	  r  r  r   r   rŽ   Nrà   r   rô   éa   r   é   é   ré   )Úpathlibr?  r²   r  r  r´   r  r  r  r
  r  r  r�   r   r  r‘   rh   rë   ÚparentÚrelative_toÚ
ValueErrorÚpartsÚ
setdefaultrÉ   r  )rø   Ú_Pr  r  Ú
categoriesÚuncategorizedÚ_names_usedÚhiddenr  r
  r  r   r!  r"  r#  r$  Úspr%  r&  Údiscord_namerï   ÚrelrG  ÚcatÚ_MAX_GROUPSÚ_MAX_PER_GROUPÚtrimmed_categoriesÚgroup_countrÙ   r8  s                                 r#   Ú"discord_skill_commands_by_categoryrV  »  sè  € ð, #Ð"Ð"Ð"Ð"Ð"å#&¡5¤5ÐðØ>Ð>Ð>Ð>Ð>Ð>Ø5Ð5¸yÐIÑIÔIÐÐøÝð ð ð Øˆðøøøð 9;€JØ02€MÝ Ñ/Ô/€KØ€Fð/Ø;Ð;Ð;Ð;Ð;Ð;Ø0Ð0Ð0Ð0Ð0Ð0Ø ×(Ò(Ñ*Ô*ˆØ Ñ'×0Ò0Ñ2Ô2ˆØ'Ð'Ñ)Ô)ˆ
å˜jÑ)Ô)ð &	Dñ &	DˆGØ˜gÔ&ˆDØŸš /°2Ñ6Ô6ˆJØð ØØ��J‘”×'Ò'Ñ)Ô)ˆBå�r‘7”7×%Ò%¥c¨+Ñ&6Ô&6Ñ7Ô7ð ØÝ�2‰wŒw×!Ò!¥# h¡-¤-Ñ0Ô0ð ØàŸš &¨"Ñ-Ô-ˆJØÐ/Ð/Ð/Øà—~’~ cÑ*Ô*ˆHà# C R Cœ=ˆLØ˜{Ð*Ð*ØØ�OŠO˜LÑ)Ô)Ð)à—8’8˜M¨2Ñ.Ô.ˆDÝ�4‰yŒy˜3ŠˆØ˜C˜R˜C”y 5Ñ(�ðØ”i×+Ò+¨KÑ8Ô8��øÝð ð ð Ø‘ðøøøà”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øõN ð ð ð Øˆðøøøð €KØ€Nà@BÐØ€KÝ�jÑ!Ô!ð ð ˆØ˜+Ò%Ð%Ø•c˜* Sœ/Ñ*Ô*Ñ*ˆFØØ˜S”/ / > /Ô2ˆØ•#�a�˜Z¨œ_Ñ-Ô-°Ñ>Ñ?Ô?Ñ?ˆØ")Ð˜3ÑØ�qÑˆˆð " KÑ/€OÝ
ˆ=ÑÔ˜OÒ+Ð+Ø•#�mÑ$Ô$ Ñ6Ñ6ˆØ%Ð&6 Ð&6Ô7ˆà˜}¨fÐ4Ð4sD   –) ©
6µ6ÁE;I" ÇG&Ç%I" Ç&
G4Ç0I" Ç3G4Ç4A-I" É"
I/É.I/é2   z[^a-z0-9_\-]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ä   rØ   Ú_SLACK_NAME_LIMITræ   s     r#   Ú_sanitize_slack_namer[  5  sI   € ð �9Š9‰;Œ;€DÝ×#Ò# B¨Ñ-Ô-€DØ�:Š:�dÑÔ€DØÐ"Õ"Ð"Ô#Ð#r"   c            	     óô  ‡‡— t          ¦   «         } g Št          ¦   «         Š‰                     d¦  «         ‰                     d¦  «         dˆˆf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 )aA  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.

    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          ‰¦  «        t          k    rd S ‰                     ||d d…         |d d…         f¦  «         ‰                     |¦  «         d S )NéŒ   rô   )r[  rë   Ú_SLACK_MAX_SLASH_COMMANDSrÉ   rh   )r   rï   r^  Ú
slack_namerÙ   Úseens       €€r#   Ú_addz"slack_native_slashes.<locals>._addZ  s   ø€ Ý)¨$Ñ/Ô/ˆ
Øð 	˜Z¨4Ð/Ð/ØˆFÝˆw‰<Œ<Õ4Ò4Ð4ØˆFà�Š˜
 D¨¨#¨¤J°°T°c°T´
Ð;Ñ<Ô<Ð<Ø�Š�ÑÔÐÐÐr"   r   zAlias for /u    â€” )r   r   rï   r   r^  r   r„   r_  )r½   r²   rÉ   rh   rƒ   rÂ   r   r   r   r   r¢   )	rÁ   re  rˆ   r‰   r   r   r   rÙ   rd  s	          @@r#   Úslack_native_slashesrf  A  sg  øø€ õ" &Ñ'Ô'€IØ*,€GÝ‘U”U€Dð ‡N‚NÐZÑ[Ô[Ð[Ø‡H‚HˆXÑÔÐðð ð ð ð ð ð õ  ð =ð =ˆÝ$ 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_urlúdict[str, Any]c                ó’   — 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Ž   rÕ   F)Úcommandr   Úshould_escapeÚurlÚ
usage_hintÚfeaturesÚslash_commands)rf  rÉ   )rh  Úslashesr   rï   rw   Úentrys         r#   Úslack_app_manifestrs  z  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ƒ   rÂ   r   r   r¢   )rÁ   Úmappingrˆ   r‰   r   r¤   r¥   s          r#   Úslack_subcommand_maprv  •  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                  ó  — e Zd ZdZ	 	 d)d*d	„Zd+d„Zd,d„Zed-d„¦   «         Zed.d„¦   «         Z	ed/d0d„¦   «         Z
ed.d„¦   «         Zd/d0d„Zd1d„Zed2d „¦   «         Zd3d4d"„Zed5d%„¦   «         Zed5d&„¦   «         Zd5d'„Zd(„ ZdS )6Ú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] | Noner„   r_  c                óL   — || _         || _        g | _        d| _        d| _        d S )Ng        r   )Ú_skill_commands_providerÚ_command_filterÚ_file_cacheÚ_file_cache_timeÚ_file_cache_cwd)Úselfry  r{  s      r#   Ú__init__zSlashCommandCompleter.__init__³  s3   € ð
 )@ˆÔ%Ø-ˆÔà&(ˆÔØ'*ˆÔØ$&ˆÔÐÐr"   Úslash_commandr   r   c                ó|   — | j         €dS 	 t          |                       |¦  «        ¦  «        S # t          $ r Y dS w xY w)NT)r  r   r´   )rƒ  r…  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´   )rƒ  s    r#   Ú_iter_skill_commandsz*SlashCommandCompleter._iter_skill_commandsÇ  sP   € ØÔ(Ð0ØˆIð	Ø×0Ò0Ñ2Ô2Ð8°bÐ8øÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs   ‹! ¡0¯0r  Úwordc                ó   — | |k    r| › d�n| S )aI  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.
        r”   r   )r  r‹  s     r#   Ú_completion_textz&SlashCommandCompleter._completion_textÏ  s   € ð "*¨TÒ!1Ð!1�(ˆ~ˆ~ˆ~ˆ~°xÐ?r"   Útextr   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¦  «        sd|v r|S dS )aC  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``).
        Nré   r   r”   )z./z../ú~/rŽ   rŽ   ©rë   r  ©rŽ  Úir‹  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à�?Š?Ð3Ñ4Ô4ð 	¸¸t¸¸ØˆKØˆtr"   é   Úlimitr÷   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   Ú~r�  Údir©Ústart_positionÚdisplayÚdisplay_metaré   )ÚosÚpathÚ
expanduserÚendswithÚdirnameÚbasenameÚlistdirÚOSErrorr�   r  r  rÊ   ÚisdirÚrelpathÚisabsÚ_file_size_labelr   rë   )r‹  r–  ÚexpandedÚ
search_dirrñ   rÙ   ÚcountÚprefix_lowerrr  Ú	full_pathÚis_dirÚdisplay_pathÚsuffixrÚ   s                 r#   Ú_path_completionsz'SlashCommandCompleter._path_completionsò  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.Nré   r   r”   ú@r‘  r’  s      r#   Ú_extract_context_wordz+SlashCommandCompleter._extract_context_word%  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 contentrš  )r·  r¸  Néÿÿÿÿr¸  r   r±   )r±   r   rŽ   r   r™  ré   )r�   r  r   rë   rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r  rÊ   r¦  r§  r©  Ú_fuzzy_file_completions)rƒ  r‹  r–  ÚloweredÚ_STATIC_REFSrð   rÚ   rñ   ÚbareÚwant_dirÚ	path_partrª  r«  Úmatch_prefixrÙ   r¬  r­  rr  r®  r¯  r°  r±  Ú
completionÚquerys                           r#   Ú_context_completionsz*SlashCommandCompleter._context_completions3  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|¬¦  «        }|j        d	k    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   TrA  )Úcapture_outputrŽ  ÚtimeoutÚcwdÚ
Niˆ  )rž  ÚgetcwdÚtimeÚ	monotonicr€  r‚  r�  ÚshutilÚwhichÚ
subprocessrl   Ú
returncodeÚstdoutrØ   rµ   rŸ  r¨  r§  rÉ   ÚTimeoutExpiredr¥  )
rƒ  rÊ  ÚnowÚfilesrˆ   ÚtoolÚprocrá   ÚprP  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ÀØðñ ô �ð ”? aÒ'Ð'¨D¬K×,=Ò,=Ñ,?Ô,?Ð'Øœ+×+Ò+Ñ-Ô-×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ÅE+Å*E+Ú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.ré   rô   éP   é<   r2  r   rÆ   z_-./g      à?é#   rB  )rž  rŸ  r£  r�   r  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Úfiler™  r´  ú:rš  r   c                ó$   — | d          | d         fS )Nr   ré   r   )Úxs    r#   ú<lambda>z?SlashCommandCompleter._fuzzy_file_completions.<locals>.<lambda>ú  s   €  A a¤D 5¨!¨A¬$ -€ r"   )r¼   z  )rÚ  r¡  rž  rŸ  r£  r©  rÊ   rÌ  r   rë   rç  rÉ   Úsort)rƒ  r‹  rÂ  r–  rÖ  Úfpr¯  rà  ÚkindrÚ   ÚscoredÚsrÆ   s                r#   rº  z-SlashCommandCompleter._fuzzy_file_completionsß  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   Úsourcerš  N)Úhermes_cli.skin_enginerø  r  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              #  óŠ  K  — 	 ddl m}  |¦   «                              di ¦  «                             di ¦  «        }d                     |¦  «        r)d|k    r#t	          dt          | ¦  «         dd¬¦  «        V — |                     ¦   «         D ]£\  }}|                     |¦  «        r‰||k    rƒt          |t          ¦  «        r4|                     d¦  «        p|                     d	d
¦  «        dd…         }nt          |¦  «        dd…         }t	          |t          | ¦  «         ||¬¦  «        V — Œ¤dS # t          $ r Y dS w xY w)zAYield completions for /personality from configured personalities.r   )Úload_configÚagentÚpersonalitiesrN   zclear personality overlayrš  r   Úsystem_promptr   NrW  )r³   rý  r�   r  r   rë   r×   r¶   r·   r   r´   )rõ  rö  rý  rÿ  r   ÚpromptrÚ   s          r#   Ú_personality_completionsz.SlashCommandCompleter._personality_completions  sš  è è € ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø'˜K™MœM×-Ò-¨g°rÑ:Ô:×>Ò>¸ÐPRÑSÔSˆMØ× Ò  Ñ+Ô+ð °¸)Ò0CÐ0CÝ ØÝ$'¨¡M¤M >Ø"Ø!<ð	ñ ô ð ð ð ð !.× 3Ò 3Ñ 5Ô 5ð ð ‘��fØ—?’? 9Ñ-Ô-ð 
°$¸)Ò2CÐ2CÝ! &­$Ñ/Ô/ð 0Ø%Ÿzšz¨-Ñ8Ô8Ð`¸F¿JºJÀÐXZÑ<[Ô<[Ð\_Ð]_Ð\_Ô<`˜˜å" 6™{œ{¨3¨B¨3Ô/˜Ý$ØÝ(+¨H©¬ ~Ø $Ø%)ð	ñ ô ð ð ð øðð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   „D.D4 Ä4
EÅEc           
   #  óh  K  — t          ¦   «         }	 ddlm}m}m}  |¦   «          |                     ¦   «         D ]h\  }}|                     |¦  «        rN||k    rH|                     |¦  «         t          |t          |¦  «         ||j
        › d|j        › d�¬¦  «        V — Œit          |                     ¦   «         ¦  «        D ]\}||v rŒ|                     |¦  «        r@||k    r:||         }	t          |t          |¦  «         ||	j        › d|	j        › �¬¦  «        V — Œ]dS # t           $ r Y dS w xY w)zDYield completions for /model from config aliases + built-in aliases.r   )Ú_ensure_direct_aliasesÚDIRECT_ALIASESÚMODEL_ALIASESz (r•   rš  rŽ   N)r²   Úhermes_cli.model_switchr  r  r  r×   r  rh   r   rë   rE   rF   r  ÚkeysÚvendorÚfamilyr´   )
rƒ  rõ  rö  rd  r  r  r  r   ÚdaÚidentitys
             r#   Ú_model_completionsz(SlashCommandCompleter._model_completions7  s½  è è € å‰uŒuˆð	ðð ð ð ð ð ð ð ð ð ð #Ð"Ñ$Ô$Ð$Ø*×0Ò0Ñ2Ô2ð ð ‘��bØ—?’? 9Ñ-Ô-ð °$¸)Ò2CÐ2CØ—H’H˜T‘N”N�NÝ$ØÝ(+¨H©¬ ~Ø $Ø(*¬Ð%BÐ%B°B´KÐ%BÐ%BÐ%Bð	ñ ô ð ð ð øõ ˜}×1Ò1Ñ3Ô3Ñ4Ô4ð 
ð 
�Ø˜4�<�<ØØ—?’? 9Ñ-Ô-ð °$¸)Ò2CÐ2CØ,¨TÔ2�HÝ$ØÝ(+¨H©¬ ~Ø $Ø(0¬Ð%KÐ%K¸(¼/Ð%KÐ%Kð	ñ ô ð ð ð øð
ð 
øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   ’DD# Ä#
D1Ä0D1c              #  óp  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¦  «        �rt          |¦  «        dk    r|d         nd}|                     ¦   «         }	d|vrl|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          |                      ||¦  «        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 # t0          $ r Y d S w xY w)NrŽ   ré   ©Úmaxsplitr   r”   r   z/modelz/skinz/personality)r›  rœ  rš  r   zSkill commandrW  r   u   âš¡ rÓ   rþ   u   ðŸ”Œ )Útext_before_cursorr  rµ  rÃ  r”  r²  rµ   r�   rë   r¡  r  rû  r  rš   r‡  r   r˜   r×   r�  rŠ  r   r�   rÖ   rÔ   r´   )rƒ  ÚdocumentÚcomplete_eventrŽ  Úctx_wordÚ	path_wordrG  Úbase_cmdrõ  rö  rä   r‹  rˆ   rï   r  r#  r   Ú
short_descrÔ   Úcmd_infos                       r#   Úget_completionsz%SlashCommandCompleter.get_completionsX  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ð ˜(Ð"Ð"Ø˜xÒ'Ð'Ø#×6Ò6°xÀÑKÔKÐKÐKÐKÐKÐKÐKÐKØ�FØ˜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ð ˜(Ð"Ð" 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 :ØØ!%ð	ñ ô ð ð ð øð ×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?P' Ð'
P5Ð4P5©NN)ry  rz  r{  r|  r„   r_  )r…  r   r„   r   )r„   rˆ  )r  r   r‹  r   r„   r   )rŽ  r   r„   r   )r•  )r‹  r   r–  r÷   ©r„   rÃ   )rÛ  r   rÂ  r   r„   r÷   )rè  )r‹  r   rÂ  r   r–  r÷   )rõ  r   rö  r   )r   r   r   r    r„  r‡  rŠ  Ústaticmethodr�  r”  r²  rµ  rÃ  rÚ  rç  rº  rû  r  r  r  r   r"   r#   rx  rx  °  sÌ  € € € € € ØTÐTð VZØ7;ð
'ð 
'ð 
'ð 
'ð 
'ðð ð ð ðð ð ð ð ð@ð @ð @ñ „\ð@ð ðð ð ñ „\ðð. ð0ð 0ð 0ð 0ñ „\ð0ðd ðð ð ñ „\ððTDð TDð TDð TDð TDðl'ð 'ð 'ð 'ðR ð*ð *ð *ñ „\ð*ðX)ð )ð )ð )ð )ðV ðð ð ñ „\ðð  ðð ð ñ „\ðð6ð ð ð ðBTð Tð Tð Tð Tr"   rx  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)rƒ  r  r!  s      r#   r„  z SlashCommandAutoSuggest.__init__º  s   € ð
 (ˆŒØ#ˆŒˆˆr"   c                ó"  — |j         }|                     d¦  «        s$| j        r| j                             ||¦  «        S d S |                     d¬¦  «        }|d                              ¦   «         }t          |¦  «        dk    rª|                     d¦  «        s•|dd …                              ¦   «         }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	         
                    |¦  «        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Ž   ré   r  r   r”   r   )r  r  r$  Úget_suggestionrµ   r�   rë   r¡  r˜   r%  r‡  r	   rš   )rƒ  Úbufferr  rŽ  rG  r  r‹  rˆ   r  rõ  rö  rä   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Ýð <ð <�Ø”?Ð.°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Ñ$Ô$ˆ	ð Œ?Ð&¨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"   r  )r  r   r!  r"  r„   r_  )r   r   r   r    r„  r'  r   r"   r#   r  r  ³  sN   € € € € € ðð ð /3Ø26ð$ð $ð $ð $ð $ð(ð (ð (ð (ð (r"   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)rž  rŸ  Úgetsizer¥  )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   r¾   r¿   r„   r   r  )r„   rÑ   )r„   rÛ   )rá   r   r„   r   )rÙ   rÛ   rç   r«   r„   rÛ   )rô   N)rõ   r   rö   r÷   rø   r«   rù   r÷   rú   rû   r„   rü   )rô   )r,  r÷   r„   r-  )rö   r÷   rø   r«   r„   rü   )rø   r«   r„   r=  )rg  )rh  r   r„   ri  )r„   r—   )rŸ  r   r„   r   )Sr    Ú
__future__r   rž  ÚrerÏ  rÑ  rÍ  Úcollections.abcr   r   Údataclassesr   Útypingr   Úprompt_toolkit.auto_suggestr   r	   Úprompt_toolkit.completionr
   r   ÚImportErrorÚobjectr   rƒ   r!   rŠ   r‹   r’   r–   r˜   Ú_cmdr   r   r   Ú_aliasr   r™   rH  r   Ú_catrš   r   rg   ÚcompileÚ_PIPE_SUBS_REr¼   r   rb   ÚmÚgrouprµ   Ú	frozensetr    r¦   r§   rª   r½   rÂ   rÐ   r¢   rß   rì   Ú_TG_NAME_LIMITrã   rå   rÝ   ró   Ú_clamp_telegram_namesr+  r9  r<  rV  rb  rZ  rY  r[  rf  rs  rv  rx  r  r©  r   r"   r#   ú<module>rC     sÚ  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðØCÐCÐCÐCÐCÐCÐCÐCØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øØð ð ð Ø€KØ€IØ€JØ€J€J€Jð	øøøð €�$ÐÑÔð+ð +ð +ð +ð +ñ +ô +ñ Ôð+ð$v&à€JˆuÐHÈ)Ø!ð#ñ #ô #ðv&ð €JˆwÐ>À	Øðñ ô ð	v&ð €JˆyÐ5°yØðñ ô ðv&ð €JˆvÐ6¸	Øðñ ô ðv&ð €JˆwÐBÀIÑNÔNðv&ð €JˆvÐ@À)ÑLÔLðv&ð €JˆwÐ=¸yØ!ð#ñ #ô #ðv&ð €JˆxÐPÐR[Ø ¨Hð6ñ 6ô 6ðv&ð  €JˆzÐCÀYØ(ð*ñ *ô *ð!v&ð$ €JˆzÐCÀYØ#ð%ñ %ô %ð%v&ð( €JˆzÐUÐW`Ø iÐ;XðZñ Zô Zð)v&ð, €JˆvÐ>À	ÑJÔJð-v&ð. €JˆyÐ?ÀØ Ð,>ð@ñ @ô @ð/v&ð2 €JˆvÐ9¸9Ø ð"ñ "ô "ð3v&ð6 €Jˆ|Ð=¸yØ$°
ð<ñ <ô <ð7v&ð: €JˆxÐ?ÀØ!ð#ñ #ô #ð;v&ð> €JˆwÐNÐPYØ¨ð5ñ 5ô 5ð?v&ðB €JˆwÐXÐZcØ#ð%ñ %ô %ðCv&ðF €JˆxÐ,¨iÑ8Ô8ðGv&ðH €JˆyÐGÈÑPÔPðIv&ðJ €JˆyÐ=¸yØ ¨-ð9ñ 9ô 9ðKv&ðN €JˆxÐ<¸iØ!ð#ñ #ô #ðOv&ðV €JˆxÐ5°Øðñ ô ðWv&ðZ €JˆwÐ7¸Ø$Ð0VðXñ Xô Xð[v&ð^ €JˆxÐEÀvØðñ ô ð_v&ðd €Jˆ}Ð<¸oØ!ð#ñ #ô #ðev&ðh €Jˆ{ÐAÀ?Ø gð/ñ /ô /ðiv&ðl €JˆyÐUØ¨Ø#BðDñ Dô Dðmv&ðr €JˆvÐPØñ ô  ðsv&ðv €Jˆ{ÐAÀ?Ø,Ømðoñ oô oðwv&ð| €JˆvÐlÐn}Ø/ØDðFñ Fô Fð}v&ðB €JˆvÐ>ÀØ¨ð2ñ 2ô 2ðCv&ðF €JˆwÐ+¨_Ø.Ð<Zð\ñ \ô \ðGv&ðJ €JˆvÐHÈ/ØÐ(BØ;ð=ñ =ô =ðKv&ðT €JˆwÐNÐP`Ø:ÀTðKñ Kô KðUv&ðX €JˆzÐ4Ð6FØðñ ô ðYv&ð\ €JˆxÐEØ¨$ØEðGñ Gô Gð]v&ðb €JˆvÐ/Ð1AØ¨Ø`ðbñ bô bðcv&ðh €JˆxÐIÐK[Øðñ ô ðiv&ðl €Jˆ|Ð=Ð?OØ&ð(ñ (ô (ðmv&ðp €JˆyÐMÐO_ØÐ(EØ>ð@ñ @ô @ðqv&ðv €JˆyÐCØ¨$ð0ñ 0ô 0ðwv&ð~ €JˆzÐGÈØ ¨Hð6ñ 6ô 6ðv&ðB €JˆvÐ0°&Ñ9Ô9ðCv&ðD €JˆyÐUÐW`Ø ð"ñ "ô "ðEv&ðH €JˆwÐRÐTZÑ[Ô[ðIv&ðJ €JˆzÐ>ÀØ!ð#ñ #ô #ðKv&ðN €Jˆ{ÐDÀfØ lð4ñ 4ô 4ðOv&ðR €JˆvÐFÈØ¨
ð4ñ 4ô 4ðSv&ðV €JˆwÐDÀfØðñ ô ðWv&ðZ €JˆwÐHÈ&Ø¨ð2ñ 2ô 2ð[v&ð^ €JˆxÐDÀfØ ð"ñ "ô "ð_v&ðb €JˆwÐZÐ\bÑcÔcðcv&ðh €Jˆv�~ vØ ið1ñ 1ô 1ðiv&Ð ð vð vð vñ vñzð ð ð ð *?Ð)>Ñ)@Ô)@€Ð @Ð @Ð @Ñ @ñ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ñ *ô *Ð ð ð ð ñ ñð ð ð ð0 2;°ðð ð ñ2ô 2Ð ð ð ð ñ ñ(Pð Pð Pð Pñ.ð ð ð ñ:ñ ð ð ð ñ ð ð ð ñ&ð ð ð ñ@ð ð ð ð2 €Ø =ð !€ð �B”J˜}Ñ-Ô-Ð Ø!�r”z (Ñ+Ô+Ð ñð ð ð ñð ð ð ðF -Ð ð Ø37ñk1ñ k1ð k1ð k1ð k1ñd5ñ 5ð 5ð 5ð 5ñDð ð ð ñ<k5ð k5ð k5ð k5ðj Ð ØÐ Ø!�r”z /Ñ2Ô2Ð ñ	$ð 	$ð 	$ð 	$ñ6ð 6ð 6ð 6ñr5ñ 5ð 5ð 5ð 5ñ6ð ð ð ð6|ð |ð |ð |ñ |˜Iñ |ô |ð |ðF7ð 7ñ 7ð 7ñ 7˜kñ 7ô 7ð 7ñt1ñ 1ð 1ð 1ð 1ð 1s   ³A ÁAÁA