AI 應用元件
代理任務佇列
代理的待執行任務佇列 React 元件:可拖曳排序,執行中項目呼吸脈動,完成的任務滑出到可摺疊的「已完成」群組。
放在對話側欄或訊息下方,顯示代理接下來要做的事。和固定順序的計畫清單不同,這是一個會持續被消化的佇列:使用者可以拖曳重排、移除排隊中的任務,失敗的任務留在排隊區頂部等待重試。任務分成「執行中」、「排隊中」、「已完成」三段——執行中的列以呼吸脈動提示代理正在工作;任務完成時 Loader 交叉淡接成打勾,停一下後整列滑出、落進「已完成」群組頂端,其餘列以 FLIP 補位。tasks 由父層控制,元件只負責呈現狀態變化。
把這個效果裝進你的專案
在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。
npx webberui@latest add agent-task-queuePlayground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
450
1.6
編輯中的呼叫預設屬性
<AgentTaskQueue/>
完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。
安裝
npx webberui@latest add https://webberui.com/r/agent-task-queue.json或在 components.json 設定 registries 後,改用 @webberui/agent-task-queue 安裝。
使用
import { AgentTaskQueue, type AgentTask } from "@/components/ui/agent-task-queue";
const [tasks, setTasks] = React.useState<AgentTask[]>([
{ id: "read", title: "讀取本週行事曆", status: "running" },
{ id: "sum", title: "撰寫摘要", meta: "預估 2 分鐘", status: "queued" },
{ id: "send", title: "寄送草稿給自己", status: "queued" },
]);
<AgentTaskQueue
tasks={tasks}
onReorder={(ids) =>
setTasks((prev) => [
...prev.filter((t) => t.status !== "queued"),
...ids.map((id) => prev.find((t) => t.id === id)!),
])
}
onRemove={(id) => setTasks((prev) => prev.filter((t) => t.id !== id))}
onRetry={(id) =>
setTasks((prev) => prev.map((t) => (t.id === id ? { ...t, status: "queued" } : t)))
}
/>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
tasks | AgentTask[] | — | 任務清單(受控資料);狀態變化由父層更新,元件據此播放滑入/滑出動畫 |
onReorder | (ids: string[]) => void | — | 排隊中任務重新排序後回呼,參數為排隊中(queued)任務的新 id 順序;未提供時不顯示拖曳把手 |
onRemove | (id: string) => void | — | 移除排隊中任務時回呼;提供時該列 hover/聚焦會出現 X 按鈕 |
onRetry | (id: string) => void | — | 重試失敗任務時回呼;提供時失敗列會顯示「重試」按鈕 |
doneOpen | boolean | — | 受控的「已完成」群組展開狀態;未提供時由元件內部管理 |
defaultDoneOpen | boolean | false | 非受控模式下「已完成」群組的初始展開狀態 |
onDoneOpenChange | (open: boolean) => void | — | 「已完成」群組展開/收合時回呼 |
doneLabel | string | "已完成" | 「已完成」群組的標題文字 |
maxDoneVisible | number | 20 | 「已完成」群組最多顯示幾項,超過的以「另有 N 項」帶過 |
stiffness | number | 450 | layout 彈簧的剛性(排序補位、滑入滑出共用) |
damping | number | 36 | layout 彈簧的阻尼 |
pulseDuration | number | 1.6 | 執行中項目呼吸一次的秒數 |
colorDuration | number | 150 | 色彩過渡時間(毫秒),寫入 --wb-agent-task-queue-duration |
className | string | — | 透傳到最外層容器的 className |
AgentTask
| 欄位 | 型別 | 預設值 | 說明 |
|---|---|---|---|
id | string | — | 唯一識別,用於 React key、拖曳排序與 layout 動畫配對 |
title | string | — | 任務標題 |
detail | string | — | 次要說明文字 |
status | "queued" | "running" | "done" | "failed" | "cancelled" | — | 目前狀態 |
icon | ReactNode | — | 標題左側的裝飾圖示 |
meta | string | — | 右側的補充資訊,例如「預估 2 分鐘」 |
細節
- 三段結構:
running進「執行中」並固定在最上方、不可拖曳;queued與failed進「排隊中」,failed置頂並以紅字標示;done與cancelled進「已完成」,cancelled劃刪除線。 - 完成滑出:狀態變成
done時,Loader 先以 150ms 交叉淡接成打勾,停 300ms 後該列以 layout 動畫滑進「已完成」群組頂端;群組收合中時則淡出,標頭計數逐位滾動 +1 並閃一下綠底。 - 拖曳只有左側把手能拿起,期間順序暫存在元件內部,放開才呼叫
onReorder;拖曳中如果代理把某項拿去執行,暫存順序會自動排除它。父層不更新tasks時,順序會回到原樣(受控資料)。 - 不依賴任何拖曳套件,排序與補位都用
motion/react的Reorder與 layout 彈簧(stiffness/damping)。 - 色彩過渡讀 CSS 變數
--wb-agent-task-queue-duration,預設 150ms,可用colorDuration調整。
可及性
- 每一段都是
role="list",每列為 listitem,並附隱藏的狀態文字(排隊中/執行中/已完成/失敗/已取消) - 狀態變化以
aria-live="polite"宣告,例如「已完成:撰寫摘要」 - 鍵盤排序:聚焦拖曳把手後按空白鍵進入移動模式(
aria-pressed="true"),上下鍵交換位置,空白鍵放下並呼叫onReorder,Escape 還原;移動模式中焦點離開會視為放下 - 「已完成」標頭是
button,帶aria-expanded與aria-controls;移除與重試按鈕都有含任務名稱的aria-label,觸控裝置上移除鈕常駐顯示 - 使用者系統開啟「減少動態效果」時:不呼吸、不旋轉、不滑行,狀態變化直接換位置並以 120ms 淡入淡出;拖曳仍可使用但不放大