
    i                    Z    d Z ddlmZ ddlmZmZ dZdZdZddZ	ddZ
ddZddZddZdS )u  Configurable tool-output truncation limits.

Ported from anomalyco/opencode PR #23770 (``feat(truncate): allow
configuring tool output truncation limits``).

OpenCode hardcoded ``MAX_LINES = 2000`` and ``MAX_BYTES = 50 * 1024``
as tool-output truncation thresholds. Hermes-agent had the same
hardcoded constants in two places:

* ``tools/terminal_tool.py`` — ``MAX_OUTPUT_CHARS = 50000`` (terminal
  stdout/stderr cap)
* ``tools/file_operations.py`` — ``MAX_LINES = 2000`` /
  ``MAX_LINE_LENGTH = 2000`` (read_file pagination cap + per-line cap)

This module centralises those values behind a single config section
(``tool_output`` in ``config.yaml``) so power users can tune them
without patching the source. The existing hardcoded numbers remain as
defaults, so behaviour is unchanged when the config key is absent.

Example ``config.yaml``::

    tool_output:
      max_bytes: 100000        # terminal output cap (chars)
      max_lines: 5000          # read_file pagination + truncation cap
      max_line_length: 2000    # per-line length cap before '... [truncated]'

The limits reader is defensive: any error (missing config file, invalid
value type, etc.) falls back to the built-in defaults so tools never
fail because of a malformed config.
    )annotations)AnyDictiP  i  valuer   defaultintreturnc                j    	 t          |           }n# t          t          f$ r |cY S w xY w|dk    r|S |S )z@Return ``value`` as a positive int, or ``default`` on any issue.r   )r   	TypeError
ValueError)r   r   ivs      =/home/ubuntu/.hermes/hermes-agent/tools/tool_output_limits.py_coerce_positive_intr   ,   sP    ZZz"   	QwwIs    ((Dict[str, int]c                    	 ddl m}   |             pi }t          |t                    r|                    d          nd}t          |t                    si }n# t
          $ r i }Y nw xY wt          |                    d          t                    t          |                    d          t                    t          |                    d          t                    dS )	zReturn resolved tool-output limits, reading ``tool_output`` from config.

    Keys: ``max_bytes``, ``max_lines``, ``max_line_length``. Missing or
    invalid entries fall through to the ``DEFAULT_*`` constants. This
    function NEVER raises.
    r   )load_configtool_outputN	max_bytes	max_linesmax_line_length)r   r   r   )
hermes_cli.configr   
isinstancedictget	Exceptionr   DEFAULT_MAX_BYTESDEFAULT_MAX_LINESDEFAULT_MAX_LINE_LENGTH)r   cfgsections      r   get_tool_output_limitsr!   7   s    111111kmm!r,6sD,A,AK#''-(((t'4(( 	G    *'++k*B*BDUVV)'++k*B*BDUVV/KK)**,C
 
  s   AA A'&A'c                 *    t                      d         S )z?Shortcut for terminal-tool callers that only need the byte cap.r   r!        r   get_max_bytesr&   P       !##K00r%   c                 *    t                      d         S )z:Shortcut for file-ops callers that only need the line cap.r   r#   r$   r%   r   get_max_linesr)   U   r'   r%   c                 *    t                      d         S )z>Shortcut for file-ops callers that only need the per-line cap.r   r#   r$   r%   r   get_max_line_lengthr+   Z   s    !##$566r%   N)r   r   r   r   r	   r   )r	   r   )r	   r   )__doc__
__future__r   typingr   r   r   r   r   r   r!   r&   r)   r+   r$   r%   r   <module>r/      s    > # " " " " "        
          21 1 1 1
1 1 1 1
7 7 7 7 7 7r%   