From 890c60a9b05fcb64fcd0dc44afcbf6d64058b705 Mon Sep 17 00:00:00 2001 From: Qiyuanqiii <267806965+Qiyuanqiii@users.noreply.github.com> Date: Mon, 19 Oct 2026 14:06:30 +0800 Subject: [PATCH] fix(ui): align composer controls and simplify queued messages --- docs/images/composer/new-conversation.png | Bin 0 -> 13535 bytes docs/images/composer/queued-messages.png | Bin 0 -> 59414 bytes docs/usage.md | 18 ++++++ web/src/v2/app.tsx | 7 ++- .../v2/components/approval-mode-control.tsx | 5 +- web/src/v2/components/composer.tsx | 24 ++++---- web/src/v2/components/conversation.test.tsx | 52 +++++++----------- web/src/v2/components/conversation.tsx | 28 +--------- .../v2/components/network-scope-control.tsx | 3 +- web/src/v2/components/permission-control.tsx | 5 +- web/src/v2/components/phase-picker.tsx | 2 +- web/src/v2/components/queued-messages.css | 12 ++-- web/src/v2/components/thread-plan.tsx | 2 +- web/src/v2/styles.css | 48 ++++++++++++---- 14 files changed, 108 insertions(+), 98 deletions(-) create mode 100644 docs/images/composer/new-conversation.png create mode 100644 docs/images/composer/queued-messages.png diff --git a/docs/images/composer/new-conversation.png b/docs/images/composer/new-conversation.png new file mode 100644 index 0000000000000000000000000000000000000000..95c731e9c3bfa109dafef126afd5fc75624ada13 GIT binary patch literal 13535 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�Y!%Be#{!sK>lX`ifL`&^!R8i|= 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 z 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 JqZKWK{s$*@vK#;a literal 0 HcmV?d00001 diff --git a/docs/usage.md b/docs/usage.md index c182691c6..869d85d79 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -68,6 +68,24 @@ false until that matrix is signed. ## Threads, Runs, and advanced diagnostics / Thread、Run 与高级诊断 +### 补充消息与排队 / Follow-up messages and queue + +任务运行中,发送的补充消息会排到输入框上方,当前执行结束后依次处理。文字消息可点击 +条目右侧的「引导」加入当前任务;「撤回」取消待处理消息,更多菜单提供编辑和全文、附件预览。 +图片和文件附件保留在下一轮消息中。输入框增高时,排队卡片随它向上移动;多条消息在卡片内滚动。 +底栏按输入框的可用宽度收起次要标签,模型名称过长时省略显示,完整名称仍可在模型菜单查看。 + +![紧凑宽度下的新对话输入框](images/composer/new-conversation.png) + +![输入框上方的待处理消息与引导操作](images/composer/queued-messages.png) + +以上为 Windows / Edge 生产构建截图,任务与回复使用本地离线演示数据。 + +Follow-up messages sent during execution appear above the composer and run in order afterward. +Use **Steer** on a text-only queued message to add it to the current task, **Withdraw** to cancel it, +or the more menu to edit and preview its full content and attachments. Images and files stay queued +for the next turn. The queue moves with the composer as it grows and scrolls internally when needed. + ### 用量统计 / Usage 在「设置 → 用量统计」查看 Universal-Code 自身的模型调用。今日、近 30 天和全部 diff --git a/web/src/v2/app.tsx b/web/src/v2/app.tsx index 85173d3cc..10dd21ade 100644 --- a/web/src/v2/app.tsx +++ b/web/src/v2/app.tsx @@ -1,6 +1,6 @@ import { lazy, useEffect, useMemo, useRef, useState, type RefObject } from "react"; import { QueryClient, QueryClientProvider, useInfiniteQuery, useMutation, useQueryClient } from "@tanstack/react-query"; -import { Folder } from "lucide-react"; +import { Folder, SlidersHorizontal } from "lucide-react"; import type { APIClient } from "../api/client"; import type { ProviderDefinitionView, TaskBudgetSettings, ThreadDetailView, ThreadView, WorkspaceView } from "../api/types"; import { normalizedTaskBudget } from "../api/task-configuration"; @@ -221,8 +221,9 @@ function NewConversation({ client, workspaces, workspaceID, onWorkspaceChange, o onManageModels={onManageModels} onPendingModelRouteChange={(route) => onOptionsChange({ ...options, modelRoute: route })} pendingModelRoute={modelRoute} - newThreadControls={<> + newThreadControls={<> {open &&
{ setContent(next); setError(null); }} onSubmit={() => void submit()} placeholder={inputPlaceholder} inputRef={inputRef} value={content} scope={scope} plainText={plainText} />
+ {!threadID && }
+ }}>
diff --git a/web/src/v2/components/conversation.test.tsx b/web/src/v2/components/conversation.test.tsx index a5e7201ac..b38c831da 100644 --- a/web/src/v2/components/conversation.test.tsx +++ b/web/src/v2/components/conversation.test.tsx @@ -387,9 +387,8 @@ describe("V2Conversation", () => { expect(within(ui.container.querySelector(".v2-narrative")!).getByText("同样的排队要求")).toBeInTheDocument(); }); - it("sends an explicit current-task correction through the Session endpoint", async () => { - const submitSessionMessage = vi.fn(() => Promise.resolve({ steering: { id: "steer-current" } } as Awaited< - ReturnType>)); + it("queues ordinary sends during an active run without a delivery-mode selector", async () => { + const submitSessionMessage = vi.fn(); const submitThreadTurn = vi.fn(); const client = baseClient({ get: vi.fn(() => Promise.resolve({ ...detail("thread-a"), @@ -398,16 +397,14 @@ describe("V2Conversation", () => { } as Partial); renderConversation(client); const user = userEvent.setup(); - await screen.findByRole("combobox", { name: "发送方式" }); - await user.selectOptions(screen.getByRole("combobox", { name: "发送方式" }), "steer"); - await user.click(screen.getByRole("button", { name: "发送 thread-a" })); - await waitFor(() => expect(submitSessionMessage).toHaveBeenCalledWith("sess-thread-a", - { version: "session_message_submission.v1", content: "pending-thread-a", delivery_mode: "steer" }, - expect.any(String))); - expect(submitThreadTurn).not.toHaveBeenCalled(); + await user.click(await screen.findByRole("button", { name: "发送 thread-a" })); + expect(screen.queryByRole("combobox", { name: "发送方式" })).not.toBeInTheDocument(); + await waitFor(() => expect(submitThreadTurn).toHaveBeenCalledWith("thread-a", + expect.objectContaining({ content: "pending-thread-a" }), expect.any(String))); + expect(submitSessionMessage).not.toHaveBeenCalled(); }); - it("keeps an explicit correction draft when the task ends before sending", async () => { + it("sends the same draft normally when the task ends before sending", async () => { const execution: ThreadExecutionView = { version: "thread_execution.v1", thread_id: "thread-a", state: "running", execution_id: "execution-a", queued_messages: 0, capability_grant: false }; const submitSessionMessage = vi.fn(); @@ -418,22 +415,10 @@ describe("V2Conversation", () => { threadExecution: vi.fn(() => Promise.resolve(execution)), submitSessionMessage, submitThreadTurn, } as Partial)); const user = userEvent.setup(); - await screen.findByRole("combobox", { name: "发送方式" }); - await user.selectOptions(screen.getByRole("combobox", { name: "发送方式" }), "steer"); + await screen.findByRole("button", { name: "发送 thread-a" }); await act(async () => { view.queryClient.setQueryData(v2QueryKeys.execution("thread-a"), { ...execution, state: "idle", execution_id: undefined }); }); - expect(screen.getByRole("combobox", { name: "发送方式" })).toHaveValue("steer"); - // The invalid mode is explained before sending, and sending stays blocked. - expect(await screen.findByText(/当前任务已停止或不再运行/)).toBeInTheDocument(); - await user.click(screen.getByRole("button", { name: "发送 thread-a" })); - expect(submitSessionMessage).not.toHaveBeenCalled(); - expect(submitThreadTurn).not.toHaveBeenCalled(); - // Switching back to next-turn clears the hint; the selector hides again - // because no running task can accept a correction. - await user.click(screen.getByRole("button", { name: "切换为下一轮处理" })); - expect(screen.queryByText(/当前任务已停止或不再运行/)).not.toBeInTheDocument(); expect(screen.queryByRole("combobox", { name: "发送方式" })).not.toBeInTheDocument(); - // The retained draft now goes out as a regular next-turn message. await user.click(screen.getByRole("button", { name: "发送 thread-a" })); await waitFor(() => expect(submitThreadTurn).toHaveBeenCalledWith("thread-a", expect.objectContaining({ content: "pending-thread-a" }), expect.any(String))); @@ -840,29 +825,30 @@ describe("V2Conversation", () => { expect(onDraftChange).toHaveBeenCalledWith(""); }); - it("explains an unavailable correction as paused when the run is paused", async () => { + it("retains the paused state and sends a normal continuation after a run pauses", async () => { const execution: ThreadExecutionView = { version: "thread_execution.v1", thread_id: "thread-a", state: "running", execution_id: "execution-a", queued_messages: 0, capability_grant: false }; const pausedDetail: ThreadDetailView = { ...detail("thread-a"), active_run: { id: "run-thread-a", session_id: "sess-thread-a", status: "paused" } } as ThreadDetailView; - const view = renderConversation(baseClient({ hasThreadExecutionRead: true, + const submitThreadTurn = vi.fn(); + const submitSessionMessage = vi.fn(); + const view = renderConversation(baseClient({ hasThreadExecutionRead: true, submitThreadTurn, submitSessionMessage, get: vi.fn(() => Promise.resolve({ ...detail("thread-a"), active_run: { id: "run-thread-a", session_id: "sess-thread-a", status: "running" } })), threadExecution: vi.fn(() => Promise.resolve(execution)), } as Partial)); const user = userEvent.setup(); - await screen.findByRole("combobox", { name: "发送方式" }); - await user.selectOptions(screen.getByRole("combobox", { name: "发送方式" }), "steer"); + await screen.findByRole("button", { name: "发送 thread-a" }); await act(async () => { view.queryClient.setQueryData(v2QueryKeys.thread("thread-a"), pausedDetail); view.queryClient.setQueryData(v2QueryKeys.execution("thread-a"), { ...execution, state: "idle", execution_id: undefined }); }); - // The pause is named explicitly instead of implying the task ended. - expect(await screen.findByText(/当前任务已暂停,不能更新当前任务/)).toBeInTheDocument(); - expect(screen.queryByText(/当前任务已停止或不再运行/)).not.toBeInTheDocument(); - await user.click(screen.getByRole("button", { name: "切换为下一轮处理" })); - expect(screen.queryByText(/当前任务已暂停,不能更新当前任务/)).not.toBeInTheDocument(); + expect(screen.getByText("发送消息即可继续,也可以仅解除暂停。")).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "发送 thread-a" })); + await waitFor(() => expect(submitThreadTurn).toHaveBeenCalledWith("thread-a", + expect.objectContaining({ content: "pending-thread-a" }), expect.any(String))); + expect(submitSessionMessage).not.toHaveBeenCalled(); }); it("shows confirmed Agent activity and stopping while the submission response is still pending", async () => { diff --git a/web/src/v2/components/conversation.tsx b/web/src/v2/components/conversation.tsx index 9cb6f990c..b71465f97 100644 --- a/web/src/v2/components/conversation.tsx +++ b/web/src/v2/components/conversation.tsx @@ -383,7 +383,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana const composerContainerRef = useRef(null); const [composerFocusRequest, setComposerFocusRequest] = useState<{ threadID: string } | null>(null); const [confirmedSubmission, setConfirmedSubmission] = useState(null); - const [deliveryMode, setDeliveryMode] = useState<"next_turn" | "steer">("next_turn"); const reviewTrigger = useRef(null); const [fileDrawerState, setFileDrawerState] = useState<{ path: string; @@ -698,7 +697,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana setFileDrawerState({ path: ".", line: undefined, runID: undefined }); setComposerFocusRequest(null); olderScrollAnchorRef.current = null; - setDeliveryMode("next_turn"); }, [threadID, view]); useEffect(() => { if (!reviewEntry || reviewEntry.threadID !== threadID) return; @@ -784,10 +782,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana }; const canSteer = executionQuery.data?.state === "running" || (!executionQuery.data && detail.active_run?.status === "running"); - // A paused run is not gone: steer stays unavailable, but the explanation - // names the pause so the operator does not think the task ended. - const steerUnavailable = currentRun.status === "paused" ? t("当前任务已暂停", "The current task is paused") - : t("当前任务已停止或不再运行", "The current task has stopped or is no longer running"); const activityLabel = threadActivityLabel({ threadID, execution: executionQuery.data, readable: client.hasThreadExecutionRead === true, error: executionQuery.isError }); const fileReferenceUnavailableReason = currentRun.status === "waiting_approval" @@ -800,13 +794,7 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana : undefined; const send = async (content: string, files?: V2FileReference[], images?: WorkspaceImageAttachment[], draftVersion?: V2DraftVersion, attachments?: WorkspaceFileAttachment[], mcpReferences?: MCPDraftReference[]) => { - if (deliveryMode === "steer" && !canSteer) { - throw new Error(`${steerUnavailable}。纠正草稿已保留;请选择“下一轮处理”发送。`); - } - if (deliveryMode === "steer" && (files?.length || images?.length || attachments?.length || mcpReferences?.length)) { - throw new Error("更新当前任务目前只支持文字。附件和引用已保留,请选择“下一轮处理”发送完整消息。"); - } - const fingerprint = JSON.stringify([deliveryMode, content, files ?? [], imageIdentities(images), fileAttachmentIdentities(attachments), mcpReferenceIdentities(mcpReferences)]); + const fingerprint = JSON.stringify(["next_turn", content, files ?? [], imageIdentities(images), fileAttachmentIdentities(attachments), mcpReferenceIdentities(mcpReferences)]); let replaced = submissions.findLast(({ error }) => v2TurnOutcomeKnown(error))?.input.operationKey; // The user's new request waits for unknown earlier submissions to settle. // Confirmation uses the original payload and key, never the edited draft. @@ -826,7 +814,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana { text: draft ?? content, files: files ?? [], images: images ?? [], attachments, mcpReferences }); const operationKey = `v2-thread-turn-${globalThis.crypto.randomUUID()}`; const input: V2TurnInput = { threadID, workspaceID: detail.thread.workspace_id ?? "", content, - ...(deliveryMode === "steer" ? { deliveryMode: "steer" as const, sessionID: currentRun.session_id } : {}), ...(draft !== undefined ? { draft } : {}), operationKey, createdAt: new Date().toISOString(), ...(files?.length ? { files } : {}), ...(images?.length ? { images } : {}), @@ -975,7 +962,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana if (!onDraftChange) return; if (!draft?.includes(APPLICATION_PREVIEW_START_REQUEST)) appendDraftAndReveal(APPLICATION_PREVIEW_START_REQUEST); else appendDraftAndReveal(""); - setDeliveryMode("next_turn"); queryClient.setQueryData(applicationPreviewRequestKey(threadID), { request: APPLICATION_PREVIEW_START_REQUEST, phase: "draft", }); @@ -1111,18 +1097,6 @@ export function V2Conversation({ client, threadID, workspaces, onArchive, onMana {view === "inspector" && } - {view === "conversation" && setComposerFocusRequest({ threadID })} />} {client.hasControl && {open &&
diff --git a/web/src/v2/components/permission-control.tsx b/web/src/v2/components/permission-control.tsx index 223d0c2d1..c5d64df61 100644 --- a/web/src/v2/components/permission-control.tsx +++ b/web/src/v2/components/permission-control.tsx @@ -116,13 +116,14 @@ function ThreadPermissionControl({ client, threadID, variant = "menu", onOpenMod } {variant === "menu" ?
{networkOpen &&
onChange(planning ? "deliver" : "plan")}> -
{open && createPortal(
{ if (event.target === event.currentTarget) setOpen(false); }}> diff --git a/web/src/v2/styles.css b/web/src/v2/styles.css index 1b385c505..0526e507e 100644 --- a/web/src/v2/styles.css +++ b/web/src/v2/styles.css @@ -1220,22 +1220,30 @@ z-index: 2; } .v2-composer textarea::placeholder { color: color-mix(in srgb, var(--v2-muted) 78%, transparent); } -.v2-composer-footer { align-items: center; display: flex; flex-wrap: wrap; gap: 8px; min-height: 48px; justify-content: space-between; padding: 8px 12px 12px; position: relative; z-index: 5; } -.v2-composer-tools { align-items: center; display: flex; flex: 1 1 auto; flex-wrap: wrap; gap: 8px; min-width: 0; max-width: 100%; } -.v2-composer-actions { align-items: center; display: flex; flex: 0 1 auto; gap: 8px; margin-left: auto; min-width: 0; max-width: 100%; } -.v2-composer-actions > .v2-model-route-control { min-width: 0; } +.v2-composer-footer { align-items: center; display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 6px; min-height: 48px; padding: 8px 12px 12px; position: relative; z-index: 5; } +.v2-composer-footer:has(> .v2-workspace-picker) { grid-template-columns: minmax(0, 1fr) auto auto; } +.v2-composer-tools { align-items: center; display: flex; gap: 6px; min-width: 0; } +.v2-composer-tools > * { flex-shrink: 0; } +.v2-composer-actions { align-items: center; display: flex; gap: 6px; min-width: 0; max-width: 100%; justify-self: end; } +.v2-composer-actions > .v2-model-route-control { min-width: 0; max-width: 160px; } +.v2-composer-footer .v2-model-route-trigger > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.v2-composer-footer svg { flex-shrink: 0; } +.v2-composer-footer :is(.v2-thread-plan-controls, .v2-permission-host.is-menu) { flex-wrap: nowrap; gap: 6px; } +.v2-composer-footer .v2-composer-mode-toggle { display: inline-flex; align-items: center; gap: 6px; height: 34px; } .v2-composer-footer :is(.v2-phase-toggle, .v2-plan-trigger, .v2-composer-chip, .v2-workspace-picker select, .v2-model-route-trigger) { align-items: center; border-radius: 9px; box-sizing: border-box; display: inline-flex; font: 500 13px/20px var(--prayu-font-ui); - gap: 8px; + gap: 5px; height: 34px; min-height: 34px; padding: 0 8px; } -.v2-composer-footer .v2-thread-plan-controls { gap: 8px; } +.v2-composer-permission-label { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.v2-workspace-picker { align-items: center; display: flex; gap: 4px; min-width: 0; color: var(--v2-muted); } +.v2-workspace-picker select { min-width: 0; width: 100%; text-overflow: ellipsis; } .v2-composer-surface > .v2-file-references { padding: 12px 16px 0; } .v2-composer-add { flex: 0 0 auto; position: relative; } .v2-composer-add-trigger { color: var(--v2-muted); } @@ -2280,10 +2288,8 @@ .v2-high-risk-actions button { flex: 1; } } -@container composer (max-width: 600px) { - .v2-composer-footer { flex-wrap: wrap; gap: 8px; position: relative; } - .v2-composer-tools { flex-basis: 100%; } - .v2-composer-actions { justify-content: flex-end; max-width: 100%; width: 100%; } +@container composer (max-width: 760px) { + .v2-composer-footer :is(.v2-composer-mode-toggle, .v2-composer-task-config) > .v2-composer-optional-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } .v2-composer-tools .v2-permission-control, .v2-composer-tools .v2-network-scope-control { position: static; } .v2-composer-tools .v2-permission-popover, @@ -2292,6 +2298,28 @@ .v2-composer-actions .v2-model-route-popover { bottom: calc(100% + 8px); right: 0; max-width: calc(100cqw - 24px); } } +@container composer (max-width: 700px) { + .v2-composer-footer .v2-composer-optional-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } + .v2-composer-footer .v2-plan-trigger.has-attention { box-shadow: inset 0 -2px var(--v2-muted); } +} + +@container composer (max-width: 520px) { + .v2-composer-footer:has(> .v2-workspace-picker) { grid-template-columns: auto minmax(0, 1fr); } + .v2-composer-footer > .v2-workspace-picker { grid-column: 1 / -1; grid-row: 1; } + .v2-composer-footer > .v2-workspace-picker select { max-width: 100%; width: auto; } + .v2-composer-actions > .v2-model-route-control { max-width: 110px; } + .v2-composer-footer .v2-composer-permission-label { max-width: 64px; } + .v2-composer-footer :is(.v2-thread-plan-controls, .v2-permission-host.is-menu), + .v2-composer-tools, .v2-composer-actions { gap: 3px; } + .v2-composer-footer :is(.v2-phase-toggle, .v2-plan-trigger, .v2-composer-chip, .v2-composer-mode-toggle) { padding-inline: 6px; } +} + +@container composer (max-width: 400px) { + .v2-composer-footer .v2-composer-permission-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } + .v2-composer-actions > .v2-model-route-control { max-width: 90px; } + .v2-composer-tools :is(.v2-permission-control, .v2-network-scope-control) > button > svg:last-child { display: none; } +} + @media (prefers-reduced-motion: reduce) { .v2-shell *, .v2-shell *::before,