summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-09 06:01:46 -0600
committeradamelmore <[email protected]>2026-01-09 06:02:45 -0600
commitec828619cae413439f15ea03a1604c99dbc1b55c (patch)
tree0ddbe1e50642fdd3fcd5d7f3f8d14662db135bf0
parent559013e1242fa3681f8362a2f0450c3095eb3513 (diff)
downloadopencode-ec828619cae413439f15ea03a1604c99dbc1b55c.tar.gz
opencode-ec828619cae413439f15ea03a1604c99dbc1b55c.zip
fix(app): more defensive todo access
-rw-r--r--packages/ui/src/components/message-part.tsx24
1 files changed, 19 insertions, 5 deletions
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 534ea8f50..d59f5cfa3 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -984,6 +984,22 @@ ToolRegistry.register({
ToolRegistry.register({
name: "todowrite",
render(props) {
+ const todos = createMemo(() => {
+ const meta = props.metadata?.todos
+ if (Array.isArray(meta)) return meta
+
+ const input = props.input.todos
+ if (Array.isArray(input)) return input
+
+ return []
+ })
+
+ const subtitle = createMemo(() => {
+ const list = todos()
+ if (list.length === 0) return ""
+ return `${list.filter((t: Todo) => t.status === "completed").length}/${list.length}`
+ })
+
return (
<BasicTool
{...props}
@@ -991,14 +1007,12 @@ ToolRegistry.register({
icon="checklist"
trigger={{
title: "To-dos",
- subtitle: props.input.todos
- ? `${props.input.todos.filter((t: Todo) => t.status === "completed").length}/${props.input.todos.length}`
- : "",
+ subtitle: subtitle(),
}}
>
- <Show when={props.input.todos?.length}>
+ <Show when={todos().length}>
<div data-component="todos">
- <For each={props.input.todos}>
+ <For each={todos()}>
{(todo: Todo) => (
<Checkbox readOnly checked={todo.status === "completed"}>
<div data-slot="message-part-todo-content" data-completed={todo.status === "completed"}>