Просмотр исходного кода

tui: keep assistant footer from crashing after compaction

Dax Raad 3 месяцев назад
Родитель
Сommit
e03a41144a
1 измененных файлов с 12 добавлено и 11 удалено
  1. 12 11
      packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

+ 12 - 11
packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

@@ -860,11 +860,6 @@ export function Session() {
                     </Match>
                     <Match when={message.role === "assistant"}>
                       <AssistantMessage
-                        user={
-                          messages().findLast(
-                            (item) => item.id === (message as AssistantMessage).parentID,
-                          ) as UserMessage
-                        }
                         last={lastAssistant()?.id === message.id}
                         message={message as AssistantMessage}
                         parts={sync.data.part[message.id] ?? []}
@@ -998,10 +993,19 @@ function UserMessage(props: {
   )
 }
 
-function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; last: boolean; user: UserMessage }) {
+function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; last: boolean }) {
   const local = useLocal()
   const { theme } = useTheme()
-  const ctx = use()
+  const sync = useSync()
+  const messages = createMemo(() => sync.data.message[props.message.sessionID] ?? [])
+
+  const duration = createMemo(() => {
+    if (!props.message.time.completed) return 0
+    const user = messages().find((x) => x.role === "user" && x.id === props.message.parentID)
+    if (!user) return 0
+    return props.message.time.completed - user.time.created
+  })
+
   return (
     <>
       <For each={props.parts}>
@@ -1047,10 +1051,7 @@ function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; las
               <span style={{ fg: theme.text }}>{Locale.titlecase(props.message.mode)}</span>{" "}
               <span style={{ fg: theme.textMuted }}>⬝{props.message.modelID}</span>
               <Show when={props.message.time.completed}>
-                <span style={{ fg: theme.textMuted }}>
-                  {" "}
-                  ⬝{Locale.duration(props.message.time.completed! - props.user.time.created)}
-                </span>
+                <span style={{ fg: theme.textMuted }}> ⬝{Locale.duration(duration())}</span>
               </Show>
             </text>
           </box>