"use client"; import { useCallback, useEffect, useRef, useState, memo } from "react"; import { PanelRoot, PanelBody } from "./panel-primitives"; import { useSettingsData } from "@/hooks/domains/settings/use-settings-data"; import { type ChatInputContainerHandle } from "@/components/task/chat/chat-input-container"; import { QueuedMessageIndicator, type QueuedMessageIndicatorHandle, } from "@/components/task/chat/queued-message-indicator"; import { MessageList } from "@/components/task/chat/message-list"; import { useIsTaskArchived } from "./task-archived-context"; import { useChatPanelState } from "./chat/use-chat-panel-state"; import { ChatInputArea, useSubmitHandler, useChatPanelHandlers } from "./chat/chat-input-area"; import { ClarificationInputOverlay } from "./chat/clarification-input-overlay"; type QueuedOverlayProps = { isQueued: boolean; queuedMessage: { content: string } | null | undefined; isArchived: boolean; indicatorRef: React.RefObject; onCancel: () => void; onUpdate: (content: string) => Promise; onEditComplete: () => void; }; function QueuedMessageOverlay({ isQueued, queuedMessage, isArchived, indicatorRef, onCancel, onUpdate, onEditComplete, }: QueuedOverlayProps) { if (!isQueued || !queuedMessage || isArchived) return null; return (
); } function useClarificationKey(agentMessageCount: number) { const lastCountRef = useRef(agentMessageCount); const [clarificationKey, setClarificationKey] = useState(0); useEffect(() => { lastCountRef.current = agentMessageCount; }, [agentMessageCount]); const handleClarificationResolved = useCallback(() => setClarificationKey((k) => k + 1), []); return { clarificationKey, handleClarificationResolved }; } type TaskChatPanelProps = { onSend?: (message: string) => void; sessionId?: string | null; onOpenFile?: (path: string) => void; showRequestChangesTooltip?: boolean; onRequestChangesTooltipDismiss?: () => void; /** Callback to open a file at a specific line (for comment clicks) */ onOpenFileAtLine?: (filePath: string) => void; /** Hide the sessions dropdown (session tabs in dockview replace it) */ hideSessionsDropdown?: boolean; }; export const TaskChatPanel = memo(function TaskChatPanel({ onSend, sessionId = null, onOpenFile, showRequestChangesTooltip = false, onRequestChangesTooltipDismiss, onOpenFileAtLine, hideSessionsDropdown, }: TaskChatPanelProps) { const isArchived = useIsTaskArchived(); const chatInputRef = useRef(null); const queuedMessageRef = useRef(null); useSettingsData(true); const panelState = useChatPanelState({ sessionId, onOpenFile, onOpenFileAtLine }); const { isSending, handleSubmit } = useSubmitHandler(panelState, onSend); const { resolvedSessionId, session, task, taskId, isWorking, messagesLoading, groupedItems, allMessages, footerActionMessages, permissionsByToolCallId, childrenByParentToolCallId, agentMessageCount, cancelQueue, pendingClarification, isQueued, queuedMessage, updateQueueContent, } = panelState; const { handleCancelTurn, handleCancelQueue, handleQueueEditComplete } = useChatPanelHandlers( resolvedSessionId, cancelQueue, chatInputRef, ); const { clarificationKey, handleClarificationResolved } = useClarificationKey(agentMessageCount); return ( {pendingClarification && !isArchived && (
)} {isArchived ? (
This task is archived and read-only.
) : ( )}
); });