AI 應用元件

代理任務佇列

代理的待執行任務佇列 React 元件:可拖曳排序,執行中項目呼吸脈動,完成的任務滑出到可摺疊的「已完成」群組。

放在對話側欄或訊息下方,顯示代理接下來要做的事。和固定順序的計畫清單不同,這是一個會持續被消化的佇列:使用者可以拖曳重排、移除排隊中的任務,失敗的任務留在排隊區頂部等待重試。任務分成「執行中」、「排隊中」、「已完成」三段——執行中的列以呼吸脈動提示代理正在工作;任務完成時 Loader 交叉淡接成打勾,停一下後整列滑出、落進「已完成」群組頂端,其餘列以 FLIP 補位。tasks 由父層控制,元件只負責呈現狀態變化。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add agent-task-queue

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

即時調整 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型別預設值說明
tasksAgentTask[]—任務清單(受控資料);狀態變化由父層更新,元件據此播放滑入/滑出動畫
onReorder(ids: string[]) => void—排隊中任務重新排序後回呼,參數為排隊中(queued)任務的新 id 順序;未提供時不顯示拖曳把手
onRemove(id: string) => void—移除排隊中任務時回呼;提供時該列 hover/聚焦會出現 X 按鈕
onRetry(id: string) => void—重試失敗任務時回呼;提供時失敗列會顯示「重試」按鈕
doneOpenboolean—受控的「已完成」群組展開狀態;未提供時由元件內部管理
defaultDoneOpenbooleanfalse非受控模式下「已完成」群組的初始展開狀態
onDoneOpenChange(open: boolean) => void—「已完成」群組展開/收合時回呼
doneLabelstring"已完成"「已完成」群組的標題文字
maxDoneVisiblenumber20「已完成」群組最多顯示幾項,超過的以「另有 N 項」帶過
stiffnessnumber450layout 彈簧的剛性(排序補位、滑入滑出共用)
dampingnumber36layout 彈簧的阻尼
pulseDurationnumber1.6執行中項目呼吸一次的秒數
colorDurationnumber150色彩過渡時間(毫秒),寫入 --wb-agent-task-queue-duration
classNamestring—透傳到最外層容器的 className

AgentTask

欄位型別預設值說明
idstring—唯一識別,用於 React key、拖曳排序與 layout 動畫配對
titlestring—任務標題
detailstring—次要說明文字
status"queued" | "running" | "done" | "failed" | "cancelled"—目前狀態
iconReactNode—標題左側的裝飾圖示
metastring—右側的補充資訊,例如「預估 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 淡入淡出;拖曳仍可使用但不放大