feat(web): add live dream progress panel with adaptive polling
Watching dreams was a 5-15min black box. Now a dedicated /workspaces/:id/queue route polls /v3/workspaces/:id/queue/status every 2.5s while work is in-flight (10s when idle) and surfaces a warning when in-progress work hasn't advanced the completed count for >30 minutes. The Honcho API only exposes aggregate counts (no observer/observed pair, specialist phase, or token telemetry per work-unit), so the panel links out to an upstream issue for those. - queries: adaptive refetchInterval via TanStack Query callback form - hooks/useStaleQueueDetection: client-side stall detection - routes/workspaces_.\$workspaceId_.queue: dedicated live view - routes/_dev.dream-progress: DEV-only showcase for screenshots - WorkspaceDetail: new "Queue & dreams" nav card
This commit is contained in:
@@ -85,6 +85,22 @@ export function useScheduleDream(workspaceId: string) {
|
||||
});
|
||||
}
|
||||
|
||||
import type { components } from "./schema.d.ts";
|
||||
|
||||
type QueueStatusBody = components["schemas"]["QueueStatus"];
|
||||
|
||||
// Poll faster while work is in flight so users can watch dreams/representations
|
||||
// progress; back off to a slow heartbeat when idle. The TanStack Query callback
|
||||
// form re-reads the cached value each cycle, so the interval adapts on its own.
|
||||
export const QUEUE_REFETCH_ACTIVE_MS = 2500;
|
||||
export const QUEUE_REFETCH_IDLE_MS = 10_000;
|
||||
|
||||
export function pickQueueRefetchInterval(data: QueueStatusBody | undefined): number {
|
||||
if (!data) return QUEUE_REFETCH_IDLE_MS;
|
||||
const active = (data.in_progress_work_units ?? 0) + (data.pending_work_units ?? 0);
|
||||
return active > 0 ? QUEUE_REFETCH_ACTIVE_MS : QUEUE_REFETCH_IDLE_MS;
|
||||
}
|
||||
|
||||
export function useQueueStatus(workspaceId: string) {
|
||||
return useQuery({
|
||||
queryKey: QK.queueStatus(workspaceId),
|
||||
@@ -96,7 +112,7 @@ export function useQueueStatus(workspaceId: string) {
|
||||
return data ?? err(error);
|
||||
},
|
||||
enabled: Boolean(workspaceId),
|
||||
refetchInterval: 10_000,
|
||||
refetchInterval: (query) => pickQueueRefetchInterval(query.state.data),
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user