diff --git a/src/core/task/__tests__/Task.spec.ts b/src/core/task/__tests__/Task.spec.ts index 693f72d1c7..bf4d254261 100644 --- a/src/core/task/__tests__/Task.spec.ts +++ b/src/core/task/__tests__/Task.spec.ts @@ -191,7 +191,7 @@ describe("Cline", () => { mockExtensionContext = { globalState: { - get: vi.fn().mockImplementation((key: keyof GlobalState) => { + get: vi.fn().mockImplementation((key: string) => { if (key === "taskHistory") { return [ { diff --git a/webview-ui/src/components/history/__tests__/useTaskSearch.spec.tsx b/webview-ui/src/components/history/__tests__/useTaskSearch.spec.tsx index 3e92c2be82..9b1bcb3c36 100644 --- a/webview-ui/src/components/history/__tests__/useTaskSearch.spec.tsx +++ b/webview-ui/src/components/history/__tests__/useTaskSearch.spec.tsx @@ -63,16 +63,19 @@ describe("useTaskSearch", () => { it("returns all tasks by default", () => { const { result } = renderHook(() => useTaskSearch()) - expect(result.current.tasks).toHaveLength(2) // Only tasks from current workspace + expect(result.current.tasks).toHaveLength(3) // All tasks from all workspaces expect(result.current.tasks[0].id).toBe("task-2") // Newest first expect(result.current.tasks[1].id).toBe("task-1") + expect(result.current.tasks[2].id).toBe("task-3") }) - it("filters tasks by current workspace by default", () => { + it("shows tasks from all workspaces", () => { const { result } = renderHook(() => useTaskSearch()) - expect(result.current.tasks).toHaveLength(2) - expect(result.current.tasks.every((task) => task.workspace === "/workspace/project1")).toBe(true) + expect(result.current.tasks).toHaveLength(3) + const workspaces = result.current.tasks.map((task) => task.workspace) + expect(workspaces).toContain("/workspace/project1") + expect(workspaces).toContain("/workspace/project2") }) it("sorts by newest by default", () => { @@ -90,8 +93,9 @@ describe("useTaskSearch", () => { result.current.setSortOption("oldest") }) - expect(result.current.tasks[0].id).toBe("task-1") // Feb 16 - expect(result.current.tasks[1].id).toBe("task-2") // Feb 17 + expect(result.current.tasks[0].id).toBe("task-3") // Feb 15 + expect(result.current.tasks[1].id).toBe("task-1") // Feb 16 + expect(result.current.tasks[2].id).toBe("task-2") // Feb 17 }) it("sorts by most expensive", () => { @@ -101,8 +105,9 @@ describe("useTaskSearch", () => { result.current.setSortOption("mostExpensive") }) - expect(result.current.tasks[0].id).toBe("task-2") // $0.02 - expect(result.current.tasks[1].id).toBe("task-1") // $0.01 + expect(result.current.tasks[0].id).toBe("task-3") // $0.05 + expect(result.current.tasks[1].id).toBe("task-2") // $0.02 + expect(result.current.tasks[2].id).toBe("task-1") // $0.01 }) it("sorts by most tokens", () => { @@ -113,9 +118,11 @@ describe("useTaskSearch", () => { }) // task-2: 200 + 100 + 25 + 10 = 335 tokens + // task-3: 150 + 75 = 225 tokens // task-1: 100 + 50 = 150 tokens expect(result.current.tasks[0].id).toBe("task-2") - expect(result.current.tasks[1].id).toBe("task-1") + expect(result.current.tasks[1].id).toBe("task-3") + expect(result.current.tasks[2].id).toBe("task-1") }) it("filters tasks by search query", () => { @@ -227,8 +234,8 @@ describe("useTaskSearch", () => { const { result } = renderHook(() => useTaskSearch()) - // Should only include tasks with both ts and task content from current workspace - expect(result.current.tasks).toHaveLength(2) + // Should only include tasks with both ts and task content from all workspaces + expect(result.current.tasks).toHaveLength(3) expect(result.current.tasks.every((task) => task.ts && task.task)).toBe(true) }) diff --git a/webview-ui/src/components/history/useTaskSearch.ts b/webview-ui/src/components/history/useTaskSearch.ts index 910468ddcd..4ee81fd5c7 100644 --- a/webview-ui/src/components/history/useTaskSearch.ts +++ b/webview-ui/src/components/history/useTaskSearch.ts @@ -7,7 +7,7 @@ import { useExtensionState } from "@/context/ExtensionStateContext" type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant" export const useTaskSearch = () => { - const { taskHistory, cwd } = useExtensionState() + const { taskHistory } = useExtensionState() const [searchQuery, setSearchQuery] = useState("") const [sortOption, setSortOption] = useState("newest") const [lastNonRelevantSort, setLastNonRelevantSort] = useState("newest") @@ -23,10 +23,10 @@ export const useTaskSearch = () => { }, [searchQuery, sortOption, lastNonRelevantSort]) const presentableTasks = useMemo(() => { - // Filter tasks by current workspace and ensure they have required fields - const tasks = taskHistory.filter((item) => item.ts && item.task && item.workspace === cwd) + // Ensure tasks have required fields (no workspace filtering for global history) + const tasks = taskHistory.filter((item) => item.ts && item.task) return tasks - }, [taskHistory, cwd]) + }, [taskHistory]) const fzf = useMemo(() => { return new Fzf(presentableTasks, {