summary
open a fresh warp tab, run claude, look at the sidebar — it immediately shows ⏳ In progress, even though the agent hasn't done anything yet. gemini cli and factory/droid tabs under identical conditions show their sidebar rows with no state pill at all. i can reproduce this on v2.0.0 stock with no fork, so this is upstream behavior, not a regression from pr #27.
the adapter has no clean way to fix it from the plugin side. writing this up so the warp team has the context.
reproduction
- open a fresh warp tab (stable build,
v0.2026.04.15.08.45.stable_02)
- install
warp@claude-code-warp v2.0.0
- run
claude (claude code v2.1.116)
- sidebar row appears with
⏳ In progress pill before any prompt is submitted
for contrast: gemini and droid in the same terminal, with no warp plugin at all installed in their config dirs, render sidebar rows with no pill. just cli label + cwd + branch.
what actually happens (three observed states)
i tested three payload shapes to see if any combination produced the pill-free row:
| what the plugin emits on session start |
sidebar renders as |
nothing (zero warp://cli-agent events) |
>_ Terminal — pane isn't recognized as a claude session at all |
session_start only |
✦ Claude Code + ⏳ In progress pill |
session_start + follow-up stop |
✦ Claude Code + ✓ Done pill |
all three are wrong in different ways. the pane-is-terminal outcome is the worst — it breaks agent-row identification. in progress is semantically incorrect (agent hasn't started a turn). done is semantically incorrect (agent hasn't done anything).
what i think is happening
gemini and factory/droid appear to be auto-detected by warp's own binary-name process watcher — no plugin is needed for them to appear as an agent row. for those two clis, warp ships the agent-row rendering independently of any osc protocol.
claude code has no equivalent path. the sidebar is fully osc-driven for agent:"claude" — the plugin has to emit at least one warp://cli-agent event for warp to flip from "generic terminal" to "agent row", and any osc seems to attach a default state pill.
what would help
any of these, roughly in order of cleanliness:
- auto-detect the
claude binary, same way gemini and droid are detected. a plugin that hasn't emitted any osc would still get a clean sidebar row.
- document a protocol event that registers the row without attaching a state pill.
session_start could be extended with an optional field like state: "idle" that warp respects, or a new session_ready event could exist for this.
- per-agent default state registration. let the plugin declare "this agent starts in the done/idle state, not running" once at install time.
option 1 is probably the simplest since the machinery exists for the other two clis.
tangential ask: writable sidebar description / icon (à la cmux)
the cli-agent protocol gives plugins three levers over what renders in the sidebar row: session_title, summary, tool_preview. cmux (github.com/zdriv/cmux) lets plugin authors update the sidebar description text and icon directly as the agent works — things like running pytest (23/41), waiting on github pr review, compiling rust workspace. it's the single most useful protocol capability for ui-driven workflows.
i've written a cmux plugin that uses this surface and it opens up a lot of richer statusing than what tool_preview allows. even a minimal status_description string field that any event can update would cover most of the same ground on warp's side.
the ergonomics problem underneath
there are no official docs for the cli-agent osc protocol. what i know comes from reading warpdotdev/claude-code-warp, warpdotdev/gemini-cli-warp, and warpdotdev/opencode-warp side by side. the protocol turns out to be small — six envelope fields, seven event names, one transport, one feature flag — but without a public spec the reverse engineering is guesswork:
- no enumeration of which event names warp actually routes (had to grep
event= literals across adapters)
- no schema for optional vs required fields, no rejection/validation examples
- no changelog —
WARP_CLI_AGENT_PROTOCOL_VERSION=1 is the only versioning primitive, and the plugin's own should-use-structured.sh hardcodes a last-known-broken build by version string (v0.2026.03.25.08.24.stable_05)
i wrote up everything i inferred here: reverse-engineering warp's cli-agent notification protocol. a public spec — even a one-page readme in this repo — would make third-party adapters a lot less speculative. this issue is one of the symptoms.
context
- claude code
v2.1.116
- warp
v0.2026.04.15.08.45.stable_02
- macos
darwin 25.4.0 (apple silicon)
- reproduced across multiple fresh tabs + fresh sessions
not asking for a specific fix — flagging the behavior + the protocol gap so the warp team can decide the right shape.
summary
open a fresh warp tab, run
claude, look at the sidebar — it immediately shows⏳ In progress, even though the agent hasn't done anything yet. gemini cli and factory/droid tabs under identical conditions show their sidebar rows with no state pill at all. i can reproduce this onv2.0.0stock with no fork, so this is upstream behavior, not a regression from pr #27.the adapter has no clean way to fix it from the plugin side. writing this up so the warp team has the context.
reproduction
v0.2026.04.15.08.45.stable_02)warp@claude-code-warpv2.0.0claude(claude codev2.1.116)⏳ In progresspill before any prompt is submittedfor contrast:
geminianddroidin the same terminal, with no warp plugin at all installed in their config dirs, render sidebar rows with no pill. justcli label + cwd + branch.what actually happens (three observed states)
i tested three payload shapes to see if any combination produced the pill-free row:
warp://cli-agentevents)>_ Terminal— pane isn't recognized as a claude session at allsession_startonly✦ Claude Code+⏳ In progresspillsession_start+ follow-upstop✦ Claude Code+✓ Donepillall three are wrong in different ways. the pane-is-terminal outcome is the worst — it breaks agent-row identification.
in progressis semantically incorrect (agent hasn't started a turn).doneis semantically incorrect (agent hasn't done anything).what i think is happening
gemini and factory/droid appear to be auto-detected by warp's own binary-name process watcher — no plugin is needed for them to appear as an agent row. for those two clis, warp ships the agent-row rendering independently of any osc protocol.
claude code has no equivalent path. the sidebar is fully osc-driven for
agent:"claude"— the plugin has to emit at least onewarp://cli-agentevent for warp to flip from "generic terminal" to "agent row", and any osc seems to attach a default state pill.what would help
any of these, roughly in order of cleanliness:
claudebinary, same way gemini and droid are detected. a plugin that hasn't emitted any osc would still get a clean sidebar row.session_startcould be extended with an optional field likestate: "idle"that warp respects, or a newsession_readyevent could exist for this.option 1 is probably the simplest since the machinery exists for the other two clis.
tangential ask: writable sidebar description / icon (à la cmux)
the cli-agent protocol gives plugins three levers over what renders in the sidebar row:
session_title,summary,tool_preview. cmux (github.com/zdriv/cmux) lets plugin authors update the sidebar description text and icon directly as the agent works — things likerunning pytest (23/41),waiting on github pr review,compiling rust workspace. it's the single most useful protocol capability for ui-driven workflows.i've written a cmux plugin that uses this surface and it opens up a lot of richer statusing than what
tool_previewallows. even a minimalstatus_descriptionstring field that any event can update would cover most of the same ground on warp's side.the ergonomics problem underneath
there are no official docs for the cli-agent osc protocol. what i know comes from reading
warpdotdev/claude-code-warp,warpdotdev/gemini-cli-warp, andwarpdotdev/opencode-warpside by side. the protocol turns out to be small — six envelope fields, seven event names, one transport, one feature flag — but without a public spec the reverse engineering is guesswork:event=literals across adapters)WARP_CLI_AGENT_PROTOCOL_VERSION=1is the only versioning primitive, and the plugin's ownshould-use-structured.shhardcodes a last-known-broken build by version string (v0.2026.03.25.08.24.stable_05)i wrote up everything i inferred here: reverse-engineering warp's cli-agent notification protocol. a public spec — even a one-page readme in this repo — would make third-party adapters a lot less speculative. this issue is one of the symptoms.
context
v2.1.116v0.2026.04.15.08.45.stable_02darwin 25.4.0(apple silicon)not asking for a specific fix — flagging the behavior + the protocol gap so the warp team can decide the right shape.