Configurable tool call visibility (VS Code extension + terminal CLI)

Resolved 💬 2 comments Opened Mar 21, 2026 by ojhurst Closed Apr 18, 2026

Problem

Some tool calls are infrastructure — voice output, logging, background sync — not content the user needs to see. Currently every tool call renders in the conversation UI with full IN/OUT blocks, creating visual clutter when tool calls are used for side-effects rather than meaningful output.

This applies to both the VS Code extension and the terminal CLI — both render every tool call visually with no way to suppress it.

Current behavior

Every voice output creates a visible Bash block with the full command and output, even when using run_in_background: true. The actual response text is above it, but the Bash block dominates:

<img width="1048" height="233" alt="Image" src="https://github.com/user-attachments/assets/3debdc8a-fa07-4aaf-b7f0-654ed11efbeb" />

● Both approaches shown — user-level config for patterns,
  and a per-call flag for one-offs.

● Bash  Voice
  IN   while pgrep -x say >/dev/null; do sleep 0.3; done; bash ~/apps/cc/say-wrap.sh -r 200 "[[slnc 500]] I drafted two co...
  OUT  Command running in background with ID: bos325wx5. Output is being written to: /private/tmp/...

  Standing by.

The Bash call is pure plumbing — the response text is already visible as a normal message above it.

Desired behavior

The tool call still executes (voice plays, file writes, etc.), but nothing renders in the UI:

● Both approaches shown — user-level config for patterns,
  and a per-call flag for one-offs.

  Standing by.

Just the clean text. The infrastructure tool call is invisible.

Proposed solutions

Option A: Settings-based pattern matching

// .claude/settings.json
{
  "hiddenToolPatterns": [
    { "tool": "Bash", "descriptionMatch": "Voice" },
    { "tool": "Bash", "commandMatch": "say-wrap.sh" },
    { "tool": "Write", "pathMatch": "/tmp/claude-voice*" }
  ]
}

Option B: Per-call visibility parameter

{
  "tool": "Bash",
  "command": "bash ~/apps/cc/say-wrap.sh -r 200 'Hello'",
  "description": "Voice",
  "visible": false
}

Both approaches would be ideal — settings for recurring patterns, per-call flag for one-offs.

Use cases

  • Voice/TTS output — speaking responses aloud via macOS say or a speech daemon. The text is already visible as a normal message; the Bash call is pure plumbing.
  • Auto-save/checkpointing — writing state, memory files, or session context to disk after every exchange
  • Telemetry/analytics — tracking usage metrics, token counts, or session stats silently
  • Git auto-commit — background commits to a working branch after code changes
  • Notification dispatch — sending Slack, Discord, or webhook updates during long tasks
  • Audit/compliance logging — security or compliance logs that shouldn't interrupt the user
  • Health checks — pinging services or verifying server status as part of a workflow

Current workaround

run_in_background: true reduces prominence slightly, but the IN/OUT blocks still render in the conversation and generate task completion notifications that also clutter the UI.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗