Source code for ralph.display.tool_args
"""Utilities for formatting tool_use input arguments as a compact display string."""
from __future__ import annotations
from typing import Final, cast
_KNOWN_KEY_ORDER: Final[tuple[str, ...]] = ("path", "command", "workdir", "pattern")
_MCP_RALPH_PREFIX: Final[str] = "mcp__ralph__"
_FRIENDLY_PREFIX: Final[str] = "ralph."
[docs]
def friendly_tool_name(name: str) -> str:
"""Return a shorter display name for well-known MCP tool prefixes.
``mcp__ralph__read_file`` becomes ``ralph.read_file``.
All other names are returned unchanged.
Only the rendered display string is affected; metadata is untouched.
"""
if name.startswith(_MCP_RALPH_PREFIX):
return _FRIENDLY_PREFIX + name[len(_MCP_RALPH_PREFIX) :]
return name
[docs]
def format_tool_input(input_obj: object, *, max_value_chars: int = 120) -> str:
"""Format a tool_use input dict as a compact key=value string.
Returns empty string for non-dict inputs.
Formats as: (k=v k=v ...) with known keys first (path, command, workdir, pattern),
then remaining keys alphabetically. Values are truncated at max_value_chars.
"""
if not isinstance(input_obj, dict):
return ""
d = cast("dict[str, object]", input_obj)
if not d:
return ""
def _fmt(v: object) -> str:
s = str(v).replace("\n", " ")
if len(s) > max_value_chars:
return s[:max_value_chars] + "…"
return s
known = [k for k in _KNOWN_KEY_ORDER if k in d]
remaining = sorted(k for k in d if k not in _KNOWN_KEY_ORDER)
parts = [f"{k}={_fmt(d[k])}" for k in known + remaining]
return f"({' '.join(parts)})"
__all__ = ["format_tool_input", "friendly_tool_name"]