@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,5 +1,7 @@
1
1
  import { useRunFile, useSlots, useStrings, useWorkflowEngine } from "../components/Provider.js";
2
- import { ArrowLeftIcon, ArrowRightIcon, DocumentIcon } from "../icons.js";
2
+ import { FaArrowLeft } from "../icons/fa/FaArrowLeft.js";
3
+ import { FaArrowRight } from "../icons/fa/FaArrowRight.js";
4
+ import { IoDocumentTextOutline } from "../icons/io5/IoDocumentTextOutline.js";
3
5
  import { TooltipInfo } from "../components/Tooltip.js";
4
6
  import { BareModal, modalPanelClasses } from "../components/BareModal.js";
5
7
  import { Indicator } from "../components/Indicator.js";
@@ -9,6 +11,7 @@ import { toAbsHumanDuration } from "../duration.js";
9
11
  import { AnnotationBanner } from "./AnnotationBanner.js";
10
12
  import { Collapse } from "./Collapse.js";
11
13
  import { Reveal } from "./Reveal.js";
14
+ import { jobLabel, toggled } from "./util.js";
12
15
  import { Joblist } from "./JobSummary.js";
13
16
  import { MatrixGroupNode, MatrixGroupSummaryItem } from "./MatrixGroup.js";
14
17
  import TreeView from "./TreeView.js";
@@ -54,7 +57,7 @@ var addCleanupSteps = ({ jobs }) => {
54
57
  linkedStep: `${sourceSteps.length - index - 1}`
55
58
  };
56
59
  delete newStep.cleanup;
57
- const clonedStep = cloned.steps[index];
60
+ const clonedStep = cloned.steps[sourceSteps.length - index - 1];
58
61
  if (clonedStep) delete clonedStep.cleanup;
59
62
  cloned.steps.push(newStep);
60
63
  });
@@ -72,7 +75,7 @@ var addCleanupSteps = ({ jobs }) => {
72
75
  linkedStep: `${sourceCleanup.length - index - 1 + cloned.steps.length}`
73
76
  };
74
77
  delete newStep.cleanup;
75
- const clonedStep = clonedCleanup[index];
78
+ const clonedStep = clonedCleanup[sourceCleanup.length - index - 1];
76
79
  if (clonedStep) delete clonedStep.cleanup;
77
80
  clonedCleanup.push(newStep);
78
81
  });
@@ -124,10 +127,14 @@ function parsePrefixToPath(prefix) {
124
127
  }
125
128
  return path;
126
129
  }
127
- function computeGraphLayout(engine, jobs, matrixGroups) {
130
+ function displayJobsOf(engine, jobs, matrixGroups) {
128
131
  const visibleJobs = structuredClone(jobs);
129
- for (const jobName of Object.keys(jobs ?? {})) if (jobs[jobName]?.if === false) delete visibleJobs[jobName];
132
+ for (const jobName of Object.keys(jobs)) if (jobs[jobName]?.if === false) delete visibleJobs[jobName];
130
133
  engine.collapseMatrixGroups(matrixGroups, visibleJobs);
134
+ return visibleJobs;
135
+ }
136
+ function computeGraphLayout(engine, jobs, matrixGroups) {
137
+ const visibleJobs = displayJobsOf(engine, jobs, matrixGroups);
131
138
  const allDeps = {};
132
139
  for (const jobName of Object.keys(visibleJobs)) allDeps[jobName] = engine.jobDependencies(jobName, visibleJobs, allDeps);
133
140
  const filteredDeps = {};
@@ -142,37 +149,29 @@ function computeGraphLayout(engine, jobs, matrixGroups) {
142
149
  }).sort();
143
150
  }
144
151
  const depended_on = {};
145
- Object.keys(visibleJobs).forEach((jobName) => {
146
- if (filteredDeps[jobName] && Array.isArray(filteredDeps[jobName])) filteredDeps[jobName].forEach((dep) => {
147
- if (depended_on[dep]) depended_on[dep].push(jobName);
148
- else depended_on[dep] = [jobName];
149
- });
150
- });
151
- Object.keys(visibleJobs).forEach((jobName) => {
152
- if (depended_on[jobName]) depended_on[jobName].sort();
153
- });
154
- const unfinished = structuredClone(visibleJobs);
152
+ for (const jobName of Object.keys(visibleJobs)) for (const dep of filteredDeps[jobName] ?? []) {
153
+ depended_on[dep] ??= [];
154
+ depended_on[dep].push(jobName);
155
+ }
156
+ for (const dependents of Object.values(depended_on)) dependents.sort();
157
+ const unfinished = new Set(Object.keys(visibleJobs));
155
158
  const rootLevel = [];
156
159
  const deps = [rootLevel];
157
- Object.keys(visibleJobs).forEach((jobName) => {
158
- if (filteredDeps[jobName]?.length === 0) {
159
- rootLevel.push(jobName);
160
- delete unfinished[jobName];
161
- }
162
- });
160
+ for (const jobName of unfinished) if (filteredDeps[jobName]?.length === 0) {
161
+ rootLevel.push(jobName);
162
+ unfinished.delete(jobName);
163
+ }
163
164
  let prevLen;
164
165
  do {
165
166
  const toAppend = [];
166
- const unfinishedArr = Object.keys(unfinished);
167
- prevLen = unfinishedArr.length;
168
- unfinishedArr.forEach((jobName) => {
169
- if ((filteredDeps[jobName] ?? []).every((dep) => !unfinishedArr.includes(dep))) {
170
- toAppend.push(jobName);
171
- delete unfinished[jobName];
172
- }
173
- });
167
+ const pending = new Set(unfinished);
168
+ prevLen = pending.size;
169
+ for (const jobName of pending) if ((filteredDeps[jobName] ?? []).every((dep) => !pending.has(dep))) {
170
+ toAppend.push(jobName);
171
+ unfinished.delete(jobName);
172
+ }
174
173
  if (toAppend.length > 0) deps.push(toAppend);
175
- } while (prevLen !== Object.keys(unfinished).length);
174
+ } while (prevLen !== unfinished.size);
176
175
  const finalDeps = [];
177
176
  deps.forEach((col) => {
178
177
  const toAppend = [];
@@ -201,16 +200,7 @@ function computeGraphLayout(engine, jobs, matrixGroups) {
201
200
  }
202
201
  finalDeps.push(toAppend);
203
202
  });
204
- while (finalDeps.length > 0) {
205
- const first = finalDeps[0];
206
- if (!first) break;
207
- if (first.length === 0) {
208
- finalDeps.splice(0, 1);
209
- continue;
210
- }
211
- if (first[0]?.length !== 0) break;
212
- while (first.length > 0 && first[0]?.length === 0) first.splice(0, 1);
213
- }
203
+ if (finalDeps[0]?.length === 0) finalDeps.shift();
214
204
  const ancestorDists = {};
215
205
  const descendantDists = {};
216
206
  const jobNames = Object.keys(visibleJobs);
@@ -222,8 +212,8 @@ function computeGraphLayout(engine, jobs, matrixGroups) {
222
212
  for (const start of jobNames) {
223
213
  const aDist = /* @__PURE__ */ new Map();
224
214
  const q1 = [[start, 0]];
225
- while (q1.length > 0) {
226
- const [job, d] = q1.shift();
215
+ for (let next = q1.shift(); next; next = q1.shift()) {
216
+ const [job, d] = next;
227
217
  for (const dep of filteredDeps[job] ?? []) if (!aDist.has(dep)) {
228
218
  aDist.set(dep, d + 1);
229
219
  q1.push([dep, d + 1]);
@@ -232,8 +222,8 @@ function computeGraphLayout(engine, jobs, matrixGroups) {
232
222
  ancestorDists[start] = aDist;
233
223
  const dDist = /* @__PURE__ */ new Map();
234
224
  const q2 = [[start, 0]];
235
- while (q2.length > 0) {
236
- const [job, d] = q2.shift();
225
+ for (let next = q2.shift(); next; next = q2.shift()) {
226
+ const [job, d] = next;
237
227
  for (const child of reverseDeps[job] ?? []) if (!dDist.has(child)) {
238
228
  dDist.set(child, d + 1);
239
229
  q2.push([child, d + 1]);
@@ -249,6 +239,32 @@ function computeGraphLayout(engine, jobs, matrixGroups) {
249
239
  descendantDists
250
240
  };
251
241
  }
242
+ function jobHandlers({ engine, jobs, displayJobs, pathPrefix, stepsOpen, toggleSteps, expandedSubworkflows, toggleSubworkflow, openInNewGraph, setSublogOpen, renderWell }) {
243
+ const isStepsOpen = (j) => stepsOpen.has(pathPrefix + j);
244
+ const subworkflowKey = (j, s) => `${pathPrefix}${j}:${s}`;
245
+ const openLog = (j, s) => setSublogOpen(engine.stepLogPath(pathPrefix, j, s));
246
+ return {
247
+ isStepsOpen,
248
+ onJobClick: (j) => {
249
+ const status = jobs[j]?.status ?? displayJobs[j]?.status;
250
+ if (!isStepsOpen(j) && (status === "skipped" || status === "skipped-failed")) return;
251
+ toggleSteps(pathPrefix + j);
252
+ },
253
+ onStepClick: (j, s) => {
254
+ const step = jobs[j]?.steps?.[s];
255
+ if (step?.status === "skipped" || step?.status === "skipped-failed") return;
256
+ if (step?.subworkflow) toggleSubworkflow(subworkflowKey(j, s));
257
+ else openLog(j, s);
258
+ },
259
+ onStepLogClick: openLog,
260
+ onSubworkflowIcon: (j, s) => openInNewGraph(pathPrefix, j, s),
261
+ renderSubworkflow: (j, s) => {
262
+ const subJobs = jobs[j]?.steps?.[s]?.subworkflow?.jobs;
263
+ if (!subJobs) return null;
264
+ return renderWell(subJobs, `${pathPrefix}subworkflows/${j}/step_${s}/`, expandedSubworkflows.has(subworkflowKey(j, s)));
265
+ }
266
+ };
267
+ }
252
268
  function SubworkflowWell({ expanded, onSettled, className, children }) {
253
269
  return /* @__PURE__ */ jsx(Reveal, {
254
270
  open: expanded,
@@ -262,6 +278,8 @@ function SubworkflowWell({ expanded, onSettled, className, children }) {
262
278
  });
263
279
  }
264
280
  var SUBGRAPH_Z_STEP = 100;
281
+ var CONNECTOR_COLOR = "var(--theme-border)";
282
+ var HIGHLIGHT_COLOR = "#3B82F6";
265
283
  var FIT_ANIMATION_MS = 300;
266
284
  function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflows, toggleSubworkflow, openInNewGraph, setSublogOpen, invalidateConnectors, requestFit, stepsOpen, toggleSteps, matrixOpen, toggleMatrix, onReady }) {
267
285
  const engine = useWorkflowEngine();
@@ -353,36 +371,27 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
353
371
  invalidateConnectors
354
372
  ]);
355
373
  const buildBoxLayer = useCallback(() => {
356
- const isStepsOpen = (j) => stepsOpen.has(pathPrefix + j);
357
- const onJobClick = (j) => {
358
- const status = jobs[j]?.status ?? displayJobs[j]?.status;
359
- if (!isStepsOpen(j) && (status === "skipped" || status === "skipped-failed")) return;
360
- toggleSteps(pathPrefix + j);
361
- };
362
- const expandInline = (j, s) => {
363
- toggleSubworkflow(`${pathPrefix}${j}:${s}`);
364
- requestAnimationFrame(invalidateConnectors);
365
- };
366
- const openNew = (j, s) => openInNewGraph(pathPrefix, j, s);
367
- const onStepClick = (j, s) => {
368
- const stepStatus = jobs[j]?.steps?.[+s]?.status;
369
- if (stepStatus === "skipped" || stepStatus === "skipped-failed") return;
370
- if (jobs[j]?.steps[+s]?.subworkflow) expandInline(j, +s);
371
- else setSublogOpen(engine.stepLogPath(pathPrefix, j, s));
372
- };
373
- const onStepLogClick = (j, s) => setSublogOpen(engine.stepLogPath(pathPrefix, j, s));
374
- const onSubworkflowIcon = (j, s) => openNew(j, s);
375
- const isSubworkflowExpanded = (j, s) => expandedSubworkflows.has(`${pathPrefix}${j}:${s}`);
376
- const renderSubworkflow = (j, s) => {
377
- const subJobs = jobs[j]?.steps?.[s]?.subworkflow?.jobs;
378
- if (!subJobs) return null;
379
- return /* @__PURE__ */ jsx(SubworkflowWell, {
380
- expanded: isSubworkflowExpanded(j, s),
374
+ const handlers = jobHandlers({
375
+ engine,
376
+ jobs,
377
+ displayJobs,
378
+ pathPrefix,
379
+ stepsOpen,
380
+ toggleSteps,
381
+ expandedSubworkflows,
382
+ toggleSubworkflow: (key) => {
383
+ toggleSubworkflow(key);
384
+ requestAnimationFrame(invalidateConnectors);
385
+ },
386
+ openInNewGraph,
387
+ setSublogOpen,
388
+ renderWell: (subJobs, subPrefix, expanded) => /* @__PURE__ */ jsx(SubworkflowWell, {
389
+ expanded,
381
390
  onSettled: requestFit,
382
391
  className: "my-2 rounded-lg border-4 border-(--theme-border)",
383
392
  children: /* @__PURE__ */ jsx(NestedSubgraph, {
384
393
  jobs: subJobs,
385
- pathPrefix: `${pathPrefix}subworkflows/${j}/step_${s}/`,
394
+ pathPrefix: subPrefix,
386
395
  depth: depth + 1,
387
396
  preview,
388
397
  animT,
@@ -397,13 +406,15 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
397
406
  matrixOpen,
398
407
  toggleMatrix
399
408
  })
400
- });
401
- };
409
+ })
410
+ });
402
411
  return /* @__PURE__ */ jsx("div", {
403
412
  className: "flex relative",
404
413
  children: dependencyCols.map((col) => {
405
414
  return /* @__PURE__ */ jsx("div", { children: col.map((jobNames) => {
406
- const matrixGroup = displayJobs[jobNames[0]]?._matrixGroup;
415
+ const first = jobNames[0];
416
+ if (first === void 0) return null;
417
+ const matrixGroup = displayJobs[first]?._matrixGroup;
407
418
  if (matrixGroup) return /* @__PURE__ */ jsx(MatrixGroupNode, {
408
419
  matrixGroup,
409
420
  jobNames,
@@ -412,50 +423,38 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
412
423
  onToggle: () => toggleMatrix(pathPrefix + matrixGroup.originaljob),
413
424
  jobs,
414
425
  activeDists,
415
- onMouseEnter: () => setHoveredJob(jobNames[0]),
426
+ onMouseEnter: () => setHoveredJob(first),
416
427
  onMouseLeave: () => setHoveredJob(null),
417
428
  hoveredRelated,
418
429
  animT,
419
430
  zBase,
420
- isStepsOpen,
421
- onJobClick,
422
- onStepClick,
423
- onStepLogClick,
424
- onSubworkflowIcon,
425
- isSubworkflowExpanded,
426
- renderSubworkflow,
431
+ handlers,
427
432
  preview
428
- }, "node_" + jobNames[0]);
433
+ }, `node_${first}`);
429
434
  return /* @__PURE__ */ jsxs("div", {
430
- id: "node_" + pathPrefix + jobNames[0],
435
+ id: `node_${pathPrefix}${first}`,
431
436
  role: "none",
432
437
  className: "relative m-24",
433
- style: { zIndex: (activeDists?.has(jobNames[0]) ? 25 : 1) + zBase },
434
- onMouseEnter: () => setHoveredJob(jobNames[0]),
438
+ style: { zIndex: (activeDists?.has(first) ? 25 : 1) + zBase },
439
+ onMouseEnter: () => setHoveredJob(first),
435
440
  onMouseLeave: () => setHoveredJob(null),
436
- onFocus: () => setHoveredJob(jobNames[0]),
441
+ onFocus: () => setHoveredJob(first),
437
442
  onBlur: () => setHoveredJob(null),
438
443
  children: [/* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-2xl bg-(--theme-panel-bg)" }), /* @__PURE__ */ jsx("div", {
439
444
  className: "relative border-solid shadow py-4 px-8 rounded-xl border-4 whitespace-nowrap bg-(--theme-panel-bg) text-2xl",
440
445
  style: {
441
- opacity: hoveredRelated && !hoveredRelated.has(jobNames[0]) ? .5 : 1,
446
+ opacity: hoveredRelated && !hoveredRelated.has(first) ? .5 : 1,
442
447
  transition: `opacity ${animT}s`
443
448
  },
444
449
  children: /* @__PURE__ */ jsx(Joblist, {
445
450
  jobs: displayJobs,
446
451
  jobNames,
447
- onJobClick,
448
- isStepsOpen,
449
- onStepClick,
450
- onStepLogClick,
451
- onSubworkflowIcon,
452
- isSubworkflowExpanded,
453
- renderSubworkflow,
452
+ ...handlers,
454
453
  growWidth: true,
455
454
  preview
456
455
  })
457
456
  })]
458
- }, "node_" + jobNames[0]);
457
+ }, `node_${first}`);
459
458
  }) }, col[0]?.[0]);
460
459
  })
461
460
  });
@@ -484,13 +483,13 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
484
483
  ]);
485
484
  const memoizedBoxLayer = useMemo(() => buildBoxLayer(), [buildBoxLayer]);
486
485
  const hasLiveNestedGraph = Array.from(expandedSubworkflows).some((k) => k.startsWith(pathPrefix));
487
- if (!Array.isArray(dependencyCols) || dependencyCols.length === 0 || !Array.isArray(dependencyCols[0]) || dependencyCols[0].length === 0 || !Array.isArray(dependencyCols[0][0]) || dependencyCols[0][0].length === 0) return null;
486
+ if (!dependencyCols[0]?.length) return null;
488
487
  return /* @__PURE__ */ jsxs("div", {
489
488
  ref: wrapperRef,
490
489
  className: "relative",
491
490
  children: [(() => {
492
491
  const wrapper = wrapperRef.current;
493
- const gid = (name) => document.getElementById("node_" + pathPrefix + name);
492
+ const gid = (name) => document.getElementById(`node_${pathPrefix}${name}`);
494
493
  const ox = (el) => offsetWithin(el, wrapper).x;
495
494
  const nodeConnectorY = (el) => offsetWithin(el, wrapper).y + 37;
496
495
  let colGap = 32;
@@ -500,27 +499,29 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
500
499
  if (col0 && col1) colGap = ox(col1) - (ox(col0) + col0.offsetWidth);
501
500
  }
502
501
  let minAdy = Number.POSITIVE_INFINITY;
503
- for (const col of dependencyCols) for (const jobNames of col) for (const dep of directDeps[jobNames[0]] ?? []) {
504
- const s = gid(dep);
505
- const e = gid(jobNames[0]);
506
- if (!s || !e) continue;
507
- const dy = Math.abs(nodeConnectorY(e) - nodeConnectorY(s));
508
- if (dy > 0 && dy < minAdy) minAdy = dy;
502
+ for (const col of dependencyCols) for (const jobNames of col) {
503
+ const first = jobNames[0];
504
+ if (first === void 0) continue;
505
+ for (const dep of directDeps[first] ?? []) {
506
+ const s = gid(dep);
507
+ const e = gid(first);
508
+ if (!s || !e) continue;
509
+ const dy = Math.abs(nodeConnectorY(e) - nodeConnectorY(s));
510
+ if (dy > 0 && dy < minAdy) minAdy = dy;
511
+ }
509
512
  }
510
513
  const MAX_ARC_R = 16;
511
514
  const arcR = Math.min(minAdy === Number.POSITIVE_INFINITY ? MAX_ARC_R : minAdy / 4, colGap / 2, MAX_ARC_R);
512
- return dependencyCols.map((col) => /* @__PURE__ */ jsx(React.Fragment, { children: col.map((jobNames) => /* @__PURE__ */ jsx(React.Fragment, { children: (directDeps[jobNames[0]] ?? []).map((dep) => {
513
- const isHighlighted = hoveredRelated?.has(jobNames[0]) && hoveredRelated?.has(dep);
514
- const baseColor = "var(--theme-border)";
515
+ return dependencyCols.map((col) => /* @__PURE__ */ jsx(React.Fragment, { children: col.map(([first]) => first === void 0 ? null : /* @__PURE__ */ jsx(React.Fragment, { children: (directDeps[first] ?? []).map((dep) => {
516
+ const isHighlighted = hoveredRelated?.has(first) && hoveredRelated?.has(dep);
515
517
  const depDist = activeDists?.get(dep) ?? 0;
516
- const targetDist = activeDists?.get(jobNames[0]) ?? 0;
517
- const hopDelay = animT;
518
+ const targetDist = activeDists?.get(first) ?? 0;
518
519
  const closerDist = Math.min(depDist, targetDist);
519
- const connectorDelay = closerDist * hopDelay;
520
- const retractDelay = (maxHoveredDistRef.current - closerDist) * hopDelay;
520
+ const connectorDelay = closerDist * animT;
521
+ const retractDelay = (maxHoveredDistRef.current - closerDist) * animT;
521
522
  const drawRightToLeft = targetDist < depDist;
522
523
  const start = gid(dep);
523
- const end = gid(jobNames[0]);
524
+ const end = gid(first);
524
525
  if (!start || !end) return null;
525
526
  const x1 = ox(start) + start.offsetWidth - 2;
526
527
  const y1 = nodeConnectorY(start);
@@ -567,7 +568,7 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
567
568
  "aria-hidden": "true",
568
569
  overflow: "visible",
569
570
  className: "absolute pointer-events-none",
570
- style: { zIndex: (isHighlighted || activeDists?.has(dep) && activeDists?.has(jobNames[0]) ? 30 : 10) + zBase },
571
+ style: { zIndex: (isHighlighted || activeDists?.has(dep) && activeDists?.has(first) ? 30 : 10) + zBase },
571
572
  children: [
572
573
  /* @__PURE__ */ jsx("rect", {
573
574
  x: x1 - 16,
@@ -587,20 +588,20 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
587
588
  cx: x1,
588
589
  cy: y1,
589
590
  r: "8",
590
- fill: isHighlighted ? "#3B82F6" : baseColor,
591
+ fill: isHighlighted ? HIGHLIGHT_COLOR : CONNECTOR_COLOR,
591
592
  style: {
592
593
  opacity: hoveredRelated && !isHighlighted ? .3 : 1,
593
- transition: isHighlighted ? `fill ${animT}s ${depDist * hopDelay}s, opacity 0s` : `fill ${animT}s ${(maxHoveredDistRef.current - depDist) * hopDelay}s, opacity 0s`
594
+ transition: isHighlighted ? `fill ${animT}s ${depDist * animT}s, opacity 0s` : `fill ${animT}s ${(maxHoveredDistRef.current - depDist) * animT}s, opacity 0s`
594
595
  }
595
596
  }),
596
597
  /* @__PURE__ */ jsx("circle", {
597
598
  cx: x2,
598
599
  cy: y2,
599
600
  r: "8",
600
- fill: isHighlighted ? "#3B82F6" : baseColor,
601
+ fill: isHighlighted ? HIGHLIGHT_COLOR : CONNECTOR_COLOR,
601
602
  style: {
602
603
  opacity: hoveredRelated && !isHighlighted ? .3 : 1,
603
- transition: isHighlighted ? `fill ${animT}s ${targetDist * hopDelay}s, opacity 0s` : `fill ${animT}s ${(maxHoveredDistRef.current - targetDist) * hopDelay}s, opacity 0s`
604
+ transition: isHighlighted ? `fill ${animT}s ${targetDist * animT}s, opacity 0s` : `fill ${animT}s ${(maxHoveredDistRef.current - targetDist) * animT}s, opacity 0s`
604
605
  }
605
606
  })
606
607
  ]
@@ -617,7 +618,7 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
617
618
  fill: "transparent"
618
619
  }), /* @__PURE__ */ jsx("path", {
619
620
  d: pathD,
620
- stroke: baseColor,
621
+ stroke: CONNECTOR_COLOR,
621
622
  strokeWidth: "6",
622
623
  fill: "transparent",
623
624
  style: {
@@ -635,7 +636,7 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
635
636
  d: drawRightToLeft ? pathDReversed : pathD,
636
637
  fill: "transparent",
637
638
  style: {
638
- stroke: "#3B82F6",
639
+ stroke: HIGHLIGHT_COLOR,
639
640
  strokeWidth: 6,
640
641
  strokeDasharray: `${pathLen} ${pathLen}`,
641
642
  strokeDashoffset: isHighlighted ? 0 : pathLen,
@@ -643,16 +644,16 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
643
644
  transition: isHighlighted ? `stroke-dashoffset ${animT}s ease ${connectorDelay}s, opacity 0s ease ${connectorDelay}s` : "stroke-dashoffset 0s, opacity 0s"
644
645
  }
645
646
  }), (() => {
646
- const connKey = `${dep}→${jobNames[0]}`;
647
+ const connKey = `${dep}→${first}`;
647
648
  if (isHighlighted) retractPathLensRef.current.set(connKey, pathLen);
648
- const isRetracting = !isHighlighted && !!activeDists?.has(dep) && !!activeDists?.has(jobNames[0]);
649
+ const isRetracting = !isHighlighted && !!activeDists?.has(dep) && !!activeDists?.has(first);
649
650
  if (!isHighlighted && !isRetracting) return null;
650
651
  const frozenLen = retractPathLensRef.current.get(connKey) ?? pathLen;
651
652
  return /* @__PURE__ */ jsx("path", {
652
653
  d: drawRightToLeft ? pathDReversed : pathD,
653
654
  fill: "transparent",
654
655
  style: {
655
- stroke: "#3B82F6",
656
+ stroke: HIGHLIGHT_COLOR,
656
657
  strokeWidth: 6,
657
658
  strokeDasharray: `${frozenLen} ${frozenLen}`,
658
659
  strokeDashoffset: isHighlighted ? 0 : frozenLen,
@@ -663,53 +664,32 @@ function Subgraph({ jobs, pathPrefix, depth, preview, animT, expandedSubworkflow
663
664
  })()]
664
665
  })
665
666
  ] }, dep);
666
- }) }, jobNames[0])) }, col[0]?.[0]));
667
+ }) }, first)) }, col[0]?.[0]));
667
668
  })(), hasLiveNestedGraph ? buildBoxLayer() : memoizedBoxLayer]
668
669
  });
669
670
  }
670
671
  var NestedSubgraph = Subgraph;
671
- function SidebarWell({ expanded, children }) {
672
- return /* @__PURE__ */ jsx(Collapse, {
673
- expanded,
674
- releaseOverflow: false,
675
- children
676
- });
677
- }
678
672
  function SidebarJobs({ jobs, pathPrefix, preview, stepsOpen, toggleSteps, expandedSubworkflows, toggleSubworkflow, matrixOpen, toggleMatrix, openInNewGraph, setSublogOpen }) {
679
673
  const engine = useWorkflowEngine();
680
- const matrixGroups = useMemo(() => engine.matrixGroups(jobs), [engine, jobs]);
681
- const { displayJobs } = useMemo(() => computeGraphLayout(engine, jobs, matrixGroups), [
674
+ const displayJobs = useMemo(() => displayJobsOf(engine, jobs, engine.matrixGroups(jobs)), [engine, jobs]);
675
+ const handlers = jobHandlers({
682
676
  engine,
683
677
  jobs,
684
- matrixGroups
685
- ]);
686
- const isStepsOpen = (j) => stepsOpen.has(pathPrefix + j);
687
- const onJobClick = (j) => {
688
- const status = jobs[j]?.status ?? displayJobs[j]?.status;
689
- if (!isStepsOpen(j) && (status === "skipped" || status === "skipped-failed")) return;
690
- toggleSteps(pathPrefix + j);
691
- };
692
- const expandInline = (j, s) => toggleSubworkflow(`${pathPrefix}${j}:${s}`);
693
- const openNew = (j, s) => openInNewGraph(pathPrefix, j, s);
694
- const onStepClick = (j, s) => {
695
- const stepStatus = jobs[j]?.steps?.[+s]?.status;
696
- if (stepStatus === "skipped" || stepStatus === "skipped-failed") return;
697
- if (jobs[j]?.steps[+s]?.subworkflow) expandInline(j, +s);
698
- else setSublogOpen(engine.stepLogPath(pathPrefix, j, s));
699
- };
700
- const onStepLogClick = (j, s) => setSublogOpen(engine.stepLogPath(pathPrefix, j, s));
701
- const onSubworkflowIcon = (j, s) => openNew(j, s);
702
- const isSubworkflowExpanded = (j, s) => expandedSubworkflows.has(`${pathPrefix}${j}:${s}`);
703
- const renderSubworkflow = (j, s) => {
704
- const subJobs = jobs[j]?.steps?.[s]?.subworkflow?.jobs;
705
- if (!subJobs) return null;
706
- return /* @__PURE__ */ jsx(SidebarWell, {
707
- expanded: isSubworkflowExpanded(j, s),
678
+ displayJobs,
679
+ pathPrefix,
680
+ stepsOpen,
681
+ toggleSteps,
682
+ expandedSubworkflows,
683
+ toggleSubworkflow,
684
+ openInNewGraph,
685
+ setSublogOpen,
686
+ renderWell: (subJobs, subPrefix, expanded) => /* @__PURE__ */ jsx(Collapse, {
687
+ expanded,
708
688
  children: /* @__PURE__ */ jsx("div", {
709
689
  className: "ml-6 mt-0.5 border-l border-(--theme-border) pl-4",
710
690
  children: /* @__PURE__ */ jsx(SidebarJobs, {
711
691
  jobs: subJobs,
712
- pathPrefix: `${pathPrefix}subworkflows/${j}/step_${s}/`,
692
+ pathPrefix: subPrefix,
713
693
  preview,
714
694
  stepsOpen,
715
695
  toggleSteps,
@@ -721,8 +701,8 @@ function SidebarJobs({ jobs, pathPrefix, preview, stepsOpen, toggleSteps, expand
721
701
  setSublogOpen
722
702
  })
723
703
  })
724
- });
725
- };
704
+ })
705
+ });
726
706
  const seenMatrixGroups = /* @__PURE__ */ new Set();
727
707
  const orderedKeys = Object.keys(jobs).flatMap((jobName) => {
728
708
  const originaljob = jobs[jobName]?._matrix?.originaljob;
@@ -739,27 +719,15 @@ function SidebarJobs({ jobs, pathPrefix, preview, stepsOpen, toggleSteps, expand
739
719
  isExpanded: matrixOpen.has(pathPrefix + mg.originaljob),
740
720
  onToggle: () => toggleMatrix(pathPrefix + mg.originaljob),
741
721
  jobs,
742
- isStepsOpen,
743
- onJobClick,
744
- onStepClick,
745
- onStepLogClick,
746
- onSubworkflowIcon,
747
- isSubworkflowExpanded,
748
- renderSubworkflow,
722
+ handlers,
749
723
  preview
750
- }, "matrix-" + pathPrefix + mg.originaljob);
724
+ }, `matrix-${pathPrefix}${mg.originaljob}`);
751
725
  return /* @__PURE__ */ jsx(Joblist, {
752
726
  jobs,
753
727
  jobNames: [jobName],
754
- onJobClick,
755
- isStepsOpen,
756
- onStepClick,
757
- onStepLogClick,
758
- onSubworkflowIcon,
759
- isSubworkflowExpanded,
760
- renderSubworkflow,
728
+ ...handlers,
761
729
  preview
762
- }, "job-" + pathPrefix + jobName);
730
+ }, `job-${pathPrefix}${jobName}`);
763
731
  }) });
764
732
  }
765
733
  var RUN_STATUSES = [
@@ -786,7 +754,7 @@ function walkJobPath(root, path) {
786
754
  }
787
755
  return isJobRecord(cursor) ? cursor : {};
788
756
  }
789
- function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder, viewMode = "dag", setViewMode }) {
757
+ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag", setViewMode }) {
790
758
  const engine = useWorkflowEngine();
791
759
  const animT = .125;
792
760
  const minScale = .2;
@@ -883,7 +851,8 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
883
851
  const timer = setInterval(() => setNow(DateTime.now()), 1e3);
884
852
  return () => clearInterval(timer);
885
853
  }, [isRunFinished]);
886
- const jobs = walkJobPath(rootJobs, executedJobsPath[executedJobsPathIdx] ?? []);
854
+ const currentPath = executedJobsPath[executedJobsPathIdx] ?? [];
855
+ const jobs = walkJobPath(rootJobs, currentPath);
887
856
  const resetGraph = useCallback(() => {
888
857
  setSublogOpen("");
889
858
  setStepsOpen(/* @__PURE__ */ new Set());
@@ -903,29 +872,14 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
903
872
  setExecutedJobsPathIdx(0);
904
873
  }, [executedJobsPathIdx, resetGraph]);
905
874
  const toggleSubworkflow = useCallback((key) => {
906
- setExpandedSubworkflows((prev) => {
907
- const next = new Set(prev);
908
- if (next.has(key)) next.delete(key);
909
- else next.add(key);
910
- return next;
911
- });
875
+ setExpandedSubworkflows((prev) => toggled(prev, key));
912
876
  }, []);
913
877
  const toggleSteps = useCallback((key) => {
914
- setStepsOpen((prev) => {
915
- const next = new Set(prev);
916
- if (next.has(key)) next.delete(key);
917
- else next.add(key);
918
- return next;
919
- });
878
+ setStepsOpen((prev) => toggled(prev, key));
920
879
  requestAnimationFrame(invalidateConnectors);
921
880
  }, [invalidateConnectors]);
922
881
  const toggleMatrix = useCallback((key) => {
923
- setMatrixOpen((prev) => {
924
- const next = new Set(prev);
925
- if (next.has(key)) next.delete(key);
926
- else next.add(key);
927
- return next;
928
- });
882
+ setMatrixOpen((prev) => toggled(prev, key));
929
883
  requestAnimationFrame(invalidateConnectors);
930
884
  }, [invalidateConnectors]);
931
885
  const { data: sublogs, isLoading: sublogsLoading, error: sublogsError } = useRunFile(runSlug, sublogOpen || null, preview ? void 0 : { refreshInterval: 2e3 });
@@ -937,11 +891,14 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
937
891
  sublogsError,
938
892
  sublogsLoading
939
893
  ]);
940
- const jobAndStep = sublogOpen.split("/").slice(-3, -1);
941
- if (jobAndStep.length > 1) jobAndStep[1] = jobAndStep[1].split("_")[1] ?? "";
942
- const sublogIsStep = jobAndStep.length > 1;
943
- const logName = jobAndStep.length > 1 ? "Job: " + (jobAndStep[0][0].toUpperCase() + jobAndStep[0].slice(1)).replace(/_/g, " ") + " \nStep: " + (jobs[jobAndStep[0]]?.steps[Number(jobAndStep[1])]?.name || "Step " + jobAndStep[1]) : "";
944
- const sublogIsSubworkflow = jobAndStep.length > 1 && jobs[jobAndStep[0]]?.steps[Number(jobAndStep[1])]?.subworkflow;
894
+ const [sublogJob = "", sublogStepDir] = sublogOpen.split("/").slice(-3, -1);
895
+ const sublogStep = sublogStepDir === void 0 ? void 0 : sublogStepDir.split("_")[1] ?? "";
896
+ const sublogIsStep = sublogStep !== void 0;
897
+ const sublogStepData = sublogIsStep ? jobs[sublogJob]?.steps[Number(sublogStep)] : void 0;
898
+ const logName = sublogIsStep ? `Job: ${jobLabel(sublogJob)} \nStep: ${sublogStepData?.name || `Step ${sublogStep}`}` : "";
899
+ const sublogIsSubworkflow = !!sublogStepData?.subworkflow;
900
+ const sublogFileStart = sublogOpen.lastIndexOf("/") + 1;
901
+ const sublogShowsLog = sublogOpen.slice(sublogFileStart) === "logs.out";
945
902
  const matrixGroups = useMemo(() => engine.matrixGroups(jobs), [engine, jobs]);
946
903
  const { dependencyCols } = useMemo(() => computeGraphLayout(engine, jobs, matrixGroups), [
947
904
  engine,
@@ -1001,20 +958,18 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1001
958
  windowSize,
1002
959
  executedJobsPathIdx
1003
960
  ]);
1004
- const currentPath = executedJobsPath[executedJobsPathIdx] ?? [];
1005
961
  const nestingDepth = currentPath.length / 5;
1006
- let pathAppend = "";
1007
- for (let i = 0; i < nestingDepth; i++) pathAppend += `subworkflows/${currentPath[5 * i]}/step_${currentPath[5 * i + 2]?.toString()}/`;
962
+ const levelPrefixes = [];
963
+ for (let i = 0; i < nestingDepth; i++) levelPrefixes.push(`subworkflows/${currentPath[5 * i]}/step_${currentPath[5 * i + 2]}/`);
964
+ const pathAppend = levelPrefixes.join("");
1008
965
  let generalLogPath = "logs.out";
1009
966
  if (nestingDepth > 0) {
1010
- let parentPrefix = "";
1011
- for (let i = 0; i < nestingDepth - 1; i++) parentPrefix += `subworkflows/${currentPath[5 * i]}/step_${currentPath[5 * i + 2]?.toString()}/`;
1012
967
  const lastJob = String(currentPath[5 * (nestingDepth - 1)] ?? "");
1013
968
  const lastStep = currentPath[5 * (nestingDepth - 1) + 2] ?? "";
1014
- generalLogPath = engine.stepLogPath(parentPrefix, lastJob, lastStep);
969
+ generalLogPath = engine.stepLogPath(levelPrefixes.slice(0, -1).join(""), lastJob, lastStep);
1015
970
  }
1016
971
  const missingLogText = sublogIsSubworkflow ? "Subworkflows generally have no logs/scripts at this level.\nClick on the \"Open in new graph\" icon on the subworkflow step to open the subworkflow graph." : sublogsError ? dagStrings.logLoadFailed : (sublogOpen === generalLogPath ? dagStrings.statusReason(run.statusReason) : void 0) ?? dagStrings.noLogFound;
1017
- const currentSublog = sublogOpen === "" ? "" : preview ? engine.toYaml(jobs[jobAndStep[0]]?.steps[Number(jobAndStep[1])]) : sublogsError || !sublogs ? missingLogText : sublogs;
972
+ const currentSublog = sublogOpen === "" ? "" : preview ? engine.toYaml(sublogStepData) : sublogsError || !sublogs ? missingLogText : sublogs;
1018
973
  const expansionKeys = useMemo(() => engine.expansionKeys(jobs, pathAppend), [
1019
974
  engine,
1020
975
  jobs,
@@ -1040,7 +995,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1040
995
  const nextStep = useCallback((backward) => {
1041
996
  const sublogSplit = sublogOpen.split("/");
1042
997
  let job = sublogSplit[sublogSplit.length - 3] ?? "";
1043
- let step = parseInt(sublogSplit[sublogSplit.length - 2].slice(5), 10);
998
+ let step = parseInt((sublogSplit[sublogSplit.length - 2] ?? "").slice(5), 10);
1044
999
  const jobArr = Object.keys(jobs);
1045
1000
  let idx = jobArr.indexOf(job);
1046
1001
  if (backward) {
@@ -1056,7 +1011,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1056
1011
  job = jobArr[idx + 1] ?? "";
1057
1012
  step = 0;
1058
1013
  }
1059
- setSublogOpen(sublogSplit.slice(0, -3).join("/") + `/${job}/step_${step}/` + sublogSplit.slice(-1)[0]);
1014
+ setSublogOpen(`${sublogSplit.slice(0, -3).join("/")}/${job}/step_${step}/${sublogSplit.slice(-1)[0]}`);
1060
1015
  }, [jobs, sublogOpen]);
1061
1016
  const handleKeyDown = useCallback((e) => {
1062
1017
  if (e.key === "ArrowRight") nextStep(false);
@@ -1091,7 +1046,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1091
1046
  toggleMatrix,
1092
1047
  openInNewGraph
1093
1048
  ]);
1094
- if (!Array.isArray(dependencyCols) || dependencyCols.length === 0 || !Array.isArray(dependencyCols[0]) || dependencyCols[0].length === 0 || !Array.isArray(dependencyCols[0][0]) || dependencyCols[0][0].length === 0) return;
1049
+ if (!dependencyCols[0]?.length) return;
1095
1050
  const startDt = run.createdAt ? DateTime.fromISO(run.createdAt) : now;
1096
1051
  const endDt = run.completedAt ? DateTime.fromISO(run.completedAt) : now;
1097
1052
  const runtime = toAbsHumanDuration(startDt, endDt);
@@ -1100,29 +1055,29 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1100
1055
  type: "button",
1101
1056
  className: "btn btn-neutral",
1102
1057
  onClick: () => nextStep(true),
1103
- children: [/* @__PURE__ */ jsx(ArrowLeftIcon, {}), /* @__PURE__ */ jsx("span", { children: "Prev" })]
1058
+ children: [/* @__PURE__ */ jsx(FaArrowLeft, {}), /* @__PURE__ */ jsx("span", { children: "Prev" })]
1104
1059
  }),
1105
1060
  /* @__PURE__ */ jsxs("button", {
1106
1061
  type: "button",
1107
1062
  className: "btn btn-neutral",
1108
1063
  onClick: () => nextStep(false),
1109
- children: [/* @__PURE__ */ jsx(ArrowRightIcon, {}), /* @__PURE__ */ jsx("span", { children: "Next" })]
1064
+ children: [/* @__PURE__ */ jsx(FaArrowRight, {}), /* @__PURE__ */ jsx("span", { children: "Next" })]
1110
1065
  }),
1111
1066
  /* @__PURE__ */ jsx("span", {
1112
1067
  className: "pt-0.5 whitespace-pre-wrap text-xs",
1113
1068
  children: logName
1114
1069
  })
1115
1070
  ] }) : void 0;
1116
- const additionalBottomRightBarComponents = (!preview || sublogIsSubworkflow) && sublogOpen && sublogIsStep ? /* @__PURE__ */ jsx("button", {
1071
+ const additionalBottomRightBarComponents = (!preview || sublogIsSubworkflow) && sublogIsStep ? /* @__PURE__ */ jsx("button", {
1117
1072
  type: "button",
1118
1073
  className: "btn btn-neutral",
1119
1074
  onClick: () => {
1120
1075
  if (sublogIsSubworkflow) {
1121
- openInNewGraph(pathAppend, jobAndStep[0], parseInt(jobAndStep[1], 10));
1076
+ openInNewGraph(pathAppend, sublogJob, parseInt(sublogStep ?? "", 10));
1122
1077
  setSublogOpen("");
1123
- } else setSublogOpen(sublogOpen.split("/").slice(-1)[0] === "logs.out" ? [...sublogOpen.split("/").slice(0, -1), "script-unstable-redacted.sh"].join("/") : [...sublogOpen.split("/").slice(0, -1), "logs.out"].join("/"));
1078
+ } else setSublogOpen(sublogOpen.slice(0, sublogFileStart) + (sublogShowsLog ? "script-unstable-redacted.sh" : "logs.out"));
1124
1079
  },
1125
- children: /* @__PURE__ */ jsx("span", { children: sublogIsSubworkflow ? "Open Subworkflow" : sublogOpen.split("/").slice(-1)[0] === "logs.out" ? "Show Script" : "Show Logs" })
1080
+ children: /* @__PURE__ */ jsx("span", { children: sublogIsSubworkflow ? "Open Subworkflow" : sublogShowsLog ? "Show Script" : "Show Logs" })
1126
1081
  }) : void 0;
1127
1082
  return /* @__PURE__ */ jsxs("div", {
1128
1083
  className: "flex flex-col lg:flex-row w-full",
@@ -1146,7 +1101,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1146
1101
  "aria-label": "General log",
1147
1102
  onClick: () => setSublogOpen(generalLogPath),
1148
1103
  className: "link",
1149
- children: /* @__PURE__ */ jsx(DocumentIcon, { className: "w-4 h-4" })
1104
+ children: /* @__PURE__ */ jsx(IoDocumentTextOutline, { className: "w-4 h-4" })
1150
1105
  })]
1151
1106
  }),
1152
1107
  /* @__PURE__ */ jsx("div", {
@@ -1212,7 +1167,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1212
1167
  children: dagStrings.submitted
1213
1168
  }), /* @__PURE__ */ jsx("div", {
1214
1169
  className: "text-sm font-semibold flex items-center gap-x-1",
1215
- children: startDt ? startDt.toLocaleString(DateTime.DATETIME_SHORT) : ""
1170
+ children: startDt.toLocaleString(DateTime.DATETIME_SHORT)
1216
1171
  })]
1217
1172
  }),
1218
1173
  /* @__PURE__ */ jsx("div", { className: "flex-1" }),
@@ -1223,7 +1178,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1223
1178
  setStepsOpen(/* @__PURE__ */ new Set());
1224
1179
  requestAnimationFrame(fitGraph);
1225
1180
  }
1226
- setViewMode?.(mode);
1181
+ setViewMode(mode);
1227
1182
  }
1228
1183
  })
1229
1184
  ]
@@ -1233,15 +1188,13 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1233
1188
  className: "panel w-full border",
1234
1189
  children: /* @__PURE__ */ jsx(TreeView, {
1235
1190
  jobs,
1236
- workflowName,
1237
- runNumber,
1238
1191
  slug: runSlug,
1239
1192
  expandedJobs,
1240
1193
  setExpandedJobs
1241
1194
  })
1242
1195
  }) : /* @__PURE__ */ jsx("div", {
1243
1196
  ref: setContainerElement,
1244
- className: "panel w-full " + (removeBorder ? "border-none" : "border") + " overflow-hidden relative",
1197
+ className: cx("panel w-full overflow-hidden relative", removeBorder ? "border-none" : "border"),
1245
1198
  style: {
1246
1199
  height: containerHeight !== null ? `${containerHeight}px` : previewHeight !== null ? `${Math.min(previewHeight, windowSize.h * .62)}px` : "62vh",
1247
1200
  minHeight: previewHeight !== null ? 0 : 160
@@ -1275,7 +1228,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1275
1228
  className: "btn btn-info w-21 cursor-pointer h-6",
1276
1229
  "aria-label": "Reset view",
1277
1230
  onClick: () => {
1278
- if ((executedJobsPath[executedJobsPathIdx]?.length ?? 0) > 0) {
1231
+ if (currentPath.length > 0) {
1279
1232
  resetGraph();
1280
1233
  setExecutedJobsPath([[], ...executedJobsPath.slice(executedJobsPathIdx, 10)]);
1281
1234
  setExecutedJobsPathIdx(0);
@@ -1350,7 +1303,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1350
1303
  value: currentSublog,
1351
1304
  height: window.innerHeight / 1.4,
1352
1305
  width: window.innerWidth / 1.4,
1353
- contentKey: "editor_" + sublogOpen
1306
+ contentKey: `editor_${sublogOpen}`
1354
1307
  }) ?? /* @__PURE__ */ jsx("pre", {
1355
1308
  className: "h-full overflow-auto text-xs p-4",
1356
1309
  style: {
@@ -1368,7 +1321,7 @@ function DependencyGraph({ run, preview = false, initialScale = 1, removeBorder,
1368
1321
  })
1369
1322
  }), additionalBottomRightBarComponents]
1370
1323
  })] }) : /* @__PURE__ */ jsx(LogViewer, {
1371
- log: currentSublog?.length > 1e3 ? currentSublog.slice(-1e5) : currentSublog,
1324
+ log: currentSublog.slice(-1e5),
1372
1325
  height: windowSize.h / 1.2,
1373
1326
  width: windowSize.w / 1.2,
1374
1327
  hideExpand: true,
@@ -1390,9 +1343,8 @@ function DependencyGraphPreview(inputs) {
1390
1343
  workflowName: ""
1391
1344
  },
1392
1345
  preview: true,
1393
- initialScale: inputs.initialScale || 1,
1394
1346
  removeBorder: inputs.removeBorder
1395
1347
  });
1396
1348
  }
1397
1349
  //#endregion
1398
- export { DependencyGraphPreview, DependencyGraph as default };
1350
+ export { DependencyGraphPreview, addCleanupSteps, DependencyGraph as default };