From 32f098a6fce74e6bee68332e24ef98a9e58fbdc2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Almeida?=
<57680069+zeval@users.noreply.github.com>
Date: Sat, 2 May 2026 23:01:21 +0100
Subject: [PATCH] feat: show question icon only for pending input (#782)
* fix: show question icon only for pending input
* fix: address pending input review feedback
* fix: reduce pending input sidebar complexity
* fix: address clarification review comments
* test: cover pending clarification hook
---
apps/web/components/kanban-card.tsx | 10 ++-
.../components/kanban/graph2-step-node.tsx | 6 +-
.../kanban/swimlane-graph-content.tsx | 7 +-
.../mobile/session-task-switcher-sheet.tsx | 7 ++
apps/web/components/task/task-item.test.tsx | 48 ++++++++++++++
apps/web/components/task/task-item.tsx | 21 +++++-
.../components/task/task-session-sidebar.tsx | 19 +++++-
apps/web/components/task/task-switcher.tsx | 2 +
apps/web/hooks/use-processed-messages.ts | 12 +---
.../use-task-pending-clarification.test.tsx | 64 +++++++++++++++++++
.../hooks/use-task-pending-clarification.ts | 8 +++
apps/web/lib/ui/state-icons.test.tsx | 23 +++++++
apps/web/lib/ui/state-icons.tsx | 31 ++++++++-
.../lib/utils/pending-clarification.test.ts | 64 +++++++++++++++++++
apps/web/lib/utils/pending-clarification.ts | 27 ++++++++
15 files changed, 327 insertions(+), 22 deletions(-)
create mode 100644 apps/web/components/task/task-item.test.tsx
create mode 100644 apps/web/hooks/use-task-pending-clarification.test.tsx
create mode 100644 apps/web/hooks/use-task-pending-clarification.ts
create mode 100644 apps/web/lib/ui/state-icons.test.tsx
create mode 100644 apps/web/lib/utils/pending-clarification.test.ts
create mode 100644 apps/web/lib/utils/pending-clarification.ts
diff --git a/apps/web/components/kanban-card.tsx b/apps/web/components/kanban-card.tsx
index 804d893c67..2f6dd0801c 100644
--- a/apps/web/components/kanban-card.tsx
+++ b/apps/web/components/kanban-card.tsx
@@ -28,12 +28,13 @@ import {
} from "@kandev/ui/dropdown-menu";
import type { TaskState, Repository } from "@/lib/types/http";
import { cn, getRepositoryDisplayName } from "@/lib/utils";
-import { getTaskStateIcon } from "@/lib/ui/state-icons";
+import { getTaskStateIcon, shouldUseQuestionTaskIcon } from "@/lib/ui/state-icons";
import { needsAction } from "@/lib/utils/needs-action";
import { useAppStore } from "@/components/state-provider";
import { PRTaskIcon } from "@/components/github/pr-task-icon";
import { RemoteCloudTooltip } from "@/components/task/remote-cloud-tooltip";
import { TaskArchiveConfirmDialog } from "@/components/task/task-archive-confirm-dialog";
+import { useTaskPendingClarification } from "@/hooks/use-task-pending-clarification";
export interface Task {
id: string;
@@ -249,13 +250,16 @@ function KanbanCardActions({
>) {
const [menuOpen, setMenuOpen] = useState(false);
const effectiveMenuOpen = menuOpen || Boolean(isDeleting) || Boolean(isArchiving);
- const statusIcon = getTaskStateIcon(task.state, "h-4 w-4");
+ const hasPendingClarificationRequest = useTaskPendingClarification(task.primarySessionId);
+ const showQuestionIcon = shouldUseQuestionTaskIcon(task.state, hasPendingClarificationRequest);
+ const statusIcon = getTaskStateIcon(task.state, "h-4 w-4", hasPendingClarificationRequest);
const hasKnownSession =
Boolean(task.primarySessionId) || Boolean(task.sessionCount && task.sessionCount > 0);
return (
- {(task.state === "IN_PROGRESS" || task.state === "SCHEDULING") && statusIcon}
+ {(task.state === "IN_PROGRESS" || task.state === "SCHEDULING" || showQuestionIcon) &&
+ statusIcon}
{showMaximizeButton && onOpenFullPage && hasKnownSession && (
;
if (phase === "future") return
;
@@ -138,7 +140,9 @@ export function Graph2StepNode({
)}
>
-
{getTaskStateIcon(task.state, "h-3 w-3")}
+
+ {getTaskStateIcon(task.state, "h-3 w-3", hasPendingClarificationRequest)}
+
{step.title}
diff --git a/apps/web/components/kanban/swimlane-graph-content.tsx b/apps/web/components/kanban/swimlane-graph-content.tsx
index 6e7bde7bcf..adc217976b 100644
--- a/apps/web/components/kanban/swimlane-graph-content.tsx
+++ b/apps/web/components/kanban/swimlane-graph-content.tsx
@@ -23,6 +23,7 @@ import type { Task } from "@/components/kanban-card";
import type { WorkflowStep } from "@/components/kanban-column";
import type { MoveTaskError } from "@/hooks/use-drag-and-drop";
import type { KanbanState } from "@/lib/state/slices/kanban/types";
+import { useTaskPendingClarification } from "@/hooks/use-task-pending-clarification";
export type SwimlaneGraphContentProps = {
workflowId: string;
@@ -72,7 +73,8 @@ function DraggableTaskChip({
id: task.id,
});
const isPreviewed = useAppStore((state) => state.kanbanPreviewedTaskId === task.id);
- const statusIcon = getTaskStateIcon(task.state, "h-3 w-3");
+ const hasPendingClarificationRequest = useTaskPendingClarification(task.primarySessionId);
+ const statusIcon = getTaskStateIcon(task.state, "h-3 w-3", hasPendingClarificationRequest);
return (