@parallelworks/ui 0.20.0 → 0.21.1

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 (437) hide show
  1. package/README.md +5 -0
  2. package/dist/ai/adapter/openai/createOpenAIStream.js +3 -2
  3. package/dist/ai/agent/diff.d.ts +0 -1
  4. package/dist/ai/agent/diff.js +3 -2
  5. package/dist/ai/agent/toolfmt.js +2 -3
  6. package/dist/ai/ai.css +5 -0
  7. package/dist/ai/components/AllocationSelector.js +3 -2
  8. package/dist/ai/components/AttachmentManager.js +7 -5
  9. package/dist/ai/components/AttachmentUpload.js +11 -7
  10. package/dist/ai/components/BlockedGroupBanner.js +2 -2
  11. package/dist/ai/components/BranchNavigator.js +8 -5
  12. package/dist/ai/components/ChatEmptyState.js +8 -5
  13. package/dist/ai/components/ChatInput.d.ts +2 -5
  14. package/dist/ai/components/ChatInput.js +16 -11
  15. package/dist/ai/components/ChatMessage.js +25 -17
  16. package/dist/ai/components/ChatMessageList.js +4 -3
  17. package/dist/ai/components/ChatSidebar.d.ts +0 -1
  18. package/dist/ai/components/ChatSidebar.js +22 -16
  19. package/dist/ai/components/ChatThread.js +9 -11
  20. package/dist/ai/components/ComposerChrome.js +2 -2
  21. package/dist/ai/components/ModelSelector.js +20 -14
  22. package/dist/ai/components/ShareDialog.js +10 -6
  23. package/dist/ai/components/SlashMenu.d.ts +0 -1
  24. package/dist/ai/components/agent/ActivityLine.d.ts +0 -1
  25. package/dist/ai/components/agent/ActivityLine.js +5 -4
  26. package/dist/ai/components/agent/AgentMessageParts.d.ts +1 -26
  27. package/dist/ai/components/agent/AgentMessageParts.js +13 -12
  28. package/dist/ai/core/ChatProvider.d.ts +2 -6
  29. package/dist/ai/core/ChatProvider.js +42 -67
  30. package/dist/ai/core/KeyboardShortcutsProvider.js +1 -1
  31. package/dist/ai/core/chatReducer.d.ts +0 -6
  32. package/dist/ai/core/chatReducer.js +1 -15
  33. package/dist/ai/core/useKeyboardShortcuts.d.ts +3 -1
  34. package/dist/ai/core/useKeyboardShortcuts.js +9 -11
  35. package/dist/ai/core/useSSEStream.d.ts +0 -1
  36. package/dist/ai/core/useSSEStream.js +5 -17
  37. package/dist/ai/strings.d.ts +0 -1
  38. package/dist/ai/strings.js +0 -1
  39. package/dist/ai/types.d.ts +1 -1
  40. package/dist/ai/ui/Avatar.d.ts +1 -2
  41. package/dist/ai/ui/Avatar.js +7 -18
  42. package/dist/ai/ui/Dropdown.js +2 -2
  43. package/dist/ai/ui/Markdown.d.ts +1 -3
  44. package/dist/ai/ui/Markdown.js +1 -2
  45. package/dist/ai/ui/Notice.js +5 -3
  46. package/dist/ai/ui/sidebar.d.ts +0 -1
  47. package/dist/ai/ui/sidebar.js +5 -3
  48. package/dist/ai/utils.js +1 -1
  49. package/dist/components/Avatar.js +4 -2
  50. package/dist/components/BareModal.js +1 -5
  51. package/dist/components/Breadcrumbs.js +21 -14
  52. package/dist/components/Button.js +3 -2
  53. package/dist/components/Callout.js +4 -3
  54. package/dist/components/CollapsiblePanel.d.ts +1 -3
  55. package/dist/components/CollapsiblePanel.js +7 -7
  56. package/dist/components/CopyToClipboard.js +8 -4
  57. package/dist/components/CreateModal.js +11 -7
  58. package/dist/components/Dropdown.d.ts +0 -4
  59. package/dist/components/Dropdown.js +7 -8
  60. package/dist/components/Filter.js +2 -2
  61. package/dist/components/Indicator.js +14 -9
  62. package/dist/components/Input.js +6 -4
  63. package/dist/components/Listbox.js +16 -20
  64. package/dist/components/Loader.js +1 -1
  65. package/dist/components/MultiSelect.js +5 -8
  66. package/dist/components/PageHeader.js +10 -7
  67. package/dist/components/Pagination.js +1 -1
  68. package/dist/components/Provider.d.ts +0 -8
  69. package/dist/components/Sort.js +6 -4
  70. package/dist/components/StatusIcons.d.ts +11 -0
  71. package/dist/components/StatusIcons.js +20 -0
  72. package/dist/components/SwitchToggle.js +3 -5
  73. package/dist/components/Table.d.ts +1 -3
  74. package/dist/components/Tooltip.js +3 -3
  75. package/dist/components/dropdownUtils.js +7 -8
  76. package/dist/components/relativeTime.d.ts +0 -7
  77. package/dist/components/relativeTime.js +1 -1
  78. package/dist/duration.js +1 -1
  79. package/dist/editor/Editor.d.ts +1 -1
  80. package/dist/editor/Editor.js +1 -1
  81. package/dist/editor/EditorField.d.ts +0 -1
  82. package/dist/editor/EditorField.js +8 -8
  83. package/dist/editor/FormCodePanel.js +20 -23
  84. package/dist/editor/yamlLanguage.js +2 -2
  85. package/dist/file-explorer/FileExplorer.js +94 -82
  86. package/dist/file-explorer/FileExplorerContext.d.ts +1 -2
  87. package/dist/file-explorer/FileExplorerContext.js +92 -125
  88. package/dist/file-explorer/FilePreview/Inline.d.ts +1 -2
  89. package/dist/file-explorer/FilePreview/Inline.js +4 -4
  90. package/dist/file-explorer/FilePreview/StreamedBadge.js +2 -2
  91. package/dist/file-explorer/FilePreview/Viewer.js +14 -14
  92. package/dist/file-explorer/FilePreview/index.d.ts +1 -2
  93. package/dist/file-explorer/FilePreview/index.js +20 -13
  94. package/dist/file-explorer/FilePreview/parse.d.ts +2 -1
  95. package/dist/file-explorer/FilePreview/useObjectBlobUrl.d.ts +5 -4
  96. package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +23 -36
  97. package/dist/file-explorer/FilePreview/useObjectText.d.ts +1 -2
  98. package/dist/file-explorer/FilePreview/useObjectText.js +5 -7
  99. package/dist/file-explorer/FileRow.js +3 -3
  100. package/dist/file-explorer/FileRowsWindow.d.ts +5 -12
  101. package/dist/file-explorer/FileRowsWindow.js +3 -2
  102. package/dist/file-explorer/FileTable.d.ts +2 -6
  103. package/dist/file-explorer/LoadMoreRow.d.ts +8 -0
  104. package/dist/file-explorer/TreeView.d.ts +0 -1
  105. package/dist/file-explorer/TreeView.js +11 -9
  106. package/dist/file-explorer/helpers.js +45 -33
  107. package/dist/file-explorer/lib/fileExplorer.d.ts +0 -2
  108. package/dist/file-explorer/lib/types.d.ts +0 -1
  109. package/dist/file-explorer/lib/utils.js +15 -20
  110. package/dist/file-explorer/toasts.js +54 -45
  111. package/dist/form/Fields/BooleanField.js +5 -4
  112. package/dist/form/Fields/CheckboxGroupField.js +5 -4
  113. package/dist/form/Fields/ColorField.js +5 -4
  114. package/dist/form/Fields/DropdownField.d.ts +0 -1
  115. package/dist/form/Fields/DropdownField.js +10 -13
  116. package/dist/form/Fields/DurationField.js +2 -2
  117. package/dist/form/Fields/LabelField.js +5 -5
  118. package/dist/form/Fields/MultiDropdownField.d.ts +1 -1
  119. package/dist/form/Fields/MultiDropdownField.js +8 -11
  120. package/dist/form/Fields/NumberField.js +6 -5
  121. package/dist/form/Fields/ObjectField.d.ts +1 -2
  122. package/dist/form/Fields/ObjectField.js +22 -21
  123. package/dist/form/Fields/RadioField.js +4 -3
  124. package/dist/form/Fields/RangeField.js +7 -6
  125. package/dist/form/Fields/StringField.js +2 -1
  126. package/dist/form/Fields/TextAreaField.js +2 -1
  127. package/dist/form/Form.d.ts +7 -8
  128. package/dist/form/Form.js +56 -81
  129. package/dist/form/SpecialTypes/DropdownWrapper.d.ts +0 -2
  130. package/dist/form/SpecialTypes/DropdownWrapper.js +1 -3
  131. package/dist/form/SpecialTypes/FormikCustomDropdown.d.ts +1 -3
  132. package/dist/form/SpecialTypes/FormikCustomDropdown.js +4 -7
  133. package/dist/form/SpecialTypes/FormikCustomInput.js +16 -13
  134. package/dist/form/Wizard/WizardContainer.js +8 -25
  135. package/dist/form/Wizard/WizardNavigation.d.ts +1 -1
  136. package/dist/form/Wizard/WizardNavigation.js +5 -6
  137. package/dist/form/Wizard/WizardStepContent.d.ts +1 -1
  138. package/dist/form/Wizard/WizardStepContent.js +2 -2
  139. package/dist/form/Wizard/WizardStepIndicator.js +7 -17
  140. package/dist/form/Wizard/types.d.ts +4 -46
  141. package/dist/form/Wizard/useWizardState.d.ts +2 -10
  142. package/dist/form/Wizard/useWizardState.js +42 -92
  143. package/dist/form/Wizard/utils.js +6 -11
  144. package/dist/form/lib.js +28 -54
  145. package/dist/form/types/fieldTypes.d.ts +4 -5
  146. package/dist/form/utils/dependentOptions.d.ts +6 -0
  147. package/dist/form/utils/dependentOptions.js +21 -0
  148. package/dist/form/utils/getParentValue.d.ts +2 -1
  149. package/dist/form/utils/getParentValue.js +10 -15
  150. package/dist/form/utils/getValueUsingPath.js +1 -1
  151. package/dist/graph/AnnotationBanner.d.ts +1 -1
  152. package/dist/graph/AnnotationBanner.js +10 -6
  153. package/dist/graph/Collapse.d.ts +3 -3
  154. package/dist/graph/Collapse.js +3 -8
  155. package/dist/graph/DependencyGraph.d.ts +5 -4
  156. package/dist/graph/DependencyGraph.js +178 -226
  157. package/dist/graph/JobSummary.d.ts +10 -8
  158. package/dist/graph/JobSummary.js +17 -16
  159. package/dist/graph/MatrixGroup.d.ts +5 -17
  160. package/dist/graph/MatrixGroup.js +11 -22
  161. package/dist/graph/TreeView.d.ts +1 -3
  162. package/dist/graph/TreeView.js +106 -492
  163. package/dist/graph/types.d.ts +3 -2
  164. package/dist/graph/util.d.ts +5 -0
  165. package/dist/graph/util.js +18 -0
  166. package/dist/icons/ai/AiOutlineRollback.js +16 -0
  167. package/dist/icons/bi/BiBell.js +16 -0
  168. package/dist/icons/bi/BiBellOff.js +16 -0
  169. package/dist/icons/bi/BiBuildings.js +20 -0
  170. package/dist/icons/bi/BiError.js +20 -0
  171. package/dist/icons/bi/BiExpandVertical.js +16 -0
  172. package/dist/icons/bi/BiPause.js +16 -0
  173. package/dist/icons/bi/BiPlay.js +16 -0
  174. package/dist/icons/bi/BiSolidCheckShield.js +16 -0
  175. package/dist/icons/bi/BiSolidTrashAlt.js +16 -0
  176. package/dist/icons/bi/BiStop.js +16 -0
  177. package/dist/icons/bs/BsArrowsCollapse.js +22 -0
  178. package/dist/icons/bs/BsBank2.js +19 -0
  179. package/dist/icons/bs/BsBriefcase.js +19 -0
  180. package/dist/icons/bs/BsBucket.js +19 -0
  181. package/dist/icons/bs/BsCalendarX.js +23 -0
  182. package/dist/icons/bs/BsChatLeft.js +19 -0
  183. package/dist/icons/bs/BsChevronDoubleDown.js +29 -0
  184. package/dist/icons/bs/BsChevronDoubleUp.js +29 -0
  185. package/dist/icons/bs/BsClipboardCheck.js +34 -0
  186. package/dist/icons/bs/BsCurrencyDollar.js +19 -0
  187. package/dist/icons/bs/BsDash.js +19 -0
  188. package/dist/icons/bs/BsFileEarmarkZip.js +23 -0
  189. package/dist/icons/bs/BsFiles.js +19 -0
  190. package/dist/icons/bs/BsGeoAlt.js +23 -0
  191. package/dist/icons/bs/BsGrid.js +19 -0
  192. package/dist/icons/bs/BsLayers.js +19 -0
  193. package/dist/icons/bs/BsLayoutThreeColumns.js +19 -0
  194. package/dist/icons/bs/BsListUl.js +22 -0
  195. package/dist/icons/bs/BsMortarboard.js +23 -0
  196. package/dist/icons/bs/BsMusicNoteBeamed.js +34 -0
  197. package/dist/icons/bs/BsOpenai.js +19 -0
  198. package/dist/icons/bs/BsPersonPlus.js +26 -0
  199. package/dist/icons/bs/BsSearch.js +19 -0
  200. package/dist/icons/bs/BsSend.js +19 -0
  201. package/dist/icons/bs/BsShieldSlash.js +22 -0
  202. package/dist/icons/bs/BsStar.js +19 -0
  203. package/dist/icons/bs/BsStarFill.js +19 -0
  204. package/dist/icons/bs/BsStopCircle.js +23 -0
  205. package/dist/icons/bs/BsTag.js +23 -0
  206. package/dist/icons/bs/BsTelephone.js +19 -0
  207. package/dist/icons/bs/BsTerminal.js +23 -0
  208. package/dist/icons/bs/BsTerminalFill.js +19 -0
  209. package/dist/icons/bs/BsThreeDots.js +19 -0
  210. package/dist/icons/bs/BsThreeDotsVertical.js +19 -0
  211. package/dist/icons/bs/BsZoomIn.js +37 -0
  212. package/dist/icons/fa/FaAmazon.js +16 -0
  213. package/dist/icons/fa/FaAngleDown.js +16 -0
  214. package/dist/icons/fa/FaAngleLeft.js +16 -0
  215. package/dist/icons/fa/FaAngleRight.js +16 -0
  216. package/dist/icons/fa/FaAngleUp.js +16 -0
  217. package/dist/icons/fa/FaArrowDown.js +16 -0
  218. package/dist/icons/fa/FaArrowLeft.js +16 -0
  219. package/dist/icons/fa/FaArrowRight.js +16 -0
  220. package/dist/icons/fa/FaArrowUp.js +16 -0
  221. package/dist/icons/fa/FaBalanceScale.js +16 -0
  222. package/dist/icons/fa/FaCaretDown.js +16 -0
  223. package/dist/icons/fa/FaCentos.js +16 -0
  224. package/dist/icons/fa/FaChartLine.js +16 -0
  225. package/dist/icons/fa/FaChartPie.js +16 -0
  226. package/dist/icons/fa/FaCheck.js +16 -0
  227. package/dist/icons/fa/FaChevronDown.js +16 -0
  228. package/dist/icons/fa/FaChevronUp.js +16 -0
  229. package/dist/icons/fa/FaChrome.js +16 -0
  230. package/dist/icons/fa/FaCircleNotch.js +16 -0
  231. package/dist/icons/fa/FaCloud.js +16 -0
  232. package/dist/icons/fa/FaCloudDownloadAlt.js +16 -0
  233. package/dist/icons/fa/FaCog.js +16 -0
  234. package/dist/icons/fa/FaCogs.js +16 -0
  235. package/dist/icons/fa/FaComments.js +16 -0
  236. package/dist/icons/fa/FaCompress.js +16 -0
  237. package/dist/icons/fa/FaDesktop.js +16 -0
  238. package/dist/icons/fa/FaDocker.js +16 -0
  239. package/dist/icons/fa/FaDollarSign.js +16 -0
  240. package/dist/icons/fa/FaEdge.js +16 -0
  241. package/dist/icons/fa/FaEdit.js +16 -0
  242. package/dist/icons/fa/FaExclamationTriangle.js +16 -0
  243. package/dist/icons/fa/FaExpand.js +16 -0
  244. package/dist/icons/fa/FaEye.js +16 -0
  245. package/dist/icons/fa/FaEyeSlash.js +16 -0
  246. package/dist/icons/fa/FaFile.js +16 -0
  247. package/dist/icons/fa/FaFilePdf.js +16 -0
  248. package/dist/icons/fa/FaFilter.js +16 -0
  249. package/dist/icons/fa/FaFirefoxBrowser.js +16 -0
  250. package/dist/icons/fa/FaFlask.js +16 -0
  251. package/dist/icons/fa/FaFolder.js +16 -0
  252. package/dist/icons/fa/FaGithub.js +16 -0
  253. package/dist/icons/fa/FaGitlab.js +16 -0
  254. package/dist/icons/fa/FaGlobe.js +16 -0
  255. package/dist/icons/fa/FaGlobeAmericas.js +16 -0
  256. package/dist/icons/fa/FaImage.js +16 -0
  257. package/dist/icons/fa/FaInfoCircle.js +16 -0
  258. package/dist/icons/fa/FaKey.js +16 -0
  259. package/dist/icons/fa/FaLayerGroup.js +16 -0
  260. package/dist/icons/fa/FaLink.js +16 -0
  261. package/dist/icons/fa/FaLinkedin.js +16 -0
  262. package/dist/icons/fa/FaLinux.js +16 -0
  263. package/dist/icons/fa/FaList.js +16 -0
  264. package/dist/icons/fa/FaLock.js +16 -0
  265. package/dist/icons/fa/FaOpenid.js +16 -0
  266. package/dist/icons/fa/FaOpera.js +16 -0
  267. package/dist/icons/fa/FaPaperclip.js +16 -0
  268. package/dist/icons/fa/FaPlus.js +16 -0
  269. package/dist/icons/fa/FaPowerOff.js +16 -0
  270. package/dist/icons/fa/FaPrint.js +16 -0
  271. package/dist/icons/fa/FaQrcode.js +16 -0
  272. package/dist/icons/fa/FaQuestionCircle.js +16 -0
  273. package/dist/icons/fa/FaRedhat.js +16 -0
  274. package/dist/icons/fa/FaRegCircle.js +16 -0
  275. package/dist/icons/fa/FaRegFileImage.js +16 -0
  276. package/dist/icons/fa/FaRegFolder.js +16 -0
  277. package/dist/icons/fa/FaRobot.js +16 -0
  278. package/dist/icons/fa/FaRocket.js +16 -0
  279. package/dist/icons/fa/FaRunning.js +16 -0
  280. package/dist/icons/fa/FaSafari.js +16 -0
  281. package/dist/icons/fa/FaSave.js +16 -0
  282. package/dist/icons/fa/FaSearch.js +16 -0
  283. package/dist/icons/fa/FaShieldAlt.js +16 -0
  284. package/dist/icons/fa/FaSlack.js +16 -0
  285. package/dist/icons/fa/FaStar.js +16 -0
  286. package/dist/icons/fa/FaStop.js +16 -0
  287. package/dist/icons/fa/FaSuse.js +16 -0
  288. package/dist/icons/fa/FaTerminal.js +16 -0
  289. package/dist/icons/fa/FaTimes.js +16 -0
  290. package/dist/icons/fa/FaUbuntu.js +16 -0
  291. package/dist/icons/fa/FaUndoAlt.js +16 -0
  292. package/dist/icons/fa/FaUnlink.js +16 -0
  293. package/dist/icons/fa/FaUser.js +16 -0
  294. package/dist/icons/fa/FaUsers.js +16 -0
  295. package/dist/icons/fa/FaWindows.js +16 -0
  296. package/dist/icons/fa6/FaApple.js +16 -0
  297. package/dist/icons/fa6/FaArrowsRotate.js +16 -0
  298. package/dist/icons/fa6/FaDebian.js +16 -0
  299. package/dist/icons/fa6/FaFilterCircleXmark.js +16 -0
  300. package/dist/icons/fa6/FaInbox.js +16 -0
  301. package/dist/icons/fa6/FaLocationDot.js +16 -0
  302. package/dist/icons/fa6/FaRegFilePdf.js +16 -0
  303. package/dist/icons/fa6/FaRegFolderOpen.js +16 -0
  304. package/dist/icons/fa6/FaUpRightFromSquare.js +16 -0
  305. package/dist/icons/fa6/FaWandMagicSparkles.js +16 -0
  306. package/dist/icons/fa6/FaXTwitter.js +16 -0
  307. package/dist/icons/fi/FiActivity.js +23 -0
  308. package/dist/icons/fi/FiAlertCircle.js +49 -0
  309. package/dist/icons/fi/FiChevronDown.js +23 -0
  310. package/dist/icons/fi/FiClock.js +31 -0
  311. package/dist/icons/fi/FiCopy.js +34 -0
  312. package/dist/icons/fi/FiDownload.js +40 -0
  313. package/dist/icons/fi/FiFile.js +27 -0
  314. package/dist/icons/fi/FiFileText.js +55 -0
  315. package/dist/icons/fi/FiHardDrive.js +55 -0
  316. package/dist/icons/fi/FiRotateCcw.js +27 -0
  317. package/dist/icons/fi/FiUpload.js +40 -0
  318. package/dist/icons/fi/FiX.js +37 -0
  319. package/dist/icons/fi/FiZap.js +23 -0
  320. package/dist/icons/gi/GiSpy.js +16 -0
  321. package/dist/icons/go/GoGitCommit.js +16 -0
  322. package/dist/icons/go/GoGitPullRequest.js +20 -0
  323. package/dist/icons/go/GoIssueOpened.js +16 -0
  324. package/dist/icons/go/GoPlus.js +16 -0
  325. package/dist/icons/go/GoRepoForked.js +28 -0
  326. package/dist/icons/go/GoSignOut.js +16 -0
  327. package/dist/icons/go/GoSkip.js +20 -0
  328. package/dist/icons/go/GoVideo.js +20 -0
  329. package/dist/icons/gr/GrCloudComputer.js +20 -0
  330. package/dist/icons/gr/GrInbox.js +20 -0
  331. package/dist/icons/gr/GrServerCluster.js +20 -0
  332. package/dist/icons/gr/GrStorage.js +20 -0
  333. package/dist/icons/gr/GrTasks.js +20 -0
  334. package/dist/icons/hi/HiCog.js +24 -0
  335. package/dist/icons/hi/HiDuplicate.js +24 -0
  336. package/dist/icons/hi/HiOutlineArchive.js +26 -0
  337. package/dist/icons/hi/HiOutlineClipboardCopy.js +26 -0
  338. package/dist/icons/hi/HiOutlineHome.js +26 -0
  339. package/dist/icons/hi/HiQuestionMarkCircle.js +24 -0
  340. package/dist/icons/hi/HiServer.js +24 -0
  341. package/dist/icons/hi2/HiMiniCheckCircle.js +24 -0
  342. package/dist/icons/hi2/HiMiniLanguage.js +28 -0
  343. package/dist/icons/hi2/HiMiniMinusCircle.js +24 -0
  344. package/dist/icons/hi2/HiMiniXCircle.js +24 -0
  345. package/dist/icons/hi2/HiSparkles.js +24 -0
  346. package/dist/icons/im/ImSpinner5.js +19 -0
  347. package/dist/icons/io/IoIosNotifications.js +16 -0
  348. package/dist/icons/io/IoMdBuild.js +16 -0
  349. package/dist/icons/io/IoMdClose.js +16 -0
  350. package/dist/icons/io5/IoCloudUploadOutline.js +32 -0
  351. package/dist/icons/io5/IoDocumentTextOutline.js +31 -0
  352. package/dist/icons/io5/IoFileTrayFullOutline.js +31 -0
  353. package/dist/icons/io5/IoHeart.js +16 -0
  354. package/dist/icons/io5/IoHeartDislike.js +16 -0
  355. package/dist/icons/io5/IoHeartOutline.js +22 -0
  356. package/dist/icons/io5/IoInformationCircleOutline.js +50 -0
  357. package/dist/icons/io5/IoSettingsOutline.js +22 -0
  358. package/dist/icons/io5/IoWarningOutline.js +40 -0
  359. package/dist/icons/lu/LuArrowRight.js +27 -0
  360. package/dist/icons/lu/LuBadgeCheck.js +27 -0
  361. package/dist/icons/lu/LuBrainCircuit.js +101 -0
  362. package/dist/icons/lu/LuCalendar.js +46 -0
  363. package/dist/icons/lu/LuCheck.js +23 -0
  364. package/dist/icons/lu/LuChevronLeft.js +23 -0
  365. package/dist/icons/lu/LuChevronRight.js +23 -0
  366. package/dist/icons/lu/LuExternalLink.js +35 -0
  367. package/dist/icons/lu/LuEye.js +31 -0
  368. package/dist/icons/lu/LuEyeOff.js +40 -0
  369. package/dist/icons/lu/LuFolderTree.js +40 -0
  370. package/dist/icons/lu/LuIdCard.js +55 -0
  371. package/dist/icons/lu/LuLogs.js +65 -0
  372. package/dist/icons/lu/LuMail.js +33 -0
  373. package/dist/icons/lu/LuMegaphone.js +27 -0
  374. package/dist/icons/lu/LuMoon.js +23 -0
  375. package/dist/icons/lu/LuPartyPopper.js +65 -0
  376. package/dist/icons/lu/LuSettings2.js +48 -0
  377. package/dist/icons/lu/LuSheet.js +72 -0
  378. package/dist/icons/lu/LuShield.js +23 -0
  379. package/dist/icons/lu/LuSun.js +69 -0
  380. package/dist/icons/lu/LuX.js +27 -0
  381. package/dist/icons/lu/LuZoomIn.js +59 -0
  382. package/dist/icons/lu/LuZoomOut.js +49 -0
  383. package/dist/icons/md/MdClear.js +23 -0
  384. package/dist/icons/md/MdDragHandle.js +23 -0
  385. package/dist/icons/md/MdInstallDesktop.js +31 -0
  386. package/dist/icons/md/MdOutlineAttachMoney.js +23 -0
  387. package/dist/icons/md/MdOutlineMoneyOff.js +23 -0
  388. package/dist/icons/md/MdPieChart.js +23 -0
  389. package/dist/icons/md/MdRefresh.js +23 -0
  390. package/dist/icons/md/MdReplay.js +23 -0
  391. package/dist/icons/md/MdSmartphone.js +23 -0
  392. package/dist/icons/pi/PiArrowBendUpRightBold.js +19 -0
  393. package/dist/icons/pi/PiPlugsConnectedFill.js +19 -0
  394. package/dist/icons/pi/PiRectangleDashed.js +19 -0
  395. package/dist/icons/pi/PiShareBold.js +19 -0
  396. package/dist/icons/si/SiAnthropic.js +19 -0
  397. package/dist/icons/si/SiHelm.js +19 -0
  398. package/dist/icons/si/SiKubernetes.js +19 -0
  399. package/dist/icons/tb/TbAlertTriangle.js +35 -0
  400. package/dist/icons/tb/TbAlertTriangleFilled.js +19 -0
  401. package/dist/icons/tb/TbApi.js +40 -0
  402. package/dist/icons/tb/TbBrain.js +50 -0
  403. package/dist/icons/tb/TbBuildingTunnel.js +65 -0
  404. package/dist/icons/tb/TbEdit.js +35 -0
  405. package/dist/icons/tb/TbLayoutSidebar.js +27 -0
  406. package/dist/icons/tb/TbLayoutSidebarLeftCollapse.js +35 -0
  407. package/dist/icons/tb/TbLayoutSidebarRightCollapse.js +35 -0
  408. package/dist/icons/tb/TbUser.js +27 -0
  409. package/dist/icons/tb/TbUserOff.js +35 -0
  410. package/dist/icons/tb/TbWorldShare.js +55 -0
  411. package/dist/icons/tb/TbWorldWww.js +65 -0
  412. package/dist/icons/ti/TiArrowSortedDown.js +20 -0
  413. package/dist/icons/ti/TiArrowSortedUp.js +20 -0
  414. package/dist/icons/ti/TiArrowUnsorted.js +20 -0
  415. package/dist/icons/ti/TiCancel.js +20 -0
  416. package/dist/icons/vsc/VscChromeMinimize.js +19 -0
  417. package/dist/icons/vsc/VscJson.js +19 -0
  418. package/dist/icons/vsc/VscLayoutSidebarLeft.js +19 -0
  419. package/dist/icons/vsc/VscPass.js +27 -0
  420. package/dist/icons/vsc/VscSplitHorizontal.js +19 -0
  421. package/dist/icons/vsc/VscTerminalPowershell.js +19 -0
  422. package/dist/icons.d.ts +7 -22
  423. package/dist/icons.js +257 -38
  424. package/dist/index.d.ts +1 -1
  425. package/dist/list/ActionToolbar.js +2 -2
  426. package/dist/list/ListPager.js +4 -3
  427. package/dist/list/ListTable.js +2 -2
  428. package/dist/list/ListViewControls.js +29 -42
  429. package/dist/list/RowContextMenu.js +28 -19
  430. package/dist/list/listSearch.js +6 -5
  431. package/dist/logviewer/LogViewer.js +28 -20
  432. package/dist/logviewer/segments.js +2 -2
  433. package/dist/styles/theme.css +1 -0
  434. package/dist/styles.css +1 -1
  435. package/dist/theme/index.js +5 -5
  436. package/package.json +28 -30
  437. package/dist/ai/ui/buttons.d.ts +0 -1
package/README.md CHANGED
@@ -64,6 +64,11 @@ import { AddIcon, LoaderIcon, TrashIcon } from '@parallelworks/ui/icons'
64
64
  The barrel re-exports a curated, stable set of icon names over `react-icons`
65
65
  so applications never depend on a specific icon pack directly.
66
66
 
67
+ Each icon ships as its own module under `dist/icons/<set>/`, so an application
68
+ bundles an icon only into the chunks that render it. Every module carries its
69
+ icon's data, copied from its `react-icons` set at build time, and opens with that
70
+ set's name and license.
71
+
67
72
  ## Workflow engine
68
73
 
69
74
  The workflow surfaces (`/form`'s `DynamicForm`, `/graph`'s `DependencyGraph`,
@@ -5,8 +5,9 @@ import { processSSEStream } from "./sse.js";
5
5
  //#region src/ai/adapter/openai/createOpenAIStream.ts
6
6
  function createOpenAICompatibleStream(config) {
7
7
  return async (req, handlers, signal) => {
8
- const useResponses = req.useResponses === true && !!config.responsesUrl;
9
- const url = useResponses ? config.responsesUrl : config.completionsUrl;
8
+ const responsesUrl = req.useResponses === true ? config.responsesUrl : void 0;
9
+ const useResponses = !!responsesUrl;
10
+ const url = responsesUrl || config.completionsUrl;
10
11
  const body = useResponses ? buildResponsesRequestBody(req.model, req.messages) : {
11
12
  model: req.model,
12
13
  messages: req.messages,
@@ -1,6 +1,5 @@
1
1
  export declare const MAX_EDIT_DIFF_LINES = 100;
2
2
  export declare const MAX_WRITE_DIFF_LINES = 50;
3
- export declare const DIFF_CONTEXT = 3;
4
3
  export interface EditToolArgs {
5
4
  path?: string;
6
5
  old_string?: string;
@@ -2,6 +2,7 @@ import { sanitizeLabel } from "./toolfmt.js";
2
2
  //#region src/ai/agent/diff.ts
3
3
  var MAX_EDIT_DIFF_LINES = 100;
4
4
  var MAX_WRITE_DIFF_LINES = 50;
5
+ var DIFF_CONTEXT = 3;
5
6
  function isEditDiffTool(name) {
6
7
  return name === "EditFile" || name === "WriteFile";
7
8
  }
@@ -133,8 +134,8 @@ function computeEditDiff(oldString, newString, startLine = 0) {
133
134
  if (!op) continue;
134
135
  if (op.tag === "e") {
135
136
  const len = op.i2 - op.i1;
136
- const leading = k > 0 ? Math.min(3, len) : 0;
137
- const trailing = k < ops.length - 1 ? Math.min(3, len) : 0;
137
+ const leading = k > 0 ? Math.min(DIFF_CONTEXT, len) : 0;
138
+ const trailing = k < ops.length - 1 ? Math.min(DIFF_CONTEXT, len) : 0;
138
139
  const showAll = len <= leading + trailing;
139
140
  const emit = (offset) => {
140
141
  const oldNo = op.i1 + offset + 1;
@@ -53,7 +53,7 @@ function clip(s, max) {
53
53
  const r = [...s];
54
54
  if (r.length <= max) return s;
55
55
  if (max <= 3) return r.slice(0, max).join("");
56
- return r.slice(0, max - 3).join("") + "...";
56
+ return `${r.slice(0, max - 3).join("")}...`;
57
57
  }
58
58
  function sanitizeLabel(s) {
59
59
  let out = "";
@@ -211,8 +211,7 @@ function grepMatchPath(line, lineNums) {
211
211
  const i = line.indexOf(":");
212
212
  return i >= 0 ? line.slice(0, i) : null;
213
213
  }
214
- const m = GREP_CONTENT_PATH.exec(line);
215
- return m ? m[1] ?? null : null;
214
+ return GREP_CONTENT_PATH.exec(line)?.[1] ?? null;
216
215
  }
217
216
  function grepSearchSummary(argsJSON, body) {
218
217
  if (body === "No matches found." || body === "No results after applying offset.") return "No matches";
package/dist/ai/ai.css CHANGED
@@ -208,6 +208,7 @@
208
208
 
209
209
  /* Light mode: use the primary Shiki theme (--sdm-bg/--sdm-c) */
210
210
  .markdown [data-streamdown="code-block-body"] pre {
211
+ /* biome-ignore lint/complexity/noImportantStyles: the highlighter sets the background as an inline style */
211
212
  background-color: var(--sdm-bg, inherit) !important;
212
213
  color: var(--sdm-fg, inherit);
213
214
  }
@@ -217,6 +218,7 @@
217
218
 
218
219
  /* Dark mode: switch to --shiki-dark variants */
219
220
  .dark .markdown [data-streamdown="code-block-body"] pre {
221
+ /* biome-ignore lint/complexity/noImportantStyles: the highlighter sets the background as an inline style */
220
222
  background-color: var(--shiki-dark-bg, var(--sdm-bg, inherit)) !important;
221
223
  color: var(--shiki-dark, var(--sdm-fg, inherit));
222
224
  }
@@ -233,6 +235,7 @@
233
235
  /* Remove prose backtick pseudo-elements on inline code */
234
236
  .markdown code::before,
235
237
  .markdown code::after {
238
+ /* biome-ignore lint/complexity/noImportantStyles: the typography styles add these with a more specific selector */
236
239
  content: none !important;
237
240
  }
238
241
 
@@ -250,7 +253,9 @@
250
253
  @media (hover: none) {
251
254
  .chat-actions,
252
255
  .chat-meta {
256
+ /* biome-ignore lint/complexity/noImportantStyles: must win over the utility classes that hide these until hover */
253
257
  opacity: 1 !important;
258
+ /* biome-ignore lint/complexity/noImportantStyles: must win over the utility classes that hide these until hover */
254
259
  pointer-events: auto !important;
255
260
  }
256
261
  }
@@ -10,9 +10,10 @@ function AllocationSelector({ variant = "default" } = {}) {
10
10
  const { adapter, selectedProvider, selectedAllocation, setSelectedAllocation } = useChat();
11
11
  const isOrgProvider = isOrgModel(selectedProvider);
12
12
  const allocationsAdapter = adapter.allocations;
13
- const { data: allocations } = useSWR(isOrgProvider && allocationsAdapter ? ["ai-chat-allocations"] : null, () => allocationsAdapter.list());
13
+ const { data: allocations } = useSWR(isOrgProvider && allocationsAdapter ? ["ai-chat-allocations"] : null, () => allocationsAdapter?.list());
14
14
  useEffect(() => {
15
- if (isOrgProvider && allocations?.length && !selectedAllocation) setSelectedAllocation(allocations[0].name);
15
+ const first = allocations?.[0];
16
+ if (isOrgProvider && first && !selectedAllocation) setSelectedAllocation(first.name);
16
17
  }, [
17
18
  isOrgProvider,
18
19
  allocations,
@@ -1,5 +1,7 @@
1
1
  import { safeUrl } from "../../safeUrl.js";
2
- import { DownloadFileIcon, FileIcon, TrashIcon } from "../../icons.js";
2
+ import { BiSolidTrashAlt } from "../../icons/bi/BiSolidTrashAlt.js";
3
+ import { FiDownload } from "../../icons/fi/FiDownload.js";
4
+ import { FiFile } from "../../icons/fi/FiFile.js";
3
5
  import { useChatConfig } from "../core/config.js";
4
6
  import { useChat } from "../core/ChatProvider.js";
5
7
  import { formatFileSize } from "../utils.js";
@@ -32,7 +34,7 @@ function AttachmentManager() {
32
34
  [attachmentId]: state
33
35
  });
34
36
  }, []);
35
- const { data: pages, size, setSize, isLoading, isValidating, mutate } = useSWRInfinite(attachmentsAdapter ? attachmentsPageKey : () => null, ([, cursor]) => attachmentsAdapter.list({
37
+ const { data: pages, size, setSize, isLoading, isValidating, mutate } = useSWRInfinite(attachmentsAdapter ? attachmentsPageKey : () => null, ([, cursor]) => attachmentsAdapter?.list({
36
38
  limit: 24,
37
39
  cursor
38
40
  }));
@@ -89,7 +91,7 @@ function AttachmentManager() {
89
91
  children: [/* @__PURE__ */ jsxs("div", {
90
92
  className: "relative aspect-square bg-(--theme-muted-panel-bg) flex items-center justify-center",
91
93
  ...openProps,
92
- children: [/* @__PURE__ */ jsx(FileIcon, { className: "w-8 h-8 theme-muted-text" }), showThumbnail && /* @__PURE__ */ jsx("img", {
94
+ children: [/* @__PURE__ */ jsx(FiFile, { className: "w-8 h-8 theme-muted-text" }), showThumbnail && /* @__PURE__ */ jsx("img", {
93
95
  src: downloadUrl,
94
96
  alt: att.filename || "Image",
95
97
  className: cx("absolute inset-0 w-full h-full object-cover", thumbnail !== "loaded" && "opacity-0"),
@@ -115,14 +117,14 @@ function AttachmentManager() {
115
117
  onClick: () => triggerDownload(downloadUrl, att.filename || "File"),
116
118
  className: "p-1.5 rounded-lg hover:theme-hover theme-muted-text transition-colors",
117
119
  title: t.download,
118
- children: /* @__PURE__ */ jsx(DownloadFileIcon, { className: "w-4 h-4" })
120
+ children: /* @__PURE__ */ jsx(FiDownload, { className: "w-4 h-4" })
119
121
  }), /* @__PURE__ */ jsx("button", {
120
122
  type: "button",
121
123
  onClick: () => handleDelete(att.id),
122
124
  disabled: isDeleting,
123
125
  className: "p-1.5 rounded-lg hover:bg-red-500/15 theme-muted-text hover:text-red-600 transition-colors",
124
126
  title: t.delete,
125
- children: /* @__PURE__ */ jsx(TrashIcon, { className: "w-4 h-4" })
127
+ children: /* @__PURE__ */ jsx(BiSolidTrashAlt, { className: "w-4 h-4" })
126
128
  })]
127
129
  })]
128
130
  })]
@@ -1,4 +1,8 @@
1
- import { AddIcon, FileSolidIcon, ImageSolidIcon, PdfSolidIcon, TrashIcon } from "../../icons.js";
1
+ import { BiSolidTrashAlt } from "../../icons/bi/BiSolidTrashAlt.js";
2
+ import { FaFile } from "../../icons/fa/FaFile.js";
3
+ import { FaFilePdf } from "../../icons/fa/FaFilePdf.js";
4
+ import { FaImage } from "../../icons/fa/FaImage.js";
5
+ import { FaPlus } from "../../icons/fa/FaPlus.js";
2
6
  import { useChatConfig } from "../core/config.js";
3
7
  import { useChat } from "../core/ChatProvider.js";
4
8
  import { formatFileSize } from "../utils.js";
@@ -11,10 +15,10 @@ import { mutate } from "swr";
11
15
  var DEFAULT_MAX_FILE_SIZE = 26214400;
12
16
  var DEFAULT_MAX_FILES = 10;
13
17
  function getFileIcon(mimeType) {
14
- if (!mimeType) return FileSolidIcon;
15
- if (mimeType.startsWith("image/")) return ImageSolidIcon;
16
- if (mimeType === "application/pdf") return PdfSolidIcon;
17
- return FileSolidIcon;
18
+ if (!mimeType) return FaFile;
19
+ if (mimeType.startsWith("image/")) return FaImage;
20
+ if (mimeType === "application/pdf") return FaFilePdf;
21
+ return FaFile;
18
22
  }
19
23
  var AttachmentUpload = forwardRef(function AttachmentUpload({ conversationId, attachments, onAttachmentsChange, disabled = false, maxFiles = DEFAULT_MAX_FILES, maxFileSize = DEFAULT_MAX_FILE_SIZE }, ref) {
20
24
  const { adapter, notify } = useChat();
@@ -149,7 +153,7 @@ var AttachmentUpload = forwardRef(function AttachmentUpload({ conversationId, at
149
153
  className: "p-0.5 rounded hover:bg-red-500/10",
150
154
  title: t.remove,
151
155
  disabled,
152
- children: /* @__PURE__ */ jsx(TrashIcon, { className: "w-3 h-3 text-red-500" })
156
+ children: /* @__PURE__ */ jsx(BiSolidTrashAlt, { className: "w-3 h-3 text-red-500" })
153
157
  })
154
158
  ]
155
159
  }, attachment.id || index);
@@ -163,7 +167,7 @@ var AttachmentUpload = forwardRef(function AttachmentUpload({ conversationId, at
163
167
  onClick: disabled ? void 0 : handleClick,
164
168
  children: [/* @__PURE__ */ jsxs("span", {
165
169
  className: "flex items-center justify-center gap-2 text-sm theme-muted-text",
166
- children: [/* @__PURE__ */ jsx(AddIcon, { className: "w-4 h-4" }), /* @__PURE__ */ jsx("span", { children: isDragging ? t.dropFilesHere : t.addFiles })]
170
+ children: [/* @__PURE__ */ jsx(FaPlus, { className: "w-4 h-4" }), /* @__PURE__ */ jsx("span", { children: isDragging ? t.dropFilesHere : t.addFiles })]
167
171
  }), /* @__PURE__ */ jsxs("span", {
168
172
  className: "block text-xs theme-muted-text mt-1",
169
173
  children: [
@@ -1,4 +1,4 @@
1
- import { WarningTriangleIcon } from "../../icons.js";
1
+ import { FaExclamationTriangle } from "../../icons/fa/FaExclamationTriangle.js";
2
2
  import { useChatConfig } from "../core/config.js";
3
3
  import { useChat } from "../core/ChatProvider.js";
4
4
  import { getProviderKeyFromModelId } from "./ModelSelector.js";
@@ -13,7 +13,7 @@ function BlockedGroupBanner() {
13
13
  if (!provider?.groupBlocked || !provider.group) return null;
14
14
  return /* @__PURE__ */ jsxs("div", {
15
15
  className: "mx-4 mt-2 flex items-start gap-3 p-3 rounded-lg bg-amber-500/10 border border-amber-500/20",
16
- children: [/* @__PURE__ */ jsx(WarningTriangleIcon, { className: "w-4 h-4 text-amber-500 shrink-0 mt-0.5" }), /* @__PURE__ */ jsxs("div", {
16
+ children: [/* @__PURE__ */ jsx(FaExclamationTriangle, { className: "w-4 h-4 text-amber-500 shrink-0 mt-0.5" }), /* @__PURE__ */ jsxs("div", {
17
17
  className: "flex-1 min-w-0",
18
18
  children: [/* @__PURE__ */ jsx("p", {
19
19
  className: "text-sm font-medium text-amber-700",
@@ -1,4 +1,5 @@
1
- import { AngleLeftIcon, AngleRightIcon } from "../../icons.js";
1
+ import { FaAngleLeft } from "../../icons/fa/FaAngleLeft.js";
2
+ import { FaAngleRight } from "../../icons/fa/FaAngleRight.js";
2
3
  import { useChatConfig } from "../core/config.js";
3
4
  import { useMemo } from "react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -16,10 +17,12 @@ function BranchNavigator({ messages, currentMessageId, onNavigate }) {
16
17
  const hasPrev = currentIndex > 0;
17
18
  const hasNext = currentIndex < siblings.length - 1;
18
19
  const handlePrev = () => {
19
- if (hasPrev) onNavigate(siblings[currentIndex - 1].id);
20
+ const prev = siblings[currentIndex - 1];
21
+ if (hasPrev && prev) onNavigate(prev.id);
20
22
  };
21
23
  const handleNext = () => {
22
- if (hasNext) onNavigate(siblings[currentIndex + 1].id);
24
+ const next = siblings[currentIndex + 1];
25
+ if (hasNext && next) onNavigate(next.id);
23
26
  };
24
27
  return /* @__PURE__ */ jsxs("div", {
25
28
  className: "inline-flex items-center gap-1 text-xs theme-muted-text",
@@ -31,7 +34,7 @@ function BranchNavigator({ messages, currentMessageId, onNavigate }) {
31
34
  className: "p-0.5 rounded theme-hover disabled:opacity-30 disabled:cursor-not-allowed",
32
35
  title: t.previous,
33
36
  "aria-label": t.previous,
34
- children: /* @__PURE__ */ jsx(AngleLeftIcon, { className: "w-3 h-3" })
37
+ children: /* @__PURE__ */ jsx(FaAngleLeft, { className: "w-3 h-3" })
35
38
  }),
36
39
  /* @__PURE__ */ jsxs("span", {
37
40
  className: "min-w-[3ch] text-center",
@@ -48,7 +51,7 @@ function BranchNavigator({ messages, currentMessageId, onNavigate }) {
48
51
  className: "p-0.5 rounded theme-hover disabled:opacity-30 disabled:cursor-not-allowed",
49
52
  title: t.next,
50
53
  "aria-label": t.next,
51
- children: /* @__PURE__ */ jsx(AngleRightIcon, { className: "w-3 h-3" })
54
+ children: /* @__PURE__ */ jsx(FaAngleRight, { className: "w-3 h-3" })
52
55
  })
53
56
  ]
54
57
  });
@@ -1,4 +1,7 @@
1
- import { AddIcon, CloudIcon, TimesIcon, WarningTriangleIcon } from "../../icons.js";
1
+ import { FaCloud } from "../../icons/fa/FaCloud.js";
2
+ import { FaExclamationTriangle } from "../../icons/fa/FaExclamationTriangle.js";
3
+ import { FaPlus } from "../../icons/fa/FaPlus.js";
4
+ import { FaTimes } from "../../icons/fa/FaTimes.js";
2
5
  import { keyedByContent } from "../../components/keys.js";
3
6
  import { useChatConfig } from "../core/config.js";
4
7
  import { useChat } from "../core/ChatProvider.js";
@@ -75,7 +78,7 @@ function ChatEmptyState({ targetSession }) {
75
78
  sessionUnreachable && !sessionBannerDismissed && /* @__PURE__ */ jsxs("div", {
76
79
  className: "mx-4 mt-2 flex items-start gap-3 p-3 rounded-lg bg-amber-500/10 border border-amber-500/20",
77
80
  children: [
78
- /* @__PURE__ */ jsx(WarningTriangleIcon, { className: "w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" }),
81
+ /* @__PURE__ */ jsx(FaExclamationTriangle, { className: "w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" }),
79
82
  /* @__PURE__ */ jsxs("div", {
80
83
  className: "flex-1 min-w-0",
81
84
  children: [/* @__PURE__ */ jsx("p", {
@@ -97,7 +100,7 @@ function ChatEmptyState({ targetSession }) {
97
100
  type: "button",
98
101
  onClick: () => setSessionBannerDismissed(true),
99
102
  className: "text-amber-400 hover:text-amber-600 transition-colors cursor-pointer",
100
- children: /* @__PURE__ */ jsx(TimesIcon, { className: "w-3 h-3" })
103
+ children: /* @__PURE__ */ jsx(FaTimes, { className: "w-3 h-3" })
101
104
  })]
102
105
  })
103
106
  ]
@@ -123,7 +126,7 @@ function ChatEmptyState({ targetSession }) {
123
126
  }), hasLoadedModels && models.length === 0 ? /* @__PURE__ */ jsxs("div", {
124
127
  className: "flex flex-col items-center justify-center gap-4 py-8",
125
128
  children: [
126
- /* @__PURE__ */ jsx(CloudIcon, { className: "h-16 w-16 theme-muted-text opacity-50" }),
129
+ /* @__PURE__ */ jsx(FaCloud, { className: "h-16 w-16 theme-muted-text opacity-50" }),
127
130
  /* @__PURE__ */ jsx("p", {
128
131
  className: "text-lg theme-muted-text",
129
132
  children: t.noProvidersTitle
@@ -138,7 +141,7 @@ function ChatEmptyState({ targetSession }) {
138
141
  href: extraLinks.addProvider
139
142
  },
140
143
  className: "inline-flex items-center gap-2 px-4 py-2 rounded-lg transition-colors text-sm font-medium theme-element hover:opacity-90",
141
- children: [/* @__PURE__ */ jsx(AddIcon, { className: "h-3 w-3" }), t.addProvider]
144
+ children: [/* @__PURE__ */ jsx(FaPlus, { className: "h-3 w-3" }), t.addProvider]
142
145
  })
143
146
  ]
144
147
  }) : /* @__PURE__ */ jsx("div", {
@@ -1,11 +1,8 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { AttachmentMeta } from '../types.js';
2
3
  import { type SlashMenuConfig } from './SlashMenu.js';
3
4
  interface ChatInputProps {
4
- onSend: (content: string, attachmentIds?: string[], attachmentMeta?: Record<string, {
5
- filename: string;
6
- contentType: string;
7
- size: number;
8
- }>) => void;
5
+ onSend: (content: string, attachmentIds?: string[], attachmentMeta?: AttachmentMeta) => void;
9
6
  disabled?: boolean;
10
7
  placeholder?: string | undefined;
11
8
  conversationId?: string;
@@ -1,4 +1,6 @@
1
- import { ArrowUpIcon, AttachmentIcon, StopSolidIcon } from "../../icons.js";
1
+ import { FaArrowUp } from "../../icons/fa/FaArrowUp.js";
2
+ import { FaPaperclip } from "../../icons/fa/FaPaperclip.js";
3
+ import { FaStop } from "../../icons/fa/FaStop.js";
2
4
  import { useChatConfig } from "../core/config.js";
3
5
  import { useChat } from "../core/ChatProvider.js";
4
6
  import AttachmentUpload from "./AttachmentUpload.js";
@@ -54,7 +56,7 @@ function AttachButton({ open, disabled, label, onClick }) {
54
56
  disabled,
55
57
  className: cx("flex-shrink-0 p-3 ml-1 mb-1 rounded-xl transition-colors", open ? "text-blue-600" : "theme-muted-text hover:theme-text", "disabled:opacity-50 disabled:cursor-not-allowed"),
56
58
  "aria-label": label,
57
- children: /* @__PURE__ */ jsx(AttachmentIcon, { className: "h-5 w-5" })
59
+ children: /* @__PURE__ */ jsx(FaPaperclip, { className: "h-5 w-5" })
58
60
  });
59
61
  }
60
62
  function SendButton({ onClick, enabled, emphasised, label, testId }) {
@@ -66,7 +68,7 @@ function SendButton({ onClick, enabled, emphasised, label, testId }) {
66
68
  className: cx("p-2.5 rounded-xl transition-all duration-200", emphasised ? "theme-element hover:opacity-90" : "theme-muted-panel theme-muted-text", !enabled && "cursor-not-allowed"),
67
69
  "aria-label": label,
68
70
  title: label,
69
- children: /* @__PURE__ */ jsx(ArrowUpIcon, { className: "h-4 w-4" })
71
+ children: /* @__PURE__ */ jsx(FaArrowUp, { className: "h-4 w-4" })
70
72
  });
71
73
  }
72
74
  /** A host-driven turn stands in for the provider's stream and queue. */
@@ -139,14 +141,17 @@ var ChatInput = forwardRef(function ChatInput({ onSend, disabled = false, placeh
139
141
  flushQueuedMessages();
140
142
  return;
141
143
  }
142
- const uploaded = attachments.filter((a) => a.uploaded && a.id);
143
- const attachmentIds = uploaded.map((a) => a.id);
144
+ const attachmentIds = [];
144
145
  const meta = {};
145
- for (const a of uploaded) meta[a.id] = {
146
- filename: a.filename,
147
- contentType: a.mimeType,
148
- size: a.size
149
- };
146
+ for (const a of attachments) {
147
+ if (!a.uploaded || !a.id) continue;
148
+ attachmentIds.push(a.id);
149
+ meta[a.id] = {
150
+ filename: a.filename,
151
+ contentType: a.mimeType,
152
+ size: a.size
153
+ };
154
+ }
150
155
  onSend(input.trim(), attachmentIds.length > 0 ? attachmentIds : void 0, attachmentIds.length > 0 ? meta : void 0);
151
156
  setInput("");
152
157
  clearDraft(conversationId);
@@ -237,7 +242,7 @@ var ChatInput = forwardRef(function ChatInput({ onSend, disabled = false, placeh
237
242
  className: cx("p-2.5 rounded-xl", "theme-muted-panel", "hover:theme-hover", "transition-colors"),
238
243
  "aria-label": t.stopGenerating,
239
244
  title: t.stopGenerating,
240
- children: /* @__PURE__ */ jsx(StopSolidIcon, { className: "h-4 w-4" })
245
+ children: /* @__PURE__ */ jsx(FaStop, { className: "h-4 w-4" })
241
246
  }) : /* @__PURE__ */ jsx(SendButton, {
242
247
  onClick: handleSubmit,
243
248
  enabled: canSend,
@@ -1,5 +1,13 @@
1
1
  import { safeUrl } from "../../safeUrl.js";
2
- import { CheckIcon, ChevronRightIcon, CopyIcon, DownloadFileIcon, EditIcon, ErrorIcon, FileIcon, RefreshIcon, RetryIcon } from "../../icons.js";
2
+ import { BiError } from "../../icons/bi/BiError.js";
3
+ import { FaCheck } from "../../icons/fa/FaCheck.js";
4
+ import { FaEdit } from "../../icons/fa/FaEdit.js";
5
+ import { FaUndoAlt } from "../../icons/fa/FaUndoAlt.js";
6
+ import { FiCopy } from "../../icons/fi/FiCopy.js";
7
+ import { FiDownload } from "../../icons/fi/FiDownload.js";
8
+ import { FiFile } from "../../icons/fi/FiFile.js";
9
+ import { LuChevronRight } from "../../icons/lu/LuChevronRight.js";
10
+ import { MdRefresh } from "../../icons/md/MdRefresh.js";
3
11
  import { durationToAbsHumanDuration } from "../../duration.js";
4
12
  import { useChatConfig } from "../core/config.js";
5
13
  import { formatFileSize } from "../utils.js";
@@ -36,7 +44,8 @@ function triggerDownload(url, filename) {
36
44
  function ChatMessage({ message, allMessages, isStreaming = false, isEditing = false, showAuthor = false, currentUsername, attachmentDownloadUrl, onOpenAttachment, onNavigateBranch, onEdit, onSaveEdit, onCancelEdit, onRegenerate, onRetry, onOpenReasoning, onApprovalAnswer, flush }) {
37
45
  const isUser = message.role === "user";
38
46
  const isTool = message.role === "tool";
39
- const isOtherUser = isUser && showAuthor && !!message.author && !!currentUsername && message.author.username !== currentUsername;
47
+ const otherAuthor = isUser && showAuthor && message.author && currentUsername && message.author.username !== currentUsername ? message.author : void 0;
48
+ const isOtherUser = !!otherAuthor;
40
49
  const isRightAligned = isUser && !isOtherUser;
41
50
  const hasError = !!message.error;
42
51
  const hasReasoning = !!message.reasoning;
@@ -151,7 +160,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
151
160
  type: "button",
152
161
  onClick: () => onOpenReasoning?.(message.reasoning || "", message.reasoningDuration ?? null),
153
162
  className: "flex items-center gap-x-1 text-sm theme-muted-text hover:theme-text transition-colors",
154
- children: [/* @__PURE__ */ jsx("span", { children: message.reasoningDuration ? `Thought for ${formatDuration(message.reasoningDuration)}` : "Thought process" }), /* @__PURE__ */ jsx(ChevronRightIcon, { className: "w-3.5 h-3.5" })]
163
+ children: [/* @__PURE__ */ jsx("span", { children: message.reasoningDuration ? `Thought for ${formatDuration(message.reasoningDuration)}` : "Thought process" }), /* @__PURE__ */ jsx(LuChevronRight, { className: "w-3.5 h-3.5" })]
155
164
  })
156
165
  }),
157
166
  showTurnDurationLabel && /* @__PURE__ */ jsx("div", {
@@ -169,16 +178,15 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
169
178
  onApprovalAnswer
170
179
  })
171
180
  }),
172
- isOtherUser && /* @__PURE__ */ jsx("span", {
181
+ otherAuthor && /* @__PURE__ */ jsx("span", {
173
182
  className: "text-xs theme-muted-text",
174
- children: message.author.name || message.author.username
183
+ children: otherAuthor.name || otherAuthor.username
175
184
  }),
176
- message.content ? isUser && isOtherUser ? /* @__PURE__ */ jsxs("div", {
185
+ message.content ? otherAuthor ? /* @__PURE__ */ jsxs("div", {
177
186
  className: "flex items-end gap-2",
178
187
  children: [/* @__PURE__ */ jsx(Avatar, {
179
- src: message.author.avatarUrl ?? void 0,
180
- name: message.author.name || message.author.username,
181
- size: "sm",
188
+ src: otherAuthor.avatarUrl ?? void 0,
189
+ name: otherAuthor.name || otherAuthor.username,
182
190
  className: "flex-shrink-0 mb-0.5"
183
191
  }), /* @__PURE__ */ jsx("div", {
184
192
  className: "px-4 py-2.5 chat-ink rounded-2xl rounded-bl-md max-w-[70%] inline-block whitespace-pre-wrap text-base leading-6 bg-[color-mix(in_oklab,var(--theme-panel)_6%,transparent)]",
@@ -208,7 +216,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
208
216
  hasError && /* @__PURE__ */ jsxs("div", {
209
217
  className: "flex items-center gap-2 mt-2 p-3 rounded-lg bg-red-500/10 border border-red-500/30",
210
218
  children: [
211
- /* @__PURE__ */ jsx(ErrorIcon, { className: "w-4 h-4 text-red-600 flex-shrink-0" }),
219
+ /* @__PURE__ */ jsx(BiError, { className: "w-4 h-4 text-red-600 flex-shrink-0" }),
212
220
  /* @__PURE__ */ jsx("span", {
213
221
  className: "text-sm text-red-700 flex-1",
214
222
  children: message.error
@@ -217,7 +225,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
217
225
  type: "button",
218
226
  onClick: () => onRetry(message.id),
219
227
  className: "flex items-center gap-1 px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-500/15 rounded transition-colors",
220
- children: [/* @__PURE__ */ jsx(RetryIcon, { className: "w-3 h-3" }), t.retry]
228
+ children: [/* @__PURE__ */ jsx(FaUndoAlt, { className: "w-3 h-3" }), t.retry]
221
229
  })
222
230
  ]
223
231
  }),
@@ -245,7 +253,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
245
253
  onClick: () => onOpenAttachment ? onOpenAttachment(att) : triggerDownload(downloadUrl, att.filename || "File"),
246
254
  className: "inline-flex items-center gap-1.5 text-xs px-2.5 py-1.5 rounded-lg bg-(--theme-muted-panel-bg) hover:theme-hover transition-colors cursor-pointer",
247
255
  children: [
248
- /* @__PURE__ */ jsx(FileIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
256
+ /* @__PURE__ */ jsx(FiFile, { className: "w-3.5 h-3.5 flex-shrink-0" }),
249
257
  /* @__PURE__ */ jsx("span", {
250
258
  className: "truncate max-w-[150px]",
251
259
  children: att.filename || "File"
@@ -258,7 +266,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
258
266
  ")"
259
267
  ]
260
268
  }) : null,
261
- /* @__PURE__ */ jsx(DownloadFileIcon, { className: "w-3 h-3 flex-shrink-0" })
269
+ /* @__PURE__ */ jsx(FiDownload, { className: "w-3 h-3 flex-shrink-0" })
262
270
  ]
263
271
  }, att.id);
264
272
  return /* @__PURE__ */ jsxs("div", {
@@ -269,7 +277,7 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
269
277
  style: { cursor: "pointer" }
270
278
  } : {},
271
279
  children: [
272
- /* @__PURE__ */ jsx(FileIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
280
+ /* @__PURE__ */ jsx(FiFile, { className: "w-3.5 h-3.5 flex-shrink-0" }),
273
281
  /* @__PURE__ */ jsx("span", {
274
282
  className: "truncate max-w-[150px]",
275
283
  children: att.filename || "File"
@@ -294,21 +302,21 @@ function ChatMessage({ message, allMessages, isStreaming = false, isEditing = fa
294
302
  onClick: copyToClipboard,
295
303
  className: "p-1.5 rounded-lg hover:theme-hover theme-muted-text transition-colors",
296
304
  title: t.copy,
297
- children: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx(CopyIcon, { className: "w-4 h-4" })
305
+ children: copied ? /* @__PURE__ */ jsx(FaCheck, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx(FiCopy, { className: "w-4 h-4" })
298
306
  }),
299
307
  isUser && !isOtherUser && onEdit && /* @__PURE__ */ jsx("button", {
300
308
  type: "button",
301
309
  onClick: () => onEdit(message.id),
302
310
  className: "p-1.5 rounded-lg hover:theme-hover theme-muted-text transition-colors",
303
311
  title: t.edit,
304
- children: /* @__PURE__ */ jsx(EditIcon, { className: "w-4 h-4" })
312
+ children: /* @__PURE__ */ jsx(FaEdit, { className: "w-4 h-4" })
305
313
  }),
306
314
  !isUser && onRegenerate && /* @__PURE__ */ jsx("button", {
307
315
  type: "button",
308
316
  onClick: () => onRegenerate(message.id),
309
317
  className: "p-1.5 rounded-lg hover:theme-hover theme-muted-text transition-colors",
310
318
  title: t.regenerate,
311
- children: /* @__PURE__ */ jsx(RefreshIcon, { className: "w-4 h-4" })
319
+ children: /* @__PURE__ */ jsx(MdRefresh, { className: "w-4 h-4" })
312
320
  }),
313
321
  !isUser && onNavigateBranch && /* @__PURE__ */ jsx(BranchNavigator, {
314
322
  messages: allMessages,
@@ -1,4 +1,5 @@
1
- import { ChevronRightIcon, XIcon } from "../../icons.js";
1
+ import { FiX } from "../../icons/fi/FiX.js";
2
+ import { LuChevronRight } from "../../icons/lu/LuChevronRight.js";
2
3
  import { durationToAbsHumanDuration } from "../../duration.js";
3
4
  import { useChatConfig } from "../core/config.js";
4
5
  import { useChat } from "../core/ChatProvider.js";
@@ -208,7 +209,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
208
209
  children: /* @__PURE__ */ jsx("span", { children: elapsedTime > 0 ? `${tThinking.label} (${elapsedTime}s)` : tThinking.ellipsis })
209
210
  }) : /* @__PURE__ */ jsxs("div", {
210
211
  className: "flex items-center gap-x-1 text-sm theme-muted-text hover:theme-text transition-colors",
211
- children: [/* @__PURE__ */ jsx("span", { children: tThinking.thoughtFor(finalThinkingDuration ? durationToAbsHumanDuration(Duration.fromMillis(finalThinkingDuration)) : `${elapsedTime}s`) }), /* @__PURE__ */ jsx(ChevronRightIcon, { className: "w-3.5 h-3.5" })]
212
+ children: [/* @__PURE__ */ jsx("span", { children: tThinking.thoughtFor(finalThinkingDuration ? durationToAbsHumanDuration(Duration.fromMillis(finalThinkingDuration)) : `${elapsedTime}s`) }), /* @__PURE__ */ jsx(LuChevronRight, { className: "w-3.5 h-3.5" })]
212
213
  })
213
214
  }), isThinking && /* @__PURE__ */ jsxs("div", {
214
215
  className: "relative ml-6 pl-3 border-l-2 theme-border",
@@ -271,7 +272,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
271
272
  title: strings.queue.remove,
272
273
  onClick: () => onRemoveQueued(msg.id),
273
274
  className: "absolute top-1 right-1 rounded p-1 opacity-0 transition-opacity group-hover/queued:opacity-100 focus-visible:opacity-100 hover:bg-(--theme-hover) text-(--theme-muted-text-color)",
274
- children: /* @__PURE__ */ jsx(XIcon, { className: "h-3.5 w-3.5" })
275
+ children: /* @__PURE__ */ jsx(FiX, { className: "h-3.5 w-3.5" })
275
276
  })]
276
277
  }, msg.id)),
277
278
  footer,
@@ -1,4 +1,3 @@
1
- export type ConversationGroupKey = 'groupToday' | 'groupYesterday' | 'groupThisWeek' | 'groupThisMonth' | 'groupOlder';
2
1
  export default function ChatSidebar({ actions, }: {
3
2
  /** False when the host's page header carries new chat, attachments and search. */
4
3
  actions?: boolean;