diff --git a/frontend/src/components/workspace/messages/message-list.tsx b/frontend/src/components/workspace/messages/message-list.tsx index e798a7c..ace175a 100644 --- a/frontend/src/components/workspace/messages/message-list.tsx +++ b/frontend/src/components/workspace/messages/message-list.tsx @@ -124,6 +124,12 @@ export function MessageList({ status: "failed", error: result.split("Task failed.")[1]?.trim(), }); + } else if (result.startsWith("Task timed out")) { + updateSubtask({ + id: taskId, + status: "failed", + error: result, + }); } else { updateSubtask({ id: taskId, diff --git a/frontend/src/components/workspace/messages/subtask-card.tsx b/frontend/src/components/workspace/messages/subtask-card.tsx index c5cd398..87057c2 100644 --- a/frontend/src/components/workspace/messages/subtask-card.tsx +++ b/frontend/src/components/workspace/messages/subtask-card.tsx @@ -17,7 +17,10 @@ import { Shimmer } from "@/components/ai-elements/shimmer"; import { Button } from "@/components/ui/button"; import { ShineBorder } from "@/components/ui/shine-border"; import { useI18n } from "@/core/i18n/hooks"; -import { streamdownPlugins } from "@/core/streamdown"; +import { + streamdownPlugins, + streamdownPluginsWithWordAnimation, +} from "@/core/streamdown"; import { useSubtask } from "@/core/tasks/context"; import { cn } from "@/lib/utils"; @@ -98,7 +101,9 @@ export function SubtaskCard({ {task.prompt && ( {task.prompt} + + {task.prompt} + } > )} diff --git a/frontend/src/core/streamdown/plugins.ts b/frontend/src/core/streamdown/plugins.ts index b0d9824..d829a53 100644 --- a/frontend/src/core/streamdown/plugins.ts +++ b/frontend/src/core/streamdown/plugins.ts @@ -3,6 +3,8 @@ import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; import type { StreamdownProps } from "streamdown"; +import { rehypeSplitWordsIntoSpans } from "../rehype"; + export const streamdownPlugins = { remarkPlugins: [ remarkGfm, @@ -13,6 +15,17 @@ export const streamdownPlugins = { ] as StreamdownProps["rehypePlugins"], }; +export const streamdownPluginsWithWordAnimation = { + remarkPlugins: [ + remarkGfm, + [remarkMath, { singleDollarTextMath: true }], + ] as StreamdownProps["remarkPlugins"], + rehypePlugins: [ + [rehypeKatex, { output: "html" }], + rehypeSplitWordsIntoSpans, + ] as StreamdownProps["rehypePlugins"], +}; + // Plugins for human messages - no autolink to prevent URL bleeding into adjacent text export const humanMessagePlugins = { remarkPlugins: [