@pstdio/ui 0.14.0 → 0.16.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 (226) hide show
  1. package/dist/{MermaidComponent-CatfVUxA.js → MermaidComponent-BCMQqPqu.js} +11 -11
  2. package/dist/{MermaidComponent-CatfVUxA.js.map → MermaidComponent-BCMQqPqu.js.map} +1 -1
  3. package/dist/browser-storage-BinyFNJX.js +40 -0
  4. package/dist/browser-storage-BinyFNJX.js.map +1 -0
  5. package/dist/chat-ui.js +1160 -1120
  6. package/dist/chat-ui.js.map +1 -1
  7. package/dist/checkbox-D5AzFRlb.js +70 -0
  8. package/dist/checkbox-D5AzFRlb.js.map +1 -0
  9. package/dist/components/chat-ui/components/ai-conversation.d.ts +1 -1
  10. package/dist/components/chat-ui/components/ai-message.d.ts +1 -1
  11. package/dist/components/chat-ui/components/ai-response.d.ts +0 -1
  12. package/dist/components/chat-ui/components/attachment-list.d.ts +1 -1
  13. package/dist/components/chat-ui/components/auto-scroll.d.ts +27 -0
  14. package/dist/components/chat-ui/components/chat-message-animation.d.ts +22 -0
  15. package/dist/components/chat-ui/components/timeline.d.ts +0 -2
  16. package/dist/components/chat-ui/performance/chat-performance-fixtures.d.ts +0 -1
  17. package/dist/components/chat-ui/tool-rendering/build-timeline.d.ts +2 -12
  18. package/dist/components/chat-ui/tool-rendering/shared.d.ts +1 -1
  19. package/dist/components/chat-ui/tool-rendering/types.d.ts +1 -2
  20. package/dist/components/command-palette/index.d.ts +4 -0
  21. package/dist/components/data-renderer/data-renderer-board.d.ts +1 -1
  22. package/dist/components/data-renderer/data-renderer-card.d.ts +1 -1
  23. package/dist/components/data-renderer/data-renderer-enum-helpers.d.ts +3 -3
  24. package/dist/components/data-renderer/data-renderer-helpers.d.ts +2 -0
  25. package/dist/components/data-renderer/data-renderer-list.d.ts +1 -1
  26. package/dist/components/data-renderer/data-renderer.d.ts +1 -1
  27. package/dist/components/data-renderer/index.d.ts +18 -0
  28. package/dist/components/data-renderer/types.d.ts +0 -6
  29. package/dist/components/diff-viewer/diff-card.d.ts +1 -0
  30. package/dist/components/diff-viewer/diff-drawer-scroll.d.ts +0 -19
  31. package/dist/components/diff-viewer/diff-drawer.d.ts +1 -0
  32. package/dist/components/diff-viewer/diff-viewer-options-menu.d.ts +16 -0
  33. package/dist/components/diff-viewer/index.d.ts +2 -0
  34. package/dist/components/diff-viewer/use-selected-diff-scroll.d.ts +7 -3
  35. package/dist/components/internal/style-guide.d.ts +14 -0
  36. package/dist/components/internal/token-editor-controls.d.ts +8 -0
  37. package/dist/components/internal/token-editor-data.d.ts +40 -0
  38. package/dist/components/internal/token-editor-state.d.ts +22 -0
  39. package/dist/components/layout/index.d.ts +6 -0
  40. package/dist/components/list-row/list-row.types.d.ts +1 -1
  41. package/dist/components/notification-center/index.d.ts +2 -0
  42. package/dist/components/notification-center/notification-center.d.ts +2 -0
  43. package/dist/components/notification-center/notification-center.types.d.ts +37 -0
  44. package/dist/components/{bubble-button.d.ts → overlays/bubble-button.d.ts} +1 -1
  45. package/dist/components/overlays/index.d.ts +12 -0
  46. package/dist/components/overlays/search-modal-content.d.ts +20 -0
  47. package/dist/components/{searchable-menu.d.ts → overlays/searchable-menu.d.ts} +1 -1
  48. package/dist/components/param-editor/index.d.ts +23 -0
  49. package/dist/components/param-editor/inputs/action-input.d.ts +13 -0
  50. package/dist/components/param-editor/inputs/anchor-grid-input.d.ts +12 -0
  51. package/dist/components/param-editor/inputs/anchor-grid.d.ts +4 -0
  52. package/dist/components/param-editor/inputs/file-accept.d.ts +22 -0
  53. package/dist/components/param-editor/inputs/file-drop-input.d.ts +14 -0
  54. package/dist/components/param-editor/inputs/numeric-value.d.ts +6 -0
  55. package/dist/components/param-editor/inputs/range-input.d.ts +17 -0
  56. package/dist/components/param-editor/inputs/range-value.d.ts +5 -0
  57. package/dist/components/param-editor/inputs/resource-input-chips.d.ts +15 -0
  58. package/dist/components/param-editor/inputs/resource-input.d.ts +18 -0
  59. package/dist/components/param-editor/inputs/segmented-input.d.ts +14 -0
  60. package/dist/components/param-editor/inputs/slider-marks.d.ts +5 -0
  61. package/dist/components/param-editor/inputs/vector-input.d.ts +17 -0
  62. package/dist/components/param-editor/inputs/vector-value.d.ts +7 -0
  63. package/dist/components/param-editor/param-editor-control-item.d.ts +15 -0
  64. package/dist/components/param-editor/param-editor-control-list.d.ts +5 -0
  65. package/dist/components/param-editor/param-editor-field-label.d.ts +1 -0
  66. package/dist/components/param-editor/param-editor-field.d.ts +11 -0
  67. package/dist/components/param-editor/param-editor-inline-group.d.ts +5 -0
  68. package/dist/components/param-editor/param-editor-section.d.ts +16 -0
  69. package/dist/components/param-editor/param-editor.d.ts +2 -1
  70. package/dist/components/param-editor/param-editor.types.d.ts +101 -19
  71. package/dist/components/{breadcrumb.d.ts → primitives/breadcrumb.d.ts} +1 -1
  72. package/dist/components/{icon-color-picker.d.ts → primitives/icon-color-picker.d.ts} +2 -6
  73. package/dist/components/primitives/index.d.ts +28 -0
  74. package/dist/components/{number-input.d.ts → primitives/number-input.d.ts} +0 -2
  75. package/dist/components/{session-indicator.d.ts → primitives/session-indicator.d.ts} +2 -1
  76. package/dist/components/{tooltip.d.ts → primitives/tooltip.d.ts} +0 -1
  77. package/dist/components/rich-text/prompt-input/commands.d.ts +0 -17
  78. package/dist/components/rich-text/prompt-input/events.d.ts +0 -13
  79. package/dist/components/rich-text/prompt-input/plugins/CommentPlugin/nodes/CommentNode/CommentNode.d.ts +1 -2
  80. package/dist/components/rich-text/prompt-input/plugins/ReferencePlugin/nodes/ReferenceNode/ReferenceNode.d.ts +1 -2
  81. package/dist/components/rich-text/prompt-input/utils.d.ts +1 -2
  82. package/dist/components/rich-text/shared/plugins/MermaidPlugin/MermaidNode.d.ts +0 -1
  83. package/dist/components/rich-text/utils/inferResourceType.d.ts +1 -1
  84. package/dist/components/sidebar/sidebar.types.d.ts +1 -1
  85. package/dist/components/tab-strip/tab-visibility-filter.d.ts +5 -3
  86. package/dist/components/tag-editor/tag-editor-row.d.ts +1 -1
  87. package/dist/components/tag-editor/tag-editor.types.d.ts +1 -1
  88. package/dist/components/terminal/bind-session.d.ts +33 -0
  89. package/dist/components/terminal/index.d.ts +6 -0
  90. package/dist/components/terminal/scripted-bridge.d.ts +35 -0
  91. package/dist/components/terminal/terminal-contract.d.ts +22 -0
  92. package/dist/components/terminal/terminal-theme.d.ts +12 -0
  93. package/dist/components/terminal/terminal.d.ts +45 -0
  94. package/dist/components/terminal/types.d.ts +35 -0
  95. package/dist/components/terminal/use-terminal-session.d.ts +21 -0
  96. package/dist/components/tree-list/tree-list-order-filter.d.ts +1 -2
  97. package/dist/components/tree-list/tree-list-visibility-filter.d.ts +12 -4
  98. package/dist/components/tree-list/tree-list.d.ts +1 -1
  99. package/dist/components/tree-list/tree-list.types.d.ts +7 -2
  100. package/dist/data-renderer.js +1669 -0
  101. package/dist/data-renderer.js.map +1 -0
  102. package/dist/diff-editor-BnfV8cYB.js +182 -0
  103. package/dist/diff-editor-BnfV8cYB.js.map +1 -0
  104. package/dist/diff.js +1313 -0
  105. package/dist/diff.js.map +1 -0
  106. package/dist/empty-state-Bo4HVrgr.js +34 -0
  107. package/dist/empty-state-Bo4HVrgr.js.map +1 -0
  108. package/dist/foundations/gallery/gallery-frame.d.ts +21 -0
  109. package/dist/foundations/gallery/sections/badges-section.d.ts +1 -0
  110. package/dist/foundations/gallery/sections/buttons-section.d.ts +1 -0
  111. package/dist/foundations/gallery/sections/composite-chat-section.d.ts +1 -0
  112. package/dist/foundations/gallery/sections/composites-section.d.ts +1 -0
  113. package/dist/foundations/gallery/sections/feedback-section.d.ts +1 -0
  114. package/dist/foundations/gallery/sections/input-authoring-card.d.ts +1 -0
  115. package/dist/foundations/gallery/sections/inputs-section.d.ts +1 -0
  116. package/dist/foundations/gallery/sections/layout-section.d.ts +1 -0
  117. package/dist/foundations/gallery/sections/navigation-identity-section.d.ts +1 -0
  118. package/dist/foundations/gallery/sections/overlays-section.d.ts +1 -0
  119. package/dist/foundations/gallery/sections/panels-section.d.ts +1 -0
  120. package/dist/foundations/gallery/sections/param-editor-composite-card.d.ts +1 -0
  121. package/dist/foundations/gallery/sections/settings-composite-cards.d.ts +1 -0
  122. package/dist/index.d.ts +15 -84
  123. package/dist/index.js +3594 -7450
  124. package/dist/index.js.map +1 -1
  125. package/dist/list-row-mi3Hn-Um.js +740 -0
  126. package/dist/list-row-mi3Hn-Um.js.map +1 -0
  127. package/dist/mermaid-renderer-DZo3qj6D.js +425 -0
  128. package/dist/mermaid-renderer-DZo3qj6D.js.map +1 -0
  129. package/dist/mermaid.js +5 -0
  130. package/dist/mermaid.js.map +1 -0
  131. package/dist/radio-cLMEBBZk.js +76 -0
  132. package/dist/radio-cLMEBBZk.js.map +1 -0
  133. package/dist/resource-badge-qCWHP-wQ.js +99 -0
  134. package/dist/resource-badge-qCWHP-wQ.js.map +1 -0
  135. package/dist/{rich-message-BFtvH9H7.js → rich-message-DBf_5YlW.js} +462 -481
  136. package/dist/rich-message-DBf_5YlW.js.map +1 -0
  137. package/dist/rich-text.js +397 -390
  138. package/dist/rich-text.js.map +1 -1
  139. package/dist/scroll-area-BMbg1WcD.js +91 -0
  140. package/dist/scroll-area-BMbg1WcD.js.map +1 -0
  141. package/dist/style.css +1 -1
  142. package/dist/terminal.js +339 -0
  143. package/dist/terminal.js.map +1 -0
  144. package/dist/theme/global.d.ts +3 -0
  145. package/dist/theme/recipes/badge.d.ts +50 -0
  146. package/dist/theme/recipes/button.d.ts +24 -19
  147. package/dist/theme/recipes/color-picker.d.ts +1 -0
  148. package/dist/theme/recipes/dialog.d.ts +1 -1
  149. package/dist/theme/recipes/drawer.d.ts +1 -1
  150. package/dist/theme/recipes/input.d.ts +55 -0
  151. package/dist/theme/recipes/number-input.d.ts +98 -0
  152. package/dist/theme/recipes/tabs.d.ts +49 -28
  153. package/dist/theme/recipes/textarea.d.ts +62 -1
  154. package/dist/theme/recipes/timeline.d.ts +74 -0
  155. package/dist/theme/shadowless-default-config.d.ts +2 -0
  156. package/dist/theme/tokens/borders.d.ts +0 -3
  157. package/dist/theme/tokens/colors.d.ts +100 -70
  158. package/dist/{theme-C5qHTCU9.js → theme-CJBYBJaA.js} +1264 -415
  159. package/dist/theme-CJBYBJaA.js.map +1 -0
  160. package/dist/theme-preference-DOzHx64J.js +123 -0
  161. package/dist/theme-preference-DOzHx64J.js.map +1 -0
  162. package/dist/theme.js +1 -1
  163. package/dist/tree-list-CcuZMLS5.js +930 -0
  164. package/dist/tree-list-CcuZMLS5.js.map +1 -0
  165. package/dist/workspace-badge-Fuo-1zPj.js +314 -0
  166. package/dist/workspace-badge-Fuo-1zPj.js.map +1 -0
  167. package/package.json +23 -3
  168. package/dist/components/file-tree-helpers.d.ts +0 -8
  169. package/dist/components/open-source-notices-screen.d.ts +0 -20
  170. package/dist/components/param-editor/input-group.d.ts +0 -10
  171. package/dist/components/rich-text/shared/plugins/MermaidPlugin/index.d.ts +0 -1
  172. package/dist/components/rich-text/shared/plugins/TableActionMenuPlugin/TableActionMenuPlugin.d.ts +0 -5
  173. package/dist/components/rich-text/shared/plugins/TableCellResizerPlugin/TableCellResizerPlugin.d.ts +0 -2
  174. package/dist/components/rich-text/theme/report-theme.d.ts +0 -3
  175. package/dist/components/sidebar/sidebar-project-menu.d.ts +0 -7
  176. package/dist/components/style-guide-data.d.ts +0 -46
  177. package/dist/components/style-guide.d.ts +0 -1
  178. package/dist/mermaid-renderer-DYEiYmYQ.js +0 -411
  179. package/dist/mermaid-renderer-DYEiYmYQ.js.map +0 -1
  180. package/dist/radio-DJtQY9po.js +0 -286
  181. package/dist/radio-DJtQY9po.js.map +0 -1
  182. package/dist/resource-badge-D33IFv74.js +0 -188
  183. package/dist/resource-badge-D33IFv74.js.map +0 -1
  184. package/dist/rich-message-BFtvH9H7.js.map +0 -1
  185. package/dist/theme/tokens/shadows.d.ts +0 -64
  186. package/dist/theme-C5qHTCU9.js.map +0 -1
  187. package/dist/utils/formats.d.ts +0 -7
  188. /package/dist/components/{palette-filter.d.ts → command-palette/palette-filter.d.ts} +0 -0
  189. /package/dist/components/{palette-list.d.ts → command-palette/palette-list.d.ts} +0 -0
  190. /package/dist/components/{palette-shortcut.d.ts → command-palette/palette-shortcut.d.ts} +0 -0
  191. /package/dist/components/{palette.d.ts → command-palette/palette.d.ts} +0 -0
  192. /package/dist/components/{code-editor.d.ts → diff-viewer/code-editor.d.ts} +0 -0
  193. /package/dist/components/{column-file-browser.d.ts → file-browser/column-file-browser.d.ts} +0 -0
  194. /package/dist/components/{performance-panel.d.ts → internal/performance-panel.d.ts} +0 -0
  195. /package/dist/components/{header.d.ts → layout/header.d.ts} +0 -0
  196. /package/dist/components/{horizontal-menu-stack.d.ts → layout/horizontal-menu-stack.d.ts} +0 -0
  197. /package/dist/components/{item-section.d.ts → layout/item-section.d.ts} +0 -0
  198. /package/dist/components/{panel-header.constants.d.ts → layout/panel-header.constants.d.ts} +0 -0
  199. /package/dist/components/{resizable-split-layout.d.ts → layout/resizable-split-layout.d.ts} +0 -0
  200. /package/dist/components/{resizable-split-layout.handle.d.ts → layout/resizable-split-layout.handle.d.ts} +0 -0
  201. /package/dist/components/{attached-panel.d.ts → overlays/attached-panel.d.ts} +0 -0
  202. /package/dist/components/{bubble-panel.d.ts → overlays/bubble-panel.d.ts} +0 -0
  203. /package/dist/components/{delete-confirmation-modal.d.ts → overlays/delete-confirmation-modal.d.ts} +0 -0
  204. /package/dist/components/{repo-picker-dialog.d.ts → overlays/repo-picker-dialog.d.ts} +0 -0
  205. /package/dist/components/{resource-context-menu.d.ts → overlays/resource-context-menu.d.ts} +0 -0
  206. /package/dist/components/param-editor/{color-input.d.ts → inputs/color-input.d.ts} +0 -0
  207. /package/dist/components/param-editor/{date-input.d.ts → inputs/date-input.d.ts} +0 -0
  208. /package/dist/components/param-editor/{horizontal-text-input.d.ts → inputs/horizontal-text-input.d.ts} +0 -0
  209. /package/dist/components/param-editor/{number-input.d.ts → inputs/number-input.d.ts} +0 -0
  210. /package/dist/components/param-editor/{selection-input.d.ts → inputs/selection-input.d.ts} +0 -0
  211. /package/dist/components/param-editor/{text-input.d.ts → inputs/text-input.d.ts} +0 -0
  212. /package/dist/components/{alert.d.ts → primitives/alert.d.ts} +0 -0
  213. /package/dist/components/{checkbox.d.ts → primitives/checkbox.d.ts} +0 -0
  214. /package/dist/components/{content-placeholder.d.ts → primitives/content-placeholder.d.ts} +0 -0
  215. /package/dist/components/{empty-state.d.ts → primitives/empty-state.d.ts} +0 -0
  216. /package/dist/components/{error-boundary.d.ts → primitives/error-boundary.d.ts} +0 -0
  217. /package/dist/components/{info-card.d.ts → primitives/info-card.d.ts} +0 -0
  218. /package/dist/components/{integration-card.d.ts → primitives/integration-card.d.ts} +0 -0
  219. /package/dist/components/{radio.d.ts → primitives/radio.d.ts} +0 -0
  220. /package/dist/components/{resource-badge.d.ts → primitives/resource-badge.d.ts} +0 -0
  221. /package/dist/components/{scroll-area.d.ts → primitives/scroll-area.d.ts} +0 -0
  222. /package/dist/components/{simple-card.d.ts → primitives/simple-card.d.ts} +0 -0
  223. /package/dist/components/{slider.d.ts → primitives/slider.d.ts} +0 -0
  224. /package/dist/components/{switch.d.ts → primitives/switch.d.ts} +0 -0
  225. /package/dist/components/{toaster.d.ts → primitives/toaster.d.ts} +0 -0
  226. /package/dist/components/{workspace-badge.d.ts → primitives/workspace-badge.d.ts} +0 -0
@@ -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/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-panel-sticky-user-message.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.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.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.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/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 animationName: \"message-fade-in\",\n animationDuration: \"200ms\",\n animationTimingFunction: \"ease-out\",\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.muted\",\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/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/resource-badge\";\nimport { ResourceBadge } from \"@/components/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}\n\ninterface ShouldAutoScrollArgs {\n previousUserMessageCount: number;\n userMessageCount: number;\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 function AutoScroll(props: AutoScrollProps) {\n const { userMessageCount } = props;\n const { scrollToBottom } = useStickToBottomContext();\n const previousCountRef = useRef(userMessageCount);\n\n useEffect(() => {\n if (\n shouldAutoScroll({\n previousUserMessageCount: previousCountRef.current,\n userMessageCount,\n })\n ) {\n scrollToBottom();\n }\n\n previousCountRef.current = userMessageCount;\n }, [userMessageCount, scrollToBottom]);\n\n return null;\n}\n","interface ChatInputActionState {\n canInterrupt: 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 { isDisabled, streaming, text } = state;\n if (isDisabled || streaming || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (streaming) return canInterrupt ? \"interrupt\" : \"none\";\n if (!hasMessageText(text)) return \"none\";\n return \"submit\";\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/checkbox\";\nimport { Radio, RadioGroup } from \"@/components/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.muted\"\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.muted\"\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/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\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} showArrow>\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","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Square } 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 <Square 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=\"sm\"\n variant=\"primary\"\n borderRadius=\"full\"\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/scroll-area\";\nimport { getTextFromSerializedEditorState, PromptEditor } 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} from \"./chat-input-question-prompt\";\nimport { SendButton } from \"./send-button\";\n\ninterface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => 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 onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\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\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 onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n questionPrompt,\n autoFocus = false,\n } = props;\n\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 const focusEditor = () => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n };\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestAnimationFrame(() => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n setIsSelected(true);\n });\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusEditor();\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 focusEditor();\n });\n }\n };\n\n const canInterrupt = streaming && Boolean(onInterrupt);\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,\n isDisabled: isDisabled || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n\n const submitMessage = () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") {\n onInterrupt?.();\n return;\n }\n\n if (action === \"submit\") {\n submitMessage();\n }\n };\n\n const handleKeyboardSubmit = () => runAction(resolveChatInputKeyboardAction(actionState));\n\n const handleButtonClick = () => runAction(buttonAction);\n\n const attachmentEventHandlers = createAttachmentEventHandlers({\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold,\n });\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n\n setSelectedOptionsByQuestion((current) => {\n const selected = current[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n\n if (question.multiple) {\n return {\n ...current,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n\n return {\n ...current,\n [key]: alreadySelected ? [] : [optionLabel],\n };\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=\"md\"\n borderTopRadius={attachedToTop ? \"0\" : undefined}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isSelected ? \"blue.border\" : \"border.muted\"}\n boxShadow={isSelected ? \"mid\" : \"low\"}\n zIndex={isSelected ? 1 : 0}\n transition=\"box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? \"blue.border\" : \"border\",\n boxShadow: \"mid\",\n zIndex: 1,\n }}\n _focusWithin={{\n borderColor: \"blue.border\",\n boxShadow: \"mid\",\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\">\n {attachmentList ? <Box mb=\"xs\">{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 <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled}\n placeholder={<ChatInputPlaceholder placeholder={placeholder} />}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={handleKeyboardSubmit}\n />\n </ScrollArea>\n )}\n <HStack gap=\"1\" mt=\"md\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={canInterrupt}\n title={canInterrupt ? \"Stop Response\" : \"Message Sending\"}\n shortcut={streaming ? undefined : \"Enter\"}\n onClick={handleButtonClick}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { generateEditorStateFromString } from \"../../rich-text\";\n\nexport const createSerializedPromptState = (input = \"\") => {\n return JSON.stringify(generateEditorStateFromString(input));\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, HStack, IconButton, Text } from \"@chakra-ui/react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../../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\nexport const 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 pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n input_available: \"queued\",\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 { type: \"icon\", icon: toolTypeToIconName(getToolType(invocation)) } as const;\n};\n\nexport const buildBaseTitle = (invocation: ToolPart, detail?: string, labelOverride?: string) => {\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({ kind: \"text\", text: detail, muted: true });\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 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): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = { type: \"comment\", text: invocation.state.errorText };\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 buildIndicator,\n getApplyPatchDiffText,\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\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\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 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 {\n Block,\n Item,\n QuestionFormBlockOption,\n QuestionFormBlockQuestion,\n TitleSegment,\n} from \"../components/timeline\";\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\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\n if (typeof input === \"string\" && input.trim().length > 0) {\n return parseJsonObjectText(input);\n }\n\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\nconst getResponseText = (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(getResponseText).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 getResponseText(value.response) ??\n getResponseText(value.answer) ??\n getResponseText(value.text) ??\n getResponseText(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 : type === \"freeform\" || type === \"text\";\n\n if (options.length === 0 && !allowCustomAnswer) return null;\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 : false,\n allowCustomAnswer,\n };\n};\n\nconst parseQuestionBlock = (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 {\n type: \"question-form\",\n questions,\n } satisfies Block;\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText = getResponseText(invocation.state?.output) ?? getResponseText(invocation.state?.metadata);\n const block = parseQuestionBlock(invocation.state?.input);\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\nexport const renderBash: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, \"Run command\");\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 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, 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 skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, 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 pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n \"input-available\": \"queued\",\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 buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n const inputText = stringifyValue(invocation.state?.input);\n if (inputText) {\n blocks.push({ type: \"code\", language: \"json\", code: inputText });\n }\n\n const outputText = stringifyValue(invocation.state?.output);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"json\", code: outputText });\n }\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\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 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.map((invocation) => renderInvocation(invocation, toolRenderers, options));\n\n return { items };\n};\n\nexport const createToolTimelineBuilder = (toolRenderers: ToolRenderersMap) => {\n return (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n return buildTimelineDocFromInvocations(invocations, { ...options, toolRenderers });\n };\n};\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Link, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\nimport { DiffEditor } from \"@/components/diff-viewer/diff-editor\";\nimport { ResourceBadge } from \"@/components/resource-badge\";\nimport { ScrollArea } from \"@/components/scroll-area\";\nimport type { IconName } from \"../utils/get-icon\";\nimport { getIconComponent } from \"../utils/get-icon\";\nimport { QuestionFormBlockView, TodoListBlockView } from \"./timeline-tool-blocks\";\n\nexport const 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 | { kind: \"text\"; text: string; bold?: boolean; muted?: boolean }\n | { kind: \"avatar\"; src: string; alt?: string }\n | { kind: \"diff\"; fileName: string; filePath?: string; additions?: number; deletions?: number }\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 | { type: \"diff\"; language?: string; original: string; modified: string; sideBySide?: boolean }\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: \"component\"; render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode };\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 return (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n color=\"fg.muted\"\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n}\n\nfunction 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\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\" shadow=\"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 background=\"bg.code\" color=\"fg\" borderRadius=\"md\" showHorizontalScrollbar showVerticalScrollbar={false}>\n <Box\n as=\"pre\"\n padding=\"sm\"\n fontFamily=\"mono\"\n fontSize=\"xs\"\n lineHeight=\"shorter\"\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 \"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 pb=\"xs\" h={isOpen ? \"auto\" : \"20px\"} overflow=\"hidden\">\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"wrap\">\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"wrap\">\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 _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/alert\";\nimport { ResourceBadge } from \"@/components/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 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\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 interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\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 { Box, Button, Flex } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type ReactNode, useEffect, useRef, type WheelEvent } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ChatMessage } from \"./ai-message\";\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 { getMessageOrigin, 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 StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\n}\n\ninterface StickyMessageGroupProps {\n group: MessageGroup;\n streaming: boolean;\n hideQuestionForms: boolean;\n isExpanded: boolean;\n onToggleStickyMessage: (messageId: string) => void;\n}\n\ntype ChatMessageListItem =\n | {\n type: \"leading-response\";\n key: string;\n message: SessionMessage;\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 ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\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 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\nconst renderMessage = (message: SessionMessage, streaming: boolean, hideQuestionForms = false) => {\n const from = getMessageOrigin(message.role);\n\n return (\n <ChatMessage.Root from={from}>\n <ChatMessage.Content from={from}>\n <MessagePartsRenderer message={message} streaming={streaming} hideQuestionForms={hideQuestionForms} />\n {from === \"assistant\" || from === \"user\" ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\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, 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\n return (\n <Box>\n <Box position=\"sticky\" top=\"0\" zIndex={1}>\n <ChatMessage.Root from=\"user\">\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}>{renderMessage(message, streaming, hideQuestionForms)}</Box>\n ))}\n </Box>\n );\n};\n\nconst renderListItem = (\n item: ChatMessageListItem,\n props: Pick<\n ChatMessageListProps,\n \"groups\" | \"streaming\" | \"hideActiveQuestionForms\" | \"expandedStickyMessageIds\" | \"onToggleStickyMessage\"\n >,\n) => {\n const { groups, streaming, hideActiveQuestionForms, expandedStickyMessageIds, onToggleStickyMessage } = props;\n\n if (item.type === \"leading-response\") {\n return renderMessage(item.message, streaming, groups.length > 0 || hideActiveQuestionForms);\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 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 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 onToggleStickyMessage,\n })}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import { Flex, HStack, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport { EmptyState } from \"@/components/empty-state\";\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 { groupMessagesByTurn, mergeReasoningToolOnlyMessages, type SessionMessage } from \"./message-types\";\n\n/** Full conversation shell for agent sessions, including messages, input, attachments, and host-provided slots. */\ninterface 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?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputChange?: (text: string) => void;\n /** Extra controls rendered near the chat input. */\n actions?: ReactNode;\n repoMenu?: 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 chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\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 repoMenu,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n } = props;\n\n const merged = mergeReasoningToolOnlyMessages(messages);\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 hideActiveQuestionForms = Boolean(chatInputQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\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 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 {showThinkingIndicator ? (\n <HStack gap=\"xs\" px=\"sm\" py=\"2xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n Working...\n </Text>\n </HStack>\n ) : null}\n <Stack px=\"xs\" gap={hasWorkspaceHub ? \"0\" : \"xs\"}>\n {workspaceHub}\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(chatInputDefaultValue)}\n streaming={streaming}\n onSubmit={onSubmitMessage}\n onInterrupt={onInterrupt}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChange={onChatInputChange}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n attachedToTop={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n />\n </Stack>\n <Flex p=\"2xs\" justifyContent=\"flex-end\">\n {repoMenu}\n </Flex>\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 { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n changesLabel: string;\n additions: number;\n deletions: number;\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { changesLabel, additions, deletions, action, status = \"ready\", statusLabel } = props;\n const hasChanges = additions > 0 || deletions > 0;\n\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap=\"sm\"\n minW=\"0\"\n px=\"sm\"\n py=\"xs\"\n borderWidth=\"1px\"\n borderColor={status === \"error\" ? \"border.error\" : \"border.muted\"}\n borderRadius=\"xs\"\n borderBottomRadius=\"0\"\n bg={status === \"error\" ? \"bg.error\" : \"bg.subtle\"}\n >\n {status === \"loading\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n ) : status === \"error\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n ) : hasChanges ? (\n <DiffBubble\n label={changesLabel}\n additions={additions}\n deletions={deletions}\n variant=\"ghost\"\n size=\"small\"\n _hover={{ background: \"transparent\" }}\n />\n ) : (\n <Flex flex=\"1\" />\n )}\n {action ? (\n <Flex flexShrink={0} ml=\"auto\">\n {action}\n </Flex>\n ) : 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","animationName","animationDuration","animationTimingFunction","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","AutoScroll","previousCountRef","useRef","current","useEffect","hasMessageText","trim","resolveChatInputKeyboardAction","state","isDisabled","streaming","resolveChatInputButtonAction","canInterrupt","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","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","key","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","Math","min","activeQuestion","hasMultipleQuestions","_question","_questionIndex","optionLabel","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","SendButton","shortcut","title","ariaLabel","Square","ArrowUp","icon","button","Kbd","tooltipContent","Portal","ChatInputPlaceholder","placeholder","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","onChange","attachmentList","actions","attachedToTop","autoFocus","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","getTextFromSerializedEditorState","setText","setSelectedOptionsByQuestion","t10","setCustomAnswersByQuestion","containerRef","onChangeRef","t11","previousQuestionPromptSignatureRef","t12","t13","t14","t15","resetText","_temp2","t16","t17","t18","t19","querySelector","HTMLElement","focus","focusEditor","t20","t21","handle","requestAnimationFrame","editable_0","cancelAnimationFrame","t22","handleContainerClick","t23","t24","shouldFocus","_temp3","resetText_0","resetEditor","actionState","responseText","hasMissingRequiredSelection","buttonAction","t25","questionResponse","submitMessage","t26","action","runAction","t27","handleKeyboardSubmit","t28","handleButtonClick","t29","attachmentEventHandlers","t30","key_1","selected","alreadySelected","filter","toggleQuestionOption","t31","question_0","questionIndex_0","key_2","current_0","updateQuestionCustomAnswer","t32","t33","t34","t35","t36","t37","t38","boxShadow","t39","t40","t41","t42","pr","PromptEditor","t","t43","Spacer","t44","t45","t46","t47","t48","t49","t50","key_0","createSerializedPromptState","generateEditorStateFromString","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","message","parts","reduce","metrics","part","type","lineCount","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","max","scrollHeight","clientHeight","scrollTop","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","messageActionPanelHoverStyles","Copy","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","toLowerCase","getToolNameLookupKeys","normalized","compact","Set","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","line","isPlusHeader","isHunkHeader","isAddedLine","isDeletedLine","ensureFileChange","changes","filePath","has","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","next","nextIndex","preview","buildFileDiffPreviews","previews","i","TOOL_LABELS","apply_patch","bash","edit","glob","grep","read","skill","todowrite","STATE_LABELS","pending","error","input_streaming","input_available","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","tool","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","bold","muted","stateLabel","getInputObject","isArray","getOutputObject","output","getStringValue","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","metadata","parseApplyPatchMetadataFile","entry","record","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","parsedFile","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","add","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","diffSegments","references","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","isRecord","parseJsonObjectText","parsed","parse","toInputRecord","getResponseText","stringValue","response","parseQuestionOption","parseQuestion","custom","parseQuestionBlock","createQuestionRenderer","deps","block","fieldLabel","expandable","renderRead","renderBash","command","outputText","code","stderr","exitCode","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","buildGenericBlocks","inputText","createGenericItem","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","buildTimelineDocFromInvocations","invocations","Timeline","ChakraTimeline","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","alt","src","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","variant","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","b","reactions","clap","Card","DiffEditor","render","ref","TimelineItemRow","itemKey","isOpen","canExpand","hasBlocks","ChevronUpIcon","i_0","TimelineFromJSON","data","expanded","setExpanded","getKey","prev","toggle","idx_0","it","isQuestionTool","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","filePartLabel","filename","url","pop","imageExtensionPattern","isImageFilePart","mediaType","test","filePartThumbnail","Image","openFilePart","open","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","partIndex","fontSize","AlertMessage","Spinner","getMessageOrigin","isReasoningToolOnlyMessage","mergeReasoningToolOnlyMessages","messages","merged","previous","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","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","group","groupIndex","getEstimatedTailOffset","count","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","StickyMessageToggle","onClick","actionPanel","renderMessage","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","ChatPanel","conversationKey","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputPlaceholder","chatInputDefaultValue","onSubmitMessage","onChatInputChange","repoMenu","approvalPrompt","workspaceHub","workspaceInitializing","inputDisabled","chatInputQuestionPrompt","chatInputAutoFocus","hasMessages","messageListIdentity","messageListKey","setExpandedStickyMessageIds","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","hasWorkspaceHub","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","renderSkeletonLines","widths","Skeleton","ChatSkeleton","ChatWorkspaceHub","changesLabel","statusLabel","hasChanges","background"],"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/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-message-animation.ts","../src/components/chat-ui/components/chat-panel-sticky-user-message.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.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.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.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 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 { isDisabled, streaming, text } = state;\n if (isDisabled || streaming || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (streaming) return canInterrupt ? \"interrupt\" : \"none\";\n if (!hasMessageText(text)) return \"none\";\n return \"submit\";\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\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","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Square } 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 <Square 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=\"sm\"\n variant=\"primary\"\n borderRadius=\"full\"\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 } 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} from \"./chat-input-question-prompt\";\nimport { SendButton } from \"./send-button\";\n\ninterface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => 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 onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\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\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 onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n questionPrompt,\n autoFocus = false,\n } = props;\n\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 const focusEditor = () => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n };\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestAnimationFrame(() => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n setIsSelected(true);\n });\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusEditor();\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 focusEditor();\n });\n }\n };\n\n const canInterrupt = streaming && Boolean(onInterrupt);\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,\n isDisabled: isDisabled || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n\n const submitMessage = () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") {\n onInterrupt?.();\n return;\n }\n\n if (action === \"submit\") {\n submitMessage();\n }\n };\n\n const handleKeyboardSubmit = () => runAction(resolveChatInputKeyboardAction(actionState));\n\n const handleButtonClick = () => runAction(buttonAction);\n\n const attachmentEventHandlers = createAttachmentEventHandlers({\n onAttachFiles,\n onAttachText,\n textAttachmentPasteLineThreshold,\n });\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n\n setSelectedOptionsByQuestion((current) => {\n const selected = current[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n\n if (question.multiple) {\n return {\n ...current,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n\n return {\n ...current,\n [key]: alreadySelected ? [] : [optionLabel],\n };\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 : \"border\"}\n zIndex={isSelected ? 1 : 0}\n transition=\"border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? selectedChatInputBorderColor : \"border\",\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\">\n {attachmentList ? <Box mb=\"xs\">{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 <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled}\n placeholder={<ChatInputPlaceholder placeholder={placeholder} />}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={handleKeyboardSubmit}\n />\n </ScrollArea>\n )}\n <HStack gap=\"1\" mt=\"md\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={canInterrupt}\n title={canInterrupt ? \"Stop Response\" : \"Message Sending\"}\n shortcut={streaming ? undefined : \"Enter\"}\n onClick={handleButtonClick}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\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 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, 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 pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n input_available: \"queued\",\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 { type: \"icon\", icon: toolTypeToIconName(getToolType(invocation)) } as const;\n};\n\nexport const buildBaseTitle = (invocation: ToolPart, detail?: string, labelOverride?: string) => {\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({ kind: \"text\", text: detail, muted: true });\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 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): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = { type: \"comment\", text: invocation.state.errorText };\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 buildIndicator,\n getApplyPatchDiffText,\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\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\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 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 {\n Block,\n Item,\n QuestionFormBlockOption,\n QuestionFormBlockQuestion,\n TitleSegment,\n} from \"../components/timeline\";\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\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\n if (typeof input === \"string\" && input.trim().length > 0) {\n return parseJsonObjectText(input);\n }\n\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\nconst getResponseText = (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(getResponseText).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 getResponseText(value.response) ??\n getResponseText(value.answer) ??\n getResponseText(value.text) ??\n getResponseText(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 : type === \"freeform\" || type === \"text\";\n\n if (options.length === 0 && !allowCustomAnswer) return null;\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 : false,\n allowCustomAnswer,\n };\n};\n\nconst parseQuestionBlock = (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 {\n type: \"question-form\",\n questions,\n } satisfies Block;\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText = getResponseText(invocation.state?.output) ?? getResponseText(invocation.state?.metadata);\n const block = parseQuestionBlock(invocation.state?.input);\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\nexport const renderBash: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, \"Run command\");\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 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, 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 skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../components/message-types\";\nimport type { Block, 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 pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n \"input-available\": \"queued\",\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 buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n const inputText = stringifyValue(invocation.state?.input);\n if (inputText) {\n blocks.push({ type: \"code\", language: \"json\", code: inputText });\n }\n\n const outputText = stringifyValue(invocation.state?.output);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"json\", code: outputText });\n }\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\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 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.map((invocation) => renderInvocation(invocation, toolRenderers, options));\n\n return { items };\n};\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Link, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\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 { 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 | { kind: \"text\"; text: string; bold?: boolean; muted?: boolean }\n | { kind: \"avatar\"; src: string; alt?: string }\n | { kind: \"diff\"; fileName: string; filePath?: string; additions?: number; deletions?: number }\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 | { type: \"diff\"; language?: string; original: string; modified: string; sideBySide?: boolean }\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: \"component\"; render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode };\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 return (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n color=\"fg.muted\"\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n}\n\nfunction 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\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 background=\"bg.code\" color=\"fg\" borderRadius=\"md\" showHorizontalScrollbar showVerticalScrollbar={false}>\n <Box\n as=\"pre\"\n padding=\"sm\"\n fontFamily=\"mono\"\n fontSize=\"xs\"\n lineHeight=\"shorter\"\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 \"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 pb=\"xs\" h={isOpen ? \"auto\" : \"20px\"} overflow=\"hidden\">\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"wrap\">\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"wrap\">\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 _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 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\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 interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\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 { Box, Button, Flex } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type ReactNode, 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 {\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 { getMessageOrigin, 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 StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\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 }\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 ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\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 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\nconst renderMessage = (message: SessionMessage, streaming: boolean, hideQuestionForms = false, animate = false) => {\n const from = getMessageOrigin(message.role);\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 {from === \"assistant\" || from === \"user\" ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\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\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}>{renderMessage(message, streaming, hideQuestionForms)}</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 renderMessage(\n item.message,\n streaming,\n groups.length > 0 || hideActiveQuestionForms,\n animatedItemKeys.has(item.key),\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 { Flex, HStack, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport { EmptyState } from \"@/components/primitives/empty-state\";\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 { groupMessagesByTurn, mergeReasoningToolOnlyMessages, type SessionMessage } from \"./message-types\";\n\n/** Full conversation shell for agent sessions, including messages, input, attachments, and host-provided slots. */\ninterface 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?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n onAttachFiles?: (files: File[]) => void;\n onAttachText?: (text: string) => void;\n onChatInputChange?: (text: string) => void;\n /** Extra controls rendered near the chat input. */\n actions?: ReactNode;\n repoMenu?: 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 chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\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 repoMenu,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n } = props;\n\n const merged = mergeReasoningToolOnlyMessages(messages);\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 hideActiveQuestionForms = Boolean(chatInputQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\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 {showThinkingIndicator ? (\n <HStack gap=\"xs\" px=\"sm\" py=\"2xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n Working...\n </Text>\n </HStack>\n ) : null}\n <Stack px=\"xs\" gap={hasWorkspaceHub ? \"0\" : \"xs\"}>\n {workspaceHub}\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(chatInputDefaultValue)}\n streaming={streaming}\n onSubmit={onSubmitMessage}\n onInterrupt={onInterrupt}\n onAttachFiles={onAttachFiles}\n onAttachText={onAttachText}\n onChange={onChatInputChange}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n attachedToTop={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n />\n </Stack>\n <Flex p=\"2xs\" justifyContent=\"flex-end\">\n {repoMenu}\n </Flex>\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 { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n changesLabel: string;\n additions: number;\n deletions: number;\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { changesLabel, additions, deletions, action, status = \"ready\", statusLabel } = props;\n const hasChanges = additions > 0 || deletions > 0;\n\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap=\"sm\"\n minW=\"0\"\n px=\"sm\"\n py=\"xs\"\n borderWidth=\"1px\"\n borderColor={status === \"error\" ? \"border.error\" : \"border.subtle\"}\n borderRadius=\"xs\"\n borderBottomRadius=\"0\"\n bg={status === \"error\" ? \"bg.error\" : \"bg.subtle\"}\n >\n {status === \"loading\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n ) : status === \"error\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n ) : hasChanges ? (\n <DiffBubble\n label={changesLabel}\n additions={additions}\n deletions={deletions}\n variant=\"ghost\"\n size=\"small\"\n _hover={{ background: \"transparent\" }}\n />\n ) : (\n <Flex flex=\"1\" />\n )}\n {action ? (\n <Flex flexShrink={0} ml=\"auto\">\n {action}\n </Flex>\n ) : 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","isDisabled","streaming","resolveChatInputButtonAction","canInterrupt","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","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","key","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","optionLabel","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","SendButton","shortcut","title","ariaLabel","Square","ArrowUp","icon","button","Kbd","tooltipContent","Portal","ChatInputPlaceholder","placeholder","selectedChatInputBorderColor","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","onChange","attachmentList","actions","attachedToTop","autoFocus","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","getTextFromSerializedEditorState","setText","setSelectedOptionsByQuestion","t10","setCustomAnswersByQuestion","containerRef","onChangeRef","t11","previousQuestionPromptSignatureRef","t12","t13","t14","t15","resetText","_temp2","t16","t17","t18","t19","querySelector","HTMLElement","focus","focusEditor","t20","t21","handle","requestAnimationFrame","editable_0","cancelAnimationFrame","t22","handleContainerClick","t23","t24","shouldFocus","_temp3","resetText_0","resetEditor","actionState","responseText","hasMissingRequiredSelection","buttonAction","t25","questionResponse","submitMessage","t26","action","runAction","t27","handleKeyboardSubmit","t28","handleButtonClick","t29","attachmentEventHandlers","t30","key_1","selected","alreadySelected","filter","toggleQuestionOption","t31","question_0","questionIndex_0","key_2","current_0","updateQuestionCustomAnswer","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","pr","PromptEditor","t","t42","Spacer","t43","t44","t45","t46","t47","t48","t49","key_0","createSerializedPromptState","generateEditorStateFromString","messageFadeInProps","animationName","animationDuration","animationTimingFunction","getNextMessageAnimationState","animatedKeys","Set","seenKeys","itemKeys","initialized","has","add","itemKeysEqual","a","b","useMessageAnimationKeys","lastResultRef","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","message","parts","reduce","metrics","part","type","lineCount","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","scrollHeight","clientHeight","scrollTop","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","messageActionPanelHoverStyles","Copy","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","toLowerCase","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","line","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","pending","error","input_streaming","input_available","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","tool","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","bold","muted","stateLabel","getInputObject","isArray","getOutputObject","output","getStringValue","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","metadata","parseApplyPatchMetadataFile","entry","record","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","parsedFile","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","diffSegments","references","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","isRecord","parseJsonObjectText","parsed","parse","toInputRecord","getResponseText","stringValue","response","parseQuestionOption","parseQuestion","custom","parseQuestionBlock","createQuestionRenderer","deps","block","fieldLabel","expandable","renderRead","renderBash","command","outputText","code","stderr","exitCode","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","buildGenericBlocks","inputText","createGenericItem","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","buildTimelineDocFromInvocations","invocations","Timeline","ChakraTimeline","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","alt","src","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","variant","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","reactions","clap","Card","DiffEditor","render","ref","TimelineItemRow","itemKey","isOpen","canExpand","hasBlocks","ChevronUpIcon","i_0","TimelineFromJSON","data","expanded","setExpanded","getKey","prev","toggle","idx_0","it","isQuestionTool","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","filePartLabel","filename","url","pop","imageExtensionPattern","isImageFilePart","mediaType","test","filePartThumbnail","Image","openFilePart","open","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","partIndex","fontSize","AlertMessage","Spinner","getMessageOrigin","isReasoningToolOnlyMessage","mergeReasoningToolOnlyMessages","messages","merged","previous","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","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","group","groupIndex","getEstimatedTailOffset","count","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","StickyMessageToggle","onClick","actionPanel","renderMessage","animate","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","animatedItemKeys","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","ChatPanel","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputPlaceholder","chatInputDefaultValue","onSubmitMessage","onChatInputChange","repoMenu","approvalPrompt","workspaceHub","workspaceInitializing","inputDisabled","chatInputQuestionPrompt","chatInputAutoFocus","hasMessages","messageListIdentity","messageListKey","setExpandedStickyMessageIds","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","hasWorkspaceHub","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","renderSkeletonLines","widths","Skeleton","ChatSkeleton","ChatWorkspaceHub","changesLabel","statusLabel","hasChanges","background"],"mappings":"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"}