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.
52 lines
1.8 KiB
Markdown
52 lines
1.8 KiB
Markdown
- 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
|
|
- 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.
|
|
- 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.
|
|
- paragraph: DONE
|
|
- button "Copy":
|
|
- img
|
|
- button "Branch into a new conversation":
|
|
- img
|
|
- text: 7/25 {{clock}} Ran for {{duration}} TTFT {{duration}} {{throughput}} tok/s
|
|
- button "Context compacted View compaction summary":
|
|
- img
|
|
- text: Context compacted View compaction summary
|
|
- button "Context injection AGENTS.md":
|
|
- img
|
|
- img
|
|
- text: Context injection AGENTS.md
|
|
- img
|
|
- text: permission preset read-only
|
|
- textbox "Message the agent"
|
|
- button "Commands":
|
|
- img
|
|
- 'button "Access mode, current: Read Only"': Read Only
|
|
- button "Select model, current DeepSeek-V4-Flash":
|
|
- text: DeepSeek-V4-Flash
|
|
- img
|
|
- button "Send message" [disabled]
|
|
- text: 1 turns · 2 steps LLM {{duration}} · Tool call {{duration}} TTFT avg {{duration}} · {{throughput}} tok/s Cache hit 98% Input 15.8K tok · Output 135 tok
|