Repository navigation
Description
Found in a real mouse click-through of FlyBot web (DSH 0.2.0-rc.2 pin, DeepSeek V4 Flash on Volcengine Ark). Six interactive UI defects, one per section; each names where it sits.
1. The Details panel wraps its own controls
Steps: open Chief's chat → details header gear (Edit Bot).
Actual: at the panel's 320px opening width a settings row cannot hold a label and its control on one line. The Name field's label renders as Nam / e; Test connection as Test connecti / on; the Main Bot card's Change as Ch / an / ge. People-with-access handles and face-to-face room titles collapse to indistinguishable Face-to-face ….
Where: core/src/client/pane-width.js (DETAILS_WIDTH = 320), core/src/client/bot-settings.js (BOT_SETTINGS_CSS).
Expected: label and control on one line, or an ellipsis — never a word broken mid-word.
2. The trajectory toolbar stays painted over Chat
Steps: open a chat → Trajectory → Chat.
Actual: the duration bar (Duration ⊟ Turns ⊟ Calls) stays across the top of the thread through Inbox / Tasks / Search / Settings until a click on the chat canvas.
Where: DSH's dsh-client-ui-trajectory (.fV0t5q_root, position:sticky, z-index:4) — not FlyBot code.
Status: does not reproduce on 0.2.0-rc.2 or 0.2.1-rc.3; see the closing note.
3. Chat bubbles draw above modals
Steps: open Tasks, or Settings → Connectors, while a right-aligned bubble is on screen.
Actual: a user bubble sits on top of the Tasks Add task area and covers the bottom of the Settings dialog.
Where: layer stack in core/src/client/styles.js (.bt-mem-layer z 61, .bt-settings-layer z 60) against the shell's composer seat (position:sticky, z 7).
Status: does not reproduce on either DSH; see the closing note.
4. A sidebar preview shows raw protocol text
Steps: look at the "You, Chief, Helper" row.
Actual: the preview reads @Chief (SelfB1025)#person: User: from="User"> B踢后测4 >.
Where: previewOf in core/src/client/text.js, the group row in core/src/client/sidebar.js, and preview in core/src/host/channel.js — three surfaces, each doing its own unwrapUntrusted, which only unwraps a complete wrap.
Expected: the words of the line, never a fence or a fragment of one.
5. A Bot chat first paints as a blank column
Steps: load home with a Bot selected, then click another Bot with no messages.
Actual: a white pane with only the composer. No header, no thread, no empty state — the sidebar row is the only thing naming the chat.
Where: the shell draws headerBlank (no title) for a session that has said nothing; FlyBotSessionDock (core/src/client/flybot-slots.js) stood in for that header only on a group (#998), never on a Bot chat.
6. "Share conversation" copies Markdown with no confirmation
Steps: details header → the share button.
Actual: its accessible name says Share conversation and its tooltip Copy conversation as Markdown; the click copies and says nothing — no toast, and the clipboard write is not awaited for failure.
Where: share() in core/src/client/details-drawer.js.
7. "Standard mode" beside the title does not open a menu
Steps: click it.
Actual: nothing. It is drawn as a filled chip with an icon, which reads as a control; DSH renders it as a span with no handler (AgentPresetLabel, dsh-client-ui-agent-preset), and the mode is fixed for a Session anyway.
Expected: either a menu, or a status that does not look pressable.
8. An Inbox failure is a cut-off JSON body
Steps: Inbox → a failed turn.
Actual: 404: {"code":"UnsupportedModel","message":"The requested model does not support …, — truncated before anything actionable, because the host keeps 160 characters of the provider body (noteEnded, core/src/host/turns.js).
Expected: a sentence naming the feature and where to change the model.
9. Feedback → Recent errors flooded with rate_limited
a room link claim was not read: Too many attempts…. This is #1161's retry storm, already fixed by the per-minute read gap and the rate_limited pause in seatOpenClaims and pinned by core/test/room-ticket-seat.test.js. No code change; the entries predate the fix.
Closing note on 2 and 3
Neither reproduces on DSH 0.2.0-rc.2 (the pin) or 0.2.1-rc.3. For the toolbar: recorded every animation frame across Chat → Trajectory → Chat, an 80 ms and a 250 ms switch, after scrolling the table, from Inbox, from Settings, and through a sidebar chat switch — it unmounts within a frame of the click and never paints in Chat. For the stacking: elementsFromPoint over the whole dialog area at 1000/1024/1100/1280/1366/1400px, thread scrolled, drawer open, from Inbox / Tasks / Settings / Connectors — nothing outside the layer is ever topmost, and an opaque-red composer seat leaves no pixel inside the dialog. A reproduction naming the exact DSH build and browser in the screenshots is needed before code is written for them.
Product note: the fixes below are small and none adds a control; where a chip was not a control it stops looking like one.
Activity
fix(ui): point the click-through fixes at the filed issue (#1347)
fix(ui): the thread can no longer paint above a dialog, a sheet or a …
fix(ui): prove and harden the dialog stacking fix on the owner's own …
Birfy commentedon Oct 27, 2026
现役 PR =
#1362(外部实现,作者cursoragent,head7d7334a7,base263d123b,40 文件+2100/−640)。#1346= superseded 候选(老版,mergeable_state: dirty,40 文件,已被#1362取代;正文说没从#1346拷 patch)。#1346现在不关,等#1362合入后再一行标 superseded。本单的 owner 字段按外部实现记,不写
Dev4。Fix the six interactive UI defects a click-through found (ThinkFlowLa…
fix(palette): read a search row through the same line reader as a pre…
fix(palette): read a search row through the same line reader as a pre…
fix(palette): read a stored line's words in a ⌘K row, not its fence m…
client: a connector's failure text is one click to copy (ThinkFlowLab…