Agent Todos

Bir ajanın planını çalışırken gösterin. Her adım backlog'dan yapılacak, devam eden ve tamamlanana ilerler; canlı süreler, başarısızlıklar ve arkasındaki araç çağrıları ile birlikte. Yazma alanının üstü için bir durum hapı, görebildiğiniz plan değişiklikleri ve çalışmadan önce planı düzenlemek için bir gözden geçirme adımı.

Claude Code, Codex ve Gemini CLI gibi kodlama ajanları, çalışırken TodoWrite, update_plan ve write_todos gibi araçlarla yazılı bir plan tutar. Agent Todos bu planı adım başına bir satıra dönüştürür; devam eden adım açıkça yazılır (“Testler çalıştırılıyor”) ve her adımın ne kadar sürdüğü gösterilir.

Her adım backlog'dan yapılacak, devam eden ve ardından tamamlandı, başarısız ya da iptal edildi durumuna geçer. Ajan planını yeniden yazdığında yeni adımlar vurgulanır, kaldırılanlar daralarak kaybolur ve kısa bir not neyin değiştiğini söyler. Başarısız bir adım nedenini görünür tutar; tamamlanmış uzun adım dizileri katlanır ve güncel iş ekranda kalır.

AgentTodosStatus, geçerli adımı ve bir sayacı yazma alanının üstünde tek satırda gösterir; AgentTodosReview ise herhangi bir şey çalışmadan önce kullanıcıların adımları düzenlemesine, yeniden sıralamasına, eklemesine ve kaldırmasına, ardından ⌘↵ ile başlatmasına olanak tanır. Adaptörler, hâlâ akmakta olan girdi dahil her ajanın araç biçimini okur ve Tool Calls herhangi bir adımın içindeki işi gösterebilir.

  1. Pro registry'yi components.json dosyasına ekleyin

    components.json
    {
      "registries": {
        "@hextaui-pro": {
          "url": "https://hextaui.com/r/pro/{name}.json",
          "headers": {
            "Authorization": "Bearer ${HEXTAUI_PRO_TOKEN}"
          }
        }
      }
    }
  2. Token'ınızı ekleyin

    Hesap sayfanızda bir token oluşturun ve .env.local dosyasına HEXTAUI_PRO_TOKEN olarak ekleyin.

  3. Bloğu ekleyin

    pnpm dlx shadcn@latest add @hextaui-pro/agent-todos

AI SDK ile

getTodosFromParts, girdisi hâlâ akarken bile bir mesajdaki en son TodoWrite, update_plan veya write_todos çağrısını okur. Listeyi mesajda, durum hapını ise yazma alanının üstünde gösterin.

"use client"

import { useChat } from "@ai-sdk/react"

import { AgentTodos, AgentTodosStatus } from "@/components/blocks/agent-todos/agent-todos"
import { getTodosFromParts } from "@/components/blocks/agent-todos/todos"

export function Chat() {
  const { messages, status } = useChat()
  const busy = status === "submitted" || status === "streaming"
  const last = messages.at(-1)
  const current = last?.role === "assistant" ? getTodosFromParts(last.parts) : null

  return (
    <div className="flex flex-col gap-4">
      {messages.map((message) => {
        const plan = message.role === "assistant" ? getTodosFromParts(message.parts) : null
        return plan ? (
          <AgentTodos
            key={message.id}
            todos={plan.todos}
            explanation={plan.explanation}
            running={busy && message.id === last?.id}
          />
        ) : null
      })}
      {current ? <AgentTodosStatus todos={current.todos} running={busy} /> : null}
    </div>
  )
}

Çalıştırmadan önce gözden geçir

Ajan başlamadan önce kullanıcıların adımları düzenlemesine, yeniden sıralamasına, eklemesine ve kaldırmasına izin verin. Run plan ya da ⌘↵ temizlenmiş listeyi geri verir.

"use client"

import * as React from "react"

import { AgentTodosReview } from "@/components/blocks/agent-todos/todo-review"
import type { Todo } from "@/components/blocks/agent-todos/todos"

export function PlanApproval({
  proposed,
  onRun,
}: {
  proposed: Todo[]
  onRun: (plan: Todo[]) => void
}) {
  const [draft, setDraft] = React.useState(proposed)

  return <AgentTodosReview todos={draft} onChange={setDraft} onApprove={onRun} />
}

Artımlı görev araçlarıyla

Claude Code'un TaskCreate ve TaskUpdate'i gibi görevleri tek tek oluşturup güncelleyen araçlar için her çağrıyı applyTaskEvent ile listeye işleyin.

"use client"

import * as React from "react"

import { AgentTodos } from "@/components/blocks/agent-todos/agent-todos"
import { applyTaskEvent, type TaskEvent, type Todo } from "@/components/blocks/agent-todos/todos"

export function useTaskList() {
  const [todos, setTodos] = React.useState<Todo[]>([])
  const apply = React.useCallback(
    (event: TaskEvent) => setTodos((current) => applyTaskEvent(current, event)),
    []
  )
  return { todos, apply }
}

export function Tasks({ todos, running }: { todos: Todo[]; running: boolean }) {
  return <AgentTodos todos={todos} running={running} />
}

Yapı

Dıştan içe doğru birleştirdiğiniz parçalar.

ParçaAçıklama
AgentTodosBaşlığı, ilerleme çubuğu, açıklaması ve plan değişikliği notuyla tam liste.
AgentTodosStatusGeçerli adımı gösteren, listeyi bir popover'da açan tek satırlık bir hap.
AgentTodosReviewAjan başlamadan önce gösterilen düzenlenebilir plan.
TodoMarkÖzel düzenler için tek başına durum işareti.
getTodosFromParts, fromTodoWrite, fromUpdatePlan, fromWriteTodos, applyTaskEventHer ajanın araç biçiminden Todo öğelerine adaptörler.
PropTürVarsayılan
todosSıralı adımlar.
Todo[]–
explanationPlanın neden böyle göründüğü, ilerleme çubuğunun altında gösterilir. Codex bunu update_plan ile gönderir.
string–
runningAjanın çalışıp çalışmadığı. Herhangi bir adım devam ederken varsayılan olarak true.
boolean–
titleBaşlık etiketi ve bölge adı.
string"Tasks"
collapsibleBaşlığın listeyi katlamasına izin verin.
booleantrue
defaultOpenAçık başlar.
booleantrue
foldAfterListe bundan uzun olduğunda tamamlanmış adımları en üstte katlar.
number6
PropTürVarsayılan
idKararlı id. Plan değişiklikleri id'ye göre algılanır.
string–
contentNe yapılacağı, emir kipinde: “Testleri çalıştır”.
string–
activeFormNe yaptığı, devam ederken gösterilir: “Testler çalıştırılıyor”.
string–
statusAşama. pending, Yapılacak olarak okunur.
"backlog" | "pending" | "in_progress" | "completed" | "failed" | "cancelled"–
errorBaşarısız bir adımın altında gösterilir.
string–
durationGeçmiş için saklanan saniyeler.
number–
detailsAdımın altında açılır, genellikle Tool Calls.
ReactNode–
PropTürVarsayılan
todosAynı liste. Boşken hiçbir şey render etmez.
Todo[]–
runningtrue iken işareti ve shimmer'ı canlandırır.
boolean–
explanationPopover içindeki listeye iletilir.
string–
PropTürVarsayılan
todosÖnerilen plan.
Todo[]–
onChangeHer düzenlemede çağrılır.
(todos: Todo[]) => void–
onApproveRun plan ya da ⌘↵ ile çağrılır; boş adımlar kaldırılır ve metin kırpılır.
(todos: Todo[]) => void–
onCancelCancel'ı gösterir ve Escape'i işler.
() => void–
titleBaşlık.
string"Review the plan"
approveLabelDüğme etiketi.
string"Run plan"

getTodosFromParts(parts)

Bir AI SDK mesajındaki en yeni TodoWrite, update_plan veya write_todos çağrısından { todos, explanation? } döndürür, yoksa null.

PropTürVarsayılan
partsStatik ve dinamik araç parçalarında, hâlâ akmakta olan girdi dahil çalışır.
UIMessage["parts"]–

applyTaskEvent(todos, event)

Bir TaskCreate ya da TaskUpdate çağrısını listeye işler. deleted durumu görevi kaldırır.

PropTürVarsayılan
eventÇağrı, normalleştirilmiş.
{ type: "create", id, subject, activeForm? } | { type: "update", id, status?, subject?, activeForm? }–
TuşAction
EnterSpaceListeyi başlığından ya da bir adımın ayrıntılarından açar veya katlar.
⌘↵Gözden geçirilirken planı çalıştırır; başka bir alana yazmıyorsanız.
EnterGözden geçirmede, geçerli adımın altına bir adım ekler.
⌫Gözden geçirmede, boş bir adımı kaldırır ve üstündekine geçer.
⌥↑Gözden geçirmede, adımı yukarı taşır. ⌥↓ aşağı taşır.
↑↓Gözden geçirmede, adımlar arasında gezinir.
EsconCancel ayarlıysa gözden geçirmeyi iptal eder.
  • Liste, sıralı bir liste içeren etiketli bir bölgedir ve her adımın adı aşamasını da içerir, örneğin “Testler çalıştırılıyor, Devam ediyor”.
  • Gizli bir progressbar kaç adımın tamamlandığını bildirir.
  • Bir adımın başlaması, bitmesi ve başarısız olması, plan değişiklikleriyle birlikte polite bir live region ile duyurulur. Zamanlayıcı tikleri duyurulmaz.
  • Durum hapının etiketi geçerli adımı ve sayıyı okur ve listeyi odak yönetimli bir popover'da açar.
  • Gözden geçirme alanları adım numarasına göre etiketlenir, taşımalar duyurulur (“5 adımın 2. sırasına taşındı”) ve bir giriş yöntemi yazım yaparken Enter bekler.
  • Azaltılmış harekette, devam eden halka dönmeyi bırakır, onay işaretleri çizilmeden belirir ve adımlar anında yerine kayar.

Şunlarla geliştirildi

Agent Todos bloğunun yapıldığı ücretsiz HextaUI bileşenleri. Her biri tek başına yüklenir.

Kod

4 dosya, components/blocks/agent-todos konumuna eklendi.