@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
@@ -1,33 +1,32 @@
1
1
  import { useRunFile, useSlots, useWorkflowEngine } from "../components/Provider.js";
2
- import { ChevronRightIcon, LoaderIcon } from "../icons.js";
2
+ import { LuChevronRight } from "../icons/lu/LuChevronRight.js";
3
+ import { LoaderIcon } from "../components/StatusIcons.js";
3
4
  import { Indicator } from "../components/Indicator.js";
4
5
  import { LogViewer } from "../logviewer/LogViewer.js";
5
6
  import { toAbsHumanDuration } from "../duration.js";
7
+ import { Collapse } from "./Collapse.js";
8
+ import { jobLabel, toggled } from "./util.js";
6
9
  import cx from "classnames";
7
10
  import { useCallback, useId, useMemo, useState } from "react";
8
11
  import { jsx, jsxs } from "react/jsx-runtime";
9
12
  import { DateTime } from "luxon";
10
13
  import { AnimatePresence, motion } from "framer-motion";
11
14
  //#region src/graph/TreeView.tsx
12
- function getStepDuration(step) {
13
- if (!step.startedAt) return "";
14
- const start = DateTime.fromISO(step.startedAt);
15
- const end = step.completedAt ? DateTime.fromISO(step.completedAt) : DateTime.now();
16
- return toAbsHumanDuration(start, end);
15
+ function elapsed({ startedAt, completedAt }) {
16
+ if (!startedAt) return "";
17
+ const end = completedAt ? DateTime.fromISO(completedAt) : DateTime.now();
18
+ return toAbsHumanDuration(DateTime.fromISO(startedAt), end);
17
19
  }
18
- function getJobDuration(job) {
19
- if (!job.startedAt) return "";
20
- const start = DateTime.fromISO(job.startedAt);
21
- const end = job.completedAt ? DateTime.fromISO(job.completedAt) : DateTime.now();
22
- return toAbsHumanDuration(start, end);
23
- }
24
- function formatJobLabel(jobName, job) {
25
- const matrix = job?._matrix;
26
- if (matrix?.originaljob) return `${matrix.originaljob[0].toUpperCase() + matrix.originaljob.slice(1)} (${(matrix.index ?? 0) + 1}/${matrix.totalingroup ?? "?"})`;
27
- return (jobName[0].toUpperCase() + jobName.slice(1)).replace(/_/g, " ");
20
+ function Chevron({ open, hidden = false }) {
21
+ return /* @__PURE__ */ jsx(motion.div, {
22
+ animate: { rotate: open ? 90 : 0 },
23
+ transition: { duration: .15 },
24
+ className: cx("flex-shrink-0", hidden ? "invisible" : "text-[var(--theme-muted-text-color)]"),
25
+ children: /* @__PURE__ */ jsx(LuChevronRight, { className: cx("w-4 h-4", open && "text-[var(--theme-element)]") })
26
+ });
28
27
  }
29
- function InlineLogViewer({ slug, jobName, stepIndex }) {
30
- const logPath = useWorkflowEngine().stepLogPath("", jobName, stepIndex);
28
+ function StepLogs({ slug, prefix, jobName, stepIndex }) {
29
+ const logPath = useWorkflowEngine().stepLogPath(prefix, jobName, stepIndex);
31
30
  const { data: logs, isLoading, error } = useRunFile(slug, logPath, { refreshInterval: 2e3 });
32
31
  if (isLoading && !logs) return /* @__PURE__ */ jsxs("div", {
33
32
  className: "flex items-center gap-2 px-5 py-4 text-sm text-[var(--theme-muted-text-color)]",
@@ -38,7 +37,7 @@ function InlineLogViewer({ slug, jobName, stepIndex }) {
38
37
  children: "No logs available"
39
38
  });
40
39
  return /* @__PURE__ */ jsx("div", {
41
- className: "border-t border-[var(--theme-border)] ",
40
+ className: "border-t border-[var(--theme-border)]",
42
41
  children: /* @__PURE__ */ jsx(LogViewer, {
43
42
  log: logs,
44
43
  width: "100%",
@@ -49,9 +48,10 @@ function InlineLogViewer({ slug, jobName, stepIndex }) {
49
48
  })
50
49
  });
51
50
  }
52
- function JobRow({ jobName, job, isExpanded, onToggle, dependencies, workflowName, runNumber, slug, expandedJobs, onJobToggle, expandedSteps, onStepToggle }) {
53
- const hasSteps = job.steps && job.steps.length > 0;
54
- const duration = getJobDuration(job);
51
+ function JobRow({ jobName, job, isExpanded, onToggle, prefix, state }) {
52
+ const hasSteps = !!job.steps?.length;
53
+ const dependencies = Array.isArray(job.needs) ? job.needs : [];
54
+ const duration = elapsed(job);
55
55
  const panelId = useId();
56
56
  return /* @__PURE__ */ jsxs("div", {
57
57
  className: "border-b border-[var(--theme-border)] last:border-b-0",
@@ -62,26 +62,24 @@ function JobRow({ jobName, job, isExpanded, onToggle, dependencies, workflowName
62
62
  className: cx("flex items-center gap-3 px-5 py-3 transition-colors w-full text-left", job.status === "skipped" || job.status === "skipped-failed" ? "cursor-default" : "cursor-pointer", isExpanded && "bg-[var(--theme-panel-bg)]"),
63
63
  onClick: onToggle,
64
64
  children: [
65
- /* @__PURE__ */ jsx(motion.div, {
66
- animate: { rotate: isExpanded ? 90 : 0 },
67
- transition: { duration: .15 },
68
- className: cx("flex-shrink-0", hasSteps ? "text-[var(--theme-muted-text-color)]" : "invisible"),
69
- children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: cx("w-4 h-4", isExpanded && "text-[var(--theme-element)]") })
65
+ /* @__PURE__ */ jsx(Chevron, {
66
+ open: isExpanded,
67
+ hidden: !hasSteps
70
68
  }),
71
69
  /* @__PURE__ */ jsx(Indicator, { status: job.status }),
72
70
  /* @__PURE__ */ jsxs("div", {
73
71
  className: "flex flex-col gap-1 min-w-0 flex-1",
74
72
  children: [/* @__PURE__ */ jsx("span", {
75
73
  className: "font-mono text-sm text-[var(--theme-app)] truncate",
76
- children: formatJobLabel(jobName, job)
77
- }), dependencies && dependencies.length > 0 && /* @__PURE__ */ jsxs("div", {
74
+ children: jobLabel(jobName, job)
75
+ }), dependencies.length > 0 && /* @__PURE__ */ jsxs("div", {
78
76
  className: "flex items-center gap-1.5",
79
77
  children: [/* @__PURE__ */ jsx("span", {
80
78
  className: "text-[10px] text-[var(--theme-muted-text-color)]",
81
79
  children: "depends on:"
82
80
  }), dependencies.map((dep) => /* @__PURE__ */ jsx("span", {
83
81
  className: "text-[10px] px-1.5 py-0.5 rounded bg-[var(--theme-muted-panel-bg)] text-[var(--theme-muted-text-color)]",
84
- children: formatJobLabel(dep)
82
+ children: jobLabel(dep)
85
83
  }, dep))]
86
84
  })]
87
85
  }),
@@ -91,75 +89,37 @@ function JobRow({ jobName, job, isExpanded, onToggle, dependencies, workflowName
91
89
  children: duration
92
90
  })
93
91
  ]
94
- }), /* @__PURE__ */ jsx(AnimatePresence, {
95
- initial: false,
96
- children: isExpanded && hasSteps && /* @__PURE__ */ jsx(motion.div, {
97
- initial: {
98
- height: 0,
99
- opacity: 0
100
- },
101
- animate: {
102
- height: "auto",
103
- opacity: 1
104
- },
105
- exit: {
106
- height: 0,
107
- opacity: 0
108
- },
109
- transition: {
110
- duration: .2,
111
- ease: [
112
- .25,
113
- .1,
114
- .25,
115
- 1
116
- ]
117
- },
118
- className: "overflow-hidden",
119
- id: panelId,
120
- children: /* @__PURE__ */ jsx("div", {
121
- className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
122
- children: job.steps.map((step, index) => {
123
- const stepKey = `${jobName}:${index}`;
124
- const isStepExpanded = expandedSteps.has(stepKey);
125
- return /* @__PURE__ */ jsx(StepRow, {
126
- step,
127
- index,
128
- isExpanded: isStepExpanded,
129
- onToggle: () => onStepToggle(stepKey),
130
- workflowName,
131
- runNumber,
132
- slug,
133
- jobName,
134
- expandedJobs,
135
- onJobToggle,
136
- expandedSteps,
137
- onStepToggle
138
- }, stepKey);
139
- })
92
+ }), /* @__PURE__ */ jsx(Collapse, {
93
+ expanded: isExpanded && hasSteps,
94
+ id: panelId,
95
+ children: /* @__PURE__ */ jsx("div", {
96
+ className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
97
+ children: job.steps?.map((step, index) => {
98
+ const stepKey = `${prefix}${jobName}:${index}`;
99
+ return /* @__PURE__ */ jsx(StepRow, {
100
+ step,
101
+ index,
102
+ isExpanded: state.expandedSteps.has(stepKey),
103
+ onToggle: () => state.onStepToggle(stepKey),
104
+ prefix,
105
+ jobName,
106
+ state
107
+ }, stepKey);
140
108
  })
141
109
  })
142
110
  })]
143
111
  });
144
112
  }
145
- function StepRow({ step, index, isExpanded, onToggle, workflowName, runNumber, slug, jobName, expandedJobs, onJobToggle, expandedSteps, onStepToggle, depth = 0 }) {
113
+ function StepRow({ step, index, isExpanded, onToggle, prefix, jobName, state }) {
146
114
  const engine = useWorkflowEngine();
147
115
  const slots = useSlots();
148
- const duration = getStepDuration(step);
116
+ const duration = elapsed(step);
149
117
  const label = engine.stepLabel(step, index);
150
- const isSubworkflow = !!step.subworkflow;
118
+ const subworkflow = step.subworkflow;
151
119
  const panelId = useId();
152
- const subworkflowJobs = step.subworkflow?.jobs ?? null;
153
- const subworkflowJobNames = subworkflowJobs ? Object.keys(subworkflowJobs).filter((name) => subworkflowJobs[name]?.if !== false) : [];
154
- const subworkflowDependenciesMap = useMemo(() => {
155
- if (!subworkflowJobs) return {};
156
- const map = {};
157
- for (const subJobName of subworkflowJobNames) {
158
- const job = subworkflowJobs[subJobName];
159
- if (job?.needs && Array.isArray(job.needs) && job.needs.length > 0) map[subJobName] = job.needs;
160
- }
161
- return map;
162
- }, [subworkflowJobs, subworkflowJobNames]);
120
+ const subworkflowJobs = subworkflow?.jobs ?? {};
121
+ const subworkflowJobNames = Object.keys(subworkflowJobs).filter((name) => subworkflowJobs[name]?.if !== false);
122
+ const subworkflowPrefix = `${prefix}subworkflows/${jobName}/step_${index}/`;
163
123
  return /* @__PURE__ */ jsxs("div", { children: [
164
124
  /* @__PURE__ */ jsxs("button", {
165
125
  type: "button",
@@ -168,21 +128,16 @@ function StepRow({ step, index, isExpanded, onToggle, workflowName, runNumber, s
168
128
  className: cx("flex items-center gap-3 px-5 py-2.5 cursor-pointer transition-colors w-full text-left", isExpanded ? "" : "hover:bg-[var(--theme-hover)]"),
169
129
  onClick: onToggle,
170
130
  children: [
171
- /* @__PURE__ */ jsx(motion.div, {
172
- animate: { rotate: isExpanded ? 90 : 0 },
173
- transition: { duration: .15 },
174
- className: "flex-shrink-0 text-[var(--theme-muted-text-color)]",
175
- children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: cx("w-4 h-4", isExpanded && "text-[var(--theme-element)]") })
176
- }),
131
+ /* @__PURE__ */ jsx(Chevron, { open: isExpanded }),
177
132
  /* @__PURE__ */ jsx(Indicator, { status: step.status }),
178
- isSubworkflow && slots.workflowIcon?.({
179
- image: step.subworkflow?.image,
180
- type: step.subworkflow?.type,
133
+ subworkflow && slots.workflowIcon?.({
134
+ image: subworkflow.image,
135
+ type: subworkflow.type,
181
136
  className: "h-4 w-4 flex-shrink-0"
182
137
  }),
183
138
  /* @__PURE__ */ jsxs("span", {
184
139
  className: "font-mono text-sm text-[var(--theme-app)] truncate flex-1",
185
- children: [label, isSubworkflow && /* @__PURE__ */ jsx("span", {
140
+ children: [label, subworkflow && /* @__PURE__ */ jsx("span", {
186
141
  className: "ml-2 text-xs text-[var(--theme-muted-text-color)]",
187
142
  children: "(subworkflow)"
188
143
  })]
@@ -193,351 +148,39 @@ function StepRow({ step, index, isExpanded, onToggle, workflowName, runNumber, s
193
148
  })
194
149
  ]
195
150
  }),
196
- /* @__PURE__ */ jsx(AnimatePresence, {
197
- initial: false,
198
- children: isExpanded && !isSubworkflow && /* @__PURE__ */ jsx(motion.div, {
199
- initial: {
200
- height: 0,
201
- opacity: 0
202
- },
203
- animate: {
204
- height: "auto",
205
- opacity: 1
206
- },
207
- exit: {
208
- height: 0,
209
- opacity: 0
210
- },
211
- transition: {
212
- duration: .2,
213
- ease: [
214
- .25,
215
- .1,
216
- .25,
217
- 1
218
- ]
219
- },
220
- className: "overflow-hidden",
221
- id: panelId,
222
- children: /* @__PURE__ */ jsx(InlineLogViewer, {
223
- slug,
224
- jobName,
225
- stepIndex: index
226
- })
151
+ /* @__PURE__ */ jsx(Collapse, {
152
+ expanded: isExpanded && !subworkflow,
153
+ id: panelId,
154
+ children: /* @__PURE__ */ jsx(StepLogs, {
155
+ slug: state.slug,
156
+ prefix,
157
+ jobName,
158
+ stepIndex: index
227
159
  })
228
160
  }),
229
- /* @__PURE__ */ jsx(AnimatePresence, {
230
- initial: false,
231
- children: isExpanded && isSubworkflow && subworkflowJobNames.length > 0 && /* @__PURE__ */ jsx(motion.div, {
232
- initial: {
233
- height: 0,
234
- opacity: 0
235
- },
236
- animate: {
237
- height: "auto",
238
- opacity: 1
239
- },
240
- exit: {
241
- height: 0,
242
- opacity: 0
243
- },
244
- transition: {
245
- duration: .2,
246
- ease: [
247
- .25,
248
- .1,
249
- .25,
250
- 1
251
- ]
252
- },
253
- className: "overflow-hidden",
254
- id: panelId,
255
- children: /* @__PURE__ */ jsx("div", {
256
- className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
257
- children: subworkflowJobNames.map((subJobName) => {
258
- const subJob = subworkflowJobs?.[subJobName];
259
- if (!subJob) return null;
260
- const subJobKey = `${jobName}:${index}:${subJobName}`;
261
- const isSubJobExpanded = expandedJobs.has(subJobKey);
262
- return /* @__PURE__ */ jsx(SubworkflowJobRow, {
263
- jobName: subJobName,
264
- job: subJob,
265
- isExpanded: isSubJobExpanded,
266
- onToggle: () => onJobToggle(subJobKey),
267
- dependencies: subworkflowDependenciesMap[subJobName],
268
- slug,
269
- parentJobName: jobName,
270
- parentStepIndex: index,
271
- expandedJobs,
272
- onJobToggle,
273
- expandedSteps,
274
- onStepToggle,
275
- depth: depth + 1
276
- }, subJobName);
277
- })
161
+ /* @__PURE__ */ jsx(Collapse, {
162
+ expanded: isExpanded && !!subworkflow && subworkflowJobNames.length > 0,
163
+ id: panelId,
164
+ children: /* @__PURE__ */ jsx("div", {
165
+ className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
166
+ children: subworkflowJobNames.map((subJobName) => {
167
+ const subJob = subworkflowJobs[subJobName];
168
+ if (!subJob) return null;
169
+ const subJobKey = `${prefix}${jobName}:${index}:${subJobName}`;
170
+ return /* @__PURE__ */ jsx(JobRow, {
171
+ jobName: subJobName,
172
+ job: subJob,
173
+ isExpanded: state.expandedJobs.has(subJobKey),
174
+ onToggle: () => state.onJobToggle(subJobKey),
175
+ prefix: subworkflowPrefix,
176
+ state
177
+ }, subJobName);
278
178
  })
279
179
  })
280
180
  })
281
181
  ] });
282
182
  }
283
- function SubworkflowJobRow({ jobName, job, isExpanded, onToggle, dependencies, slug, parentJobName, parentStepIndex, subworkflowPrefix, expandedJobs, onJobToggle, expandedSteps, onStepToggle, depth }) {
284
- const hasSteps = job.steps && job.steps.length > 0;
285
- const duration = getJobDuration(job);
286
- const nestedSubworkflowPrefix = `${subworkflowPrefix || ""}subworkflows/${parentJobName}/step_${parentStepIndex}/`;
287
- const panelId = useId();
288
- return /* @__PURE__ */ jsxs("div", {
289
- className: "border-b border-[var(--theme-border)] last:border-b-0",
290
- children: [/* @__PURE__ */ jsxs("button", {
291
- type: "button",
292
- "aria-expanded": isExpanded,
293
- "aria-controls": hasSteps ? panelId : void 0,
294
- className: cx("flex items-center gap-3 px-5 py-3 transition-colors w-full text-left", job.status === "skipped" || job.status === "skipped-failed" ? "cursor-default" : "cursor-pointer", isExpanded && "bg-[var(--theme-panel-bg)]"),
295
- onClick: onToggle,
296
- children: [
297
- /* @__PURE__ */ jsx(motion.div, {
298
- animate: { rotate: isExpanded ? 90 : 0 },
299
- transition: { duration: .15 },
300
- className: cx("flex-shrink-0", hasSteps ? "text-[var(--theme-muted-text-color)]" : "invisible"),
301
- children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: cx("w-4 h-4", isExpanded && "text-[var(--theme-element)]") })
302
- }),
303
- /* @__PURE__ */ jsx(Indicator, { status: job.status }),
304
- /* @__PURE__ */ jsxs("div", {
305
- className: "flex flex-col gap-1 min-w-0 flex-1",
306
- children: [/* @__PURE__ */ jsx("span", {
307
- className: "font-mono text-sm text-[var(--theme-app)] truncate",
308
- children: formatJobLabel(jobName, job)
309
- }), dependencies && dependencies.length > 0 && /* @__PURE__ */ jsxs("div", {
310
- className: "flex items-center gap-1.5",
311
- children: [/* @__PURE__ */ jsx("span", {
312
- className: "text-[10px] text-[var(--theme-muted-text-color)]",
313
- children: "depends on:"
314
- }), dependencies.map((dep) => /* @__PURE__ */ jsx("span", {
315
- className: "text-[10px] px-1.5 py-0.5 rounded bg-[var(--theme-muted-panel-bg)] text-[var(--theme-muted-text-color)]",
316
- children: formatJobLabel(dep)
317
- }, dep))]
318
- })]
319
- }),
320
- /* @__PURE__ */ jsx("div", { className: "flex-1" }),
321
- duration && /* @__PURE__ */ jsx("span", {
322
- className: "font-mono text-xs text-[var(--theme-muted-text-color)] flex-shrink-0",
323
- children: duration
324
- })
325
- ]
326
- }), /* @__PURE__ */ jsx(AnimatePresence, {
327
- initial: false,
328
- children: isExpanded && hasSteps && /* @__PURE__ */ jsx(motion.div, {
329
- initial: {
330
- height: 0,
331
- opacity: 0
332
- },
333
- animate: {
334
- height: "auto",
335
- opacity: 1
336
- },
337
- exit: {
338
- height: 0,
339
- opacity: 0
340
- },
341
- transition: {
342
- duration: .2,
343
- ease: [
344
- .25,
345
- .1,
346
- .25,
347
- 1
348
- ]
349
- },
350
- className: "overflow-hidden",
351
- id: panelId,
352
- children: /* @__PURE__ */ jsx("div", {
353
- className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
354
- children: job.steps.map((step, index) => {
355
- const stepKey = `${nestedSubworkflowPrefix}${jobName}:${index}`;
356
- const isStepExpanded = expandedSteps.has(stepKey);
357
- return /* @__PURE__ */ jsx(SubworkflowStepRow, {
358
- step,
359
- index,
360
- isExpanded: isStepExpanded,
361
- onToggle: () => onStepToggle(stepKey),
362
- slug,
363
- subworkflowPrefix: nestedSubworkflowPrefix,
364
- jobName,
365
- expandedJobs,
366
- onJobToggle,
367
- expandedSteps,
368
- onStepToggle,
369
- depth
370
- }, stepKey);
371
- })
372
- })
373
- })
374
- })]
375
- });
376
- }
377
- function SubworkflowStepRow({ step, index, isExpanded, onToggle, slug, subworkflowPrefix, jobName, expandedJobs, onJobToggle, expandedSteps, onStepToggle, depth }) {
378
- const engine = useWorkflowEngine();
379
- const slots = useSlots();
380
- const duration = getStepDuration(step);
381
- const label = engine.stepLabel(step, index);
382
- const isSubworkflow = !!step.subworkflow;
383
- const panelId = useId();
384
- const subworkflowJobs = step.subworkflow?.jobs ?? null;
385
- const subworkflowJobNames = subworkflowJobs ? Object.keys(subworkflowJobs).filter((name) => subworkflowJobs[name]?.if !== false) : [];
386
- const subworkflowDependenciesMap = useMemo(() => {
387
- if (!subworkflowJobs) return {};
388
- const map = {};
389
- for (const subJobName of subworkflowJobNames) {
390
- const job = subworkflowJobs[subJobName];
391
- if (job?.needs && Array.isArray(job.needs) && job.needs.length > 0) map[subJobName] = job.needs;
392
- }
393
- return map;
394
- }, [subworkflowJobs, subworkflowJobNames]);
395
- return /* @__PURE__ */ jsxs("div", { children: [
396
- /* @__PURE__ */ jsxs("button", {
397
- type: "button",
398
- "aria-expanded": isExpanded,
399
- "aria-controls": panelId,
400
- className: cx("flex items-center gap-3 px-5 py-2.5 cursor-pointer transition-colors w-full text-left", isExpanded ? "" : "hover:bg-[var(--theme-hover)]"),
401
- onClick: onToggle,
402
- children: [
403
- /* @__PURE__ */ jsx(motion.div, {
404
- animate: { rotate: isExpanded ? 90 : 0 },
405
- transition: { duration: .15 },
406
- className: "flex-shrink-0 text-[var(--theme-muted-text-color)]",
407
- children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: cx("w-4 h-4", isExpanded && "text-[var(--theme-element)]") })
408
- }),
409
- /* @__PURE__ */ jsx(Indicator, { status: step.status }),
410
- isSubworkflow && slots.workflowIcon?.({
411
- image: step.subworkflow?.image,
412
- type: step.subworkflow?.type,
413
- className: "h-4 w-4 flex-shrink-0"
414
- }),
415
- /* @__PURE__ */ jsxs("span", {
416
- className: "font-mono text-sm text-[var(--theme-app)] truncate flex-1",
417
- children: [label, isSubworkflow && /* @__PURE__ */ jsx("span", {
418
- className: "ml-2 text-xs text-[var(--theme-muted-text-color)]",
419
- children: "(subworkflow)"
420
- })]
421
- }),
422
- duration && /* @__PURE__ */ jsx("span", {
423
- className: "font-mono text-xs text-[var(--theme-muted-text-color)] flex-shrink-0",
424
- children: duration
425
- })
426
- ]
427
- }),
428
- /* @__PURE__ */ jsx(AnimatePresence, {
429
- initial: false,
430
- children: isExpanded && !isSubworkflow && /* @__PURE__ */ jsx(motion.div, {
431
- initial: {
432
- height: 0,
433
- opacity: 0
434
- },
435
- animate: {
436
- height: "auto",
437
- opacity: 1
438
- },
439
- exit: {
440
- height: 0,
441
- opacity: 0
442
- },
443
- transition: {
444
- duration: .2,
445
- ease: [
446
- .25,
447
- .1,
448
- .25,
449
- 1
450
- ]
451
- },
452
- className: "overflow-hidden",
453
- id: panelId,
454
- children: /* @__PURE__ */ jsx(SubworkflowInlineLogViewer, {
455
- slug,
456
- subworkflowPrefix,
457
- jobName,
458
- stepIndex: index
459
- })
460
- })
461
- }),
462
- /* @__PURE__ */ jsx(AnimatePresence, {
463
- initial: false,
464
- children: isExpanded && isSubworkflow && subworkflowJobNames.length > 0 && /* @__PURE__ */ jsx(motion.div, {
465
- initial: {
466
- height: 0,
467
- opacity: 0
468
- },
469
- animate: {
470
- height: "auto",
471
- opacity: 1
472
- },
473
- exit: {
474
- height: 0,
475
- opacity: 0
476
- },
477
- transition: {
478
- duration: .2,
479
- ease: [
480
- .25,
481
- .1,
482
- .25,
483
- 1
484
- ]
485
- },
486
- className: "overflow-hidden",
487
- id: panelId,
488
- children: /* @__PURE__ */ jsx("div", {
489
- className: "ml-[38px] border-l-2 border-[var(--theme-border)]",
490
- children: subworkflowJobNames.map((subJobName) => {
491
- const subJob = subworkflowJobs?.[subJobName];
492
- if (!subJob) return null;
493
- const subJobKey = `${subworkflowPrefix}${jobName}:${index}:${subJobName}`;
494
- const isSubJobExpanded = expandedJobs.has(subJobKey);
495
- return /* @__PURE__ */ jsx(SubworkflowJobRow, {
496
- jobName: subJobName,
497
- job: subJob,
498
- isExpanded: isSubJobExpanded,
499
- onToggle: () => onJobToggle(subJobKey),
500
- dependencies: subworkflowDependenciesMap[subJobName],
501
- slug,
502
- parentJobName: jobName,
503
- parentStepIndex: index,
504
- subworkflowPrefix,
505
- expandedJobs,
506
- onJobToggle,
507
- expandedSteps,
508
- onStepToggle,
509
- depth: depth + 1
510
- }, subJobName);
511
- })
512
- })
513
- })
514
- })
515
- ] });
516
- }
517
- function SubworkflowInlineLogViewer({ slug, subworkflowPrefix, jobName, stepIndex }) {
518
- const logPath = useWorkflowEngine().stepLogPath(subworkflowPrefix, jobName, stepIndex);
519
- const { data: logs, isLoading, error } = useRunFile(slug, logPath, { refreshInterval: 2e3 });
520
- if (isLoading && !logs) return /* @__PURE__ */ jsxs("div", {
521
- className: "flex items-center gap-2 px-5 py-4 text-sm text-[var(--theme-muted-text-color)]",
522
- children: [/* @__PURE__ */ jsx(LoaderIcon, { className: "w-4 h-4" }), /* @__PURE__ */ jsx("span", { children: "Loading logs..." })]
523
- });
524
- if (error || !logs) return /* @__PURE__ */ jsx("div", {
525
- className: "px-5 py-4 text-sm text-[var(--theme-muted-text-color)] italic",
526
- children: "No logs available"
527
- });
528
- return /* @__PURE__ */ jsx("div", {
529
- className: "border-t border-[var(--theme-border)]",
530
- children: /* @__PURE__ */ jsx(LogViewer, {
531
- log: logs,
532
- width: "100%",
533
- height: "unset",
534
- inline: true,
535
- contentClassName: "bg-[var(--theme-app-bg)]",
536
- enableWorkflowCommands: true
537
- })
538
- });
539
- }
540
- function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpandedJobs }) {
183
+ function TreeView({ jobs, slug, expandedJobs, setExpandedJobs }) {
541
184
  const engine = useWorkflowEngine();
542
185
  const visibleJobNames = useMemo(() => {
543
186
  return Object.keys(jobs).filter((jobName) => jobs[jobName]?.if !== false);
@@ -558,22 +201,13 @@ function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpand
558
201
  setExpandedJobs,
559
202
  jobs
560
203
  ]);
561
- const toggleSubworkflowJob = useCallback((jobKey) => {
562
- setExpandedSubworkflowJobs((prev) => {
563
- const newSet = new Set(prev);
564
- if (newSet.has(jobKey)) newSet.delete(jobKey);
565
- else newSet.add(jobKey);
566
- return newSet;
567
- });
568
- }, []);
569
- const toggleStep = useCallback((stepKey) => {
570
- setExpandedSteps((prev) => {
571
- const newSet = new Set(prev);
572
- if (newSet.has(stepKey)) newSet.delete(stepKey);
573
- else newSet.add(stepKey);
574
- return newSet;
575
- });
576
- }, []);
204
+ const rowState = {
205
+ slug,
206
+ expandedJobs: expandedSubworkflowJobs,
207
+ onJobToggle: (jobKey) => setExpandedSubworkflowJobs((prev) => toggled(prev, jobKey)),
208
+ expandedSteps,
209
+ onStepToggle: (stepKey) => setExpandedSteps((prev) => toggled(prev, stepKey))
210
+ };
577
211
  const expandAll = useCallback(() => {
578
212
  setExpandedJobs(new Set(visibleJobNames));
579
213
  }, [visibleJobNames, setExpandedJobs]);
@@ -583,14 +217,6 @@ function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpand
583
217
  setExpandedSubworkflowJobs(/* @__PURE__ */ new Set());
584
218
  }, [setExpandedJobs]);
585
219
  const allExpanded = expandedJobs.size === visibleJobNames.length;
586
- const dependenciesMap = useMemo(() => {
587
- const map = {};
588
- for (const jobName of visibleJobNames) {
589
- const job = jobs[jobName];
590
- if (job?.needs && Array.isArray(job.needs) && job.needs.length > 0) map[jobName] = job.needs;
591
- }
592
- return map;
593
- }, [jobs, visibleJobNames]);
594
220
  return /* @__PURE__ */ jsxs("div", {
595
221
  className: "flex flex-col",
596
222
  children: [/* @__PURE__ */ jsx("div", {
@@ -621,7 +247,9 @@ function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpand
621
247
  const rendered = [];
622
248
  const seenMatrixGroups = /* @__PURE__ */ new Set();
623
249
  for (const jobName of visibleJobNames) {
624
- const matrixOrigin = jobs[jobName]?._matrix?.originaljob;
250
+ const job = jobs[jobName];
251
+ if (!job) continue;
252
+ const matrixOrigin = job._matrix?.originaljob;
625
253
  if (matrixOrigin) {
626
254
  if (seenMatrixGroups.has(matrixOrigin)) continue;
627
255
  seenMatrixGroups.add(matrixOrigin);
@@ -638,12 +266,7 @@ function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpand
638
266
  className: "flex items-center gap-3 px-5 py-3 cursor-pointer transition-colors w-full text-left",
639
267
  onClick: () => toggleJob(`matrix:${matrixOrigin}`),
640
268
  children: [
641
- /* @__PURE__ */ jsx(motion.div, {
642
- animate: { rotate: isGroupExpanded ? 90 : 0 },
643
- transition: { duration: .15 },
644
- className: "flex-shrink-0 text-[var(--theme-muted-text-color)]",
645
- children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: cx("w-4 h-4", isGroupExpanded && "text-[var(--theme-element)]") })
646
- }),
269
+ /* @__PURE__ */ jsx(Chevron, { open: isGroupExpanded }),
647
270
  /* @__PURE__ */ jsx(Indicator, { status: aggStatus }),
648
271
  /* @__PURE__ */ jsxs("span", {
649
272
  className: "font-mono text-sm text-[var(--theme-app)]",
@@ -672,35 +295,26 @@ function TreeView({ jobs, workflowName, runNumber, slug, expandedJobs, setExpand
672
295
  transition: { duration: .15 },
673
296
  className: "overflow-hidden pl-4",
674
297
  id: `matrix-panel-${matrixOrigin}`,
675
- children: group.members.map((memberName) => /* @__PURE__ */ jsx(JobRow, {
676
- jobName: memberName,
677
- job: jobs[memberName],
678
- isExpanded: expandedJobs.has(memberName),
679
- onToggle: () => toggleJob(memberName),
680
- dependencies: dependenciesMap[memberName],
681
- workflowName,
682
- runNumber,
683
- slug,
684
- expandedJobs: expandedSubworkflowJobs,
685
- onJobToggle: toggleSubworkflowJob,
686
- expandedSteps,
687
- onStepToggle: toggleStep
688
- }, memberName))
298
+ children: group.members.map((memberName) => {
299
+ const member = jobs[memberName];
300
+ return member ? /* @__PURE__ */ jsx(JobRow, {
301
+ jobName: memberName,
302
+ job: member,
303
+ isExpanded: expandedJobs.has(memberName),
304
+ onToggle: () => toggleJob(memberName),
305
+ prefix: "",
306
+ state: rowState
307
+ }, memberName) : null;
308
+ })
689
309
  }) })]
690
310
  }, `matrix-${matrixOrigin}`));
691
311
  } else rendered.push(/* @__PURE__ */ jsx(JobRow, {
692
312
  jobName,
693
- job: jobs[jobName],
313
+ job,
694
314
  isExpanded: expandedJobs.has(jobName),
695
315
  onToggle: () => toggleJob(jobName),
696
- dependencies: dependenciesMap[jobName],
697
- workflowName,
698
- runNumber,
699
- slug,
700
- expandedJobs: expandedSubworkflowJobs,
701
- onJobToggle: toggleSubworkflowJob,
702
- expandedSteps,
703
- onStepToggle: toggleStep
316
+ prefix: "",
317
+ state: rowState
704
318
  }, jobName));
705
319
  }
706
320
  return rendered;