You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dashboard treats OMP 17 write xd://… device dispatches as ordinary file writes. TUI does not.
Worst case is plan mode: write xd://propose is the only way to submit a plan for approval. TUI pops handlePlanApproval({ planFilePath, title, planExists }). Dashboard renders a Write xd://propose card with the slug as file content and never opens an approval UI.
Same unwrap gap hits every other xd:// device (resolve, reject, MCP, github, canvas, …) plus a long tail of TUI-specialized tools that fall through to GenericToolRenderer (raw JSON args).
Not a dup of #95 (Ask collapse), #56 (xd:// excluded from change summaries only), or #115 (prompt-bus re-entry crash).
Observed
Live session ~/.omp/agent/sessions/-code-zge-workspace/2026-07-16T22-34-50-732Z_019f6d11-7dec-7000-b12d-b062e35737a2.jsonl:
EditToolRenderer (no staged-preview / ⟨proposed⟩ badge)
write
WriteToolRenderer (no xd unwrap)
read
ReadToolRenderer
resolve / reject
missing (arrive as write)
eval (+ js/python/notebook aliases)
Generic
browser / puppeteer
Generic
task
Generic (Agent renderer is a different tool)
hub / irc / job / await / poll
Generic
todo
Generic
lsp
Generic
ast_edit / ast_grep
Generic
grep / glob / find
summary one-liner only; body Generic
web_search / fetch
Generic
debug
Generic
github
Generic
goal / think / retain / recall / reflect
Generic
inspect_image / generate_image / computer
Generic
vibe_*
Generic
ctx_*
CtxToolRenderer (dashboard-only; good)
OMP collab-web already ships React views for most of the TUI set (export/html/tool-views.generated.js). Dashboard does not reuse them.
Suggested fix (do not implement here)
P0 — unwrap write + details.xdev. If args.path is xd://<name> or toolDetails.xdev is set, look up renderer by device name (not "write"). Header/summary/icon follow the device.
P0 — plan approval.xdev.tool === "propose" + inner.planFilePath → interactive card (title, plan path, Approve/Reject). Treat as input-needed so bursts cannot collapse it. Wire a respond path equivalent to TUI handlePlanApproval.
P0 — resolve/reject. Dedicated Accept/Discard banner; do not syntax-highlight the reason as a file.
P1 — high-frequency TUI tools. Dedicated cards for eval, browser, task, hub, todo, lsp, ast_edit/ast_grep, grep/glob, web_search, debug, github. Prefer adapting OMP collab-web views over a second visual language.
P1 — staged edit preview. Surface PREVIEW_PENDING_NOTICE / ⟨proposed⟩ so a staged ast_edit/edit does not look applied.
Plan-mode write xd://propose with details.xdev.inner.planExists opens a dashboard approval card; Approve/Reject unblocks the agent the same way TUI does.
write xd://resolve / xd://reject render as Accept/Discard, not Write.
write xd://mcp__… (and other mounted devices) render as that tool, not a file write of the JSON args.
eval / browser / task / hub / todo cards are readable without expanding raw JSON.
Summary
Dashboard treats OMP 17
write xd://…device dispatches as ordinary file writes. TUI does not.Worst case is plan mode:
write xd://proposeis the only way to submit a plan for approval. TUI popshandlePlanApproval({ planFilePath, title, planExists }). Dashboard renders aWrite xd://proposecard with the slug as file content and never opens an approval UI.Same unwrap gap hits every other
xd://device (resolve,reject, MCP, github, canvas, …) plus a long tail of TUI-specialized tools that fall through toGenericToolRenderer(raw JSON args).Not a dup of #95 (Ask collapse), #56 (xd:// excluded from change summaries only), or #115 (prompt-bus re-entry crash).
Observed
Live session
~/.omp/agent/sessions/-code-zge-workspace/2026-07-16T22-34-50-732Z_019f6d11-7dec-7000-b12d-b062e35737a2.jsonl:TUI (
event-controller.ts~1197–1217):writeDeviceDispatch→handlePlanApproval.Dashboard:
WriteToolRendererprintspath+ syntax-highlightedcontent. Nodetails.xdevread anywhere underpackages/client.Expected
write xd://proposelocal://…-plan.md, Approve/Reject)write xd://resolve/xd://rejectwrite xd://<device>details.xdev.tooland render that tooleval/browser/task/hub/todo/lsp/ast_edit/ast_grep/grep/glob/web_search/debug/githubGrounded cause
OMP 17 removed the hidden
resolvetool. Staged actions + plan submit ride plain-text writes toxd://resolve/xd://reject/xd://propose. Write results carrydetails.xdev(WriteToolDetails.xdev). TUI write renderer delegates; dashboard never unwraps.Dashboard lookup is name-only:
getToolRenderer(toolName)inpackages/client/src/components/tool-renderers/registry.ts— mapped:read,edit,write,bash,Agent,ask/ask_user,ctx_*. Else Generic.getSummary/toolIconsinpackages/client/src/lib/tool-summary.ts— same small set + grep/glob/find/ls/git/kb_search. Unknown → bare tool name.toolCallPrefKeybuckets every unmapped name asgeneric(hidable).isInputNeededToolis onlyask/ask_user. Plan approval is not input-needed, so bursts can collapse it.lineDelta.tsalready dropsxd://paths from file summaries (Exclude xd:// tool calls from per-turn file change summaries #56) — render path was never updated.ProposeDialog.tsxis OpenSpec/skill:openspec-propose, not this device.Zero matches in dashboard source for
xd://propose,writeDeviceDispatch,handlePlanApproval,planFilePath,details.xdev.Catalog (TUI renderer vs dashboard)
TUI
toolRenderers(@oh-my-pi/pi-coding-agent/src/tools/renderers.ts):askbashedit/apply_patch⟨proposed⟩badge)writereadresolve/rejectwrite)eval(+ js/python/notebook aliases)browser/puppeteertaskhub/irc/job/await/polltodolspast_edit/ast_grepgrep/glob/findweb_search/fetchdebuggithubgoal/think/retain/recall/reflectinspect_image/generate_image/computervibe_*ctx_*OMP collab-web already ships React views for most of the TUI set (
export/html/tool-views.generated.js). Dashboard does not reuse them.Suggested fix (do not implement here)
write+details.xdev. Ifargs.pathisxd://<name>ortoolDetails.xdevis set, look up renderer by device name (not"write"). Header/summary/icon follow the device.xdev.tool === "propose"+inner.planFilePath→ interactive card (title, plan path, Approve/Reject). Treat as input-needed so bursts cannot collapse it. Wire a respond path equivalent to TUIhandlePlanApproval.eval,browser,task,hub,todo,lsp,ast_edit/ast_grep,grep/glob,web_search,debug,github. Prefer adapting OMP collab-web views over a second visual language.PREVIEW_PENDING_NOTICE/⟨proposed⟩so a stagedast_edit/editdoes not look applied.Acceptance
write xd://proposewithdetails.xdev.inner.planExistsopens a dashboard approval card; Approve/Reject unblocks the agent the same way TUI does.write xd://resolve/xd://rejectrender as Accept/Discard, not Write.write xd://mcp__…(and other mounted devices) render as that tool, not a file write of the JSON args.eval/browser/task/hub/todocards are readable without expanding raw JSON.ask/ask_userstay non-collapsible (bug: "Ask" tool UI broken — buttons truncated, unclickable, tool collapsed, context hidden #95).WriteToolRenderer.Pointers
dev-tools/omp-tool-ui-collapse/overlay/files/src/modes/controllers/event-controller.ts~1197@oh-my-pi/pi-coding-agent/src/tools/write.tswriteToolRenderer+WriteToolDetails.xdev@oh-my-pi/pi-coding-agent/src/tools/resolve.ts(PROPOSE_DEVICE_PATH,writeDeviceDispatch,isProposeToolCall)interactive-mode.ts#enterPlanMode(write required so agent can submit)packages/client/src/components/tool-renderers/{registry,WriteToolRenderer,GenericToolRenderer}.tsx,packages/client/src/lib/tool-summary.ts,packages/shared/src/{display-prefs,input-needed-tools}.ts