Hook `ask` decisions show raw JSON instead of diff view
- Dominant language
- Shell
- Stars
- 11.2k
- Forks
- 1.9k
- Avg merge
- 14h 16m
- Merged PRs (30d)
- 6
Description
### Describe the bug
Copilot CLI normally shows a rich diff/content view when asking permission to create or edit a file. However, when the `ask` decision comes from a `PreToolUse` hook (i.e. the hook returns `{"permissionDecision": "ask", "permissionDecisionReason": "..."}`) rather than from the default built-in ask-before-write behavior, that rich diff view does not get triggered.
Instead, the "Hook permission request" dialog renders the `permissionDecisionReason` correctly as readable yellow text, but shows the proposed change as a single JSON line containing the raw tool input (file path plus the entire file content field), hard-wrapped at the current terminal width. For a file write/edit with non-trivial content this becomes a wall of wrapped JSON (quotes, escaped `\n`, braces, etc.) that is effectively unreadable, instead of the normal diff view Copilot CLI already has and uses elsewhere.
### Affected version
```
$ copilot --version
GitHub Copilot CLI 1.0.70.
```
### Steps to reproduce the behavior
1. Configure a `PreToolUse` hook script for Copilot CLI (a hook that reads the tool-call JSON from stdin and can return a permission decision).
2. Have the hook return an `ask` decision for a file create/edit tool call, e.g.:
```json
{
"permissionDecision": "ask",
"permissionDecisionReason": "Human review requested for this file write."
}
```
3. Trigger a tool call that creates or edits a file with non-trivial (multi-line) content.
4. Observe the "Hook permission request" dialog that Copilot CLI shows: compare it to the normal ask-before-write dialog (without a hook forcing `ask`), which renders a proper diff/content view for the same kind of file change.
### Expected behavior
- The `permissionDecisionReason` should display as it currently does (readable yellow text) — this part works correctly.
- When the `ask` decision is produced by a hook for a file create/edit tool, the dialog should render the proposed change using the same rich diff/content view Copilot CLI already uses for its default ask-before-write flow, instead of falling back to a single wrapped line of raw JSON tool input.
### Additional context
- OS: Windows 11
- CPU architecture: x86_64
- Terminal: Windows Terminal
- Shell: PowerShell 7 — note that Copilot CLI runs its own tool calls (including file create/edit) via its internal PowerShell invocation regardless of the interactive shell, so this shouldn't affect reproduction
Contributor guide
Research direction
Reproduce the issue through a PreToolUse hook that returns an ask decision for a multiline file create or edit, then compare the Hook permission request dialog with the default ask-before-write flow. Trace the hook permission request entry point and the existing diff/content view; done means the hook path preserves the readable reason and uses that same rich view instead of wrapped raw JSON.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- powershell, shell
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100