deepseek-harness/packages/client/ui-question
imccyu afaa9ad828 style: satisfy the eslint lane on the plan surfaces
Drop the assertions eslint proved unnecessary (getByRole gains the element
type parameter instead, keeping tsc satisfied), declare the injected
setPlanMode as a function property (the seat face is this-free), and narrow
the fixture's command args without String()'s object stringification arm.
2026-07-28 22:36:35 +08:00
..
src Merge origin/master: session projection base, command channel, composer seats 2026-07-28 20:24:06 +08:00
tests style: satisfy the eslint lane on the plan surfaces 2026-07-28 22:36:35 +08:00
package.json Merge remote-tracking branch 'origin/master' into worktree/web-ask-user-question 2026-07-23 14:05:08 +08:00
README.i18n.yaml docs: regenerate catalogs and re-pair bilingual READMEs 2026-07-28 21:46:48 +08:00
README.md Merge origin/master: session projection base, command channel, composer seats 2026-07-28 20:24:06 +08:00
README.zh.md docs: regenerate catalogs and re-pair bilingual READMEs 2026-07-28 21:46:48 +08:00
tsconfig.json Merge remote-tracking branch 'origin/master' into worktree/web-ask-user-question 2026-07-23 14:05:08 +08:00
tsdown.config.ts feat(gui): add ask-user question composer 2026-07-22 23:39:50 +08:00

@deepseek-ai/dsh-client-ui-question

English | 中文

Web ask_user_question feature plugin. Its host half mounts dsh-tool-ask-user only when the Web feature is selected; its browser half registers the question entry in the conversation-owned conversation.composer keyed slot.

The component renders one question at a time with progress navigation, single- and multi-select choices, recommendation badges derived from label suffixes, and custom answers. Question detail reuses the assistant-output MarkdownText primitive, including its GFM rendering and untrusted-content policy. The capped card keeps its title, navigation, and submission actions fixed while long detail and choices share an internal scroll region. Single-select choices advance immediately, and Enter submits once every question is answered or skipped; Enter during IME composition confirms the input candidate without advancing. It submits one structured answer batch for the whole request: “Skip this question” retains other drafts and emits the existing blank { selected: [] } shape for that item, while close rejects the whole wait as ASK_CANCELLED.

Selection state is local to a component keyed by the request rpcId. A replay with the same id preserves a still-mounted draft, while question/resolved from the host removes the composer. The host remains authoritative: successful HTTP delivery does not remove pending state locally.

Model Experience

Indirectly, through dsh-tool-ask-user; that package owns the model-visible tool schema and structured result.

KV Cache effect

No direct invalidation; dsh-tool-ask-user owns the model-visible tool call and result.

Known Limitations and Deferred Work

  • Unsubmitted drafts are not durable — reconnect resync or a full page reload restores the host-owned pending request with the same rpcId, but a composer unmount resets local option and custom-text drafts.
  • One request owns the composer at a time — later pending requests remain in the session snapshot and become visible after the earlier request resolves.