|
|
@@ -2,20 +2,43 @@ import { useState, useCallback, useRef } from "react"
|
|
|
import { useQuery, keepPreviousData } from "@tanstack/react-query"
|
|
|
|
|
|
import { type TokenUsage, RooCodeEventName, taskEventSchema } from "@roo-code/types"
|
|
|
-import type { Run } from "@roo-code/evals"
|
|
|
+import type { Run, Task, TaskMetrics } from "@roo-code/evals"
|
|
|
|
|
|
-import { getTasks } from "@/lib/server/tasks"
|
|
|
-import { useEventSource } from "@/hooks/use-event-source"
|
|
|
+import { getHeartbeat } from "@/actions/heartbeat"
|
|
|
+import { getRunners } from "@/actions/runners"
|
|
|
+import { getTasks } from "@/actions/tasks"
|
|
|
+import { type EventSourceStatus, useEventSource } from "@/hooks/use-event-source"
|
|
|
|
|
|
-export const useRunStatus = (run: Run) => {
|
|
|
+export type RunStatus = {
|
|
|
+ sseStatus: EventSourceStatus
|
|
|
+ heartbeat: string | null | undefined
|
|
|
+ runners: string[] | undefined
|
|
|
+ tasks: (Task & { taskMetrics: TaskMetrics | null })[] | undefined
|
|
|
+ tokenUsage: Map<number, TokenUsage & { duration?: number }>
|
|
|
+ usageUpdatedAt: number | undefined
|
|
|
+}
|
|
|
+
|
|
|
+export const useRunStatus = (run: Run): RunStatus => {
|
|
|
const [tasksUpdatedAt, setTasksUpdatedAt] = useState<number>()
|
|
|
const [usageUpdatedAt, setUsageUpdatedAt] = useState<number>()
|
|
|
|
|
|
const tokenUsage = useRef<Map<number, TokenUsage & { duration?: number }>>(new Map())
|
|
|
const startTimes = useRef<Map<number, number>>(new Map())
|
|
|
|
|
|
+ const { data: heartbeat } = useQuery({
|
|
|
+ queryKey: ["getHeartbeat", run.id],
|
|
|
+ queryFn: () => getHeartbeat(run.id),
|
|
|
+ refetchInterval: 10_000,
|
|
|
+ })
|
|
|
+
|
|
|
+ const { data: runners } = useQuery({
|
|
|
+ queryKey: ["getRunners", run.id],
|
|
|
+ queryFn: () => getRunners(run.id),
|
|
|
+ refetchInterval: 10_000,
|
|
|
+ })
|
|
|
+
|
|
|
const { data: tasks } = useQuery({
|
|
|
- queryKey: ["run", run.id, tasksUpdatedAt],
|
|
|
+ queryKey: ["getTasks", run.id, tasksUpdatedAt],
|
|
|
queryFn: async () => getTasks(run.id),
|
|
|
placeholderData: keepPreviousData,
|
|
|
refetchInterval: 30_000,
|
|
|
@@ -65,10 +88,12 @@ export const useRunStatus = (run: Run) => {
|
|
|
}
|
|
|
}, [])
|
|
|
|
|
|
- const status = useEventSource({ url, onMessage })
|
|
|
+ const sseStatus = useEventSource({ url, onMessage })
|
|
|
|
|
|
return {
|
|
|
- status,
|
|
|
+ sseStatus,
|
|
|
+ heartbeat,
|
|
|
+ runners,
|
|
|
tasks,
|
|
|
tokenUsage: tokenUsage.current,
|
|
|
usageUpdatedAt,
|