diff --git a/frontend/src/components/workspace/messages/subtask-card.tsx b/frontend/src/components/workspace/messages/subtask-card.tsx
index 87057c2..3ffc60d 100644
--- a/frontend/src/components/workspace/messages/subtask-card.tsx
+++ b/frontend/src/components/workspace/messages/subtask-card.tsx
@@ -17,13 +17,17 @@ 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 { hasToolCalls } from "@/core/messages/utils";
import {
streamdownPlugins,
streamdownPluginsWithWordAnimation,
} from "@/core/streamdown";
import { useSubtask } from "@/core/tasks/context";
+import { explainLastToolCall } from "@/core/tools/utils";
import { cn } from "@/lib/utils";
+import { FlipDisplay } from "../flip-display";
+
export function SubtaskCard({
className,
taskId,
@@ -84,7 +88,16 @@ export function SubtaskCard({
)}
>
{icon}
- {t.subtasks[task.status]}
+
+ {task.status === "in_progress" &&
+ task.latestMessage &&
+ hasToolCalls(task.latestMessage)
+ ? explainLastToolCall(task.latestMessage, t)
+ : t.subtasks[task.status]}
+
)}
)}
+ {task.status === "in_progress" &&
+ task.latestMessage &&
+ hasToolCalls(task.latestMessage) && (
+ }
+ >
+ {explainLastToolCall(task.latestMessage, t)}
+
+ )}
{task.status === "completed" && (
<>
`Use "${toolName}" tool`,
+ searchFor: (query: string) => `Search for "${query}"`,
searchForRelatedInfo: "Search for related information",
searchForRelatedImages: "Search for related images",
searchForRelatedImagesFor: (query: string) =>
diff --git a/frontend/src/core/i18n/locales/types.ts b/frontend/src/core/i18n/locales/types.ts
index c5d261f..c9e3706 100644
--- a/frontend/src/core/i18n/locales/types.ts
+++ b/frontend/src/core/i18n/locales/types.ts
@@ -144,6 +144,7 @@ export interface Translations {
useTool: (toolName: string) => string;
searchForRelatedInfo: string;
searchForRelatedImages: string;
+ searchFor: (query: string) => string;
searchForRelatedImagesFor: (query: string) => string;
searchOnWebFor: (query: string) => string;
viewWebPage: string;
diff --git a/frontend/src/core/i18n/locales/zh-CN.ts b/frontend/src/core/i18n/locales/zh-CN.ts
index 6de95e1..6d6db64 100644
--- a/frontend/src/core/i18n/locales/zh-CN.ts
+++ b/frontend/src/core/i18n/locales/zh-CN.ts
@@ -191,6 +191,7 @@ export const zhCN: Translations = {
presentFiles: "展示文件",
needYourHelp: "需要你的协助",
useTool: (toolName: string) => `使用 “${toolName}” 工具`,
+ searchFor: (query: string) => `搜索 “${query}”`,
searchForRelatedInfo: "搜索相关信息",
searchForRelatedImages: "搜索相关图片",
searchForRelatedImagesFor: (query: string) => `搜索相关图片 “${query}”`,
diff --git a/frontend/src/core/tasks/context.tsx b/frontend/src/core/tasks/context.tsx
index 887013e..ea85772 100644
--- a/frontend/src/core/tasks/context.tsx
+++ b/frontend/src/core/tasks/context.tsx
@@ -3,17 +3,21 @@ import { createContext, useCallback, useContext, useState } from "react";
import type { Subtask } from "./types";
export interface SubtaskContextValue {
- tasks: Map;
+ tasks: Record;
+ setTasks: (tasks: Record) => void;
}
export const SubtaskContext = createContext({
- tasks: new Map(),
+ tasks: {},
+ setTasks: () => {
+ /* noop */
+ },
});
export function SubtasksProvider({ children }: { children: React.ReactNode }) {
- const [tasks] = useState