Skip to content

UI: a click-through found a wrapping settings drawer, protocol text in previews, blank first-paint chats and a cut-off failure #1347

Closed

Description

@cursor

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

  1. Birfy commented on Oct 27, 2026

    @Birfy
    Collaborator

    现役 PR = #1362(外部实现,作者 cursoragent,head 7d7334a7,base 263d123b,40 文件 +2100/−640)。

    #1346 = superseded 候选(老版,mergeable_state: dirty,40 文件,已被 #1362 取代;正文说没从 #1346 拷 patch)。#1346 现在不关,等 #1362 合入后再一行标 superseded。

    本单的 owner 字段按外部实现记,不写 Dev4。

  2. added
    area:uiWeb/desktop UI and copy
    bugSomething isn't working
    on Oct 27, 2026
  3. added 3 commits that reference this issue on Oct 27, 2026
    907a195
    a1c8f66
    ff72578
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:uiWeb/desktop UI and copybugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions