docs: added explanation for the 2>/dev/tty for bash built-in script tool usage

2026-06-05 12:34:12 -06:00
parent ebc8d18706
commit cd8ac45967
+21
@@ -28,6 +28,27 @@ scripts:
source "$LLM_PROMPT_UTILS_FILE"
```
# Why Examples Use `2>/dev/tty`
Coyote runs each tool as a subprocess and **captures the tool's stderr** into a buffer. When the wrapped command exits
non-zero, that buffer is attached to the tool result returned to the LLM as `error_json["stderr"]`.
All the interactive helpers below (`input`, `confirm`, `list`, `checkbox`, `password`, etc.) write their prompt text and
terminal escape sequences to stderr. Without redirection, the prompt leaks into the LLM-visible error JSON the next time
your tool exits non-zero, which can produce hallucinations where the model "sees" a confirmation prompt that was meant
for the user.
**The fix is to send the helper's stderr straight to the user's terminal:**
```bash
answer=$(confirm "Proceed?" 2>/dev/tty)
```
Helpers read user input from `/dev/tty` directly, so the redirect only affects the *output* (the prompt itself). Every
example below uses this pattern. Copy it as-is whenever you wrap a helper in `$(...)`.
> `guard_operation` and `guard_path` already apply this redirect internally so you do **not** need `2>/dev/tty` when
> calling them.
# Included Utility Functions
Below are the built-in bash prompt helpers that can be used to enhance user interaction with your tool scripts.