From 5b08669dddc199a7ca4fdfacaae0a0a7bd5ad3fa Mon Sep 17 00:00:00 2001 From: Artur Do Lago Date: Sat, 10 Jan 2026 08:45:50 +0100 Subject: [PATCH] fix(tui): load todos directly from storage for startup check sync.data.todo is only populated when sessions are opened, so the startup check was always finding zero todos. Now uses Todo.get() to read directly from storage for each session. Co-Authored-By: Claude Opus 4.5 --- packages/agent-core/src/cli/cmd/tui/app.tsx | 37 +++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/packages/agent-core/src/cli/cmd/tui/app.tsx b/packages/agent-core/src/cli/cmd/tui/app.tsx index c31e423b0f..7d691264b1 100644 --- a/packages/agent-core/src/cli/cmd/tui/app.tsx +++ b/packages/agent-core/src/cli/cmd/tui/app.tsx @@ -29,6 +29,7 @@ import { DialogAlert } from "./ui/dialog-alert" import { ToastProvider, useToast } from "./ui/toast" import { ExitProvider, useExit } from "./context/exit" import { Session as SessionApi } from "@/session" +import { Todo } from "@/session/todo" import { TuiEvent } from "./event" import { KVProvider, useKV } from "./context/kv" import { Provider } from "@/provider/provider" @@ -290,26 +291,28 @@ function App() { if (checkedIncompleteTodos || sync.status !== "complete") return checkedIncompleteTodos = true - // Count sessions with incomplete todos - let sessionsWithTodos = 0 - let totalIncompleteTodos = 0 + // Load todos directly from storage for all sessions + ;(async () => { + let sessionsWithTodos = 0 + let totalIncompleteTodos = 0 - for (const session of sync.data.session) { - const todos = sync.data.todo[session.id] ?? [] - const incomplete = todos.filter((t) => t.status !== "completed" && t.status !== "cancelled") - if (incomplete.length > 0) { - sessionsWithTodos++ - totalIncompleteTodos += incomplete.length + for (const session of sync.data.session) { + const todos = await Todo.get(session.id) + const incomplete = todos.filter((t) => t.status !== "completed" && t.status !== "cancelled") + if (incomplete.length > 0) { + sessionsWithTodos++ + totalIncompleteTodos += incomplete.length + } } - } - if (sessionsWithTodos > 0) { - toast.show({ - variant: "info", - message: `◐ ${totalIncompleteTodos} pending todo${totalIncompleteTodos > 1 ? "s" : ""} in ${sessionsWithTodos} session${sessionsWithTodos > 1 ? "s" : ""}`, - duration: 5000, - }) - } + if (sessionsWithTodos > 0) { + toast.show({ + variant: "info", + message: `◐ ${totalIncompleteTodos} pending todo${totalIncompleteTodos > 1 ? "s" : ""} in ${sessionsWithTodos} session${sessionsWithTodos > 1 ? "s" : ""}`, + duration: 5000, + }) + } + })() }) command.register(() => [