[FEATURE] Surface pending-approval state in session JSONL (or via API) so external tools can detect blocked sessions

Resolved 💬 3 comments Opened May 7, 2026 by irminak-remitly Closed May 10, 2026

Preflight Checklist

  • [x] I have searched existing requests and this feature hasn't been requested yet
  • [x] This is a single feature request (not multiple features)

Problem Statement

When running multiple Claude Code CLI sessions across terminal windows (different repos / parallel tasks), there's no machine-readable way to tell which sessions are blocked waiting on user approval vs idle vs actively running a tool.

The session JSONL files at ~/.claude/projects/<project>/<session-id>.jsonl are an obvious source of truth, but they only record completed message turns. A tool-use block written before the user has approved looks identical to one currently executing — both show "last entry is assistant message with tool_use, no matching tool_result."

To monitor N sessions today, I have to either tab through each terminal manually, or write fragile heuristics combining JSONL inspection with ps / CPU usage to guess which sessions are paused on an approval prompt.

Proposed Solution

Emit lightweight state events to the session JSONL whenever the session enters a state external observers care about. At minimum:

permission_prompt_started — when a tool requires approval
permission_prompt_resolved — approved, denied, or auto-allowed (with the verdict)
tool_started / tool_completed — frame the in-progress window

Alternative Solutions

expose this via a small local IPC surface (Unix socket / file in ~/.claude/state/) that lists all currently active sessions and their state.

Priority

High - Significant impact on productivity

Feature Category

Developer tools/SDK

Use Case Example

Scenario: Friday afternoon, mid-sprint, 4 parallel tasks

I'm a senior engineer working across several backend services. I have 4 Claude Code sessions running in 4 tmux windows because each task is independent and Claude does most of the busywork:

Window 1 — service-1: implementing TICKET-100 (a cache fix). Session is mid-Bash running make test, takes ~3 min.
Window 2 — service-2: refactoring legacy fallback logic. Claude just finished editing 3 files and is about to run make build.
Window 3 — service-3: investigating an alert from this morning, Claude is grepping logs and reading code.
Window 4 — service-4: updating documentation, Claude has drafted a project-doc change.
Around 14:50 I tab to window 4, approve the doc write, then context-switch to a chat thread about a sprint demo. I forget about the other windows.

The problem:

At 15:05 I come back. I have to manually:

Ctrl+B 1 → check window 1: still running tests, fine.
Ctrl+B 2 → window 2: paused at 14:51 on a permission prompt to run make build. Sat idle 14 minutes because make build isn't auto-allowed in that repo.
Ctrl+B 3 → window 3: actively writing a Bash grep, fine.
Ctrl+B 4 → done, ready for next prompt.
I just lost 14 minutes of throughput on window 2 because nothing told me it was waiting.

What I want instead:

A tiny script in window 0 (a status pane) that reads ~/.claude/projects/*.jsonl events and shows:

[15:05:32] sessions:
✅ service-1 running tool=Bash (2m 14s elapsed)
⏸️ service-2 AWAITING APPROVAL tool=Bash "make build" (14m 31s)
✅ service-3 running tool=Grep (4s elapsed)
💤 service-4 idle last activity 9m ago
The ⏸️ AWAITING APPROVAL line lights up red. I tab over and approve. Cost: 2 seconds, not 14 minutes.

Why JSONL events would solve this:

Today my script can detect last entry is tool_use, no matching tool_result, but that state is identical for "Bash command running" and "waiting for user." With a permission_prompt_started event written when the prompt appears (and permission_prompt_resolved when it clears), the script becomes trivially correct. No heuristics, no ps tree inspection, no false positives on long-running tools.

This is a daily reality for anyone using Claude Code in parallel — and parallelism is exactly the workflow encouraged by the Agent tool and the --resume UX. The signal already exists internally; just needs to be written to the transcript.

Additional Context

[15:05:32] sessions:
✅ service-1 running tool=Bash (2m 14s elapsed)
⏸️ service-2 AWAITING APPROVAL tool=Bash "make build" (14m 31s)
✅ service-3 running tool=Grep (4s elapsed)
💤 service-4 idle last activity 9m ago
The ⏸️ AWAITING APPROVAL line lights up red. I tab over and approve. Cost: 2 seconds, not 14 minutes.

Example: Pixel Agents UI plugin for vs code: https://www.reddit.com/r/vibecoding/comments/1rbs3dq/i_built_a_vs_code_extension_that_turns_your/

View original on GitHub ↗

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