@pstdio/ui 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{MermaidComponent-DSvPk-J8.js → MermaidComponent-BVdDqDRU.js} +2 -2
  2. package/dist/{MermaidComponent-DSvPk-J8.js.map → MermaidComponent-BVdDqDRU.js.map} +1 -1
  3. package/dist/chat-ui.js +15 -14
  4. package/dist/chat-ui.js.map +1 -1
  5. package/dist/components/activity/activity-comment.d.ts +10 -2
  6. package/dist/components/activity/index.d.ts +3 -1
  7. package/dist/components/activity/resource-activity-feed.d.ts +58 -0
  8. package/dist/components/chat-ui/tool-rendering/build-timeline.d.ts +1 -1
  9. package/dist/components/chat-ui/tool-rendering/shared.d.ts +1 -1
  10. package/dist/data-table.js +4 -4
  11. package/dist/{edit-mode-data-table-2E4GSOou.js → edit-mode-data-table-B8UpWb7i.js} +3 -3
  12. package/dist/{edit-mode-data-table-2E4GSOou.js.map → edit-mode-data-table-B8UpWb7i.js.map} +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +1867 -1634
  15. package/dist/index.js.map +1 -1
  16. package/dist/{kanban-renderer-toolbar-Dcbxujbk.js → kanban-renderer-toolbar-DzY6THJY.js} +2 -2
  17. package/dist/{kanban-renderer-toolbar-Dcbxujbk.js.map → kanban-renderer-toolbar-DzY6THJY.js.map} +1 -1
  18. package/dist/kanban-renderer.js +4 -4
  19. package/dist/{lazy-markdown-editor-DSlelhHV.js → lazy-markdown-editor-ClZPZuaU.js} +2 -2
  20. package/dist/{lazy-markdown-editor-DSlelhHV.js.map → lazy-markdown-editor-ClZPZuaU.js.map} +1 -1
  21. package/dist/{markdown-editor-BHoRATej.js → markdown-editor-CAVqJ9yR.js} +2 -2
  22. package/dist/{markdown-editor-BHoRATej.js.map → markdown-editor-CAVqJ9yR.js.map} +1 -1
  23. package/dist/{markdown-Cli3KGu9.js → markdown-gNucAjnF.js} +9 -9
  24. package/dist/{markdown-Cli3KGu9.js.map → markdown-gNucAjnF.js.map} +1 -1
  25. package/dist/{param-editor-CaRflJ3e.js → param-editor-CTx3mDxQ.js} +2 -2
  26. package/dist/{param-editor-CaRflJ3e.js.map → param-editor-CTx3mDxQ.js.map} +1 -1
  27. package/dist/{param-editor-field-DVQlXbid.js → param-editor-field-DteDEyeU.js} +2 -2
  28. package/dist/{param-editor-field-DVQlXbid.js.map → param-editor-field-DteDEyeU.js.map} +1 -1
  29. package/dist/prompt-input-DNpRL5tI.js +564 -0
  30. package/dist/prompt-input-DNpRL5tI.js.map +1 -0
  31. package/dist/rich-message-CuPiKxKX.js +78 -0
  32. package/dist/rich-message-CuPiKxKX.js.map +1 -0
  33. package/dist/rich-text.js +24 -23
  34. package/dist/rich-text.js.map +1 -1
  35. package/dist/theme/primitives/colors.d.ts +0 -23
  36. package/dist/theme/recipes/activity-comment.d.ts +36 -0
  37. package/dist/theme/recipes/alert.d.ts +1 -1
  38. package/dist/theme/recipes/dialog.d.ts +1 -1
  39. package/dist/theme/recipes/drawer.d.ts +1 -1
  40. package/dist/theme/recipes/menu.d.ts +1 -1
  41. package/dist/theme/recipes/popover.d.ts +1 -1
  42. package/dist/theme/recipes/progress-circle.d.ts +3 -3
  43. package/dist/theme/recipes/switch.d.ts +1 -1
  44. package/dist/theme/recipes/timeline.d.ts +1 -1
  45. package/dist/theme/recipes/tooltip.d.ts +1 -1
  46. package/dist/theme/recipes/window-title-bar.d.ts +1 -1
  47. package/dist/{theme-B5OVwYEU.js → theme-Dc7hVvMC.js} +118 -808
  48. package/dist/theme-Dc7hVvMC.js.map +1 -0
  49. package/dist/theme.js +1 -1
  50. package/package.json +2 -2
  51. package/dist/rich-message-gWYlm8Ji.js +0 -628
  52. package/dist/rich-message-gWYlm8Ji.js.map +0 -1
  53. package/dist/theme/recipes/landing-story.d.ts +0 -10
  54. package/dist/theme/recipes/landing-tool-demo.d.ts +0 -1
  55. package/dist/theme/recipes/landing.d.ts +0 -23
  56. package/dist/theme-B5OVwYEU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chat-ui.js","sources":["../src/components/chat-ui/components/ai-conversation.tsx","../src/components/chat-ui/components/ai-message.tsx","../src/components/chat-ui/components/approval-prompt.tsx","../src/components/chat-ui/components/attachment-list.tsx","../src/components/chat-ui/components/auto-scroll.tsx","../src/components/chat-ui/components/chat-input-actions.ts","../src/components/chat-ui/components/chat-input-attachments.ts","../src/components/chat-ui/components/timeline-tool-blocks.tsx","../src/components/chat-ui/components/chat-input-question-prompt.tsx","../src/components/chat-ui/components/composer-constants.ts","../src/components/chat-ui/components/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/tool-rendering/question-prompt.ts","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-message-animation.ts","../src/components/chat-ui/components/message-action-panel.tsx","../src/components/chat-ui/components/ai-response.tsx","../src/components/chat-ui/utils/tool-name.ts","../src/components/chat-ui/utils/get-icon.ts","../src/components/chat-ui/utils/diff.ts","../src/components/chat-ui/tool-rendering/shared.ts","../src/components/chat-ui/tool-rendering/apply-patch-renderer.ts","../src/components/chat-ui/tool-rendering/edit-renderer.ts","../src/components/chat-ui/tool-rendering/question-renderer.ts","../src/components/chat-ui/tool-rendering/standard-renderers.ts","../src/components/chat-ui/tool-rendering/todowrite-renderer.ts","../src/components/chat-ui/tool-rendering/default-renderers.ts","../src/components/chat-ui/tool-rendering/build-timeline.ts","../src/components/chat-ui/components/timeline-title.tsx","../src/components/chat-ui/components/timeline.tsx","../src/components/chat-ui/components/tool-invocation-timeline.tsx","../src/components/chat-ui/components/message-parts-renderer.tsx","../src/components/chat-ui/components/message-types.ts","../src/components/chat-ui/components/chat-message-list-items.tsx","../src/components/chat-ui/components/chat-panel-sticky-user-message.ts","../src/components/chat-ui/components/chat-message-list.tsx","../src/components/chat-ui/components/queued-follow-up-list.tsx","../src/components/chat-ui/components/working-indicator.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.tsx","../src/components/chat-ui/components/conversation-browse.tsx","../src/components/chat-ui/components/workspace-hub.tsx"],"sourcesContent":["import type { HTMLChakraProps, IconButtonProps } from \"@chakra-ui/react\";\nimport { AbsoluteCenter, chakra, IconButton } from \"@chakra-ui/react\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport { StickToBottom as StickToBottomEl, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\n\nexport type ConversationRootProps = HTMLChakraProps<\"div\", React.ComponentProps<typeof StickToBottomEl>>;\n\nexport const conversationRootDefaultProps = {\n \"aria-roledescription\": \"conversation\",\n initial: \"instant\",\n resize: \"instant\",\n role: \"log\",\n} as const;\n\nexport const ConversationRoot = chakra(\n StickToBottomEl,\n {\n base: {\n position: \"relative\",\n flex: 1,\n overflow: \"hidden\",\n height: \"full\",\n },\n },\n {\n forwardProps: [\"initial\", \"resize\"],\n defaultProps: conversationRootDefaultProps,\n },\n);\n\nexport type ConversationContentProps = Omit<React.ComponentProps<typeof ScrollArea>, \"contentProps\" | \"viewportRef\">;\n\nexport const ConversationContent = (props: ConversationContentProps) => {\n const { children, ...rest } = props;\n const { contentRef, scrollRef } = useStickToBottomContext();\n\n return (\n <ScrollArea\n {...rest}\n height=\"full\"\n width=\"full\"\n showHorizontalScrollbar={false}\n viewportRef={scrollRef as React.Ref<HTMLDivElement>}\n contentRef={contentRef as React.Ref<HTMLDivElement>}\n verticalScrollbarProps={{ zIndex: 2 }}\n contentProps={{\n py: \"sm\",\n \"aria-live\": \"polite\",\n role: \"list\",\n }}\n >\n {children}\n </ScrollArea>\n );\n};\n\nexport type ConversationScrollButtonProps = IconButtonProps;\n\nexport const conversationScrollButtonContainerDefaultProps = {\n axis: \"horizontal\",\n bottom: \"md\",\n zIndex: 2,\n} as const;\n\nexport const ConversationScrollButton = (props: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n return (\n !isAtBottom && (\n <AbsoluteCenter {...conversationScrollButtonContainerDefaultProps}>\n <IconButton rounded=\"full\" onClick={() => scrollToBottom()} variant=\"outline\" size=\"xs\" {...props}>\n <ArrowDownIcon size={16} />\n </IconButton>\n </AbsoluteCenter>\n )\n );\n};\n\nexport const ChatPrimitives = {\n Root: ConversationRoot,\n Viewport: ConversationContent,\n ScrollToBottom: ConversationScrollButton,\n} as const;\n","import type { HTMLChakraProps, RecipeVariantProps } from \"@chakra-ui/react\";\nimport { createSlotRecipeContext, defineSlotRecipe } from \"@chakra-ui/react\";\n\nconst recipe = defineSlotRecipe({\n className: \"ai-message\",\n slots: [\"root\", \"content\"],\n base: {\n root: {\n display: \"flex\",\n width: \"full\",\n alignItems: \"end\",\n justifyContent: \"end\",\n gap: \"sm\",\n \"&:has(+ [data-scope='ai-message'][data-part='root'])\": {\n mb: 0,\n },\n },\n content: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"sm\",\n textStyle: \"sm\",\n overflow: \"hidden\",\n borderRadius: \"0\",\n },\n },\n variants: {\n from: {\n user: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n },\n content: {\n borderTopWidth: \"1px\",\n borderRightWidth: \"1px\",\n borderBottomWidth: \"1px\",\n borderLeftWidth: \"1px\",\n borderColor: \"border.subtle\",\n bg: \"bg.subtle\",\n px: \"xs\",\n py: \"xs\",\n width: \"full\",\n borderRadius: \"0\",\n },\n },\n assistant: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n justifyContent: \"start\",\n },\n content: {\n width: \"full\",\n px: \"xs\",\n },\n },\n developer: {\n root: {\n width: \"full\",\n flexDirection: \"row-reverse\",\n },\n content: {\n width: \"full\",\n },\n },\n },\n size: {\n sm: {\n root: { gap: \"xs\" },\n content: { textStyle: \"xs\" },\n },\n md: {},\n lg: {\n root: { gap: \"md\" },\n content: { textStyle: \"md\" },\n },\n },\n shape: {\n rounded: {\n content: { rounded: \"0\" },\n },\n pill: {\n content: { rounded: \"0\" },\n },\n square: {\n content: { rounded: \"0\" },\n },\n },\n },\n defaultVariants: {\n from: \"user\",\n size: \"md\",\n shape: \"rounded\",\n },\n});\n\nconst { withProvider, withContext } = createSlotRecipeContext({ recipe });\n\ntype VariantProps = RecipeVariantProps<typeof recipe>;\n\nexport interface MessageRootProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageRoot = withProvider<HTMLDivElement, MessageRootProps>(\"div\", \"root\");\n\nexport interface MessageContentProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageContent = withContext<HTMLDivElement, MessageContentProps>(\"div\", \"content\");\n\nexport const ChatMessage = {\n Root: MessageRoot,\n Content: MessageContent,\n} as const;\n","import { Box, Button, Code, Flex, HStack, Text } from \"@chakra-ui/react\";\nimport { ShieldCheck, ShieldX } from \"lucide-react\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\n\ninterface ApprovalPromptProps {\n toolName: string;\n toolInput?: unknown;\n onApprove: () => void;\n onDeny: () => void;\n}\n\nconst formatToolInput = (input: unknown) => {\n if (input == null) return null;\n\n const text = typeof input === \"string\" ? input : JSON.stringify(input, null, 2);\n if (text.length === 0) return null;\n\n const truncated = text.length > 200 ? `${text.slice(0, 200)}...` : text;\n return truncated;\n};\n\nexport const ApprovalPrompt = (props: ApprovalPromptProps) => {\n const { toolName, toolInput, onApprove, onDeny } = props;\n const formattedInput = formatToolInput(toolInput);\n\n return (\n <Box px=\"sm\" py=\"xs\" mx=\"sm\" borderWidth=\"1px\" borderColor=\"border.warning\" borderRadius=\"lg\" bg=\"bg.warning\">\n <Flex direction=\"column\" gap=\"xs\">\n <Text textStyle=\"label/S/medium\" color=\"fg\">\n Allow <Code size=\"sm\">{toolName}</Code>?\n </Text>\n\n {formattedInput ? (\n <ScrollArea maxH=\"6rem\">\n <Code size=\"sm\" whiteSpace=\"pre-wrap\" display=\"block\" width=\"100%\">\n {formattedInput}\n </Code>\n </ScrollArea>\n ) : null}\n\n <HStack gap=\"xs\" justifyContent=\"flex-end\">\n <Button size=\"xs\" variant=\"outline\" onClick={onDeny}>\n <ShieldX size={14} />\n Deny\n </Button>\n <Button size=\"xs\" colorPalette=\"green\" onClick={onApprove}>\n <ShieldCheck size={14} />\n Allow\n </Button>\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { Fragment } from \"react\";\nimport type { ResourceBadgeProps } from \"@/components/primitives/resource-badge\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\n\nexport type AttachmentListRenderBadge = (props: AttachmentListItemRenderProps) => ReactNode;\n\nexport interface AttachmentListItemRenderProps {\n attachmentId: string;\n onSelect?: () => void;\n onRemove?: () => void;\n size: ResourceBadgeProps[\"size\"];\n tone: ResourceBadgeProps[\"tone\"];\n}\n\nexport interface AttachmentListProps {\n attachments?: string[];\n onSelect?: (attachmentId: string) => void;\n onRemove?: (attachmentId: string) => void;\n renderBadge?: AttachmentListRenderBadge;\n size?: ResourceBadgeProps[\"size\"];\n tone?: ResourceBadgeProps[\"tone\"];\n}\n\nconst DEFAULT_SIZE: NonNullable<ResourceBadgeProps[\"size\"]> = \"md\";\nconst DEFAULT_TONE: NonNullable<ResourceBadgeProps[\"tone\"]> = \"neutral\";\n\n/**\n * Simple attachment list component that displays resource badges.\n *\n */\nexport const AttachmentList = (props: AttachmentListProps) => {\n const { attachments = [], onSelect, onRemove, renderBadge, size = DEFAULT_SIZE, tone = DEFAULT_TONE } = props;\n\n if (attachments.length === 0) return null;\n\n return (\n <Stack marginBottom=\"sm\" gap=\"1\" flexDir=\"row\" flexWrap=\"wrap\">\n {attachments.map((attachment) => {\n const select = onSelect ? () => onSelect(attachment) : undefined;\n const remove = onRemove ? () => onRemove(attachment) : undefined;\n\n if (renderBadge) {\n const rendered = renderBadge({ attachmentId: attachment, onSelect: select, onRemove: remove, size, tone });\n return <Fragment key={attachment}>{rendered}</Fragment>;\n }\n\n return (\n <ResourceBadge\n key={attachment}\n fileName={attachment}\n onSelect={select}\n onRemove={remove}\n size={size}\n tone={tone}\n />\n );\n })}\n </Stack>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport interface AutoScrollProps {\n userMessageCount: number;\n conversationKey?: string | null;\n}\n\ninterface ShouldAutoScrollArgs {\n previousUserMessageCount: number;\n userMessageCount: number;\n}\n\nexport interface AutoScrollState {\n conversationKey: string | null;\n userMessageCount: number;\n}\n\ninterface NextAutoScrollStateArgs {\n state: AutoScrollState;\n conversationKey?: string | null;\n userMessageCount: number;\n}\n\ninterface ScrollForNextAutoScrollStateArgs extends NextAutoScrollStateArgs {\n scrollToBottom: (animation?: \"instant\") => void;\n}\n\nexport const shouldAutoScroll = (args: ShouldAutoScrollArgs) => {\n const { previousUserMessageCount, userMessageCount } = args;\n\n if (previousUserMessageCount === 0) {\n return false;\n }\n\n return userMessageCount > previousUserMessageCount;\n};\n\nexport const getNextAutoScrollState = (args: NextAutoScrollStateArgs) => {\n const conversationKey = args.conversationKey ?? null;\n\n if (args.state.conversationKey !== conversationKey) {\n return {\n shouldScroll: false,\n state: {\n conversationKey,\n userMessageCount: args.userMessageCount,\n },\n };\n }\n\n return {\n shouldScroll: shouldAutoScroll({\n previousUserMessageCount: args.state.userMessageCount,\n userMessageCount: args.userMessageCount,\n }),\n state: {\n conversationKey,\n userMessageCount: Math.max(args.state.userMessageCount, args.userMessageCount),\n },\n };\n};\n\nexport const scrollForNextAutoScrollState = (args: ScrollForNextAutoScrollStateArgs) => {\n const next = getNextAutoScrollState(args);\n\n if (next.shouldScroll) {\n args.scrollToBottom(\"instant\");\n }\n\n return next;\n};\n\nexport function AutoScroll(props: AutoScrollProps) {\n const { conversationKey, userMessageCount } = props;\n const { scrollToBottom } = useStickToBottomContext();\n const stateRef = useRef<AutoScrollState>({\n conversationKey: conversationKey ?? null,\n userMessageCount,\n });\n\n useEffect(() => {\n const next = scrollForNextAutoScrollState({\n state: stateRef.current,\n conversationKey,\n userMessageCount,\n scrollToBottom,\n });\n\n stateRef.current = next.state;\n }, [conversationKey, userMessageCount, scrollToBottom]);\n\n return null;\n}\n","interface ChatInputActionState {\n canInterrupt: boolean;\n /** False while the runtime cannot accept a message, for example without a model. */\n canSubmit: boolean;\n hasQuestionPrompt: boolean;\n isDisabled: boolean;\n streaming: boolean;\n text: string;\n}\n\nexport type ChatInputAction = \"interrupt\" | \"none\" | \"submit\";\n\nconst hasMessageText = (text: string) => text.trim().length > 0;\n\nexport const resolveChatInputKeyboardAction = (state: ChatInputActionState): ChatInputAction => {\n const { canSubmit, isDisabled, text } = state;\n if (isDisabled || !canSubmit || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, canSubmit, hasQuestionPrompt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (canSubmit && hasMessageText(text)) return \"submit\";\n if (streaming && !hasQuestionPrompt) return canInterrupt ? \"interrupt\" : \"none\";\n return \"none\";\n};\n","import type { ClipboardEvent, DragEvent } from \"react\";\n\nexport const DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD = 200;\n\nexport const shouldAttachPastedText = (text: string, lineThreshold = DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD) =>\n text.length > 0 && text.split(/\\r\\n|\\r|\\n/).length > lineThreshold;\n\nexport const createAttachmentEventHandlers = (input: {\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n textAttachmentPasteLineThreshold: number;\n}) => {\n const { onAttachFiles, onAttachText, textAttachmentPasteLineThreshold } = input;\n\n const onPasteCapture = (event: ClipboardEvent<HTMLDivElement>) => {\n const files = Array.from(event.clipboardData.files ?? []);\n if (files.length > 0 && onAttachFiles) {\n event.preventDefault();\n onAttachFiles(files);\n return;\n }\n\n const pastedText = event.clipboardData.getData(\"text/plain\");\n if (onAttachText && shouldAttachPastedText(pastedText, textAttachmentPasteLineThreshold)) {\n event.preventDefault();\n onAttachText(pastedText);\n }\n };\n\n const onDropCapture = (event: DragEvent<HTMLDivElement>) => {\n const files = Array.from(event.dataTransfer.files ?? []);\n if (files.length === 0 || !onAttachFiles) return;\n\n event.preventDefault();\n onAttachFiles(files);\n };\n\n const onDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (!onAttachFiles || !Array.from(event.dataTransfer.types).includes(\"Files\")) return;\n event.preventDefault();\n };\n\n return { onDragOver, onDropCapture, onPasteCapture };\n};\n","import { Box, Stack, Text, Textarea } from \"@chakra-ui/react\";\nimport type { FormEvent } from \"react\";\nimport { Checkbox } from \"@/components/primitives/checkbox\";\nimport { Radio, RadioGroup } from \"@/components/primitives/radio\";\nimport type { QuestionFormBlockQuestion, TodoListBlockItem } from \"./timeline\";\n\nconst preventSubmit = (event: FormEvent) => {\n event.preventDefault();\n};\n\ninterface QuestionFormBlockViewProps {\n questions: QuestionFormBlockQuestion[];\n editable?: boolean;\n selectedOptionsByQuestion?: Record<string, string[]>;\n customAnswersByQuestion?: Record<string, string>;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange?: (question: QuestionFormBlockQuestion, questionIndex: number, answer: string) => void;\n}\n\nconst QuestionOptionContent = (props: { option: QuestionFormBlockQuestion[\"options\"][number] }) => {\n const { option } = props;\n\n return (\n <Stack gap=\"0\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\">\n {option.label}\n </Text>\n {option.description ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {option.description}\n </Text>\n ) : null}\n </Stack>\n );\n};\n\nconst QuestionCheckboxOptionRow = (props: {\n option: QuestionFormBlockQuestion[\"options\"][number];\n name: string;\n checked: boolean;\n editable: boolean;\n onToggle: () => void;\n}) => {\n const { option, name, checked, editable, onToggle } = props;\n\n return (\n <Checkbox\n name={name}\n checked={checked}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n onCheckedChange={editable ? onToggle : undefined}\n >\n <QuestionOptionContent option={option} />\n </Checkbox>\n );\n};\n\nconst QuestionRadioOptions = (props: {\n question: QuestionFormBlockQuestion;\n questionIndex: number;\n name: string;\n selectedOption?: string;\n editable: boolean;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n}) => {\n const { question, questionIndex, name, selectedOption, editable, onToggleOption } = props;\n\n return (\n <RadioGroup\n name={name}\n value={selectedOption ?? null}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"xs\"\n onValueChange={\n editable\n ? (details) => {\n if (details.value) onToggleOption?.(question, questionIndex, details.value);\n }\n : undefined\n }\n >\n {question.options.map((option) => (\n <Radio\n key={option.label}\n value={option.label}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n >\n <QuestionOptionContent option={option} />\n </Radio>\n ))}\n </RadioGroup>\n );\n};\n\nexport const TodoListBlockView = (props: { items: TodoListBlockItem[] }) => {\n const { items } = props;\n\n return (\n <Stack as=\"ul\" gap=\"0\" listStyleType=\"none\" margin=\"0\" padding=\"0\">\n {items.map((item, index) => (\n <Box as=\"li\" key={`${item.label}-${index}`}>\n <Checkbox checked={item.checked} readOnly aria-readonly=\"true\" inputProps={{ tabIndex: -1 }} size=\"xs\">\n <Text textStyle=\"label/XS/regular\" color=\"fg\">\n {item.label}\n </Text>\n </Checkbox>\n </Box>\n ))}\n </Stack>\n );\n};\n\nexport const QuestionFormBlockView = (props: QuestionFormBlockViewProps) => {\n const {\n questions,\n editable = false,\n selectedOptionsByQuestion = {},\n customAnswersByQuestion = {},\n onToggleOption,\n onCustomAnswerChange,\n } = props;\n\n return (\n <Stack as=\"form\" gap=\"sm\" onSubmit={preventSubmit} aria-label=\"Question form\">\n {questions.map((question, questionIndex) => {\n const name = question.id ?? `question-${questionIndex}`;\n const inputType = question.multiple ? \"checkbox\" : \"radio\";\n const selectedOptions = selectedOptionsByQuestion[name] ?? [];\n\n return (\n <Stack\n as=\"fieldset\"\n key={name}\n gap=\"xs\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"sm\"\n padding=\"sm\"\n minWidth=\"0\"\n >\n <Text as=\"legend\" textStyle=\"label/S/medium\" color=\"fg\" paddingX=\"2xs\">\n {question.question}\n </Text>\n {inputType === \"radio\" ? (\n <QuestionRadioOptions\n question={question}\n questionIndex={questionIndex}\n name={name}\n selectedOption={selectedOptions[0]}\n editable={editable}\n onToggleOption={onToggleOption}\n />\n ) : (\n question.options.map((option) => (\n <QuestionCheckboxOptionRow\n key={option.label}\n option={option}\n name={name}\n checked={selectedOptions.includes(option.label)}\n editable={editable}\n onToggle={() => onToggleOption?.(question, questionIndex, option.label)}\n />\n ))\n )}\n {question.allowCustomAnswer ? (\n <Textarea\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n value={customAnswersByQuestion[name] ?? \"\"}\n placeholder={editable ? \"Answer...\" : \"Custom answer\"}\n aria-label={question.question}\n rows={2}\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"sm\"\n padding=\"xs\"\n resize={editable ? \"vertical\" : \"none\"}\n color=\"fg\"\n onChange={(event) => onCustomAnswerChange?.(question, questionIndex, event.currentTarget.value)}\n />\n ) : null}\n </Stack>\n );\n })}\n </Stack>\n );\n};\n","import { Button, HStack, Stack } from \"@chakra-ui/react\";\nimport { Check } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { QuestionFormBlockView } from \"./timeline-tool-blocks\";\n\nexport interface ChatInputQuestionOption {\n label: string;\n description?: string;\n}\n\nexport interface ChatInputQuestion {\n id?: string;\n question: string;\n options: ChatInputQuestionOption[];\n multiple?: boolean;\n required?: boolean;\n allowCustomAnswer?: boolean;\n}\n\nexport interface ChatInputQuestionPrompt {\n questions: ChatInputQuestion[];\n}\n\nexport interface ChatInputQuestionResponse {\n answers: string[][];\n}\n\nexport type ChatInputQuestionCustomAnswers = Record<string, string>;\n\ninterface QuestionPromptControlsProps {\n questionPrompt: ChatInputQuestionPrompt;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onToggleOption: (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange: (question: ChatInputQuestion, questionIndex: number, answer: string) => void;\n}\n\ninterface QuestionPromptStepperProps extends QuestionPromptControlsProps {\n questions: ReturnType<typeof toQuestionFormQuestions>;\n}\n\nexport const getQuestionSelectionKey = (question: ChatInputQuestion, index: number) =>\n question.id ?? `question-${index}`;\n\n// Single-choice questions swap the answer; multiple-choice questions toggle one option.\nexport const toggleQuestionOptionSelection = (\n selectedOptionsByQuestion: Record<string, string[]>,\n question: ChatInputQuestion,\n questionIndex: number,\n optionLabel: string,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n const selected = selectedOptionsByQuestion[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n if (question.multiple) {\n return {\n ...selectedOptionsByQuestion,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n return { ...selectedOptionsByQuestion, [key]: alreadySelected ? [] : [optionLabel] };\n};\n\nexport const getQuestionPromptSignature = (questionPrompt: ChatInputQuestionPrompt | undefined) => {\n if (!questionPrompt) return \"\";\n\n return JSON.stringify(\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n options: question.options.map((option) => ({\n label: option.label,\n description: option.description ?? \"\",\n })),\n })),\n );\n};\n\nconst getQuestionAnswerLines = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const lines: string[] = [];\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n const answers = customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n if (answers.length === 0) continue;\n\n lines.push(`${question.question}: ${answers.join(\", \")}`);\n }\n\n return lines;\n};\n\nconst isCustomAnswersByQuestion = (\n value: ChatInputQuestionCustomAnswers | string,\n): value is ChatInputQuestionCustomAnswers => typeof value !== \"string\";\n\nconst toCustomAnswersByQuestion = (\n questionPrompt: ChatInputQuestionPrompt,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (isCustomAnswersByQuestion(answerInput)) return answerInput;\n\n const trimmed = answerInput.trim();\n if (trimmed.length === 0) return {};\n\n const answers: ChatInputQuestionCustomAnswers = {};\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.allowCustomAnswer) continue;\n answers[getQuestionSelectionKey(question, index)] = trimmed;\n }\n\n return answers;\n};\n\nexport const buildQuestionResponse = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n const lines = getQuestionAnswerLines(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion);\n const legacyText = typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n const hasCustomQuestions = questionPrompt.questions.some((question) => question.allowCustomAnswer);\n\n if (legacyText.length > 0 && !hasCustomQuestions) {\n lines.push(`Additional response: ${legacyText}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const buildQuestionAnswerValues = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n return questionPrompt.questions.map((question, index) => {\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n return customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n });\n};\n\nexport const hasMissingRequiredQuestionAnswer = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return false;\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.required) continue;\n\n const key = getQuestionSelectionKey(question, index);\n const hasSelectedOption = (selectedOptionsByQuestion[key] ?? []).length > 0;\n if (hasSelectedOption) continue;\n if (question.allowCustomAnswer && customAnswersByQuestion[key]?.trim()) continue;\n\n return true;\n }\n\n return false;\n};\n\nconst toQuestionFormQuestions = (questionPrompt: ChatInputQuestionPrompt) =>\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n options: question.options,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n }));\n\ntype QuestionFormQuestion = ReturnType<typeof toQuestionFormQuestions>[number];\n\ninterface QuestionStepTabProps {\n question: QuestionFormQuestion;\n sourceQuestion: ChatInputQuestion;\n questionIndex: number;\n isActive: boolean;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onSelectStep: (questionIndex: number) => void;\n}\n\nconst hasQuestionAnswer = (\n question: ChatInputQuestion,\n questionIndex: number,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n return (selectedOptionsByQuestion[key] ?? []).length > 0 || Boolean(customAnswersByQuestion[key]?.trim());\n};\n\nconst QuestionStepTab = (props: QuestionStepTabProps) => {\n const {\n question,\n sourceQuestion,\n questionIndex,\n isActive,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n onSelectStep,\n } = props;\n const isAnswered = hasQuestionAnswer(\n sourceQuestion,\n questionIndex,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const stepStateLabel = isAnswered ? \"answered\" : \"not answered\";\n const tabVariant = isActive ? \"outline\" : \"ghost\";\n\n return (\n <Tooltip content={question.question}>\n <Button\n id={`question-step-tab-${question.id}`}\n role=\"tab\"\n aria-label={`${question.question} (${stepStateLabel})`}\n aria-selected={isActive}\n aria-controls={`question-step-panel-${question.id}`}\n size=\"xs\"\n variant={tabVariant}\n minW=\"8\"\n onClick={() => onSelectStep(questionIndex)}\n >\n {isAnswered ? <Check aria-hidden=\"true\" /> : questionIndex + 1}\n </Button>\n </Tooltip>\n );\n};\n\nconst QuestionPromptStepper = (props: QuestionPromptStepperProps) => {\n const { questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion, onToggleOption, onCustomAnswerChange } =\n props;\n const { questions } = props;\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const renderQuestionIndex = Math.min(activeQuestionIndex, questions.length - 1);\n const activeQuestion = questions[renderQuestionIndex];\n const hasMultipleQuestions = questions.length > 1;\n\n return (\n <Stack gap=\"xs\" pb=\"sm\">\n {hasMultipleQuestions ? (\n <HStack role=\"tablist\" aria-label=\"Question steps\" gap=\"1\" minWidth=\"0\">\n {questions.map((question, questionIndex) => (\n <QuestionStepTab\n key={question.id}\n question={question}\n sourceQuestion={questionPrompt.questions[questionIndex]}\n questionIndex={questionIndex}\n isActive={questionIndex === renderQuestionIndex}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onSelectStep={setActiveQuestionIndex}\n />\n ))}\n </HStack>\n ) : null}\n <Stack\n id={`question-step-panel-${activeQuestion.id}`}\n role={hasMultipleQuestions ? \"tabpanel\" : undefined}\n aria-labelledby={hasMultipleQuestions ? `question-step-tab-${activeQuestion.id}` : undefined}\n gap=\"0\"\n >\n <QuestionFormBlockView\n questions={[activeQuestion]}\n editable\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={(_question, _questionIndex, optionLabel) => {\n onToggleOption(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, optionLabel);\n }}\n onCustomAnswerChange={(_question, _questionIndex, answer) => {\n onCustomAnswerChange(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, answer);\n }}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const QuestionPromptControls = (props: QuestionPromptControlsProps) => {\n const { questionPrompt } = props;\n const questions = toQuestionFormQuestions(questionPrompt);\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n return <QuestionPromptStepper key={questionPromptSignature} {...props} questions={questions} />;\n};\n","// Shared height for every composer control row (editor, attach, model, send).\n// Maps to the design's `composer-ctl-h` (28px = Chakra sizes token `7`), so the\n// editor row and the toolbar controls line up at one height.\nexport const COMPOSER_CONTROL_HEIGHT = \"7\";\n","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Pause } from \"lucide-react\";\n\nexport interface SendButtonProps extends IconButtonProps {\n shortcut?: string;\n title?: string;\n canInterrupt: boolean;\n}\n\nexport const SendButton = (props: SendButtonProps) => {\n const { title, shortcut, canInterrupt, ...rest } = props;\n const ariaLabel = rest[\"aria-label\"] ?? title;\n\n const icon = canInterrupt ? (\n <Pause size={16} strokeWidth={2} fill=\"currentColor\" />\n ) : (\n <ArrowUp size={16} strokeWidth={2} />\n );\n\n const button = (\n <IconButton\n data-testid=\"send-message-button\"\n size=\"xs\"\n variant=\"primary\"\n aria-label={ariaLabel}\n title={title}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n\n if (title) {\n const tooltipContent = shortcut ? (\n <>\n {title} <Kbd fontSize=\"xs\">{shortcut}</Kbd>\n </>\n ) : (\n title\n );\n\n return (\n <Tooltip.Root closeDelay={50} openDelay={100}>\n <Tooltip.Trigger asChild>{button}</Tooltip.Trigger>\n <Portal>\n <Tooltip.Positioner>\n <Tooltip.Content>{tooltipContent}</Tooltip.Content>\n </Tooltip.Positioner>\n </Portal>\n </Tooltip.Root>\n );\n }\n\n return button;\n};\n","import { Box, Flex, HStack, Spacer, Text } from \"@chakra-ui/react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport { getTextFromSerializedEditorState, PromptEditor, type ReferenceItem } from \"../../rich-text\";\nimport {\n type ChatInputAction,\n resolveChatInputButtonAction,\n resolveChatInputKeyboardAction,\n} from \"./chat-input-actions\";\nimport { createAttachmentEventHandlers, DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD } from \"./chat-input-attachments\";\nimport {\n buildQuestionAnswerValues,\n buildQuestionResponse,\n type ChatInputQuestion,\n type ChatInputQuestionCustomAnswers,\n type ChatInputQuestionPrompt,\n type ChatInputQuestionResponse,\n getQuestionPromptSignature,\n getQuestionSelectionKey,\n hasMissingRequiredQuestionAnswer,\n QuestionPromptControls,\n toggleQuestionOptionSelection,\n} from \"./chat-input-question-prompt\";\nimport { COMPOSER_CONTROL_HEIGHT } from \"./composer-constants\";\nimport { SendButton } from \"./send-button\";\n\nexport interface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n textAttachmentPasteLineThreshold?: number;\n streaming?: boolean;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n isDisabled?: boolean;\n /** Keeps the editor usable but blocks sending, for example while no model is selected. */\n submitDisabled?: boolean;\n onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n /** Recede the resting border to border.subtle when nested inside a stronger shell (the workspace hub). */\n recessed?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\n focusSignal?: number;\n submitTitle?: string;\n references?: ReferenceItem[];\n onAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n}\n\nconst ChatInputPlaceholder = (props: { placeholder?: string }) => {\n const { placeholder } = props;\n if (!placeholder) return null;\n\n return (\n <Text textStyle=\"label/M/regular\" color=\"fg.subtle\" pointerEvents=\"none\" position=\"absolute\" top=\"0\">\n {placeholder}\n </Text>\n );\n};\n\nconst selectedChatInputBorderColor = \"border.accent-light\";\n\nconst focusPromptEditor = (container: HTMLDivElement | null) => {\n const editable = container?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) editable.focus();\n};\n\nconst requestPromptEditorFocus = (container: HTMLDivElement | null, onFocus?: () => void) =>\n requestAnimationFrame(() => {\n focusPromptEditor(container);\n onFocus?.();\n });\n\nexport const ChatInput = (props: ChatInputProps) => {\n const {\n defaultState,\n onSubmit = () => {},\n onInterrupt,\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold = DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD,\n streaming = false,\n attachedResources = [],\n onClearAttachments,\n isDisabled = false,\n submitDisabled = false,\n onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n recessed = false,\n questionPrompt,\n autoFocus = false,\n focusSignal = 0,\n submitTitle,\n references = [],\n onAddReference,\n } = props;\n\n const restingBorderColor = recessed ? \"border.subtle\" : \"border\";\n const [submitting, setSubmitting] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [editorState, setEditorState] = useState(defaultState);\n const [editorKey, setEditorKey] = useState(0);\n const [text, setText] = useState(() => getTextFromSerializedEditorState(defaultState));\n const [selectedOptionsByQuestion, setSelectedOptionsByQuestion] = useState<Record<string, string[]>>({});\n const [customAnswersByQuestion, setCustomAnswersByQuestion] = useState<ChatInputQuestionCustomAnswers>({});\n const containerRef = useRef<HTMLDivElement | null>(null);\n const onChangeRef = useRef(onChange);\n const previousQuestionPromptSignatureRef = useRef(getQuestionPromptSignature(questionPrompt));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n const resetText = getTextFromSerializedEditorState(defaultState);\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n }, [defaultState]);\n\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n useEffect(() => {\n if (previousQuestionPromptSignatureRef.current === questionPromptSignature) return;\n previousQuestionPromptSignatureRef.current = questionPromptSignature;\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n }, [questionPromptSignature]);\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestPromptEditorFocus(containerRef.current, () => setIsSelected(true));\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n useEffect(() => {\n if (focusSignal === 0) return;\n const handle = requestPromptEditorFocus(containerRef.current, () => setIsSelected(true));\n return () => cancelAnimationFrame(handle);\n }, [focusSignal]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusPromptEditor(containerRef.current);\n };\n\n const resetEditor = (shouldFocus = false) => {\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n const resetText = getTextFromSerializedEditorState(defaultState);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n\n if (shouldFocus) {\n requestAnimationFrame(() => {\n focusPromptEditor(containerRef.current);\n });\n }\n };\n\n const responseText = questionPrompt\n ? buildQuestionResponse(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion)\n : text.trim();\n const hasMissingRequiredSelection = hasMissingRequiredQuestionAnswer(\n questionPrompt,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const actionState = {\n canInterrupt: streaming && !questionPrompt && Boolean(onInterrupt),\n canSubmit: !submitDisabled,\n hasQuestionPrompt: Boolean(questionPrompt),\n isDisabled: isDisabled || submitting || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n const messageTitle = streaming && !questionPrompt ? \"Queue message\" : \"Send message\";\n const submitMessage = async () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n setSubmitting(true);\n try {\n await onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n } catch {\n // Keep the composer intact so failed submissions can be retried.\n } finally {\n setSubmitting(false);\n }\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") onInterrupt?.();\n if (action === \"submit\") void submitMessage();\n };\n\n const attachmentEventHandlers = createAttachmentEventHandlers({\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold,\n });\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n setSelectedOptionsByQuestion((current) =>\n toggleQuestionOptionSelection(current, question, questionIndex, optionLabel),\n );\n };\n\n const updateQuestionCustomAnswer = (question: ChatInputQuestion, questionIndex: number, answer: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n setCustomAnswersByQuestion((current) => ({\n ...current,\n [key]: answer,\n }));\n };\n\n return (\n <Box\n ref={containerRef}\n position=\"relative\"\n width=\"100%\"\n paddingX=\"xs\"\n paddingY=\"xs\"\n mt={attachedToTop ? \"-1px\" : undefined}\n bg=\"bg\"\n borderRadius=\"xs\"\n borderTopRadius={attachedToTop ? \"0\" : undefined}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isSelected ? selectedChatInputBorderColor : restingBorderColor}\n zIndex={isSelected ? 1 : 0}\n transition=\"border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? selectedChatInputBorderColor : restingBorderColor,\n zIndex: 1,\n }}\n _focusWithin={{\n borderColor: selectedChatInputBorderColor,\n zIndex: 1,\n }}\n onPasteCapture={attachmentEventHandlers.onPasteCapture}\n onDropCapture={attachmentEventHandlers.onDropCapture}\n onDragOver={attachmentEventHandlers.onDragOver}\n onClick={handleContainerClick}\n onBlur={() => setIsSelected(false)}\n >\n <Flex direction=\"column\" color=\"fg\" gap=\"xs\">\n {attachmentList ? <Box>{attachmentList}</Box> : null}\n {questionPrompt ? (\n <QuestionPromptControls\n questionPrompt={questionPrompt}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={toggleQuestionOption}\n onCustomAnswerChange={updateQuestionCustomAnswer}\n />\n ) : (\n // The editor is its own composer row: it centres a single line at the shared\n // control height and grows with content, never shrinking below it, so the row\n // aligns with the toolbar beneath it.\n <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <Flex minH={COMPOSER_CONTROL_HEIGHT} align=\"center\">\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled && !submitting}\n placeholder={<ChatInputPlaceholder placeholder={placeholder} />}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={() => runAction(resolveChatInputKeyboardAction(actionState))}\n references={references}\n onAddReference={onAddReference}\n />\n </Flex>\n </ScrollArea>\n )}\n <HStack gap=\"1\" minH={COMPOSER_CONTROL_HEIGHT} align=\"center\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={buttonAction === \"interrupt\"}\n title={buttonAction === \"interrupt\" ? \"Stop Response\" : (submitTitle ?? messageTitle)}\n shortcut={buttonAction === \"submit\" ? \"Enter\" : undefined}\n onClick={() => runAction(buttonAction)}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import type { SessionMessage, ToolPart } from \"../components/message-types\";\nimport type { QuestionFormBlockOption, QuestionFormBlockQuestion } from \"../components/timeline\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst parseJsonObjectText = (value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst toInputRecord = (input: unknown) => {\n if (isRecord(input)) return input;\n if (typeof input === \"string\" && input.trim().length > 0) return parseJsonObjectText(input);\n return null;\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getQuestionResponseText = (value: unknown): string | null => {\n const stringValue = getStringValue(value);\n if (stringValue) return stringValue;\n\n if (Array.isArray(value)) {\n const lines = value.map(getQuestionResponseText).filter((line): line is string => line !== null);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n }\n\n if (!isRecord(value)) return null;\n\n return (\n getQuestionResponseText(value.response) ??\n getQuestionResponseText(value.answer) ??\n getQuestionResponseText(value.text) ??\n getQuestionResponseText(value.answers)\n );\n};\n\nconst parseQuestionOption = (value: unknown): QuestionFormBlockOption | null => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value, description: undefined };\n }\n\n if (!isRecord(value)) return null;\n const label = getStringValue(value.label);\n if (!label) return null;\n\n return {\n label,\n description: getStringValue(value.description) ?? undefined,\n };\n};\n\nconst parseQuestion = (value: unknown, index: number): QuestionFormBlockQuestion | null => {\n if (!isRecord(value)) return null;\n\n const question = getStringValue(value.question);\n if (!question) return null;\n\n const options = Array.isArray(value.options)\n ? value.options.map(parseQuestionOption).filter((option): option is QuestionFormBlockOption => option !== null)\n : [];\n const type = getStringValue(value.type);\n const allowCustomAnswer =\n typeof value.custom === \"boolean\"\n ? value.custom\n : typeof value.allowCustomAnswer === \"boolean\"\n ? value.allowCustomAnswer\n : options.length === 0 || type === \"freeform\" || type === \"text\";\n\n return {\n id: getStringValue(value.id) ?? `question-${index}`,\n question,\n options,\n multiple:\n typeof value.multiple === \"boolean\" ? value.multiple : type === \"multi_choice\" || type === \"multiple_choice\",\n required: typeof value.required === \"boolean\" ? value.required : true,\n allowCustomAnswer,\n };\n};\n\nexport const parseQuestionPrompt = (input: unknown) => {\n const record = toInputRecord(input);\n if (!record || !Array.isArray(record.questions)) return null;\n\n const questions = record.questions.map(parseQuestion).filter((question): question is QuestionFormBlockQuestion => {\n return question !== null;\n });\n if (questions.length === 0) return null;\n\n return { questions };\n};\n\nconst isQuestionTool = (part: ToolPart) => part.tool.toLowerCase() === \"question\";\n\nexport const resolveActiveQuestionPrompt = (messages: SessionMessage[]) => {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = messages[messageIndex];\n if (message.role !== \"assistant\") continue;\n\n for (let partIndex = message.parts.length - 1; partIndex >= 0; partIndex -= 1) {\n const part = message.parts[partIndex];\n if (part.type !== \"tool\" || !isQuestionTool(part)) continue;\n\n const response = getQuestionResponseText(part.state?.output) ?? getQuestionResponseText(part.state?.metadata);\n if (response) return undefined;\n\n return parseQuestionPrompt(part.state?.input) ?? undefined;\n }\n }\n\n return undefined;\n};\n","import { generateEditorStateFromString } from \"../../rich-text\";\n\nexport const createSerializedPromptState = (input = \"\") => {\n return JSON.stringify(generateEditorStateFromString(input));\n};\n","import { useRef } from \"react\";\n\nexport interface MessageAnimationState {\n initialized: boolean;\n seenKeys: Set<string>;\n}\n\ninterface NextMessageAnimationStateArgs {\n itemKeys: string[];\n state: MessageAnimationState;\n}\n\nexport const messageFadeInProps = {\n animationName: \"message-fade-in\",\n animationDuration: \"200ms\",\n animationTimingFunction: \"ease-out\",\n} as const;\n\nexport const getNextMessageAnimationState = (args: NextMessageAnimationStateArgs) => {\n const animatedKeys = new Set<string>();\n const seenKeys = new Set(args.state.seenKeys);\n\n for (const key of args.itemKeys) {\n if (args.state.initialized && !seenKeys.has(key)) {\n animatedKeys.add(key);\n }\n\n seenKeys.add(key);\n }\n\n return {\n animatedKeys,\n state: {\n initialized: true,\n seenKeys,\n },\n };\n};\n\nconst itemKeysEqual = (a: string[], b: string[]) => {\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) if (a[index] !== b[index]) return false;\n return true;\n};\n\nexport const useMessageAnimationKeys = (itemKeys: string[]) => {\n const stateRef = useRef<MessageAnimationState>({\n initialized: false,\n seenKeys: new Set(),\n });\n // The hook mutates state during render, so React's duplicate renders (Strict\n // Mode, concurrent reconciliation) would otherwise consume the animation\n // flag on the second pass and leave the message non-animating. Cache the\n // last inputs to make repeated calls idempotent.\n const lastResultRef = useRef<{ itemKeys: string[]; animatedKeys: Set<string> } | null>(null);\n\n if (lastResultRef.current && itemKeysEqual(lastResultRef.current.itemKeys, itemKeys)) {\n return lastResultRef.current.animatedKeys;\n }\n\n const next = getNextMessageAnimationState({\n itemKeys,\n state: stateRef.current,\n });\n\n stateRef.current = next.state;\n lastResultRef.current = { itemKeys: [...itemKeys], animatedKeys: next.animatedKeys };\n\n return next.animatedKeys;\n};\n","import { Box, HStack, IconButton, Text } from \"@chakra-ui/react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { ChatMessagePart, SessionMessage } from \"./message-types\";\n\ninterface MessageActionPanelProps {\n message: SessionMessage;\n alwaysVisible?: boolean;\n copyAlwaysVisible?: boolean;\n}\n\nconst isCopyablePart = (part: ChatMessagePart): part is Extract<ChatMessagePart, { type: \"text\" }> => {\n return part.type === \"text\";\n};\n\nexport const getMessageCopyText = (message: SessionMessage) => {\n return (message.parts ?? [])\n .filter(isCopyablePart)\n .map((part) => part.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\nexport const getMessageTimestampLabel = (message: SessionMessage, locale?: string, timeZone?: string) => {\n if (!message.createdAt) return \"\";\n\n return new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n }).format(new Date(message.createdAt));\n};\n\nexport const MessageActionPanel = (props: MessageActionPanelProps) => {\n const { message, alwaysVisible = false, copyAlwaysVisible = alwaysVisible } = props;\n const [isCopied, setIsCopied] = useState(false);\n const copyResetTimeoutRef = useRef<number | null>(null);\n const copyText = getMessageCopyText(message);\n const timestampLabel = getMessageTimestampLabel(message);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n const copyMessage = async () => {\n if (!copyText) return;\n\n try {\n await navigator.clipboard.writeText(copyText);\n setIsCopied(true);\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n copyResetTimeoutRef.current = window.setTimeout(() => setIsCopied(false), 1200);\n } catch {\n setIsCopied(false);\n }\n };\n\n if (!copyText && !timestampLabel) return null;\n\n return (\n <HStack\n data-chat-message-action-panel=\"true\"\n gap=\"2xs\"\n minH=\"6\"\n opacity={alwaysVisible ? \"1\" : \"0\"}\n pointerEvents={alwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n {timestampLabel ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {timestampLabel}\n </Text>\n ) : null}\n {copyText ? (\n <Box\n opacity={copyAlwaysVisible ? \"1\" : \"0\"}\n pointerEvents={copyAlwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n <Tooltip content={isCopied ? \"Copied\" : \"Copy message\"}>\n <IconButton\n aria-label={isCopied ? \"Copied\" : \"Copy message\"}\n variant=\"ghost\"\n size=\"2xs\"\n onClick={copyMessage}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n </IconButton>\n </Tooltip>\n </Box>\n ) : null}\n </HStack>\n );\n};\n\nconst messageActionPanelHoverStyles = {\n \"[data-chat-message-with-actions]:hover &, [data-chat-message-with-actions]:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \".ai-message__root:hover &, .ai-message__root:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"[data-scope='ai-message'][data-part='root']:hover &, [data-scope='ai-message'][data-part='root']:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n};\n","import type { BoxProps } from \"@chakra-ui/react\";\nimport { Box } from \"@chakra-ui/react\";\nimport { RichMessage } from \"@/components/rich-text\";\n\nexport interface ChatRichContentProps extends Omit<BoxProps, \"children\"> {\n children: string;\n}\n\nconst ChatRichContent = (props: ChatRichContentProps) => {\n const { children, ...rest } = props;\n\n return (\n <Box {...rest}>\n <RichMessage defaultState={children} fullWidth />\n </Box>\n );\n};\n\nexport const Response = ChatRichContent;\n","export const normalizeToolName = (value: string) => {\n return value\n .replace(/^tool-/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .toLowerCase();\n};\n\nexport const getToolNameLookupKeys = (value: string) => {\n const normalized = normalizeToolName(value);\n const compact = normalized.replace(/_/g, \"\");\n return [...new Set([value, normalized, compact])];\n};\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n AlertTriangle,\n CircleQuestionMark,\n DotIcon,\n File,\n FileDiff,\n FileDown,\n FilePen,\n FileText,\n FileUp,\n Globe,\n ListTodo,\n ListTree,\n Move,\n Search,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { normalizeToolName } from \"./tool-name\";\n\nconst toolIconMap = {\n shell: Terminal,\n ls: ListTree,\n read_file: FileText,\n write_file: FilePen,\n delete_file: Trash2,\n patch: FileDiff,\n upload_files: FileUp,\n download_file: FileDown,\n move_file: Move,\n} as const satisfies Record<string, LucideIcon>;\n\nconst iconMap = {\n dot: DotIcon,\n danger: AlertTriangle,\n search: Search,\n browser: Globe,\n file: File,\n question: CircleQuestionMark,\n todo: ListTodo,\n terminal: Terminal,\n ...toolIconMap,\n} as const satisfies Record<string, LucideIcon>;\n\nexport type IconName = keyof typeof iconMap;\nexport type ToolIconName = keyof typeof toolIconMap;\n\nconst DEFAULT_TOOL_ICON: IconName = \"dot\";\n\nconst isToolIconName = (value: string): value is ToolIconName => Object.hasOwn(toolIconMap, value);\n\nexport const getIconComponent = (name: IconName): LucideIcon => {\n return iconMap[name];\n};\n\nexport const toolTypeToIconName = (type?: string): IconName => {\n if (!type) return DEFAULT_TOOL_ICON;\n\n const normalized = normalizeToolName(type);\n if (isToolIconName(normalized)) return normalized;\n\n const compact = normalized.replace(/_/g, \"\");\n\n switch (normalized) {\n case \"read\":\n return \"file\";\n case \"bash\":\n return \"terminal\";\n case \"edit\":\n return \"write_file\";\n case \"apply_patch\":\n return \"patch\";\n case \"grep\":\n return \"search\";\n case \"glob\":\n return \"file\";\n case \"todowrite\":\n return \"todo\";\n case \"search\":\n return \"search\";\n case \"browser\":\n return \"browser\";\n case \"question\":\n return \"question\";\n case \"fs\":\n case \"file\":\n return \"file\";\n default:\n return compact === \"todowrite\" || compact === \"todo\" ? \"todo\" : DEFAULT_TOOL_ICON;\n }\n};\n\nexport { getFileTypeIcon } from \"../../../utils/get-file-type-icon\";\n","import type { TitleSegment } from \"../components/timeline\";\n\nexport type FileChange = { filePath: string; additions: number; deletions: number };\n\nexport function basenameSafe(path: string) {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(idx + 1) : path;\n}\n\nfunction normalizeHeaderPath(input?: string | null) {\n if (!input) return null;\n\n const token = input.split(\"\\t\")[0].trim();\n if (token === \"/dev/null\") return null;\n\n let normalized = token;\n if (normalized.startsWith(\"a/\") || normalized.startsWith(\"b/\")) {\n normalized = normalized.slice(2);\n }\n\n return normalized.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nconst isMinusHeader = (line: string) => line.startsWith(\"--- \");\nconst isPlusHeader = (line: string) => line.startsWith(\"+++ \");\nconst isHunkHeader = (line: string) => line.startsWith(\"@@\");\nconst isAddedLine = (line: string) => line.startsWith(\"+\") && !(isPlusHeader(line) || line === \"+++\");\nconst isDeletedLine = (line: string) => line.startsWith(\"-\") && !(isMinusHeader(line) || line === \"---\");\n\nconst ensureFileChange = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n if (!changes.has(filePath)) {\n changes.set(filePath, { additions: 0, deletions: 0 });\n }\n};\n\nconst incrementAdditions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.additions += 1;\n};\n\nconst incrementDeletions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.deletions += 1;\n};\n\ntype UnifiedDiffState = {\n currentPath: string | null;\n lastMinusHeader: string | null;\n inHunk: boolean;\n};\n\nconst processUnifiedDiffLine = (\n line: string,\n state: UnifiedDiffState,\n changes: Map<string, { additions: number; deletions: number }>,\n) => {\n if (isMinusHeader(line)) {\n return { ...state, lastMinusHeader: normalizeHeaderPath(line.slice(4)), inHunk: false };\n }\n\n if (isPlusHeader(line)) {\n const plusPath = normalizeHeaderPath(line.slice(4));\n const currentPath = plusPath ?? state.lastMinusHeader;\n if (currentPath) ensureFileChange(changes, currentPath);\n return { ...state, currentPath, inHunk: false };\n }\n\n if (!state.currentPath) return state;\n\n if (isHunkHeader(line)) {\n return { ...state, inHunk: true };\n }\n\n if (!state.inHunk) return state;\n\n if (isAddedLine(line)) {\n incrementAdditions(changes, state.currentPath);\n return state;\n }\n\n if (isDeletedLine(line)) {\n incrementDeletions(changes, state.currentPath);\n }\n\n return state;\n};\n\nexport function parseUnifiedDiff(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileChange[];\n\n const changes = new Map<string, { additions: number; deletions: number }>();\n let state: UnifiedDiffState = {\n currentPath: null,\n lastMinusHeader: null,\n inHunk: false,\n };\n\n const lines = diffText.split(/\\r?\\n/);\n for (const line of lines) {\n state = processUnifiedDiffLine(line, state, changes);\n }\n\n return Array.from(changes.entries()).map(([filePath, { additions, deletions }]) => ({\n filePath,\n additions,\n deletions,\n }));\n}\n\nexport function buildDiffTitleSegments(diffText?: string) {\n return parseUnifiedDiff(diffText).map(\n (file) =>\n ({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n }) satisfies TitleSegment,\n );\n}\n\nexport function extractDiffFilePaths(diffText?: string) {\n return parseUnifiedDiff(diffText).map((file) => file.filePath);\n}\n\nexport type FileDiffPreview = { filePath: string; original: string; modified: string };\n\nconst isDiffFileBoundary = (line: string) => isMinusHeader(line) || line.startsWith(\"diff --git \");\n\nconst isInvalidHunkBodyLine = (line: string) => {\n if (line.startsWith(\" \")) return false;\n if (line.startsWith(\"+\")) return false;\n if (line.startsWith(\"-\")) return false;\n return line.trim() !== \"\";\n};\n\nconst appendHunkLine = (line: string, original: string[], modified: string[]) => {\n if (line.startsWith(\" \")) {\n const text = line.slice(1);\n original.push(text);\n modified.push(text);\n return;\n }\n\n if (line.startsWith(\"-\")) {\n original.push(line.slice(1));\n return;\n }\n\n if (line.startsWith(\"+\")) {\n modified.push(line.slice(1));\n }\n};\n\nconst parseHunkBody = (lines: string[], startIndex: number, original: string[], modified: string[]) => {\n let index = startIndex;\n\n while (index < lines.length) {\n const line = lines[index] || \"\";\n if (isDiffFileBoundary(line) || isHunkHeader(line) || isInvalidHunkBodyLine(line)) {\n break;\n }\n\n appendHunkLine(line, original, modified);\n index += 1;\n }\n\n if (original.length > 0 || modified.length > 0) {\n original.push(\"\");\n modified.push(\"\");\n }\n\n return index;\n};\n\nconst parsePreview = (lines: string[], startIndex: number) => {\n const oldHeader = normalizeHeaderPath((lines[startIndex] || \"\").slice(4));\n const next = lines[startIndex + 1] || \"\";\n if (!isPlusHeader(next)) return { nextIndex: startIndex + 1 } as const;\n\n const newHeader = normalizeHeaderPath(next.slice(4));\n const filePath = newHeader ?? oldHeader ?? \"\";\n const original: string[] = [];\n const modified: string[] = [];\n\n let index = startIndex + 2;\n while (index < lines.length) {\n const current = lines[index] || \"\";\n if (isDiffFileBoundary(current)) break;\n\n if (!isHunkHeader(current)) {\n index += 1;\n continue;\n }\n\n index = parseHunkBody(lines, index + 1, original, modified);\n }\n\n return {\n nextIndex: index,\n preview: { filePath, original: original.join(\"\\n\"), modified: modified.join(\"\\n\") } satisfies FileDiffPreview,\n } as const;\n};\n\nexport function buildFileDiffPreviews(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileDiffPreview[];\n\n const lines = diffText.split(/\\r?\\n/);\n const previews: FileDiffPreview[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i] || \"\";\n if (!isMinusHeader(line)) {\n i += 1;\n continue;\n }\n\n const { nextIndex, preview } = parsePreview(lines, i);\n if (preview) previews.push(preview);\n i = Math.max(nextIndex, i + 1);\n }\n\n return previews;\n}\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { basenameSafe, buildDiffTitleSegments, buildFileDiffPreviews, extractDiffFilePaths } from \"../utils/diff\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\n\nconst TOOL_LABELS: Record<string, string> = {\n apply_patch: \"Apply patch\",\n bash: \"Run command\",\n edit: \"Edit file\",\n glob: \"Find files\",\n grep: \"Search files\",\n read: \"Read file\",\n skill: \"Load skill\",\n todowrite: \"Update todos\",\n};\n\nconst STATE_LABELS: Record<string, string> = {\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n running: \"running\",\n completed: \"completed\",\n failed: \"failed\",\n};\n\nexport type ApplyPatchMetadataFile = {\n filePath: string;\n additions: number;\n deletions: number;\n diff?: string;\n before?: string;\n after?: string;\n};\n\nexport const normalizeToolType = (value: string) => value.replace(/^tool-/, \"\").toLowerCase();\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nexport const getToolType = (invocation: ToolPart) => normalizeToolType(invocation.tool ?? \"tool\");\n\nexport const getToolLabel = (value: string) => {\n const normalized = normalizeToolType(value);\n return TOOL_LABELS[normalized] ?? toTitleCase(normalized.replace(/_/g, \" \"));\n};\n\nexport const getStateLabel = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n if (!state || typeof state !== \"string\") return null;\n\n const normalized = state.replace(/-/g, \"_\");\n if (STATE_LABELS[normalized]) return STATE_LABELS[normalized];\n if (normalized.includes(\"stream\")) return \"running\";\n return null;\n};\n\nexport const isErrorState = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n return state === \"error\" || state === \"output-error\" || state === \"failed\";\n};\n\nexport const buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return {\n type: \"icon\",\n icon: toolTypeToIconName(getToolType(invocation)),\n } as const;\n};\n\nexport const buildBaseTitle = (\n invocation: ToolPart,\n detail?: string,\n labelOverride?: string,\n detailStyle?: \"monospace\",\n) => {\n const label = labelOverride ?? getToolLabel(invocation.tool ?? \"tool\");\n const title: TitleSegment[] = [{ kind: \"text\", text: label, bold: true }];\n\n if (detail) {\n title.push({\n kind: \"text\",\n text: detail,\n muted: true,\n ...(detailStyle === \"monospace\" ? { truncate: true, monospace: true } : {}),\n });\n }\n\n const stateLabel = getStateLabel(invocation);\n if (stateLabel && stateLabel !== \"completed\") {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return title;\n};\n\nexport const getInputObject = (invocation: ToolPart) => {\n const input = invocation.state?.input;\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n return input as Record<string, unknown>;\n};\n\nexport const getOutputObject = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (!output || typeof output !== \"object\" || Array.isArray(output)) return null;\n return output as Record<string, unknown>;\n};\n\nexport const getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nexport const getStateObject = (invocation: ToolPart, key: string) => {\n const state = getObjectValue(invocation.state);\n if (!state) return null;\n return getObjectValue(state[key]);\n};\n\nconst normalizeFilePath = (value: string) => value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n\nconst isUnifiedDiff = (value: string) => value.includes(\"--- \") && value.includes(\"+++ \") && value.includes(\"@@\");\n\nconst getApplyPatchMetadataObjects = (invocation: ToolPart) => {\n const output = getOutputObject(invocation);\n return [getStateObject(invocation, \"metadata\"), getObjectValue(output?.metadata)].filter(Boolean) as Array<\n Record<string, unknown>\n >;\n};\n\nconst parseApplyPatchMetadataFile = (entry: unknown) => {\n const record = getObjectValue(entry);\n if (!record) return null;\n\n const rawPath = getStringValue(record.filePath) ?? getStringValue(record.relativePath) ?? getStringValue(record.path);\n if (!rawPath) return null;\n\n return {\n filePath: normalizeFilePath(rawPath),\n additions: typeof record.additions === \"number\" ? record.additions : 0,\n deletions: typeof record.deletions === \"number\" ? record.deletions : 0,\n diff: getStringValue(record.diff) ?? undefined,\n before: getStringValue(record.before) ?? undefined,\n after: getStringValue(record.after) ?? undefined,\n } satisfies ApplyPatchMetadataFile;\n};\n\nexport const getApplyPatchMetadataFiles = (invocation: ToolPart) => {\n const files: ApplyPatchMetadataFile[] = [];\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const entries = Array.isArray(metadata.files) ? metadata.files : [];\n\n for (const entry of entries) {\n const parsedFile = parseApplyPatchMetadataFile(entry);\n if (!parsedFile) continue;\n files.push(parsedFile);\n }\n }\n\n return files;\n};\n\nexport const getApplyPatchInputFilePaths = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const changes = Array.isArray(input?.changes) ? input.changes : [];\n const filePaths = changes\n .map((change) => getStringValue(getObjectValue(change)?.path))\n .filter((filePath): filePath is string => Boolean(filePath))\n .map(normalizeFilePath);\n\n return Array.from(new Set(filePaths));\n};\n\nexport const getApplyPatchDiffText = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const inputDiff = getStringValue(input?.diff);\n if (inputDiff) return inputDiff;\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const metadataDiff = getStringValue(metadata.diff);\n if (metadataDiff) return metadataDiff;\n }\n\n const fileDiffs = getApplyPatchMetadataFiles(invocation)\n .map((file) => file.diff)\n .filter((diff): diff is string => Boolean(diff));\n if (fileDiffs.length > 0) return fileDiffs.join(\"\\n\");\n\n const patchText = getStringValue(input?.patchText);\n if (patchText && isUnifiedDiff(patchText)) return patchText;\n\n return null;\n};\n\nexport const buildApplyPatchMetadataTitleSegments = (files: ApplyPatchMetadataFile[]) => {\n const seen = new Set<string>();\n const segments: TitleSegment[] = [];\n\n for (const file of files) {\n if (seen.has(file.filePath)) continue;\n seen.add(file.filePath);\n\n segments.push({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n });\n }\n\n return segments;\n};\n\nexport const getApplyPatchMetadataReferences = (files: ApplyPatchMetadataFile[]) => {\n return Array.from(new Set(files.map((file) => file.filePath)));\n};\n\nexport const getOutputText = (invocation: ToolPart) => {\n const outputObject = getOutputObject(invocation);\n\n return (\n getStringValue(invocation.state?.output) ??\n getStringValue(outputObject?.returnDisplay) ??\n getStringValue(outputObject?.preview) ??\n getStringValue(outputObject?.stdout) ??\n getStringValue(outputObject?.content)\n );\n};\n\nexport const parseSkillContentBlock = (value: string) => {\n const match = value.match(/<skill_content(?:\\s+name=\"([^\"]+)\")?>([\\s\\S]*?)<\\/skill_content>/);\n if (!match) return null;\n\n return {\n skillName: getStringValue(match[1]) ?? undefined,\n content: getStringValue(match[2]) ?? \"\",\n };\n};\n\nexport const getSkillName = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n return (\n getStringValue(input?.name) ??\n getStringValue(input?.skillName) ??\n getStringValue(input?.skill) ??\n getStringValue(input?.skill_name) ??\n undefined\n );\n};\n\nexport const buildFileLinkSegment = (filePath: string, variant?: \"default\" | \"bubble\"): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n ...(variant ? { variant } : {}),\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = {\n type: \"comment\",\n text: invocation.state.errorText,\n };\n return [errorBlock, ...blocks];\n};\n\nexport const getDiffBlocks = (diffText?: string | null) => {\n return buildFileDiffPreviews(diffText ?? undefined).map((preview) => ({\n type: \"diff\",\n language: \"diff\",\n original: preview.original,\n modified: preview.modified,\n sideBySide: false,\n })) satisfies Block[];\n};\n\nexport const getDiffTitleSegments = (diffText?: string | null) => buildDiffTitleSegments(diffText ?? undefined);\n\nexport const getDiffReferences = (diffText?: string | null) => extractDiffFilePaths(diffText ?? undefined);\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildApplyPatchMetadataTitleSegments,\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getApplyPatchDiffText,\n getApplyPatchInputFilePaths,\n getApplyPatchMetadataFiles,\n getApplyPatchMetadataReferences,\n getDiffBlocks,\n getDiffReferences,\n getDiffTitleSegments,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderApplyPatch: ToolRenderer = (invocation) => {\n const diffText = getApplyPatchDiffText(invocation);\n const metadataFiles = getApplyPatchMetadataFiles(invocation);\n const inputFilePaths = getApplyPatchInputFilePaths(invocation);\n\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else if (metadataFiles.length > 0) {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\n } else {\n title.push(...inputFilePaths.map((filePath) => buildFileLinkSegment(filePath, \"bubble\")));\n }\n\n const blocks: Block[] = [...getDiffBlocks(diffText)];\n\n if (blocks.length === 0) {\n for (const file of metadataFiles) {\n if (!file.before && !file.after) continue;\n blocks.push({\n type: \"diff\",\n language: \"diff\",\n original: file.before ?? \"\",\n modified: file.after ?? \"\",\n sideBySide: false,\n });\n }\n }\n\n if (blocks.length === 0) {\n const references = getDiffReferences(diffText);\n if (references.length === 0) {\n references.push(...getApplyPatchMetadataReferences(metadataFiles));\n }\n if (references.length === 0) {\n references.push(...inputFilePaths);\n }\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getDiffBlocks,\n getInputObject,\n getOutputObject,\n getStringValue,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nconst buildEditDiff = (original: string, modified: string) => {\n return [\n {\n type: \"diff\",\n language: \"text\",\n original,\n modified,\n sideBySide: false,\n },\n ] satisfies Block[];\n};\n\nexport const renderEdit: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(output?.filePath) ??\n undefined;\n\n const original = getStringValue(output?.oldString) ?? getStringValue(input?.old_string) ?? undefined;\n const modified = getStringValue(output?.newString) ?? getStringValue(input?.new_string) ?? undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Edit file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n const diffBlocks =\n original !== undefined && modified !== undefined\n ? buildEditDiff(original, modified)\n : getDiffBlocks(getStringValue(output?.diff));\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, diffBlocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport { getQuestionResponseText, parseQuestionPrompt } from \"./question-prompt\";\nimport type { ToolRenderer } from \"./types\";\n\ntype QuestionRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText =\n getQuestionResponseText(invocation.state?.output) ?? getQuestionResponseText(invocation.state?.metadata);\n const prompt = parseQuestionPrompt(invocation.state?.input);\n const block = prompt ? ({ type: \"question-form\", questions: prompt.questions } satisfies Block) : null;\n if (!responseText && !block) return null;\n\n const fieldLabel = block ? `${block.questions.length} field${block.questions.length === 1 ? \"\" : \"s\"}` : undefined;\n const blocks = responseText ? [] : [block!];\n\n return {\n indicator: buildIndicator(invocation),\n title: buildBaseTitle(invocation, fieldLabel, \"Question\"),\n blocks: prependErrorBlock(invocation, blocks),\n expandable: false,\n } satisfies Item;\n };\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getInputObject,\n getOutputObject,\n getOutputText,\n getSkillName,\n getStringValue,\n parseSkillContentBlock,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderRead: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(input?.file) ??\n getStringValue(output?.filePath) ??\n getStringValue(output?.file) ??\n getStringValue(output?.path) ??\n undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Read file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, []),\n } satisfies Item;\n};\n\nconst renderCommand = (invocation: Parameters<ToolRenderer>[0], label: string) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, label, \"monospace\");\n const blocks: Block[] = [];\n\n const outputText = getOutputText(invocation);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: outputText });\n }\n\n const stderr = getStringValue(output?.stderr);\n if (stderr && stderr !== outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: stderr });\n }\n\n if (typeof output?.exitCode === \"number\") {\n blocks.push({ type: \"text\", text: `Exit code: ${output.exitCode}` });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderBash: ToolRenderer = (invocation) => renderCommand(invocation, \"Run command\");\n\nexport const renderShell: ToolRenderer = (invocation) => renderCommand(invocation, \"Shell\");\n\nexport const renderGrep: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const query = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, query, \"Search files\");\n const blocks: Block[] = outputText ? [{ type: \"code\", language: \"text\", code: outputText }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGlob: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const pattern = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, pattern, \"Find files\");\n const blocks: Block[] = [];\n\n if (outputText) {\n const references = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderSkill: ToolRenderer = (invocation) => {\n const outputText = getOutputText(invocation);\n const parsedOutput = outputText ? parseSkillContentBlock(outputText) : null;\n\n const skillName = getSkillName(invocation) ?? parsedOutput?.skillName;\n const title = buildBaseTitle(invocation, skillName, \"Load skill\");\n\n const renderedContent = parsedOutput?.content ?? outputText;\n const blocks: Block[] = renderedContent ? [{ type: \"code\", language: \"markdown\", code: renderedContent }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype TodoItem = {\n label: string;\n checked: boolean;\n};\n\ntype TodowriteRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst parseTodoItem = (value: unknown): TodoItem | null => {\n const todo = getObjectValue(value);\n if (!todo) return null;\n\n const content = getStringValue(todo.content) ?? getStringValue(todo.title);\n if (!content) return null;\n const status = getStringValue(todo.status);\n\n return {\n label: content,\n checked: status === \"completed\",\n };\n};\n\nconst parseTodoItems = (value: unknown) => {\n if (!value) return { items: [], explicit: false };\n\n const listSource = (() => {\n if (Array.isArray(value)) return value;\n const objectValue = getObjectValue(value);\n if (!objectValue || !Array.isArray(objectValue.todos)) return null;\n return objectValue.todos;\n })();\n\n if (!listSource) return { items: [], explicit: false };\n\n return {\n items: listSource.map(parseTodoItem).filter((todo): todo is TodoItem => todo !== null),\n explicit: true,\n };\n};\n\nexport const createTodowriteRenderer = (deps: TodowriteRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const inputTodos = parseTodoItems(invocation.state?.input);\n const outputTodos = parseTodoItems(invocation.state?.output);\n const todoState = outputTodos.explicit ? outputTodos : inputTodos;\n if (!todoState.explicit) return null;\n\n const todos = todoState.items;\n const countLabel = `${todos.length} item${todos.length === 1 ? \"\" : \"s\"}`;\n const title = buildBaseTitle(invocation, countLabel, \"Update todos\");\n\n if (todos.length === 0) {\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, [{ type: \"comment\", text: \"No todos\" }]),\n } satisfies Item;\n }\n\n const blocks: Block[] = [\n {\n type: \"todo-list\",\n items: todos,\n },\n ];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n };\n};\n","import { renderApplyPatch } from \"./apply-patch-renderer\";\nimport { renderEdit } from \"./edit-renderer\";\nimport { createQuestionRenderer } from \"./question-renderer\";\nimport { buildBaseTitle, buildIndicator, prependErrorBlock } from \"./shared\";\nimport { renderBash, renderGlob, renderGrep, renderRead, renderShell, renderSkill } from \"./standard-renderers\";\nimport { createTodowriteRenderer } from \"./todowrite-renderer\";\nimport type { ToolRenderersMap } from \"./types\";\n\nconst renderQuestion = createQuestionRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nconst renderTodowrite = createTodowriteRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nexport const createDefaultToolRenderers = () => {\n return {\n apply_patch: renderApplyPatch,\n bash: renderBash,\n edit: renderEdit,\n glob: renderGlob,\n grep: renderGrep,\n question: renderQuestion,\n read: renderRead,\n shell: renderShell,\n skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\nimport { getToolNameLookupKeys, normalizeToolName } from \"../utils/tool-name\";\nimport { createDefaultToolRenderers } from \"./default-renderers\";\nimport type { ToolRenderersMap, ToolTimelineBuilderOptions } from \"./types\";\n\nconst STATE_LABELS: Record<string, string> = {\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n};\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nconst getToolLabel = (tool?: string) => {\n const normalized = normalizeToolName(tool ?? \"tool\").replace(/_/g, \" \");\n return toTitleCase(normalized);\n};\n\nconst isErrorState = (state?: string) => state === \"error\" || state === \"output-error\";\n\nconst buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation.state?.status)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(invocation.tool ?? \"tool\") } as const;\n};\n\nconst getStateLabel = (state?: unknown) => {\n if (!state || typeof state !== \"string\") return null;\n if (STATE_LABELS[state]) return STATE_LABELS[state];\n if (state.includes(\"stream\")) return \"running\";\n return null;\n};\n\nconst stringifyValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return null;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return null;\n }\n};\n\nconst isBlankValue = (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0 || value.every(isBlankValue);\n if (typeof value === \"object\") {\n return Object.values(value as Record<string, unknown>).every(isBlankValue);\n }\n return false;\n};\n\nconst getRecord = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst getString = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getMediaType = (record: Record<string, unknown>) =>\n getString(record.mime_type) ?? getString(record.mediaType) ?? getString(record.mimeType);\n\nconst isImageMediaType = (value: string | null) => Boolean(value?.startsWith(\"image/\"));\n\nconst imageUrlPattern = /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(\\?.*)?$/i;\n\nconst getImageBlock = (value: unknown, alt: string): Block | null => {\n const record = getRecord(value);\n if (!record) return null;\n\n const mediaType = getMediaType(record);\n const data = getString(record.data);\n if (data && isImageMediaType(mediaType)) {\n return { type: \"image\", src: `data:${mediaType};base64,${data}`, alt };\n }\n\n const url = getString(record.url) ?? getString(record.src);\n if (url && (isImageMediaType(mediaType) || imageUrlPattern.test(url))) {\n return { type: \"image\", src: url, alt };\n }\n\n return null;\n};\n\nconst getFileLikeOutput = (value: unknown) => {\n const record = getRecord(value);\n if (!record) return null;\n\n const filePath = getString(record.path) ?? getString(record.filePath) ?? getString(record.filename);\n const content = getString(record.content) ?? getString(record.body) ?? getString(record.text);\n if (!filePath || content === null) return null;\n\n return { filePath, content };\n};\n\nconst extensionLanguageBySuffix: Record<string, string> = {\n css: \"css\",\n html: \"html\",\n js: \"js\",\n json: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n py: \"python\",\n ts: \"ts\",\n tsx: \"tsx\",\n yaml: \"yaml\",\n yml: \"yaml\",\n};\n\nconst getLanguageFromPath = (filePath: string) => {\n const extension = filePath.split(\".\").pop()?.toLowerCase();\n if (!extension) return \"text\";\n return extensionLanguageBySuffix[extension] ?? extension;\n};\n\nconst createLabeledBlocks = (label: string, blocks: Block[]) => {\n if (blocks.length === 0) return [];\n return [{ type: \"text\", text: label }, ...blocks] satisfies Block[];\n};\n\nconst buildBlocksForArrayValue = (value: unknown[], alt: string) => {\n const blocks: Block[] = [];\n\n for (const entry of value) {\n const entryRecord = getRecord(entry);\n const entryType = getString(entryRecord?.type);\n if (entryType === \"image\") {\n const image = getImageBlock(entry, alt);\n if (image) blocks.push(image);\n continue;\n }\n if (entryType === \"text\") {\n const text = getString(entryRecord?.text);\n if (text) blocks.push({ type: \"text\", text });\n continue;\n }\n blocks.push(...buildBlocksForValue(entry, alt));\n }\n\n return blocks;\n};\n\nconst buildBlocksForFileLikeValue = (value: unknown) => {\n const fileLikeOutput = getFileLikeOutput(value);\n if (!fileLikeOutput) return null;\n\n return [\n {\n type: \"code\",\n language: getLanguageFromPath(fileLikeOutput.filePath),\n code: fileLikeOutput.content,\n },\n ] satisfies Block[];\n};\n\nconst buildBlocksForAttachmentValue = (value: unknown) => {\n const record = getRecord(value);\n const attachmentName = getString(record?.attachment_name) ?? getString(record?.attachmentName);\n const attachmentId = getString(record?.attachment_file_id) ?? getString(record?.attachmentFileId);\n if (!attachmentName && !attachmentId) return null;\n\n return [{ type: \"text\", text: attachmentName ?? `Attachment ${attachmentId}` }] satisfies Block[];\n};\n\nconst buildBlocksForValue = (value: unknown, alt: string): Block[] => {\n if (isBlankValue(value)) return [];\n\n const imageBlock = getImageBlock(value, alt);\n if (imageBlock) return [imageBlock];\n\n if (Array.isArray(value)) return buildBlocksForArrayValue(value, alt);\n\n const fileBlocks = buildBlocksForFileLikeValue(value);\n if (fileBlocks) return fileBlocks;\n\n const attachmentBlocks = buildBlocksForAttachmentValue(value);\n if (attachmentBlocks) return attachmentBlocks;\n\n const text = stringifyValue(value);\n if (!text?.trim()) return [];\n\n return [{ type: \"code\", language: typeof value === \"string\" ? \"text\" : \"json\", code: text }] satisfies Block[];\n};\n\nconst buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n const toolLabel = getToolLabel(invocation.tool);\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n blocks.push(...createLabeledBlocks(\"Input\", buildBlocksForValue(invocation.state?.input, `${toolLabel} input`)));\n blocks.push(...createLabeledBlocks(\"Output\", buildBlocksForValue(invocation.state?.output, `${toolLabel} output`)));\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\n const fileLikeOutput = getFileLikeOutput(invocation.state?.output);\n if (fileLikeOutput) {\n title.push({ kind: \"link\", text: fileLikeOutput.filePath, filePath: fileLikeOutput.filePath });\n }\n const stateLabel = getStateLabel(invocation.state?.status);\n if (stateLabel) {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: buildGenericBlocks(invocation),\n };\n};\n\nconst isVisibleTitleSegment = (segment: TitleSegment) => {\n if (segment.kind === \"text\" || segment.kind === \"link\") return segment.text.trim().length > 0;\n if (segment.kind === \"diff\") return segment.fileName.trim().length > 0;\n return true;\n};\n\nconst isVisibleBlock = (block: Block) => {\n switch (block.type) {\n case \"comment\":\n case \"code\":\n case \"text\":\n return block.type === \"code\" ? block.code.trim().length > 0 : block.text.trim().length > 0;\n case \"diff\":\n return block.original.trim().length > 0 || block.modified.trim().length > 0;\n case \"image\":\n return block.src.trim().length > 0;\n case \"todo-list\":\n return block.items.length > 0;\n case \"question-form\":\n return block.questions.length > 0;\n case \"references\":\n return block.references.length > 0;\n case \"input\":\n case \"component\":\n return true;\n }\n};\n\nconst isVisibleItem = (item: Item) => {\n const hasTitle = item.title.some(isVisibleTitleSegment);\n const hasBlocks = (item.blocks ?? []).some(isVisibleBlock);\n return hasTitle || hasBlocks;\n};\n\nconst mergeToolRenderers = (overrides?: ToolRenderersMap) => {\n if (!overrides) return createDefaultToolRenderers();\n return { ...createDefaultToolRenderers(), ...overrides } satisfies ToolRenderersMap;\n};\n\nconst getRenderer = (invocation: ToolPart, toolRenderers: ToolRenderersMap) => {\n const rawTool = invocation.tool ?? \"tool\";\n for (const key of getToolNameLookupKeys(rawTool)) {\n const renderer = toolRenderers[key];\n if (renderer) return renderer;\n }\n\n return undefined;\n};\n\nconst renderInvocation = (\n invocation: ToolPart,\n toolRenderers: ToolRenderersMap,\n options?: ToolTimelineBuilderOptions,\n) => {\n const renderer = getRenderer(invocation, toolRenderers);\n if (renderer) {\n const rendered = renderer(invocation, options);\n if (rendered) return rendered;\n }\n\n return createGenericItem(invocation);\n};\n\nexport const buildTimelineDocFromInvocations = (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n const toolRenderers = mergeToolRenderers(options?.toolRenderers);\n const items = invocations\n .map((invocation) => renderInvocation(invocation, toolRenderers, options))\n .filter(isVisibleItem);\n\n return { items };\n};\n","import { Avatar, Link, Span } from \"@chakra-ui/react\";\nimport type { MouseEvent } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { TitleSegment } from \"./timeline\";\n\nconst handleTitleLinkClick = (\n event: MouseEvent<HTMLAnchorElement>,\n seg: Extract<TitleSegment, { kind: \"link\" }>,\n onOpenFile?: (filePath: string) => void,\n stopPropagation = false,\n) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (!seg.href) {\n event.preventDefault();\n }\n if (seg.filePath) {\n onOpenFile?.(seg.filePath);\n }\n};\n\nfunction AvatarTitleSegment({ seg }: { seg: Extract<TitleSegment, { kind: \"avatar\" }> }) {\n return (\n <Avatar.Root width=\"1.5rem\" height=\"1.5rem\">\n <Avatar.Image src={seg.src} alt={seg.alt} />\n <Avatar.Fallback background=\"bg.muted\" color=\"fg.muted\" />\n </Avatar.Root>\n );\n}\n\nfunction DiffTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"diff\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <DiffBubble\n fileName={seg.fileName}\n additions={seg.additions ?? 0}\n deletions={seg.deletions ?? 0}\n onClickFileLink={() => {\n const path = seg.filePath ?? seg.fileName;\n onOpenFile?.(path);\n }}\n />\n );\n}\n\nfunction BubbleLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n const isInteractive = Boolean(seg.href || seg.filePath);\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"fg.muted\"}\n textDecoration=\"none\"\n cursor={isInteractive ? \"pointer\" : \"default\"}\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile, true)}\n _hover={{\n textDecoration: \"underline\",\n color: seg.muted ? \"fg.muted\" : \"fg.blue-dark\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction DefaultLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"accent.primary\"}\n textDecoration=\"underline\"\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile)}\n _hover={{\n color: seg.muted ? \"fg.muted\" : \"accent.primary\",\n textDecoration: \"underline\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction TextTitleSegment({\n seg,\n isClickable,\n}: {\n seg: Extract<TitleSegment, { kind: \"text\" }>;\n isClickable?: boolean;\n}) {\n const segment = (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n textStyle={seg.monospace ? \"mono/XS\" : undefined}\n color=\"fg.muted\"\n minW={seg.truncate ? \"0\" : undefined}\n overflow={seg.truncate ? \"hidden\" : undefined}\n textOverflow={seg.truncate ? \"ellipsis\" : undefined}\n whiteSpace={seg.truncate ? \"nowrap\" : undefined}\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n\n if (!seg.truncate) return segment;\n\n return <Tooltip content={seg.text}>{segment}</Tooltip>;\n}\n\nexport function TitleInline({\n seg,\n isClickable,\n onOpenFile,\n}: {\n seg: TitleSegment;\n isClickable?: boolean;\n onOpenFile?: (filePath: string) => void;\n}) {\n switch (seg.kind) {\n case \"avatar\":\n return <AvatarTitleSegment seg={seg} />;\n case \"diff\":\n return <DiffTitleSegment seg={seg} onOpenFile={onOpenFile} />;\n case \"link\":\n return seg.variant === \"bubble\" ? (\n <BubbleLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n ) : (\n <DefaultLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n );\n case \"text\":\n return <TextTitleSegment seg={seg} isClickable={isClickable} />;\n default:\n return null;\n }\n}\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Image, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffEditor } from \"@/components/diff-viewer/diff-editor\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport type { IconName } from \"../utils/get-icon\";\nimport { getIconComponent } from \"../utils/get-icon\";\nimport { TitleInline } from \"./timeline-title\";\nimport { QuestionFormBlockView, TodoListBlockView } from \"./timeline-tool-blocks\";\n\nconst Timeline = ChakraTimeline;\n\nexport type TimelineDoc = {\n items: Item[];\n};\n\nexport type Item = {\n id?: string;\n timestamp?: string;\n indicator?: Indicator;\n title: TitleSegment[];\n blocks?: Block[];\n expandable?: boolean;\n};\n\nexport type Indicator =\n | { type: \"icon\"; icon: IconName; color?: string }\n | { type: \"avatar\"; src: string; alt?: string }\n | { type: \"none\" };\n\nexport type TitleSegment =\n | {\n kind: \"text\";\n text: string;\n bold?: boolean;\n muted?: boolean;\n truncate?: boolean;\n monospace?: boolean;\n }\n | { kind: \"avatar\"; src: string; alt?: string }\n | {\n kind: \"diff\";\n fileName: string;\n filePath?: string;\n additions?: number;\n deletions?: number;\n }\n | {\n kind: \"link\";\n text: string;\n href?: string;\n filePath?: string;\n bold?: boolean;\n muted?: boolean;\n variant?: \"default\" | \"bubble\";\n };\n\nexport type TodoListBlockItem = {\n label: string;\n checked: boolean;\n};\n\nexport type QuestionFormBlockOption = {\n label: string;\n description?: string;\n};\n\nexport type QuestionFormBlockQuestion = {\n id?: string;\n question: string;\n options: QuestionFormBlockOption[];\n multiple: boolean;\n required: boolean;\n allowCustomAnswer: boolean;\n};\n\nexport type Block =\n | { type: \"comment\"; text: string; reactions?: { clap?: number } }\n | { type: \"code\"; language: string; code: string; editable?: boolean }\n | {\n type: \"diff\";\n language?: string;\n original: string;\n modified: string;\n sideBySide?: boolean;\n }\n | { type: \"input\"; placeholder?: string }\n | { type: \"text\"; text: string }\n | { type: \"todo-list\"; items: TodoListBlockItem[] }\n | { type: \"question-form\"; questions: QuestionFormBlockQuestion[] }\n | { type: \"references\"; references: string[] }\n | { type: \"image\"; src: string; alt: string; caption?: string }\n | {\n type: \"component\";\n render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode;\n };\n\nfunction IndicatorView({ ind }: { ind?: Indicator }) {\n if (!ind || ind.type === \"none\") return null;\n\n if (ind.type === \"icon\") {\n const IndicatorIcon = getIconComponent(ind.icon);\n return (\n <Timeline.Indicator outline=\"none\" border=\"none\" background=\"bg\" color=\"fg\">\n <Span display=\"inline-flex\" alignItems=\"center\">\n <IndicatorIcon size={14} strokeWidth={1} />\n </Span>\n </Timeline.Indicator>\n );\n }\n\n return (\n <Timeline.Indicator>\n <Avatar.Root boxSize=\"full\">\n <Avatar.Image src={ind.src} alt={ind.alt} />\n <Avatar.Fallback background=\"bg.muted\" color=\"fg.muted\" />\n </Avatar.Root>\n </Timeline.Indicator>\n );\n}\n\nfunction CodeBlock({ code, language }: { code: string; language?: string }) {\n return (\n <ScrollArea\n background=\"bg.code\"\n color=\"fg.muted\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"md\"\n showHorizontalScrollbar\n showVerticalScrollbar={false}\n >\n <Box\n as=\"pre\"\n padding=\"sm\"\n textStyle=\"mono/XS\"\n whiteSpace=\"pre\"\n aria-label={language ? `${language} code block` : \"code block\"}\n >\n <Box as=\"code\">{code}</Box>\n </Box>\n </ScrollArea>\n );\n}\n\nfunction BlockView({ b, onOpenFile }: { b: Block; onOpenFile?: (filePath: string) => void }) {\n switch (b.type) {\n case \"comment\":\n return (\n <Card.Root>\n <Card.Body>{b.text}</Card.Body>\n {b.reactions?.clap ? (\n <Card.Footer>\n <Button>👏 {b.reactions.clap}</Button>\n </Card.Footer>\n ) : null}\n </Card.Root>\n );\n case \"code\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <CodeBlock language={b.language} code={b.code} />\n </Card.Body>\n </Card.Root>\n );\n case \"diff\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <Box height=\"240px\" minW=\"320px\" overflow=\"hidden\">\n <DiffEditor\n original={b.original}\n modified={b.modified}\n language={b.language}\n sideBySide={b.sideBySide ?? false}\n disableScroll={true}\n />\n </Box>\n </Card.Body>\n </Card.Root>\n );\n case \"text\":\n return (\n <Card.Root background=\"transparent\">\n <Card.Body padding=\"sm\">\n <Text textStyle=\"label/S/regular\">{b.text}</Text>\n </Card.Body>\n </Card.Root>\n );\n case \"todo-list\":\n return <TodoListBlockView items={b.items} />;\n case \"question-form\":\n return <QuestionFormBlockView questions={b.questions} />;\n case \"references\":\n return (\n <Stack mt=\"xs\" gap=\"xs\" flexDir=\"row\" flexWrap=\"wrap\">\n {b.references.map((ref) => (\n <ResourceBadge key={ref} fileName={ref} />\n ))}\n </Stack>\n );\n case \"image\":\n if (!b.src.trim()) return null;\n return (\n <Card.Root border=\"0\" padding=\"0\" background=\"transparent\">\n <Card.Body padding=\"0\">\n <Image\n src={b.src}\n alt={b.alt}\n maxH=\"18rem\"\n maxW=\"full\"\n objectFit=\"contain\"\n borderRadius=\"sm\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n />\n {b.caption ? (\n <Text mt=\"2xs\" textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {b.caption}\n </Text>\n ) : null}\n </Card.Body>\n </Card.Root>\n );\n case \"component\":\n return <>{b.render({ onOpenFile })}</>;\n }\n}\n\nfunction TimelineItemRow({\n item,\n itemKey,\n isOpen,\n canExpand,\n hasBlocks,\n onToggle,\n onOpenFile,\n}: {\n item: Item;\n itemKey: string;\n isOpen: boolean;\n canExpand: boolean;\n hasBlocks: boolean;\n onToggle: (key: string) => void;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <Timeline.Item gap=\"xs\" key={itemKey}>\n <Timeline.Connector>\n <Timeline.Separator />\n <IndicatorView ind={item.indicator} />\n </Timeline.Connector>\n <Timeline.Content h={isOpen ? \"auto\" : \"20px\"}>\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n minW=\"0\"\n width=\"full\"\n overflow=\"hidden\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"nowrap\" minW=\"0\" width=\"full\">\n <Span display=\"flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"nowrap\" minW=\"0\" flex=\"1\" overflow=\"hidden\">\n {item.title.map((seg, i) => (\n <TitleInline key={i} seg={seg} isClickable={canExpand} onOpenFile={onOpenFile} />\n ))}\n </Span>\n {canExpand ? (\n <Span\n display=\"inline-flex\"\n alignItems=\"center\"\n transition=\"transform 200ms ease, color 200ms ease\"\n transform={isOpen ? \"rotate(0deg)\" : \"rotate(-180deg)\"}\n color=\"transparent\"\n flexShrink=\"0\"\n _groupHover={{ color: \"fg\" }}\n >\n <ChevronUpIcon size={12} />\n </Span>\n ) : null}\n </Span>\n </Timeline.Title>\n )}\n {hasBlocks ? (\n <Box display=\"grid\" gridTemplateRows={isOpen ? \"1fr\" : \"0fr\"} transition=\"grid-template-rows 220ms ease\">\n {isOpen ? (\n <Box\n overflow=\"hidden\"\n opacity={1}\n transform=\"translateY(0)\"\n transition=\"opacity 200ms ease, transform 200ms ease\"\n >\n {item.blocks!.map((block, i) => (\n <Box key={i}>\n <BlockView b={block} onOpenFile={onOpenFile} />\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Timeline.Content>\n </Timeline.Item>\n );\n}\n\nexport function TimelineFromJSON({ data, onOpenFile }: { data: TimelineDoc; onOpenFile?: (filePath: string) => void }) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const getKey = (it: Item, idx: number) => (it.id ? `id:${it.id}` : `idx:${idx}`);\n\n const toggle = (key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n return (\n <Timeline.Root>\n {data.items.map((item, idx) => {\n const key = getKey(item, idx);\n const hasBlocks = (item.blocks?.length ?? 0) > 0;\n const canExpand = (item.expandable ?? true) && hasBlocks;\n const isOpen = canExpand ? (expanded[key] ?? false) : hasBlocks;\n\n return (\n <TimelineItemRow\n key={key}\n item={item}\n itemKey={key}\n isOpen={isOpen}\n canExpand={canExpand}\n hasBlocks={hasBlocks}\n onToggle={toggle}\n onOpenFile={onOpenFile}\n />\n );\n })}\n </Timeline.Root>\n );\n}\n","import { buildTimelineDocFromInvocations } from \"../tool-rendering\";\nimport { normalizeToolName } from \"../utils/tool-name\";\nimport type { ToolPart } from \"./message-types\";\nimport { TimelineFromJSON } from \"./timeline\";\n\nexport interface ToolInvocationTimelineProps {\n invocations: ToolPart[];\n labeledBlocks?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n}\n\nconst isQuestionTool = (invocation: ToolPart) =>\n normalizeToolName(invocation.tool ?? \"\").replace(/_/g, \"\") === \"question\";\n\nconst hasToolOutput = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (typeof output === \"string\") return output.trim().length > 0;\n if (Array.isArray(output)) return output.length > 0;\n if (output && typeof output === \"object\") return Object.keys(output).length > 0;\n return output !== undefined && output !== null;\n};\n\nexport function ToolInvocationTimeline(props: ToolInvocationTimelineProps) {\n const { invocations, labeledBlocks, hideQuestionForms = false, onOpenFile } = props;\n const visibleInvocations = hideQuestionForms\n ? invocations.filter((invocation) => !isQuestionTool(invocation) || hasToolOutput(invocation))\n : invocations;\n\n if (visibleInvocations.length === 0) return null;\n\n const data = buildTimelineDocFromInvocations(visibleInvocations, { labeledBlocks });\n\n return <TimelineFromJSON data={data} onOpenFile={onOpenFile} />;\n}\n","import { Box, Image, Spinner } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { AlertMessage } from \"@/components/primitives/alert\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { RichMessage } from \"@/components/rich-text\";\nimport { Response } from \"./ai-response\";\nimport type { AlertPart, ChatMessagePart, ErrorPart, FilePart, SessionMessage, ToolPart } from \"./message-types\";\nimport { ToolInvocationTimeline, type ToolInvocationTimelineProps } from \"./tool-invocation-timeline\";\n\ntype ToolInvocationTimelineComponent = (props: ToolInvocationTimelineProps) => ReactNode;\n\nexport interface MessagePartsProps {\n message: SessionMessage;\n streaming?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n toolInvocationTimeline?: ToolInvocationTimelineComponent;\n}\n\nconst isToolPart = (part: ChatMessagePart): part is ToolPart => {\n return part.type === \"tool\";\n};\n\nconst filePartLabel = (part: FilePart) => part.filename ?? part.url.split(\"/\").pop() ?? \"attachment\";\n\nconst imageExtensionPattern = /\\.(avif|bmp|gif|jpe?g|png|svg|webp)$/i;\n\nconst isImageFilePart = (part: FilePart) =>\n part.mediaType?.startsWith(\"image/\") || imageExtensionPattern.test(filePartLabel(part));\n\nconst filePartThumbnail = (part: FilePart) =>\n isImageFilePart(part) ? (\n <Image\n src={part.url}\n alt={`${filePartLabel(part)} preview thumbnail`}\n boxSize=\"18px\"\n borderRadius=\"xs\"\n objectFit=\"cover\"\n />\n ) : undefined;\n\nconst openFilePart = (part: FilePart, onOpenFile?: (filePath: string) => void) => {\n if (onOpenFile) {\n onOpenFile(part.url);\n return;\n }\n\n if (typeof window !== \"undefined\") {\n window.open(part.url, \"_blank\", \"noopener,noreferrer\");\n }\n};\n\nconst getErrorMessage = (part: ErrorPart) => {\n if (part.message && part.message.trim().length > 0) {\n return part.message;\n }\n\n const { errorType } = part;\n switch (errorType) {\n case \"timeout\":\n return \"Session timed out.\";\n case \"crash\":\n return \"Session crashed unexpectedly.\";\n case \"permission\":\n return \"Permission denied.\";\n default:\n return \"An error occurred.\";\n }\n};\n\nconst ALERT_COLOR_PALETTE: Record<AlertPart[\"status\"], string> = {\n info: \"blue\",\n warning: \"orange\",\n error: \"red\",\n success: \"green\",\n loading: \"blue\",\n};\n\nconst collectToolInvocations = (parts: ChatMessagePart[], startIndex: number) => {\n const invocations: ToolPart[] = [];\n let lookahead = startIndex;\n\n while (lookahead < parts.length) {\n const nextPart = parts[lookahead];\n if (!isToolPart(nextPart)) break;\n invocations.push(nextPart);\n lookahead += 1;\n }\n\n return { invocations, nextIndex: lookahead - 1 };\n};\n\nexport function MessagePartsRenderer(props: MessagePartsProps) {\n const { message, hideQuestionForms = false, onOpenFile, toolInvocationTimeline } = props;\n const RenderToolInvocationTimeline = toolInvocationTimeline ?? ToolInvocationTimeline;\n const parts = message.parts ?? [];\n const nodes: ReactNode[] = [];\n\n for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n const part = parts[partIndex];\n const key = `${message.id}-${partIndex}`;\n\n switch (part.type) {\n case \"text\":\n nodes.push(\n <div key={key}>\n <Response>{part.text}</Response>\n </div>,\n );\n break;\n case \"reasoning\":\n nodes.push(\n <Box\n key={key}\n padding=\"0\"\n css={{\n \"& .rich-text, & .rich-text *\": {\n color: \"fg.subtle !important\",\n fontSize: \".75rem !important\",\n fontWeight: \"normal !important\",\n },\n }}\n >\n <RichMessage defaultState={part.text} fullWidth />\n </Box>,\n );\n break;\n case \"tool\": {\n const { invocations, nextIndex } = collectToolInvocations(parts, partIndex);\n partIndex = nextIndex;\n nodes.push(\n <Box key={key} width=\"full\">\n <RenderToolInvocationTimeline\n invocations={invocations}\n labeledBlocks\n hideQuestionForms={hideQuestionForms}\n onOpenFile={onOpenFile}\n />\n </Box>,\n );\n break;\n }\n case \"file\":\n nodes.push(\n <Box key={key} width=\"fit-content\">\n <ResourceBadge\n fileName={filePartLabel(part)}\n size=\"sm\"\n tone=\"neutral\"\n icon={filePartThumbnail(part)}\n onSelect={() => openFilePart(part, onOpenFile)}\n />\n </Box>,\n );\n break;\n case \"error\":\n nodes.push(\n <Box key={key} py=\"2\" width=\"full\">\n <AlertMessage borderRadius=\"xs\" status=\"error\" colorPalette=\"red\" title={getErrorMessage(part)} size=\"sm\" />\n </Box>,\n );\n break;\n case \"token_usage\":\n break;\n case \"alert\":\n nodes.push(\n <Box key={key} width=\"full\">\n <AlertMessage\n borderRadius=\"xs\"\n status={part.status === \"loading\" ? \"info\" : part.status}\n colorPalette={ALERT_COLOR_PALETTE[part.status]}\n title={part.title}\n icon={part.status === \"loading\" ? <Spinner size=\"sm\" /> : undefined}\n size=\"sm\"\n >\n {part.message}\n </AlertMessage>\n </Box>,\n );\n break;\n default:\n nodes.push(null);\n }\n }\n\n return <>{nodes}</>;\n}\n","// Keep the non-alert session parts aligned with pstdio-api-contracts/src/session-messages.ts.\n// @pstdio/ui cannot import that private package, so the public UI contract owns this copy.\nexport type SessionMessageRole = \"user\" | \"assistant\" | \"tool\" | \"system\" | \"developer\";\n\nexport type TextPart = { type: \"text\"; text: string };\n\nexport type ReasoningPart = { type: \"reasoning\"; text: string };\n\nexport type ToolPartActionType = \"read\" | \"write\" | \"execute\" | \"network\" | \"other\";\n\nexport type ToolPartStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"denied\";\n\nexport type ToolPart = {\n type: \"tool\";\n tool: string;\n callId?: string;\n actionType?: ToolPartActionType;\n status?: ToolPartStatus;\n state?: {\n status?: string;\n input?: unknown;\n output?: unknown;\n errorText?: string;\n metadata?: unknown;\n };\n};\n\nexport type StepStartPart = { type: \"step-start\"; snapshot?: string };\n\nexport type StepFinishPart = {\n type: \"step-finish\";\n reason?: string;\n snapshot?: string;\n cost?: number;\n tokens?: unknown;\n};\n\nexport type PatchPart = { type: \"patch\"; hash?: string; files?: unknown };\n\nexport type FilePart = {\n type: \"file\";\n fileId?: string;\n mediaType?: string;\n filename?: string;\n size?: number;\n url: string;\n};\n\nexport type LoadingPart = { type: \"loading\" };\n\nexport type ErrorPart = {\n type: \"error\";\n errorType: \"timeout\" | \"crash\" | \"permission\" | \"other\";\n message?: string;\n};\n\nexport type TokenUsagePart = {\n type: \"token_usage\";\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n};\n\nexport type AlertPart = {\n type: \"alert\";\n status: \"info\" | \"warning\" | \"error\" | \"success\" | \"loading\";\n title: string;\n message?: string;\n};\n\nexport type SessionMessagePart =\n | TextPart\n | ReasoningPart\n | ToolPart\n | StepStartPart\n | StepFinishPart\n | PatchPart\n | FilePart\n | LoadingPart\n | ErrorPart\n | TokenUsagePart;\n\nexport type ChatMessagePart = SessionMessagePart | AlertPart;\n\nexport type SessionMessage = {\n id: string;\n role: SessionMessageRole;\n parts: ChatMessagePart[];\n index?: number;\n createdAt?: number;\n modelId?: string;\n providerId?: string;\n tokens?: {\n input?: number;\n output?: number;\n reasoning?: number;\n cache?: { read?: number; write?: number };\n };\n};\n\nexport type QueuedFollowUp = {\n id: string;\n prompt: string;\n attachments?: Array<{\n id: string;\n name: string;\n mediaType?: string;\n url?: string;\n }>;\n position?: number;\n};\n\nexport type MessageOrigin = \"user\" | \"assistant\" | \"developer\";\n\nexport const getMessageOrigin = (role: string): MessageOrigin => {\n if (role === \"user\" || role === \"assistant\" || role === \"developer\") return role;\n return \"assistant\";\n};\n\nconst isReasoningToolOnlyMessage = (message: SessionMessage) => {\n const parts = message.parts ?? [];\n if (parts.length === 0) return false;\n\n const hasTextPart = parts.some((part) => part.type === \"text\" && \"text\" in part);\n if (hasTextPart) return false;\n\n return parts.some((part) => part.type === \"reasoning\" || part.type === \"tool\");\n};\n\nconst isVisibleText = (part: TextPart | ReasoningPart) => part.text.trim().length > 0;\n\nconst isVisibleAlert = (part: AlertPart) => part.title.trim().length > 0 || Boolean(part.message?.trim());\n\nconst isDisplayRenderablePart = (part: ChatMessagePart) => {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n return isVisibleText(part);\n case \"tool\":\n case \"file\":\n case \"error\":\n return true;\n case \"alert\":\n return isVisibleAlert(part);\n default:\n return false;\n }\n};\n\nconst isActivityPart = (part: ChatMessagePart) => part.type === \"reasoning\" || part.type === \"tool\";\n\nconst isActivityOnlyMessage = (message: SessionMessage) => {\n if (message.role === \"user\") return false;\n if (message.parts.length === 0) return false;\n return message.parts.every(isActivityPart);\n};\n\nconst mergeBufferedActivity = (messages: SessionMessage[]) => {\n if (messages.length === 0) return null;\n\n const [first, ...rest] = messages;\n if (!first) return null;\n\n return {\n ...first,\n role: \"assistant\",\n parts: messages.flatMap((message) => message.parts),\n modelId: rest.at(-1)?.modelId ?? first.modelId,\n providerId: rest.at(-1)?.providerId ?? first.providerId,\n } satisfies SessionMessage;\n};\n\nexport const mergeReasoningToolOnlyMessages = (messages: SessionMessage[]) => {\n const merged: SessionMessage[] = [];\n\n for (const message of messages) {\n const previous = merged[merged.length - 1];\n\n if (previous && previous.role === message.role && isReasoningToolOnlyMessage(message)) {\n previous.parts = [...(previous.parts ?? []), ...(message.parts ?? [])];\n continue;\n }\n\n merged.push({\n ...message,\n parts: [...(message.parts ?? [])],\n });\n }\n\n return merged;\n};\n\nexport const normalizeChatMessagesForDisplay = (messages: SessionMessage[], options: { streaming?: boolean } = {}) => {\n const normalized: SessionMessage[] = [];\n let activityBuffer: SessionMessage[] = [];\n\n const clearActivityBuffer = () => {\n activityBuffer = [];\n };\n\n for (const message of messages) {\n const displayParts = (message.parts ?? []).filter(isDisplayRenderablePart);\n if (displayParts.length === 0) continue;\n\n const displayMessage = { ...message, parts: displayParts };\n\n if (displayMessage.role === \"user\") {\n clearActivityBuffer();\n normalized.push(displayMessage);\n continue;\n }\n\n if (isActivityOnlyMessage(displayMessage)) {\n activityBuffer.push(displayMessage);\n continue;\n }\n\n if (activityBuffer.length > 0) {\n normalized.push({\n ...displayMessage,\n parts: [...activityBuffer.flatMap((activity) => activity.parts), ...displayMessage.parts],\n });\n clearActivityBuffer();\n continue;\n }\n\n normalized.push(displayMessage);\n }\n\n if (options.streaming && activityBuffer.length > 0) {\n const trailingActivity = mergeBufferedActivity(activityBuffer);\n if (trailingActivity) normalized.push(trailingActivity);\n }\n\n return normalized;\n};\n\nexport interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\n}\n\nexport const getAssistantMessageActionTargetId = (messages: SessionMessage[]) => {\n const lastMessage = messages.at(-1);\n if (lastMessage?.role !== \"assistant\") return null;\n\n const hasVisibleText = lastMessage.parts.some((part) => part.type === \"text\" && isVisibleText(part));\n return hasVisibleText ? lastMessage.id : null;\n};\n\n// Groups messages into turns: each group starts with a user message\n// followed by all non-user messages until the next user message.\nexport const groupMessagesByTurn = (messages: SessionMessage[]) => {\n const groups: MessageGroup[] = [];\n const leadingResponses: SessionMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"user\") {\n groups.push({ userMessage: message, responses: [] });\n } else if (groups.length > 0) {\n groups[groups.length - 1].responses.push(message);\n } else {\n leadingResponses.push(message);\n }\n }\n\n return { groups, leadingResponses };\n};\n","import { Button, Flex } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { ChatMessage } from \"./ai-message\";\nimport { messageFadeInProps } from \"./chat-message-animation\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getMessageOrigin, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListResponseProps {\n message: SessionMessage;\n streaming: boolean;\n hideQuestionForms?: boolean;\n animate?: boolean;\n showAssistantActions: boolean;\n}\n\nexport const ChatMessageListResponse = (props: ChatMessageListResponseProps) => {\n const { message, streaming, hideQuestionForms = false, animate = false, showAssistantActions } = props;\n const from = getMessageOrigin(message.role);\n const showActions = from === \"user\" || (from === \"assistant\" && showAssistantActions);\n\n return (\n <ChatMessage.Root from={from} {...(animate ? messageFadeInProps : undefined)}>\n <ChatMessage.Content from={from}>\n <MessagePartsRenderer message={message} streaming={streaming} hideQuestionForms={hideQuestionForms} />\n {showActions ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\n};\n\ninterface StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\n}\n\nexport const StickyMessageToggle = (props: StickyMessageToggleProps) => {\n const { label, onClick, actionPanel } = props;\n\n return (\n <Flex\n position=\"absolute\"\n bottom=\"0\"\n left=\"0\"\n right=\"0\"\n justifyContent={actionPanel ? \"space-between\" : \"flex-end\"}\n alignItems=\"flex-end\"\n px=\"xs\"\n pb=\"xs\"\n pt=\"lg\"\n bgGradient=\"to-t\"\n gradientFrom=\"bg.subtle\"\n gradientTo=\"transparent\"\n borderBottomRadius=\"xs\"\n pointerEvents=\"none\"\n >\n {actionPanel}\n <Button size=\"2xs\" variant=\"outline\" pointerEvents=\"auto\" onClick={onClick}>\n {label}\n </Button>\n </Flex>\n );\n};\n","import type { SessionMessage } from \"./message-types\";\n\nexport const STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD = 360;\nexport const STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD = 4;\nexport const STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT = \"min(10vh, 4rem)\";\nexport const STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT = \"min(70dvh, calc(100dvh - 12rem), 22rem)\";\n\nconst SCROLL_BOUNDARY_EPSILON = 1;\n\ninterface StickyUserMessageScrollElement {\n clientHeight: number;\n scrollHeight: number;\n scrollTop: number;\n}\n\nconst getMessageTextMetrics = (message: SessionMessage) => {\n return message.parts.reduce(\n (metrics, part) => {\n if (part.type !== \"text\") return metrics;\n\n return {\n lineCount: metrics.lineCount + part.text.split(/\\r\\n|\\r|\\n/).length,\n textLength: metrics.textLength + part.text.length,\n };\n },\n { lineCount: 0, textLength: 0 },\n );\n};\n\nexport const isStickyUserMessageCollapsible = (message: SessionMessage) => {\n if (message.role !== \"user\") return false;\n\n const { lineCount, textLength } = getMessageTextMetrics(message);\n\n return (\n textLength > STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD || lineCount > STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD\n );\n};\n\nexport const shouldStopStickyUserMessageWheel = (element: StickyUserMessageScrollElement, deltaY: number) => {\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\n\n if (deltaY === 0 || maxScrollTop <= SCROLL_BOUNDARY_EPSILON) return false;\n if (deltaY < 0) return element.scrollTop > SCROLL_BOUNDARY_EPSILON;\n\n return element.scrollTop < maxScrollTop - SCROLL_BOUNDARY_EPSILON;\n};\n","import { Box } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useEffect, useRef, type WheelEvent } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ChatMessage } from \"./ai-message\";\nimport { messageFadeInProps, useMessageAnimationKeys } from \"./chat-message-animation\";\nimport { ChatMessageListResponse, StickyMessageToggle } from \"./chat-message-list-items\";\nimport {\n isStickyUserMessageCollapsible,\n STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT,\n STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT,\n shouldStopStickyUserMessageWheel,\n} from \"./chat-panel-sticky-user-message\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getAssistantMessageActionTargetId, type MessageGroup, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListProps {\n leadingResponses: SessionMessage[];\n groups: MessageGroup[];\n streaming: boolean;\n hideActiveQuestionForms: boolean;\n expandedStickyMessageIds: Set<string>;\n onToggleStickyMessage: (messageId: string) => void;\n onReady?: () => void;\n}\n\ninterface StickyMessageGroupProps {\n group: MessageGroup;\n streaming: boolean;\n hideQuestionForms: boolean;\n isExpanded: boolean;\n animate: boolean;\n onToggleStickyMessage: (messageId: string) => void;\n}\n\ntype ChatMessageListItem =\n | {\n type: \"leading-response\";\n key: string;\n message: SessionMessage;\n showAssistantActions: boolean;\n }\n | {\n type: \"group\";\n key: string;\n group: MessageGroup;\n groupIndex: number;\n };\n\nconst ESTIMATED_TURN_HEIGHT = 720;\nconst INITIAL_TAIL_VIEWPORT_HEIGHT = 1;\nconst TAIL_READY_STABLE_FRAME_COUNT = 3;\nconst TAIL_READY_FRAME_LIMIT = 20;\nconst TAIL_READY_PIXEL_EPSILON = 1;\nconst VIRTUAL_LIST_OVERSCAN = 4;\nconst VIRTUAL_LIST_GAP = 8;\n\nconst buildMessageListItems = (leadingResponses: SessionMessage[], groups: MessageGroup[]) => {\n const leadingActionMessageId = getAssistantMessageActionTargetId(leadingResponses);\n\n return [\n ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n showAssistantActions: message.id === leadingActionMessageId,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\n })),\n ];\n};\n\nconst getEstimatedTailOffset = (count: number, viewportHeight: number) => {\n if (count === 0) return 0;\n\n const estimatedTotalSize = count * ESTIMATED_TURN_HEIGHT + (count - 1) * VIRTUAL_LIST_GAP;\n return Math.max(estimatedTotalSize - viewportHeight, 0);\n};\n\nconst getInitialViewportHeight = (scrollElement: HTMLElement | null) =>\n scrollElement?.clientHeight || INITIAL_TAIL_VIEWPORT_HEIGHT;\n\ninterface TailLayoutSnapshot {\n scrollTop: number;\n totalSize: number;\n}\n\nconst isTailLayoutStable = (current: TailLayoutSnapshot, previous: TailLayoutSnapshot) =>\n Math.abs(current.scrollTop - previous.scrollTop) <= TAIL_READY_PIXEL_EPSILON &&\n Math.abs(current.totalSize - previous.totalSize) <= TAIL_READY_PIXEL_EPSILON;\n\nconst readTailLayoutSnapshot = (scrollElement: HTMLElement | null, totalSize: number): TailLayoutSnapshot => ({\n scrollTop: scrollElement?.scrollTop ?? 0,\n totalSize,\n});\n\nconst useTailReady = (input: {\n itemCount: number;\n onReady?: () => void;\n scrollRef: { current: HTMLElement | null };\n totalSize: number;\n}) => {\n const { itemCount, onReady, scrollRef, totalSize } = input;\n const onReadyRef = useRef(onReady);\n\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n useEffect(() => {\n if (itemCount === 0 || typeof requestAnimationFrame === \"undefined\") {\n onReadyRef.current?.();\n return;\n }\n\n let frameId = 0;\n let checkedFrameCount = 0;\n let stableFrameCount = 0;\n let previousSnapshot: TailLayoutSnapshot | null = null;\n\n const waitForStableTail = () => {\n checkedFrameCount += 1;\n\n const nextSnapshot = readTailLayoutSnapshot(scrollRef.current, totalSize);\n stableFrameCount =\n previousSnapshot && isTailLayoutStable(nextSnapshot, previousSnapshot) ? stableFrameCount + 1 : 0;\n previousSnapshot = nextSnapshot;\n\n if (stableFrameCount >= TAIL_READY_STABLE_FRAME_COUNT || checkedFrameCount >= TAIL_READY_FRAME_LIMIT) {\n onReadyRef.current?.();\n return;\n }\n\n frameId = requestAnimationFrame(waitForStableTail);\n };\n\n frameId = requestAnimationFrame(waitForStableTail);\n\n return () => cancelAnimationFrame(frameId);\n }, [itemCount, scrollRef, totalSize]);\n};\n\nconst handleExpandedStickyMessageWheel = (event: WheelEvent<HTMLElement>) => {\n if (shouldStopStickyUserMessageWheel(event.currentTarget, event.deltaY)) {\n event.stopPropagation();\n }\n};\n\nconst getStickyMessageMaxHeight = (isCollapsible: boolean, isExpanded: boolean) => {\n if (!isCollapsible) return undefined;\n if (isExpanded) return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n\n return STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT;\n};\n\nconst getStickyMessageBodyMaxHeight = (isExpandedCollapsible: boolean) => {\n if (!isExpandedCollapsible) return undefined;\n\n return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n};\n\nconst StickyMessageGroup = (props: StickyMessageGroupProps) => {\n const { group, streaming, hideQuestionForms, isExpanded, animate, onToggleStickyMessage } = props;\n const isCollapsible = isStickyUserMessageCollapsible(group.userMessage);\n const isExpandedCollapsible = isCollapsible && isExpanded;\n const stickyMessageMaxHeight = getStickyMessageMaxHeight(isCollapsible, isExpanded);\n const toggleStickyMessage = () => onToggleStickyMessage(group.userMessage.id);\n const actionMessageId = getAssistantMessageActionTargetId(group.responses);\n\n return (\n <Box>\n <Box position=\"sticky\" top=\"0\" zIndex={1}>\n <ChatMessage.Root from=\"user\" {...(animate ? messageFadeInProps : undefined)}>\n <ChatMessage.Content\n from=\"user\"\n maxH={stickyMessageMaxHeight}\n overflow=\"hidden\"\n p={isCollapsible ? \"0\" : undefined}\n position={isCollapsible ? \"relative\" : undefined}\n >\n <Box\n data-sticky-user-message-content={isCollapsible ? (isExpanded ? \"expanded\" : \"collapsed\") : undefined}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"sm\"\n maxH={getStickyMessageBodyMaxHeight(isExpandedCollapsible)}\n minH=\"0\"\n overflowY={isExpandedCollapsible ? \"auto\" : \"visible\"}\n px={isCollapsible ? \"xs\" : undefined}\n py={isCollapsible ? \"xs\" : undefined}\n pb={isExpandedCollapsible ? \"3rem\" : undefined}\n onWheel={isExpandedCollapsible ? handleExpandedStickyMessageWheel : undefined}\n >\n <MessagePartsRenderer message={group.userMessage} streaming={streaming} />\n </Box>\n {isCollapsible ? (\n <StickyMessageToggle\n label={isExpanded ? \"Show less\" : \"Show more\"}\n onClick={toggleStickyMessage}\n actionPanel={<MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />}\n />\n ) : (\n <MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />\n )}\n </ChatMessage.Content>\n </ChatMessage.Root>\n </Box>\n {group.responses.map((message) => (\n <Box key={message.id}>\n <ChatMessageListResponse\n message={message}\n streaming={streaming}\n hideQuestionForms={hideQuestionForms}\n showAssistantActions={message.id === actionMessageId}\n />\n </Box>\n ))}\n </Box>\n );\n};\n\nconst renderListItem = (\n item: ChatMessageListItem,\n props: Pick<\n ChatMessageListProps,\n \"groups\" | \"streaming\" | \"hideActiveQuestionForms\" | \"expandedStickyMessageIds\" | \"onToggleStickyMessage\"\n > & { animatedItemKeys: Set<string> },\n) => {\n const {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n animatedItemKeys,\n onToggleStickyMessage,\n } = props;\n\n if (item.type === \"leading-response\") {\n return (\n <ChatMessageListResponse\n message={item.message}\n streaming={streaming}\n hideQuestionForms={groups.length > 0 || hideActiveQuestionForms}\n animate={animatedItemKeys.has(item.key)}\n showAssistantActions={item.showAssistantActions}\n />\n );\n }\n\n return (\n <StickyMessageGroup\n group={item.group}\n streaming={streaming}\n hideQuestionForms={item.groupIndex < groups.length - 1 || hideActiveQuestionForms}\n isExpanded={expandedStickyMessageIds.has(item.group.userMessage.id)}\n animate={animatedItemKeys.has(item.key)}\n onToggleStickyMessage={onToggleStickyMessage}\n />\n );\n};\n\nexport const ChatMessageList = (props: ChatMessageListProps) => {\n const {\n leadingResponses,\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n onReady,\n } = props;\n const { scrollRef } = useStickToBottomContext();\n const items = buildMessageListItems(leadingResponses, groups);\n const animatedItemKeys = useMessageAnimationKeys(items.map((item) => item.key));\n const initialViewportHeight = getInitialViewportHeight(scrollRef.current);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollRef.current as HTMLDivElement | null,\n estimateSize: () => ESTIMATED_TURN_HEIGHT,\n getItemKey: (index) => items[index]?.key ?? index,\n overscan: VIRTUAL_LIST_OVERSCAN,\n gap: VIRTUAL_LIST_GAP,\n initialRect: { width: 0, height: initialViewportHeight },\n initialOffset: () => getEstimatedTailOffset(items.length, initialViewportHeight),\n });\n const totalSize = virtualizer.getTotalSize();\n\n useTailReady({\n itemCount: items.length,\n onReady,\n scrollRef,\n totalSize,\n });\n\n return (\n <Box px=\"xs\">\n <Box position=\"relative\" width=\"100%\" style={{ height: totalSize }}>\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const item = items[virtualItem.index];\n if (!item) return null;\n\n return (\n <Box\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n data-chat-message-list-item={item.type}\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"100%\"\n style={{ top: virtualItem.start }}\n >\n {renderListItem(item, {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n animatedItemKeys,\n onToggleStickyMessage,\n })}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import { Badge, Box, Icon as ChakraIcon, HStack, IconButton, Stack, Text } from \"@chakra-ui/react\";\nimport { GripVertical, Pencil, Trash2 } from \"lucide-react\";\nimport { type DragEvent, useState } from \"react\";\nimport type { QueuedFollowUp } from \"./message-types\";\nimport type { QueuedFollowUpMoveDirection } from \"./queued-follow-up-list-state\";\n\ninterface QueuedFollowUpListProps {\n items: QueuedFollowUp[];\n editingItemId?: string | null;\n onEdit?: (item: QueuedFollowUp) => void;\n onRemove?: (itemId: string) => void;\n onMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n}\n\ninterface QueuedFollowUpRowProps {\n item: QueuedFollowUp;\n index: number;\n isFirst: boolean;\n isLast: boolean;\n isEditing: boolean;\n isDragTarget: boolean;\n onEdit?: (item: QueuedFollowUp) => void;\n onRemove?: (itemId: string) => void;\n onDragStart: (itemId: string) => void;\n onDragEnd: () => void;\n onDragOver: (event: DragEvent<HTMLDivElement>, itemId: string) => void;\n onDrop: (event: DragEvent<HTMLDivElement>, itemId: string) => void;\n}\n\nconst QueuedFollowUpRow = (props: QueuedFollowUpRowProps) => {\n const {\n item,\n index,\n isFirst,\n isLast,\n isEditing,\n isDragTarget,\n onEdit,\n onRemove,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDrop,\n } = props;\n const canEdit = Boolean(onEdit);\n const canRemove = Boolean(onRemove);\n const canDrag = !isFirst || !isLast;\n const dragLabel = `Drag queued follow-up ${index + 1}`;\n\n return (\n <Box\n minWidth=\"0\"\n borderTopWidth={isFirst ? \"0\" : \"1px\"}\n borderColor={isDragTarget ? \"border.accent-light\" : \"border.subtle\"}\n paddingTop={isFirst ? \"0\" : \"2xs\"}\n paddingBottom=\"2xs\"\n bg={isEditing ? \"bg.muted\" : undefined}\n onDragOver={(event) => onDragOver(event, item.id)}\n onDrop={(event) => onDrop(event, item.id)}\n data-queued-follow-up-id={item.id}\n >\n <HStack gap=\"xs\" alignItems=\"flex-start\">\n <IconButton\n size=\"2xs\"\n variant=\"ghost\"\n draggable={canDrag}\n aria-label={dragLabel}\n title={dragLabel}\n color=\"fg.muted\"\n cursor={canDrag ? \"grab\" : \"default\"}\n disabled={!canDrag}\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", item.id);\n onDragStart(item.id);\n }}\n onDragEnd={onDragEnd}\n >\n <ChakraIcon as={GripVertical} boxSize=\"14px\" />\n </IconButton>\n <Stack gap=\"2xs\" flex=\"1\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\" lineClamp={2} minWidth=\"0\">\n {item.prompt}\n </Text>\n {item.attachments?.length ? (\n <Badge width=\"fit-content\" size=\"sm\" variant=\"outline\" colorPalette=\"gray\">\n {item.attachments.length} attachments\n </Badge>\n ) : null}\n </Stack>\n <HStack gap=\"2xs\" flexShrink={0}>\n {canEdit ? (\n <IconButton size=\"2xs\" variant=\"ghost\" aria-label=\"Edit queued follow-up\" onClick={() => onEdit?.(item)}>\n <ChakraIcon as={Pencil} boxSize=\"14px\" />\n </IconButton>\n ) : null}\n {canRemove ? (\n <IconButton\n size=\"2xs\"\n variant=\"ghost\"\n aria-label=\"Remove queued follow-up\"\n colorPalette=\"red\"\n onClick={() => onRemove?.(item.id)}\n >\n <ChakraIcon as={Trash2} boxSize=\"14px\" />\n </IconButton>\n ) : null}\n </HStack>\n </HStack>\n </Box>\n );\n};\n\nexport const QueuedFollowUpList = (props: QueuedFollowUpListProps) => {\n const { items, editingItemId, onEdit, onRemove, onMove } = props;\n const [draggedItemId, setDraggedItemId] = useState<string | null>(null);\n const [dragTargetItemId, setDragTargetItemId] = useState<string | null>(null);\n if (items.length === 0) return null;\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>, itemId: string) => {\n if (!draggedItemId || draggedItemId === itemId) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDragTargetItemId(itemId);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>, itemId: string) => {\n event.preventDefault();\n const sourceItemId = draggedItemId ?? event.dataTransfer.getData(\"text/plain\");\n setDraggedItemId(null);\n setDragTargetItemId(null);\n if (!sourceItemId || sourceItemId === itemId) return;\n\n const sourceIndex = items.findIndex((item) => item.id === sourceItemId);\n const targetIndex = items.findIndex((item) => item.id === itemId);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) return;\n\n const direction: QueuedFollowUpMoveDirection = targetIndex < sourceIndex ? \"up\" : \"down\";\n onMove?.(sourceItemId, direction, Math.abs(targetIndex - sourceIndex));\n };\n\n return (\n <Stack\n gap=\"2xs\"\n paddingX=\"0\"\n paddingY=\"xs\"\n borderWidth=\"1px\"\n borderBottomWidth=\"0\"\n borderColor=\"border\"\n borderTopRadius=\"xs\"\n background=\"bg\"\n >\n {items.map((item, index) => (\n <QueuedFollowUpRow\n key={item.id}\n item={item}\n index={index}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n isEditing={editingItemId === item.id}\n isDragTarget={dragTargetItemId === item.id}\n onEdit={onEdit}\n onRemove={onRemove}\n onDragStart={setDraggedItemId}\n onDragEnd={() => {\n setDraggedItemId(null);\n setDragTargetItemId(null);\n }}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n />\n ))}\n </Stack>\n );\n};\n","import { HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// Compact, unit-dropping elapsed format: \"4s\", \"48s\", \"10m 20s\", \"1h 04m\".\nconst formatElapsed = (totalSeconds: number) => {\n const seconds = Math.max(0, Math.floor(totalSeconds));\n if (seconds < 60) return `${seconds}s`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ${String(seconds % 60).padStart(2, \"0\")}s`;\n\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${String(minutes % 60).padStart(2, \"0\")}m`;\n};\n\n/**\n * Working indicator: a spinner followed by the elapsed run time in mono digits — never a\n * static \"Working…\" label. The elapsed time is the one thing a static label cannot tell you\n * and how you judge whether a run is stuck. Counts from the start of the active stream, including\n * time spent temporarily hidden while the workspace initializes.\n */\nexport const WorkingIndicator = (props: { hidden?: boolean }) => {\n const { hidden = false } = props;\n const [elapsedSeconds, setElapsedSeconds] = useState(0);\n const startedAtRef = useRef(Date.now());\n\n useEffect(() => {\n if (hidden) return;\n\n const updateElapsed = () => setElapsedSeconds((Date.now() - startedAtRef.current) / 1000);\n updateElapsed();\n const timer = setInterval(updateElapsed, 1000);\n return () => clearInterval(timer);\n }, [hidden]);\n\n if (hidden) return null;\n\n return (\n <HStack gap=\"2xs\" px=\"sm\" py=\"xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text fontFamily=\"mono\" fontSize=\"xs\" color=\"fg.muted\" letterSpacing=\"-0.2px\">\n {formatElapsed(elapsedSeconds)}\n </Text>\n </HStack>\n );\n};\n","import { Flex, Stack } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useEffect, useState } from \"react\";\nimport { EmptyState } from \"@/components/primitives/empty-state\";\nimport type { ReferenceItem } from \"@/components/rich-text\";\nimport { resolveActiveQuestionPrompt } from \"../tool-rendering/question-prompt\";\nimport { createSerializedPromptState } from \"../utils/editor-state\";\nimport { ChatPrimitives } from \"./ai-conversation\";\nimport { AutoScroll } from \"./auto-scroll\";\nimport { ChatInput } from \"./chat-input\";\nimport type { ChatInputQuestionPrompt, ChatInputQuestionResponse } from \"./chat-input-question-prompt\";\nimport { ChatMessageList } from \"./chat-message-list\";\nimport {\n groupMessagesByTurn,\n normalizeChatMessagesForDisplay,\n type QueuedFollowUp,\n type SessionMessage,\n} from \"./message-types\";\nimport { QueuedFollowUpList } from \"./queued-follow-up-list\";\nimport type { QueuedFollowUpMoveDirection } from \"./queued-follow-up-list-state\";\nimport { WorkingIndicator } from \"./working-indicator\";\n\ninterface QueuedFollowUpComposerInput {\n queuedFollowUps: QueuedFollowUp[];\n defaultValue: string;\n onChange?: (text: string) => void;\n onSubmit?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onUpdate?: (itemId: string, prompt: string) => void;\n}\n\ninterface ChatPanelComposerProps {\n actions?: ReactNode;\n attachedResources?: string[];\n attachmentList?: ReactNode;\n chatInputAutoFocus: boolean;\n chatInputPlaceholder: string;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputReferences: ReferenceItem[];\n hasWorkspaceHub: boolean;\n inputDisabled: boolean;\n submitDisabled: boolean;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n onClearAttachments?: () => void;\n onInterrupt?: () => void;\n onQueuedFollowUpMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n onQueuedFollowUpRemove?: (itemId: string) => void;\n onQueuedFollowUpUpdate?: (itemId: string, prompt: string) => void;\n queuedComposer: ReturnType<typeof useQueuedFollowUpComposer>;\n queuedFollowUps: QueuedFollowUp[];\n streaming: boolean;\n workspaceHub?: ReactNode;\n}\n\n/** Full conversation shell for agent sessions, including messages, input, attachments, and host-provided slots. */\nexport interface ChatPanelProps {\n /** Stable conversation identity used to reset ready state when switching sessions. */\n conversationKey?: string;\n messages: SessionMessage[];\n loading?: boolean;\n streaming?: boolean;\n emptyStateTitle: string;\n emptyStateDescription: string;\n emptyStateContent?: ReactNode;\n loaderComponent?: ReactNode;\n chatInputPlaceholder: string;\n chatInputDefaultValue?: string;\n onSubmitMessage?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputChange?: (text: string) => void;\n /** Extra controls rendered in the chat input toolbar (attach, model, params). */\n actions?: ReactNode;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n attachmentList?: ReactNode;\n approvalPrompt?: ReactNode;\n /** Optional workspace status/control surface rendered above the conversation viewport. */\n workspaceHub?: ReactNode;\n workspaceInitializing?: boolean;\n inputDisabled?: boolean;\n /** Blocks sending while the editor stays usable, for example while no model is selected. */\n submitDisabled?: boolean;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\n queuedFollowUps?: QueuedFollowUp[];\n onQueuedFollowUpUpdate?: (itemId: string, prompt: string) => void;\n onQueuedFollowUpRemove?: (itemId: string) => void;\n onQueuedFollowUpMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n chatInputReferences?: ReferenceItem[];\n onChatInputAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n}\n\nconst useQueuedFollowUpComposer = (input: QueuedFollowUpComposerInput) => {\n const { queuedFollowUps, defaultValue, onChange, onSubmit, onUpdate } = input;\n const [editingItemId, setEditingItemId] = useState<string | null>(null);\n const [editSeed, setEditSeed] = useState(\"\");\n const [focusSignal, setFocusSignal] = useState(0);\n const inputValue = editingItemId ? editSeed : defaultValue;\n\n useEffect(() => {\n if (!editingItemId) return;\n if (queuedFollowUps.some((item) => item.id === editingItemId)) return;\n setEditingItemId(null);\n setEditSeed(\"\");\n }, [editingItemId, queuedFollowUps]);\n\n const edit = (item: QueuedFollowUp) => {\n setEditingItemId(item.id);\n setEditSeed(item.prompt);\n setFocusSignal((signal) => signal + 1);\n };\n\n const change = (text: string) => {\n if (editingItemId) return;\n onChange?.(text);\n };\n\n const submit = (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => {\n if (editingItemId) {\n onUpdate?.(editingItemId, text);\n setEditingItemId(null);\n setEditSeed(\"\");\n return;\n }\n\n return onSubmit?.(text, attachments, questionResponse);\n };\n\n return { change, edit, editingItemId, focusSignal, inputValue, isEditing: Boolean(editingItemId), submit };\n};\n\nconst ChatPanelComposer = (props: ChatPanelComposerProps) => {\n const {\n actions,\n attachedResources,\n attachmentList,\n chatInputAutoFocus,\n chatInputPlaceholder,\n chatInputQuestionPrompt,\n chatInputReferences,\n hasWorkspaceHub,\n inputDisabled,\n submitDisabled,\n onAttachFiles,\n onAttachText,\n onChatInputAddReference,\n onClearAttachments,\n onInterrupt,\n onQueuedFollowUpMove,\n onQueuedFollowUpRemove,\n onQueuedFollowUpUpdate,\n queuedComposer,\n queuedFollowUps,\n streaming,\n workspaceHub,\n } = props;\n const hasQueuedFollowUps = queuedFollowUps.length > 0;\n\n return (\n <Stack px={hasWorkspaceHub ? \"2xs\" : \"xs\"} gap=\"0\">\n {/* Concentric hierarchy: the hub shell owns the visible border so the session reads\n as living inside the workspace; the nested input recedes to border.subtle. */}\n <Stack\n gap={hasWorkspaceHub ? \"2xs\" : \"0\"}\n p={hasWorkspaceHub ? \"2xs\" : undefined}\n borderWidth={hasWorkspaceHub ? \"1px\" : undefined}\n borderColor={hasWorkspaceHub ? \"border\" : undefined}\n borderRadius={hasWorkspaceHub ? \"sm\" : undefined}\n bg={hasWorkspaceHub ? \"bg.subtle\" : undefined}\n >\n {workspaceHub}\n <QueuedFollowUpList\n items={queuedFollowUps}\n editingItemId={queuedComposer.editingItemId}\n onEdit={onQueuedFollowUpUpdate ? queuedComposer.edit : undefined}\n onRemove={onQueuedFollowUpRemove}\n onMove={onQueuedFollowUpMove}\n />\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(queuedComposer.inputValue)}\n streaming={streaming}\n onSubmit={queuedComposer.submit}\n onInterrupt={onInterrupt}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChange={queuedComposer.change}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n submitDisabled={submitDisabled}\n attachedToTop={hasQueuedFollowUps}\n recessed={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n focusSignal={queuedComposer.focusSignal}\n submitTitle={queuedComposer.isEditing ? \"Save queued follow-up\" : undefined}\n references={chatInputReferences}\n onAddReference={onChatInputAddReference}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const ChatPanel = (props: ChatPanelProps) => {\n const {\n conversationKey,\n messages,\n loading = false,\n streaming = false,\n emptyStateTitle,\n emptyStateDescription,\n emptyStateContent,\n loaderComponent,\n chatInputPlaceholder,\n chatInputDefaultValue = \"\",\n onSubmitMessage,\n onInterrupt,\n onAttachFiles,\n onAttachText,\n onChatInputChange,\n actions,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n submitDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n queuedFollowUps = [],\n onQueuedFollowUpUpdate,\n onQueuedFollowUpRemove,\n onQueuedFollowUpMove,\n chatInputReferences = [],\n onChatInputAddReference,\n } = props;\n\n const merged = normalizeChatMessagesForDisplay(messages, { streaming });\n const hasMessages = merged.length > 0;\n const messageListKey = conversationKey ?? merged[0]?.id;\n const messageListIdentity = hasMessages ? (messageListKey ?? \"active-conversation\") : null;\n const userMessageCount = merged.reduce((count, message) => count + (message.role === \"user\" ? 1 : 0), 0);\n const { groups, leadingResponses } = groupMessagesByTurn(merged);\n const [expandedStickyMessageIds, setExpandedStickyMessageIds] = useState(() => new Set<string>());\n const [readyMessageListKey, setReadyMessageListKey] = useState<string | null>(null);\n const showLoadingState = !hasMessages && loading;\n const defaultEmptyContent = (\n <EmptyState\n icon={<MessageCircleIcon size={48} strokeWidth={1.5} />}\n title={emptyStateTitle}\n description={emptyStateDescription}\n />\n );\n const emptyContent = showLoadingState ? loaderComponent : (emptyStateContent ?? defaultEmptyContent);\n const hasWorkspaceHub = Boolean(workspaceHub);\n const activeQuestionPrompt = chatInputQuestionPrompt ?? resolveActiveQuestionPrompt(messages);\n const hideActiveQuestionForms = Boolean(activeQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing && !activeQuestionPrompt;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\n const queuedComposer = useQueuedFollowUpComposer({\n queuedFollowUps,\n defaultValue: chatInputDefaultValue,\n onChange: onChatInputChange,\n onSubmit: onSubmitMessage,\n onUpdate: onQueuedFollowUpUpdate,\n });\n\n const toggleStickyMessageExpanded = (messageId: string) => {\n setExpandedStickyMessageIds((current) => {\n const next = new Set(current);\n if (next.has(messageId)) {\n next.delete(messageId);\n } else {\n next.add(messageId);\n }\n\n return next;\n });\n };\n\n return (\n <Flex position=\"relative\" direction=\"column\" w=\"full\" h=\"full\" overflow=\"hidden\">\n <ChatPrimitives.Root>\n <AutoScroll conversationKey={messageListKey ?? null} userMessageCount={userMessageCount} />\n <ChatPrimitives.Viewport visibility={isMessageViewportReady ? \"visible\" : \"hidden\"}>\n {hasMessages ? (\n <ChatMessageList\n key={messageListIdentity}\n leadingResponses={leadingResponses}\n groups={groups}\n streaming={streaming}\n hideActiveQuestionForms={hideActiveQuestionForms}\n expandedStickyMessageIds={expandedStickyMessageIds}\n onToggleStickyMessage={toggleStickyMessageExpanded}\n onReady={() => setReadyMessageListKey(messageListIdentity)}\n />\n ) : (\n emptyContent\n )}\n </ChatPrimitives.Viewport>\n {isMessageViewportReady ? <ChatPrimitives.ScrollToBottom aria-label=\"Scroll to latest message\" /> : null}\n </ChatPrimitives.Root>\n {approvalPrompt}\n {streaming ? <WorkingIndicator hidden={!showThinkingIndicator} /> : null}\n <ChatPanelComposer\n actions={actions}\n attachedResources={attachedResources}\n attachmentList={attachmentList}\n chatInputAutoFocus={chatInputAutoFocus}\n chatInputPlaceholder={chatInputPlaceholder}\n chatInputQuestionPrompt={activeQuestionPrompt}\n chatInputReferences={chatInputReferences}\n hasWorkspaceHub={hasWorkspaceHub}\n inputDisabled={inputDisabled}\n submitDisabled={submitDisabled}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChatInputAddReference={onChatInputAddReference}\n onClearAttachments={onClearAttachments}\n onInterrupt={onInterrupt}\n onQueuedFollowUpMove={onQueuedFollowUpMove}\n onQueuedFollowUpRemove={onQueuedFollowUpRemove}\n onQueuedFollowUpUpdate={onQueuedFollowUpUpdate}\n queuedComposer={queuedComposer}\n queuedFollowUps={queuedFollowUps}\n streaming={streaming}\n workspaceHub={workspaceHub}\n />\n </Flex>\n );\n};\n","import { Skeleton, Stack } from \"@chakra-ui/react\";\nimport { ChatMessage } from \"./ai-message\";\n\nconst renderSkeletonLines = (widths: string[]) => (\n <Stack gap=\"xs\" w=\"full\">\n {widths.map((width, index) => (\n <Skeleton key={`${width}-${index}`} height=\"3\" width={width} borderRadius=\"xs\" />\n ))}\n </Stack>\n);\n\nexport const ChatSkeleton = () => {\n return (\n <Stack minH=\"full\" py=\"xs\" gap=\"0\">\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content from=\"user\">{renderSkeletonLines([\"72%\", \"46%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n <ChatMessage.Root from=\"assistant\">\n <ChatMessage.Content from=\"assistant\">{renderSkeletonLines([\"76%\", \"62%\", \"40%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n </Stack>\n );\n};\n","import { Box, chakra, Flex, Portal, Stack, Text } from \"@chakra-ui/react\";\nimport { type PointerEvent, useState } from \"react\";\n\nexport interface ConversationBrowseItem {\n /** Turn id used to scroll the log to this user message. */\n id: string;\n /** The user message this tick indexes (shown in the hover card). */\n message: string;\n /** Optional assistant reply preview; hidden for a turn not yet answered. */\n reply?: string;\n}\n\ninterface ConversationBrowseProps {\n items: ConversationBrowseItem[];\n onSelect?: (id: string) => void;\n /** Overlay the log's left edge with a scrim instead of reserving a gutter (panels under ~480px). */\n floating?: boolean;\n}\n\n// The rail is a lens, not a chart: tick length encodes distance from the pointer, never content.\nconst MIN_USER_MESSAGES = 3;\nconst TICK_MIN_WIDTH = 10;\nconst TICK_MAX_WIDTH = 26;\nconst LENS_RADIUS = 4;\n\ninterface BrowseCardPosition {\n left: number;\n top: number;\n}\n\n// Raised-cosine falloff over LENS_RADIUS neighbours: 1 at the pointer, 0 at the edge of the lens.\nconst lensFactor = (index: number, pointerIndex: number | null) => {\n if (pointerIndex === null) return 0;\n const distance = Math.abs(index - pointerIndex);\n if (distance >= LENS_RADIUS) return 0;\n return (1 + Math.cos((Math.PI * distance) / LENS_RADIUS)) / 2;\n};\n\nconst tickColor = (index: number, pointerIndex: number | null) => {\n if (pointerIndex === null) return \"fg.subtle\";\n const distance = Math.abs(index - pointerIndex);\n if (distance < 0.5) return \"fg\";\n if (distance < LENS_RADIUS) return \"fg.muted\";\n return \"fg.subtle\";\n};\n\nconst ConversationBrowseCard = (props: { item: ConversationBrowseItem; position: BrowseCardPosition }) => {\n const { item, position } = props;\n\n return (\n <Portal>\n <Box\n position=\"fixed\"\n left={`${position.left}px`}\n ml=\"2xs\"\n top={`${position.top}px`}\n transform=\"translateY(-50%)\"\n w=\"80\"\n maxW=\"80\"\n zIndex=\"popover\"\n pointerEvents=\"none\"\n >\n <Stack gap=\"1.5\" p=\"3\" bg=\"bg.elevated\" borderWidth=\"1px\" borderColor=\"border\" borderRadius=\"lg\">\n <Text textStyle=\"label/S/medium\" color=\"fg\" lineClamp={2}>\n {item.message}\n </Text>\n {item.reply ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\" lineClamp={2}>\n {item.reply}\n </Text>\n ) : null}\n </Stack>\n </Box>\n </Portal>\n );\n};\n\n/**\n * ChatBrowse — the conversation scrubber for the chat log's left gutter. One tick per user\n * message, in order; the ticks nearest the pointer swell into a lens (growing along X only, so\n * the row you aim at never moves), and the active tick raises a preview card. Clicking a tick\n * selects that turn. Hidden below a few messages, where a gutter costs space and buys nothing.\n */\nexport const ConversationBrowse = (props: ConversationBrowseProps) => {\n const { items, onSelect, floating = false } = props;\n const [pointerIndex, setPointerIndex] = useState<number | null>(null);\n const [cardPosition, setCardPosition] = useState<BrowseCardPosition | null>(null);\n\n if (items.length < MIN_USER_MESSAGES) return null;\n\n const handlePointerMove = (event: PointerEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const fraction = (event.clientY - rect.top) / rect.height;\n const next = Math.min(items.length - 1, Math.max(0, fraction * items.length - 0.5));\n const nextActiveIndex = Math.round(next);\n setPointerIndex(next);\n setCardPosition({\n left: rect.right,\n top: rect.top + ((nextActiveIndex + 0.5) / items.length) * rect.height,\n });\n };\n\n const activeIndex = pointerIndex === null ? null : Math.round(pointerIndex);\n const activeItem = activeIndex === null ? null : items[activeIndex];\n\n return (\n <Box position=\"relative\" w=\"10\" flexShrink={0}>\n <Flex\n direction=\"column\"\n align=\"flex-start\"\n gap=\"1.5\"\n px=\"1.5\"\n py=\"2\"\n w=\"10\"\n onPointerMove={handlePointerMove}\n onPointerLeave={() => setPointerIndex(null)}\n {...(floating\n ? {\n position: \"absolute\",\n insetInlineStart: 0,\n top: 0,\n bottom: 0,\n // The scrim must be the surface the rail covers — the panel's own bg, never a lighter tone.\n bg: \"bg\",\n }\n : {})}\n >\n {items.map((item, index) => (\n <chakra.button\n type=\"button\"\n key={item.id}\n h=\"2px\"\n w={`${TICK_MIN_WIDTH + (TICK_MAX_WIDTH - TICK_MIN_WIDTH) * lensFactor(index, pointerIndex)}px`}\n bg={tickColor(index, pointerIndex)}\n borderRadius=\"1px\"\n transition=\"width 80ms linear, background-color 80ms linear\"\n aria-label={`Jump to message ${index + 1}`}\n onClick={() => onSelect?.(item.id)}\n />\n ))}\n </Flex>\n {activeItem && cardPosition ? <ConversationBrowseCard item={activeItem} position={cardPosition} /> : null}\n </Box>\n );\n};\n","import { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n /** Workspace identity/selector shown at the start of the header (e.g. GitBranch + name). */\n workspaceControl?: ReactNode;\n additions: number;\n deletions: number;\n /** Icon-only action that opens the workspace resource. */\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nconst HubStatus = (props: {\n status: WorkspaceHubStatus;\n statusLabel?: string;\n additions: number;\n deletions: number;\n}) => {\n const { status, statusLabel, additions, deletions } = props;\n\n if (status === \"loading\") {\n return (\n <HStack gap=\"2xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n );\n }\n\n if (status === \"error\") {\n return (\n <HStack gap=\"2xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n );\n }\n\n // Ready: the diff counts take the slot, and only when there is something to show.\n if (additions <= 0 && deletions <= 0) return null;\n\n return (\n <HStack gap=\"2xs\">\n <Text textStyle=\"label/XS/medium\" color=\"fg.success\">\n +{additions}\n </Text>\n <Text textStyle=\"label/XS/medium\" color=\"fg.error\">\n −{deletions}\n </Text>\n </HStack>\n );\n};\n\n/**\n * Workspace hub header: the frame the session sits in. The identity is always present;\n * the slot beside it carries the diff counts, or the setup status while the workspace is\n * being created or has failed. The open action recedes during setup.\n */\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { workspaceControl, additions, deletions, action, status = \"ready\", statusLabel } = props;\n\n return (\n <Flex align=\"center\" justify=\"space-between\" gap=\"sm\" minW=\"0\" pl=\"xs\" pr=\"2xs\" py=\"2xs\">\n <HStack gap=\"sm\" minW=\"0\">\n {workspaceControl}\n <HubStatus status={status} statusLabel={statusLabel} additions={additions} deletions={deletions} />\n </HStack>\n {action ? <Flex flexShrink={0}>{action}</Flex> : null}\n </Flex>\n );\n};\n"],"names":["conversationRootDefaultProps","initial","resize","role","ConversationRoot","chakra","StickToBottomEl","base","position","flex","overflow","height","forwardProps","defaultProps","ConversationContent","props","$","_c","children","rest","contentRef","scrollRef","useStickToBottomContext","t0","t1","t2","t3","Symbol","for","zIndex","py","t4","ScrollArea","conversationScrollButtonContainerDefaultProps","axis","bottom","ConversationScrollButton","isAtBottom","scrollToBottom","jsx","AbsoluteCenter","IconButton","ArrowDownIcon","ChatPrimitives","Root","Viewport","ScrollToBottom","recipe","defineSlotRecipe","className","slots","root","display","width","alignItems","justifyContent","gap","mb","content","flexDirection","textStyle","borderRadius","variants","from","user","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderColor","bg","px","assistant","developer","size","sm","md","lg","shape","rounded","pill","square","defaultVariants","withProvider","withContext","createSlotRecipeContext","MessageRoot","MessageContent","ChatMessage","Content","formatToolInput","input","text","JSON","stringify","length","slice","ApprovalPrompt","toolName","toolInput","onApprove","onDeny","formattedInput","jsxs","Text","Code","ShieldX","Button","t5","ShieldCheck","t6","t7","HStack","t8","Box","Flex","DEFAULT_SIZE","DEFAULT_TONE","AttachmentList","attachments","onSelect","onRemove","renderBadge","tone","undefined","attachment","select","remove","rendered","attachmentId","Fragment","ResourceBadge","map","Stack","shouldAutoScroll","args","previousUserMessageCount","userMessageCount","getNextAutoScrollState","conversationKey","state","shouldScroll","Math","max","scrollForNextAutoScrollState","next","AutoScroll","stateRef","useRef","current","useEffect","hasMessageText","trim","resolveChatInputKeyboardAction","canSubmit","isDisabled","resolveChatInputButtonAction","canInterrupt","hasQuestionPrompt","streaming","DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD","shouldAttachPastedText","lineThreshold","split","createAttachmentEventHandlers","onAttachFiles","onAttachText","textAttachmentPasteLineThreshold","onDragOver","event","Array","dataTransfer","types","includes","preventDefault","onDropCapture","files","onPasteCapture","clipboardData","pastedText","getData","preventSubmit","QuestionOptionContent","option","label","description","QuestionCheckboxOptionRow","name","checked","editable","onToggle","tabIndex","Checkbox","QuestionRadioOptions","question","questionIndex","selectedOption","onToggleOption","details","value","options","Radio","RadioGroup","TodoListBlockView","items","_temp","QuestionFormBlockView","questions","selectedOptionsByQuestion","customAnswersByQuestion","onCustomAnswerChange","id","inputType","multiple","selectedOptions","allowCustomAnswer","Textarea","currentTarget","item","index","getQuestionSelectionKey","toggleQuestionOptionSelection","optionLabel","key","selected","alreadySelected","filter","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","selectedLabels","customAnswer","answers","push","join","isCustomAnswersByQuestion","toCustomAnswersByQuestion","answerInput","trimmed","buildQuestionResponse","legacyText","hasCustomQuestions","some","buildQuestionAnswerValues","hasMissingRequiredQuestionAnswer","toQuestionFormQuestions","hasQuestionAnswer","QuestionStepTab","sourceQuestion","isActive","onSelectStep","isAnswered","stepStateLabel","tabVariant","Check","Tooltip","QuestionPromptStepper","activeQuestionIndex","setActiveQuestionIndex","useState","renderQuestionIndex","min","activeQuestion","hasMultipleQuestions","_question","_questionIndex","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","COMPOSER_CONTROL_HEIGHT","SendButton","shortcut","title","ariaLabel","Pause","ArrowUp","icon","button","Kbd","tooltipContent","Portal","ChatInputPlaceholder","placeholder","selectedChatInputBorderColor","focusPromptEditor","container","querySelector","HTMLElement","focus","requestPromptEditorFocus","onFocus","requestAnimationFrame","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","submitDisabled","onChange","attachmentList","actions","attachedToTop","recessed","autoFocus","focusSignal","submitTitle","references","onAddReference","restingBorderColor","submitting","setSubmitting","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","setText","getTextFromSerializedEditorState","setSelectedOptionsByQuestion","setCustomAnswersByQuestion","containerRef","onChangeRef","previousQuestionPromptSignatureRef","resetText","handle","cancelAnimationFrame","handleContainerClick","resetEditor","shouldFocus","responseText","hasMissingRequiredSelection","actionState","buttonAction","messageTitle","submitMessage","questionResponse","runAction","action","attachmentEventHandlers","toggleQuestionOption","updateQuestionCustomAnswer","pr","PromptEditor","t","Spacer","isRecord","isArray","parseJsonObjectText","parsed","parse","toInputRecord","getStringValue","getQuestionResponseText","stringValue","line","response","parseQuestionOption","parseQuestion","type","custom","parseQuestionPrompt","record","isQuestionTool","part","tool","toLowerCase","resolveActiveQuestionPrompt","messages","messageIndex","message","partIndex","parts","output","metadata","createSerializedPromptState","generateEditorStateFromString","messageFadeInProps","animationName","animationDuration","animationTimingFunction","getNextMessageAnimationState","animatedKeys","Set","seenKeys","itemKeys","initialized","has","add","itemKeysEqual","a","b","useMessageAnimationKeys","lastResultRef","isCopyablePart","getMessageCopyText","getMessageTimestampLabel","locale","timeZone","createdAt","Intl","DateTimeFormat","hour","minute","format","Date","MessageActionPanel","alwaysVisible","copyAlwaysVisible","isCopied","setIsCopied","copyResetTimeoutRef","copyText","timestampLabel","window","clearTimeout","navigator","clipboard","writeText","setTimeout","copyMessage","t10","messageActionPanelHoverStyles","Copy","t11","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","getToolNameLookupKeys","normalized","compact","toolIconMap","shell","Terminal","ls","ListTree","read_file","FileText","write_file","FilePen","delete_file","Trash2","patch","FileDiff","upload_files","FileUp","download_file","FileDown","move_file","Move","iconMap","dot","DotIcon","danger","AlertTriangle","search","Search","browser","Globe","file","File","CircleQuestionMark","todo","ListTodo","terminal","DEFAULT_TOOL_ICON","isToolIconName","Object","hasOwn","getIconComponent","toolTypeToIconName","basenameSafe","path","idx","lastIndexOf","normalizeHeaderPath","token","startsWith","isMinusHeader","isPlusHeader","isHunkHeader","isAddedLine","isDeletedLine","ensureFileChange","changes","filePath","set","additions","deletions","incrementAdditions","get","incrementDeletions","processUnifiedDiffLine","lastMinusHeader","inHunk","currentPath","parseUnifiedDiff","diffText","Map","entries","buildDiffTitleSegments","kind","fileName","extractDiffFilePaths","isDiffFileBoundary","isInvalidHunkBodyLine","appendHunkLine","original","modified","parseHunkBody","startIndex","parsePreview","oldHeader","nextIndex","preview","buildFileDiffPreviews","previews","i","TOOL_LABELS","apply_patch","bash","edit","glob","grep","read","skill","todowrite","STATE_LABELS","error","input_streaming","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","detailStyle","bold","muted","truncate","monospace","stateLabel","getInputObject","getOutputObject","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","parseApplyPatchMetadataFile","entry","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","parsedFile","getApplyPatchInputFilePaths","filePaths","change","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","variant","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","inputFilePaths","diffSegments","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","createQuestionRenderer","deps","prompt","block","fieldLabel","expandable","renderRead","renderCommand","command","outputText","code","stderr","exitCode","renderBash","renderShell","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","isBlankValue","every","values","getRecord","getString","getMediaType","mime_type","mediaType","mimeType","isImageMediaType","imageUrlPattern","getImageBlock","alt","data","src","url","test","getFileLikeOutput","filename","body","extensionLanguageBySuffix","css","html","js","json","ts","tsx","yaml","yml","getLanguageFromPath","extension","pop","createLabeledBlocks","buildBlocksForArrayValue","entryRecord","entryType","image","buildBlocksForValue","buildBlocksForFileLikeValue","fileLikeOutput","buildBlocksForAttachmentValue","attachmentName","attachment_name","attachment_file_id","attachmentFileId","imageBlock","fileBlocks","attachmentBlocks","buildGenericBlocks","toolLabel","createGenericItem","isVisibleTitleSegment","segment","isVisibleBlock","isVisibleItem","hasTitle","hasBlocks","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","buildTimelineDocFromInvocations","invocations","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","Timeline","ChakraTimeline","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","reactions","clap","Card","DiffEditor","Image","caption","render","ref","TimelineItemRow","itemKey","isOpen","canExpand","ChevronUpIcon","i_0","TimelineFromJSON","expanded","setExpanded","getKey","_temp2","prev","toggle","idx_0","key_0","it","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","filePartLabel","imageExtensionPattern","isImageFilePart","filePartThumbnail","openFilePart","open","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","fontSize","AlertMessage","Spinner","getMessageOrigin","isVisibleText","isVisibleAlert","isDisplayRenderablePart","isActivityPart","isActivityOnlyMessage","mergeBufferedActivity","first","flatMap","modelId","at","providerId","normalizeChatMessagesForDisplay","activityBuffer","clearActivityBuffer","displayParts","displayMessage","activity","trailingActivity","getAssistantMessageActionTargetId","lastMessage","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","ChatMessageListResponse","animate","showAssistantActions","showActions","StickyMessageToggle","onClick","actionPanel","STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT","STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT","SCROLL_BOUNDARY_EPSILON","getMessageTextMetrics","reduce","metrics","lineCount","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","scrollHeight","clientHeight","scrollTop","ESTIMATED_TURN_HEIGHT","INITIAL_TAIL_VIEWPORT_HEIGHT","TAIL_READY_STABLE_FRAME_COUNT","TAIL_READY_FRAME_LIMIT","TAIL_READY_PIXEL_EPSILON","VIRTUAL_LIST_OVERSCAN","VIRTUAL_LIST_GAP","buildMessageListItems","leadingActionMessageId","group","groupIndex","getEstimatedTailOffset","count","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","previous","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","actionMessageId","t12","t13","t14","t15","t16","t17","t18","t19","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","animatedItemKeys","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","QueuedFollowUpRow","isFirst","isLast","isEditing","isDragTarget","onEdit","onDragStart","onDragEnd","onDrop","canEdit","canRemove","canDrag","dragLabel","event_0","event_1","effectAllowed","setData","ChakraIcon","GripVertical","Badge","Pencil","QueuedFollowUpList","editingItemId","onMove","draggedItemId","setDraggedItemId","dragTargetItemId","setDragTargetItemId","itemId","dropEffect","handleDragOver","itemId_0","sourceItemId","sourceIndex","findIndex","targetIndex","item_0","direction","handleDrop","item_1","formatElapsed","totalSeconds","seconds","floor","minutes","String","padStart","WorkingIndicator","hidden","elapsedSeconds","setElapsedSeconds","now","startedAtRef","updateElapsed","timer","setInterval","clearInterval","useQueuedFollowUpComposer","queuedFollowUps","defaultValue","onUpdate","setEditingItemId","editSeed","setEditSeed","setFocusSignal","inputValue","text_0","submit","ChatPanelComposer","chatInputAutoFocus","chatInputPlaceholder","chatInputQuestionPrompt","chatInputReferences","hasWorkspaceHub","inputDisabled","onChatInputAddReference","onQueuedFollowUpMove","onQueuedFollowUpRemove","onQueuedFollowUpUpdate","queuedComposer","workspaceHub","hasQueuedFollowUps","ChatPanel","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputDefaultValue","onSubmitMessage","onChatInputChange","approvalPrompt","workspaceInitializing","hasMessages","messageListIdentity","messageListKey","merged","setExpandedStickyMessageIds","_temp3","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","activeQuestionPrompt","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","t20","t21","t22","t23","t24","t25","t26","signal","renderSkeletonLines","widths","Skeleton","ChatSkeleton","MIN_USER_MESSAGES","TICK_MIN_WIDTH","TICK_MAX_WIDTH","LENS_RADIUS","lensFactor","pointerIndex","distance","cos","PI","tickColor","ConversationBrowseCard","left","reply","ConversationBrowse","floating","setPointerIndex","cardPosition","setCardPosition","rect","getBoundingClientRect","fraction","clientY","nextActiveIndex","round","right","handlePointerMove","activeIndex","activeItem","insetInlineStart","HubStatus","statusLabel","ChatWorkspaceHub","workspaceControl"],"mappings":"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"}
1
+ {"version":3,"file":"chat-ui.js","sources":["../src/components/chat-ui/components/ai-conversation.tsx","../src/components/chat-ui/components/ai-message.tsx","../src/components/chat-ui/components/approval-prompt.tsx","../src/components/chat-ui/components/attachment-list.tsx","../src/components/chat-ui/components/auto-scroll.tsx","../src/components/chat-ui/components/chat-input-actions.ts","../src/components/chat-ui/components/chat-input-attachments.ts","../src/components/chat-ui/components/timeline-tool-blocks.tsx","../src/components/chat-ui/components/chat-input-question-prompt.tsx","../src/components/chat-ui/components/composer-constants.ts","../src/components/chat-ui/components/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/tool-rendering/question-prompt.ts","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-message-animation.ts","../src/components/chat-ui/components/message-action-panel.tsx","../src/components/chat-ui/components/ai-response.tsx","../src/components/chat-ui/utils/tool-name.ts","../src/components/chat-ui/utils/get-icon.ts","../src/components/chat-ui/utils/diff.ts","../src/components/chat-ui/tool-rendering/shared.ts","../src/components/chat-ui/tool-rendering/apply-patch-renderer.ts","../src/components/chat-ui/tool-rendering/edit-renderer.ts","../src/components/chat-ui/tool-rendering/question-renderer.ts","../src/components/chat-ui/tool-rendering/standard-renderers.ts","../src/components/chat-ui/tool-rendering/todowrite-renderer.ts","../src/components/chat-ui/tool-rendering/default-renderers.ts","../src/components/chat-ui/tool-rendering/build-timeline.ts","../src/components/chat-ui/components/timeline-title.tsx","../src/components/chat-ui/components/timeline.tsx","../src/components/chat-ui/components/tool-invocation-timeline.tsx","../src/components/chat-ui/components/message-parts-renderer.tsx","../src/components/chat-ui/components/message-types.ts","../src/components/chat-ui/components/chat-message-list-items.tsx","../src/components/chat-ui/components/chat-panel-sticky-user-message.ts","../src/components/chat-ui/components/chat-message-list.tsx","../src/components/chat-ui/components/queued-follow-up-list.tsx","../src/components/chat-ui/components/working-indicator.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.tsx","../src/components/chat-ui/components/conversation-browse.tsx","../src/components/chat-ui/components/workspace-hub.tsx"],"sourcesContent":["import type { HTMLChakraProps, IconButtonProps } from \"@chakra-ui/react\";\nimport { AbsoluteCenter, chakra, IconButton } from \"@chakra-ui/react\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport { StickToBottom as StickToBottomEl, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\n\nexport type ConversationRootProps = HTMLChakraProps<\"div\", React.ComponentProps<typeof StickToBottomEl>>;\n\nexport const conversationRootDefaultProps = {\n \"aria-roledescription\": \"conversation\",\n initial: \"instant\",\n resize: \"instant\",\n role: \"log\",\n} as const;\n\nexport const ConversationRoot = chakra(\n StickToBottomEl,\n {\n base: {\n position: \"relative\",\n flex: 1,\n overflow: \"hidden\",\n height: \"full\",\n },\n },\n {\n forwardProps: [\"initial\", \"resize\"],\n defaultProps: conversationRootDefaultProps,\n },\n);\n\nexport type ConversationContentProps = Omit<React.ComponentProps<typeof ScrollArea>, \"contentProps\" | \"viewportRef\">;\n\nexport const ConversationContent = (props: ConversationContentProps) => {\n const { children, ...rest } = props;\n const { contentRef, scrollRef } = useStickToBottomContext();\n\n return (\n <ScrollArea\n {...rest}\n height=\"full\"\n width=\"full\"\n showHorizontalScrollbar={false}\n viewportRef={scrollRef as React.Ref<HTMLDivElement>}\n contentRef={contentRef as React.Ref<HTMLDivElement>}\n verticalScrollbarProps={{ zIndex: 2 }}\n contentProps={{\n py: \"sm\",\n \"aria-live\": \"polite\",\n role: \"list\",\n }}\n >\n {children}\n </ScrollArea>\n );\n};\n\nexport type ConversationScrollButtonProps = IconButtonProps;\n\nexport const conversationScrollButtonContainerDefaultProps = {\n axis: \"horizontal\",\n bottom: \"md\",\n zIndex: 2,\n} as const;\n\nexport const ConversationScrollButton = (props: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n return (\n !isAtBottom && (\n <AbsoluteCenter {...conversationScrollButtonContainerDefaultProps}>\n <IconButton rounded=\"full\" onClick={() => scrollToBottom()} variant=\"outline\" size=\"xs\" {...props}>\n <ArrowDownIcon size={16} />\n </IconButton>\n </AbsoluteCenter>\n )\n );\n};\n\nexport const ChatPrimitives = {\n Root: ConversationRoot,\n Viewport: ConversationContent,\n ScrollToBottom: ConversationScrollButton,\n} as const;\n","import type { HTMLChakraProps, RecipeVariantProps } from \"@chakra-ui/react\";\nimport { createSlotRecipeContext, defineSlotRecipe } from \"@chakra-ui/react\";\n\nconst recipe = defineSlotRecipe({\n className: \"ai-message\",\n slots: [\"root\", \"content\"],\n base: {\n root: {\n display: \"flex\",\n width: \"full\",\n alignItems: \"end\",\n justifyContent: \"end\",\n gap: \"sm\",\n \"&:has(+ [data-scope='ai-message'][data-part='root'])\": {\n mb: 0,\n },\n },\n content: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"sm\",\n textStyle: \"sm\",\n overflow: \"hidden\",\n borderRadius: \"0\",\n },\n },\n variants: {\n from: {\n user: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n },\n content: {\n borderTopWidth: \"1px\",\n borderRightWidth: \"1px\",\n borderBottomWidth: \"1px\",\n borderLeftWidth: \"1px\",\n borderColor: \"border.subtle\",\n bg: \"bg.subtle\",\n px: \"xs\",\n py: \"xs\",\n width: \"full\",\n borderRadius: \"0\",\n },\n },\n assistant: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n justifyContent: \"start\",\n },\n content: {\n width: \"full\",\n px: \"xs\",\n },\n },\n developer: {\n root: {\n width: \"full\",\n flexDirection: \"row-reverse\",\n },\n content: {\n width: \"full\",\n },\n },\n },\n size: {\n sm: {\n root: { gap: \"xs\" },\n content: { textStyle: \"xs\" },\n },\n md: {},\n lg: {\n root: { gap: \"md\" },\n content: { textStyle: \"md\" },\n },\n },\n shape: {\n rounded: {\n content: { rounded: \"0\" },\n },\n pill: {\n content: { rounded: \"0\" },\n },\n square: {\n content: { rounded: \"0\" },\n },\n },\n },\n defaultVariants: {\n from: \"user\",\n size: \"md\",\n shape: \"rounded\",\n },\n});\n\nconst { withProvider, withContext } = createSlotRecipeContext({ recipe });\n\ntype VariantProps = RecipeVariantProps<typeof recipe>;\n\nexport interface MessageRootProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageRoot = withProvider<HTMLDivElement, MessageRootProps>(\"div\", \"root\");\n\nexport interface MessageContentProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageContent = withContext<HTMLDivElement, MessageContentProps>(\"div\", \"content\");\n\nexport const ChatMessage = {\n Root: MessageRoot,\n Content: MessageContent,\n} as const;\n","import { Box, Button, Code, Flex, HStack, Text } from \"@chakra-ui/react\";\nimport { ShieldCheck, ShieldX } from \"lucide-react\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\n\ninterface ApprovalPromptProps {\n toolName: string;\n toolInput?: unknown;\n onApprove: () => void;\n onDeny: () => void;\n}\n\nconst formatToolInput = (input: unknown) => {\n if (input == null) return null;\n\n const text = typeof input === \"string\" ? input : JSON.stringify(input, null, 2);\n if (text.length === 0) return null;\n\n const truncated = text.length > 200 ? `${text.slice(0, 200)}...` : text;\n return truncated;\n};\n\nexport const ApprovalPrompt = (props: ApprovalPromptProps) => {\n const { toolName, toolInput, onApprove, onDeny } = props;\n const formattedInput = formatToolInput(toolInput);\n\n return (\n <Box px=\"sm\" py=\"xs\" mx=\"sm\" borderWidth=\"1px\" borderColor=\"border.warning\" borderRadius=\"lg\" bg=\"bg.warning\">\n <Flex direction=\"column\" gap=\"xs\">\n <Text textStyle=\"label/S/medium\" color=\"fg\">\n Allow <Code size=\"sm\">{toolName}</Code>?\n </Text>\n\n {formattedInput ? (\n <ScrollArea maxH=\"6rem\">\n <Code size=\"sm\" whiteSpace=\"pre-wrap\" display=\"block\" width=\"100%\">\n {formattedInput}\n </Code>\n </ScrollArea>\n ) : null}\n\n <HStack gap=\"xs\" justifyContent=\"flex-end\">\n <Button size=\"xs\" variant=\"outline\" onClick={onDeny}>\n <ShieldX size={14} />\n Deny\n </Button>\n <Button size=\"xs\" colorPalette=\"green\" onClick={onApprove}>\n <ShieldCheck size={14} />\n Allow\n </Button>\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { Fragment } from \"react\";\nimport type { ResourceBadgeProps } from \"@/components/primitives/resource-badge\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\n\nexport type AttachmentListRenderBadge = (props: AttachmentListItemRenderProps) => ReactNode;\n\nexport interface AttachmentListItemRenderProps {\n attachmentId: string;\n onSelect?: () => void;\n onRemove?: () => void;\n size: ResourceBadgeProps[\"size\"];\n tone: ResourceBadgeProps[\"tone\"];\n}\n\nexport interface AttachmentListProps {\n attachments?: string[];\n onSelect?: (attachmentId: string) => void;\n onRemove?: (attachmentId: string) => void;\n renderBadge?: AttachmentListRenderBadge;\n size?: ResourceBadgeProps[\"size\"];\n tone?: ResourceBadgeProps[\"tone\"];\n}\n\nconst DEFAULT_SIZE: NonNullable<ResourceBadgeProps[\"size\"]> = \"md\";\nconst DEFAULT_TONE: NonNullable<ResourceBadgeProps[\"tone\"]> = \"neutral\";\n\n/**\n * Simple attachment list component that displays resource badges.\n *\n */\nexport const AttachmentList = (props: AttachmentListProps) => {\n const { attachments = [], onSelect, onRemove, renderBadge, size = DEFAULT_SIZE, tone = DEFAULT_TONE } = props;\n\n if (attachments.length === 0) return null;\n\n return (\n <Stack marginBottom=\"sm\" gap=\"1\" flexDir=\"row\" flexWrap=\"wrap\">\n {attachments.map((attachment) => {\n const select = onSelect ? () => onSelect(attachment) : undefined;\n const remove = onRemove ? () => onRemove(attachment) : undefined;\n\n if (renderBadge) {\n const rendered = renderBadge({ attachmentId: attachment, onSelect: select, onRemove: remove, size, tone });\n return <Fragment key={attachment}>{rendered}</Fragment>;\n }\n\n return (\n <ResourceBadge\n key={attachment}\n fileName={attachment}\n onSelect={select}\n onRemove={remove}\n size={size}\n tone={tone}\n />\n );\n })}\n </Stack>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport interface AutoScrollProps {\n userMessageCount: number;\n conversationKey?: string | null;\n}\n\ninterface ShouldAutoScrollArgs {\n previousUserMessageCount: number;\n userMessageCount: number;\n}\n\nexport interface AutoScrollState {\n conversationKey: string | null;\n userMessageCount: number;\n}\n\ninterface NextAutoScrollStateArgs {\n state: AutoScrollState;\n conversationKey?: string | null;\n userMessageCount: number;\n}\n\ninterface ScrollForNextAutoScrollStateArgs extends NextAutoScrollStateArgs {\n scrollToBottom: (animation?: \"instant\") => void;\n}\n\nexport const shouldAutoScroll = (args: ShouldAutoScrollArgs) => {\n const { previousUserMessageCount, userMessageCount } = args;\n\n if (previousUserMessageCount === 0) {\n return false;\n }\n\n return userMessageCount > previousUserMessageCount;\n};\n\nexport const getNextAutoScrollState = (args: NextAutoScrollStateArgs) => {\n const conversationKey = args.conversationKey ?? null;\n\n if (args.state.conversationKey !== conversationKey) {\n return {\n shouldScroll: false,\n state: {\n conversationKey,\n userMessageCount: args.userMessageCount,\n },\n };\n }\n\n return {\n shouldScroll: shouldAutoScroll({\n previousUserMessageCount: args.state.userMessageCount,\n userMessageCount: args.userMessageCount,\n }),\n state: {\n conversationKey,\n userMessageCount: Math.max(args.state.userMessageCount, args.userMessageCount),\n },\n };\n};\n\nexport const scrollForNextAutoScrollState = (args: ScrollForNextAutoScrollStateArgs) => {\n const next = getNextAutoScrollState(args);\n\n if (next.shouldScroll) {\n args.scrollToBottom(\"instant\");\n }\n\n return next;\n};\n\nexport function AutoScroll(props: AutoScrollProps) {\n const { conversationKey, userMessageCount } = props;\n const { scrollToBottom } = useStickToBottomContext();\n const stateRef = useRef<AutoScrollState>({\n conversationKey: conversationKey ?? null,\n userMessageCount,\n });\n\n useEffect(() => {\n const next = scrollForNextAutoScrollState({\n state: stateRef.current,\n conversationKey,\n userMessageCount,\n scrollToBottom,\n });\n\n stateRef.current = next.state;\n }, [conversationKey, userMessageCount, scrollToBottom]);\n\n return null;\n}\n","interface ChatInputActionState {\n canInterrupt: boolean;\n /** False while the runtime cannot accept a message, for example without a model. */\n canSubmit: boolean;\n hasQuestionPrompt: boolean;\n isDisabled: boolean;\n streaming: boolean;\n text: string;\n}\n\nexport type ChatInputAction = \"interrupt\" | \"none\" | \"submit\";\n\nconst hasMessageText = (text: string) => text.trim().length > 0;\n\nexport const resolveChatInputKeyboardAction = (state: ChatInputActionState): ChatInputAction => {\n const { canSubmit, isDisabled, text } = state;\n if (isDisabled || !canSubmit || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, canSubmit, hasQuestionPrompt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (canSubmit && hasMessageText(text)) return \"submit\";\n if (streaming && !hasQuestionPrompt) return canInterrupt ? \"interrupt\" : \"none\";\n return \"none\";\n};\n","import type { ClipboardEvent, DragEvent } from \"react\";\n\nexport const DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD = 200;\n\nexport const shouldAttachPastedText = (text: string, lineThreshold = DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD) =>\n text.length > 0 && text.split(/\\r\\n|\\r|\\n/).length > lineThreshold;\n\nexport const createAttachmentEventHandlers = (input: {\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n textAttachmentPasteLineThreshold: number;\n}) => {\n const { onAttachFiles, onAttachText, textAttachmentPasteLineThreshold } = input;\n\n const onPasteCapture = (event: ClipboardEvent<HTMLDivElement>) => {\n const files = Array.from(event.clipboardData.files ?? []);\n if (files.length > 0 && onAttachFiles) {\n event.preventDefault();\n onAttachFiles(files);\n return;\n }\n\n const pastedText = event.clipboardData.getData(\"text/plain\");\n if (onAttachText && shouldAttachPastedText(pastedText, textAttachmentPasteLineThreshold)) {\n event.preventDefault();\n onAttachText(pastedText);\n }\n };\n\n const onDropCapture = (event: DragEvent<HTMLDivElement>) => {\n const files = Array.from(event.dataTransfer.files ?? []);\n if (files.length === 0 || !onAttachFiles) return;\n\n event.preventDefault();\n onAttachFiles(files);\n };\n\n const onDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (!onAttachFiles || !Array.from(event.dataTransfer.types).includes(\"Files\")) return;\n event.preventDefault();\n };\n\n return { onDragOver, onDropCapture, onPasteCapture };\n};\n","import { Box, Stack, Text, Textarea } from \"@chakra-ui/react\";\nimport type { FormEvent } from \"react\";\nimport { Checkbox } from \"@/components/primitives/checkbox\";\nimport { Radio, RadioGroup } from \"@/components/primitives/radio\";\nimport type { QuestionFormBlockQuestion, TodoListBlockItem } from \"./timeline\";\n\nconst preventSubmit = (event: FormEvent) => {\n event.preventDefault();\n};\n\ninterface QuestionFormBlockViewProps {\n questions: QuestionFormBlockQuestion[];\n editable?: boolean;\n selectedOptionsByQuestion?: Record<string, string[]>;\n customAnswersByQuestion?: Record<string, string>;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange?: (question: QuestionFormBlockQuestion, questionIndex: number, answer: string) => void;\n}\n\nconst QuestionOptionContent = (props: { option: QuestionFormBlockQuestion[\"options\"][number] }) => {\n const { option } = props;\n\n return (\n <Stack gap=\"0\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\">\n {option.label}\n </Text>\n {option.description ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {option.description}\n </Text>\n ) : null}\n </Stack>\n );\n};\n\nconst QuestionCheckboxOptionRow = (props: {\n option: QuestionFormBlockQuestion[\"options\"][number];\n name: string;\n checked: boolean;\n editable: boolean;\n onToggle: () => void;\n}) => {\n const { option, name, checked, editable, onToggle } = props;\n\n return (\n <Checkbox\n name={name}\n checked={checked}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n onCheckedChange={editable ? onToggle : undefined}\n >\n <QuestionOptionContent option={option} />\n </Checkbox>\n );\n};\n\nconst QuestionRadioOptions = (props: {\n question: QuestionFormBlockQuestion;\n questionIndex: number;\n name: string;\n selectedOption?: string;\n editable: boolean;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n}) => {\n const { question, questionIndex, name, selectedOption, editable, onToggleOption } = props;\n\n return (\n <RadioGroup\n name={name}\n value={selectedOption ?? null}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"xs\"\n onValueChange={\n editable\n ? (details) => {\n if (details.value) onToggleOption?.(question, questionIndex, details.value);\n }\n : undefined\n }\n >\n {question.options.map((option) => (\n <Radio\n key={option.label}\n value={option.label}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n >\n <QuestionOptionContent option={option} />\n </Radio>\n ))}\n </RadioGroup>\n );\n};\n\nexport const TodoListBlockView = (props: { items: TodoListBlockItem[] }) => {\n const { items } = props;\n\n return (\n <Stack as=\"ul\" gap=\"0\" listStyleType=\"none\" margin=\"0\" padding=\"0\">\n {items.map((item, index) => (\n <Box as=\"li\" key={`${item.label}-${index}`}>\n <Checkbox checked={item.checked} readOnly aria-readonly=\"true\" inputProps={{ tabIndex: -1 }} size=\"xs\">\n <Text textStyle=\"label/XS/regular\" color=\"fg\">\n {item.label}\n </Text>\n </Checkbox>\n </Box>\n ))}\n </Stack>\n );\n};\n\nexport const QuestionFormBlockView = (props: QuestionFormBlockViewProps) => {\n const {\n questions,\n editable = false,\n selectedOptionsByQuestion = {},\n customAnswersByQuestion = {},\n onToggleOption,\n onCustomAnswerChange,\n } = props;\n\n return (\n <Stack as=\"form\" gap=\"sm\" onSubmit={preventSubmit} aria-label=\"Question form\">\n {questions.map((question, questionIndex) => {\n const name = question.id ?? `question-${questionIndex}`;\n const inputType = question.multiple ? \"checkbox\" : \"radio\";\n const selectedOptions = selectedOptionsByQuestion[name] ?? [];\n\n return (\n <Stack\n as=\"fieldset\"\n key={name}\n gap=\"xs\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"sm\"\n padding=\"sm\"\n minWidth=\"0\"\n >\n <Text as=\"legend\" textStyle=\"label/S/medium\" color=\"fg\" paddingX=\"2xs\">\n {question.question}\n </Text>\n {inputType === \"radio\" ? (\n <QuestionRadioOptions\n question={question}\n questionIndex={questionIndex}\n name={name}\n selectedOption={selectedOptions[0]}\n editable={editable}\n onToggleOption={onToggleOption}\n />\n ) : (\n question.options.map((option) => (\n <QuestionCheckboxOptionRow\n key={option.label}\n option={option}\n name={name}\n checked={selectedOptions.includes(option.label)}\n editable={editable}\n onToggle={() => onToggleOption?.(question, questionIndex, option.label)}\n />\n ))\n )}\n {question.allowCustomAnswer ? (\n <Textarea\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n value={customAnswersByQuestion[name] ?? \"\"}\n placeholder={editable ? \"Answer...\" : \"Custom answer\"}\n aria-label={question.question}\n rows={2}\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"sm\"\n padding=\"xs\"\n resize={editable ? \"vertical\" : \"none\"}\n color=\"fg\"\n onChange={(event) => onCustomAnswerChange?.(question, questionIndex, event.currentTarget.value)}\n />\n ) : null}\n </Stack>\n );\n })}\n </Stack>\n );\n};\n","import { Button, HStack, Stack } from \"@chakra-ui/react\";\nimport { Check } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { QuestionFormBlockView } from \"./timeline-tool-blocks\";\n\nexport interface ChatInputQuestionOption {\n label: string;\n description?: string;\n}\n\nexport interface ChatInputQuestion {\n id?: string;\n question: string;\n options: ChatInputQuestionOption[];\n multiple?: boolean;\n required?: boolean;\n allowCustomAnswer?: boolean;\n}\n\nexport interface ChatInputQuestionPrompt {\n questions: ChatInputQuestion[];\n}\n\nexport interface ChatInputQuestionResponse {\n answers: string[][];\n}\n\nexport type ChatInputQuestionCustomAnswers = Record<string, string>;\n\ninterface QuestionPromptControlsProps {\n questionPrompt: ChatInputQuestionPrompt;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onToggleOption: (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange: (question: ChatInputQuestion, questionIndex: number, answer: string) => void;\n}\n\ninterface QuestionPromptStepperProps extends QuestionPromptControlsProps {\n questions: ReturnType<typeof toQuestionFormQuestions>;\n}\n\nexport const getQuestionSelectionKey = (question: ChatInputQuestion, index: number) =>\n question.id ?? `question-${index}`;\n\n// Single-choice questions swap the answer; multiple-choice questions toggle one option.\nexport const toggleQuestionOptionSelection = (\n selectedOptionsByQuestion: Record<string, string[]>,\n question: ChatInputQuestion,\n questionIndex: number,\n optionLabel: string,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n const selected = selectedOptionsByQuestion[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n if (question.multiple) {\n return {\n ...selectedOptionsByQuestion,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n return { ...selectedOptionsByQuestion, [key]: alreadySelected ? [] : [optionLabel] };\n};\n\nexport const getQuestionPromptSignature = (questionPrompt: ChatInputQuestionPrompt | undefined) => {\n if (!questionPrompt) return \"\";\n\n return JSON.stringify(\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n options: question.options.map((option) => ({\n label: option.label,\n description: option.description ?? \"\",\n })),\n })),\n );\n};\n\nconst getQuestionAnswerLines = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const lines: string[] = [];\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n const answers = customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n if (answers.length === 0) continue;\n\n lines.push(`${question.question}: ${answers.join(\", \")}`);\n }\n\n return lines;\n};\n\nconst isCustomAnswersByQuestion = (\n value: ChatInputQuestionCustomAnswers | string,\n): value is ChatInputQuestionCustomAnswers => typeof value !== \"string\";\n\nconst toCustomAnswersByQuestion = (\n questionPrompt: ChatInputQuestionPrompt,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (isCustomAnswersByQuestion(answerInput)) return answerInput;\n\n const trimmed = answerInput.trim();\n if (trimmed.length === 0) return {};\n\n const answers: ChatInputQuestionCustomAnswers = {};\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.allowCustomAnswer) continue;\n answers[getQuestionSelectionKey(question, index)] = trimmed;\n }\n\n return answers;\n};\n\nexport const buildQuestionResponse = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n const lines = getQuestionAnswerLines(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion);\n const legacyText = typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n const hasCustomQuestions = questionPrompt.questions.some((question) => question.allowCustomAnswer);\n\n if (legacyText.length > 0 && !hasCustomQuestions) {\n lines.push(`Additional response: ${legacyText}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const buildQuestionAnswerValues = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n return questionPrompt.questions.map((question, index) => {\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n return customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n });\n};\n\nexport const hasMissingRequiredQuestionAnswer = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return false;\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.required) continue;\n\n const key = getQuestionSelectionKey(question, index);\n const hasSelectedOption = (selectedOptionsByQuestion[key] ?? []).length > 0;\n if (hasSelectedOption) continue;\n if (question.allowCustomAnswer && customAnswersByQuestion[key]?.trim()) continue;\n\n return true;\n }\n\n return false;\n};\n\nconst toQuestionFormQuestions = (questionPrompt: ChatInputQuestionPrompt) =>\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n options: question.options,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n }));\n\ntype QuestionFormQuestion = ReturnType<typeof toQuestionFormQuestions>[number];\n\ninterface QuestionStepTabProps {\n question: QuestionFormQuestion;\n sourceQuestion: ChatInputQuestion;\n questionIndex: number;\n isActive: boolean;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onSelectStep: (questionIndex: number) => void;\n}\n\nconst hasQuestionAnswer = (\n question: ChatInputQuestion,\n questionIndex: number,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n return (selectedOptionsByQuestion[key] ?? []).length > 0 || Boolean(customAnswersByQuestion[key]?.trim());\n};\n\nconst QuestionStepTab = (props: QuestionStepTabProps) => {\n const {\n question,\n sourceQuestion,\n questionIndex,\n isActive,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n onSelectStep,\n } = props;\n const isAnswered = hasQuestionAnswer(\n sourceQuestion,\n questionIndex,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const stepStateLabel = isAnswered ? \"answered\" : \"not answered\";\n const tabVariant = isActive ? \"outline\" : \"ghost\";\n\n return (\n <Tooltip content={question.question}>\n <Button\n id={`question-step-tab-${question.id}`}\n role=\"tab\"\n aria-label={`${question.question} (${stepStateLabel})`}\n aria-selected={isActive}\n aria-controls={`question-step-panel-${question.id}`}\n size=\"xs\"\n variant={tabVariant}\n minW=\"8\"\n onClick={() => onSelectStep(questionIndex)}\n >\n {isAnswered ? <Check aria-hidden=\"true\" /> : questionIndex + 1}\n </Button>\n </Tooltip>\n );\n};\n\nconst QuestionPromptStepper = (props: QuestionPromptStepperProps) => {\n const { questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion, onToggleOption, onCustomAnswerChange } =\n props;\n const { questions } = props;\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const renderQuestionIndex = Math.min(activeQuestionIndex, questions.length - 1);\n const activeQuestion = questions[renderQuestionIndex];\n const hasMultipleQuestions = questions.length > 1;\n\n return (\n <Stack gap=\"xs\" pb=\"sm\">\n {hasMultipleQuestions ? (\n <HStack role=\"tablist\" aria-label=\"Question steps\" gap=\"1\" minWidth=\"0\">\n {questions.map((question, questionIndex) => (\n <QuestionStepTab\n key={question.id}\n question={question}\n sourceQuestion={questionPrompt.questions[questionIndex]}\n questionIndex={questionIndex}\n isActive={questionIndex === renderQuestionIndex}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onSelectStep={setActiveQuestionIndex}\n />\n ))}\n </HStack>\n ) : null}\n <Stack\n id={`question-step-panel-${activeQuestion.id}`}\n role={hasMultipleQuestions ? \"tabpanel\" : undefined}\n aria-labelledby={hasMultipleQuestions ? `question-step-tab-${activeQuestion.id}` : undefined}\n gap=\"0\"\n >\n <QuestionFormBlockView\n questions={[activeQuestion]}\n editable\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={(_question, _questionIndex, optionLabel) => {\n onToggleOption(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, optionLabel);\n }}\n onCustomAnswerChange={(_question, _questionIndex, answer) => {\n onCustomAnswerChange(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, answer);\n }}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const QuestionPromptControls = (props: QuestionPromptControlsProps) => {\n const { questionPrompt } = props;\n const questions = toQuestionFormQuestions(questionPrompt);\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n return <QuestionPromptStepper key={questionPromptSignature} {...props} questions={questions} />;\n};\n","// Shared height for every composer control row (editor, attach, model, send).\n// Maps to the design's `composer-ctl-h` (28px = Chakra sizes token `7`), so the\n// editor row and the toolbar controls line up at one height.\nexport const COMPOSER_CONTROL_HEIGHT = \"7\";\n","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Pause } from \"lucide-react\";\n\nexport interface SendButtonProps extends IconButtonProps {\n shortcut?: string;\n title?: string;\n canInterrupt: boolean;\n}\n\nexport const SendButton = (props: SendButtonProps) => {\n const { title, shortcut, canInterrupt, ...rest } = props;\n const ariaLabel = rest[\"aria-label\"] ?? title;\n\n const icon = canInterrupt ? (\n <Pause size={16} strokeWidth={2} fill=\"currentColor\" />\n ) : (\n <ArrowUp size={16} strokeWidth={2} />\n );\n\n const button = (\n <IconButton\n data-testid=\"send-message-button\"\n size=\"xs\"\n variant=\"primary\"\n aria-label={ariaLabel}\n title={title}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n\n if (title) {\n const tooltipContent = shortcut ? (\n <>\n {title} <Kbd fontSize=\"xs\">{shortcut}</Kbd>\n </>\n ) : (\n title\n );\n\n return (\n <Tooltip.Root closeDelay={50} openDelay={100}>\n <Tooltip.Trigger asChild>{button}</Tooltip.Trigger>\n <Portal>\n <Tooltip.Positioner>\n <Tooltip.Content>{tooltipContent}</Tooltip.Content>\n </Tooltip.Positioner>\n </Portal>\n </Tooltip.Root>\n );\n }\n\n return button;\n};\n","import { Box, Flex, HStack, Spacer, Text } from \"@chakra-ui/react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport { getTextFromSerializedEditorState, PromptEditor, type ReferenceItem } from \"../../rich-text\";\nimport {\n type ChatInputAction,\n resolveChatInputButtonAction,\n resolveChatInputKeyboardAction,\n} from \"./chat-input-actions\";\nimport { createAttachmentEventHandlers, DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD } from \"./chat-input-attachments\";\nimport {\n buildQuestionAnswerValues,\n buildQuestionResponse,\n type ChatInputQuestion,\n type ChatInputQuestionCustomAnswers,\n type ChatInputQuestionPrompt,\n type ChatInputQuestionResponse,\n getQuestionPromptSignature,\n getQuestionSelectionKey,\n hasMissingRequiredQuestionAnswer,\n QuestionPromptControls,\n toggleQuestionOptionSelection,\n} from \"./chat-input-question-prompt\";\nimport { COMPOSER_CONTROL_HEIGHT } from \"./composer-constants\";\nimport { SendButton } from \"./send-button\";\n\nexport interface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n textAttachmentPasteLineThreshold?: number;\n streaming?: boolean;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n isDisabled?: boolean;\n /** Keeps the editor usable but blocks sending, for example while no model is selected. */\n submitDisabled?: boolean;\n onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n /** Recede the resting border to border.subtle when nested inside a stronger shell (the workspace hub). */\n recessed?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\n focusSignal?: number;\n submitTitle?: string;\n references?: ReferenceItem[];\n onAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n}\n\nconst ChatInputPlaceholder = (props: { placeholder?: string }) => {\n const { placeholder } = props;\n if (!placeholder) return null;\n\n return (\n <Text textStyle=\"label/M/regular\" color=\"fg.subtle\" pointerEvents=\"none\" position=\"absolute\" top=\"0\">\n {placeholder}\n </Text>\n );\n};\n\nconst selectedChatInputBorderColor = \"border.accent-light\";\n\nconst focusPromptEditor = (container: HTMLDivElement | null) => {\n const editable = container?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) editable.focus();\n};\n\nconst requestPromptEditorFocus = (container: HTMLDivElement | null, onFocus?: () => void) =>\n requestAnimationFrame(() => {\n focusPromptEditor(container);\n onFocus?.();\n });\n\nexport const ChatInput = (props: ChatInputProps) => {\n const {\n defaultState,\n onSubmit = () => {},\n onInterrupt,\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold = DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD,\n streaming = false,\n attachedResources = [],\n onClearAttachments,\n isDisabled = false,\n submitDisabled = false,\n onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n recessed = false,\n questionPrompt,\n autoFocus = false,\n focusSignal = 0,\n submitTitle,\n references = [],\n onAddReference,\n } = props;\n\n const restingBorderColor = recessed ? \"border.subtle\" : \"border\";\n const [submitting, setSubmitting] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [editorState, setEditorState] = useState(defaultState);\n const [editorKey, setEditorKey] = useState(0);\n const [text, setText] = useState(() => getTextFromSerializedEditorState(defaultState));\n const [selectedOptionsByQuestion, setSelectedOptionsByQuestion] = useState<Record<string, string[]>>({});\n const [customAnswersByQuestion, setCustomAnswersByQuestion] = useState<ChatInputQuestionCustomAnswers>({});\n const containerRef = useRef<HTMLDivElement | null>(null);\n const onChangeRef = useRef(onChange);\n const previousQuestionPromptSignatureRef = useRef(getQuestionPromptSignature(questionPrompt));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n const resetText = getTextFromSerializedEditorState(defaultState);\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n }, [defaultState]);\n\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n useEffect(() => {\n if (previousQuestionPromptSignatureRef.current === questionPromptSignature) return;\n previousQuestionPromptSignatureRef.current = questionPromptSignature;\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n }, [questionPromptSignature]);\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestPromptEditorFocus(containerRef.current, () => setIsSelected(true));\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n useEffect(() => {\n if (focusSignal === 0) return;\n const handle = requestPromptEditorFocus(containerRef.current, () => setIsSelected(true));\n return () => cancelAnimationFrame(handle);\n }, [focusSignal]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusPromptEditor(containerRef.current);\n };\n\n const resetEditor = (shouldFocus = false) => {\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n const resetText = getTextFromSerializedEditorState(defaultState);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n\n if (shouldFocus) {\n requestAnimationFrame(() => {\n focusPromptEditor(containerRef.current);\n });\n }\n };\n\n const responseText = questionPrompt\n ? buildQuestionResponse(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion)\n : text.trim();\n const hasMissingRequiredSelection = hasMissingRequiredQuestionAnswer(\n questionPrompt,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const actionState = {\n canInterrupt: streaming && !questionPrompt && Boolean(onInterrupt),\n canSubmit: !submitDisabled,\n hasQuestionPrompt: Boolean(questionPrompt),\n isDisabled: isDisabled || submitting || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n const messageTitle = streaming && !questionPrompt ? \"Queue message\" : \"Send message\";\n const submitMessage = async () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n setSubmitting(true);\n try {\n await onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n } catch {\n // Keep the composer intact so failed submissions can be retried.\n } finally {\n setSubmitting(false);\n }\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") onInterrupt?.();\n if (action === \"submit\") void submitMessage();\n };\n\n const attachmentEventHandlers = createAttachmentEventHandlers({\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold,\n });\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n setSelectedOptionsByQuestion((current) =>\n toggleQuestionOptionSelection(current, question, questionIndex, optionLabel),\n );\n };\n\n const updateQuestionCustomAnswer = (question: ChatInputQuestion, questionIndex: number, answer: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n setCustomAnswersByQuestion((current) => ({\n ...current,\n [key]: answer,\n }));\n };\n\n return (\n <Box\n ref={containerRef}\n position=\"relative\"\n width=\"100%\"\n paddingX=\"xs\"\n paddingY=\"xs\"\n mt={attachedToTop ? \"-1px\" : undefined}\n bg=\"bg\"\n borderRadius=\"xs\"\n borderTopRadius={attachedToTop ? \"0\" : undefined}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isSelected ? selectedChatInputBorderColor : restingBorderColor}\n zIndex={isSelected ? 1 : 0}\n transition=\"border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? selectedChatInputBorderColor : restingBorderColor,\n zIndex: 1,\n }}\n _focusWithin={{\n borderColor: selectedChatInputBorderColor,\n zIndex: 1,\n }}\n onPasteCapture={attachmentEventHandlers.onPasteCapture}\n onDropCapture={attachmentEventHandlers.onDropCapture}\n onDragOver={attachmentEventHandlers.onDragOver}\n onClick={handleContainerClick}\n onBlur={() => setIsSelected(false)}\n >\n <Flex direction=\"column\" color=\"fg\" gap=\"xs\">\n {attachmentList ? <Box>{attachmentList}</Box> : null}\n {questionPrompt ? (\n <QuestionPromptControls\n questionPrompt={questionPrompt}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={toggleQuestionOption}\n onCustomAnswerChange={updateQuestionCustomAnswer}\n />\n ) : (\n // The editor is its own composer row: it centres a single line at the shared\n // control height and grows with content, never shrinking below it, so the row\n // aligns with the toolbar beneath it.\n <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <Flex minH={COMPOSER_CONTROL_HEIGHT} align=\"center\">\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled && !submitting}\n placeholder={<ChatInputPlaceholder placeholder={placeholder} />}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={() => runAction(resolveChatInputKeyboardAction(actionState))}\n references={references}\n onAddReference={onAddReference}\n />\n </Flex>\n </ScrollArea>\n )}\n <HStack gap=\"1\" minH={COMPOSER_CONTROL_HEIGHT} align=\"center\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={buttonAction === \"interrupt\"}\n title={buttonAction === \"interrupt\" ? \"Stop Response\" : (submitTitle ?? messageTitle)}\n shortcut={buttonAction === \"submit\" ? \"Enter\" : undefined}\n onClick={() => runAction(buttonAction)}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import type { SessionMessage, ToolPart } from \"../components/message-types\";\nimport type { QuestionFormBlockOption, QuestionFormBlockQuestion } from \"../components/timeline\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst parseJsonObjectText = (value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst toInputRecord = (input: unknown) => {\n if (isRecord(input)) return input;\n if (typeof input === \"string\" && input.trim().length > 0) return parseJsonObjectText(input);\n return null;\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getQuestionResponseText = (value: unknown): string | null => {\n const stringValue = getStringValue(value);\n if (stringValue) return stringValue;\n\n if (Array.isArray(value)) {\n const lines = value.map(getQuestionResponseText).filter((line): line is string => line !== null);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n }\n\n if (!isRecord(value)) return null;\n\n return (\n getQuestionResponseText(value.response) ??\n getQuestionResponseText(value.answer) ??\n getQuestionResponseText(value.text) ??\n getQuestionResponseText(value.answers)\n );\n};\n\nconst parseQuestionOption = (value: unknown): QuestionFormBlockOption | null => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value, description: undefined };\n }\n\n if (!isRecord(value)) return null;\n const label = getStringValue(value.label);\n if (!label) return null;\n\n return {\n label,\n description: getStringValue(value.description) ?? undefined,\n };\n};\n\nconst parseQuestion = (value: unknown, index: number): QuestionFormBlockQuestion | null => {\n if (!isRecord(value)) return null;\n\n const question = getStringValue(value.question);\n if (!question) return null;\n\n const options = Array.isArray(value.options)\n ? value.options.map(parseQuestionOption).filter((option): option is QuestionFormBlockOption => option !== null)\n : [];\n const type = getStringValue(value.type);\n const allowCustomAnswer =\n typeof value.custom === \"boolean\"\n ? value.custom\n : typeof value.allowCustomAnswer === \"boolean\"\n ? value.allowCustomAnswer\n : options.length === 0 || type === \"freeform\" || type === \"text\";\n\n return {\n id: getStringValue(value.id) ?? `question-${index}`,\n question,\n options,\n multiple:\n typeof value.multiple === \"boolean\" ? value.multiple : type === \"multi_choice\" || type === \"multiple_choice\",\n required: typeof value.required === \"boolean\" ? value.required : true,\n allowCustomAnswer,\n };\n};\n\nexport const parseQuestionPrompt = (input: unknown) => {\n const record = toInputRecord(input);\n if (!record || !Array.isArray(record.questions)) return null;\n\n const questions = record.questions.map(parseQuestion).filter((question): question is QuestionFormBlockQuestion => {\n return question !== null;\n });\n if (questions.length === 0) return null;\n\n return { questions };\n};\n\nconst isQuestionTool = (part: ToolPart) => part.tool.toLowerCase() === \"question\";\n\nexport const resolveActiveQuestionPrompt = (messages: SessionMessage[]) => {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = messages[messageIndex];\n if (message.role !== \"assistant\") continue;\n\n for (let partIndex = message.parts.length - 1; partIndex >= 0; partIndex -= 1) {\n const part = message.parts[partIndex];\n if (part.type !== \"tool\" || !isQuestionTool(part)) continue;\n\n const response = getQuestionResponseText(part.state?.output) ?? getQuestionResponseText(part.state?.metadata);\n if (response) return undefined;\n\n return parseQuestionPrompt(part.state?.input) ?? undefined;\n }\n }\n\n return undefined;\n};\n","import { generateEditorStateFromString } from \"../../rich-text\";\n\nexport const createSerializedPromptState = (input = \"\") => {\n return JSON.stringify(generateEditorStateFromString(input));\n};\n","import { useRef } from \"react\";\n\nexport interface MessageAnimationState {\n initialized: boolean;\n seenKeys: Set<string>;\n}\n\ninterface NextMessageAnimationStateArgs {\n itemKeys: string[];\n state: MessageAnimationState;\n}\n\nexport const messageFadeInProps = {\n animationName: \"message-fade-in\",\n animationDuration: \"200ms\",\n animationTimingFunction: \"ease-out\",\n} as const;\n\nexport const getNextMessageAnimationState = (args: NextMessageAnimationStateArgs) => {\n const animatedKeys = new Set<string>();\n const seenKeys = new Set(args.state.seenKeys);\n\n for (const key of args.itemKeys) {\n if (args.state.initialized && !seenKeys.has(key)) {\n animatedKeys.add(key);\n }\n\n seenKeys.add(key);\n }\n\n return {\n animatedKeys,\n state: {\n initialized: true,\n seenKeys,\n },\n };\n};\n\nconst itemKeysEqual = (a: string[], b: string[]) => {\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) if (a[index] !== b[index]) return false;\n return true;\n};\n\nexport const useMessageAnimationKeys = (itemKeys: string[]) => {\n const stateRef = useRef<MessageAnimationState>({\n initialized: false,\n seenKeys: new Set(),\n });\n // The hook mutates state during render, so React's duplicate renders (Strict\n // Mode, concurrent reconciliation) would otherwise consume the animation\n // flag on the second pass and leave the message non-animating. Cache the\n // last inputs to make repeated calls idempotent.\n const lastResultRef = useRef<{ itemKeys: string[]; animatedKeys: Set<string> } | null>(null);\n\n if (lastResultRef.current && itemKeysEqual(lastResultRef.current.itemKeys, itemKeys)) {\n return lastResultRef.current.animatedKeys;\n }\n\n const next = getNextMessageAnimationState({\n itemKeys,\n state: stateRef.current,\n });\n\n stateRef.current = next.state;\n lastResultRef.current = { itemKeys: [...itemKeys], animatedKeys: next.animatedKeys };\n\n return next.animatedKeys;\n};\n","import { Box, HStack, IconButton, Text } from \"@chakra-ui/react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { ChatMessagePart, SessionMessage } from \"./message-types\";\n\ninterface MessageActionPanelProps {\n message: SessionMessage;\n alwaysVisible?: boolean;\n copyAlwaysVisible?: boolean;\n}\n\nconst isCopyablePart = (part: ChatMessagePart): part is Extract<ChatMessagePart, { type: \"text\" }> => {\n return part.type === \"text\";\n};\n\nexport const getMessageCopyText = (message: SessionMessage) => {\n return (message.parts ?? [])\n .filter(isCopyablePart)\n .map((part) => part.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\nexport const getMessageTimestampLabel = (message: SessionMessage, locale?: string, timeZone?: string) => {\n if (!message.createdAt) return \"\";\n\n return new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n }).format(new Date(message.createdAt));\n};\n\nexport const MessageActionPanel = (props: MessageActionPanelProps) => {\n const { message, alwaysVisible = false, copyAlwaysVisible = alwaysVisible } = props;\n const [isCopied, setIsCopied] = useState(false);\n const copyResetTimeoutRef = useRef<number | null>(null);\n const copyText = getMessageCopyText(message);\n const timestampLabel = getMessageTimestampLabel(message);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n const copyMessage = async () => {\n if (!copyText) return;\n\n try {\n await navigator.clipboard.writeText(copyText);\n setIsCopied(true);\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n copyResetTimeoutRef.current = window.setTimeout(() => setIsCopied(false), 1200);\n } catch {\n setIsCopied(false);\n }\n };\n\n if (!copyText && !timestampLabel) return null;\n\n return (\n <HStack\n data-chat-message-action-panel=\"true\"\n gap=\"2xs\"\n minH=\"6\"\n opacity={alwaysVisible ? \"1\" : \"0\"}\n pointerEvents={alwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n {timestampLabel ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {timestampLabel}\n </Text>\n ) : null}\n {copyText ? (\n <Box\n opacity={copyAlwaysVisible ? \"1\" : \"0\"}\n pointerEvents={copyAlwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n <Tooltip content={isCopied ? \"Copied\" : \"Copy message\"}>\n <IconButton\n aria-label={isCopied ? \"Copied\" : \"Copy message\"}\n variant=\"ghost\"\n size=\"2xs\"\n onClick={copyMessage}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n </IconButton>\n </Tooltip>\n </Box>\n ) : null}\n </HStack>\n );\n};\n\nconst messageActionPanelHoverStyles = {\n \"[data-chat-message-with-actions]:hover &, [data-chat-message-with-actions]:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \".ai-message__root:hover &, .ai-message__root:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"[data-scope='ai-message'][data-part='root']:hover &, [data-scope='ai-message'][data-part='root']:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n};\n","import type { BoxProps } from \"@chakra-ui/react\";\nimport { Box } from \"@chakra-ui/react\";\nimport { RichMessage } from \"@/components/rich-text\";\n\nexport interface ChatRichContentProps extends Omit<BoxProps, \"children\"> {\n children: string;\n}\n\nconst ChatRichContent = (props: ChatRichContentProps) => {\n const { children, ...rest } = props;\n\n return (\n <Box {...rest}>\n <RichMessage defaultState={children} fullWidth />\n </Box>\n );\n};\n\nexport const Response = ChatRichContent;\n","export const normalizeToolName = (value: string) => {\n return value\n .replace(/^tool-/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .toLowerCase();\n};\n\nexport const getToolNameLookupKeys = (value: string) => {\n const normalized = normalizeToolName(value);\n const compact = normalized.replace(/_/g, \"\");\n return [...new Set([value, normalized, compact])];\n};\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n AlertTriangle,\n CircleQuestionMark,\n DotIcon,\n File,\n FileDiff,\n FileDown,\n FilePen,\n FileText,\n FileUp,\n Globe,\n ListTodo,\n ListTree,\n Move,\n Search,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { normalizeToolName } from \"./tool-name\";\n\nconst toolIconMap = {\n shell: Terminal,\n ls: ListTree,\n read_file: FileText,\n write_file: FilePen,\n delete_file: Trash2,\n patch: FileDiff,\n upload_files: FileUp,\n download_file: FileDown,\n move_file: Move,\n} as const satisfies Record<string, LucideIcon>;\n\nconst iconMap = {\n dot: DotIcon,\n danger: AlertTriangle,\n search: Search,\n browser: Globe,\n file: File,\n question: CircleQuestionMark,\n todo: ListTodo,\n terminal: Terminal,\n ...toolIconMap,\n} as const satisfies Record<string, LucideIcon>;\n\nexport type IconName = keyof typeof iconMap;\nexport type ToolIconName = keyof typeof toolIconMap;\n\nconst DEFAULT_TOOL_ICON: IconName = \"dot\";\n\nconst isToolIconName = (value: string): value is ToolIconName => Object.hasOwn(toolIconMap, value);\n\nexport const getIconComponent = (name: IconName): LucideIcon => {\n return iconMap[name];\n};\n\nexport const toolTypeToIconName = (type?: string): IconName => {\n if (!type) return DEFAULT_TOOL_ICON;\n\n const normalized = normalizeToolName(type);\n if (isToolIconName(normalized)) return normalized;\n\n const compact = normalized.replace(/_/g, \"\");\n\n switch (normalized) {\n case \"read\":\n return \"file\";\n case \"bash\":\n return \"terminal\";\n case \"edit\":\n return \"write_file\";\n case \"apply_patch\":\n return \"patch\";\n case \"grep\":\n return \"search\";\n case \"glob\":\n return \"file\";\n case \"todowrite\":\n return \"todo\";\n case \"search\":\n return \"search\";\n case \"browser\":\n return \"browser\";\n case \"question\":\n return \"question\";\n case \"fs\":\n case \"file\":\n return \"file\";\n default:\n return compact === \"todowrite\" || compact === \"todo\" ? \"todo\" : DEFAULT_TOOL_ICON;\n }\n};\n\nexport { getFileTypeIcon } from \"../../../utils/get-file-type-icon\";\n","import type { TitleSegment } from \"../components/timeline\";\n\nexport type FileChange = { filePath: string; additions: number; deletions: number };\n\nexport function basenameSafe(path: string) {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(idx + 1) : path;\n}\n\nfunction normalizeHeaderPath(input?: string | null) {\n if (!input) return null;\n\n const token = input.split(\"\\t\")[0].trim();\n if (token === \"/dev/null\") return null;\n\n let normalized = token;\n if (normalized.startsWith(\"a/\") || normalized.startsWith(\"b/\")) {\n normalized = normalized.slice(2);\n }\n\n return normalized.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nconst isMinusHeader = (line: string) => line.startsWith(\"--- \");\nconst isPlusHeader = (line: string) => line.startsWith(\"+++ \");\nconst isHunkHeader = (line: string) => line.startsWith(\"@@\");\nconst isAddedLine = (line: string) => line.startsWith(\"+\") && !(isPlusHeader(line) || line === \"+++\");\nconst isDeletedLine = (line: string) => line.startsWith(\"-\") && !(isMinusHeader(line) || line === \"---\");\n\nconst ensureFileChange = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n if (!changes.has(filePath)) {\n changes.set(filePath, { additions: 0, deletions: 0 });\n }\n};\n\nconst incrementAdditions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.additions += 1;\n};\n\nconst incrementDeletions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.deletions += 1;\n};\n\ntype UnifiedDiffState = {\n currentPath: string | null;\n lastMinusHeader: string | null;\n inHunk: boolean;\n};\n\nconst processUnifiedDiffLine = (\n line: string,\n state: UnifiedDiffState,\n changes: Map<string, { additions: number; deletions: number }>,\n) => {\n if (isMinusHeader(line)) {\n return { ...state, lastMinusHeader: normalizeHeaderPath(line.slice(4)), inHunk: false };\n }\n\n if (isPlusHeader(line)) {\n const plusPath = normalizeHeaderPath(line.slice(4));\n const currentPath = plusPath ?? state.lastMinusHeader;\n if (currentPath) ensureFileChange(changes, currentPath);\n return { ...state, currentPath, inHunk: false };\n }\n\n if (!state.currentPath) return state;\n\n if (isHunkHeader(line)) {\n return { ...state, inHunk: true };\n }\n\n if (!state.inHunk) return state;\n\n if (isAddedLine(line)) {\n incrementAdditions(changes, state.currentPath);\n return state;\n }\n\n if (isDeletedLine(line)) {\n incrementDeletions(changes, state.currentPath);\n }\n\n return state;\n};\n\nexport function parseUnifiedDiff(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileChange[];\n\n const changes = new Map<string, { additions: number; deletions: number }>();\n let state: UnifiedDiffState = {\n currentPath: null,\n lastMinusHeader: null,\n inHunk: false,\n };\n\n const lines = diffText.split(/\\r?\\n/);\n for (const line of lines) {\n state = processUnifiedDiffLine(line, state, changes);\n }\n\n return Array.from(changes.entries()).map(([filePath, { additions, deletions }]) => ({\n filePath,\n additions,\n deletions,\n }));\n}\n\nexport function buildDiffTitleSegments(diffText?: string) {\n return parseUnifiedDiff(diffText).map(\n (file) =>\n ({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n }) satisfies TitleSegment,\n );\n}\n\nexport function extractDiffFilePaths(diffText?: string) {\n return parseUnifiedDiff(diffText).map((file) => file.filePath);\n}\n\nexport type FileDiffPreview = { filePath: string; original: string; modified: string };\n\nconst isDiffFileBoundary = (line: string) => isMinusHeader(line) || line.startsWith(\"diff --git \");\n\nconst isInvalidHunkBodyLine = (line: string) => {\n if (line.startsWith(\" \")) return false;\n if (line.startsWith(\"+\")) return false;\n if (line.startsWith(\"-\")) return false;\n return line.trim() !== \"\";\n};\n\nconst appendHunkLine = (line: string, original: string[], modified: string[]) => {\n if (line.startsWith(\" \")) {\n const text = line.slice(1);\n original.push(text);\n modified.push(text);\n return;\n }\n\n if (line.startsWith(\"-\")) {\n original.push(line.slice(1));\n return;\n }\n\n if (line.startsWith(\"+\")) {\n modified.push(line.slice(1));\n }\n};\n\nconst parseHunkBody = (lines: string[], startIndex: number, original: string[], modified: string[]) => {\n let index = startIndex;\n\n while (index < lines.length) {\n const line = lines[index] || \"\";\n if (isDiffFileBoundary(line) || isHunkHeader(line) || isInvalidHunkBodyLine(line)) {\n break;\n }\n\n appendHunkLine(line, original, modified);\n index += 1;\n }\n\n if (original.length > 0 || modified.length > 0) {\n original.push(\"\");\n modified.push(\"\");\n }\n\n return index;\n};\n\nconst parsePreview = (lines: string[], startIndex: number) => {\n const oldHeader = normalizeHeaderPath((lines[startIndex] || \"\").slice(4));\n const next = lines[startIndex + 1] || \"\";\n if (!isPlusHeader(next)) return { nextIndex: startIndex + 1 } as const;\n\n const newHeader = normalizeHeaderPath(next.slice(4));\n const filePath = newHeader ?? oldHeader ?? \"\";\n const original: string[] = [];\n const modified: string[] = [];\n\n let index = startIndex + 2;\n while (index < lines.length) {\n const current = lines[index] || \"\";\n if (isDiffFileBoundary(current)) break;\n\n if (!isHunkHeader(current)) {\n index += 1;\n continue;\n }\n\n index = parseHunkBody(lines, index + 1, original, modified);\n }\n\n return {\n nextIndex: index,\n preview: { filePath, original: original.join(\"\\n\"), modified: modified.join(\"\\n\") } satisfies FileDiffPreview,\n } as const;\n};\n\nexport function buildFileDiffPreviews(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileDiffPreview[];\n\n const lines = diffText.split(/\\r?\\n/);\n const previews: FileDiffPreview[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i] || \"\";\n if (!isMinusHeader(line)) {\n i += 1;\n continue;\n }\n\n const { nextIndex, preview } = parsePreview(lines, i);\n if (preview) previews.push(preview);\n i = Math.max(nextIndex, i + 1);\n }\n\n return previews;\n}\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { basenameSafe, buildDiffTitleSegments, buildFileDiffPreviews, extractDiffFilePaths } from \"../utils/diff\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\n\nconst TOOL_LABELS: Record<string, string> = {\n apply_patch: \"Apply patch\",\n bash: \"Run command\",\n edit: \"Edit file\",\n glob: \"Find files\",\n grep: \"Search files\",\n read: \"Read file\",\n skill: \"Load skill\",\n todowrite: \"Update todos\",\n};\n\nconst STATE_LABELS: Record<string, string> = {\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n running: \"running\",\n completed: \"completed\",\n failed: \"failed\",\n};\n\nexport type ApplyPatchMetadataFile = {\n filePath: string;\n additions: number;\n deletions: number;\n diff?: string;\n before?: string;\n after?: string;\n};\n\nexport const normalizeToolType = (value: string) => value.replace(/^tool-/, \"\").toLowerCase();\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nexport const getToolType = (invocation: ToolPart) => normalizeToolType(invocation.tool ?? \"tool\");\n\nexport const getToolLabel = (value: string) => {\n const normalized = normalizeToolType(value);\n return TOOL_LABELS[normalized] ?? toTitleCase(normalized.replace(/_/g, \" \"));\n};\n\nexport const getStateLabel = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n if (!state || typeof state !== \"string\") return null;\n\n const normalized = state.replace(/-/g, \"_\");\n if (STATE_LABELS[normalized]) return STATE_LABELS[normalized];\n if (normalized.includes(\"stream\")) return \"running\";\n return null;\n};\n\nexport const isErrorState = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n return state === \"error\" || state === \"output-error\" || state === \"failed\";\n};\n\nexport const buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return {\n type: \"icon\",\n icon: toolTypeToIconName(getToolType(invocation)),\n } as const;\n};\n\nexport const buildBaseTitle = (\n invocation: ToolPart,\n detail?: string,\n labelOverride?: string,\n detailStyle?: \"monospace\",\n) => {\n const label = labelOverride ?? getToolLabel(invocation.tool ?? \"tool\");\n const title: TitleSegment[] = [{ kind: \"text\", text: label, bold: true }];\n\n if (detail) {\n title.push({\n kind: \"text\",\n text: detail,\n muted: true,\n ...(detailStyle === \"monospace\" ? { truncate: true, monospace: true } : {}),\n });\n }\n\n const stateLabel = getStateLabel(invocation);\n if (stateLabel && stateLabel !== \"completed\") {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return title;\n};\n\nexport const getInputObject = (invocation: ToolPart) => {\n const input = invocation.state?.input;\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n return input as Record<string, unknown>;\n};\n\nexport const getOutputObject = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (!output || typeof output !== \"object\" || Array.isArray(output)) return null;\n return output as Record<string, unknown>;\n};\n\nexport const getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nexport const getStateObject = (invocation: ToolPart, key: string) => {\n const state = getObjectValue(invocation.state);\n if (!state) return null;\n return getObjectValue(state[key]);\n};\n\nconst normalizeFilePath = (value: string) => value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n\nconst isUnifiedDiff = (value: string) => value.includes(\"--- \") && value.includes(\"+++ \") && value.includes(\"@@\");\n\nconst getApplyPatchMetadataObjects = (invocation: ToolPart) => {\n const output = getOutputObject(invocation);\n return [getStateObject(invocation, \"metadata\"), getObjectValue(output?.metadata)].filter(Boolean) as Array<\n Record<string, unknown>\n >;\n};\n\nconst parseApplyPatchMetadataFile = (entry: unknown) => {\n const record = getObjectValue(entry);\n if (!record) return null;\n\n const rawPath = getStringValue(record.filePath) ?? getStringValue(record.relativePath) ?? getStringValue(record.path);\n if (!rawPath) return null;\n\n return {\n filePath: normalizeFilePath(rawPath),\n additions: typeof record.additions === \"number\" ? record.additions : 0,\n deletions: typeof record.deletions === \"number\" ? record.deletions : 0,\n diff: getStringValue(record.diff) ?? undefined,\n before: getStringValue(record.before) ?? undefined,\n after: getStringValue(record.after) ?? undefined,\n } satisfies ApplyPatchMetadataFile;\n};\n\nexport const getApplyPatchMetadataFiles = (invocation: ToolPart) => {\n const files: ApplyPatchMetadataFile[] = [];\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const entries = Array.isArray(metadata.files) ? metadata.files : [];\n\n for (const entry of entries) {\n const parsedFile = parseApplyPatchMetadataFile(entry);\n if (!parsedFile) continue;\n files.push(parsedFile);\n }\n }\n\n return files;\n};\n\nexport const getApplyPatchInputFilePaths = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const changes = Array.isArray(input?.changes) ? input.changes : [];\n const filePaths = changes\n .map((change) => getStringValue(getObjectValue(change)?.path))\n .filter((filePath): filePath is string => Boolean(filePath))\n .map(normalizeFilePath);\n\n return Array.from(new Set(filePaths));\n};\n\nexport const getApplyPatchDiffText = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const inputDiff = getStringValue(input?.diff);\n if (inputDiff) return inputDiff;\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const metadataDiff = getStringValue(metadata.diff);\n if (metadataDiff) return metadataDiff;\n }\n\n const fileDiffs = getApplyPatchMetadataFiles(invocation)\n .map((file) => file.diff)\n .filter((diff): diff is string => Boolean(diff));\n if (fileDiffs.length > 0) return fileDiffs.join(\"\\n\");\n\n const patchText = getStringValue(input?.patchText);\n if (patchText && isUnifiedDiff(patchText)) return patchText;\n\n return null;\n};\n\nexport const buildApplyPatchMetadataTitleSegments = (files: ApplyPatchMetadataFile[]) => {\n const seen = new Set<string>();\n const segments: TitleSegment[] = [];\n\n for (const file of files) {\n if (seen.has(file.filePath)) continue;\n seen.add(file.filePath);\n\n segments.push({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n });\n }\n\n return segments;\n};\n\nexport const getApplyPatchMetadataReferences = (files: ApplyPatchMetadataFile[]) => {\n return Array.from(new Set(files.map((file) => file.filePath)));\n};\n\nexport const getOutputText = (invocation: ToolPart) => {\n const outputObject = getOutputObject(invocation);\n\n return (\n getStringValue(invocation.state?.output) ??\n getStringValue(outputObject?.returnDisplay) ??\n getStringValue(outputObject?.preview) ??\n getStringValue(outputObject?.stdout) ??\n getStringValue(outputObject?.content)\n );\n};\n\nexport const parseSkillContentBlock = (value: string) => {\n const match = value.match(/<skill_content(?:\\s+name=\"([^\"]+)\")?>([\\s\\S]*?)<\\/skill_content>/);\n if (!match) return null;\n\n return {\n skillName: getStringValue(match[1]) ?? undefined,\n content: getStringValue(match[2]) ?? \"\",\n };\n};\n\nexport const getSkillName = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n return (\n getStringValue(input?.name) ??\n getStringValue(input?.skillName) ??\n getStringValue(input?.skill) ??\n getStringValue(input?.skill_name) ??\n undefined\n );\n};\n\nexport const buildFileLinkSegment = (filePath: string, variant?: \"default\" | \"bubble\"): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n ...(variant ? { variant } : {}),\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = {\n type: \"comment\",\n text: invocation.state.errorText,\n };\n return [errorBlock, ...blocks];\n};\n\nexport const getDiffBlocks = (diffText?: string | null) => {\n return buildFileDiffPreviews(diffText ?? undefined).map((preview) => ({\n type: \"diff\",\n language: \"diff\",\n original: preview.original,\n modified: preview.modified,\n sideBySide: false,\n })) satisfies Block[];\n};\n\nexport const getDiffTitleSegments = (diffText?: string | null) => buildDiffTitleSegments(diffText ?? undefined);\n\nexport const getDiffReferences = (diffText?: string | null) => extractDiffFilePaths(diffText ?? undefined);\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildApplyPatchMetadataTitleSegments,\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getApplyPatchDiffText,\n getApplyPatchInputFilePaths,\n getApplyPatchMetadataFiles,\n getApplyPatchMetadataReferences,\n getDiffBlocks,\n getDiffReferences,\n getDiffTitleSegments,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderApplyPatch: ToolRenderer = (invocation) => {\n const diffText = getApplyPatchDiffText(invocation);\n const metadataFiles = getApplyPatchMetadataFiles(invocation);\n const inputFilePaths = getApplyPatchInputFilePaths(invocation);\n\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else if (metadataFiles.length > 0) {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\n } else {\n title.push(...inputFilePaths.map((filePath) => buildFileLinkSegment(filePath, \"bubble\")));\n }\n\n const blocks: Block[] = [...getDiffBlocks(diffText)];\n\n if (blocks.length === 0) {\n for (const file of metadataFiles) {\n if (!file.before && !file.after) continue;\n blocks.push({\n type: \"diff\",\n language: \"diff\",\n original: file.before ?? \"\",\n modified: file.after ?? \"\",\n sideBySide: false,\n });\n }\n }\n\n if (blocks.length === 0) {\n const references = getDiffReferences(diffText);\n if (references.length === 0) {\n references.push(...getApplyPatchMetadataReferences(metadataFiles));\n }\n if (references.length === 0) {\n references.push(...inputFilePaths);\n }\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getDiffBlocks,\n getInputObject,\n getOutputObject,\n getStringValue,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nconst buildEditDiff = (original: string, modified: string) => {\n return [\n {\n type: \"diff\",\n language: \"text\",\n original,\n modified,\n sideBySide: false,\n },\n ] satisfies Block[];\n};\n\nexport const renderEdit: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(output?.filePath) ??\n undefined;\n\n const original = getStringValue(output?.oldString) ?? getStringValue(input?.old_string) ?? undefined;\n const modified = getStringValue(output?.newString) ?? getStringValue(input?.new_string) ?? undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Edit file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n const diffBlocks =\n original !== undefined && modified !== undefined\n ? buildEditDiff(original, modified)\n : getDiffBlocks(getStringValue(output?.diff));\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, diffBlocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport { getQuestionResponseText, parseQuestionPrompt } from \"./question-prompt\";\nimport type { ToolRenderer } from \"./types\";\n\ntype QuestionRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText =\n getQuestionResponseText(invocation.state?.output) ?? getQuestionResponseText(invocation.state?.metadata);\n const prompt = parseQuestionPrompt(invocation.state?.input);\n const block = prompt ? ({ type: \"question-form\", questions: prompt.questions } satisfies Block) : null;\n if (!responseText && !block) return null;\n\n const fieldLabel = block ? `${block.questions.length} field${block.questions.length === 1 ? \"\" : \"s\"}` : undefined;\n const blocks = responseText ? [] : [block!];\n\n return {\n indicator: buildIndicator(invocation),\n title: buildBaseTitle(invocation, fieldLabel, \"Question\"),\n blocks: prependErrorBlock(invocation, blocks),\n expandable: false,\n } satisfies Item;\n };\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getInputObject,\n getOutputObject,\n getOutputText,\n getSkillName,\n getStringValue,\n parseSkillContentBlock,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderRead: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(input?.file) ??\n getStringValue(output?.filePath) ??\n getStringValue(output?.file) ??\n getStringValue(output?.path) ??\n undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Read file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, []),\n } satisfies Item;\n};\n\nconst renderCommand = (invocation: Parameters<ToolRenderer>[0], label: string) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, label, \"monospace\");\n const blocks: Block[] = [];\n\n const outputText = getOutputText(invocation);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: outputText });\n }\n\n const stderr = getStringValue(output?.stderr);\n if (stderr && stderr !== outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: stderr });\n }\n\n if (typeof output?.exitCode === \"number\") {\n blocks.push({ type: \"text\", text: `Exit code: ${output.exitCode}` });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderBash: ToolRenderer = (invocation) => renderCommand(invocation, \"Run command\");\n\nexport const renderShell: ToolRenderer = (invocation) => renderCommand(invocation, \"Shell\");\n\nexport const renderGrep: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const query = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, query, \"Search files\");\n const blocks: Block[] = outputText ? [{ type: \"code\", language: \"text\", code: outputText }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGlob: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const pattern = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, pattern, \"Find files\");\n const blocks: Block[] = [];\n\n if (outputText) {\n const references = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderSkill: ToolRenderer = (invocation) => {\n const outputText = getOutputText(invocation);\n const parsedOutput = outputText ? parseSkillContentBlock(outputText) : null;\n\n const skillName = getSkillName(invocation) ?? parsedOutput?.skillName;\n const title = buildBaseTitle(invocation, skillName, \"Load skill\");\n\n const renderedContent = parsedOutput?.content ?? outputText;\n const blocks: Block[] = renderedContent ? [{ type: \"code\", language: \"markdown\", code: renderedContent }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype TodoItem = {\n label: string;\n checked: boolean;\n};\n\ntype TodowriteRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst parseTodoItem = (value: unknown): TodoItem | null => {\n const todo = getObjectValue(value);\n if (!todo) return null;\n\n const content = getStringValue(todo.content) ?? getStringValue(todo.title);\n if (!content) return null;\n const status = getStringValue(todo.status);\n\n return {\n label: content,\n checked: status === \"completed\",\n };\n};\n\nconst parseTodoItems = (value: unknown) => {\n if (!value) return { items: [], explicit: false };\n\n const listSource = (() => {\n if (Array.isArray(value)) return value;\n const objectValue = getObjectValue(value);\n if (!objectValue || !Array.isArray(objectValue.todos)) return null;\n return objectValue.todos;\n })();\n\n if (!listSource) return { items: [], explicit: false };\n\n return {\n items: listSource.map(parseTodoItem).filter((todo): todo is TodoItem => todo !== null),\n explicit: true,\n };\n};\n\nexport const createTodowriteRenderer = (deps: TodowriteRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const inputTodos = parseTodoItems(invocation.state?.input);\n const outputTodos = parseTodoItems(invocation.state?.output);\n const todoState = outputTodos.explicit ? outputTodos : inputTodos;\n if (!todoState.explicit) return null;\n\n const todos = todoState.items;\n const countLabel = `${todos.length} item${todos.length === 1 ? \"\" : \"s\"}`;\n const title = buildBaseTitle(invocation, countLabel, \"Update todos\");\n\n if (todos.length === 0) {\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, [{ type: \"comment\", text: \"No todos\" }]),\n } satisfies Item;\n }\n\n const blocks: Block[] = [\n {\n type: \"todo-list\",\n items: todos,\n },\n ];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n };\n};\n","import { renderApplyPatch } from \"./apply-patch-renderer\";\nimport { renderEdit } from \"./edit-renderer\";\nimport { createQuestionRenderer } from \"./question-renderer\";\nimport { buildBaseTitle, buildIndicator, prependErrorBlock } from \"./shared\";\nimport { renderBash, renderGlob, renderGrep, renderRead, renderShell, renderSkill } from \"./standard-renderers\";\nimport { createTodowriteRenderer } from \"./todowrite-renderer\";\nimport type { ToolRenderersMap } from \"./types\";\n\nconst renderQuestion = createQuestionRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nconst renderTodowrite = createTodowriteRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nexport const createDefaultToolRenderers = () => {\n return {\n apply_patch: renderApplyPatch,\n bash: renderBash,\n edit: renderEdit,\n glob: renderGlob,\n grep: renderGrep,\n question: renderQuestion,\n read: renderRead,\n shell: renderShell,\n skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\nimport { getToolNameLookupKeys, normalizeToolName } from \"../utils/tool-name\";\nimport { createDefaultToolRenderers } from \"./default-renderers\";\nimport type { ToolRenderersMap, ToolTimelineBuilderOptions } from \"./types\";\n\nconst STATE_LABELS: Record<string, string> = {\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n};\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nconst getToolLabel = (tool?: string) => {\n const normalized = normalizeToolName(tool ?? \"tool\").replace(/_/g, \" \");\n return toTitleCase(normalized);\n};\n\nconst isErrorState = (state?: string) => state === \"error\" || state === \"output-error\";\n\nconst buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation.state?.status)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(invocation.tool ?? \"tool\") } as const;\n};\n\nconst getStateLabel = (state?: unknown) => {\n if (!state || typeof state !== \"string\") return null;\n if (STATE_LABELS[state]) return STATE_LABELS[state];\n if (state.includes(\"stream\")) return \"running\";\n return null;\n};\n\nconst stringifyValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return null;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return null;\n }\n};\n\nconst isBlankValue = (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0 || value.every(isBlankValue);\n if (typeof value === \"object\") {\n return Object.values(value as Record<string, unknown>).every(isBlankValue);\n }\n return false;\n};\n\nconst getRecord = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst getString = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getMediaType = (record: Record<string, unknown>) =>\n getString(record.mime_type) ?? getString(record.mediaType) ?? getString(record.mimeType);\n\nconst isImageMediaType = (value: string | null) => Boolean(value?.startsWith(\"image/\"));\n\nconst imageUrlPattern = /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(\\?.*)?$/i;\n\nconst getImageBlock = (value: unknown, alt: string): Block | null => {\n const record = getRecord(value);\n if (!record) return null;\n\n const mediaType = getMediaType(record);\n const data = getString(record.data);\n if (data && isImageMediaType(mediaType)) {\n return { type: \"image\", src: `data:${mediaType};base64,${data}`, alt };\n }\n\n const url = getString(record.url) ?? getString(record.src);\n if (url && (isImageMediaType(mediaType) || imageUrlPattern.test(url))) {\n return { type: \"image\", src: url, alt };\n }\n\n return null;\n};\n\nconst getFileLikeOutput = (value: unknown) => {\n const record = getRecord(value);\n if (!record) return null;\n\n const filePath = getString(record.path) ?? getString(record.filePath) ?? getString(record.filename);\n const content = getString(record.content) ?? getString(record.body) ?? getString(record.text);\n if (!filePath || content === null) return null;\n\n return { filePath, content };\n};\n\nconst extensionLanguageBySuffix: Record<string, string> = {\n css: \"css\",\n html: \"html\",\n js: \"js\",\n json: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n py: \"python\",\n ts: \"ts\",\n tsx: \"tsx\",\n yaml: \"yaml\",\n yml: \"yaml\",\n};\n\nconst getLanguageFromPath = (filePath: string) => {\n const extension = filePath.split(\".\").pop()?.toLowerCase();\n if (!extension) return \"text\";\n return extensionLanguageBySuffix[extension] ?? extension;\n};\n\nconst createLabeledBlocks = (label: string, blocks: Block[]) => {\n if (blocks.length === 0) return [];\n return [{ type: \"text\", text: label }, ...blocks] satisfies Block[];\n};\n\nconst buildBlocksForArrayValue = (value: unknown[], alt: string) => {\n const blocks: Block[] = [];\n\n for (const entry of value) {\n const entryRecord = getRecord(entry);\n const entryType = getString(entryRecord?.type);\n if (entryType === \"image\") {\n const image = getImageBlock(entry, alt);\n if (image) blocks.push(image);\n continue;\n }\n if (entryType === \"text\") {\n const text = getString(entryRecord?.text);\n if (text) blocks.push({ type: \"text\", text });\n continue;\n }\n blocks.push(...buildBlocksForValue(entry, alt));\n }\n\n return blocks;\n};\n\nconst buildBlocksForFileLikeValue = (value: unknown) => {\n const fileLikeOutput = getFileLikeOutput(value);\n if (!fileLikeOutput) return null;\n\n return [\n {\n type: \"code\",\n language: getLanguageFromPath(fileLikeOutput.filePath),\n code: fileLikeOutput.content,\n },\n ] satisfies Block[];\n};\n\nconst buildBlocksForAttachmentValue = (value: unknown) => {\n const record = getRecord(value);\n const attachmentName = getString(record?.attachment_name) ?? getString(record?.attachmentName);\n const attachmentId = getString(record?.attachment_file_id) ?? getString(record?.attachmentFileId);\n if (!attachmentName && !attachmentId) return null;\n\n return [{ type: \"text\", text: attachmentName ?? `Attachment ${attachmentId}` }] satisfies Block[];\n};\n\nconst buildBlocksForValue = (value: unknown, alt: string): Block[] => {\n if (isBlankValue(value)) return [];\n\n const imageBlock = getImageBlock(value, alt);\n if (imageBlock) return [imageBlock];\n\n if (Array.isArray(value)) return buildBlocksForArrayValue(value, alt);\n\n const fileBlocks = buildBlocksForFileLikeValue(value);\n if (fileBlocks) return fileBlocks;\n\n const attachmentBlocks = buildBlocksForAttachmentValue(value);\n if (attachmentBlocks) return attachmentBlocks;\n\n const text = stringifyValue(value);\n if (!text?.trim()) return [];\n\n return [{ type: \"code\", language: typeof value === \"string\" ? \"text\" : \"json\", code: text }] satisfies Block[];\n};\n\nconst buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n const toolLabel = getToolLabel(invocation.tool);\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n blocks.push(...createLabeledBlocks(\"Input\", buildBlocksForValue(invocation.state?.input, `${toolLabel} input`)));\n blocks.push(...createLabeledBlocks(\"Output\", buildBlocksForValue(invocation.state?.output, `${toolLabel} output`)));\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\n const fileLikeOutput = getFileLikeOutput(invocation.state?.output);\n if (fileLikeOutput) {\n title.push({ kind: \"link\", text: fileLikeOutput.filePath, filePath: fileLikeOutput.filePath });\n }\n const stateLabel = getStateLabel(invocation.state?.status);\n if (stateLabel) {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: buildGenericBlocks(invocation),\n };\n};\n\nconst isVisibleTitleSegment = (segment: TitleSegment) => {\n if (segment.kind === \"text\" || segment.kind === \"link\") return segment.text.trim().length > 0;\n if (segment.kind === \"diff\") return segment.fileName.trim().length > 0;\n return true;\n};\n\nconst isVisibleBlock = (block: Block) => {\n switch (block.type) {\n case \"comment\":\n case \"code\":\n case \"text\":\n return block.type === \"code\" ? block.code.trim().length > 0 : block.text.trim().length > 0;\n case \"diff\":\n return block.original.trim().length > 0 || block.modified.trim().length > 0;\n case \"image\":\n return block.src.trim().length > 0;\n case \"todo-list\":\n return block.items.length > 0;\n case \"question-form\":\n return block.questions.length > 0;\n case \"references\":\n return block.references.length > 0;\n case \"input\":\n case \"component\":\n return true;\n }\n};\n\nconst isVisibleItem = (item: Item) => {\n const hasTitle = item.title.some(isVisibleTitleSegment);\n const hasBlocks = (item.blocks ?? []).some(isVisibleBlock);\n return hasTitle || hasBlocks;\n};\n\nconst mergeToolRenderers = (overrides?: ToolRenderersMap) => {\n if (!overrides) return createDefaultToolRenderers();\n return { ...createDefaultToolRenderers(), ...overrides } satisfies ToolRenderersMap;\n};\n\nconst getRenderer = (invocation: ToolPart, toolRenderers: ToolRenderersMap) => {\n const rawTool = invocation.tool ?? \"tool\";\n for (const key of getToolNameLookupKeys(rawTool)) {\n const renderer = toolRenderers[key];\n if (renderer) return renderer;\n }\n\n return undefined;\n};\n\nconst renderInvocation = (\n invocation: ToolPart,\n toolRenderers: ToolRenderersMap,\n options?: ToolTimelineBuilderOptions,\n) => {\n const renderer = getRenderer(invocation, toolRenderers);\n if (renderer) {\n const rendered = renderer(invocation, options);\n if (rendered) return rendered;\n }\n\n return createGenericItem(invocation);\n};\n\nexport const buildTimelineDocFromInvocations = (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n const toolRenderers = mergeToolRenderers(options?.toolRenderers);\n const items = invocations\n .map((invocation) => renderInvocation(invocation, toolRenderers, options))\n .filter(isVisibleItem);\n\n return { items };\n};\n","import { Avatar, Link, Span } from \"@chakra-ui/react\";\nimport type { MouseEvent } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { TitleSegment } from \"./timeline\";\n\nconst handleTitleLinkClick = (\n event: MouseEvent<HTMLAnchorElement>,\n seg: Extract<TitleSegment, { kind: \"link\" }>,\n onOpenFile?: (filePath: string) => void,\n stopPropagation = false,\n) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (!seg.href) {\n event.preventDefault();\n }\n if (seg.filePath) {\n onOpenFile?.(seg.filePath);\n }\n};\n\nfunction AvatarTitleSegment({ seg }: { seg: Extract<TitleSegment, { kind: \"avatar\" }> }) {\n return (\n <Avatar.Root width=\"1.5rem\" height=\"1.5rem\">\n <Avatar.Image src={seg.src} alt={seg.alt} />\n <Avatar.Fallback background=\"bg.muted\" color=\"fg.muted\" />\n </Avatar.Root>\n );\n}\n\nfunction DiffTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"diff\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <DiffBubble\n fileName={seg.fileName}\n additions={seg.additions ?? 0}\n deletions={seg.deletions ?? 0}\n onClickFileLink={() => {\n const path = seg.filePath ?? seg.fileName;\n onOpenFile?.(path);\n }}\n />\n );\n}\n\nfunction BubbleLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n const isInteractive = Boolean(seg.href || seg.filePath);\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"fg.muted\"}\n textDecoration=\"none\"\n cursor={isInteractive ? \"pointer\" : \"default\"}\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile, true)}\n _hover={{\n textDecoration: \"underline\",\n color: seg.muted ? \"fg.muted\" : \"fg.blue-dark\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction DefaultLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"accent.primary\"}\n textDecoration=\"underline\"\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile)}\n _hover={{\n color: seg.muted ? \"fg.muted\" : \"accent.primary\",\n textDecoration: \"underline\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction TextTitleSegment({\n seg,\n isClickable,\n}: {\n seg: Extract<TitleSegment, { kind: \"text\" }>;\n isClickable?: boolean;\n}) {\n const segment = (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n textStyle={seg.monospace ? \"mono/XS\" : undefined}\n color=\"fg.muted\"\n minW={seg.truncate ? \"0\" : undefined}\n overflow={seg.truncate ? \"hidden\" : undefined}\n textOverflow={seg.truncate ? \"ellipsis\" : undefined}\n whiteSpace={seg.truncate ? \"nowrap\" : undefined}\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n\n if (!seg.truncate) return segment;\n\n return <Tooltip content={seg.text}>{segment}</Tooltip>;\n}\n\nexport function TitleInline({\n seg,\n isClickable,\n onOpenFile,\n}: {\n seg: TitleSegment;\n isClickable?: boolean;\n onOpenFile?: (filePath: string) => void;\n}) {\n switch (seg.kind) {\n case \"avatar\":\n return <AvatarTitleSegment seg={seg} />;\n case \"diff\":\n return <DiffTitleSegment seg={seg} onOpenFile={onOpenFile} />;\n case \"link\":\n return seg.variant === \"bubble\" ? (\n <BubbleLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n ) : (\n <DefaultLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n );\n case \"text\":\n return <TextTitleSegment seg={seg} isClickable={isClickable} />;\n default:\n return null;\n }\n}\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Image, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffEditor } from \"@/components/diff-viewer/diff-editor\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport type { IconName } from \"../utils/get-icon\";\nimport { getIconComponent } from \"../utils/get-icon\";\nimport { TitleInline } from \"./timeline-title\";\nimport { QuestionFormBlockView, TodoListBlockView } from \"./timeline-tool-blocks\";\n\nconst Timeline = ChakraTimeline;\n\nexport type TimelineDoc = {\n items: Item[];\n};\n\nexport type Item = {\n id?: string;\n timestamp?: string;\n indicator?: Indicator;\n title: TitleSegment[];\n blocks?: Block[];\n expandable?: boolean;\n};\n\nexport type Indicator =\n | { type: \"icon\"; icon: IconName; color?: string }\n | { type: \"avatar\"; src: string; alt?: string }\n | { type: \"none\" };\n\nexport type TitleSegment =\n | {\n kind: \"text\";\n text: string;\n bold?: boolean;\n muted?: boolean;\n truncate?: boolean;\n monospace?: boolean;\n }\n | { kind: \"avatar\"; src: string; alt?: string }\n | {\n kind: \"diff\";\n fileName: string;\n filePath?: string;\n additions?: number;\n deletions?: number;\n }\n | {\n kind: \"link\";\n text: string;\n href?: string;\n filePath?: string;\n bold?: boolean;\n muted?: boolean;\n variant?: \"default\" | \"bubble\";\n };\n\nexport type TodoListBlockItem = {\n label: string;\n checked: boolean;\n};\n\nexport type QuestionFormBlockOption = {\n label: string;\n description?: string;\n};\n\nexport type QuestionFormBlockQuestion = {\n id?: string;\n question: string;\n options: QuestionFormBlockOption[];\n multiple: boolean;\n required: boolean;\n allowCustomAnswer: boolean;\n};\n\nexport type Block =\n | { type: \"comment\"; text: string; reactions?: { clap?: number } }\n | { type: \"code\"; language: string; code: string; editable?: boolean }\n | {\n type: \"diff\";\n language?: string;\n original: string;\n modified: string;\n sideBySide?: boolean;\n }\n | { type: \"input\"; placeholder?: string }\n | { type: \"text\"; text: string }\n | { type: \"todo-list\"; items: TodoListBlockItem[] }\n | { type: \"question-form\"; questions: QuestionFormBlockQuestion[] }\n | { type: \"references\"; references: string[] }\n | { type: \"image\"; src: string; alt: string; caption?: string }\n | {\n type: \"component\";\n render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode;\n };\n\nfunction IndicatorView({ ind }: { ind?: Indicator }) {\n if (!ind || ind.type === \"none\") return null;\n\n if (ind.type === \"icon\") {\n const IndicatorIcon = getIconComponent(ind.icon);\n return (\n <Timeline.Indicator outline=\"none\" border=\"none\" background=\"bg\" color=\"fg\">\n <Span display=\"inline-flex\" alignItems=\"center\">\n <IndicatorIcon size={14} strokeWidth={1} />\n </Span>\n </Timeline.Indicator>\n );\n }\n\n return (\n <Timeline.Indicator>\n <Avatar.Root boxSize=\"full\">\n <Avatar.Image src={ind.src} alt={ind.alt} />\n <Avatar.Fallback background=\"bg.muted\" color=\"fg.muted\" />\n </Avatar.Root>\n </Timeline.Indicator>\n );\n}\n\nfunction CodeBlock({ code, language }: { code: string; language?: string }) {\n return (\n <ScrollArea\n background=\"bg.code\"\n color=\"fg.muted\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"md\"\n showHorizontalScrollbar\n showVerticalScrollbar={false}\n >\n <Box\n as=\"pre\"\n padding=\"sm\"\n textStyle=\"mono/XS\"\n whiteSpace=\"pre\"\n aria-label={language ? `${language} code block` : \"code block\"}\n >\n <Box as=\"code\">{code}</Box>\n </Box>\n </ScrollArea>\n );\n}\n\nfunction BlockView({ b, onOpenFile }: { b: Block; onOpenFile?: (filePath: string) => void }) {\n switch (b.type) {\n case \"comment\":\n return (\n <Card.Root>\n <Card.Body>{b.text}</Card.Body>\n {b.reactions?.clap ? (\n <Card.Footer>\n <Button>👏 {b.reactions.clap}</Button>\n </Card.Footer>\n ) : null}\n </Card.Root>\n );\n case \"code\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <CodeBlock language={b.language} code={b.code} />\n </Card.Body>\n </Card.Root>\n );\n case \"diff\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <Box height=\"240px\" minW=\"320px\" overflow=\"hidden\">\n <DiffEditor\n original={b.original}\n modified={b.modified}\n language={b.language}\n sideBySide={b.sideBySide ?? false}\n disableScroll={true}\n />\n </Box>\n </Card.Body>\n </Card.Root>\n );\n case \"text\":\n return (\n <Card.Root background=\"transparent\">\n <Card.Body padding=\"sm\">\n <Text textStyle=\"label/S/regular\">{b.text}</Text>\n </Card.Body>\n </Card.Root>\n );\n case \"todo-list\":\n return <TodoListBlockView items={b.items} />;\n case \"question-form\":\n return <QuestionFormBlockView questions={b.questions} />;\n case \"references\":\n return (\n <Stack mt=\"xs\" gap=\"xs\" flexDir=\"row\" flexWrap=\"wrap\">\n {b.references.map((ref) => (\n <ResourceBadge key={ref} fileName={ref} />\n ))}\n </Stack>\n );\n case \"image\":\n if (!b.src.trim()) return null;\n return (\n <Card.Root border=\"0\" padding=\"0\" background=\"transparent\">\n <Card.Body padding=\"0\">\n <Image\n src={b.src}\n alt={b.alt}\n maxH=\"18rem\"\n maxW=\"full\"\n objectFit=\"contain\"\n borderRadius=\"sm\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n />\n {b.caption ? (\n <Text mt=\"2xs\" textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {b.caption}\n </Text>\n ) : null}\n </Card.Body>\n </Card.Root>\n );\n case \"component\":\n return <>{b.render({ onOpenFile })}</>;\n }\n}\n\nfunction TimelineItemRow({\n item,\n itemKey,\n isOpen,\n canExpand,\n hasBlocks,\n onToggle,\n onOpenFile,\n}: {\n item: Item;\n itemKey: string;\n isOpen: boolean;\n canExpand: boolean;\n hasBlocks: boolean;\n onToggle: (key: string) => void;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <Timeline.Item gap=\"xs\" key={itemKey}>\n <Timeline.Connector>\n <Timeline.Separator />\n <IndicatorView ind={item.indicator} />\n </Timeline.Connector>\n <Timeline.Content h={isOpen ? \"auto\" : \"20px\"}>\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n minW=\"0\"\n width=\"full\"\n overflow=\"hidden\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"nowrap\" minW=\"0\" width=\"full\">\n <Span display=\"flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"nowrap\" minW=\"0\" flex=\"1\" overflow=\"hidden\">\n {item.title.map((seg, i) => (\n <TitleInline key={i} seg={seg} isClickable={canExpand} onOpenFile={onOpenFile} />\n ))}\n </Span>\n {canExpand ? (\n <Span\n display=\"inline-flex\"\n alignItems=\"center\"\n transition=\"transform 200ms ease, color 200ms ease\"\n transform={isOpen ? \"rotate(0deg)\" : \"rotate(-180deg)\"}\n color=\"transparent\"\n flexShrink=\"0\"\n _groupHover={{ color: \"fg\" }}\n >\n <ChevronUpIcon size={12} />\n </Span>\n ) : null}\n </Span>\n </Timeline.Title>\n )}\n {hasBlocks ? (\n <Box display=\"grid\" gridTemplateRows={isOpen ? \"1fr\" : \"0fr\"} transition=\"grid-template-rows 220ms ease\">\n {isOpen ? (\n <Box\n overflow=\"hidden\"\n opacity={1}\n transform=\"translateY(0)\"\n transition=\"opacity 200ms ease, transform 200ms ease\"\n >\n {item.blocks!.map((block, i) => (\n <Box key={i}>\n <BlockView b={block} onOpenFile={onOpenFile} />\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Timeline.Content>\n </Timeline.Item>\n );\n}\n\nexport function TimelineFromJSON({ data, onOpenFile }: { data: TimelineDoc; onOpenFile?: (filePath: string) => void }) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const getKey = (it: Item, idx: number) => (it.id ? `id:${it.id}` : `idx:${idx}`);\n\n const toggle = (key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n return (\n <Timeline.Root>\n {data.items.map((item, idx) => {\n const key = getKey(item, idx);\n const hasBlocks = (item.blocks?.length ?? 0) > 0;\n const canExpand = (item.expandable ?? true) && hasBlocks;\n const isOpen = canExpand ? (expanded[key] ?? false) : hasBlocks;\n\n return (\n <TimelineItemRow\n key={key}\n item={item}\n itemKey={key}\n isOpen={isOpen}\n canExpand={canExpand}\n hasBlocks={hasBlocks}\n onToggle={toggle}\n onOpenFile={onOpenFile}\n />\n );\n })}\n </Timeline.Root>\n );\n}\n","import { buildTimelineDocFromInvocations } from \"../tool-rendering\";\nimport { normalizeToolName } from \"../utils/tool-name\";\nimport type { ToolPart } from \"./message-types\";\nimport { TimelineFromJSON } from \"./timeline\";\n\nexport interface ToolInvocationTimelineProps {\n invocations: ToolPart[];\n labeledBlocks?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n}\n\nconst isQuestionTool = (invocation: ToolPart) =>\n normalizeToolName(invocation.tool ?? \"\").replace(/_/g, \"\") === \"question\";\n\nconst hasToolOutput = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (typeof output === \"string\") return output.trim().length > 0;\n if (Array.isArray(output)) return output.length > 0;\n if (output && typeof output === \"object\") return Object.keys(output).length > 0;\n return output !== undefined && output !== null;\n};\n\nexport function ToolInvocationTimeline(props: ToolInvocationTimelineProps) {\n const { invocations, labeledBlocks, hideQuestionForms = false, onOpenFile } = props;\n const visibleInvocations = hideQuestionForms\n ? invocations.filter((invocation) => !isQuestionTool(invocation) || hasToolOutput(invocation))\n : invocations;\n\n if (visibleInvocations.length === 0) return null;\n\n const data = buildTimelineDocFromInvocations(visibleInvocations, { labeledBlocks });\n\n return <TimelineFromJSON data={data} onOpenFile={onOpenFile} />;\n}\n","import { Box, Image, Spinner } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { AlertMessage } from \"@/components/primitives/alert\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { RichMessage } from \"@/components/rich-text\";\nimport { Response } from \"./ai-response\";\nimport type { AlertPart, ChatMessagePart, ErrorPart, FilePart, SessionMessage, ToolPart } from \"./message-types\";\nimport { ToolInvocationTimeline, type ToolInvocationTimelineProps } from \"./tool-invocation-timeline\";\n\ntype ToolInvocationTimelineComponent = (props: ToolInvocationTimelineProps) => ReactNode;\n\nexport interface MessagePartsProps {\n message: SessionMessage;\n streaming?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n toolInvocationTimeline?: ToolInvocationTimelineComponent;\n}\n\nconst isToolPart = (part: ChatMessagePart): part is ToolPart => {\n return part.type === \"tool\";\n};\n\nconst filePartLabel = (part: FilePart) => part.filename ?? part.url.split(\"/\").pop() ?? \"attachment\";\n\nconst imageExtensionPattern = /\\.(avif|bmp|gif|jpe?g|png|svg|webp)$/i;\n\nconst isImageFilePart = (part: FilePart) =>\n part.mediaType?.startsWith(\"image/\") || imageExtensionPattern.test(filePartLabel(part));\n\nconst filePartThumbnail = (part: FilePart) =>\n isImageFilePart(part) ? (\n <Image\n src={part.url}\n alt={`${filePartLabel(part)} preview thumbnail`}\n boxSize=\"18px\"\n borderRadius=\"xs\"\n objectFit=\"cover\"\n />\n ) : undefined;\n\nconst openFilePart = (part: FilePart, onOpenFile?: (filePath: string) => void) => {\n if (onOpenFile) {\n onOpenFile(part.url);\n return;\n }\n\n if (typeof window !== \"undefined\") {\n window.open(part.url, \"_blank\", \"noopener,noreferrer\");\n }\n};\n\nconst getErrorMessage = (part: ErrorPart) => {\n if (part.message && part.message.trim().length > 0) {\n return part.message;\n }\n\n const { errorType } = part;\n switch (errorType) {\n case \"timeout\":\n return \"Session timed out.\";\n case \"crash\":\n return \"Session crashed unexpectedly.\";\n case \"permission\":\n return \"Permission denied.\";\n default:\n return \"An error occurred.\";\n }\n};\n\nconst ALERT_COLOR_PALETTE: Record<AlertPart[\"status\"], string> = {\n info: \"blue\",\n warning: \"orange\",\n error: \"red\",\n success: \"green\",\n loading: \"blue\",\n};\n\nconst collectToolInvocations = (parts: ChatMessagePart[], startIndex: number) => {\n const invocations: ToolPart[] = [];\n let lookahead = startIndex;\n\n while (lookahead < parts.length) {\n const nextPart = parts[lookahead];\n if (!isToolPart(nextPart)) break;\n invocations.push(nextPart);\n lookahead += 1;\n }\n\n return { invocations, nextIndex: lookahead - 1 };\n};\n\nexport function MessagePartsRenderer(props: MessagePartsProps) {\n const { message, hideQuestionForms = false, onOpenFile, toolInvocationTimeline } = props;\n const RenderToolInvocationTimeline = toolInvocationTimeline ?? ToolInvocationTimeline;\n const parts = message.parts ?? [];\n const nodes: ReactNode[] = [];\n\n for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n const part = parts[partIndex];\n const key = `${message.id}-${partIndex}`;\n\n switch (part.type) {\n case \"text\":\n nodes.push(\n <div key={key}>\n <Response>{part.text}</Response>\n </div>,\n );\n break;\n case \"reasoning\":\n nodes.push(\n <Box\n key={key}\n padding=\"0\"\n css={{\n \"& .rich-text, & .rich-text *\": {\n color: \"fg.subtle !important\",\n fontSize: \".75rem !important\",\n fontWeight: \"normal !important\",\n },\n }}\n >\n <RichMessage defaultState={part.text} fullWidth />\n </Box>,\n );\n break;\n case \"tool\": {\n const { invocations, nextIndex } = collectToolInvocations(parts, partIndex);\n partIndex = nextIndex;\n nodes.push(\n <Box key={key} width=\"full\">\n <RenderToolInvocationTimeline\n invocations={invocations}\n labeledBlocks\n hideQuestionForms={hideQuestionForms}\n onOpenFile={onOpenFile}\n />\n </Box>,\n );\n break;\n }\n case \"file\":\n nodes.push(\n <Box key={key} width=\"fit-content\">\n <ResourceBadge\n fileName={filePartLabel(part)}\n size=\"sm\"\n tone=\"neutral\"\n icon={filePartThumbnail(part)}\n onSelect={() => openFilePart(part, onOpenFile)}\n />\n </Box>,\n );\n break;\n case \"error\":\n nodes.push(\n <Box key={key} py=\"2\" width=\"full\">\n <AlertMessage borderRadius=\"xs\" status=\"error\" colorPalette=\"red\" title={getErrorMessage(part)} size=\"sm\" />\n </Box>,\n );\n break;\n case \"token_usage\":\n break;\n case \"alert\":\n nodes.push(\n <Box key={key} width=\"full\">\n <AlertMessage\n borderRadius=\"xs\"\n status={part.status === \"loading\" ? \"info\" : part.status}\n colorPalette={ALERT_COLOR_PALETTE[part.status]}\n title={part.title}\n icon={part.status === \"loading\" ? <Spinner size=\"sm\" /> : undefined}\n size=\"sm\"\n >\n {part.message}\n </AlertMessage>\n </Box>,\n );\n break;\n default:\n nodes.push(null);\n }\n }\n\n return <>{nodes}</>;\n}\n","// Keep the non-alert session parts aligned with pstdio-api-contracts/src/session-messages.ts.\n// @pstdio/ui cannot import that private package, so the public UI contract owns this copy.\nexport type SessionMessageRole = \"user\" | \"assistant\" | \"tool\" | \"system\" | \"developer\";\n\nexport type TextPart = { type: \"text\"; text: string };\n\nexport type ReasoningPart = { type: \"reasoning\"; text: string };\n\nexport type ToolPartActionType = \"read\" | \"write\" | \"execute\" | \"network\" | \"other\";\n\nexport type ToolPartStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"denied\";\n\nexport type ToolPart = {\n type: \"tool\";\n tool: string;\n callId?: string;\n actionType?: ToolPartActionType;\n status?: ToolPartStatus;\n state?: {\n status?: string;\n input?: unknown;\n output?: unknown;\n errorText?: string;\n metadata?: unknown;\n };\n};\n\nexport type StepStartPart = { type: \"step-start\"; snapshot?: string };\n\nexport type StepFinishPart = {\n type: \"step-finish\";\n reason?: string;\n snapshot?: string;\n cost?: number;\n tokens?: unknown;\n};\n\nexport type PatchPart = { type: \"patch\"; hash?: string; files?: unknown };\n\nexport type FilePart = {\n type: \"file\";\n fileId?: string;\n mediaType?: string;\n filename?: string;\n size?: number;\n url: string;\n};\n\nexport type LoadingPart = { type: \"loading\" };\n\nexport type ErrorPart = {\n type: \"error\";\n errorType: \"timeout\" | \"crash\" | \"permission\" | \"other\";\n message?: string;\n};\n\nexport type TokenUsagePart = {\n type: \"token_usage\";\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n};\n\nexport type AlertPart = {\n type: \"alert\";\n status: \"info\" | \"warning\" | \"error\" | \"success\" | \"loading\";\n title: string;\n message?: string;\n};\n\nexport type SessionMessagePart =\n | TextPart\n | ReasoningPart\n | ToolPart\n | StepStartPart\n | StepFinishPart\n | PatchPart\n | FilePart\n | LoadingPart\n | ErrorPart\n | TokenUsagePart;\n\nexport type ChatMessagePart = SessionMessagePart | AlertPart;\n\nexport type SessionMessage = {\n id: string;\n role: SessionMessageRole;\n parts: ChatMessagePart[];\n index?: number;\n createdAt?: number;\n modelId?: string;\n providerId?: string;\n tokens?: {\n input?: number;\n output?: number;\n reasoning?: number;\n cache?: { read?: number; write?: number };\n };\n};\n\nexport type QueuedFollowUp = {\n id: string;\n prompt: string;\n attachments?: Array<{\n id: string;\n name: string;\n mediaType?: string;\n url?: string;\n }>;\n position?: number;\n};\n\nexport type MessageOrigin = \"user\" | \"assistant\" | \"developer\";\n\nexport const getMessageOrigin = (role: string): MessageOrigin => {\n if (role === \"user\" || role === \"assistant\" || role === \"developer\") return role;\n return \"assistant\";\n};\n\nconst isReasoningToolOnlyMessage = (message: SessionMessage) => {\n const parts = message.parts ?? [];\n if (parts.length === 0) return false;\n\n const hasTextPart = parts.some((part) => part.type === \"text\" && \"text\" in part);\n if (hasTextPart) return false;\n\n return parts.some((part) => part.type === \"reasoning\" || part.type === \"tool\");\n};\n\nconst isVisibleText = (part: TextPart | ReasoningPart) => part.text.trim().length > 0;\n\nconst isVisibleAlert = (part: AlertPart) => part.title.trim().length > 0 || Boolean(part.message?.trim());\n\nconst isDisplayRenderablePart = (part: ChatMessagePart) => {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n return isVisibleText(part);\n case \"tool\":\n case \"file\":\n case \"error\":\n return true;\n case \"alert\":\n return isVisibleAlert(part);\n default:\n return false;\n }\n};\n\nconst isActivityPart = (part: ChatMessagePart) => part.type === \"reasoning\" || part.type === \"tool\";\n\nconst isActivityOnlyMessage = (message: SessionMessage) => {\n if (message.role === \"user\") return false;\n if (message.parts.length === 0) return false;\n return message.parts.every(isActivityPart);\n};\n\nconst mergeBufferedActivity = (messages: SessionMessage[]) => {\n if (messages.length === 0) return null;\n\n const [first, ...rest] = messages;\n if (!first) return null;\n\n return {\n ...first,\n role: \"assistant\",\n parts: messages.flatMap((message) => message.parts),\n modelId: rest.at(-1)?.modelId ?? first.modelId,\n providerId: rest.at(-1)?.providerId ?? first.providerId,\n } satisfies SessionMessage;\n};\n\nexport const mergeReasoningToolOnlyMessages = (messages: SessionMessage[]) => {\n const merged: SessionMessage[] = [];\n\n for (const message of messages) {\n const previous = merged[merged.length - 1];\n\n if (previous && previous.role === message.role && isReasoningToolOnlyMessage(message)) {\n previous.parts = [...(previous.parts ?? []), ...(message.parts ?? [])];\n continue;\n }\n\n merged.push({\n ...message,\n parts: [...(message.parts ?? [])],\n });\n }\n\n return merged;\n};\n\nexport const normalizeChatMessagesForDisplay = (messages: SessionMessage[], options: { streaming?: boolean } = {}) => {\n const normalized: SessionMessage[] = [];\n let activityBuffer: SessionMessage[] = [];\n\n const clearActivityBuffer = () => {\n activityBuffer = [];\n };\n\n for (const message of messages) {\n const displayParts = (message.parts ?? []).filter(isDisplayRenderablePart);\n if (displayParts.length === 0) continue;\n\n const displayMessage = { ...message, parts: displayParts };\n\n if (displayMessage.role === \"user\") {\n clearActivityBuffer();\n normalized.push(displayMessage);\n continue;\n }\n\n if (isActivityOnlyMessage(displayMessage)) {\n activityBuffer.push(displayMessage);\n continue;\n }\n\n if (activityBuffer.length > 0) {\n normalized.push({\n ...displayMessage,\n parts: [...activityBuffer.flatMap((activity) => activity.parts), ...displayMessage.parts],\n });\n clearActivityBuffer();\n continue;\n }\n\n normalized.push(displayMessage);\n }\n\n if (options.streaming && activityBuffer.length > 0) {\n const trailingActivity = mergeBufferedActivity(activityBuffer);\n if (trailingActivity) normalized.push(trailingActivity);\n }\n\n return normalized;\n};\n\nexport interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\n}\n\nexport const getAssistantMessageActionTargetId = (messages: SessionMessage[]) => {\n const lastMessage = messages.at(-1);\n if (lastMessage?.role !== \"assistant\") return null;\n\n const hasVisibleText = lastMessage.parts.some((part) => part.type === \"text\" && isVisibleText(part));\n return hasVisibleText ? lastMessage.id : null;\n};\n\n// Groups messages into turns: each group starts with a user message\n// followed by all non-user messages until the next user message.\nexport const groupMessagesByTurn = (messages: SessionMessage[]) => {\n const groups: MessageGroup[] = [];\n const leadingResponses: SessionMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"user\") {\n groups.push({ userMessage: message, responses: [] });\n } else if (groups.length > 0) {\n groups[groups.length - 1].responses.push(message);\n } else {\n leadingResponses.push(message);\n }\n }\n\n return { groups, leadingResponses };\n};\n","import { Button, Flex } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { ChatMessage } from \"./ai-message\";\nimport { messageFadeInProps } from \"./chat-message-animation\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getMessageOrigin, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListResponseProps {\n message: SessionMessage;\n streaming: boolean;\n hideQuestionForms?: boolean;\n animate?: boolean;\n showAssistantActions: boolean;\n}\n\nexport const ChatMessageListResponse = (props: ChatMessageListResponseProps) => {\n const { message, streaming, hideQuestionForms = false, animate = false, showAssistantActions } = props;\n const from = getMessageOrigin(message.role);\n const showActions = from === \"user\" || (from === \"assistant\" && showAssistantActions);\n\n return (\n <ChatMessage.Root from={from} {...(animate ? messageFadeInProps : undefined)}>\n <ChatMessage.Content from={from}>\n <MessagePartsRenderer message={message} streaming={streaming} hideQuestionForms={hideQuestionForms} />\n {showActions ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\n};\n\ninterface StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\n}\n\nexport const StickyMessageToggle = (props: StickyMessageToggleProps) => {\n const { label, onClick, actionPanel } = props;\n\n return (\n <Flex\n position=\"absolute\"\n bottom=\"0\"\n left=\"0\"\n right=\"0\"\n justifyContent={actionPanel ? \"space-between\" : \"flex-end\"}\n alignItems=\"flex-end\"\n px=\"xs\"\n pb=\"xs\"\n pt=\"lg\"\n bgGradient=\"to-t\"\n gradientFrom=\"bg.subtle\"\n gradientTo=\"transparent\"\n borderBottomRadius=\"xs\"\n pointerEvents=\"none\"\n >\n {actionPanel}\n <Button size=\"2xs\" variant=\"outline\" pointerEvents=\"auto\" onClick={onClick}>\n {label}\n </Button>\n </Flex>\n );\n};\n","import type { SessionMessage } from \"./message-types\";\n\nexport const STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD = 360;\nexport const STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD = 4;\nexport const STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT = \"min(10vh, 4rem)\";\nexport const STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT = \"min(70dvh, calc(100dvh - 12rem), 22rem)\";\n\nconst SCROLL_BOUNDARY_EPSILON = 1;\n\ninterface StickyUserMessageScrollElement {\n clientHeight: number;\n scrollHeight: number;\n scrollTop: number;\n}\n\nconst getMessageTextMetrics = (message: SessionMessage) => {\n return message.parts.reduce(\n (metrics, part) => {\n if (part.type !== \"text\") return metrics;\n\n return {\n lineCount: metrics.lineCount + part.text.split(/\\r\\n|\\r|\\n/).length,\n textLength: metrics.textLength + part.text.length,\n };\n },\n { lineCount: 0, textLength: 0 },\n );\n};\n\nexport const isStickyUserMessageCollapsible = (message: SessionMessage) => {\n if (message.role !== \"user\") return false;\n\n const { lineCount, textLength } = getMessageTextMetrics(message);\n\n return (\n textLength > STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD || lineCount > STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD\n );\n};\n\nexport const shouldStopStickyUserMessageWheel = (element: StickyUserMessageScrollElement, deltaY: number) => {\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\n\n if (deltaY === 0 || maxScrollTop <= SCROLL_BOUNDARY_EPSILON) return false;\n if (deltaY < 0) return element.scrollTop > SCROLL_BOUNDARY_EPSILON;\n\n return element.scrollTop < maxScrollTop - SCROLL_BOUNDARY_EPSILON;\n};\n","import { Box } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useEffect, useRef, type WheelEvent } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ChatMessage } from \"./ai-message\";\nimport { messageFadeInProps, useMessageAnimationKeys } from \"./chat-message-animation\";\nimport { ChatMessageListResponse, StickyMessageToggle } from \"./chat-message-list-items\";\nimport {\n isStickyUserMessageCollapsible,\n STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT,\n STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT,\n shouldStopStickyUserMessageWheel,\n} from \"./chat-panel-sticky-user-message\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getAssistantMessageActionTargetId, type MessageGroup, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListProps {\n leadingResponses: SessionMessage[];\n groups: MessageGroup[];\n streaming: boolean;\n hideActiveQuestionForms: boolean;\n expandedStickyMessageIds: Set<string>;\n onToggleStickyMessage: (messageId: string) => void;\n onReady?: () => void;\n}\n\ninterface StickyMessageGroupProps {\n group: MessageGroup;\n streaming: boolean;\n hideQuestionForms: boolean;\n isExpanded: boolean;\n animate: boolean;\n onToggleStickyMessage: (messageId: string) => void;\n}\n\ntype ChatMessageListItem =\n | {\n type: \"leading-response\";\n key: string;\n message: SessionMessage;\n showAssistantActions: boolean;\n }\n | {\n type: \"group\";\n key: string;\n group: MessageGroup;\n groupIndex: number;\n };\n\nconst ESTIMATED_TURN_HEIGHT = 720;\nconst INITIAL_TAIL_VIEWPORT_HEIGHT = 1;\nconst TAIL_READY_STABLE_FRAME_COUNT = 3;\nconst TAIL_READY_FRAME_LIMIT = 20;\nconst TAIL_READY_PIXEL_EPSILON = 1;\nconst VIRTUAL_LIST_OVERSCAN = 4;\nconst VIRTUAL_LIST_GAP = 8;\n\nconst buildMessageListItems = (leadingResponses: SessionMessage[], groups: MessageGroup[]) => {\n const leadingActionMessageId = getAssistantMessageActionTargetId(leadingResponses);\n\n return [\n ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n showAssistantActions: message.id === leadingActionMessageId,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\n })),\n ];\n};\n\nconst getEstimatedTailOffset = (count: number, viewportHeight: number) => {\n if (count === 0) return 0;\n\n const estimatedTotalSize = count * ESTIMATED_TURN_HEIGHT + (count - 1) * VIRTUAL_LIST_GAP;\n return Math.max(estimatedTotalSize - viewportHeight, 0);\n};\n\nconst getInitialViewportHeight = (scrollElement: HTMLElement | null) =>\n scrollElement?.clientHeight || INITIAL_TAIL_VIEWPORT_HEIGHT;\n\ninterface TailLayoutSnapshot {\n scrollTop: number;\n totalSize: number;\n}\n\nconst isTailLayoutStable = (current: TailLayoutSnapshot, previous: TailLayoutSnapshot) =>\n Math.abs(current.scrollTop - previous.scrollTop) <= TAIL_READY_PIXEL_EPSILON &&\n Math.abs(current.totalSize - previous.totalSize) <= TAIL_READY_PIXEL_EPSILON;\n\nconst readTailLayoutSnapshot = (scrollElement: HTMLElement | null, totalSize: number): TailLayoutSnapshot => ({\n scrollTop: scrollElement?.scrollTop ?? 0,\n totalSize,\n});\n\nconst useTailReady = (input: {\n itemCount: number;\n onReady?: () => void;\n scrollRef: { current: HTMLElement | null };\n totalSize: number;\n}) => {\n const { itemCount, onReady, scrollRef, totalSize } = input;\n const onReadyRef = useRef(onReady);\n\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n useEffect(() => {\n if (itemCount === 0 || typeof requestAnimationFrame === \"undefined\") {\n onReadyRef.current?.();\n return;\n }\n\n let frameId = 0;\n let checkedFrameCount = 0;\n let stableFrameCount = 0;\n let previousSnapshot: TailLayoutSnapshot | null = null;\n\n const waitForStableTail = () => {\n checkedFrameCount += 1;\n\n const nextSnapshot = readTailLayoutSnapshot(scrollRef.current, totalSize);\n stableFrameCount =\n previousSnapshot && isTailLayoutStable(nextSnapshot, previousSnapshot) ? stableFrameCount + 1 : 0;\n previousSnapshot = nextSnapshot;\n\n if (stableFrameCount >= TAIL_READY_STABLE_FRAME_COUNT || checkedFrameCount >= TAIL_READY_FRAME_LIMIT) {\n onReadyRef.current?.();\n return;\n }\n\n frameId = requestAnimationFrame(waitForStableTail);\n };\n\n frameId = requestAnimationFrame(waitForStableTail);\n\n return () => cancelAnimationFrame(frameId);\n }, [itemCount, scrollRef, totalSize]);\n};\n\nconst handleExpandedStickyMessageWheel = (event: WheelEvent<HTMLElement>) => {\n if (shouldStopStickyUserMessageWheel(event.currentTarget, event.deltaY)) {\n event.stopPropagation();\n }\n};\n\nconst getStickyMessageMaxHeight = (isCollapsible: boolean, isExpanded: boolean) => {\n if (!isCollapsible) return undefined;\n if (isExpanded) return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n\n return STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT;\n};\n\nconst getStickyMessageBodyMaxHeight = (isExpandedCollapsible: boolean) => {\n if (!isExpandedCollapsible) return undefined;\n\n return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n};\n\nconst StickyMessageGroup = (props: StickyMessageGroupProps) => {\n const { group, streaming, hideQuestionForms, isExpanded, animate, onToggleStickyMessage } = props;\n const isCollapsible = isStickyUserMessageCollapsible(group.userMessage);\n const isExpandedCollapsible = isCollapsible && isExpanded;\n const stickyMessageMaxHeight = getStickyMessageMaxHeight(isCollapsible, isExpanded);\n const toggleStickyMessage = () => onToggleStickyMessage(group.userMessage.id);\n const actionMessageId = getAssistantMessageActionTargetId(group.responses);\n\n return (\n <Box>\n <Box position=\"sticky\" top=\"0\" zIndex={1}>\n <ChatMessage.Root from=\"user\" {...(animate ? messageFadeInProps : undefined)}>\n <ChatMessage.Content\n from=\"user\"\n maxH={stickyMessageMaxHeight}\n overflow=\"hidden\"\n p={isCollapsible ? \"0\" : undefined}\n position={isCollapsible ? \"relative\" : undefined}\n >\n <Box\n data-sticky-user-message-content={isCollapsible ? (isExpanded ? \"expanded\" : \"collapsed\") : undefined}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"sm\"\n maxH={getStickyMessageBodyMaxHeight(isExpandedCollapsible)}\n minH=\"0\"\n overflowY={isExpandedCollapsible ? \"auto\" : \"visible\"}\n px={isCollapsible ? \"xs\" : undefined}\n py={isCollapsible ? \"xs\" : undefined}\n pb={isExpandedCollapsible ? \"3rem\" : undefined}\n onWheel={isExpandedCollapsible ? handleExpandedStickyMessageWheel : undefined}\n >\n <MessagePartsRenderer message={group.userMessage} streaming={streaming} />\n </Box>\n {isCollapsible ? (\n <StickyMessageToggle\n label={isExpanded ? \"Show less\" : \"Show more\"}\n onClick={toggleStickyMessage}\n actionPanel={<MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />}\n />\n ) : (\n <MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />\n )}\n </ChatMessage.Content>\n </ChatMessage.Root>\n </Box>\n {group.responses.map((message) => (\n <Box key={message.id}>\n <ChatMessageListResponse\n message={message}\n streaming={streaming}\n hideQuestionForms={hideQuestionForms}\n showAssistantActions={message.id === actionMessageId}\n />\n </Box>\n ))}\n </Box>\n );\n};\n\nconst renderListItem = (\n item: ChatMessageListItem,\n props: Pick<\n ChatMessageListProps,\n \"groups\" | \"streaming\" | \"hideActiveQuestionForms\" | \"expandedStickyMessageIds\" | \"onToggleStickyMessage\"\n > & { animatedItemKeys: Set<string> },\n) => {\n const {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n animatedItemKeys,\n onToggleStickyMessage,\n } = props;\n\n if (item.type === \"leading-response\") {\n return (\n <ChatMessageListResponse\n message={item.message}\n streaming={streaming}\n hideQuestionForms={groups.length > 0 || hideActiveQuestionForms}\n animate={animatedItemKeys.has(item.key)}\n showAssistantActions={item.showAssistantActions}\n />\n );\n }\n\n return (\n <StickyMessageGroup\n group={item.group}\n streaming={streaming}\n hideQuestionForms={item.groupIndex < groups.length - 1 || hideActiveQuestionForms}\n isExpanded={expandedStickyMessageIds.has(item.group.userMessage.id)}\n animate={animatedItemKeys.has(item.key)}\n onToggleStickyMessage={onToggleStickyMessage}\n />\n );\n};\n\nexport const ChatMessageList = (props: ChatMessageListProps) => {\n const {\n leadingResponses,\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n onReady,\n } = props;\n const { scrollRef } = useStickToBottomContext();\n const items = buildMessageListItems(leadingResponses, groups);\n const animatedItemKeys = useMessageAnimationKeys(items.map((item) => item.key));\n const initialViewportHeight = getInitialViewportHeight(scrollRef.current);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollRef.current as HTMLDivElement | null,\n estimateSize: () => ESTIMATED_TURN_HEIGHT,\n getItemKey: (index) => items[index]?.key ?? index,\n overscan: VIRTUAL_LIST_OVERSCAN,\n gap: VIRTUAL_LIST_GAP,\n initialRect: { width: 0, height: initialViewportHeight },\n initialOffset: () => getEstimatedTailOffset(items.length, initialViewportHeight),\n });\n const totalSize = virtualizer.getTotalSize();\n\n useTailReady({\n itemCount: items.length,\n onReady,\n scrollRef,\n totalSize,\n });\n\n return (\n <Box px=\"xs\">\n <Box position=\"relative\" width=\"100%\" style={{ height: totalSize }}>\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const item = items[virtualItem.index];\n if (!item) return null;\n\n return (\n <Box\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n data-chat-message-list-item={item.type}\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"100%\"\n style={{ top: virtualItem.start }}\n >\n {renderListItem(item, {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n animatedItemKeys,\n onToggleStickyMessage,\n })}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import { Badge, Box, Icon as ChakraIcon, HStack, IconButton, Stack, Text } from \"@chakra-ui/react\";\nimport { GripVertical, Pencil, Trash2 } from \"lucide-react\";\nimport { type DragEvent, useState } from \"react\";\nimport type { QueuedFollowUp } from \"./message-types\";\nimport type { QueuedFollowUpMoveDirection } from \"./queued-follow-up-list-state\";\n\ninterface QueuedFollowUpListProps {\n items: QueuedFollowUp[];\n editingItemId?: string | null;\n onEdit?: (item: QueuedFollowUp) => void;\n onRemove?: (itemId: string) => void;\n onMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n}\n\ninterface QueuedFollowUpRowProps {\n item: QueuedFollowUp;\n index: number;\n isFirst: boolean;\n isLast: boolean;\n isEditing: boolean;\n isDragTarget: boolean;\n onEdit?: (item: QueuedFollowUp) => void;\n onRemove?: (itemId: string) => void;\n onDragStart: (itemId: string) => void;\n onDragEnd: () => void;\n onDragOver: (event: DragEvent<HTMLDivElement>, itemId: string) => void;\n onDrop: (event: DragEvent<HTMLDivElement>, itemId: string) => void;\n}\n\nconst QueuedFollowUpRow = (props: QueuedFollowUpRowProps) => {\n const {\n item,\n index,\n isFirst,\n isLast,\n isEditing,\n isDragTarget,\n onEdit,\n onRemove,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDrop,\n } = props;\n const canEdit = Boolean(onEdit);\n const canRemove = Boolean(onRemove);\n const canDrag = !isFirst || !isLast;\n const dragLabel = `Drag queued follow-up ${index + 1}`;\n\n return (\n <Box\n minWidth=\"0\"\n borderTopWidth={isFirst ? \"0\" : \"1px\"}\n borderColor={isDragTarget ? \"border.accent-light\" : \"border.subtle\"}\n paddingTop={isFirst ? \"0\" : \"2xs\"}\n paddingBottom=\"2xs\"\n bg={isEditing ? \"bg.muted\" : undefined}\n onDragOver={(event) => onDragOver(event, item.id)}\n onDrop={(event) => onDrop(event, item.id)}\n data-queued-follow-up-id={item.id}\n >\n <HStack gap=\"xs\" alignItems=\"flex-start\">\n <IconButton\n size=\"2xs\"\n variant=\"ghost\"\n draggable={canDrag}\n aria-label={dragLabel}\n title={dragLabel}\n color=\"fg.muted\"\n cursor={canDrag ? \"grab\" : \"default\"}\n disabled={!canDrag}\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", item.id);\n onDragStart(item.id);\n }}\n onDragEnd={onDragEnd}\n >\n <ChakraIcon as={GripVertical} boxSize=\"14px\" />\n </IconButton>\n <Stack gap=\"2xs\" flex=\"1\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\" lineClamp={2} minWidth=\"0\">\n {item.prompt}\n </Text>\n {item.attachments?.length ? (\n <Badge width=\"fit-content\" size=\"sm\" variant=\"outline\" colorPalette=\"gray\">\n {item.attachments.length} attachments\n </Badge>\n ) : null}\n </Stack>\n <HStack gap=\"2xs\" flexShrink={0}>\n {canEdit ? (\n <IconButton size=\"2xs\" variant=\"ghost\" aria-label=\"Edit queued follow-up\" onClick={() => onEdit?.(item)}>\n <ChakraIcon as={Pencil} boxSize=\"14px\" />\n </IconButton>\n ) : null}\n {canRemove ? (\n <IconButton\n size=\"2xs\"\n variant=\"ghost\"\n aria-label=\"Remove queued follow-up\"\n colorPalette=\"red\"\n onClick={() => onRemove?.(item.id)}\n >\n <ChakraIcon as={Trash2} boxSize=\"14px\" />\n </IconButton>\n ) : null}\n </HStack>\n </HStack>\n </Box>\n );\n};\n\nexport const QueuedFollowUpList = (props: QueuedFollowUpListProps) => {\n const { items, editingItemId, onEdit, onRemove, onMove } = props;\n const [draggedItemId, setDraggedItemId] = useState<string | null>(null);\n const [dragTargetItemId, setDragTargetItemId] = useState<string | null>(null);\n if (items.length === 0) return null;\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>, itemId: string) => {\n if (!draggedItemId || draggedItemId === itemId) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDragTargetItemId(itemId);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>, itemId: string) => {\n event.preventDefault();\n const sourceItemId = draggedItemId ?? event.dataTransfer.getData(\"text/plain\");\n setDraggedItemId(null);\n setDragTargetItemId(null);\n if (!sourceItemId || sourceItemId === itemId) return;\n\n const sourceIndex = items.findIndex((item) => item.id === sourceItemId);\n const targetIndex = items.findIndex((item) => item.id === itemId);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) return;\n\n const direction: QueuedFollowUpMoveDirection = targetIndex < sourceIndex ? \"up\" : \"down\";\n onMove?.(sourceItemId, direction, Math.abs(targetIndex - sourceIndex));\n };\n\n return (\n <Stack\n gap=\"2xs\"\n paddingX=\"0\"\n paddingY=\"xs\"\n borderWidth=\"1px\"\n borderBottomWidth=\"0\"\n borderColor=\"border\"\n borderTopRadius=\"xs\"\n background=\"bg\"\n >\n {items.map((item, index) => (\n <QueuedFollowUpRow\n key={item.id}\n item={item}\n index={index}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n isEditing={editingItemId === item.id}\n isDragTarget={dragTargetItemId === item.id}\n onEdit={onEdit}\n onRemove={onRemove}\n onDragStart={setDraggedItemId}\n onDragEnd={() => {\n setDraggedItemId(null);\n setDragTargetItemId(null);\n }}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n />\n ))}\n </Stack>\n );\n};\n","import { HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// Compact, unit-dropping elapsed format: \"4s\", \"48s\", \"10m 20s\", \"1h 04m\".\nconst formatElapsed = (totalSeconds: number) => {\n const seconds = Math.max(0, Math.floor(totalSeconds));\n if (seconds < 60) return `${seconds}s`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ${String(seconds % 60).padStart(2, \"0\")}s`;\n\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${String(minutes % 60).padStart(2, \"0\")}m`;\n};\n\n/**\n * Working indicator: a spinner followed by the elapsed run time in mono digits — never a\n * static \"Working…\" label. The elapsed time is the one thing a static label cannot tell you\n * and how you judge whether a run is stuck. Counts from the start of the active stream, including\n * time spent temporarily hidden while the workspace initializes.\n */\nexport const WorkingIndicator = (props: { hidden?: boolean }) => {\n const { hidden = false } = props;\n const [elapsedSeconds, setElapsedSeconds] = useState(0);\n const startedAtRef = useRef(Date.now());\n\n useEffect(() => {\n if (hidden) return;\n\n const updateElapsed = () => setElapsedSeconds((Date.now() - startedAtRef.current) / 1000);\n updateElapsed();\n const timer = setInterval(updateElapsed, 1000);\n return () => clearInterval(timer);\n }, [hidden]);\n\n if (hidden) return null;\n\n return (\n <HStack gap=\"2xs\" px=\"sm\" py=\"xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text fontFamily=\"mono\" fontSize=\"xs\" color=\"fg.muted\" letterSpacing=\"-0.2px\">\n {formatElapsed(elapsedSeconds)}\n </Text>\n </HStack>\n );\n};\n","import { Flex, Stack } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useEffect, useState } from \"react\";\nimport { EmptyState } from \"@/components/primitives/empty-state\";\nimport type { ReferenceItem } from \"@/components/rich-text\";\nimport { resolveActiveQuestionPrompt } from \"../tool-rendering/question-prompt\";\nimport { createSerializedPromptState } from \"../utils/editor-state\";\nimport { ChatPrimitives } from \"./ai-conversation\";\nimport { AutoScroll } from \"./auto-scroll\";\nimport { ChatInput } from \"./chat-input\";\nimport type { ChatInputQuestionPrompt, ChatInputQuestionResponse } from \"./chat-input-question-prompt\";\nimport { ChatMessageList } from \"./chat-message-list\";\nimport {\n groupMessagesByTurn,\n normalizeChatMessagesForDisplay,\n type QueuedFollowUp,\n type SessionMessage,\n} from \"./message-types\";\nimport { QueuedFollowUpList } from \"./queued-follow-up-list\";\nimport type { QueuedFollowUpMoveDirection } from \"./queued-follow-up-list-state\";\nimport { WorkingIndicator } from \"./working-indicator\";\n\ninterface QueuedFollowUpComposerInput {\n queuedFollowUps: QueuedFollowUp[];\n defaultValue: string;\n onChange?: (text: string) => void;\n onSubmit?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onUpdate?: (itemId: string, prompt: string) => void;\n}\n\ninterface ChatPanelComposerProps {\n actions?: ReactNode;\n attachedResources?: string[];\n attachmentList?: ReactNode;\n chatInputAutoFocus: boolean;\n chatInputPlaceholder: string;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputReferences: ReferenceItem[];\n hasWorkspaceHub: boolean;\n inputDisabled: boolean;\n submitDisabled: boolean;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n onClearAttachments?: () => void;\n onInterrupt?: () => void;\n onQueuedFollowUpMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n onQueuedFollowUpRemove?: (itemId: string) => void;\n onQueuedFollowUpUpdate?: (itemId: string, prompt: string) => void;\n queuedComposer: ReturnType<typeof useQueuedFollowUpComposer>;\n queuedFollowUps: QueuedFollowUp[];\n streaming: boolean;\n workspaceHub?: ReactNode;\n}\n\n/** Full conversation shell for agent sessions, including messages, input, attachments, and host-provided slots. */\nexport interface ChatPanelProps {\n /** Stable conversation identity used to reset ready state when switching sessions. */\n conversationKey?: string;\n messages: SessionMessage[];\n loading?: boolean;\n streaming?: boolean;\n emptyStateTitle: string;\n emptyStateDescription: string;\n emptyStateContent?: ReactNode;\n loaderComponent?: ReactNode;\n chatInputPlaceholder: string;\n chatInputDefaultValue?: string;\n onSubmitMessage?: (\n text: string,\n attachments: string[],\n questionResponse?: ChatInputQuestionResponse,\n ) => void | Promise<void>;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputChange?: (text: string) => void;\n /** Extra controls rendered in the chat input toolbar (attach, model, params). */\n actions?: ReactNode;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n attachmentList?: ReactNode;\n approvalPrompt?: ReactNode;\n /** Optional workspace status/control surface rendered above the conversation viewport. */\n workspaceHub?: ReactNode;\n workspaceInitializing?: boolean;\n inputDisabled?: boolean;\n /** Blocks sending while the editor stays usable, for example while no model is selected. */\n submitDisabled?: boolean;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\n queuedFollowUps?: QueuedFollowUp[];\n onQueuedFollowUpUpdate?: (itemId: string, prompt: string) => void;\n onQueuedFollowUpRemove?: (itemId: string) => void;\n onQueuedFollowUpMove?: (itemId: string, direction: QueuedFollowUpMoveDirection, steps?: number) => void;\n chatInputReferences?: ReferenceItem[];\n onChatInputAddReference?: (resourceId: string, resourceType: ReferenceItem[\"resourceType\"]) => void;\n}\n\nconst useQueuedFollowUpComposer = (input: QueuedFollowUpComposerInput) => {\n const { queuedFollowUps, defaultValue, onChange, onSubmit, onUpdate } = input;\n const [editingItemId, setEditingItemId] = useState<string | null>(null);\n const [editSeed, setEditSeed] = useState(\"\");\n const [focusSignal, setFocusSignal] = useState(0);\n const inputValue = editingItemId ? editSeed : defaultValue;\n\n useEffect(() => {\n if (!editingItemId) return;\n if (queuedFollowUps.some((item) => item.id === editingItemId)) return;\n setEditingItemId(null);\n setEditSeed(\"\");\n }, [editingItemId, queuedFollowUps]);\n\n const edit = (item: QueuedFollowUp) => {\n setEditingItemId(item.id);\n setEditSeed(item.prompt);\n setFocusSignal((signal) => signal + 1);\n };\n\n const change = (text: string) => {\n if (editingItemId) return;\n onChange?.(text);\n };\n\n const submit = (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => {\n if (editingItemId) {\n onUpdate?.(editingItemId, text);\n setEditingItemId(null);\n setEditSeed(\"\");\n return;\n }\n\n return onSubmit?.(text, attachments, questionResponse);\n };\n\n return { change, edit, editingItemId, focusSignal, inputValue, isEditing: Boolean(editingItemId), submit };\n};\n\nconst ChatPanelComposer = (props: ChatPanelComposerProps) => {\n const {\n actions,\n attachedResources,\n attachmentList,\n chatInputAutoFocus,\n chatInputPlaceholder,\n chatInputQuestionPrompt,\n chatInputReferences,\n hasWorkspaceHub,\n inputDisabled,\n submitDisabled,\n onAttachFiles,\n onAttachText,\n onChatInputAddReference,\n onClearAttachments,\n onInterrupt,\n onQueuedFollowUpMove,\n onQueuedFollowUpRemove,\n onQueuedFollowUpUpdate,\n queuedComposer,\n queuedFollowUps,\n streaming,\n workspaceHub,\n } = props;\n const hasQueuedFollowUps = queuedFollowUps.length > 0;\n\n return (\n <Stack px={hasWorkspaceHub ? \"2xs\" : \"xs\"} gap=\"0\">\n {/* Concentric hierarchy: the hub shell owns the visible border so the session reads\n as living inside the workspace; the nested input recedes to border.subtle. */}\n <Stack\n gap={hasWorkspaceHub ? \"2xs\" : \"0\"}\n p={hasWorkspaceHub ? \"2xs\" : undefined}\n borderWidth={hasWorkspaceHub ? \"1px\" : undefined}\n borderColor={hasWorkspaceHub ? \"border\" : undefined}\n borderRadius={hasWorkspaceHub ? \"sm\" : undefined}\n bg={hasWorkspaceHub ? \"bg.subtle\" : undefined}\n >\n {workspaceHub}\n <QueuedFollowUpList\n items={queuedFollowUps}\n editingItemId={queuedComposer.editingItemId}\n onEdit={onQueuedFollowUpUpdate ? queuedComposer.edit : undefined}\n onRemove={onQueuedFollowUpRemove}\n onMove={onQueuedFollowUpMove}\n />\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(queuedComposer.inputValue)}\n streaming={streaming}\n onSubmit={queuedComposer.submit}\n onInterrupt={onInterrupt}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChange={queuedComposer.change}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n submitDisabled={submitDisabled}\n attachedToTop={hasQueuedFollowUps}\n recessed={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n focusSignal={queuedComposer.focusSignal}\n submitTitle={queuedComposer.isEditing ? \"Save queued follow-up\" : undefined}\n references={chatInputReferences}\n onAddReference={onChatInputAddReference}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const ChatPanel = (props: ChatPanelProps) => {\n const {\n conversationKey,\n messages,\n loading = false,\n streaming = false,\n emptyStateTitle,\n emptyStateDescription,\n emptyStateContent,\n loaderComponent,\n chatInputPlaceholder,\n chatInputDefaultValue = \"\",\n onSubmitMessage,\n onInterrupt,\n onAttachFiles,\n onAttachText,\n onChatInputChange,\n actions,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n submitDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n queuedFollowUps = [],\n onQueuedFollowUpUpdate,\n onQueuedFollowUpRemove,\n onQueuedFollowUpMove,\n chatInputReferences = [],\n onChatInputAddReference,\n } = props;\n\n const merged = normalizeChatMessagesForDisplay(messages, { streaming });\n const hasMessages = merged.length > 0;\n const messageListKey = conversationKey ?? merged[0]?.id;\n const messageListIdentity = hasMessages ? (messageListKey ?? \"active-conversation\") : null;\n const userMessageCount = merged.reduce((count, message) => count + (message.role === \"user\" ? 1 : 0), 0);\n const { groups, leadingResponses } = groupMessagesByTurn(merged);\n const [expandedStickyMessageIds, setExpandedStickyMessageIds] = useState(() => new Set<string>());\n const [readyMessageListKey, setReadyMessageListKey] = useState<string | null>(null);\n const showLoadingState = !hasMessages && loading;\n const defaultEmptyContent = (\n <EmptyState\n icon={<MessageCircleIcon size={48} strokeWidth={1.5} />}\n title={emptyStateTitle}\n description={emptyStateDescription}\n />\n );\n const emptyContent = showLoadingState ? loaderComponent : (emptyStateContent ?? defaultEmptyContent);\n const hasWorkspaceHub = Boolean(workspaceHub);\n const activeQuestionPrompt = chatInputQuestionPrompt ?? resolveActiveQuestionPrompt(messages);\n const hideActiveQuestionForms = Boolean(activeQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing && !activeQuestionPrompt;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\n const queuedComposer = useQueuedFollowUpComposer({\n queuedFollowUps,\n defaultValue: chatInputDefaultValue,\n onChange: onChatInputChange,\n onSubmit: onSubmitMessage,\n onUpdate: onQueuedFollowUpUpdate,\n });\n\n const toggleStickyMessageExpanded = (messageId: string) => {\n setExpandedStickyMessageIds((current) => {\n const next = new Set(current);\n if (next.has(messageId)) {\n next.delete(messageId);\n } else {\n next.add(messageId);\n }\n\n return next;\n });\n };\n\n return (\n <Flex position=\"relative\" direction=\"column\" w=\"full\" h=\"full\" overflow=\"hidden\">\n <ChatPrimitives.Root>\n <AutoScroll conversationKey={messageListKey ?? null} userMessageCount={userMessageCount} />\n <ChatPrimitives.Viewport visibility={isMessageViewportReady ? \"visible\" : \"hidden\"}>\n {hasMessages ? (\n <ChatMessageList\n key={messageListIdentity}\n leadingResponses={leadingResponses}\n groups={groups}\n streaming={streaming}\n hideActiveQuestionForms={hideActiveQuestionForms}\n expandedStickyMessageIds={expandedStickyMessageIds}\n onToggleStickyMessage={toggleStickyMessageExpanded}\n onReady={() => setReadyMessageListKey(messageListIdentity)}\n />\n ) : (\n emptyContent\n )}\n </ChatPrimitives.Viewport>\n {isMessageViewportReady ? <ChatPrimitives.ScrollToBottom aria-label=\"Scroll to latest message\" /> : null}\n </ChatPrimitives.Root>\n {approvalPrompt}\n {streaming ? <WorkingIndicator hidden={!showThinkingIndicator} /> : null}\n <ChatPanelComposer\n actions={actions}\n attachedResources={attachedResources}\n attachmentList={attachmentList}\n chatInputAutoFocus={chatInputAutoFocus}\n chatInputPlaceholder={chatInputPlaceholder}\n chatInputQuestionPrompt={activeQuestionPrompt}\n chatInputReferences={chatInputReferences}\n hasWorkspaceHub={hasWorkspaceHub}\n inputDisabled={inputDisabled}\n submitDisabled={submitDisabled}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChatInputAddReference={onChatInputAddReference}\n onClearAttachments={onClearAttachments}\n onInterrupt={onInterrupt}\n onQueuedFollowUpMove={onQueuedFollowUpMove}\n onQueuedFollowUpRemove={onQueuedFollowUpRemove}\n onQueuedFollowUpUpdate={onQueuedFollowUpUpdate}\n queuedComposer={queuedComposer}\n queuedFollowUps={queuedFollowUps}\n streaming={streaming}\n workspaceHub={workspaceHub}\n />\n </Flex>\n );\n};\n","import { Skeleton, Stack } from \"@chakra-ui/react\";\nimport { ChatMessage } from \"./ai-message\";\n\nconst renderSkeletonLines = (widths: string[]) => (\n <Stack gap=\"xs\" w=\"full\">\n {widths.map((width, index) => (\n <Skeleton key={`${width}-${index}`} height=\"3\" width={width} borderRadius=\"xs\" />\n ))}\n </Stack>\n);\n\nexport const ChatSkeleton = () => {\n return (\n <Stack minH=\"full\" py=\"xs\" gap=\"0\">\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content from=\"user\">{renderSkeletonLines([\"72%\", \"46%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n <ChatMessage.Root from=\"assistant\">\n <ChatMessage.Content from=\"assistant\">{renderSkeletonLines([\"76%\", \"62%\", \"40%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n </Stack>\n );\n};\n","import { Box, chakra, Flex, Portal, Stack, Text } from \"@chakra-ui/react\";\nimport { type PointerEvent, useState } from \"react\";\n\nexport interface ConversationBrowseItem {\n /** Turn id used to scroll the log to this user message. */\n id: string;\n /** The user message this tick indexes (shown in the hover card). */\n message: string;\n /** Optional assistant reply preview; hidden for a turn not yet answered. */\n reply?: string;\n}\n\ninterface ConversationBrowseProps {\n items: ConversationBrowseItem[];\n onSelect?: (id: string) => void;\n /** Overlay the log's left edge with a scrim instead of reserving a gutter (panels under ~480px). */\n floating?: boolean;\n}\n\n// The rail is a lens, not a chart: tick length encodes distance from the pointer, never content.\nconst MIN_USER_MESSAGES = 3;\nconst TICK_MIN_WIDTH = 10;\nconst TICK_MAX_WIDTH = 26;\nconst LENS_RADIUS = 4;\n\ninterface BrowseCardPosition {\n left: number;\n top: number;\n}\n\n// Raised-cosine falloff over LENS_RADIUS neighbours: 1 at the pointer, 0 at the edge of the lens.\nconst lensFactor = (index: number, pointerIndex: number | null) => {\n if (pointerIndex === null) return 0;\n const distance = Math.abs(index - pointerIndex);\n if (distance >= LENS_RADIUS) return 0;\n return (1 + Math.cos((Math.PI * distance) / LENS_RADIUS)) / 2;\n};\n\nconst tickColor = (index: number, pointerIndex: number | null) => {\n if (pointerIndex === null) return \"fg.subtle\";\n const distance = Math.abs(index - pointerIndex);\n if (distance < 0.5) return \"fg\";\n if (distance < LENS_RADIUS) return \"fg.muted\";\n return \"fg.subtle\";\n};\n\nconst ConversationBrowseCard = (props: { item: ConversationBrowseItem; position: BrowseCardPosition }) => {\n const { item, position } = props;\n\n return (\n <Portal>\n <Box\n position=\"fixed\"\n left={`${position.left}px`}\n ml=\"2xs\"\n top={`${position.top}px`}\n transform=\"translateY(-50%)\"\n w=\"80\"\n maxW=\"80\"\n zIndex=\"popover\"\n pointerEvents=\"none\"\n >\n <Stack gap=\"1.5\" p=\"3\" bg=\"bg.elevated\" borderWidth=\"1px\" borderColor=\"border\" borderRadius=\"lg\">\n <Text textStyle=\"label/S/medium\" color=\"fg\" lineClamp={2}>\n {item.message}\n </Text>\n {item.reply ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\" lineClamp={2}>\n {item.reply}\n </Text>\n ) : null}\n </Stack>\n </Box>\n </Portal>\n );\n};\n\n/**\n * ChatBrowse — the conversation scrubber for the chat log's left gutter. One tick per user\n * message, in order; the ticks nearest the pointer swell into a lens (growing along X only, so\n * the row you aim at never moves), and the active tick raises a preview card. Clicking a tick\n * selects that turn. Hidden below a few messages, where a gutter costs space and buys nothing.\n */\nexport const ConversationBrowse = (props: ConversationBrowseProps) => {\n const { items, onSelect, floating = false } = props;\n const [pointerIndex, setPointerIndex] = useState<number | null>(null);\n const [cardPosition, setCardPosition] = useState<BrowseCardPosition | null>(null);\n\n if (items.length < MIN_USER_MESSAGES) return null;\n\n const handlePointerMove = (event: PointerEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const fraction = (event.clientY - rect.top) / rect.height;\n const next = Math.min(items.length - 1, Math.max(0, fraction * items.length - 0.5));\n const nextActiveIndex = Math.round(next);\n setPointerIndex(next);\n setCardPosition({\n left: rect.right,\n top: rect.top + ((nextActiveIndex + 0.5) / items.length) * rect.height,\n });\n };\n\n const activeIndex = pointerIndex === null ? null : Math.round(pointerIndex);\n const activeItem = activeIndex === null ? null : items[activeIndex];\n\n return (\n <Box position=\"relative\" w=\"10\" flexShrink={0}>\n <Flex\n direction=\"column\"\n align=\"flex-start\"\n gap=\"1.5\"\n px=\"1.5\"\n py=\"2\"\n w=\"10\"\n onPointerMove={handlePointerMove}\n onPointerLeave={() => setPointerIndex(null)}\n {...(floating\n ? {\n position: \"absolute\",\n insetInlineStart: 0,\n top: 0,\n bottom: 0,\n // The scrim must be the surface the rail covers — the panel's own bg, never a lighter tone.\n bg: \"bg\",\n }\n : {})}\n >\n {items.map((item, index) => (\n <chakra.button\n type=\"button\"\n key={item.id}\n h=\"2px\"\n w={`${TICK_MIN_WIDTH + (TICK_MAX_WIDTH - TICK_MIN_WIDTH) * lensFactor(index, pointerIndex)}px`}\n bg={tickColor(index, pointerIndex)}\n borderRadius=\"1px\"\n transition=\"width 80ms linear, background-color 80ms linear\"\n aria-label={`Jump to message ${index + 1}`}\n onClick={() => onSelect?.(item.id)}\n />\n ))}\n </Flex>\n {activeItem && cardPosition ? <ConversationBrowseCard item={activeItem} position={cardPosition} /> : null}\n </Box>\n );\n};\n","import { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n /** Workspace identity/selector shown at the start of the header (e.g. GitBranch + name). */\n workspaceControl?: ReactNode;\n additions: number;\n deletions: number;\n /** Icon-only action that opens the workspace resource. */\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nconst HubStatus = (props: {\n status: WorkspaceHubStatus;\n statusLabel?: string;\n additions: number;\n deletions: number;\n}) => {\n const { status, statusLabel, additions, deletions } = props;\n\n if (status === \"loading\") {\n return (\n <HStack gap=\"2xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n );\n }\n\n if (status === \"error\") {\n return (\n <HStack gap=\"2xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n );\n }\n\n // Ready: the diff counts take the slot, and only when there is something to show.\n if (additions <= 0 && deletions <= 0) return null;\n\n return (\n <HStack gap=\"2xs\">\n <Text textStyle=\"label/XS/medium\" color=\"fg.success\">\n +{additions}\n </Text>\n <Text textStyle=\"label/XS/medium\" color=\"fg.error\">\n −{deletions}\n </Text>\n </HStack>\n );\n};\n\n/**\n * Workspace hub header: the frame the session sits in. The identity is always present;\n * the slot beside it carries the diff counts, or the setup status while the workspace is\n * being created or has failed. The open action recedes during setup.\n */\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { workspaceControl, additions, deletions, action, status = \"ready\", statusLabel } = props;\n\n return (\n <Flex align=\"center\" justify=\"space-between\" gap=\"sm\" minW=\"0\" pl=\"xs\" pr=\"2xs\" py=\"2xs\">\n <HStack gap=\"sm\" minW=\"0\">\n {workspaceControl}\n <HubStatus status={status} statusLabel={statusLabel} additions={additions} deletions={deletions} />\n </HStack>\n {action ? <Flex flexShrink={0}>{action}</Flex> : null}\n </Flex>\n );\n};\n"],"names":["conversationRootDefaultProps","initial","resize","role","ConversationRoot","chakra","StickToBottomEl","base","position","flex","overflow","height","forwardProps","defaultProps","ConversationContent","props","$","_c","children","rest","contentRef","scrollRef","useStickToBottomContext","t0","t1","t2","t3","Symbol","for","zIndex","py","t4","ScrollArea","conversationScrollButtonContainerDefaultProps","axis","bottom","ConversationScrollButton","isAtBottom","scrollToBottom","jsx","AbsoluteCenter","IconButton","ArrowDownIcon","ChatPrimitives","Root","Viewport","ScrollToBottom","recipe","defineSlotRecipe","className","slots","root","display","width","alignItems","justifyContent","gap","mb","content","flexDirection","textStyle","borderRadius","variants","from","user","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderColor","bg","px","assistant","developer","size","sm","md","lg","shape","rounded","pill","square","defaultVariants","withProvider","withContext","createSlotRecipeContext","MessageRoot","MessageContent","ChatMessage","Content","formatToolInput","input","text","JSON","stringify","length","slice","ApprovalPrompt","toolName","toolInput","onApprove","onDeny","formattedInput","jsxs","Text","Code","ShieldX","Button","t5","ShieldCheck","t6","t7","HStack","t8","Box","Flex","DEFAULT_SIZE","DEFAULT_TONE","AttachmentList","attachments","onSelect","onRemove","renderBadge","tone","undefined","attachment","select","remove","rendered","attachmentId","Fragment","ResourceBadge","map","Stack","shouldAutoScroll","args","previousUserMessageCount","userMessageCount","getNextAutoScrollState","conversationKey","state","shouldScroll","Math","max","scrollForNextAutoScrollState","next","AutoScroll","stateRef","useRef","current","useEffect","hasMessageText","trim","resolveChatInputKeyboardAction","canSubmit","isDisabled","resolveChatInputButtonAction","canInterrupt","hasQuestionPrompt","streaming","DEFAULT_TEXT_ATTACHMENT_PASTE_LINE_THRESHOLD","shouldAttachPastedText","lineThreshold","split","createAttachmentEventHandlers","onAttachFiles","onAttachText","textAttachmentPasteLineThreshold","onDragOver","event","Array","dataTransfer","types","includes","preventDefault","onDropCapture","files","onPasteCapture","clipboardData","pastedText","getData","preventSubmit","QuestionOptionContent","option","label","description","QuestionCheckboxOptionRow","name","checked","editable","onToggle","tabIndex","Checkbox","QuestionRadioOptions","question","questionIndex","selectedOption","onToggleOption","details","value","options","Radio","RadioGroup","TodoListBlockView","items","_temp","QuestionFormBlockView","questions","selectedOptionsByQuestion","customAnswersByQuestion","onCustomAnswerChange","id","inputType","multiple","selectedOptions","allowCustomAnswer","Textarea","currentTarget","item","index","getQuestionSelectionKey","toggleQuestionOptionSelection","optionLabel","key","selected","alreadySelected","filter","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","selectedLabels","customAnswer","answers","push","join","isCustomAnswersByQuestion","toCustomAnswersByQuestion","answerInput","trimmed","buildQuestionResponse","legacyText","hasCustomQuestions","some","buildQuestionAnswerValues","hasMissingRequiredQuestionAnswer","toQuestionFormQuestions","hasQuestionAnswer","QuestionStepTab","sourceQuestion","isActive","onSelectStep","isAnswered","stepStateLabel","tabVariant","Check","Tooltip","QuestionPromptStepper","activeQuestionIndex","setActiveQuestionIndex","useState","renderQuestionIndex","min","activeQuestion","hasMultipleQuestions","_question","_questionIndex","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","COMPOSER_CONTROL_HEIGHT","SendButton","shortcut","title","ariaLabel","Pause","ArrowUp","icon","button","Kbd","tooltipContent","Portal","ChatInputPlaceholder","placeholder","selectedChatInputBorderColor","focusPromptEditor","container","querySelector","HTMLElement","focus","requestPromptEditorFocus","onFocus","requestAnimationFrame","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","submitDisabled","onChange","attachmentList","actions","attachedToTop","recessed","autoFocus","focusSignal","submitTitle","references","onAddReference","restingBorderColor","submitting","setSubmitting","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","setText","getTextFromSerializedEditorState","setSelectedOptionsByQuestion","setCustomAnswersByQuestion","containerRef","onChangeRef","previousQuestionPromptSignatureRef","resetText","handle","cancelAnimationFrame","handleContainerClick","resetEditor","shouldFocus","responseText","hasMissingRequiredSelection","actionState","buttonAction","messageTitle","submitMessage","questionResponse","runAction","action","attachmentEventHandlers","toggleQuestionOption","updateQuestionCustomAnswer","pr","PromptEditor","t","Spacer","isRecord","isArray","parseJsonObjectText","parsed","parse","toInputRecord","getStringValue","getQuestionResponseText","stringValue","line","response","parseQuestionOption","parseQuestion","type","custom","parseQuestionPrompt","record","isQuestionTool","part","tool","toLowerCase","resolveActiveQuestionPrompt","messages","messageIndex","message","partIndex","parts","output","metadata","createSerializedPromptState","generateEditorStateFromString","messageFadeInProps","animationName","animationDuration","animationTimingFunction","getNextMessageAnimationState","animatedKeys","Set","seenKeys","itemKeys","initialized","has","add","itemKeysEqual","a","b","useMessageAnimationKeys","lastResultRef","isCopyablePart","getMessageCopyText","getMessageTimestampLabel","locale","timeZone","createdAt","Intl","DateTimeFormat","hour","minute","format","Date","MessageActionPanel","alwaysVisible","copyAlwaysVisible","isCopied","setIsCopied","copyResetTimeoutRef","copyText","timestampLabel","window","clearTimeout","navigator","clipboard","writeText","setTimeout","copyMessage","t10","messageActionPanelHoverStyles","Copy","t11","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","getToolNameLookupKeys","normalized","compact","toolIconMap","shell","Terminal","ls","ListTree","read_file","FileText","write_file","FilePen","delete_file","Trash2","patch","FileDiff","upload_files","FileUp","download_file","FileDown","move_file","Move","iconMap","dot","DotIcon","danger","AlertTriangle","search","Search","browser","Globe","file","File","CircleQuestionMark","todo","ListTodo","terminal","DEFAULT_TOOL_ICON","isToolIconName","Object","hasOwn","getIconComponent","toolTypeToIconName","basenameSafe","path","idx","lastIndexOf","normalizeHeaderPath","token","startsWith","isMinusHeader","isPlusHeader","isHunkHeader","isAddedLine","isDeletedLine","ensureFileChange","changes","filePath","set","additions","deletions","incrementAdditions","get","incrementDeletions","processUnifiedDiffLine","lastMinusHeader","inHunk","currentPath","parseUnifiedDiff","diffText","Map","entries","buildDiffTitleSegments","kind","fileName","extractDiffFilePaths","isDiffFileBoundary","isInvalidHunkBodyLine","appendHunkLine","original","modified","parseHunkBody","startIndex","parsePreview","oldHeader","nextIndex","preview","buildFileDiffPreviews","previews","i","TOOL_LABELS","apply_patch","bash","edit","glob","grep","read","skill","todowrite","STATE_LABELS","error","input_streaming","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","detailStyle","bold","muted","truncate","monospace","stateLabel","getInputObject","getOutputObject","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","parseApplyPatchMetadataFile","entry","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","parsedFile","getApplyPatchInputFilePaths","filePaths","change","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","variant","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","inputFilePaths","diffSegments","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","createQuestionRenderer","deps","prompt","block","fieldLabel","expandable","renderRead","renderCommand","command","outputText","code","stderr","exitCode","renderBash","renderShell","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","isBlankValue","every","values","getRecord","getString","getMediaType","mime_type","mediaType","mimeType","isImageMediaType","imageUrlPattern","getImageBlock","alt","data","src","url","test","getFileLikeOutput","filename","body","extensionLanguageBySuffix","css","html","js","json","ts","tsx","yaml","yml","getLanguageFromPath","extension","pop","createLabeledBlocks","buildBlocksForArrayValue","entryRecord","entryType","image","buildBlocksForValue","buildBlocksForFileLikeValue","fileLikeOutput","buildBlocksForAttachmentValue","attachmentName","attachment_name","attachment_file_id","attachmentFileId","imageBlock","fileBlocks","attachmentBlocks","buildGenericBlocks","toolLabel","createGenericItem","isVisibleTitleSegment","segment","isVisibleBlock","isVisibleItem","hasTitle","hasBlocks","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","buildTimelineDocFromInvocations","invocations","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","Timeline","ChakraTimeline","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","reactions","clap","Card","DiffEditor","Image","caption","render","ref","TimelineItemRow","itemKey","isOpen","canExpand","ChevronUpIcon","i_0","TimelineFromJSON","expanded","setExpanded","getKey","_temp2","prev","toggle","idx_0","key_0","it","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","filePartLabel","imageExtensionPattern","isImageFilePart","filePartThumbnail","openFilePart","open","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","fontSize","AlertMessage","Spinner","getMessageOrigin","isVisibleText","isVisibleAlert","isDisplayRenderablePart","isActivityPart","isActivityOnlyMessage","mergeBufferedActivity","first","flatMap","modelId","at","providerId","normalizeChatMessagesForDisplay","activityBuffer","clearActivityBuffer","displayParts","displayMessage","activity","trailingActivity","getAssistantMessageActionTargetId","lastMessage","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","ChatMessageListResponse","animate","showAssistantActions","showActions","StickyMessageToggle","onClick","actionPanel","STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT","STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT","SCROLL_BOUNDARY_EPSILON","getMessageTextMetrics","reduce","metrics","lineCount","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","scrollHeight","clientHeight","scrollTop","ESTIMATED_TURN_HEIGHT","INITIAL_TAIL_VIEWPORT_HEIGHT","TAIL_READY_STABLE_FRAME_COUNT","TAIL_READY_FRAME_LIMIT","TAIL_READY_PIXEL_EPSILON","VIRTUAL_LIST_OVERSCAN","VIRTUAL_LIST_GAP","buildMessageListItems","leadingActionMessageId","group","groupIndex","getEstimatedTailOffset","count","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","previous","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","actionMessageId","t12","t13","t14","t15","t16","t17","t18","t19","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","animatedItemKeys","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","QueuedFollowUpRow","isFirst","isLast","isEditing","isDragTarget","onEdit","onDragStart","onDragEnd","onDrop","canEdit","canRemove","canDrag","dragLabel","event_0","event_1","effectAllowed","setData","ChakraIcon","GripVertical","Badge","Pencil","QueuedFollowUpList","editingItemId","onMove","draggedItemId","setDraggedItemId","dragTargetItemId","setDragTargetItemId","itemId","dropEffect","handleDragOver","itemId_0","sourceItemId","sourceIndex","findIndex","targetIndex","item_0","direction","handleDrop","item_1","formatElapsed","totalSeconds","seconds","floor","minutes","String","padStart","WorkingIndicator","hidden","elapsedSeconds","setElapsedSeconds","now","startedAtRef","updateElapsed","timer","setInterval","clearInterval","useQueuedFollowUpComposer","queuedFollowUps","defaultValue","onUpdate","setEditingItemId","editSeed","setEditSeed","setFocusSignal","inputValue","text_0","submit","ChatPanelComposer","chatInputAutoFocus","chatInputPlaceholder","chatInputQuestionPrompt","chatInputReferences","hasWorkspaceHub","inputDisabled","onChatInputAddReference","onQueuedFollowUpMove","onQueuedFollowUpRemove","onQueuedFollowUpUpdate","queuedComposer","workspaceHub","hasQueuedFollowUps","ChatPanel","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputDefaultValue","onSubmitMessage","onChatInputChange","approvalPrompt","workspaceInitializing","hasMessages","messageListIdentity","messageListKey","merged","setExpandedStickyMessageIds","_temp3","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","activeQuestionPrompt","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","t20","t21","t22","t23","t24","t25","t26","signal","renderSkeletonLines","widths","Skeleton","ChatSkeleton","MIN_USER_MESSAGES","TICK_MIN_WIDTH","TICK_MAX_WIDTH","LENS_RADIUS","lensFactor","pointerIndex","distance","cos","PI","tickColor","ConversationBrowseCard","left","reply","ConversationBrowse","floating","setPointerIndex","cardPosition","setCardPosition","rect","getBoundingClientRect","fraction","clientY","nextActiveIndex","round","right","handlePointerMove","activeIndex","activeItem","insetInlineStart","HubStatus","statusLabel","ChatWorkspaceHub","workspaceControl"],"mappings":"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"}