Files
deepseek-harness/apps/web/tests/snapshots/message-actions/ui.expected.md
T
Yichen Jiang bb43ff4f37 feat(ui): make a session that cannot send refuse to accept one
A default naming a route the Models page has since removed left the
composer saying 选择模型 while the input still accepted a message, which
then failed inside the adapter mid-turn.

`session.prompt` now refuses with `model-unavailable` before opening a
turn. That is the enforcement boundary: the method stays callable no
matter what a client disables. `session.models` reports the same fact as
`routable`, and ui-model pushes a block through the new
`ctx.conversation.blocks` registry so the bar renders the disabled
textarea it already renders without a workspace, carrying the blocker's
own reason. The push direction is forced — ui-model already depends on
ui-conversation, so ui-conversation cannot read it back.

The gate is `routable`, not "matches no advertised group": catalog
membership is advisory, so a route serving a model it stopped advertising
is missing from the groups yet perfectly usable, and `null` before the
first load never blocks so a slow Host cannot lock a working composer.

The scaffold gains a route-only adapter for fixture-less keyless
scenarios. Registering zero providers is a test artifact — every product
composition mounts one — and the goldens that froze the seat's fallback
label now show the model those scenarios actually route to.
2026-08-07 15:26:42 +08:00

1.9 KiB

  • banner:
    • navigation "Session hierarchy":
      • button "Use the read tool twice" [disabled]
    • tablist:
      • tab "Chat" [selected]
      • tab "Trajectory"
  • text: "Use the read tool twice in one assistant message: read a.txt and b.txt. Then reply with the single word DONE and stop. 7/25 {{clock}}"
  • button "Copy":
    • img
  • tooltip "Copy"
  • button "Think The user wants me to read a.txt and b.txt, then reply with "DONE". Let me do both reads in parallel.":
    • img
    • img
    • text: Think The user wants me to read a.txt and b.txt, then reply with "DONE". Let me do both reads in parallel.
  • paragraph: I will read both files before answering.
  • button "Copy":
    • img
  • button "Branch into a new conversation" [disabled]:
    • img
  • text: Available only on the last message of a completed turn 7/25 {{clock}} Ran for {{duration}} TTFT {{duration}} {{throughput}} tok/s
  • button "Read a.txt":
    • img
    • img
    • text: Read
    • button "a.txt"
  • button "Read b.txt":
    • img
    • img
    • text: Read
    • button "b.txt"
  • button "Think Both files have been read. a.txt contains "alpha" and b.txt contains "beta". I'll now reply with DONE as instructed.":
    • img
    • img
    • text: Think Both files have been read. a.txt contains "alpha" and b.txt contains "beta". I'll now reply with DONE as instructed.
  • text: Stopped Now give the final answer. 7/25 {{clock}}
  • button "Copy":
    • img
  • paragraph: DONE
  • button "Copy":
    • img
  • button "Branch into a new conversation":
    • img
  • text: 7/25 {{clock}} Ran for {{duration}}
  • textbox "Message the agent"
  • button "Commands":
    • img
  • 'button "Access mode, current: Workspace Write"': Workspace Write
  • button "Select model, current DeepSeek-V4-Flash":
    • text: DeepSeek-V4-Flash
    • img
  • button "Send message" [disabled]
  • text: 2 turns · 3 steps LLM {{duration}} · Tool call {{duration}} TTFT avg {{duration}} · {{throughput}} tok/s Cache hit 98% Input 7.8K tok · Output 103 tok