Module: Rubino::UI::ToolLabel

Defined in:
lib/rubino/ui/tool_label.rb

Overview

Shared vocabulary for the concise ‘name hint` tool label used across adapters — the interactive `● edit foo.rb` card open-row (UI::CLI) AND the non-interactive one-shot stderr trace (UI::HeadlessTrace) draw their hint from here so the two never drift. The hint is the single most-identifying argument (pattern / file_path / path / command), secrets-masked and terminal-sanitized so an untrusted filename/command can never drive the terminal from a label row (R3C-1, CWE-150).

Class Method Summary collapse

Class Method Details

.hint(arguments, max: 60, verbose: false) ⇒ Object

The concise, sanitized hint string for a tool’s arguments — the first line, secrets-masked, escape-stripped, truncated to ‘max` chars. Returns nil when there’s no identifying argument. ‘verbose:` raises the cap so a `–verbose` one-shot trace can show fuller args.



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/rubino/ui/tool_label.rb', line 31

def hint(arguments, max: 60, verbose: false)
  picked = pick_hint(arguments)
  return nil unless picked

  raw_key, raw_value = picked
  masked = Util::SecretsMask.mask_value(raw_value, key: raw_key).to_s
  clean  = Util::Output.sanitize_terminal(masked)
  first  = clean.lines.first.to_s.strip
  cap    = verbose ? max * 4 : max
  first.length > cap ? "#{first[0, cap - 3]}..." : first
end

.label(name, arguments, max: 60, verbose: false) ⇒ Object

The full ‘name hint` label (e.g. `edit foo.rb`, `bash npm test`, `read README.md`). Falls back to the bare tool name when the tool has no identifying argument.



46
47
48
49
# File 'lib/rubino/ui/tool_label.rb', line 46

def label(name, arguments, max: 60, verbose: false)
  h = hint(arguments, max: max, verbose: verbose)
  h && !h.empty? ? "#{name} #{h}" : name.to_s
end

.pick_hint(arguments) ⇒ Object

Picks the most-identifying [key, value] pair from a tool’s arguments, in priority order. Returns nil when none of the known keys carry a value.



17
18
19
20
21
22
23
24
25
# File 'lib/rubino/ui/tool_label.rb', line 17

def pick_hint(arguments)
  return nil unless arguments.is_a?(Hash)

  %i[pattern file_path path command].each do |k|
    v = arguments[k] || arguments[k.to_s]
    return [k, v] if v && !v.to_s.empty?
  end
  nil
end